{"id":278,"date":"2026-10-14T04:59:05","date_gmt":"2026-10-14T04:59:05","guid":{"rendered":"https:\/\/ongroundmedia.com\/?page_id=278"},"modified":"2026-10-14T05:01:18","modified_gmt":"2026-10-14T05:01:18","slug":"site-audit-and-crawling-tools","status":"publish","type":"page","link":"https:\/\/ongroundmedia.com\/?page_id=278","title":{"rendered":"Site Audit and Crawling Tools"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"278\" class=\"elementor elementor-278\">\n\t\t\t\t<div class=\"elementor-element elementor-element-45d46d6 e-con e-atomic-element e-flexbox-base e-default-div e-d8c1225 \" data-id=\"45d46d6\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"45d46d6\">\n    \t\t<div class=\"elementor-element elementor-element-ea4876e elementor-widget elementor-widget-html\" data-id=\"ea4876e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!doctype html><html><head><meta charset=utf8><meta name=viewport content=\"width=device-width,initial-scale=1,viewport-fit=cover\"><style>:root{color-scheme:light;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}html{scroll-padding-top:env(safe-area-inset-top,0px)}body{margin:0;padding:0;font:14px -apple-system,BlinkMacSystemFont,sans-serif;background:#fff;color:#000}img{max-width:100%}[hidden]:not([hidden=until-found i]){display:none!important}<\/style><\/head><body>\r\n<title>Onground SEO Tools<\/title>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;500;600;700&family=Sora:wght@600;700;800&display=swap\">\r\n<style>\r\n\/* Layout concept: sticky brand bar, a tool finder home with grouped cards, and a tool view\r\n   that shares one page set across every site-level tool. Indigo leads, orange marks the one action. *\/\r\n:root{\r\n  --bg:#F8FAFC;--surface:#FFFFFF;--surface2:#F1F5F9;--ink:#1E293B;--strong:#0F172A;--muted:#566377;\r\n  --line:#E2E8F0;--line2:#CBD5E1;\r\n  --primary:#4F46E5;--primary-h:#4338CA;--on-primary:#FFFFFF;--primary-soft:#EEF2FF;--primary-text:#4338CA;\r\n  --accent:#FF6B35;--accent-h:#F25A22;--on-accent:#0F172A;\r\n  --ok:#047857;--ok-bg:#D1FAE5;--ok-fill:#10B981;\r\n  --warn:#9A3412;--warn-bg:#FFEDD5;--warn-fill:#FF6B35;\r\n  --fail:#B91C1C;--fail-bg:#FEE2E2;--fail-fill:#DC2626;\r\n  --info:#334155;--info-bg:#E2E8F0;\r\n  --logo-bg:transparent;--navy:#0F172A;\r\n  --shadow:0 1px 2px rgba(15,23,42,.06),0 10px 28px rgba(15,23,42,.07);\r\n  --f-display:'Sora',system-ui,-apple-system,'Segoe UI',sans-serif;\r\n  --f-body:'Manrope',system-ui,-apple-system,'Segoe UI',sans-serif;\r\n  --f-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;\r\n}\r\n@media (prefers-color-scheme:dark){:root:not([data-theme=\"light\"]){\r\n  --bg:#0B1120;--surface:#111A2E;--surface2:#17223A;--ink:#D8E0EC;--strong:#F8FAFC;--muted:#98A6BC;\r\n  --line:#25324D;--line2:#34456A;\r\n  --primary:#6366F1;--primary-h:#7C7FF5;--on-primary:#FFFFFF;--primary-soft:#1B2250;--primary-text:#A5B4FC;\r\n  --accent:#FF6B35;--accent-h:#FF8556;--on-accent:#0F172A;\r\n  --ok:#6EE7B7;--ok-bg:#0E3B2C;--ok-fill:#10B981;\r\n  --warn:#FDBA74;--warn-bg:#3A2312;--warn-fill:#FF6B35;\r\n  --fail:#FCA5A5;--fail-bg:#471C1C;--fail-fill:#F87171;\r\n  --info:#CBD5E1;--info-bg:#25324D;\r\n  --logo-bg:#FFFFFF;--shadow:0 1px 2px rgba(0,0,0,.4),0 10px 28px rgba(0,0,0,.35);\r\n  color-scheme:dark}}\r\n:root[data-theme=\"dark\"]{\r\n  --bg:#0B1120;--surface:#111A2E;--surface2:#17223A;--ink:#D8E0EC;--strong:#F8FAFC;--muted:#98A6BC;\r\n  --line:#25324D;--line2:#34456A;\r\n  --primary:#6366F1;--primary-h:#7C7FF5;--on-primary:#FFFFFF;--primary-soft:#1B2250;--primary-text:#A5B4FC;\r\n  --accent:#FF6B35;--accent-h:#FF8556;--on-accent:#0F172A;\r\n  --ok:#6EE7B7;--ok-bg:#0E3B2C;--ok-fill:#10B981;\r\n  --warn:#FDBA74;--warn-bg:#3A2312;--warn-fill:#FF6B35;\r\n  --fail:#FCA5A5;--fail-bg:#471C1C;--fail-fill:#F87171;\r\n  --info:#CBD5E1;--info-bg:#25324D;\r\n  --logo-bg:#FFFFFF;--shadow:0 1px 2px rgba(0,0,0,.4),0 10px 28px rgba(0,0,0,.35);\r\n  color-scheme:dark}\r\n*{box-sizing:border-box}\r\n[hidden]{display:none!important}\r\nbody{background:var(--bg);color:var(--ink);font:15px\/1.6 var(--f-body);-webkit-text-size-adjust:100%}\r\nh1,h2,h3,h4{font-family:var(--f-display);color:var(--strong);margin:0;text-wrap:balance;letter-spacing:-.01em}\r\np{margin:0}\r\na{color:var(--primary-text)}\r\na:hover{color:var(--strong)}\r\nbutton,input,select,textarea{font:inherit;color:inherit}\r\nbutton{cursor:pointer}\r\n:focus-visible{outline:2px solid var(--primary);outline-offset:2px;border-radius:4px}\r\n.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\r\n.muted{color:var(--muted)}\r\n.mono{font-family:var(--f-mono);font-size:13px}\r\n.wrap{max-width:1180px;margin:0 auto;padding-inline:20px}\r\n.nw{white-space:nowrap}\r\n\r\n\/* top bar *\/\r\n.top{position:sticky;top:env(safe-area-inset-top,0px);z-index:20;background:var(--surface);border-bottom:1px solid var(--line)}\r\n.top-in{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-block:10px;flex-wrap:wrap}\r\n.brand{display:flex;align-items:center;gap:12px;text-decoration:none;color:inherit}\r\n.logo-tile{display:flex;background:var(--logo-bg);border-radius:10px;padding:3px 5px}\r\n.logo-tile img{height:40px;width:auto;display:block}\r\n.brand-t{display:flex;flex-direction:column;line-height:1.2}\r\n.brand-t b{font:700 17px var(--f-display);color:var(--strong)}\r\n.brand-t small{font-weight:600;font-size:12.5px;color:var(--muted)}\r\n.top-nav{display:flex;gap:6px;flex-wrap:wrap}\r\n.top-nav a{padding:10px 14px;min-height:44px;display:inline-flex;align-items:center;border-radius:10px;font-weight:600;color:var(--ink);text-decoration:none}\r\n.top-nav a:hover{background:var(--surface2)}\r\n\r\n\/* buttons, fields *\/\r\n.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 20px;border-radius:10px;border:1px solid transparent;font-weight:700;text-decoration:none;line-height:1.2;transition:background .15s,border-color .15s}\r\n.btn.primary{background:var(--primary);color:var(--on-primary)}\r\n.btn.primary:hover{background:var(--primary-h);color:var(--on-primary)}\r\n.btn.accent{background:var(--accent);color:var(--on-accent)}\r\n.btn.accent:hover{background:var(--accent-h);color:var(--on-accent)}\r\n.btn.ghost{background:var(--surface);border-color:var(--line2);color:var(--strong)}\r\n.btn.ghost:hover{border-color:var(--primary);color:var(--strong)}\r\n.btn.sm{min-height:36px;padding:6px 12px;font-size:14px}\r\n.btn.danger{background:var(--surface);border-color:var(--fail);color:var(--fail)}\r\n.fld{display:flex;flex-direction:column;gap:6px;min-width:0}\r\n.fld>span,.fld-l{font-weight:700;font-size:14px;color:var(--strong)}\r\n.fld small{color:var(--muted);font-size:13px}\r\ninput[type=text],input[type=search],input[type=url],select,textarea{width:100%;min-height:44px;padding:10px 14px;border:1px solid var(--line2);border-radius:10px;background:var(--surface);color:var(--ink)}\r\ntextarea{resize:vertical;line-height:1.5;font-family:var(--f-mono);font-size:13px}\r\ninput::placeholder,textarea::placeholder{color:var(--muted);opacity:.85}\r\n.switch{display:inline-flex;align-items:center;gap:10px;min-height:44px;font-weight:600;cursor:pointer}\r\n.switch input{width:18px;height:18px;accent-color:var(--primary)}\r\ninput[type=range]{width:100%;accent-color:var(--primary);min-height:32px}\r\n.controls{display:flex;flex-wrap:wrap;gap:16px 24px;align-items:flex-end;margin-bottom:20px}\r\n.controls .fld{flex:1 1 260px;max-width:520px}\r\n\r\n\/* segmented *\/\r\n.seg{display:inline-flex;flex-wrap:wrap;gap:6px;padding:4px;background:var(--surface2);border-radius:12px;border:1px solid var(--line)}\r\n.seg button{min-height:40px;padding:8px 16px;border:0;border-radius:9px;background:transparent;font-weight:700;color:var(--muted)}\r\n.seg button[aria-checked=true]{background:var(--primary);color:var(--on-primary)}\r\n.seg button:not([aria-checked=true]):hover{color:var(--strong)}\r\n\r\n\/* pills + tags *\/\r\n.pill{display:inline-flex;align-items:center;gap:6px;font-weight:700;font-size:12.5px;line-height:1;padding:5px 10px 5px 7px;border-radius:999px;white-space:nowrap}\r\n.pill .ic{width:15px;height:15px;flex:none}\r\n.pill.pass,.pill.ok{background:var(--ok-bg);color:var(--ok)}\r\n.pill.warn{background:var(--warn-bg);color:var(--warn)}\r\n.pill.fail{background:var(--fail-bg);color:var(--fail)}\r\n.pill.info{background:var(--info-bg);color:var(--info)}\r\n.tag{display:inline-block;font-size:12px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:4px 9px;border-radius:6px;background:var(--primary-soft);color:var(--primary-text)}\r\n.dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:7px;vertical-align:1px}\r\n.dot.list{background:var(--ok-fill)}.dot.page{background:#F59E0B}.dot.site{background:var(--fail-fill)}\r\n\r\n\/* home *\/\r\n.hero{display:flex;flex-wrap:wrap;gap:40px;align-items:center;padding-block:56px 40px}\r\n.hero-l{flex:1 1 480px;min-width:0;display:flex;flex-direction:column;gap:20px}\r\n.eyebrow{font-weight:700;font-size:13px;letter-spacing:.08em;text-transform:uppercase;color:var(--primary-text)}\r\n.hero h1{font-weight:800;font-size:clamp(32px,4.6vw,52px);line-height:1.08}\r\n.lede{font-size:18px;color:var(--muted);max-width:560px}\r\n.search{position:relative;max-width:560px}\r\n.search input{padding-left:44px;min-height:52px;font-size:16px;border-radius:12px}\r\n.search svg{position:absolute;left:14px;top:15px;width:22px;height:22px;color:var(--muted)}\r\n.hero-actions{display:flex;flex-wrap:wrap;gap:12px}\r\n.hero-r{flex:1 1 340px;min-width:0}\r\n.report{background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:22px;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:16px}\r\n.report-h{display:flex;align-items:center;gap:18px}\r\n.report ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\r\n.report li{display:flex;gap:10px;align-items:flex-start;font-size:14px}\r\n.group{margin-top:36px;display:flex;flex-direction:column;gap:16px}\r\n.group-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 14px}\r\n.group-h h2{font-size:22px}\r\n.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}\r\n.card{display:flex;flex-direction:column;gap:12px;padding:20px;background:var(--surface);border:1px solid var(--line);border-radius:14px;text-decoration:none;color:var(--ink);transition:border-color .15s,transform .15s}\r\n.card:hover{border-color:var(--primary);transform:translateY(-2px);color:var(--ink)}\r\n.card-top{display:flex;justify-content:space-between;align-items:center;gap:10px}\r\n.tic-wrap{width:46px;height:46px;border-radius:12px;background:var(--primary-soft);color:var(--primary-text);display:flex;align-items:center;justify-content:center;flex:none}\r\n.tic{width:24px;height:24px}\r\n.card h3{font-size:17px}\r\n.card p{color:var(--muted);font-size:14.5px}\r\n.card .go{margin-top:auto;font-weight:700;color:var(--primary-text);padding-top:4px}\r\n.scope{font-size:12.5px;font-weight:700;color:var(--muted);white-space:nowrap}\r\n.how{margin-top:56px;display:flex;flex-direction:column;gap:20px;padding:32px;background:var(--navy);border-radius:20px;color:#CBD5E1}\r\n.how h2{color:#FFFFFF;font-size:26px}\r\n.how-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:20px}\r\n.how h3{color:#FFFFFF;font-size:17px;margin-bottom:6px}\r\n.how-n{width:34px;height:34px;border-radius:50%;background:var(--accent);color:var(--on-accent);font:800 15px var(--f-display);display:flex;align-items:center;justify-content:center;margin-bottom:10px}\r\n.how p{font-size:14.5px}\r\n.how .note{border-top:1px solid #26334D;padding-top:16px;font-size:14px;color:#CBD5E1}\r\n\r\n\/* tool view *\/\r\n.tv-head{padding-top:28px;display:flex;flex-direction:column;gap:14px}\r\n.crumbs{display:flex;flex-wrap:wrap;gap:12px 20px;align-items:center;justify-content:space-between}\r\n.crumbs a.back{font-weight:700;text-decoration:none;display:inline-flex;align-items:center;min-height:44px}\r\n.switcher{display:flex;align-items:center;gap:10px}\r\n.switcher select{width:auto;min-width:220px;max-width:100%}\r\n.tv-title{display:flex;align-items:center;gap:16px}\r\n.tv-title h1{font-size:clamp(26px,3.4vw,36px);font-weight:800}\r\n.tv-desc{font-size:17px;color:var(--muted);max-width:760px}\r\n.panel{background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:20px 22px}\r\n.panel-head{display:flex;flex-wrap:wrap;gap:12px 20px;align-items:center;justify-content:space-between}\r\n.panel-head h2{font-size:18px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}\r\n.pages{margin-top:20px}\r\n#pgBody{margin-top:18px;display:flex;flex-direction:column;gap:18px}\r\n.pg-pane{display:flex;flex-direction:column;gap:14px}\r\n.pg-row{display:flex;flex-wrap:wrap;gap:14px}\r\n.pg-row>.fld{flex:1 1 280px}\r\n.drop{display:flex;align-items:center;justify-content:center;text-align:center;padding:26px 16px;border:2px dashed var(--line2);border-radius:14px;background:var(--surface2);color:var(--muted);font-weight:600;cursor:pointer}\r\n.drop.over,.drop:hover,.drop:focus-within{border-color:var(--primary);color:var(--strong)}\r\n.drop u{color:var(--primary-text)}\r\n.pg-foot{display:flex;flex-wrap:wrap;gap:10px}\r\n.msg{font-weight:600;font-size:14px;min-height:20px}\r\n.msg.err{color:var(--fail)}.msg.ok{color:var(--ok)}\r\n.plist{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:12px;overflow:hidden;max-height:260px;overflow-y:auto}\r\n.plist div{display:flex;align-items:center;gap:12px;padding:8px 12px;border-top:1px solid var(--line)}\r\n.plist div:first-child{border-top:0}\r\n.plist span.u{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--f-mono);font-size:13px}\r\n.plist button{min-height:32px;min-width:32px;border:0;background:transparent;color:var(--muted);border-radius:8px;font-size:18px;line-height:1}\r\n.plist button:hover{background:var(--fail-bg);color:var(--fail)}\r\n.tool-body{margin-top:24px;display:flex;flex-direction:column;gap:22px}\r\n.related{margin-top:48px;padding-top:24px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:12px}\r\n.related h2{font-size:17px}\r\n.related-l{display:flex;flex-wrap:wrap;gap:10px}\r\n.related-l a{display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:8px 14px;border:1px solid var(--line2);border-radius:10px;background:var(--surface);text-decoration:none;font-weight:700;color:var(--strong)}\r\n.related-l a:hover{border-color:var(--primary)}\r\n\r\n\/* results *\/\r\n.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}\r\n.tile{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:2px}\r\n.tile b{font:700 26px\/1.2 var(--f-display);color:var(--strong);font-variant-numeric:tabular-nums}\r\n.tile span{font-size:13.5px;color:var(--muted);font-weight:600}\r\n.tile.fail b{color:var(--fail)}.tile.warn b{color:var(--warn)}.tile.ok b{color:var(--ok)}\r\n.sec{display:flex;flex-direction:column;gap:12px}\r\n.sec>h3{font-size:18px}\r\n.sec-sub{color:var(--muted);font-size:14.5px;margin-top:-6px}\r\n.tscroll{overflow-x:auto;border:1px solid var(--line);border-radius:12px;background:var(--surface)}\r\ntable{border-collapse:collapse;width:100%;font-size:14px}\r\nth,td{padding:10px 14px;text-align:left;vertical-align:top;border-top:1px solid var(--line)}\r\nthead th{border-top:0;background:var(--surface2);font-size:12.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);white-space:nowrap}\r\nth button{all:unset;cursor:pointer;display:inline-flex;gap:6px;align-items:center;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;min-height:24px}\r\nth button:hover{color:var(--strong)}\r\nth button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}\r\ntd.num,th.num{text-align:right;font-variant-numeric:tabular-nums}\r\ntd .u{font-family:var(--f-mono);font-size:13px;word-break:break-all}\r\ntr.detail td{background:var(--surface2)}\r\n.rb{all:unset;cursor:pointer;color:var(--primary-text);font-family:var(--f-mono);font-size:13px;word-break:break-all;text-decoration:underline;text-underline-offset:3px}\r\n.rb:focus-visible{outline:2px solid var(--primary);outline-offset:2px}\r\n.callout{padding:14px 16px;border-radius:12px;background:var(--primary-soft);color:var(--ink);font-size:14.5px;border:1px solid var(--line)}\r\n.callout b{color:var(--strong)}\r\n.okbox,.warnbox{padding:16px 18px;border-radius:12px;font-weight:700}\r\n.okbox{background:var(--ok-bg);color:var(--ok)}\r\n.warnbox{background:var(--warn-bg);color:var(--warn)}\r\n.empty{padding:36px 24px;border:2px dashed var(--line2);border-radius:16px;text-align:center;display:flex;flex-direction:column;gap:12px;align-items:center}\r\n.empty h3{font-size:19px}.empty p{color:var(--muted);max-width:480px}\r\n.chips{display:flex;flex-wrap:wrap;gap:8px}\r\n.chip{min-height:38px;padding:6px 14px;border-radius:999px;border:1px solid var(--line2);background:var(--surface);font-weight:700;font-size:14px;color:var(--ink)}\r\n.chip[aria-pressed=true]{background:var(--primary);border-color:var(--primary);color:var(--on-primary)}\r\n.chip:not([aria-pressed=true]):hover{border-color:var(--primary)}\r\n.bars{display:flex;flex-direction:column;gap:10px}\r\n.brow{display:grid;grid-template-columns:minmax(120px,260px) 1fr auto;gap:12px;align-items:center}\r\n.brow .l{font-family:var(--f-mono);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}\r\n.btrack{position:relative;height:14px;background:var(--surface2);border-radius:999px;border:1px solid var(--line)}\r\n.bfill{position:absolute;left:0;top:0;bottom:0;border-radius:999px;min-width:3px}\r\n.bfill.ok{background:var(--ok-fill)}.bfill.warn{background:var(--warn-fill)}.bfill.fail{background:var(--fail-fill)}.bfill.pri{background:var(--primary)}\r\n.bmark{position:absolute;top:-5px;bottom:-5px;width:2px;background:var(--strong)}\r\n.bval{font-variant-numeric:tabular-nums;font-weight:700;color:var(--strong);min-width:92px;text-align:right;font-size:13.5px}\r\n@media(max-width:620px){.brow{grid-template-columns:1fr auto}.brow .btrack{grid-column:1\/-1;order:3}}\r\n\r\n\/* ring *\/\r\n.ring{position:relative;width:132px;height:132px;flex:none}\r\n.ring svg{width:100%;height:100%;display:block}\r\n.ring-bg{stroke:var(--line)}\r\n.ring.ok .ring-fg{stroke:var(--ok-fill)}.ring.warn .ring-fg{stroke:var(--warn-fill)}.ring.fail .ring-fg{stroke:var(--fail-fill)}\r\n.ring-num{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1}\r\n.ring-num strong{font:800 34px var(--f-display);color:var(--strong)}\r\n.ring-num span{font-size:12px;color:var(--muted);font-weight:600;margin-top:4px}\r\n.ring.sm{width:92px;height:92px}.ring.sm .ring-num strong{font-size:26px}.ring.sm .ring-num span{display:none}\r\n.scorecard{display:flex;flex-wrap:wrap;gap:24px;align-items:center;padding:22px;background:var(--surface);border:1px solid var(--line);border-radius:16px}\r\n.scorecard .meta{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:10px}\r\n.scorecard h2{font-size:20px;word-break:break-word}\r\n.tally{display:flex;flex-wrap:wrap;gap:8px}\r\n\r\n\/* check rows *\/\r\n.cat{display:flex;flex-direction:column;gap:10px}\r\n.cat>h3{font-size:17px;display:flex;gap:10px;align-items:center}\r\n.cat>h3 small{font:600 13px var(--f-body);color:var(--muted)}\r\n.clist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;border:1px solid var(--line);border-radius:12px;background:var(--surface);overflow:hidden}\r\n.clist>li{padding:14px 18px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:6px}\r\n.clist>li:first-child{border-top:0}\r\n.cr-h{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center}\r\n.cr-h b{color:var(--strong)}\r\n.cr-d{color:var(--ink);word-break:break-word}\r\n.cr-f{font-size:14px;color:var(--muted)}\r\n.cr-f span{font-weight:700;color:var(--primary-text);margin-right:6px}\r\n\r\n\/* checklists *\/\r\n.score-layout{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:24px;align-items:start}\r\n.sumbox{position:sticky;top:calc(env(safe-area-inset-top,0px) + 76px);display:flex;flex-direction:column;gap:18px;padding:22px;background:var(--surface);border:1px solid var(--line);border-radius:16px}\r\n@media(max-width:900px){.score-layout{grid-template-columns:minmax(0,1fr)}.sumbox{position:static;order:-1}}\r\n.q{border:0;padding:14px 0;margin:0;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;justify-content:space-between;min-width:0}\r\n.q:first-of-type{border-top:0}\r\n.q .qt{flex:1 1 320px;min-width:0;display:flex;flex-direction:column;gap:4px}\r\n.q .qt b{font-weight:600;color:var(--strong)}\r\n.q .qt small{color:var(--muted);font-size:13.5px}\r\n.seg3{display:inline-flex;border:1px solid var(--line2);border-radius:10px;overflow:hidden;background:var(--surface)}\r\n.seg3 label{position:relative;cursor:pointer}\r\n.seg3 input{position:absolute;opacity:0;inset:0;cursor:pointer}\r\n.seg3{max-width:100%}.seg3 span{display:flex;align-items:center;justify-content:center;min-width:56px;min-height:42px;padding:6px 14px;font-weight:700;font-size:14px;color:var(--muted);border-left:1px solid var(--line2)}\r\n.seg3 label:first-child span{border-left:0}\r\n.seg3 input:checked+span{background:var(--primary);color:var(--on-primary)}\r\n.seg3 input:focus-visible+span{outline:2px solid var(--accent);outline-offset:-3px}\r\n.seg3 label:hover input:not(:checked)+span{color:var(--strong)}\r\n.qcat{padding:20px 22px;background:var(--surface);border:1px solid var(--line);border-radius:16px;display:flex;flex-direction:column}\r\n.qcat>h3{font-size:17px;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:6px}\r\n.qcat>h3 small{font:600 13.5px var(--f-body);color:var(--muted)}\r\n.imp{font-size:12px;font-weight:700;color:var(--muted);letter-spacing:.04em;text-transform:uppercase}\r\n.fixes{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:6px;font-size:14px}\r\n.prog{height:12px;border-radius:999px;background:var(--surface2);border:1px solid var(--line);overflow:hidden}\r\n.prog>i{display:block;height:100%;background:var(--ok-fill);border-radius:999px;transition:width .25s}\r\n.chk{display:flex;gap:12px;align-items:flex-start;padding:10px 0;min-width:0}\r\n.chk input{width:22px;height:22px;margin-top:2px;flex:none;accent-color:var(--primary)}\r\n.chk .ct{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}\r\n.chk label{font-weight:600;color:var(--strong);cursor:pointer}\r\n.chk details summary{cursor:pointer;color:var(--primary-text);font-weight:600;font-size:13.5px;min-height:28px;display:inline-flex;align-items:center}\r\n.chk details p{font-size:14px;color:var(--muted);padding:2px 0 6px}\r\n.chk-s{padding:20px 22px;background:var(--surface);border:1px solid var(--line);border-radius:16px}\r\n.chk-s>.sh{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;justify-content:space-between;margin-bottom:6px}\r\n.chk-s>.sh h3{font-size:17px}\r\n.sh .sc{display:flex;gap:12px;align-items:center;font-weight:700;font-size:13.5px;color:var(--muted)}\r\n.cmp{display:grid;grid-template-columns:1fr 1fr;gap:16px}\r\n@media(max-width:700px){.cmp{grid-template-columns:1fr}}\r\n.toast{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(env(safe-area-inset-bottom,0px) + 20px);background:var(--strong);color:var(--bg);padding:12px 20px;border-radius:10px;font-weight:700;z-index:50;max-width:calc(100% - 32px);box-shadow:var(--shadow)}\r\nfooter.foot{margin-top:64px;border-top:1px solid var(--line);background:var(--surface)}\r\n.foot-in{display:flex;flex-wrap:wrap;justify-content:space-between;gap:12px 24px;padding-block:24px;color:var(--muted);font-size:14px}\r\n@media(max-width:560px){.hero{padding-block:36px 24px}.how{padding:24px 20px}.panel{padding:16px}.scorecard{padding:18px}}\r\n@media(prefers-reduced-motion:reduce){*{transition:none!important}}\r\n<\/style>\r\n\r\n<header class=\"top\">\r\n  <div class=\"wrap top-in\">\r\n    <a class=\"brand\" href=\"#home\" aria-label=\"Onground Media SEO Tools home\">\r\n      <span class=\"logo-tile\"><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAADdCAYAAADTlEUlAADKWUlEQVR42ux9d5wlVZX\/99x7q+qlzpNnyAwgIEhQAQNiwAhGxsDqmtOKimv6rbtLo64s6ioGVEy4CoYBZREFUXdHUQEFQYEhM4QJTOr4+r1X4d57fn\/cqnrVPZ0mkro+n4bp7tfvVbrfOud7zvl+CXPbo2JjZgLOJuAsBs4mrIbCGEoYGStBGS8c3qTQSMTmrQ8TKZ+icARsyjxvyWLds3Bpgp5yjGZgAITYsjrBaStt9t5ExHNneG57XK2X\/n5B\/f0WAGjudOzhk3\/jBd5Ia7DWGFhbo1Z9oWiNLQqbQ4tE3NjHl2aJDywkk9SssVUJXSLd8iSMSMKQfCkoiloUlH3EiYH0fG60Yi51dFvyStYyWamCEEBo2Tak9IaZxToN+SCC2kZUewep2vew37P\/1uqTFtVp0Zsac1dkbntMrZ97ruy890c\/PmB0y\/ChSXnB74\/77LfXzYHY7j7pq\/pr0Ya7F4yMbl4ubLK34PDguFE\/VCDcq1SiZUmr0Wl0KIgNlJCQwl0SMgCB4ZkECgZgCykIzBokJdhaQEiQFyA2hMRYQCgorwQiQpIkiI2GYQsGQMoDCaU1MEDKf1D6lXsgS7e04K23fu3OatdeG\/sO3X8LHd4fz121ue1RtYYuP7cDzejAB1f9\/oQgHnzW2NjY85Jy30hw2BHHHPDxb47MgdiuTAdXX+LBDHRvveuWnubwluUVPfTscnPjiRSOLDU6rBCZcuBLX0kjTBIijkMoT4CIQUQgkoAlWGbACgAMyRqCLQBux80MQGS5ooAlAEIBJKG1BTNDCAEWBGMZzBZCAsQWGVgKIVhb1ppVHJLfMKozbFLH30Xngj+b0vzflzp7Hl5wxPO3Yn+MEa0wc1d4bttT62jT5z9SWbigu3vLmtX7hVvuO1GOjZ5Sie2+Ioq6K57xt4YRiaVPunrh16950Vw6uSuA6xcf7nv4\/r89ydMjx5UoOTBpDC8XZA8oldVCHTYDz2oImwIRaQiyACzAOnuTwhsSwAIgAVgJEIMlA6RBzCl6ZeBVBDMBJoIt7JsA3HtBufclBjEATj8\/e7UlgBQsPCTCQ0JlNlRqGOGvt6Tu0J68V9W67+pasPxGr3vpnXRSfzh35ee2Xb6Wzu+vPXDb7w4X9eGnl2x0dNIYXN5ZlodxMtopjUGZSmCrkSDCsFdGuPfRn93vC6s+NgdiOxpt1e9bMrzm5r3jrWtPqcbDL01GNi4tq6Qc+EJxHBGzAXkSURTB90sgBpiNi7iQRlXg\/H9tVCIHPyxS4AFYMpgsCAaESfh5kQVnooBvth2xsZcCYyGKI5t+rgUst9+IhHs9eWASsIIgpLVNS3HTlhqh6l5dWXzwrzuXHHq1t\/iwtSA1RIevmEs\/57btj7Z+8PnKlrv+2tsTNZbHGx94TpeJT40GN+1TJa6UJHs6bJDnAyQMCIC0EmCG9hlD5R7etOjw1z\/5S9f8ZA7EZn3SV8rhH1+515a1q1\/eKcIjvXj0CIT1\/So+9wodg00CpRRISRiTOEiRgLUWBJlGUS76ES4cArNLDwUXL0EBxNLAzJBIQUxDgHMgI05xjsbFZ+6CTsQ6ciBnQXAf1wY8WANReD+wAJGEhXAprrHuuFjAkI+QpbF+dXPEwZ0hSveV+\/b91YIDj\/0Lnfiva+fulLlt2gDge2d3PXznLUckW9cd77eGjwmSxl7SNA+zYataVUoYreGrAGQJbAGWFoZCCLaQMYOsAHyBoUrv6Kb9n\/biJ517+bVzIDbdSV+1SiG4eeGmm644pBuj7x4d2HiS1GNdnWUppW0R2QSQAtAWEARrBbQ1MMwgwRACjpdKQYosg4hdFFRAGYIDohy1CpsFYKAcmMA6GGJ2qeE48BL5X2wDYtR+a4sUFAuXXbL7jqyL3qgAcgQB1gwSHqyJIQQQaws\/8JGwgBE+N7mUjNlqPZi\/\/LxQLPi\/fU560W048N4xon47dxc9kUGrX2z5Gir1+\/6+pBI3DrCjwy+2Y8OnBsnowk6hPV83pAlbUCpNSiyg03vZsID0SrCCAV9DWAMvEgAkIBW2+n03eSe\/7rTu9\/7nmjkQm+zkX3lGoOujxw5u+NsbvWjgySoODwoE9wFMSgmYpIVER\/CFgI5jSAF4SgDMsNZFYCCCzsCB0ujHchusqE2HEW0LOChkfpYlQHIciOXvOR66cjhrR36FSCwFsWLaCbKQDhMxWaYKIlitIJQHazWEJ2F1BKEkdJy4T1ABSFbQNIHWsmuL9btu5ErfDQuWHfA\/eMmr7yA6Sc\/dVU+caKt+\/vt677vuT4cskPHzVXPsaNVo7uuz3U8S1wRrUrCQSAA2AIxDLun+Cc\/dq4YA9jwYtrBkIDQQaAVQGTA+b6osuXzh+\/7tzfSCFSNzIFYMdW\/+7uKBv6962uhDN\/9zBw09vUajntBNeORBawMSAipQCOMYRISgUoJpNhy4COkeJcyAKiCUAGwaeDE7yslxUtPsDI1HMQaB4IHYApTClbAAixTIMgZMpP+1eeTnor4JKWXh\/QXbydPPAiSydWmo1onbfwC+TynyEaAZUALGemARQFOAZkKIjIh0ZfFPagc845s9T3n2bXSAu+HmtsfZuvn1DyoD99629+Y7\/nYwhja+ohqNvLTUHJm3IBBA2ACUBJLELQRigCRgtbtvkAKYkoA2rgbFrqZlBGAs4HkCHFt41gNECXFLmIHFT+pffPF1\/5E1cdMT\/iL87byuzddfeUo8uOY9fjx8UFdF9tmwBU5iKBJQngAbC2NjeFLAcuKwyhMwsYVMozCTVhm5wFUJmUZadnx0A5DjxFiM46cofTEzT8A0m0ZsPP6KERwBn3FpAERK3JPlScAxi+BSXg3W7U\/22pQTY0hYEgAsJKx7agoCW3Z8WWLca43r7AADKJcQNUJ4pTKacYJSrRNaVOxYEmy0\/rzfdyw5+Cvlp550M\/Z9czQ3QfAYXjMrV0rcfolEWc5bd\/c9L6Fw+MUcNQ4RYbhXRVKHZzSk1hBJAkEWRlkgWwcGgCUQJIQQkCRgjYEQApY1hLRIEoZXcrekIICtAAxAIFjpYzgWLf\/pJ7+441OX\/X6KBOYJciFuW+mv\/\/MvjjEDD5zYSVtfo0fXHdlbE8omTSTNGOVyGTpx\/QtaxwgCD0ZHEBIQitxTIzt71l0bqTxASsAmMMaACHnkMhmIgTO+zBHoeX5YWN\/MBgRXmXR\/NwHEhPs7LuakLNoV0OJzapsrzchRLwVUJrdflkSadlpIjgALkAKMBqSQsNpA+KL9Nsa691cCbC0MCRgwLAtI8iGDbmxtIuTq0j+Nink\/O+gZp\/4Kx857cK7\/7LHxoB\/+3nlda\/7y+wOCcPDwih5d7jUHn9rn8TGmOdRXEQzBCXQcgxgwMeCXSjCxhiz5iNEEKQFYIEksBASk9CAY0Ok6klJASbeYkiiBVyKYiCEVYBLHzQJA7JUx4Adrlr7+eQfRikvMExLEeFW\/2rLu3n3l4P3vLYVbXiXiwaXShkpQkoIN5\/+X6T81jItsUhDJ8EKkUc24qInGn06eNOAYDzgzbSQ45biKP+QUvDDJZ9Ok+SHP+krTONwltnlFlEEQk90yVExvkaesDIIQCjqxEEKBRRnNRLVC0XV7Zclh3+xY9JQf48VnjRHRXBHg0bRObrzRw\/q\/lwZu+d0ys3XdSfWH73+1aI3t16FokYqjkrKGSirlaa0BsQbbJG95tIIA8mAJEND53cSFhyrx+PWSZRDb3Frs1omJJYZVgNHFiy\/d\/7\/vOQ1TU8mP04ty\/4Wl+1b96QRsvf2kbrP5tTUztNzTQxDaAiojvBWYhDtpliHTplAmHscjZec9uwDTgdj2gccUkEKzfd3kL9zZz5\/p+KbbLLkdYGaoLDQ1DGN96KA3SSqLrh3gvkv2ecaLfoZjPrhxLs185Lahyy7sHrnr5kM33vLHwxeWxSGBiY71k8aTqTXcLaMGSm6FANpACg+QykVbkgAyYJvkaGIIsJRW1dk4Phfj+7rbwcD0m44BJQlENWwVPtYvWPTxp3xv9blPGBBjXinDn129bGzD3e9rDTx0epWaCzpFU8qk4U6in3KMBDB817yeAphg1z+1PSCwq0Esi\/4eDSC2vQCWMnnuNiUJZgZbC4l0JMoAkSFQ0NVsyp6\/07zl3+g+7Nj\/oeP6R+cgZc+njNe861Xv7dh495nLVGOpNIOBUZrisImOBCiTgiddbyORBIQHWEasE0gpICjO4\/+s9cfJS0jAmgmftX0gZhK4NgxUsEl1xAMHHrrisC+uurz4GvG4vTC3rfTNpZe9qXX3qp9XB285cxFvWtyLIam44biqlGi0jJR1Si8SbDZ9nZ\/sHVnAOxd90R7\/zN2xLwIMWA0J1xZimZGk55c8jVIQIdCbKz3YcLzYcP23Hvjfn3wr\/vkHj56DlT1+jfnZxz\/74n32XvJD3RrzfROTp1voDgi1QMATGtYYkLBpG0QCbTWkFGAYGLSLWXCDJpCgNGWU22QW23M7SQlACsSWQeXa1v2efMzGaQiaxwl4\/eY\/u4bXX3tkuGXd28vh1lO7eGsnbNNx3VnHknJHzgwYkjAZA08WitlV5ApnqNgcysy7NRLb9j14B\/5m10ViO7U4kHYwElypVrhvGQaS0yeoddcjTgQS1WOa\/sKHIn\/hefMOOPTy0ktOXDdH\/u+5bePn3liN7rjtrXbTg2d0cHhgTRqCjSBTcJIyHevVaZFHKlhtADCkKFbiCeAg5ccMmJNpHnQz3UMAC4GQKqjPO+D6BW\/++Ao68fXjpkPU4+kibL3izKX3Xn\/R2fNEfUWfMB022go2oTu5CkCQXg1tAZYgT4G0hWK4bnpwqhjxRGMNd+PmuV4yawwEAUIQDLs2obQv2NVBtUXgNyXFG\/fz4pH\/aqze8CZbH\/oUc\/8Vc93\/e2Zb9JEfNJj5q\/jOh\/780NVXfc42Bp9ho82yswyU\/RSgtLteQgHaaFghIMCwQFoMI4CV+3IJoWvO5h2kOwVg2EILiVB6D8KGWx6XkVj96v4FrTV\/eok3+tCHVNx8krKhIq4j8ByZbKMIxjCk8iCkB7YWVhsQGwhBaYhm24+GjJCmmbmiXRmJTR5R8Q5HYbsiEtupGxAEUj6M1mCTpCCWTg+kzxPDrtdNJwwpPfgqgGAgiWJuia5NZsmTL6wecMKP\/Ge\/\/E6iY5M5qNlDGc13P73X\/at+fU539PBLK\/FAV4CQYEMgsWmDKhAlqbYASSgLSAsnIcWpkICwgEhgSU95D80YiQlAC4ER0cPR8qd9YMlnr\/zqxALQYx7E1nzntUf6W1Z\/vidad7yvx6okPEhPIdEhEuvOslJeTi7DEiQIghhkEhAl25xRVyKWrkRsDaarme2q6uTUYLTjIMacdgzuJIjNlEZPtVkQIishpYQnLAS7zu2sIdgCYKlgQJDCg9ExAinAceyaaIWPMdlhN3HPmmDJ0z637A2v+M5cerkHgezy73Q0brzmlWMP\/v3z\/sjG+V3UhIjr7p70gIQBnfYW+jmIpQsppWiscAHCjoIYDGAqPgb9BbrynJct7XjPNzY\/LiIxZqatV39iUfOuP72mZ+S+Mzr0wHJwK1ezsQSEVIElQFKc9qq4JwSxcBEYWwibsl2ifUatcBdGkwIB8I3dNsXcrnB4dnza1CCy43zYRBCdLSBNWenczv03RNDku9PAGjIVZaTCzhkiN0AP4WY5Uy5NEIMBhEyQlflo2K7hYTv\/B+XlT79g0SlfuGOut2yPrTXx4Bf++bjRv\/7urHnRlud2NTerikwAjxElDJIEIgHPpM9bds8YrVzRTFqAmKbMXMRM95gBkmoV6735d+3\/kwcOmWwfH5Oc2NCV\/3748E1XfHoZbX1pKdkk3VxWAZIJqXZXqowKwGZihDQhwKE57muWN\/P2AzC7ZkemdKaTGGQJ2cQbEyAh3WUhJ6MNYcFwvXkEoKwISX0zOlS9W4nRMwbuGXr66FXhBwBcP3dVdv+WPiyu5Z+e+7b1v\/zRfzUaA68pwwgbawQlgUSzQytOp7hTXU8t05aLBHnj+I7cVwygERmgq+d64IEdi+YeVQtp1So1duk7nm\/\/dsnP94kfOsUbfditAFngsgAX3nILZQ7hM6AYSEe42lUxTPyb9EcWUJbhWQ1lNQjWdeZP8eWInmm+Hj0346yjt4k32cQbLWu7mOl9BAw8JAhsAsUG0lrQOPFHlT5H3QwppYoa+ZgoA1y38KSC4hbK2ITF3tqnjt1+yZUPfPvY9\/H1\/Z1zMLOH7p9Xf2zd0uef9MlKT9etCVvIkoe4YUFMkPkMMOVLyRAmNInTdtAg7S8RKMQsuS5KN099nz1WAOzGC7x7bv3C20Zu+fU3a611+3gYI1lCOwLLRl7S4FJyOsqQfomiqAMLEAkwiW1hnx2QeYbhWcZcD\/n2pa+TRWPjIl9Oo2G2bi50ulSdAfIloDXgxDIQ6DHqo609HaN3fnrdjZd9im+8oDJ3VXY\/fTPypXctv\/3SS89pDg0e6isF00jgBwqCMyKf29LqADwDSIMdevhlvWQEgSS2YL8WhrLjwcc0iPGfPnXAht9f9N8dA3\/\/crds7CclUysxgFTbpIEi17Ev0n4p55KXfkU6RKFg4TvgY4FcOTojKFPHoccj8GQ\/255m1u1vehVOG2qbC2rTJ4oGkKSqtW4+lQv6ta6CaXLSw4YAYiAgiV5Z6ppnR9639c\/nX7Xh4hXPnoOa3Rc8jH7g1H8YuvqXVx+A5JT5ge8hjiEB93BJr5MV1qEJSwit4Cc+SonvZKVnuKcm+8reV3glcFBZN3\/\/g+9\/TIIYc7\/gy9974MD1\/\/Nf3tbbX7eoFPoyGYMQGn5JIdYGlpzqgoVKpZzHgxeTAyyCTPW40i9KlVaF08yxpJxUw0x6X4\/zCGuysH+nJgg4k\/UR42wE8uyD0gmJNH+kNFIGSzAIrQRAoAAh3ciKJ4HQIty6Faq1VWBo9bPF1uu+3Pj5O4\/mG2\/05mBn120Pf+aM+fULfnyGvefGz+3lx\/sFMoZu1t0a8TzoOOM9szljk15PchUyKyAwOUDN6n4kicRYhFZs3u\/Y4zdO9Vr1aAawrRetf33z9l\/+594dyTJb0miNDsP3XHMdGw2phLMkE66V2FW4CMQWQriQijN9LbjYVqQgxSmRnGlncbq6JKu8Ogbicd36j7f0b3t4ih3dJLtz6PwCPEBmRRZApGNeaTE+dWiSqReAA7JyTaI11kLge5DVCuJmE55UKPX40GET82o1DDVHjkw2XPubjfVNn2Xu\/9xcc+zOb62vfHi\/jdf8+ttesum5wm7FmAWkZngVgcQyvMRAlSqAjkHCpIY2DruEMKBUygrM2wQFs+k9ZGYwGAkDwi\/fhOfdveUxFYnxPVcGWy9ed+bA7b\/77JJya5kd2QJBIcolCUkGJtYg5UQJnemGyReGa1IV7eIj0aQSH0CavlP2FHGvMQJ5dOfSGjFBMic1+qDxX0UOKJPS3+ZrwnXLjDm2leQpkHnj0uId2SZYtPEkX8VX0\/ivqYbdJiP8pyO38gw9i5xJwIh2v1j7I2zbXg6ATRIEgdMni6MmpPBcUSVuQJCFbTXQIWNgdE0vDdzyoXUX3fR6vufKYA6Gdnwb\/eYnTtj4pysv7GhueFbF1FHyLJRnYNkiIQvhp0WrOEwrk+37W7SfXvm6o6y1CXJcEwGnUtQWgMnuJ8u5JJYlgURIXnbQk1ZN92B61IUZfO0XyvW\/X\/F6PXDfBWXUlacbkBzDFMqIoqBNb6no0lOowMFOzhRP\/En2NxOAxP19G2BIcBouc5uvQXsqX6TgJYry9hlIFIoPnOrjZ1LRInv\/nCfiPOVyk1CU9tm0JWKLGvskRL4TzA5Q2+fBTsCf9FE5UQM7TetsQZvRQrhbbqomRZ4Rt9KPsem5EtuefbLTFE5EuhecX+diU1\/+bhKwhsGlAE2uYND0jnUuPfqjPYef9p05O7ntXHsrV8pw3W+eufmv\/\/f1jmjLkyo6AmkCgcEicgqt6YNaGoAsOS1ppNylSCXZ3Z0HwRLCqIIoqMkrbCwYGpyqmwsISyBtIUgAbGAZiJSPVnn+WO+zX7WU3v+V0cdEOslXf6665dqffDUYu\/8VNTGqbBSCvEyXisdFC8XFSamHIs2IyZMQ3FyMWGYObye+DbfhwgmtZgA7UXOk8PRx0YfdJhjO9iXHqxxQeHwYl+rbMznBxCwS5HzB2xwcZ843kT8xBae1DWqn3Tu72UKERTM\/U8ZFkEWgFG4JgFN\/AWLp3jNxtICNIgQlgV7RrI2uvekzQaKP5psv\/Agd9ZbhOXiaxdr7zQVd66767geT+25+dy\/GFnQpDZNEIA7yhw0X\/JaNgJt6yXwfsiegtfk8LDJp8zztmbieXIxgBLvG8zw7ILBgxEIh9io33wtE0+37owbE+A\/n9IzdfNU\/JYMPvrmkIgil3PAwaEaAmY7z2fG5vxQ+hJ0k0yMIdi0aBJFGVrmEOCBcl38WRjtgsjCiLbRIWfQGnaagbb19Mu1wZ2K6WgRRmzb0Zql0rudUAEmZRV9UxMxM6NFuEx+J7GCyN8N4UcjZn\/xddWO4x392PGxde4yT4SaArStSM6DjFpSn4HHUPbL5tre3buV7eMMVX6UlpzTnYGqaU\/z1\/gUPXvil\/nI0+MaqqNdqngDXDaQMAI5z5EoFfJ2GQpakSPcgVQCkdeuBmNpqxJTASiAREgQJj0Xa8sQp74y8oJMFIwAhIUKiAjSVuuXAILJ74lbbCQKfaeSqf9u\/cevVX62GG08sKVOGrgOmCUnp+MnENUyzJ6l3BsTyhtY0N6I8IBK5yQcXpHpsBjbU5qCyiKg9McA5lghbtEujtnEIIde4Z5Gk309+Doqq1JNdaZkO8hRjzeyYCBOAbNy+wIna0eQgJmZ5Wu1OTQeJtNhFsHka786TZOHGwYR2IYLnpP6bFvBrXWDVhYdHqREsOOzyJS9717tp\/svrc3C17dpb\/y+velNl4wPvt5vuOaKnBJXYCIGSsKMhhBTpTZrRLRIgBSMsEjIw0qTZgGsolywgs4kMbnPHmpzwKBHBYwFh0qiLGHHm0ardRzm6QyJUAmPV3tZIzz7vPfAb13\/vUR2JRT9994G4\/7qvqZG1zxPKkiAB4rg9eK3wiHZqcar0Jli40JmLq92McxWSZNPIqfj3JgetYic6TSTWM41xKqg8pCnVTFL9Gd8mJwHhRGYfIXIAFoUUWmS8F9lCyp7xcnrKCfYM2MRuvjjTV0xF29vL+aqiFAM2HIEsJVhQKlXHBla\/Yejq717Lt6381hxHVuS\/vlAe\/PcXnWLuvOErVY87VFXARCEo0kDAEGXAGOtECbMUD841kkFQsBAG6YhfCnJMMORcGAQZNz4mnLhr+siHyGZn2enw+8bdd5YstEqzJ0uQEJDC37T4wCevnmnCTDySTwH+xUef1Lrzf79XaT5wUm9JUyBj2KQOgQRC5YHAdt\/ou7ZVoGCrxoW0DGb8V9rrRNyOsPI2tJQvo8LXuJ4pFIl\/jCsctJ12J\/BITON\/t83vkaesOeeXR4M2LVzY9kewyNqkCz1cAAva5Uqzs+8Zsmgn6tk5dv\/nPNoVgOcBMYAI8ALAZ8CMNVGmJjowDDF092fvveZbX2NepebgC9j43Y\/vf99vvnuZvvP6C\/eu6pqKh2GiMQgw\/I6OPIsXQSHKlwQryDW1whnp+MzwjOvOF6lzF6ftS1akhSIm5yVp27epzdYSFEA+gABMyvFmJJ3KMgTY81dXnnPs32Y6nkfuol71\/qVbb7jiCx0YPI71qIAn0xzZthVYZ4DZ3S7hzGIcQc5kUwlrnlxdgiaCCYFMu\/\/SigL\/KTJHb4BFwZebixGOSH0gXbWUCx+xbREjSwFT9GJX+pbserVclZDHASaQVbPTvqx0CNVBg3DH6Zi+GYn73RaRCdNOmymboDCuoAHpCH6ZjibFDHgSpADPGJhWiEqlhIGRhyoLOsI3br7wPy5h5l8\/kQ1Jml9\/9zM2\/+6nZ\/eFW57T7RnZGB1DIADP96ETi0S3oMlAUnrvZAbNBFhyYgpkDciYPKsACUghoDOpXnLKvWCALcFa4QbCpdrALO4g4FkCwhdCpPPFFsIoV6FnV21OPEZD0F19x75rRg25RyQS4zu\/09G848aPd+uBkwMKhSIAbCDIQqbCeRDjA4tHYiNYFwtbJ8bvKirCPZGorcRbBAWXChIseeBxz4gsoM462BVs6rDkpGjS0vSEPq28mpn2vuX\/z0ZzuM1ZcdaCUNQXssjdycX4uLLA+\/Gsbopd8dDYnvcozr6OC1ypvVggGabVAqQPlMvgyAAtA+kJKABRYxh9HYQOvdUXm+644OHvr3jFEzJ9vPzcjrs++Jy31\/\/w6\/9ZGg49t9u0pGmOoVpSEIrANoJUFqScD6SwEgSVNh+n1vWUAJRAkpmkxzCbhuG2qzwDxAEMVVEvzfvTUGXJSwbn95y6ubrkwyN+TzNUFVipAEFueiZLQSxgrUXC4kZeuVI+6kCM77+s+\/4ff+vTIhp4s2ErwBpCpYqfnBtVu12TCizEuDQsM+4oLoas8XKyr50OBMhCkAUhmxMTMFAwwodRChEIMQFGEBIhoYUHTT4iJkScNdQk0By6iU3LUIlFAIlAA54lyMQpNZjENe7GbGAkA76ATlMnJlcpZbL5dDsLd9Nx+m9LFhYamk37MSolOGZACkC5gMW2+4IhRPo9G5DRkMpC2hiSQwgbgSh1\/6bpBR7tBNWCmZpkZ319eHzKzGl26crzFswJRCBz4xcSASA8sJsZh1QAbAQ9Vse8ktmntPXmz2648OXPYuYnzHDZ\/ee8Yt81K7\/72cXr1\/xXXzg6T+mYdGwgpQ\/odFJVOO8DZRL4lqGsgjCem4Vkp0iimKHyxsj0S6UAJxnEBtDWiSOyBFAGVK3Z8Lu\/v6n7gPctPfXY25Z8c0Nz2Rs\/8M2B3n3PHAt6brdCwcRhWhmw0Jw4UdMoNgvnL11NK2YWwdyjF5JvW+lvuvqCf+5orf2Mbm5FLTBgM5b3FDAh15py1F6hqjfNk30yqZhdE4m1RyaYneKrgUojKfc5Kp0YgLFg1y0GFhIkFIgYWocIPAdQRBJgiSRJoIQHody\/Ndh1sUvFslyLE8imhhiLk2RUAi1BnJCAFZbaTrbONlwxqCTBVQY6GFxh5qq1VgGAB4MKJ\/ADAdgY1iQQwrr0yxiEIUNKl0pAKthWE0Y7akL5aXZpaVyHV97LNlMTbDbEuxOxtOAiV+e4PFvAtbajXSqHzCJVFk\/9q0jDynS9xQSoKsLEYDRYcteCE\/7x9XTCv9\/8uI6++vvFw+r6E5p33PzdBWGyvCPR4DgEBcohvufuCxYmv0oiTwmCNKrP3L904UHUJreyehB5bsUYCECUoEUJLS6NVPr2\/oK\/9IWfpv5tO+75wo\/vu+E3P\/lVtx5ZTs0h4UsBth5akQZ7wQY64uQjOs+5bOBRw4nx2pXlTZd960wxfO+Z1oxC2QgurXZKq1nMGIkSAIGS1QA7dQO7nVr3zh9v54GMaZxEWd7wKtJ2C0kAWZ1226czF2wBtrA6gSVASYnYOP7GDbSCVVC1stoRh3E8rDqqa6QMbm9E9gFR6l4fBV1bjOhooVRrJIbrCcJQa6nZj9njimEdMQBIK4UkSEtJSUNUhUdVQJQsJx3Q3G2NWViy9QPi0Yee3OUlB4SNkU4llFfxlIiadXikUKoEgAV0y8lDqEoVomxhbYI4DWVUxsDlPR3p+cX0Ppez9aucPhpz85NgURiF0K6DnNo8o+vCbFeBLdn8vhEE2AQQQgA6QkkqJHpo+cOrr\/h\/fOe5b6NDPva4bL3gi\/o77\/\/DVR\/paj64ohoNLi9VqogjAwkJKT0gMbBRBHgOj0Sx0VoARHGbmsgaVjltOIZTPxYC8Ind1EjkCH+q1rDF+jyiOm\/jRft\/qm\/JUb+a\/7EpRobefM6Da67\/42sXt+Q\/VZvhP3Za7VVKJQISNCm4dVFvLZzNse4REGO+0Vvz2Q++bl6y6RNsRio+xZCehTGxS1WQ9gGlJLooqK6yoJSn5gnvOe6Bv3v3vzB945ryGJIIwqacGU\/CrysByAAJeRiLGNKvNUhVH2wkdEfPgsW3Yt6SX5Y23vN3PHyKUQDmn9XPtJt0f\/g37+wygwPPaA6uf249GjrMC7qX1zzaa3R40K+VAqhSGSQYsDFaYQt+IKEUIUkYBu3WjfFjXdgl6fq0tclxupLKnWtKif00Ss6mDFJ52KwltjBkngErweoEoqTQ4RkxuuWOVz34x19u4c0rP0YLVow9bsCLmerfet\/y+35\/yYc7G5ve0SsSWGhEcd3JRQcKYA3LDFIeLAzANm8PhOPp3YOKTVYfaoMc3LyjKwAxrGEgss5wp9qNrbacDFV6V+1\/8qn\/HLzpM7cBv5kui2IAf+dV\/e81f7zxuq23\/\/0zMXiR7VRc13TLomMPiGaXMe32k9ov1nzlxtd3Ndd9jkcfWtwpI3iIYZMEMgCggYQImgIQEXyOIMDOC1JQ2uw6uYvwdCC2a1JKLoz+pFjFAgJpJZVte85IZOVhiZAlaxWE7JXXGq\/0R\/Y6r0tE192ozN\/i7b\/PunnPOHcsq5AxM+2pahnzSln\/y73dm++6YXFFx0tluPXpKmo8T0T1I3xudfiUSEUxwGFuIJzdxFPxkFPtefshI3YiEnNOOmwBcKrVD5tWLJN8\/IyztDKzCStIkeefTj4Qp1IxpRISlhiV80crB5\/87sqLL\/jR4wLArr+oc90l\/71CbF3zoQ4aPkCaps+xgYTJVVw8ARjjjIuCUgWJ1uncoy4ovGRABSida1ginS\/Jr5tkwPNLSMZixOzxWLl360jP3ucte8aLvld561kPb899zTde4A3+37Unbbn7zn81lp8cLFr6ngM\/c9mPHxUgNvrDNx8yfNsfftbpJ0\/yuA7PjgE6gSfb1Q0mIKEyCBYeR\/mgtCHhwGISTmw2kdjOAxln7m3ZYL2bxBdpOpV2JlsrEJOPSJQRqc77RW3+DeV5S6+sLt7ncjrpvOFH95O7X+jLHjqhseX+U+Ph9c\/qDuIjEQ2VJTdcMUNMrjOWp4s8VUo\/OxCbIRZrR8Hsg6yCoMxiLxezQt5\/nCcWti0AIADW6X4oBatjR7GVKwhtBSPB3rctPPJVL6Nn\/OuDj2kAu6y\/+77fXnV259CGd82XYdBsbkFQkmAroZQCTAxjtEu\/kZ4Tm7Hztj0\/i2w20lEmXmqmw5Bgm\/LPzCB2Mlcjo0B5XjdGVecmb58jPtp3zJsung0ZP+Vx\/OzrC373x99\/aMnyA75y8Hv+Y\/0jDmJ8\/beWbbjii9+ej80vSBAL2Ai+SqCURdwA\/ADjS7WFERqeWO3agdRxZ0GMMmK5sE953V8QmBQMKY6p0tR+39qwsvhi7tznMr97v7W9Lz6r\/ljqR2JepdZffPGiKm88UI+s+dcAw0ehNdhdISsk6ymjp6mI\/l0BYkwW1rkoQGo4EMtIHEocmGW9F9lYTJ70pPssnGQTKUAomfI7rru8hQCh16fFwif\/oOu4N59JB6wYeSwC2NpPvvzJjbtv\/HSPabywHI0FJQI83wOSKFXRJRjj5JDgAUoRSDB0khL5cDOplj201UNMqvXWVl1x6blNwzKXgYSlGg\/63bdtLM3\/yNGvPfX3dFJ\/uNP34m231XDYYY3Zrp\/dBmK8apW6\/fpPfmZpffX7uzASRNpA+hLWRFDSudo7J7VCzpIh1YTeJZtxH5QXzLYbxLjQIdWW6bGFtgEetyizriRK9b5cm0PauUwKWgaciPIm7ff8qjp\/v9+Wlh\/7v\/S0\/o2Ph7Rky+Uf7djy8J+P60D9pdVw68mBbT1J2ggSCcjq1AJvmuiLpwIxO+EhUfDKmxCBuczdwsg0Y9dwaTxn6rtZ937W3KswrpScVdNSbT54HnSYuHYB3wNbAwrKSNhDQ8yr276j\/q33qNO+\/lgaTdpy+bkdG6\/68Su6G5vO7OWxo1Q0Cr8UAIkG4nTsguO0POsDvgc2EWKjobxUgDWfWfTAVhVATINgHHeW2uoR0vYBcjNeY6pcH\/C7f+Hvf9gXFuujb5qsArkntt0CYswr5bovfeUV\/tbb\/7tDj1UDJKmnJrmeq3EAK7b53qUQZhwQEbdbMNoldppygWTgR5Sqt7JrjXA9L5yW4F3vFaUWb3GS3u+BAAxBG6caqxOLoOTcw4fGYuN3L1o7mFR+2bnv077YrO738JJT+h+XKgl8z5XBw7f8dFGpsfYNydCD\/yibm\/fv8GLPoxDaGDe4K4EoAkolgTh2bZGKFFoNjXItAOskvSdsTsRj3HNDpT1Fon0ds5I+tblI4vaDRXDhelPRqb2gzZZzY9lHKVA2uJ8r+DGs1hCVeRjUfet7D3\/xm+iF5\/3foz9q7hf4eXnRfb\/40Zndzc3v7tCjVR8h5dEnS8CmkyKcTlyQyLW8TDoSZOHavOIGUFauRUXHCYQgMBlIKWASQHoSSBIYBmRXCU32ecDr2hr37v2RA1751p\/RM9\/2iFZ4dwuIDf7g7c\/i+3\/zzVK47hAvH9MZz61sEymKiZxLVjKfupQ\/E4i5alVajue0O54p\/SgLkAYRYCxDKQBKgbVFHFrAAkHJgxUerPLQjAna67yRawt\/1bfs8B+ha5+76aR+jSfAxswU\/eqDBw2t\/fsrZH3tq8s8\/FQfTXgicb1b1rqhBgv4QoJIAUlcABibijrytt3VTO02iuK1pLYyqN1h3rPd4cYcuGiNLIhS9QVooOQhHI5BHYvsoLfXZYuPes1b6JmP3rYLvvGKygO\/\/PZrk3tvfet+vjlOjA0qYaMU9K1rBYIALLuROSvyIgfIwgoeV23ntF0MTGDNICkB6YGTBNoaeF4JSRTCCyRibTFkJbBo3z+VD3\/mZ7re970rHw3nZJeDGK\/qX7Tpjz+9mqKNh1dES\/g6gleoLto8itq2jyhTLC3yK5lMzJR9R4ImBzHKwrZto7NsikJkUmXpU95YAUsSUjAEDEAEbQRk15J1A6b3l6V9nvJvtflvGqKTTnpCgNdkEcDg5ZuXJutXf7gWrX9VKRleTDaUQhF0HDsHb+s6v4VSgE3cNAEBMG1\/yTzaSs1WgUKEZlPpoAzUhNkpOR\/BmbFr4CBN6vRzddqtIRBbwKt1YytXksHyfh865N1nfJ1ox8np3fUgwe++snTLz37ycdp875vnlWw1bgw50h7WNVLDgpHACpv3OKoEqVkLXDtFGtXK4jR2mYCEnRiIclGc1cI9nJQGC0Z91MDrnt8Yrsz7Yd9TjvtE7Yzvbn20cL60a58SF3gDv72wv9xc8y+WNMAJyiaCZJOX5G0eQdlJDV0nDoNM5ks4DsimArEMyPIeAYxTisgLBSnPC51WYFTJNUZag3rIoM6lf0Pvfh+sLTvlenrJ+yPMbWBepfCby58+fNu17\/LjgTcEXJeSHIjBRGATgxQVjFZEWqIXeTTEpAsuR20uzfW0StcxTk4vzNKO44kA5+mVK8ZpWKEzbUgIUQb8CsJGHdTZi63cdevSZ572ajrq0\/c8ms75yBfe9rTBW6\/79KJo4MRSyfgY2+o01OA4WrKpwQ1iWNGep5XGDWEbcNoelIoXZgS9dPUQ1i6zBwvEERCIMqA8NG2EMQJiv29MLTrw\/4317veT5f9y4ZZH07nZpSC28euveRk9eM353WJkb+kHiOMQJcrKseNn5TKJlyL4zK6aaCcFvaKu\/PgVl1UX0wggC62zo88iNgOg5AFGYSTkxJQXrg4re\/047jrwv\/d7y\/c2zkHXJGB27cpyfO+lH2yuv+m1FTN4pE9jbiF4Fhzp9JR7KemeoKgSy6kywjhyHoC0gLCUjr1gJ0GMx\/NwBUVSYrd+TSKhZAVhNAZNCl7n\/LheO+zceW\/9l08SPbIRNzPTHR9+9d4Lwg0vEa2Bj5Tt6L4yHiLmGJTSiDY9TGml8+ZA2rso2vYwWY8XWXIV3pxfZJAEjHYPHeF5QGzABiAvQMICutITrdXqBtrvyPOWn\/2Byx\/pc7JbQaxx+UeXbL525f8t8QcOVroObQDle66rHZgUxCYDpTytnHJsxW6Tfm5z4xYOjwWNq1yJnOh0Zp+aAOl5iOMERgRocRWmvOiiBQef8O84ZdmDc\/ZfMy+0Ld97zYHJxr9fKMMNz6h5MaodEroVOZ4xTmfwOM4baFNFKqfSCnZD7QXJbmkBGH8XpJNtcBSp9Jh1NZtc7zZOCIFXBnwFRDEgAgzYRQ\/0PfVtx9NJH934SJ7Xuz\/0yqfO27L6y9166CnCs0Gs65CehRUGpIA4TsWTCkKbcoLYps5EMS1BWOXkvSecI2MS+KUS2DASo6H8AIYYY6iGo5Ul39rnRa\/8LL26f900GMIz4AtNfnF2zYTKLgExvn9VaeNPPvEfwcAtH+z0mkLCIgqBoCIBzZOmidvEV2QnjcQExg8STxVxFd+\/6CAM6TpeXAidibe5sRQmC8MWstqJUe0Z27HsFtV36H90dR\/\/i7nUcfu2oVUf7OaNd5+uBm7\/iGe27EW6KTwCKJapiZMef9eRo90NtT0IKHWykrbgQEUzLvZp7qk22SZzkwvhOv7b5lkuq2KkumQE7lzKW7y9f1g+8MUf6Hz+vwzsafDaeN5b9hm7+6Y3zGtt\/aeusa1LyMSwJYFYEcj30Wq14DFQrQQwUdSujwAgJkirQEnKkanYdd+zc7zPR\/vSmV\/JFlpbqKCKMNZIPA8mKBkTqNv7Dj\/hP\/CBIy6Z6kF+2mmnydGH7n+ZJfuZWAmKhSKoCkuhSBlLglhobXLhdGaGtRbsLhpba61SygCwcRwTgPP+8pe\/fHd7wW2XzE4O\/\/FnB1dbG1\/pm7Gc0gh8wEYGJKZW8JztkPDEv5ntUHFOhRXS1sz6zTVZKBivhLrpSFrVpT9edsTJ59CJn74D+NEcKm3n1nPSecPMK7+RXH31DUNr\/vypQAw\/3yQjwqcGlLDp5HBBVocYQjDYmnSRpT6fnEkyZUPdRfnb7d9MYR7XKe1SSnQbN1eevbsEkBhAekAyQl5y10sHHvAvBfA\/exLABs99w6F6zZ+\/sMQOnezrIZCfBrGehVIeIq1RLdXgWQvTaEEK53pl0odDxtXL7LylLSVElJrKaMC6u1+m14GNk6Ieg0Jc6jZ1VfqpN3\/Rv\/V94Ih7Z8pEEtILGs3WoY3EQHglN0pIAmALsgwlKe80SAEsB7Nsk1JCCAGl1KLTTjtNXHLJJdvFH+x0JFa\/8jPzR\/9y6UXdzftOrqg6kti6\/qEs3dvmY7ZtrZi2VYKmV0uYSqYn+71hgud5rtLC2ulnMUFbhladPGRrDwR7Hf2NBU9dcT4d+abGHBztgsV44+fn3feXX32sUz\/09ppZ0+3FGiIBhCgBCbnmJJmAwxgIinOpEsTCKd7CFK6\/mFXkNVkkZlKFTWUBsqnmFQCrUkVRBSDhnNg20ksdfRIMq6VXjRz0qlcuf8lXdntUzt\/9+P5b\/\/ab0+3Q2g92B7rXowYazQhSuntZpsopilNOy6YCfNaCJY2XKGJAsmtrscIDs4ESGtakNngypShT0oylj1EQWrX5d2+pzL9w36e\/6Fud\/3jObCJQeubxx75laGTkOyQCSOWDmSAlpQKJ1jXGThZgpGCWJAkqlQqazSZqtdpZ119\/\/ae2t+qpdvbJsfH8V63wxzac6HOz7fibttUby67StzPR1RQ3LU+PcXky6gkFTlItKu0etMoP0EqUbcieob2OftE7sPjoa+jINyVz8LOLiNZjP7yV77\/w39b\/\/vLBDese+rfFFVOCVlTxSkCcAF6AZGsD3nwFRDptSN6dM3AWFgRJNjdPFCxhIWGaGtLzQGV3nxpigAx8A5STgefaLXe\/iJl\/vrvaCdauPLPMt9597KY\/\/Pi\/upOhI3wRBboRIpFAtSrRiB3oqlwL0+QzuyCnXec0DdPoRxgwDDhNowVJmNjxv6IigTGTqRYBSiKyEmG5S4+We27c4nd\/9Ohn7XMtrThntpEQW7IWQoBIptMtmbKrc+myNtXRm+w+IUKlUkGSJCAiaK13CI92CsSav\/nqYr31gdNr3AyUdA2iIg2DjCWwdeBEbAvNqTQOhvJbI1eMFFMS+ePgKbO5x7ZVznHvC4CEBJEHXyWA9FFvWLQq869bdNQL3kMvveDWOdjZDUC231tCvvLLX1hnh9eO1u\/+EkSjFyBUukqIBwbg95SAVgy4Pvr0xilMc2Sd9WkUtqOyPwST\/q106ako3lcBpN8BxAk4aYEDARMoWOv63XzoQDbvPwO3fP46AJt39Tka\/tp7ekZX\/fZT3ujaf\/CSeheVCCQdL2gskIQEHwqSrfNJYM4ruUYxGBbMEsICktN+IWvcOczUyXUE1VmBbTRh6kDm+GA0ILvKGEV1y0Y17ztPft2Hz937pLcM4yt\/2b5ARrAlAjw4Gz3D1km5i9TC0DKY7STN7u7\/WmtorbN0k\/YoiDGvUhu++LnTy9HAMWUvBRCT3irGaYORUOPSx9lwYDvKk00elTlexUQGUgDwqwBVY+7ovXnB4c97P730\/DkA251A9pL3R7xq1Y+HNn15WWPLfWc29OA8HQ2Izvmd4OF66uLtZsOItbO7Y5tex8wkZecCIGLOTYwps6bLxAWsABInS0qeAQkDY2IkzPBkCUFQxUB94Ah95++fDuCKXZY63nNloP941dPW\/vGKf+4Ot7y4SyW+UUCiNdgAQSAh2UMcRvCUAmWsPdo9j5kwJGWLLpOFKhoSMCAUENWb8ISAV\/EBCFgWSDorrYcS9eCS457\/kfkve9n\/0l4rWjt0fklZScKN8gkLmIyPFjBsQOlDarqHUEdHB5IkgZSSdyTi3WEQu+PsT53QM3LHx8qy7kNEiI1TZ5Xk7AotMYTngW2chpgTBPWmAKmJkRlP02IxHrkolfbicbyYkQY2cPsVQWLA1C6V+z71zK5Tz988BzN7AMhOOkkz87nm52\/7bfPhm38gZHLIWDSEWuABsQWsygNzJ\/0zu3t4Ng87weSUGVjllmKgKLNRBMhC2wTKSxtwOYaUgPSrSGwXGlpCdpe7h5rhC3jlyit3RmIm3+9f\/cviBy\/4xIfLrYG3zS9FXQAhcuSt62OzAEUMTyTw\/awLtaBIaCnVSUsdtLMxIppAcqetjy2WCKplCJNAhzFUbR42RCLy9n3qv8w\/9Nk\/LL3qI5vxnu\/v8PGoxGfFCkIZMBlYtoBQsByk6368W9bE65bxYnEco1wu79g+7NCFWL2yd\/MPP\/3uBSXdw1EDBEZiXb8VQOAkTgsU8TiplnGu3BMcuneX\/Zq1gAwCjIQybJUWXdl7yAv+pfzqOQDbo0Dmniw3bvzp6W8JN4XnJc2RpymrqaTY5TUsUt6EwEWFjEI6uSPEPpC1VrTfx+QyTwwSCbxqAA5bsK0YIgBEDIzFjDiojVLHors5CC4wnYdeQS\/fCY0sZqpfdk5v874bXxj98Vfvnjd6\/\/EcNVQpkK6FMXVbJyHAhsA6ddjKVSNyXiQfmStGXBlL49yvUvUddv37vldCmBgYWeIxv9ZsyJ6b1ZOe\/K2FK976E1r+kp0vWJDPVgQgkYDJgK0DV8Euhhbpzm0r1eS+D4IAcRwjCAIsWLCA9xiI3Xvpd17aXd\/6mla0RZSr7gQq4XTMmT1YIigZux4x0Z6XLAIZFTW9dwLMcm6sqMJSqNL4FmjEgY56Dz23svT4L5df\/cXBOVh5ZLZFr774+pHL3vD+MAp\/bu3DC6MwRKBMWp70ndmHlQAZWDhFHAHr0krets6NGYsBqc1YHsi4vjSbKpeADIwdhZDkdOfZg4wA5c+\/yV\/w5M937vuMq+mEDw1OJ7E8GwAb+8YbT9xy7y0fkvWBl9V1kzo8jaAaANEYksS1pwmkuMVwc6cQDuCpfX8XFVdlOvtbjLzcrL3IhXSIGRQ2IVQZA6XewY4nHXf2vIOfdzG96O2D+MSlu+SahlCcUOBScsQAx6lSTOSiMvJhMbWhTxzHiGN3ravV6p7hxPjqD1c3\/faX\/1g2da9ckoA2uV2WJQPN0o2bSA8w8U6XnbYR4MvliN3Yikp\/kQ0VZUL1RAQLCa3KSVRe+r0FL37Hf9Ehb6vPQckju3W+4uIbootf+ZbBh0bOnxfE+7FJlSZsqhhaZMGyPCn18mtrzBULRLIQtaHNe010RAdghLN5cZGfMy42hkFeCUkcoKm9Ld2LD\/5R96HPOh\/P\/Mw9O1uRvOOr\/9T38FnPfpXdcu+nu2HmV30m4hiejQHjwNWrkHvYG0BIJ55mjHaTQ0Kks5+c8nht0xwSOb1XWCzSOWdz1kjsI\/Y8Xfd7bqgdfPznO9\/\/jp\/v6rEhKzOAFWBWAOJ2oY0YnA4nT+VIxswolUqIoh0PCre7i\/CB3\/3+2N544PCKrqeeioBJccxq49IBMm6EIyMhbfGLQbY9gsQmdXrIqi\/pV1v+mEBMzpE6G02BO2nO6RO5072QAoklkF+BhUQkK9hYWvx\/g90HnzsHYI+e1HK+\/4Zfh5XDvlI38yypGmyMtCodAWgBiCBKVWgr4VQRXVplCdAK0JKhhURCPmIrAFUCZBk2Na\/IwSsTZ\/QJESOdDhAgC\/jwIBPAV2VEXOVhb\/71YwuPfM+9ex31UXrWOXfvDIAxM\/GPPrqk7+Ebz1cj677cKe2CKkek4lH4tgGyrv2AlQNRLQCtFIxwEZQVAlZJWEHQcTr\/mTpye+S+hG3bs5oYgFQwcF5QEAol30NdBK0HOpdfao97yevnnfnDn+2OuUcRj5HHETwy8JUDXmOBWBuQVLn40lQeDUIItFotlEolDA0N7f50csMP++eJv\/7wXz3bmA8JxAOA6na5t4CBqyXpgoAdzzhAMJl2+zjuLFfrtIWqAHIX6ChiBBUBtCxgLAKvgtGmRlDtsU1\/3qULjjz5g9UXnffwHHw8ioBsxQrDN17w1dE7r+LR9X\/p7+xQXRgbcauUCJwwdKsFT\/hgm7pKs3UV5pw6sABLeJ4HYwysiV0SlbXgZxGLVGk0l8ATntM9I4VISxi\/LzRB71UdSw46P+G+mxfghSP0kp3jvkZ+8tH97\/2X4z\/YpQde6YXDiz1YoRDDoxiC4gKnlRmwZOKz1il+UNb6KyBAEBUPMBbWmozTd895m4sgQ3oASMEqhdGQUelbEA3EdlXXEcf8u+jd\/\/ZFb\/r8bmvirlQCarXGkMQaUkrXniKd7ypPE4EVv5dSIgxDDA8P7\/50krfc8QwP8bObzYao1Hz4SwKgMQYmkxtqkMlAiNtsI03gKSYjaQvtxu2xIUrljW3776wAE0OSgQEQBFVErRYCH4CnQGEEkjVsNN1rFx580hcqcwD26ASyY9+V8D0XfXfgt4NPDVv3vAGijhJZwEoHWsaAAg2bpkgipRNUynczGxhmCGthkxh+djenmYwmB1imqVH2fQQqAJK0l7HSgxHZ\/UCjstc3lj3tlO\/S0e9PpWW+s+O0xwXv9PDfrz+5ecdf\/r3XRMcKtqJUAlQ0CoUEnAaVyPUHRPoFCMFtb8ds5bBtG00ww0IASkD4EsY6MUoSCklLQymFVlNDdPWAO3qH79ClLx\/zstO\/Sad8aP3uvo5Lly6l0dHRfIwoi7iICMYYME89dpi9RimFOI6hteYdcf+aNYjxqv7aPVdeckY3RX6lqxNxKwRFY1AeQdhUYoUBQZzSE1mz4o7NTToZME4ZEkrHmArjRimRqdkiMYRAlRAOh4gMIBfNv3vpoS98nf\/yr9w8BxePYiBb\/g+jfO0Xzth0w\/cXdFWT55pwSLBxM4LKpiM1pLZtAExpLwULq2MnKZdpLmp3jwiSYCKUe7vQGh6GZyWsqrKpdt3T8ud\/PdjnGT\/qOfW8zTvLe\/HK0+SD65sveuDe35xViQaOLJvQq5UCSgyAOIFKCwuUTgmxdFSIgIS0wlEvEzTvqFi10BaQDsQNA0linOmHdY5E8GtIZIAR6UVU2+tbi45\/wefnv8pbS\/ShPaK+Mn\/+fL733nuhtYYQAjZ1RMoASgg1Ld9trUUQBDDGoFwu7+Z0csPaQxea0eVIRoCSD\/IrABuQdZGqSB8aWa7OWRs2TSytOmQWE8QOx3EZk5WeOKV8c3sWd8W1juF5BI4J0q8gKHc01sWlzx649B9vA74yhxSPdiA74UODzSs+\/O\/hfZcdKNXYviYJoYQjg61mCOmGhkzKC1FRkRRwpq2CYMhCp8FMQG6AXJBA2ByBLvksq\/N4yNa+vfDQE79ZPvlrNznw+tLOFJwIP3xv99qbfvvearj1HR0B7SOUhVQeWEcIjIHICgxpdKjIOWdDWCebnjr\/EiNXWWl\/QJovehYQAmQ0hAaE9OCJCrQgGOkjFAFvMt6Gkc5lX37aG886n4584R6d\/1VKURzHOcdVDE6EEFNa\/WWblK4wUxwI3y0gxvdcGQz+4Kz31sKBvaSnkcQWRlTAsYYC5+YdWcifWd3nTkYTIq5xFUfwtoA1yUEzO4owu7YMp8uuyOkfNesaomthNCy6P3bgv976XaJjeQ4iHhtb+WWfu37L1\/7wRqWHLycZ92p2bRVSKrDg1O3bqTXQRBUqV8ZDwq7I5ysBYwkyskhECXGtu0m9y77h9+z3nUWvuPh24HYAX9+p\/eU\/nttx9789\/e0L7MC7F5mBg5QZBdedD6NNFy9r0xYtS5eae4CnT2qh221w1kkRAco1hQtKtdesa4AnnWciRD4S9tEiD03Z8XBp70O\/cfCTT\/wanfLhrTjvhY\/I9bPWplHYeO3A2bZLZeoWuxXENv35NwfRwIOv8EVEgIDRBqQYUqncGSt\/eADOpEBQOvwpxoNVHlhRfg86Koy3yRpsJpRCNpcTzu6BPCJLLFD1YZXgUapd1+g99udEt84B2GMpGiNiXtV\/49a\/rbzUo+jtHrWEUB5YCBgbQTCDIFJrMbRnCAHHiwmC0ARFClKWERnASN94ffvePIBF39zv+W+6aEfHasY\/UPvF6Nfvedr6K37wgd5k4NSKjCsUtkCSHCBJ5KM\/ifRASgEmdFElBbCQqW2phmSb9sAV6GNiWFKOBgOD2XHNwiJtARYwkUaLAmP6lq0Wyw79ZPdzP\/hzOvbYZKpocXfr4AshKIu6tNaQUuRp4lS9YZMBoOsx5d1D7DMzbfjCy1\/V4yVdMAamaeCXy4jZIkkieGm3KdkCX1Uwf5hut7YdQRhPfxA5IBQT6wL5iIWF8hRsUyMJ+h5YdPRJ76WXfW3tHCw8BoHspP7wvvNf9O2O1sALKsT7SaVgbJKr95It9oiJVLsfABmQ8GBBiOEjpk6Mkrc26N37fzoOOKl\/\/xf1D+KffrHT+3fnuacuWfep37xKjjzQ3yfiPsUtKKOdvERGZBkAJQETWghPIdERRCpQYFPzkyz4EpnEbaHb3iBV2CELy0nmT4sYgJUetKwiVJUtpnuflcuOe87ZtOKcLcBFk+7v2087Zb+XPfe43mc\/+3j7lKedlBx33HEcx2P43vcuppYJxdjgIPVUqyBKWDc1f+LsT3Acx\/jzn2+mP\/zhD9JKKeI4Jo7jrTfddNNDU4GhI+9d5OVIei9dtxmIzQiC+fqP45h2z+zkDV9byAMPvYCTFmBddzHA0K06ypUgt7pDynUxbKqtzunUROZgNAk5m5EFWeqJCco7xoWZQmYmeQCERNQyIGHhVzwgTJAEpWbSs99n6WVfu2MODh672\/5Pf+XfGjeH\/04jd34jjkeqQUkBxiJshSgFjhBLWoBNgKA2D7YVQyqCjg38jhoaWm0cFT3f6tjn6MvnPfsNd9KineeH6t99y3w7ct\/JraF73q+ikSN8GiuRDgEb53qNDIL1neg9sYHwAeIYUjiTDsfbxwBi1xKRRWBI7c09D60kgV8uIWw2oAiopFLaLfbB1W5uxhhrBvN+bXsP\/toBL37r9XTsKdN5ndLQ1i0fHNy09WWhDPj\/rv4l\/9+vfsksCURMUgj4gtEK6yBBEMToP+tsWGth3Aw3WZZkmSGsvuj973\/\/Z+Ca+CblxDIg830fWifjqo5C0DbpJU0YOXQRnISUcvdEYuaOvx3rNTYfIjJ5D+M87RRZQBcdy10ntE2JK5mT9FzQ\/ppevWIyElABgHTuQzoEhM9uZMNoRM0EnlfhYXSsqu577M+A380hwWM5Gjv2XQnf2P+z8E+bX6hIn67DIRLWohQomETDMOBXK+BYQEcWotSFpjGIlRc3k9LVvQc8+Qt9r7j0945O+O+d2pd7rjwjoLvuPBYP\/+nsUmPTiTKOlQRDwoAocc9ckUZQJGDILSVhGRK2TdIL96hWcL6Q7Z8LV6os1zC4eQhdPSU0Ww2UAwVJBBiGQYAk6OOtpnznvOWHf37h0idfRCv6Y\/zbZdPuez9A1zXtfKhgf0HCgaZbvE5VgkwqkeUiXDcs4aYZOAs80vfSxs6r1+tTLtw4jkkIkRP0xehqYnVyFjzZrgcxXnVhadOvvnRGJar3kEewrFxVURv4WbSV5Xos8wua5\/rZQbFoR1wOzQozkyk6ZzH1OCOQ9KgSV3aSipCQ4+GkIUCWMGjVuoWHHX8mXvm5LcDn55DgMQ9k\/c21X3zmdxb7zechGlwsiAGdNlCzQNyyIFGGkQotI5uic+kv\/QX7X0y1va8pvfSc4Z1umVjVr4bu\/uNxI3\/9xRmdtv4srzG8SGlNHrUNs6zNwIucbn3eXZsuUs6zXqSPc0hbWBPkUkZDEkljBN19AQQblAnghJFQgIb2bVzqvYcWHPz1roUHXtm97yvv3x6\/0wb70KIGQRoSSQoghTWVF8wyuXZ3DEScj+25XRXo6OjgafhMKkZTxWhrMk5sptO\/y0Fs4O5rjuSh9c+rSC2MZSQM+Oy0n5A5zxdaXNxcWmrFxTol4F2v1zgA5vEnaiqUzqs3GoBHIOmDWcAJtVpov2aapQUX0uk\/vAen\/3AOAR4n27LKoX8aaA7+T42q7xFmzBmI+D6U9VAPLagUsPH77ohLC3+w8Omn\/Rcd+66U2P7PnSDtmQYvfP2yh\/\/w\/dPL8cA\/LaRoGZIQgSgoR2SOf3n7o8wXf1FBiEg6XXkCrOC2d2ras+0GuR0\/Vq74iJsh\/ECBSKBlqoirC1qD3PvL5Se88D9pxaf+6v74y7M+ln6AjwqZPb8Ma5uQnA2SU86zud2hPAJrL2Y33ifTec2ELG\/cuHFKcFFKkZQSURRlKWFepXQVy5n58EIHwq5tduXbVvoDF\/\/XG8q2JaXSSDLXIsGwafUYBQ22bACXWYAgHfJQcafH58MiFXHLvYuokJZmoJYBc1qabIURyK\/BL1UwliSoi86\/isVPuciVzee2x0009q5vJpsvfvUXW5uS4xI9eFSJIpi4iUhrqI55q5Pyku+Ulj7t0p6Xv3Uj0bE7LSu+8fvvXvDAvx70ui4z8rYFFB0cN0YCNkCpUkYiFJg0hImg2OaNq5SOqAgQTF7AchKAFgKCFCxpsNA5aS\/YJXQMCZt6CXAYwme3XFh2hJh38O9a3Qd\/Zfmpr\/8jDnxxHfjUDmGy8tpgYkmkIJuuUZutN3KpZD5hIyDIOgKI3feqXOazzjoLl1xyyaQftHXrVs74MCdFzzmAjRsbnATAJtvvXUrs33\/pdw+pbF3zgg6KAKNBhkDS5bpWOPnc8TRc1uXq5ZPrgM0774tk3mz6R4jaPWapfYubEWaLZmwQ+91R1\/7HfK7rLRffi3fPRWGPt23+00586N7L1181z8eT662tqtK5oM4QVzTL8z8\/v2+\/W\/Dy8+2uSB3vvvZ\/T6T7Vr1vfrLlJSoe9QWAsh84owjL0MTQYKh0UVKm78VIR4UYktozgpnDvZNj59ygngnQQoJtOlrAxjlzCwV4FTS5tKFZW\/qdRae\/63Odh7ytjn\/+wc49CJQmneg0EBAwaek\/X4eWXIM5qW29e0DOiYoZYTR9BnvvvfdyGIao1Wqw1hZJemit06iUp13nWTS2o9dzShATw+tO7kFzuccG0AyfCGwtTCbvawWIUr2nFGk4J\/gn7OikQCba4DcF6c9Z5doCEgK+kmAyGNOaxaK9f9n1rGddsbv7YOa2RygaW\/7+6N7vvednduim05KwMVLp2f+T65pq1e1981unnXbJTgEY9\/eL4YV\/23vzNZe8tXds87tKiOZ7ZImVj8QYyERDUAImN8wMcqmHJTfL67xErBtOT\/sVqZBHuIkVZ5EmUo0wkA8t0gkWayCsgRYeGqpjuB4svHbR0S\/4eOehb7uLDjk83hXnLwy3kF8qQycSYJW7twIEJgsmgin0K2VTNAIEQU7T37j6A4dhOOW5TpKEC36SOSBtT7PrxLR+l6STzEyDHz7kRTZsKCq7vFZIBRgNkwDKT3XRSYwj4501vEv8cx6MaebqxFQDoulbSwWAFeIkQRB4qHT1rTXzn\/wVWj5ncPt43g44\/G23rLlx9D37H3HCnfS8L+6SYeYNF7x+3vpNP\/uH2gMbXztPtJ7OHJExBhqOBvGV5+5hm4AY0MZA5Nxv+76mdF6TJpmWyzTwkam5kAILCRaU2gUKGPKShqj+edRf9I0lRzz76mDFf20FvrjLzp30iFqtBjzVmQcE7YUo8vRxqs0pZhCUFDj33HOnRKN9992X4jjOWyqIBMIwBBFBKQXeAyHGpCC2\/vz39ZbD5vG+54FtJhZmAEHwQbA2NTc1mR6Iy60dPxblzCcXpHWJUajcUKFS44CQirOURVBjAEGAqBEDSkEnhNBULu75h3nX4I1zC\/1xHY25TvT\/3RXvNbjyY11j6\/\/+SvPAdR\/u5pGDaiJWHDYI1vE3XgoyznBDu\/ud3QLhieKDWXsFScSpHRlJhkx9TWEZcQvwK87f0jBgTATLPmTQnYzE3v3ce8A5S0988U8XP+OjY7slm7AlEMdgYwHoXKiQuU3VOI2+tiQywabhiEhlr+UkDZ7jt2XLlvGtt96KIAjSIfD2PKRLKe24DGxiIJM1xRpjkCTJrmuxqCQPHwcd+Q5FRZ4sZmYf23g5MBW66E0BqLYdAM9O2LSGkcXfGwBhBM\/zIcodGG3qOiq9P5rJmXhum9sy3mvt6ptes+Wvl522IIhO7lT1mmgNA5rTB2ubDHECnG1vynEZQfEbKvzUOoDwhIcoShD4ClZr+GUAgtBICFzqAMolG9nyPQ3ZfeGSI46\/0p\/\/6jvomSdp4GO75bidibVfoGxokkzHjjPwQYEYolQd0FrG2NiiacFFKYUkSfLxodRDEnEc531iRV5sIpCNm6XeFcQ+33iB9\/DP\/vulVTZSSuFI+oIDEdPkO1C0C5xIE47HJm5\/U7xFJnBkyCobZR8mjmBMjCgMOexYcsWCpz\/3HuCauRU6t00LXmv+9JunbP79pW8Pxja+tYdiVYstcXPMtez4cCaMOiXg4TS9RNFNKxsJyuSXhYRNl4xkDcEJ\/MzoIzIIlII2AtIvA1YjDBOYoINH0THQ8pdeffCL3\/G+BUe9ZRj4K4Cv7tbjL5fL3Gw2oZSajC6a9N9FbrrdTW9x4IFTf04URVwqldBsNtPX69wwe7o+sQnAtWvTyZFb7tgrGdn0dCUMYZKn0mQHXtyZieMFbLlgnDsJL5YLIE5GjwmYOIH0AkgJDGsa1j17\/xzPOSsC+udW6tw2yb3ZL7Z8bXUlvPV\/XzO\/uebj1Bw4sOZBwiMgjNwzsgJACNiWBXlOmXi6ZcQEsPBgIB23xezAzsIN42RtVp4HEwOthCBVFXUhjQ4WrO054Cnv3\/uY5\/2JDnvL8J46D\/vvvz\/uuOOOWZyvqaOicUHFFNv999+fVySFEIiiOG96lVKmHrTT40Xxc3cJsT+49o5ndJjGoR7HsFZPEoKmfVw0ObgJUBqitkcXKLVdd6VnkeLWxJC9UItO24qdqKVAYiw834PfsegXC\/Z61mVzFcm5bbJt3bdOX7bp3y57Zbesr4jDgROkbopKwECs3RS1BKgkAZLQhpEIp3zhFpQAgWHS9geRd6y7hlbLys0ZsgVZ1+NoSEHWPMRjLXgKiMMWqNSBViwj6tr7jmFU\/3tM9P1s2Zt+9BDwoz16LubPn48777xz24xpQqQ1XVCSauDzvfdO\/Tnr16\/nRqOBSqWSg1f2GUmSpFZ8M+9D+r3dJemk1xh4ZplbJdYxhMA2HbdciJxoGg0wSsGrmF7yJJ36kz4RUk5MMCD8AK0oRBRbKxfOX0kr+uO55Tq3jbt37l9V2nLZF59j7\/rjx\/vE6HEKzYBM5BiKKL1ZFQDpQRsgihIIIeGXy7BJ6nNZyDrGp5Ru3lGQaT93czclgSTUID+A8QLoIDBDpjJW2e+wT1b3Pfry+S\/+1JpH6oFrjCE3uyimjXwmS+mK4oYup54axfr6+tBsNsHMyMQRs8\/JZHZmk8ntMj2x21b2+\/Sn75+odNONFgkJYbKu3wkRGWcjDJwHUEUwau9UPlw5LirLuLB2qmnHA5lNhfBaIZRXgq103xv19M3JTc9t7Rv\/tpX+7Su\/8byRCz\/+8u5o45ukGS6DW4Bv0RwDarW0tkQSzIBJDITyUC75sNrAhi0oYdvtEDz5ChHUTqxs3pHvdL48T6IZWROJjvujzgN\/vuCwky\/0X\/ovqx14fXqyxUopaMx61U6mszXT3zMzibxBd+roayLNM\/E11mo6cBpS7IADDqBNmzblfFgKoI43lDKnvmfSFdtlnNgBHpaMhI2FXjYypE2Bf5\/9h040yZ1J6ownEUQsppnawo7a4A8IlwzNLd25jW+8wIMdW7T+ivPfvLi19v01W++VaAjoJlAixCGjo4PSrnQX0VtrU4FB4\/5tLJQS7QLTTJDCmVWg63Y3pBBL38YcjOiuBb+Yd+JrPvsAcG9w0idC4BOTvsU73\/lOb8ULjq2MeYpPe86hdkvhd0liSGtDWnflK6FUKtmhIY+f+cxn0gte8AK+6qqrRBRFAgBe\/OIXt6666qrp+iQp46qmi3ImA7mi1LS1jOlmJzs6OihJEvi+n\/JiEkmSwFoL3\/dTB0ae8nMncHK005xYqTl4ZFOYQCggaQEiUKDUhWWqt+VMuZW3yTsdeNnJO\/LzyC47CM6E1FzfDgSBdSpdoioDLdn3owPe9c3m3BJ+AoMXM93\/7889YvjSr7+ibMPTaq2BQ4QXyxa14FMMzwdIM3wAJlGuUYAAsElH5BgwTurZTcWlaaFKR9xMIXmwaHO0llyDkfQQNUPIss+J7Bqol+b9Sux7zPcWHvTSa+mEmZVj191zy9EPP7zlPZVKtbLJWKtTFQXLBlYzMVtiO0QMj1n4qLdiJjZotUr4yU9+Aikl+b4vms1msmnTpm8BWDUd\/LbnF7Fd5Pr495g+AgnDUGQtFkop6NToQAjhrPRmaITaAaWLqUGMmWnwnJceCxP6AMOTANLwkHcw\/KPtdP\/eNi8HSEhQ0Hnj\/ie99Pf45A1zK\/kJut37\/XcvePCsp5+yJNr8iaA5uFd9cFR19QWIjIVRjs4ymSN8Gn25DJELt2DbTRwFjCLrTIXIGSy5e18ib8tvxRqyVMZYaLjctWg0KvX8Kart\/Z+LX7Lib86UeXbaZcN1vVdkvZfHIXcnFvBLAQxb2KzRlGW7jSltAi0FAcIwhOd5YGbU63WUSqWwVqv9NgWxaTmx2URiM21jY2NTruJ77rkHjUYDXV1dKahFeb+YG0Cf2Z+7wMHt5OzkD\/+ze3T9miN7wcJoQBI5txkh8nlXBzQTcttMNpimqlpmqhR2HEgJLublbtYsi9s5tbBiCMTWw4jxrir9HnPNrU\/I6GulHPjO1cfUb\/\/TJzrNwAuS5oayBNCxGLBhBN9KwCgAAax0btqu+StJ\/17BpI4dggEimw9ogwUMGFJ6EMJAKAXTbLoOfQYMMSgglGs9GGkm0F3zbr0rrn5WznvKlUe894dD+NDV2\/VMj2WZx0wDlaCEajXA2NgoPM+DAMGSBwgGkYFgCwVXv2LLaLVa6OjogO+75lXP83hoaMhOt+gnAthsIrGpCJ1arTblC3zf50xfv+jqnUlUT0bsTwai6d\/uHIhtWX\/rPrI18pTAV2QYgOZc9L8YjU05\/8hTuBbZovT07J4I2b8NKQwlNCy7Fl+LfzuL0d8\/t6qfKOB1\/6pS8\/ornjT0+f9+g9183+t69fASxSNCeW4iKHtukrHuHkudcxluWDu7Rcma8WKc2Yh2+iMlJKxOEGmNEhEMCfhBGQyCFgpjNhiph3Kd6t7\/Uu6Y\/4OnnPH0+3dwWoQhFaQXUJIYSA5R9hTYJrCpIaVJ15gAQ6XP7MQYlEolWGsxNjYGKSWUUujr6+MZspocXLZn7W37OzHt5+y33368Zs0aRFEEz\/PSeUlGVhmdLS5lkdhOtVjY+tZDOihZAm0gWKYyI7aATZTyVyIXO5z05GVkV0G9FQXXozbJb8cdgEA6g1kg\/YxQsF0Lb1t4wvPXzfWGPXF4r4FvrFhy\/1ff\/YEeNE9TY0P79JQVabIYabXQ21NGEreQxIDK6QoLhoVgCWHSMW2RPjstO15XADb1gRjn7WABYQAvzQzIryAUZYRWoiV77qju\/5RP+bLnj0vecr67B99\/1Q4fm4kjKBgI1ojqdfTUOhAb1y1rYVKfc5cC25RjTmwCPyiPCxyazSbHcWxnArEkSXYKwBy3NX1ZLiPxhRDwPA\/GJIjjOIvSoPXs8N5aC2vtzs1OBjx2sMeRjFshar4ASevmy8REm7\/xpViaulks7RObvFN\/pr8nIlhV0rra+2fsc9Tw3PJ+vINXv\/jr2bcetOXck5\/njzz09qVm0+G+biiUBdAag6pV0F0rI2wlIEiUqh5sPUyJVycqY8lCgkE21fGaJOFy6sO2XQ3XbhVIeKgbD03V0Yqo867ywr1\/Xl34pIs63\/Cle7uIGG\/92k4fo7Uhs9EolQIkJkEYxymosnN7I5vatQlko9B+4CNJEhhj8i74jo4OGGOmRZ9Mz2smTmymLSPqp9pGR0fzzzHGoNib5lJMmsW1z6uhO1edNM3RIwPTggCBDUCioBk+XeqH6cFomxJuUb0CbS4va5AVyLhXAqRfj2XnL2n5S+Ykdx7PAHbjBd7Wcy5+8X7NDZ\/UGx4+zOqG8jurAAyQJI7KiDVACj586KQF2BA53UIMQxYGBoCEzKRUcx7ESTEbUgAJEAQkp4KBErCihFBUMCY6H6rsd8wXyr37\/bzrtM89QESM07+86w7UuAilpS00lVDyFWySQEBDwaSubxKaFGLyXDtH1IRHLqohopzkn4lrIrfNihOb7vfGmGmJ\/TzgsDZtdjVpawWPGwCfZTq545EYX\/nlYMPlnz24EwwvCBA3W65cLQnTCMmO67uYiitzTu2pImY6ZJY9DVEoAlhqS167l3pIZOneAxYd8MddpMYytz3awOsX5\/Tc95dfHffgRee8s9vUn6+ikVpvkGraRw13i8hU28oYCCEBoeCpMkAJ2CbuWZimlEQAZ6NyEyrjmTwzswULCU0eNPnQqtwIVe1227Xs\/2rLnvSdzjcsvs9xXrvedKZardLwyBYoEpAqQCuJIZndvpGFTCdcnKeSOwRJEkIwoihKLdBEBhDTLvg4jnO9+9kqSEwegEwPllk66XleHrllPNxs2idmAtFZg1jcfOhgYc0CRT4QR\/BLPgCCYQ2wSSXDJiPz21IeTJMAaaZbxDY1D7FgKBA8GGFBMFDQLqcOpGvjGTOQvkRLA7Zj0XX0rm8mc8v98cd7rfvcaw586P9+cE5XMnhiicN5ijU86bnIJHXHytyFMmNtZgZbCwjhKo7klnuSMLwSEMeA5znDZXYsMdhKJ7mTaAgYp15BEg2UbV11b7TzDz6nsv+xV3T3Pn89nXSSxunbdxyHHXaY19\/fb1asWGFmDMQM4HsepBQwJoRIZXyc85GAyaRx2EAhSidinO1Zu2XBuW6LGUIx3\/fTFDRtNBlXBZyeximmeMbwtNVJIQQlSYIgCFJAc9I8rVYLpVJpXOPsZJ8lhMiB0Fq74yD24C3XHlOOmlXDBooNONYwwgNL4S78lCmiwLStHdy2QnIRGdI5kEI3oXGGnTZ2DYnKA6BKCDXxSEK3zi35xxmA\/eX8Rfd8\/Ph\/6om2vlW1tiwpixiKTT56JortQlz8pwXbGCzVeO0AElDCAJYgDMMSI9bO3s9J5wj4gQ9NEbRlSK\/Goeq6uxnM\/76ed+D39nrfjx52HMx\/bNdxPOc5z1Gnnnqqz8ynfuhDHzry+OOP\/+R1113Xmj46MlBKIopaACxKpRIy8t2mUY9b7AYibTJnJkQ6gkmrlMYYtFotdHZ2Trt\/rVaLMsK8GOlsb8QzU9q611574aabbkKj0cjT3Iy\/cxr700djGYDtzBiSYl4p\/\/ruT+zfaa2vkxhKiVSDwiLz+2jPO247I5n1gVHqXsQTozamcZZtBIDZgGCd45EkeIqRZPerUoAUSKw3LKsdd84t+8cHaT\/0zQ0d+v5bjx+56DNnLI5HT5ZCK6MjSOU5LpQTRy9kTYlWpHpeFkYgN+kQHI+bHrExIBwr7saIpI+STQChwMbAej6GW4a51JfEpb51zdLCy3oPOPr7iw9afgcd+64EZ\/x4u47ltNNOk89\/\/vODyy+\/\/KCHHlrztjAMT6\/Vag+NjIz8x0yktDExwtBFKGEYIkmSQoFrcnUXazmPWLJ1JaWcMZ3MpHEmtlhMN3w9WZoZx8m0nNjGjRthrc0VLLLO\/ewYJ7ZZjJPpYs6LAkop+L6\/gy0Wt4SlirUH+FJK119nAUGpUYAdZ\/KRqVBMnstOPmhKKV3PbNPAzaYUhgWTAWsGedkFA6w1iJIEXOm6Ye\/9l98F\/GoOBR7LALbqwtLDn\/3pm8P7bnpnVzJ8RFU0pfKBsAnUaj44su2nW2odZolcSkkEI13VkVIldMEYF6VR2lkfRxYkBJRiGKughI8IEmPWZ+qb\/2vVt++lfYuP\/TGt6B8D\/m+7j+O0006Thx12GA0PD7zi\/PO\/8l5jzDONMZ7jgfS6Wq2mZh7KFqZarXIGMpOnTxMHpUUeDVlrYYxBtVrFdOYdBaBrCzRsK3szKYDlrk0pl5amhlOC2G233WaSJBmXOmqtczHG4jEW+0yzz\/F9H9ZatFotWGvtDlUnR2+4OVBh2OWRduMWxlV7GOzKphOn29MnA2iKCgNPV6l0dqNgC5vKmbBJqbNsZpIUEnjW7130d+BZg8BX5pDgMch5bf3u22pj995\/9MZfnvc2rm88ZWlH0D02EMMqAWssSj6g6zHcvS4A8tz4ogCsIOcHKFLPRGgwmXYExsWAhQDpwwsUrFAIjQQLaY0MxkJVu224suDnwfwDf7DX+77z8I485d\/5znd6f\/nLX6rr1q07ZsOG9f8wNDT0UiFontaabHsumIwxs8iHDKIoQqPRQK1WQxiGkyiv5s2VKRi5aMrNITreKAxDBEEgpuffTDrLqCe870QQK35uG8hcQOEMMffdd9\/p0kEWQqSASQiCAM1mE61Wa1atWEWXJCnljlUnB+5\/sKNmeSmMzs1ZIAHSLjRK3SPHPSHGtUoUniDbRmIiTzkt0mFbawCSLpUkdhLBnD09PBB5AFUSVe65nWZBls5tjz4A23zem08Yu\/P6D3fT2Mk1GVcSXUdja4JaNYC0GvWRGJ0lQEmMqyJaIpAVINhch044hj4l+7nNs6ZflhmWNYxfRkgltLzyUHXe0v+p9C79cTB\/yR96VnyxBVwDnPHd7Y68nvOc55S\/9NWvvk6wfmMUtZ5hjJHZ6I9r5NRQSiCKItFqtWbsJSiVSmJ4eJgyAcGME5ucN8rkoXXOTRlj0oZSQ1rr3B1uCnCgMAxz044prtWU\/y6ADzcaDTsdiBVFELPUMNMTm6lFK2uUTQGQzz77bMJ2zlCqLk9WfYiFqvh3JMa1Pwh2N1gRVWn8HG1BsbWtD5afEEx8sSlwH+6VrqTsDEVjXyZWlu+Zg4THFng1f3zG4sFPPPODtPnB13RGQ\/t1VQTCeh2lskQ5CBA2Q\/hegAAAeWXYRgtcAqywACUQRJAsIE1KvmaGMUww8JEaZQPCgmzi7itJaBowVGmw6ff9Pund72uLDnnWX+jlH6vvyHH09\/eLarVavvLqq5\/zvR\/+5C1GJycbazqstXkFLggCjI2NpS0PBM\/zSMzcEEWNRkMxM1lrMTQ0hHK5PA3ZngUENrVCo5xDU0oxM087O0lEIgOSySKh4lqeAFo5aGaGth\/72Md4KgdwIYSIoghBEAAAMuCUUuYAXfzMiYFOCsrZ39nVq1dvdzSmRJz4SX2sq1JTIMSOSEx5CgqkqwtPgqTb5eg9rmvXtp+kaQQrhERZEjQkEisgvIpJKvPXzUHDY4X36i81vvHmVw\/c8qc31lpbX9iLCLLMsM0GqoGrPJMXQbEFxzFKNR\/cbEEEKVfKbqaxTWxnUTs51p4JEgRLEloIGBLQgpBAICI1psu1Pyw4+OgvdvYe9nun\/PuLHQAviKuvXha06oPHXPLjH7zJEL2RLZWUIOi0bSBb8M1mM9fPAgTCMBRBEHgzLjalJACq1+vo6enJie\/popWik1DWuuB5HgdBoKcD4gceeIC01nn\/1kxkftFOLdunlIubNiraa6+9xE033ZTrhyVJgkxfbCIHNlnzbWYs4vs+arWa2bJly\/aDmInjoNP3gyRpwvdE7nbMlkBmvJuRKJ5smx5fGvYTF6WrOdXabj9U7ARCNneREgRY6yIxIVyHr\/Qai\/evbJyDh0c5eN1zZXD\/hV967dqfXfYW0Ro6pmbGaiWVQJgIaKbtEkl6i0QGPgEgA7YG7LsiDywgrWtitZJhhIWU6VwjGNyyoI4qAIKNNYRfQ0SlcNSr3VpefNAVptb7Py30PRy88\/MDO8J59ff3iyAIur73nW8+z1jzjv+5\/PKjAk\/1CmhJSiFKbJ6SGWPyxdjmciR83xdJkswUibExhuM4jqSUql6vQ0rJ1lqeAC6cktvjyPysnyptdG2+733vi9\/3vvdNGhGfffbZIKLIWttKoyFOte+5CFiZ4kQasXF2bEopm6V5Sqlpp2UajQa01i3P81hrnaeQhSiQC59L6Vf+957n5YWORqMRH3TQQdtfnawp0aUAkdjsQwnkHEBhjZmNHNC00RgzgSeq6FCRvyRAOL+\/DAgN0Sj+0jfX5PooTh3jb7\/3yWu++LHT+6h1hheOllm3IDiB5MQ9odrdN6ljaVvlpNhuAwDWGDATrJAwxiKMGBUBUAmg3k5EYzGsXwI659kRE9xE8\/b54dKnn\/hDev4nNuU79a7\/2t7DoP7+\/sDa5AXf+tZ\/vwngl9Y6auVGfQy+VDAJpzLL0wcG5XIZW7ZsoY6ODjnTB2qt\/7xo0aIPDw8PB11dXdxoNHQQBMZmq709aEhFgl5KyaVSKa84ep6XeJ537RRpJDMz3vjGN36jUqn8r+d5sNYaIYSZLKrKQDSVlGYiskIIDcBKKfHUpz71nmOOOWbKqO+II464dmho6AOtVssQkc1AKduX9NgyEJPMLLJGXSKyRGQajQaq1Sre+c533njmmWduNw9OI\/\/8vNNrD\/7tIos6hNeuFLCxIGKQmGipRhNPWjsUKxSN2vLUEkwWWrrOf2UnXiaVZpsahgQSG6Detd9VC85b\/dI55YpHGXjdeIG39TdXPSN84LYPdOjWM6vCdBsdKrBx4zM2geDY3S2psGDCEiwEPMuplr0dLxOsJGxiEFL68JQCwhp4bEG+h1GrdOR1PmSqC34eLFj+E7nooLu6vKNHd6Tow8y0YsUKsWbNmn2jseFX+WX\/H3wv2G\/z5s217t4+2jowhKBUgxUSiTWoBCWYuDlOtXgcL0yUDTjfR0Qvveuuu+6aJXhSf38\/j2PwCyuiv7+fJokYufj7\/v7p5YCyYwWAww47jIt\/P5vP2KbCMEM0u3r1arrkkkvsDK+jaX7H2EFRRNr47uPe0bNx9Tc9FYN8zqUzCBZSpjks2SlBLP9ZemNmLRluOh+AEbDCwigLJsDPcDmtrVibcg1IYImQWA+jXcu\/vejLq98xBxuPItL+ok8suucvV727d3TD6fMpPKBkorTik+nFOaszV+W2sAJgRQBlZrNZi0TBQIaAUBtAAeRJaAtYFmDpw5LiSFUejLoXrNz78OMuwesW37Szru+nnHLKfnEcvuTBBx74xzBsHtnd3e03RuuodNQQRQliY+EFVYRaQ0gPbDU8TraRXufCPZ7y5muI6KV33333XHP2I7ApItuRDcaSyazd05jfplVFFiBqO3M70Jl4UfNb04EXtz3iBQM6G\/oeh+\/pQDhnf+vmLAlmPff3C+rvn1NzfYTBC9d8e9\/b3nfcB+3olhWLKjRf2VgY3QI8A24akJ8BkgSDYDwFZgMBBmmGFJx24tt2rMFwqSMpeJ0K2sTgJIKAhKHyQOR3\/7bVveiisHvh9Qft\/cYhWrHC4PXbv\/\/9\/f2it7fX+8lPLn7e0FD91XfcdedrfK9UNiy9UqUbkZUodfSiFUVgllBSQesYJeUjDFsgcrpkBEza88TM8DwfY2Nj6O7unssaHikQK5W9qlQCVhsQGEJIkHQAZo0bC5qu+jiV1ZMz\/ygmmO16QDYrziAYptznT5ArHgghRnHooTR3eR5BAFvVr9Z99k2nRvfe8P7FZvRET1lULBAmDZQDIGwYlHo8oJXkV5XJSaoKKSG0I8FdX6ArAHHaI22EgBEKRvhoxQwja1CVecOJqFw1TMFKFSxctf+nfjPq6IQrdgh8V6xYIbZu3XrcX2\/8y4otm7e+TnnBgkqpjNHRUZQrNRhjEDUTWMPo6OiA8iQGBwdR9j1wEkKyRsn3kGidP4wn6+dKu9U5juM5EHukQEzbsNP5rjCIGWxNZr09obcrK0OO94fMrxyP58YKuWYWmo2\/0SzAqTyPYXbiwgx4grRUYjNOO20uCnuEwAv3bH7a2h\/+9APVePS0xdQkShoQwqI5HKLW7SNpxpAS0E0nhUN5Q6VxhsfWDdwyuVnaTOHEsnPftlLBOqmlyKiOu+S8ZT\/1Dzzigp7Xn7d5IREDtwLnbv8zrL+\/XwwMDPQ978QTj9q4cfPrr21c+7qu7t5A+RVK4hBJHKKvq4YoigAiVHwJkIdGcwwEgY5KFVJY1EeH0dfVkXedpyJR0z7EUzXT7W7UnNt2AYg1hkarpSSC56dWMQmDtQaEK79a8Iy9YFP+npCDoeS2TRsXnGgEbCrRk+WilABqaI7U3\/Op47ov\/eOTV3\/\/x+\/o0iMvnaejfcoUE0zk5GuSBJUygFYML3D0lxWAIYKAM5aBTTkySuPtVHOOIZBwAKPKiKVvEy8Y1qr0q6ZXvfzAE57zN\/ScsoZOOknjDV\/aoX0\/7bTT5IIFC5ZdccWVp46ODr0KwKFCiPnlSo1acYJSyXXZB0GAkZER+J6zFvNKZVirESgvM4qFNQZl30PUbKXCoDMbXRhjEATB3P36SIGYT7IzkApADCQp5y6dCwxhkrEEzqoyKY8lMC4iIxR\/wPmziUzaEiZSCsU6B2XiCNYCwgO0IahqtQUpR+YuzZ4Cr34RXbhp33UfPPJlGFn3iWUcL\/A5hrBZP7JxbfJSprhkYHSb25IZj6k8tMZilAPpyHwmCCWhWw3IUhkRvHhrJO+meYt\/vf9Rz\/oS\/eOXH2oP+35hh6Kuiy66yDv33HOP+MEPfvD8X\/ziF2eWy+X5QRAgiiLXA0VOgMAkzkYs0RYqKMECkL6CNtkMQOrolQ0rC4n8ENlp8mcaXE4ir6jNZWGM4WwcaRYbFR76c8C3gw\/cQtDE9PCbDvnp\/NE1r5IydoQrAVCpLnfav7XNVShEXRNbMCb+3qQ9QyJ9b9vOSkFuasSJIQrAkADJ6ubBzv1OXfSlW\/48d7l2742w9rsfW4x7bnqLt+WeFXJ4\/fIq6XJZpJ6yRFC+B6sTCC8twBBSjSh210+kbIFSaDY0Kn1daI7WUa50IrZAPdQxar0PU6Xn8i0Jft+17MDbFx\/4jAdpxYdaO7rfz3nOc9TWrVsXL1u27MVbt259YZIkx4RhuMj3\/YCI0Gg0ctOKKIpyiZipoqhZnKdx8jHFv2PmrHfrnlKp9JLbb7\/9vumA6W1ve9uBQRCcNDIy4nV1dWFkZIS01hQEAYQQpLVmrTX7vs9SSmZmttby2NgYarUapJQYHR2lrq6uXIcs7cVCEASw1qLZbCIIAnieh3q9TpVKBdmweuaApJRirXV+UrTWbK1FrVbDyMgIOjo6kCQJ4jimSqUCZqZ0dpOy+U0pJcbGxhAEAdJ9JiEEtVotJiL2fZ+zEa0wDKlarVIYhsTMlI1tBUGAUqmEgYEBdHZ2QgiBbIQpOz6RuvdmmZm1lpVSPDY2hsHBQTrqqKP+qliQ3MnF0Oa+JvyM0lTDSU47K6rxs+PO25JTcCPPhxFSy1rH3OD37gSwq79f3fzFfzw5uuMvH622th5XiZqokIBCCUgY0hhYKcFKIKIYCk49IVAeJAhC+ICOAe0edGyASq2GOLagrnkYNKYee+pWu3D5L7qPfumFtRX96fTF3wH8dKf2fePGjUcCWHnLLbfsX6lU8vEYY0zufTgRuCajO3bWdboAAGBmbjQaM96zN9xwwwnDw8PneZ5XiaIIWmt0dHQg+3emAZY2nkIIkRt9pKCEWq0GrTWiKMpFEjPFiqyrn4hygcJMpjp7\/2yflVK5eGGmGmutzX8OIB8jApCf00xNozgfWfxbz\/MQx3GWYsNam+9T9nee5+WjVNnPgfYcpdY6V6bN\/p+dm+yzjDGI4xgDAwNfVAQSnLY6ZDNrggGdyepsB5hNfqPQ+PfIVQsc3yCEhbHsjBwsIwHZRMzxYbsn+lql8Ms\/Lr\/zyq\/+q9ry0AsXeabXRwQlLUTixr9gCBC+G1lkZwIvPEBkMseJBWwCGAakgoaAFgGaJtB1oYbLnXutUgsWfGfxc190K264dQut6N+lkxdCiK6xsbHezPknU5PIVESzBZIpKuzsNp0efbYPAGy1WtUzpYdBEBilFAshEAQBOjs70Wq14Ps+yuVyPgJUDAKKozxdXV3IIqasgz8bDM9ApFqtjgP0arWKOI7R2dmZp9nlchlxHKNarSKKIpTLZVhrUa\/X4XkegiDIjzsb7M5ANQPK7PymUeQ4IK5UKjnwWGuRPWwA5PtWLpdzUMz2J7t+zJxHYxnIFkUes\/OegZ4ahzB5bSXVOOdtac1tnOHSqiVRquw68aZz9t4OEIXNeTZi4eRVhASxBgmJVqIhKpJjMwdiuxS8+vvFuuqaw299+\/tf3RMNvW5RMrrc1zFVWCI2FgkRrHATFVIxZMr7sDboqFWBpIU4YsBLIBUAz1WcI2iEsjo45tdujasLfzP\/iOP\/WFu+4k900kka+OVuOZaOjg4uamsNDw\/nC6kYIWSvyQQFJ1NQ2BWb53loNBqmq6trxhQ5S8\/CMMzdgEqlEtI0KV+0xVnNUqmUy\/F4noexsTGko0TjbNyYObd2y4AwGx73fT83GgGQ\/yz7vGwQPQPJrFiR7Ve2L1mUmwFaekyZKmsuwaOUGje4njkhZdcm+302oB7HcQ7CQgiEYYgwDPNzk81hFo8526c4joXSIGspjcTY5oYMu24FZTAoXDuRTDu3s5\/r1OyUXWTmeR57pblKzy7ivQSu\/NqCm3\/67dN7o5EzD5TJQtnYqnxhAE8CjQb8UgkgAeP7SNgiYQNtNRTcAyccaTjXnZIH7QcwRBwyNbmrugG13ms3x\/ii37fPpv3wtM30zn4LfH23HtPo6Ki01qo4jhEEASqVSp4iFYw0ZtSG31VbGIbo7u7WfX19rVkAHo2MjFCqzJoDSjaInRUHMsDIIpwsosnMN4qAUgSygvLEuEgx+9k4LjvteSuVSoiiKH\/PiUKN441x2w+GDDh930+t2jiP0tL5znFgWiqVckDTWufHnUVsmUKHUipPmYs6\/UUljGz\/UgkfUkwc8TaRmEspCalnVjGySol+pqnAasKIhrDtNjHKRBbTbop0WkpKidhaEAkkSUSJjeYaXXcWwC74WNcdbzz2tC6z6Y1Lo5GndftBiZst+L4E4hh2NIHwAYQhIAhC+YAgaFgQLDwwlAKELCFkD0mpUw9ZeVcz6PhT0tV37YFPe+4fglcf+mAPrTDAagBX7pHj6uvrUxs3blS1Wg1xHOeLPONjMq4kAwVTkJLapQ\/ndEujj+YJJ5wQ\/frXv54pFaYgCPIIrKi3lS3SLN0qckdZ9FOMrjKgzuSgMwDLfpa9j1IqU4LNgcPzvDyNzYAjS0uzlK4YGWYqGkqpPGrKHhyZ5E4GLkVd\/+L3RTWOIuBmf5uloVmEWtzXieKKRY20IAhYEanIErlSE9OkQDQrYr8IhBN+n7a05sKcTmM\/ZfiNBpQjioNSCYm2gUqsPwdDOwheV36584Hr\/vdJa357yVl789iJIh6olH0C4hBhlMAZGliIEjJjQ4BlWilWICGhbYI6a2jraQ7mbx4x6u6+ZQddvOzJR1+Op55cp\/1OCoFrHpGK6mGHHdYRBIGfpU5KqXGEeBZdZFHSVHpau2ojIkRR1DzrrLNMf3\/\/tC9ttVoiaw8ouvxkUU32fcZRZWCcvTaTfi6S6llaVlRXzdLqIAjySCeLULPPyYj\/LLLKQC9L77JIz\/fdWFWWzhYBq6inn0VX2WsyoMneK9Nfy6KpYiGjbbTbvoZFPbJihJ1FgwXw04qJGjqxYJ9BSoESkypYEEhJsJlI2Kf81pQRWXtMiQTDFuy3xr\/Wtu3bwhjlDh+x67sJAs8rzcHRdi7wlSvl2r\/\/5Kj7Lj7\/I91J\/VmdSBZL3YQo+dBxCySAUo1gWgmkBBDUkDQaEJ4PFil5qtL+rlrf0IDGn1rl3j9EPftcd\/Rxp\/6NXv62OnA1gHMesWM8++yzyRjT4e5nkT+ls8gju7Gz6Gt3A1i2wMrl8thsXu55HjUaDZTL5Tw6UUqNW5RZhFPknTKgK4ocZiBT5P2KoJilW0X+qJhSZkBTrIZmwFRM3+I4ztPc4mdlUVVxX4oRY\/H9J+5L9vpiAJS9rrjv2X4W\/25i8WPx4sVG1WpdY2rIgzYxPLiUjoQEWwvWBiAxO\/XWya7aeGyb5NmUSloIQDdjWAl4paA0NDjQNQdLs49ONn\/7gwse+M0XPlYeXPuOJRRXRTRKMBGo7EM3YqiuCnTYBBtAeoQkYsThGEqdNbSkRNMyB7XORpP9Oyvz9v5ff+Gi8\/c\/\/mlbcfyZERFZ4PJHxbGuXr2apJS9zWYzT512xq9wV2z1eh2dnZ2bZ\/PaLO1tNBoIgiCPlHb3Nhsn7l0B6DPtw2x+tr1bkiSsSIkGkXTihZay0R83qGtTTz9M5k0nxnFkdir3o5n2UwhAGyhfQHk+wjhUFaW6dsS66YkIYM1z\/+FFdNetH6kNbnxmNxLPhMOQgQDKErAxVMlPDQwUtCWYKEGpqwZPKmwZGUWzUm3FXfN\/Nuz3\/VwtXv7noz5x8VoHXD8G8KFH1fGedtpp+POf\/1z1PC\/3NdzZhTDT38+0ONN2gq2zXXBCCM5I7z257S4g29733BX7UXyPdevWQdXHmiNCJ6gIAZIEZgs2BmCGFNumgTNZME2kxybubgZ2ebnAmNQmjgBroKNE+oz52AHXkyfKtvH7H65uuem2p65+w8GndYWjb+wyUUdNAOQLwCpnVSUIWgOqotBsJWDyoSo1RAHCDc14jerovCdeuPT35b32+eU+Z735PqIVBrgB+NcfPmqPe8WKFfaQQw7py4xnHw1bys2tnY1Lj7XWZn1RzWZzhzOcRxOQzaZtZVc8aCbr0Uv\/z0pr3TBMYOGiMNauZJj2+qf817ZpYdG5eGJE1pbicfZbLnN0YyuZppghAed7aoESgWODmAzKpRK2tMa6OuYSykkjL1z4L\/Pu+8Wln5of1k+tiWRxOeUWojgEtIXnC7RihkwYVgGtVpPHQnDHgvlmSJb\/ulF2fMM\/7Ek3Hvr8V66hE1a0gNVA\/5WPlePHkUceubTYIT65Ae2e24wxqFQqW2bzWt\/3udFojCPOd0VU8kj+\/Y68z46A6VTvr5RiVS53DiqlwDZCJlMpMkUCw6nu144fLGXDkty2gcuBEABJpzpHHkCGYZmhhJo\/J4g4HrxW979pr9vedOzp88c2nb6PaR6mKAZMgmY9QqlWQalcRiOKYaQPU62gKRFbpe4b0\/J2dNeujectuWqfY5973+IV\/THwN+Dff\/SYOwdnn302JUmyT9ZKsadTssm2UqmUENGGs846i2eoTsJay77vc9ZHtSPp2KMtGtvZdHxnt1arZZUK1FYpJcMKGj8HyYURodRaK\/\/d5Du7jf5+riIuXFTWLlQCqRSi1dqV90suEgyTGBp27zlOLD1XXz4j2PL\/nndq9e57z5xnk6fVTCRhGoBnEBsNrwa0kiZEYjlBSbeSypict\/imzSTOb5SCu\/Z96tMfXPjGzzXdubzmMX0u+vv76aijjlo0NDQ0ri9qT3I6E7c4jocrlcqW2dyrWYUua0MotkY8VoFsqjRvT22+70NRwg3BZIUiJwmVMNhyhl3I9XlncSBckKTOIq780pLIPI1TsyMNAQHhBwBZxDoBSaBWq2GgFe2DSy4RcGzZExO8Vq1Sqy499+R7b7jyTQtag6\/q1dZDswUoBVgL7SvE1QCRlGNhSd2boPa3UNRuU\/P2+Z8Dn\/WWBxbmRhp\/AN70+cf8+SAifv7zn7903bp1XZmKQtZe8UhuQRDcc8ghh4zccccdM75WSol6vY5yuYwoivbYVMGe4sfG00y0R\/ZbCAElSSQcmogrXIkpgacUODEgIcDWqXOC29wXcs0lmoC+jqrPZiNtBmyCiuFXLlGsrBNDtCwASVACEJ5As9VCtTtYiKHbAwDNJ2LquP7sdywduPRTH13+4B2v7ZSNBTUyiJstBCqAJcVjwmu1qDwSVrqv1T0LvjagSvc\/7bkv24AXnxETEeMrVz0uz40x5nBm9n3fR6PR2KYP7BEgytlau\/rUU08dveyyy2Z1bbPG0IkANtW+787jKfaDTQY+RbCYaj+mIvZ3pOVi4ue57yeySln9pG2OpJSsxKVSuR7aesVawJfsrLNIwhqNqYR6Jjr7Fn7R\/iw4G3ae8MApfiuUgrEJYABOLFgzdNjyNsXrFgK4\/wkFYCu\/UL759ONevjAZ+kDQGHh6n08UaYtRyzClTtSDWr0u1P\/27HXITxO\/4\/p9zjlsTe4A9PlfA3j\/4\/r89PX1Hfrggw\/KrFN\/4lP5EUjNzHHHHXf3lVdemewMkDwOHry7DWRnalCw1rLaXG+M9cVmQ+CJhZ5I5XatdZGRaL\/F9Aa52\/5OFOSoybrOfSqml+n\/rdbQVsNLBfYCX6HiS2WNWPpEATFedWHpoZ+t3P++H33lzYvi0XdUobt9aXmwEY+IzsVDmxKsVQuWXDNa6\/zlUa8+9U561nuHAAD\/eckTBuCPOeaYyurVqw8plUqiXq+jq6sLrVbrEU3JAITHH3\/8+ve+9712V4LRYwnY9nQ6P\/HzhBCk5i3pGRvdYB6ulLyjPNZIEuNkpLORAebJu+1nEb5nQMbZvzMZnkJUyMyQRBAKgGWwTmCilpfUtzwJwB8f74tzzXlvX3jtVz75kb19nF5Da2EiiQaFv9bI4Ge0cME1Gwf5ryec+fL1dFK\/m0U571dPSI6wo6Ojc3BwcB\/P86hcLo8bj9nd3NE06VLj2muvvfef\/umfeFeA1aMBvPZ0Sr6zPF2z2YTqPPn41vDqGzazjRjGkkkAr8MHQu2aXgtPOneA6TxXXq2cePDF15sUvNpAlgVhrtuCIKSCGxF3Ta9sASRNFQ5vOphXrpQ74vT8GEkde2\/77RXHm+uuPWMf3zskhnm43tF7Ze2Aw3+r5u1\/w74nHv0QHb4iBgD87GbMbeiOomhxpVLJ5\/32xGKbalGlnx2uXbt24+Py\/nxk0\/RZ7R8z44ADDmCF40ej8PzKQ7o1ZH0rpLUmFVl33BjP4s2m69plmxqEoG3dVTQQcc2KbaNe3wdqgSea0dixzeieBQAefrzdIKv6P9h9yzXXfkFFWJrIzisPfN5JZwPmNnrbZ+vA7XNwNfl91tPR0bFUCIFNmzahWq2iUqnM2Lm\/s31MRdmX4vB0+u\/h008\/feM111yzS4FjT4LGzqaDu3qfp4rGpsIZay0EUb+1XX33WysjkAfPA5I483qZroLghBSJXRo45U65PwJzOpWec2IES26AV5JwzRQGgAVIh6D64KEb7r9x38fdYvz736uhVk+Rez3la7Wnn7biSRdfdx697ZzrHIDNbVNta9euXSyE6IiiCIsXL0a5XEar1dojnz1NJe2+d77znXr73mrm1Z5FGY9U+8iORGGP1L56nscKALr23vfeaMNdUc1wxSv7SOI4H8x2A5Q7ePE5lUAcl3K200ogE1bz3GvSSqgHi5rUfTYcOxjAdY+nxUhHHtkA8Lv8B+997xxCzbxA6NBDD93HWiszR6NM4nh3b5MVDrIFa63d4Tx\/sqjikUrbdhSAJuMJt\/cYdrZfzVontIrFCw+4UZQ6BuD5iFoxpCRASlgLEHNuipp33I\/7UOEUMIwFGzt5A2LWdcGuUsnW+fll+kAmSVJ\/e4d5MBEqpAWagyfNLeG57eyzz6aenp7nZGJ8RfOMqRbGbEn\/2by2qDefNdn6vp8YY27enqmSiSqzxc+e2J811df2ckaz+doRLmqqv9vezxjv4cmTAmOGKcXUNTtfnue5wUZ6S39oS8H6RBuQkjCGoVsxhKQZD2ZmlC645ZJNu\/WLNxFDFu8DAixbIGlAtkaO4iu\/HMwt4yf2tnr16qDVah2aifTVarVcq317ObDt3TILs6L8j+\/7qNfrDy9btmzN9ryXlJKJiFMvyB3T6JulV+buiNYeDbOqEyPXMAzDPFYehfhTKAhSpfKyBoBQTmMMAkQy58DGqVpMwpFNfM22ewLknbhsxhNo2XVNQsjWyP43\/mrlCmae09x\/AqeSt9xyy6uiKFqaRUNZf9juVm4F2m4+YRjmjkFaa65Wq3947Wtfu3Z73iuKIs7MODIZ6B0Biqletz0R0qMBvGb7vjN4hrZBbIzpQVsqcwKAIOH7CrA8qdjhdDuxzdiCpTx1dN8j19pnzsJE056SFE68RzIj0I1KR2v4RFx3yZxc9RN0O+mkk6rGmBOazWaQueZkFcOJMjy7g1PKZJer1SqCIMiksE2r1br9d7\/73XZVFrKZzyRJcvefnSHxtzdl293R2mwBa+L+TvXvma4tEaGzszPKQax7731vjqTcoo1DGEvb6mKPSw8LHNn4DxKTfG3Lj2VRV04pkABYQoPAKflfZkN9HB6Hh\/++YG45PzG3gw46qJeInkpEIo7jccarE3mt3bFlahOjo6MYGxvLeNwGEf15e9\/L9\/2MT8sNP3aWg5oNJzUdeOzs186mpJMB2GzeO73m3Gg06jnC7HXsMetjIe5kkgATjGZI6Y1jsCbu\/OxvnFQQsdAflmNXfgNKMAjGtscvFcegkc0HrL\/uj0vmUsonbDq50Pf9AzIvwowX2x7yfmc2rTVKpRJ830elUskctZvMfO\/KlSu3S\/MuiiJpjKGMrC4a3e6KNHK20dijhduaaZ9m+hkRcZIko+0w6VRsZCn\/wqkUqxBumHGi28hEAJvphDBNGOGcGL1N+HvLDsiQppQ9HpdodOiZc8v5CbnR1Vdf\/cowDHsym7EgCHI36MmI\/d2RTmagGUURtmzZAinlzccee+y67dW7s9ZKd8vzNtHkjnJiM66\/HeDPdgWXtiu4sNlEyZVKpQ1iRP028cs3RcbElg2kL2FNMusn3bSvIwvitD+sQN4LdhL7bNuGIoSiBhkgOEGgw1fgd9+bE6x+4qWSS6rV6iuIiDIgKVqe7Qliv+i0LaXE\/PnzE+\/\/t\/fmcXZUddr4c86p5da9t28v6YRsEAIhBGJENgUZMKDCIOA7oo2gMpMIgjoD+s64oK8zdkZFxoVRUTHhp6CgjgmugLiAiWw6SAyEBLKZPekknU733Ws75\/z+qDrV1Tf33r63uxNC0vX51Cedu1TVrVPnOd\/l+T5fXf9Rs1YYAJimScvlMgk7V49aWns4y2skIDUcaB0JzUZin+c9PT2lIQGrEm95XmqWKxngODaIRgHOQYQElUNJqkGwnoCCVM1EqptAiASRIvhuzFVU0TWNAgQUUviA4NCEgC5pkAAQBOAO4A68duDZJ94x7lIeW5sQ4mzXdafGu0WrrthKX7\/aZKvkX9VzPatN2Pjn49yu0PrbQwhZPRLVYUXPUI1j1TnjjXAppVFXc9UFu9bvGqlR0YxlpdRzS6VS1KhYNbBtNKY33LXX\/z0BDxWgoFQDpVr8Nb9UKrlDQOw1r71gc1mSfaAMZipZFdUrA6rD\/4ih5UZRG5KwRZwUQxm7TACUS0AGmRvoGhgvp\/rWv\/Du7I\/uaBuf2sfGtmDBgoRpmhcQQtJjtbI3ExxXWyqVGtJpu1AovDh58uQR1fPatu1TSiVjLGo35\/t+ROPgnINzHnW\/Vk1rqxFCh4uNxQF+NC6hbdtgjCGZTMK27ej6GGNwHOewWmNVCK+Opmn+0NThLXe5iZbJf3W8IKApIMErgljKIjsIwMJs5XC1lI2uDsHfAPc86FIQvdz3d9l1q6eOT+9jY9u9e3emWCyeQyll1WKyhzruor5fLBajDuOmaYpkMrnpuuuuy47kmO3t7VzTNKmsG0opTNMEYyz6V1WxqML2elZl3EKN\/x3\/Xvxc8c9Wvl\/LUkokElBZYZVddV03av7bjNtabVyaZfTHjScpZZFz7mtDzTrIbTeYz7SYbe\/kfoFRyUHHEE3rWW613hM+YFgCHbqfcviB+QDWjk\/xo3\/bt2\/fjHQ6fW5cpWIksZPR1OapeBilFL7vw\/d9jzH2zM033zwiJdf+\/v6CbdubCSGJ0KojqvsRYyyywFQWVrmwlZc1gjkYJzY1BTSqNR6llJTLZa2jo6NT07T0wMAAkslkVbexWSBr5HdUS4IIIfKnnHKKe1AFLWud8r+l\/j27Ej49IW0a4G51k1G5hyK6L0Nr2Qbdx+YUYYecAwAjgOQuqMjC3bftuu3\/9S8\/P+GT39w9Ps2P3u2qq65Krl69+lZN01pG29pstBaZIqaGxxo466yzntmwYcOIjrVo0aLHhRDrhBA0jI2RsI2bAgxpGAYKhQLS6TQKhULkUsZARQIA51wyNrQukHMuwxgbqXwtmt81vlPr\/bBKQUop6c6dOyfcfffdX2hpablQ3ZN6MbBq87yRbGotjIgfI3SXBz73uc\/ZB4HYtMuue7H\/x7ue4f35433HJpRSEAx184LGuPIgbK+FxtXAqhG2P1G9AHwOxlxQ+8A5uQ3Pvk\/KpV8NOlaPb0fj9tJLL53p+\/6bM5lMFNw+lKUv9RZSXdeVnr90HOdRzvmIF9D3ve99OQC5V+OYLF26lF144YXH33fffUllmbquexDI1gOjkSw2cRe38jNCiAHP85yDvEVy2T8Wcyz5OKguNMpCiWkSKroejKYqRkYlBQ07ggwJvklad4cggCBD\/o7+rzKfEjB0HRkqzU5v7\/X48Uvt41P96Nwuv\/xyUwhxSSqV6qwWOK7kLVZ27GkmiN2Ie6NpGgqFAgqFQj6VSv1s2bJlx+Ti2dXVJXp7e9uSyeRkKSVSqRQ0TRt1LeZIqCCxLffoo486VUNetGPycseHG7b+PsicG83FNB3wYyQw+riALOeQKPXO3fKHB\/9+fLoftZMlY5rmVUIIXdUW1lqZR2uBNWIJOI6DZDIJxtj6hQsXvnisjgshRH7ta197Ded8kqZpKBaLQygWh0pdo4oLGV0PIWT\/lVdeWR3Ejp81abunmxulDBj3Qgj4MtiBwCpTiq3RHllmyiJTXI6DkbSRSvvghcAao4RBOB4sSpDWHNLq931g8\/+7esb4lD+6tu7ubvqlL33pH1zXfa3KmFVmpeL\/jwsWDpfFq7WaDweK4eclY2zDAw88sO9YHptsNvsm13U1RbOobNaiKiniYFNPJ6wREUV1PGX1qfP5vu9rmrb57LPP9quCGLl5iVfWrEe4lpBc0KqoeNB3xnBVjF4nABdBD0xwASI8UJ9Ds7MXavu2\/Yvs7qbjU\/\/o2R544IGZhULho7qum6pGcrQr+XBFz7VeV7tpmhgYGJAAfrty5crysTguUkpy\/\/33dwohLmaMRdUTcSLwSK3k4cZUkZtLpdIQFRBKqc05X0sIkTVBQLROe3JX0d\/vgYZeZcVqJgAiyRBOGKnz8Izsx1D4goAQLeiuJDggAc2zidm\/69qivnPi+NQ\/elZ6KeUFAE5Uq281RvhoJWuGA7nKz4fXUT7\/\/POfAiCPxbEhhEjDME7av39\/p8IBVRhfD8BGk4xR919x0nRdB+cc5XI56MvBWMl13dUBStTYJp1+7p9E27QnHMIONvuEHFq4LWTdWEOjAdeqFp4gQVfdECWJBEwIWF5uem7jnxbv+9bHJ49DwKt\/W7t2bZIQ8h5CSFJNDsWXGk38tTLm2ix7XUrJk8nk908++eRtx+rYLF26lAG4aOLEiUmlgwagZqOWkcYrq42LkiGXUsLzPOi6Dsuy4Lru\/h07dvTUBbH2\/\/u1gfYzzv+RR3UZT28ePPhhRbfEiOJfdVcACVApACkg2KAgLJMMaeZDy+2+dODFJ8eD\/K\/yrauri61bt+7tuq5fnEgkkM\/nQQiBaZp1F7lG9a7qZSGrxc7iXofv+3uuvfbaH3d3d4tjdXy6u7tbs9nsOZ7nacoSopQ21KhltNpkuq5H5U2MsUhNJJPJbFGWcd2YUjGT+aOnJ9bHL4jIGkgrZc3YWLOaSXEQ0wiCPpgE8BAKwAoJIj2kedky+rb92\/7P\/+O0cSh49W6rVq06NZfLfcq2bSOdTsOyLHieB8dxRp0Fr\/fZYYL56u+nf\/nLX645VscmFF2Y0tnZeY5t20RVF9SS1h4tp6\/yOKrYPF58HsqTvzAYdKqzTf+Xb\/Vxzfw6QO2DapfUAyAHIwXNcHMa+4wI9vCGCQlIwoITehIWfLTywtze9c\/+l3z42+PcsVfhdv7551uEkI8YhjEnmUyir68PjuMglUrVTeE3OlmqCRZUZizrTCZf07R7Vq1alT1Wx+eaa66h\/f39\/2dgYGCGKotS6rQqsD9cJrIZ8Kq2KXKtSrQkEgnZ19e3qSEQA4ACtZ5ytOQ2TyYgBYMM+q4F\/yK2SxIE+kM9fSIkKAIdMSkHT9Tov1HMjYgo5kYEBaUMEAzwg\/da4JJ2nrvyL4\/86B\/GIeFVt5Fdu3ZdKYRY6Hme5vs+0ul0zXjLWLD2h5PjqbDC\/jRt2rSnRiK7c7Rsa9asmW4YxnWaplEpZSQlVC6Xh+i5jaVkdeV46boeJVlC19JJJpPbGwax0\/7uwvUH9M4\/ldEKAQtCBowHwiS4VCJjMsAyEbDwqSSgUoKEfSSpDFj4VKr3KSApKFjAzheD7yP2fvBlgBsA4YAmCIhLAhBjFBACTLpIlfe3Ts1v\/9SaWy84YVxz7NWznXzyydMJIf\/s+75OKQXnPJK9qRZvqaZD1UxcrNqu4iy+70dxnlBw0fd9\/1fXXXfdMVveJqUknPNLE4nESaoQXvXdUFQH5e5VcsbiPLB61IvhaBnKlVTnCbtE9Z5++ul9DYMYuXmJl7PaHylJDZJo0BMapABsG2BxYU1ScchQxZUQEr1FKuJnB8XRqiAyj+UMFAgG\/yHBF12JJFy0+QMnt5f3f73wnQ+N0y5eBVt3dzctFovXEkLOjZNW68VWmq3Ha2SlL5fL8DwvAkTXdZFIJJDNZvdkMpk\/jVSx4mjYzjrrrE4A10gprbGIfTXbkUmBXKlUihQ+XNdFJpPZeeuttzYOYgAw99y3PK5ZiccBLiTXQUBhUAB+0DZSgEBAQhA+2EeSBK5lzQutYPqjKpDFVWPDuszK7rtpBqoRuIU8lfn8FQfWb1wgn3tOH4eJIxvAvve9713MGPt3Smmysv6xlmJrI8DV7CRTEjiqD2RoPUhN037r+\/7qY9nVd133HwDMl1KSWpZtIwvGcJ+tN06U0ogzGGqbyX379m2dOHHiQFMgRj58R7+bSS3mup4TXAe4BqoDrq2wiMAnEj6R4FRASAlIFoBQjWYIdVOsMYCTUlEtBiV\/ZBiTkwDK\/QEBtj2TQlq6urN3yyd7fvnFd8uA2zK+HYHbgw8+OJFS+nHLstKNBNnrAVUjE2W4oHG5XIbjODAMQxE4+0499dQvrV+\/Pn+sjtEJJ5zQ5nneAiGEVouyMtKFpJnOS57nIZlMwnVd5PN5GIbBW1pa\/jR37txiUyAGAObxM\/9YpIm1TEsCNge8MDYmw4sOBSg4ASQJ+01KWtUaa9hdECQ8RuwyiYCIdsBqAaQv4WQLMOwipjHR7m184fZ1v\/riNXJptzEOGUfW1tXVlfY8798Mw5hfKBRIvQlSLeY13CrfqHxzfNN1PSqjKZfLQgixtKOjY+uxOkbLly\/XLMv6B8\/z5lbWQjYSxxrOaGlmU7G3sLMRKKUDxx9\/\/LJ4sqXhILiUkmx83+kfPz7bd0fC7idCD+VzZYBXXqikQ0hgNelCD4JZ1A8zmdViGjEyfpWgLSQJMZAOAUtJJQAOEIBpwZ\/gAIwUXMHgMwv9Zd5TnDTrhtnf\/dNvjuXs0hG20RNPPPF6KeXdiUTCUk0xqsVB4iBW10uoUubSTBdpJbusFDOEEH2api1ct27dQ8ewFXYSgF+bpjnb931Sa2waiW+NRm1EJQaUO+k4Dtrb2\/+4evXq+UMeqoYdZEJky2vesDQv5DowClAdIkRBIgANAMOgJNhQiyrYEVIwBvfB1yrfl0LdjKGXGHROGrxJ3AG4aj\/IXYh8DklewFTdmZIp7Ore8pn3njCOHUfGNnv27HlSyk9mMhnL930Ui8VhH+Jm3MvhXJVqxzMMA47jRORN13VX6br+1LE6RvPnz9cymcyHAZzqeR5ptph7JC59vbFX5w\/7EUjf91cctDI28wMnn\/dPO522Sd8vUWq7EiCMDfaQ5ARMKJQOYlcH9WgbZmWs+iOHuJMCIBIEAhQBu4PpLDwfBXyOhKUBThHEySPj9p+Dnc9\/vve\/b5oyDiGv6EYuv\/zy6QC+mEgkTq1VVlRN4HA0q3gjG+cciUQChBDYtm0nk8m7X3zxxYFjcZCklGTz5s2zS6XS5aqjUS33cTRy4c3UUHueB8aY6pjulsvltZUeZFMgRi6+2DdOPPm+PjO1HgkrOFnEd2WgkoHJ0MckAoL7I2rOedAOHrR+I6FktQh4Y4QTSDdo7+aHsCmlH\/wqBliyQCfZu9+bf\/a335MPfaVzHEtemYkxf\/78U5999tmfuK77957nUdXVp1LKZTRp+1rWWK1MZ5wn5jgOHMeRUspftLa2PoZjVK3ilFNO6aSUftP3\/dMq42C17n2lhlizlle171bGxFSHJU3TNnPO11aOT9N6XJOMs3rdycf\/KsuFTzUD0BMAMwEesOiFD\/guILgA1ccgQUiCutvB\/IAi1pKwSiBIIghJwEmMVxYqXiScATIF2bfs+fE3v\/rSzRedMq5BdngB7LTTTuvYuHFjd0dHx\/m6rhPf90e9mjcDfMNlxx3HUSTXfDKZfOTyyy8vHItjdfbZZ+ulUmkh5\/xN6XSajLY7+VhZzqrEiVKK\/v7+vy1atOigHgcjiroVlnZP3rP02z88kTgXC9snmidAXAEwDpnw4QhA8wFNI6Nq4ybC9wMAk0H8LbL+lHoGAacUPgUEESBUgEkJJgM+LBdBhZKZ7kReJF\/ezlr+ee7srj+SY1iV4HAB2Fve8pZJGzZs+G\/DMN5FCNFVZ2sldBfvgn2oJkMj9I0wcPzjuXPn3vjQQw+VjrWx6u7upj\/84Q\/f5vv+EsbYFDVOiin\/isQfYgmEUqmEVColAVyzcePGn1Ym6shIH9B1\/3z2O9p6tt7TwtGR8H0w2waoACwBDgF4oZlHG7\/gemCmMpwEwWmi7AGhEJTCowAP3ghALDw1ZTp8xwP1AcEI+kj6uWL7rNtOuuiDT5BjmI19qLdp06ZN0HX9c4ZhfEBKqakCXk3T4LouOOdIJpPDTpJGF8HhMpIHdesK3zMMQxYKhe3JZLJrw4YNfznWxmn+\/PlaT0\/P6cVicZlhGKd4nkcMw4gapNTqZnS4NsYYGGMol8u7fN+fvXv37oMWGTpClJRzrlzwiNs2bZlDTYAyQGcQkHBdAekH\/SKDbkejdAmi4nECQQhk+O8g\/ApQGdQMBB3Iwy5JAgAnKJd9aK1t4BqgtRBMosVzOnKbf9G35ifvlXLctTwUq\/qb3\/zmCZTSOxljCwuFgmbbdvRAqto7pRM1Eo2pZuNo1VL+6t9SqeRYlvWtk08++Zhj53d1dbGNGzeem8vlvm+a5mwhBFEyO7Ztw7KsV8qKH7L39\/eDMfbTm266ya6KR6M52bZPXjUXa557sMPJzUkaQbdw2\/dApISpkUBO+mC+a+NWmUoaEICHPDQJgEmACQzpa+xSGXqZFFQARnhST1L40gMlgGkCsAGhGdhPMzvJSWfeMfEjn\/4umXmxPQ4\/Y7OdcMIJJ1mW9RlCyPWlUklTbGvf94eAmGEYsG27IWG9Q+yyLBdCXL1169aBY22x+dnPftaZzWZ\/pWna6znnRBVZp1Ip5PN5WJaF4WJjw3lRow0XhDI8JcbYgi1btiyr+pnRnMCd9tZN6fbjHoLk3BEepMFAqAWQRECL4BikSIx0D4lnUhIISSBA4ENCQpUmBf8yGSCyJkSQIeUEEBQ64zAZganpKGQBGAkIypAi5ely94t35hd\/7iPyge7MOPyMfjv55JMnMca+UyqV\/iloRqOhXC5HE0EpIShQGwtXZThLrJaFp1L2Qoh7FixYkDuWxklKSZ555pnOzs7OTwkhzi0Wi0SNjSL9KjWPV\/g6AQC+72+5+uqra7bLGxWInXLrrU7HmWfeJTqmvlAUDFwEjHpGAjJsGHcPmPyyxg4xpJRIXbggFCCxTktDvkchqtiRLKqzVHeBQ\/qBHpnrCKQzrSi5PrgUMOGixe43xMvPd2996P7HVn7gLZfJpUvHy5RGuE2fPv0djuP8ynXdNxuGQRWRNS6gFypywrKsCMwOhQtSD+RiBeZCSrl00qRJvzuWpKe7u7vpRRdd1LlmzZrvrl+\/\/kOEEKrGR4FYuVyOuHOvpDsJAK7rSsMwfjB79uy\/1bQGx+KkL9540dXtezfcM0EUOwwGUOEDtgcQAd8Ing\/Np4F1RBGyYUMybFgeyWlgVDEJQGoQNHAzGA8YYLKiEiCEseAwdPDP6H1JA4AEIEHhUQ0gFBLB65r0gqJypqHINZmzJuzKT5j+X7Nv\/cgS8ppr3HFYamw7++yz9d7e3tcTQh6UUk5WLsZIJkDdloANlrlUvqbrOorFItLpdJRQME0TrutuJYRcsW3btpePlbK07u5u+tvf\/naKZVm3rVu37mbTNPVKd7FyDIYbx2oNjptxLyml8DwPUkrouh4puMaAdc9tt9027+abb95\/SCwxtb3mvQt\/nTMnfL8MU+RyecB3AJ0CBhsEnnhDXDm0sJvEYluicmUlg5YYE4GVReOCF6T6jxFEDH4XYvA7JAimBVqOPqADrFggU2hhetuBbV9+4Yu3P7Sh+\/1vGRdXHH6bPXt25\/79+39ACHkUwORajWpHE7gfLrYynEqC4oEpQmVI7yi3trb+x7EEYGeffbZ+7733zt++ffvDGzZs+KBlWboCjNHEsRpphF1vt20bqoOS53lIJBLQNA0hzYPbtv29lStX1pUHH7OJuqX7ujn8r08\/NsMdmKaRMnzXg6AACZW9gpKkQeCiMnAjlXa1DA01QQIrSuNayGvlqPacSRLeQCJRbbFQBlrIlYUkGjihEJQARIBJH0zKgESmBb1I+l0K2jYNA0htnHD8nM9mzrrgV+QfP14ch6uDt5NOOmme53m3EULeDYBVA7BGVvJqGviNkFcbBTUpJZLJJAqFgMPa2toqS6XSH1taWq5fvXr1zmMlBnbKKadclMvl7jEMY1YikSC2bQ9Rtm1kfEYT16pnicULvZVbG6qKbNQ07dqtW7euqrfYjBnFYGb3j9eVJkx7r2Oktzt5D5rJYKS0KI7lEgmXSHCEgVVCIQiFJGHKUYT8LwVBYdU4gRj1ahGgtR\/QMCBApIgK1ZWlSCkwIUHRznOY6vbNwsa\/PLDroR\/85en3XnKLXL40PQ5bwXbvvfeeOGPGjHt8338GwHVSStZorGo4S6xRNddmhPcopchms0gkEmCMwbbtl+fNm\/fe1atX7zoWwOvMM8+cOH369G9xzh82DGOWpmkkn8+rhhuHJJbVTK9QpaZLCIky1aolnJTy6wsXLnx+OGt5TF0mufROa933vv7l6aLvn3WtDCo5NBlYRW7IfDX8ADc5DSR1qASYFCGASYhwSlAeLQVVC9kiZ6+GJVb5A6NjSBpKBgXoSmnQTMkwAkgvDgCWBVAjhZIt4aQnFIuJtvvstqnfm\/XN3zxPCDkWmf6ku7tbf+KJJ+b39PT8W7lcfrPv+0w1jai3cg+32MSlqeut5M0UH8ff13U9WuEJIQO6rn9s48aN3zva3cju7m762GOPzerr6\/uE53n\/VCgUNCXxrDhgYT1iXYtrrCkU1SoqlCvpeR5SqZQiQGdnzpx5zvLly\/92WEEMAHJfuakz+6ffP9ku+ueQwgCSYXVQOQQngwfaYIIFtY4CEkwABg+hhsSDZMEljhTEREwhW2UtgyZNg1LXvhTQDAbH4SAUMC0KcAFeApgBcElRJkkMGMnyXmL9+7zL3vWI0dOy4VgpW1q6dClzHGfWPffcc\/3GjRs\/bhiGUSgU0NHREVk41cCmUbXWekmARsBqOHBzHAeWZcH3fUydOvULM2bM+M9ly5a5RzN4ZbNZ86GHHrrowIEDi1Op1AwVC4w39LBte0jFxKHIRFaOT7X3VWIhzhfM5XI8lUrdc9555\/3rsmXLysN7WYdg+\/P7L7j4xPzub7Xm95yW4C5AOBw96Lxm8jAwTwgEoXCoBJEUpg8QEcbJ6OCVCQkQwjA09xh7aGk4CaoYSIIAoeEXEWRJRJLVAFAIRuFJAaJTCCIA4oNzAY2GZUscoJqJki9AU5nyfodsdVsmPGSe+JqfTX\/3u1cdpZlMsnz5cnbjjTfOcV33\/bquX1YqlU42DMNUsQvVRotzXpcR39DJRgBilaBZyw0NA\/nS9\/01s2bNuuyJJ57YM8zKfpDx\/moBrxkzZhjd3d1nEkI+WiqVLrAsa5q6P77vw\/d9JBIJcM6jngLKEj6cdIr4WJmmiVwuB03TogSMZVnPX3LJJdctXrx4fSMWMzlEF0k233ThFRN7tj2QdvtaiSzD14JMo85jjwch8AiBBIWmYmIq4M\/C4L0I3NDK3xLdiHoghhDESABgTB4MYlwSCMpADR22WwbRAyDTdQruCRAOmAaDZ3NIAVDTwgFHoGRminZmwg9nXXT5j7RTZq0kF\/\/z0aJ+QK688spZjuNcvXr16g8nEokTOOdRzaN62GzbHtJ3sNpEaHRiNAti1SSsa73veR4opTt1Xf\/gwoULH63HCbvhhhtmrFq16rR9+\/Y9u3PnzgEppTzS3U4pJVmyZIm2YcOGk3\/+85\/fNDAw8P5UKtWqZJ0VaTU+bmHDDWiaNmYqrM26kdEcDRdEBbSMMek4zgd7enruaXQhOWRXLZd2G+vu\/5\/bjuf9tyXcfouZBMJ3IEXY6s1HVFYkwCJiKw0zjpLxyG8kklYpXRJV3ctoIIgI3cbQFCP+UC9VUgAaJFjscyJSwgDxAcJD1R8CSC1sfqJkfyg8RoRjGHuKmrnBmjZzmdsyZcUJb3rbZnLxwldVGVN3dze96aabEhdeeOF5juO8W9O0NzmOc6JlWeZwrO1mVUpq9Y6sdczhJhljLJqkjuNEQovKQvQ8z9N1\/R9N0\/z5pk2bnDr3IP3d7373K0KId2qatq5YLN6\/aNGiR3t7e3eF7x9R4YOuri521VVXJT71qU\/NmzZt2g179+69yPf9maZp6sViMbK4lKXVqGT3WGcjh3tdVXWkUinYti0JIStnzZr1jhUrVjScOT6kNmThSx+fvH3F\/3x9CorXtHgOmLABEwA44IbGkAcADJIGPAsSpikF4xAIqBkjBTEiKCBDrX\/CQ73\/MCMpASIIKPRB3lp0XAkwHlYShI1PpIaImSs5KMLOwAzwdAMHfIl+YvVoU2b9pOWEuY9Nfs2Zz+HtA72EHJmxMyklWbRoEZk2bdrUtWvXvuknP\/nJpbquv6tQKCQzmQyklCiXyweprzZt1jWZvh9Jb0nVEUdKiWKxiJaWFlWXKRhjv2hvb79+5cqVpXogfvfdd1+bTqcXl8vltG3bME1TAPjrqaee+p13vvOdT\/f19W0KgUy+Uq5mYBgSecUVV7Rfeumlr7vnnnvevWvXrusmTZqUyeVykVquspKFEMNaudUoLs0A2kj5e3FLLJ1Oo7+\/H4lEIlcqlW6ZN2\/ej1asWOEfESAGAOX\/\/uCJu\/\/82M+n50pnGH6ZQGQBS8B2AU0DNA+ACKVYJQWIgKQSvs4hiITOCaigtQP7qIERNBRM5CGIMQ5JfQgqom8QCWhS4dbQjkqDHX9DfhupPQgslYbtepCJNPaXbO4bZs4h2o62ydN+QRItDx731r\/fs2lTT27WLd\/wXuHsJl28eDGbMWNGy5\/\/\/OcTf\/Ob37x9y5YtVwM4MZPJpBzHoSrQrqyb4SyxZnhgw73fDJVGva6UP1VgWAWqGWOwLOtp3\/dv3LBhw\/pawNPV1cXmzZt31l133XW\/aZqnqt\/reR5aWlrg+34pn8\/3Tp48+deWZf3wLW95y8YHH3wwd+6553rLli0ThwHQSHd3Nzn\/\/POtHTt2dN5+++0XDAwMfJAQMieZTHbYts2SySR8348yfaqbeaOZ4lqduUdjeTX6GVV+lk6nZXt7+4+uuOKKm7q7u5vSdCOHY\/XY+1\/\/9HY89eclx\/mlSeD9kLQE15DgHEhwgHIaKMOChoF9CVsPrCaD0xh\/rJrlVeMhJwjAT4TlkExAEB+c8ogbFgX7ZcUdiWc1VRE7FUNqQdWjSyWFlAS2y6EZGqjJQCiFI1ww3QLnZm\/OkS\/zdPvLex2yPTPnjJXT5r1+rfW6mfsOVVJArdhAkF3cvn17+5NPPnnyyy+\/\/NpyuXx6qVQ6LZ1On+l53kQAJJ1OI5vNwjTNiOGuGmgMpzLRLIjVEi1sZmLU44npug5KKTjneydNmnTtX\/7ylz\/WimuFTXzn+L6\/xLbt8xOJBC0Wi5gwYQJKpRIopUilUigUCuCcI51OF2zb\/qvv+y9alvXSO97xjhfa2tpeBjCg3M34vW92zML7IQFg8eLF+v79+ztfeuml1z3++OPzksnkvHK5fDYh5GTGmKHc8PC3RqTReLZRAfxYW8ujHavK4wshUCqVts2YMaNr1apVzzV7\/w5LSkIuX65t\/eEdV5jbN9472XTanXIPaIbCdX1oAkFm0tMGkUNrHMSUJVZ1NYlKmwgklZBEhMKJgwKLLGZ0yUD4QglgBJI+Hgbp\/2HFFI+dSmNaqLYhITwP1GAAJAQEfI\/A0NoAYcDRqLQp9Qc8v6i3thaEYTxvtLT8kRrJdTbH9ulnzCtseeHFYl5nhdde+04XD\/fwZWvXkrj2yNy5y2R3N9DV1RVdQW9vL8nn82TevHnstttu09euXZs2DCN928dum5RqSc0pO+X5u3btekO5XG7PZDIp0zQTQgiiJgAQ0BCSySQcx0EikVDB8OgBq\/dAjsbSGi4F34ilpqwmxVkzDAOlUqk\/lUr9x1vf+tbFS5YsqSV8SU499dR0Pp\/\/\/4rFYlcikSCGYUAIgdCdhNLW0nUdnHNwzuG6LlKplKSUuvl8vqBp2gFd15\/LZDJPTpky5eWPfexje33fLzDGyp\/\/\/OddSqmXzWb5pEmTxMSJE6Uas3379lHLsrRp06ax2267Td+3b1+qVCql7rjjjmmGYczJZrOXDgwMzAPQ0d7envR9XxNCEMV5s2076lyuGv9KKSPJo7iVOppF6FAF9tV5dV1HoVAoWpb1H29\/+9u\/dddddzlNm6qHzZ9futTY9tsl72M7Vn9homZPJqwMIT1AApog0Dw2iA5MgjMfnAIaV0KHjbmTB\/n16vMIYltBjEtEfSy1imNGDYBpQAUx4rYSU82BY9\/hgK5RwBOQEvA8wLBIUAIABrgM4IBPJLRkAmXfBdUpCAMc34PGDLfs8gNCNw64xNxT5HSv3tqRL3IU1tu6ff+GA3t28AQvlMvS4wKUUUDTKMAMQkhKQqbLrtMCiSQhJC19PlkIMWnypOMm7927N+1xn1qWFVcFiB545Taq0hNCCFzXhWVZsG07Ws1H6kaMxSQZjm\/m+z5aWlpQLBaVRVKyLKubc37X1q1bayZYTj\/9dKO3t\/eDQohFlmW1qf6XyrLJZDLI5\/NDMmfJZDIizirXNab+IA3DKOq6fqBYLO4FcMBxnKxlWTZjzNF13SGEuOH3dM55gnOuSymTnPM0IaQzlUpNklJOKpfLCQDUMAyYpol8Pg9N06LFxTCMSN5bXUO8AbBafGpx8A63OkU96zu0Hn\/gOM4tBw4cGJEk0mH9NXLpUrb393e+v7V329e14j6LEQ5fAwQIdK4FoSipglRiMIkoa7O664IZkUNBLNCviArLCQQYZIX67KDJFcj48zBrGStYjygdApILsJDGRiwd0vFA9AR81wPnHIYG8LB9JieAboburQh00Hzfh6EnUHJ8eMyATTRIKym1TJtcsW0A97yc97bTVuJ6HBwyUOKgDCCMEEKIJKCUUqJE7TTKQsVUHup10ShTp1wQ0zSHFN86jhMFhVVsxfO8SPlhpAA2Evey2QmnuhWFxcNlSmm3EOKunTt31iRJLl26lH30ox99lxDiPkJIQpEula68AioF7goQVLzMNM0o6RG3fJLJJLLZbPR\/pcrAGJOapoExJkMQUwKEpFwuRyU3ympqbW2F7\/tRgF5RJRhjKJVKkQVWLBah63rUqyDe7k7Fa4fjgY1WtLBRUnON7wnHcVa0trZ+YOPGjZtHfA2HPcPy8+62TT\/8wScmlvs+muIli4e+IhMMlMebgfjB1UlEbcIFkYMUMxnrEk2GghlRxH8y+AsViEnBhkj6MKXdL2MuqMpCEgGfcciQrhFJXxMlBSRAdALfUcFkwA9zVxpLgDDA82zoiYDvVrKBZDqsDuCAaQaij3aRg+kAMXV4TEdREnhGAs9mKe5ceQC7jIlQVVhCSnAE3DpKKQRkNOEUiAUPMw8DvVpkfamHLW6Ncc6jvz3Pi4BBuVLxmNhYNfUYbf\/C+PdjzSykEOLefD7\/sYGBgYE6cRVy4oknnuF53n1CiDNUYFmRd9XEV8AQb10WJ\/gqkOCcK3pA1ARFubjqu0qnq9qEr2w5p6gRKuMazzTG1XEppUNcSbXYKNCKg2K9e1jtM6PhjjUynrFj7tc07coFCxb8ZTQUFna4QWzRT1bY37jmI8t3uNsT3LXP0xhh1JcwiAHiheCkaeDCBzVDM0YGMERIRNUKyogQaPhLUHBCApoGAaiS2hFDQSyqaiISlATdkCB4pKQRQ7IwQykDfzGU9KdhATklIVIRAcmD61IlgOq4BBJC+qHWf9glnREIGZxbpwSES3AhwTSAaEF3c40EbqlLTWzM+Xiyx8YBloIvZFAsH2qiRQ+\/kCBB6hSUxDlBBFIisiLi\/f0quwyp9+LNa+u5I40+tLU4YM32HY23slcTWQXxQxVSz\/O8b37gAx\/49G9+85tsLQDr6upinZ2dM\/bv3\/8TzvlrDcMg8aB4pWURfy0eH1T\/V+CkXLj4vYx\/rhKsKrPb8UxdHPjirqEaj3gsU\/1dbaxq9YEcqRRSrbGpV7QfB3\/lDagFolAoFAF84Y1vfOPPvv3tb48qY\/+KNMog3d1i2t+\/+9t9mWnL97u6TCTb4NtOGEln8EplgDJwjw8msGnIxIi5h0HTIwoJAioZiCSD9ZExL1MOYfYIUEgQGahZHGQZEDFkJ6r8CHFpWRFVCBCCqrWbEjx0jRVrg4JKGuihRXgZ0jdoYN0xClAhwKQI6jf9wOriAoE0d7hXe7AqH7JGH8bhgGo0k6BWIqCZbJhypwghKBaLYIxBFTKHwCZt216j6\/odn\/3sZ2sCmJSS9Pb2tvT29n6GMfZaACQOPtX4UmMdO2q0efRYWz7NXNNYnKfy\/qmO7yrGWiqVZEtLy7JMJvP9ZcuWjbon3CvW7Sd1Xffuue\/6+LXm1Dn39xV8R0swICEg3VLQj9cwBrOLhMALY+TKUJIE8CmFxwL2PBUUuk\/BwgJzhFZbPWnD+IQileAXfebgvTnXR7m1pPqb4XXQiN5BQESkAd\/QSlcJZtX+38iDV20\/ZAtZnePHz5\/P56PMYzqdjhrehvdGCCF+p2naDVu2bNlbLzU\/efLk5MaNG7+Ty+UWqMB9NQWORizPRjT9mwWJWsBSD0AalSlq5neMhcVWeby2trbIivZ9H5ZlvdDW1vbJTZs29Y7Fs\/SKtiwj71g4MOWtV38qN+H4h3sl4wIUQgOgE\/hOOYg9sNBNxKAKhdopBukSkVy1JMpuCnY5uI9mslXnM9UauMF98Gu06geJItOq3IQ4+OGpxaVqhHPVyCQ5lCv5aM+VTCbheV4UyC4WiyqGJ4UQOzjnH37961+\/uh6AnX766UZLS8sC3\/ff6XkeBYD+\/v5RdVpqFsxqjc9YSN2MBXiN9vfXcy1t246y3QDWlMvlW1evXr1vrHDkFe+7SK775O6Z7\/jM9YXj5n5rn5\/o9wwDxVIYN0oZKOuAwwg0rsHwaGQtMQCakDB9DkO4EIQHpUoUkGCQQgP4IPeMAA1xqw+yyOp2YyIHvSaV\/k+4Vx4vGOihCEjiQKuY6IQOCQjXUk6tZUHUBl55SB7qRkCt3mu19njSQtd1TJgwAb29vbJUKq0AsGD79u1b6rkky5cv13zf\/3SpVPoCY0xTJF7Fcm+0U9JoLc5GS3iGWxQaye42KhrZqPXZ7PMSf1+NXTKZlFLKlwghN\/b29j41lhhyRDSPJddcU575nls+nTrrktv6tRYHFgPRgULeDWNTIQ0iFm9XpYuIpPs5fMIhiQziRtIAFVrVnzicmd7og9wUXSA6TgywRNC2JP46JIbEDxhqg1ej2b9GYx5jDWi1jtuMyxIPqlNKsX\/\/fj+TyTzV0dGxcNasWU\/VW5q6urrYXXfd9TYp5Ud0XW9V50ilUpFLOpaTt1n3cTSua7V7ejgtr0bHUiVfBgYGNt144423nn\/++c9hjEu1NBwhG7nsH4tyeff3Nm7cNBEe\/lUz3A6d5EGEACUCkoW1kL4W8BVEqHIYE6qgCLKJBIPNRChCCoZKPFa4crKORRZo+A8PEtHrVT8jB\/9RjU\/i1pkkQ001El41YQ0\/sMNpazW6albrdDPSCTCSoHWthUIF80Ne1O845x\/euXPnji1bttTNaj399NNvA\/AN3\/fbDMOI4jLZbBbt7e1RZq+ZBWk4F7+R+9vI\/Wi0OqLyuRhtzeNYJBbUc6PI047j2O3t7V\/Yv3\/\/E2MRyD8iLbHox1\/c7Z\/V9f4797fPuHU3T\/aWaVoo5rykcTBQPIuA+8BDHAjKG2WoMOEC8IdkESvjWI08RKPlMdUKoFWL0wUJAFbTkopzlqqBTDPa5tXciJEoSDQ7EZrNdipdLNu2bdM0fz958uSP9fT07EDNyn9g\/vz52syZM1\/ruu4djLEZSjdL8d5aW1vhed4Qd7IWd6vR3zgSK62ZgP1YW8f1LK2RdqOqcd\/2ZjKZz1x66aXL6pSAHT0gFriW\/1qeN+vtP+584\/+5ekDv\/LNPUgHfiYcKBboGaBQe54BhwSEMHBqo1EBFWGcpZaAHxvwhz3ocyAb36rGlemn2RttRDRnMWBaUBnQvEBqkLocAShVuUi06hOLdVIu7NOpuVGYjG\/ktzQBRNa5U5b0khAzhEinAVqU0QghMnTr1vnnz5r37Xe961\/p6ANbd3U3XrFnzd7lc7ieMsdMUUMV5Zuq1SqWHarHGsU6QNHK\/692\/ep+p5InVcpernb+Rc1b7bLxHguLuua6rssgOgM+ZpvnNJUuWlA4ZZuAI3npv\/8Dsvmd\/\/Z9TmHOFZjvppOAQpTIoI4BhgBMJnwdxJV2pwspQbVFpHcq6BlF0B2pZJc1mjw4KsFMJGWmiCXAauKhaxH8zIMABwsMVhcKGhqzRisf3C9z5wgHsMCcOmXSVJMxGV+xG9KLGetUf7tiK1KneV0Cj3tM0bZ8Q4oGpU6d+ceXKlX314imzZs0yC4XCJbZtf4VSerqqUjjiFuoxpq7Us6hHmv1sJKRACIlEA1RFASFEVYfs0jTtixdddNF9999\/\/yFte0iPZBCb+Ol7Npz6nn9buKfz1Nt77GTZkS3wmQ5YDC63wYUDnXIwIiEpgyQaABa4mGywHRs52CAagmHxfTQPUlVQiNc4gQ4FU0kHLS8Ri9XJxh\/G0QTkR8MrazT4O9z1KcJpvEYzVmC97aqrrvpwKpX69HAABgCmac53Xfc+BWClUmlMOU+HEswPx\/EaJds2YsGr91KpFDwvqBNWTWN8399XKpU+cdllly051AAGvAJlR81ui5b91r\/rfxb\/pX9Dz+pCIX+aYdJORgVlmh+U7DCASBaJ6xBCICkB14IO4JG+IRkKZLWZ9odmdSVggex2WNgZGGQkqOcECRRtw9d8UNjMxNaCwJ\/22chpqapAOZIVfSytgHjR8XDnqqUkqoQXM5kMSqWSAjXHNM2VruveduDAgUfXr19fV3ftlltuMbPZ7LWu637Ftu3p6rgqM9aMJVrrNzb73itllR0KIBzO29B1HZqmwbZtX9f1v3LOP3rJJZc8fP\/993uH49oJXkVbbvGn5vQ\/8ehtyeyu9+pev9baYsB1yoAg0H2GEAfAKcL+lQK6L4Nu42pAGvzFcoTG6sFSQIqEqwFUglM\/alwCGVRjBh\/k0dlsoiNntOKxXo471wxghzlxCIiNtrnDWEycZlb\/WudX0jGq9q+jowO9vb2+lPJHhmF07927d1u9+Jfa3vCGN7xr8+bN3yWEZNT9UYXR1c7ZzL0YDsRGe19HS3YdyTmbsQTjtZ217qFhGLBtW2qa9nsp5Ud7enrW4TBKeNNXE4hlbv7iuhOu\/dCH97VP\/3I+ddy+fXkuPaEDQkAIDxIeJA24YkHTJIJmNCJHw+yvZbLX9GNxsKvblJtaJZM0ktrJkZbFNPy7hzmOyhYmEgns379\/77nnnvuZ1tbWj1x00UXbhwOwxYsX67Nmzfr01q1b706lUpl4IXQymTyoG1O1a28kSdEMofSVsqIazXqOhtlf7X5QSuE4TjmRSPxw2rRpN\/b09LyMw9yD4FVliUU3c\/m9iX3Lf3u589JfP9dR7J+b9HIAdQJRQxbgRSBNTUBE9QxNpUVWK+A\/HM4Px+chCJs1xCwxCWWJhSVSpNISM5Az2oLA\/prBwH5lRmm0+vZjZR3UcyeHU7lQXYp0XT9wwQUXfOL2229\/4JRTThlO3ZMCIFOnTr1S07T7pZQt4TFAKUW5XI6uq5qo41hYTM3o1Y\/Eyhv1xG6QPjNa7loikeB9fX3fnzNnzidXrly5\/5XAg1cliKltX\/eH06XnVyxodQf+XSO5SRqxwRiHJiRI0F4cUjQmFVMTxASpCoDVLCgZAz4ZcyUpkSDQw+xkIO1DeXgMwiIQC3Uc64JYvQdwLN3G4ZQtGrU8GgCyrKZpX9N1\/e4tW7bsG2YVJwDYpEmTJhBCvuN53pWEEC2dTke1eUqqOk6pOBJBbKTZ7+HijrVcvkbb4NVykWtYps8LIf7zkksu+dWhILEele5k5Tap+9uFGa+75tubj5t9w\/7WmU8MGJ2er7XIogNAR8jqD+R6eBgvAwmkbbgAQDXI2C2I+LRKEzFUl6AggUYZkSEgSRBZbQ\/LBwiFJBoEDRqWythDoFR8VE2lECKWjRz0PCWVkJI3XcbSSK1etePV+m7lQxwn3Cp+V9wyVLEo1WREFW\/Hda\/CWAsnhOwQQnz6xhtv\/M\/NmzcPB2AAQKZMmXKKEOKuUqn0D5RSTaX21bEVcMUlfKr9tmZKnir5XOq9So7ecHyukbj7qn622rnqxffqcfwqv6MkrtX9i+vJxcFRCUhqmubbtr3cMIwF8+bNe+iVBLBXvSU2ZOAXL9Z7Nv3y7fbWtZ+ZpLmv83p70GJQ+E4gH60ZOrjjBa6maQKeB98XkZihrCHDQ0WAaCLkQEgyWDkg5WB6V1lVACBpKFxIBEioyap4YjJMl7KwE7okgZspKQ+AjQAONTBgtuP3+1z89+r+moH9sVJFaEQ\/qxYp0nEcWJY1ZKIrK0i9pzooKYXSUqmUSyQSSyZOnHj7iy++2N\/I+P76178277nnniueeuqpr3DOZzLGYNs2WlpakM\/nkUgkIjVTpfbaLPO9Vua3mQYpI5RprnmMuGDjWMTO6rm0iuelFicA0T0uFAoghCCRSGx73ete94Wnn3566YEDB3JHQod07WgBMXLzzR6An275woK\/\/e35Vf8y47jJV\/Tv3dI5IeloXqkM6XtglATWmetAeoBGBzuhCqoFyqkiUIUlQkAC8AiBYGGgDYF1pABO0TdoVAcZljjxgOQKGWv9JkM3M1RuRSSKGOxEcqhSTSlD3q4kQ6oKGqllHC1frNkJYFkWAAzheXmeB9M0VdA3IkMSQmzf918yTfPLra2tj6xevbrQqPu1aNGiiVu3bn0\/53xyOHEIIQTZbBZtbW1RlyLVREMlDeKs9Vp1otX+bvTejLUCSKPHH0tgUxLlqseAcs0JIWhra0OhUJCUUieVSv3Vtu3Pn3POOb9\/+OGH\/SOFHnLUWGJDBqa7m9qsMGPXS099sKW046YUCm2GlKDcAVwnaOyhE8CTES1DQIMAC5xLIUFF0J\/Sp\/FYl3pwgi\/R0BKL1GRJtbsbRMaoZBBEQoQxMY0H70mihYjoQSKoPihTAwNGK36\/z8fX1vRjhzmhaplMNVAbqSb6SLs9xxn3yhIyDAPlcjm6Xs655JxvuPLKK7\/65JNPLtu6devASBfdtra26ymln3Ec56RkMglN01AoFJBOpyMLkHMOx3GihiiNJB5qKbyOBQF4LGJxYwVm1a6Bcx7x9UzTjEIAsXrT7ZqmfW7evHn3P\/roo86RNt+PShCLBvi5h5J\/+58fndcysOuD5X2bL+tMOJmkn4Xd78LSAT\/sQh7cCT2GVoGvyCEhCR9iSSnXkxASWmCBPhCJRxhjDXaDPigqbSqjvpdMqMxk6E7CDbKWhKBMEhgwFYj1YYc5YYg7OZaTrNlJU7kp0FLuW\/z\/rutKSmkukUjc6\/v+9\/bs2bN2tB3Qw1Zrp3POP8o5v9z3\/Umtra2RDn0ikYgaATfzOxp1JZu11MYy2TKS89ZapOKgrZ4jJf8dlnvBdd1ce3v77974xjd+9cYbb3zu4osv9o9ILwzHwCaXLmVr\/vjd93g9m957HCu+KenkEhkmgVIZg710Q5dRhm3REAarQ2kfJeovFZAowKNKW4eDx+\/oEBALY2IAOBWBnn4MxII4mQchAQaKMjWQTXTgsV4vArF4g4j4g1jZreZwmvjKylGruCrYDrspea7r\/pFS+p3Ozs6HrrnmGn80HW2qPLekra3tIsuyvuA4zjmmaRq2bUfJBNM0h7iS9aSwh\/uNh1qmuxHrbawURaqBsIojqsbJpVJJSCk3JhKJL911113fv+aaa\/iRPL\/ZsQBii5Ytk99+dtOaVIE\/kkNqheubtJyzp8LnlskIAeGhTygANthTkqqelGJw6hCFaCRoaxQJuar24FJGruZQmbDguDIMg9GwE1PYux5S0TFA4BMGRzOxucTxv70OclryIEvscFkAlWn7amzt2GovHcfZe9JJJ\/0yl8t9ilL6zQ996EN\/XbZsmb9ixYqxDgDLcrm8bceOHQ+vXr36D1OnTm1zXXdysVhMtLa2Rs0p4n0Xq2URGy2CHy6QPxacvJFoeY0WYBOJRJQ51nWdF4vFFxljn5s0adKizs7Op77xjW\/4R\/r8PiYssWrb6vdffrmR2\/meNj97eZIXJ2hwwLg3KKwoeKRRpsJgQ8JihA3GvJSKToxTFkwdDgkR8b9kqH0GAmjKAiRa0E+TcAgZJBvK1EAuMQGP73PxtZey2G50HLQqD1e3OFZgVo17FOcLqTgUY6xo2\/ZTqVTqjjvvvPPJrq4ucTgzV11dXcYf\/vCH92ia9tF8Pv8a0zRZvKlsZd9HtSsybCUHql6srBmwq7XoqP9XStkcijhbvSyt53lobW2V5XJ5nxBiaSaT+eqWLVu24zCz7sdBbGQWBkHPSmv9d797fCq3+0K5a+O7af\/uszPEazchIDwfEhyaFlhQGge8soSRtADXD4hkHIBuAJ4NaAwgIgjiM9V\/0AcJhSqoDONk4TPLQgtPCIBoJBJ9DBj7GrJmOx7r9fH1l7PYbnQe1Bcy3uW5ks9U+XCrwK1acZXGvOJRxSeS67pRTER1nlbuBqU0EhNMp9MolUpCCLHKNM3lAO774he\/uGvhwoUDr9SzPH\/+fPbyyy93eJ53hqZpXbZtX8UYm6wyb4oL5fu+ivlEcTRFilUZTRXkjjfLVUAY7w3ZSG1ho6BXKzup6A7lcjlqrqveU9nEePNfTdOGhBrUb1Udy9Xv0zTNb29vf0rX9V\/OnDnz59\/61rf2zpw50361zeVjFsQOelh+++XU9l8\/\/rbs39Zc00HEhRaTxwknhwTzQLkHgzBozATKHuB6gSdumoDrBz0AdAoJHmnBB4ASKMsGlIrAHJMsFEYMQYyHSQIFYoyEBeCJ9rAAPGDsV5IPq02GavEPpWpaLpeHSD2rQLgCJhUQb29vh23bQ5rTuq6LlpYWlMtBB6p0Os2z2exfKaW\/S6VSd+\/cuXN3aPHII+SZJgBoR0fHm33fv7K9vf1d+Xz+OEopUSRY1QXdsizkcjnoun5Qc97K2F+1haIaiMW3yjjmcFZXNdFB13VBCIkyh6pLU6A5iKhTeCKRQKlUioQJTdOMYpSmaUbcPUop1zTtiYGBgcdmz5797VWrVmWPkLEbB7Exsc6WLUvsXf+7yX2bXviAntv95k6RP14r5Y8zKKOaBJjgEL4E1QLFRS4lJBt0KZlkoKCQQsDzfGiG4peFXikLC\/\/CruCSAITRKCbGCOAwHXmzDY\/1cnx59dCyo2qt3GqBm7I64gqpCtQUpyqZTCKfz0eTIZfLRWCnQCws5+G+7\/d0dna+mE6nv3zDDTesvOWWW4qEEH6kjiUhRD733HP69ddf36nr+jt27NhxE2PsBNu225PJZOROKYBQVqqS8VGJgmr3t9HYZL3qB2VJ17PeKKURsCpAU9aVsqJVqZVaqFKpFEqlEhgbInXOXdfdM2XKlJfmzJnznfPOO+\/35XK5OIbJlnEQOyIB7b5PHPf847+fM1HD60Qpf6bhu2\/TvFJni0HhlLKQnguNAUwDXDcQldUoYBBAo2ZAqYA\/JF7GGQfEoDsJQkFifd0YBVxmIBfyxL70Qj92JjqHWFuVruVwZUae58GyLJTLZei6rgquo5VbTWIg6Nbc1tam5GykZVl7y+XyE4yxZ9Lp9HOmab780ksvHVAg8Woa00mTJp2k6\/rp2Wz2LErppZTSc9LptCmEiMDBsqzIzVT3WbHm49arut+NWFrDxRTrWXLKZWSMoVwuw7Is2LYdEVOVa6y+7zhOBGqhBWZTSp9kjD0upXzmDW94w4u\/+MUvBl6N4zcOYqMGtaVs\/5eeS6YT2devWfH7f5ti8Mm6PXA87Gx7q6UzIjxoACgn8BwJnQSNTCRlAfVCUiAsAKcIYmwQBFyQsOcJj0DMCQvAf7fXw5dW92NnomPIhKlk8McD15X1ckolQrmQAKJaRsWmD9PqEELIlpaWkm3b233f33baaaf94Oabb354x44d5c9+9rP8aHnou7u76X333Wccd9xxnX19fR\/euXPnRe3t7cd7njdFCKGr+5TJZCL2erxutN6iUU+vvtpWSZGp3Hzfj2onFbNeWdWu68KyrCieFz4H3DTNfT09PdvPOuusxzs7O+\/bvHnztrVr13pHy\/iNg9hYANpDi5Ob\/vcPUwa2b5iZ8ItTksw\/3TnQe16CyjMyutEC22a6JIRxERSNS4GgDRuBDOUr9IC4H4AYBAj8oDUABWyqI6u34Xd7XXz5xSx2mG0BwIUuhZos1agP8fpFZYUZhhEFqtVqzhiD67oSANd1fZcQ4nnG2FOJRGJdV1fXlo6Oju2f\/OQn83HX7GiztAkhcunSpewTn\/jExHw+f4JlWbNt2z5b07Q3cs5fI6VMEEKIEIJUA69DRauo7NuowFPXdeRyOViWpdxMSQiRnHPHNM0thJDHpZR\/ed\/73rf5kUce2bF27dqdhBBxNI7fOIgdikmxdCnbtOdJLTNw4JyBLZvfTPL98xJOvrODOJNN7k0iAhlBpCapDyIFNB5w0CQ0SHBI4UAKCU0VgOtt+N1eB19em8V2ozWyqpTrUC02Vm1SqM7ZxWJRJpPJUiKR6N2zZ09Pe3v7nra2tlVvetObfrFkyZKXQ+dWjI9kELJcsGBBi2EYb\/vpT396heu6UwBMMQxjMmMswzmnyjIeTilWLSbDdWyvJW+kirLD48j29vZyPp\/fXy6X9+q6vuOMM854prOz88Gf\/exnO47V8RsHsUMVT1txnwmXZTY9eO\/EFC+1Cy5bmeSdQrozIN0TmM+PJ0JMIT5vh+At3C8zcIfpoMyjGi3qKba8p0S+sboP2\/V0BGK6roMSDVwKKYSQMnjqBQLCByeEuISQMqW0j1K63TCMTb7v79Z1fcvEiRP7zjjjjAMPP\/xwfyaTObB+\/foCXkV8oFdiO\/HEExOFQqGdMTbBsqwJjLEOIcR0zvlJjLGZuVzuJELIBEJICoBGgq7HTIGhlAG9uZqMj3pcgkdGisDoEz4ALqW0AeQsy9plmuZW3\/c3cc43X3311XvWrFnT\/7e\/\/a1f1\/W+TZs25Y71MRoHsVcS6BYtIpiym+XR0rp748apvbu2zmDCn2omEp2O507805a96fvW9Jq7hU45h+SAhACnui6MRKqoabQAqhXOOGNe\/rWvPXO759m7AWxatWpVbsWKFaK7u1vFgMYtrEMwfosWLSLd3d2kq6uLzZ07ty2bzZ64Zs2aac8\/\/\/x0znk7Y6ydc570PM\/0PI8IIWhI85AABCFEpNPpUjabLbS2tvZdcMEF+yZPnryltbV1t23bu5977jln\/vz5YnwM62\/\/P0AzRx\/3LFI5AAAAAElFTkSuQmCC\" alt=\"Onground Media logo\" width=\"55\" height=\"40\"><\/span>\r\n      <span class=\"brand-t\"><b>Onground Media<\/b><small>SEO Tools<\/small><\/span>\r\n    <\/a>\r\n    <nav class=\"top-nav\" aria-label=\"Main\"><a href=\"#home\">All tools<\/a><a href=\"#how\">How it works<\/a><\/nav>\r\n  <\/div>\r\n<\/header>\r\n<main class=\"wrap\" id=\"view\"><\/main>\r\n<footer class=\"foot\"><div class=\"wrap foot-in\"><span>&copy; 2026 Onground Media. All tools run in your browser.<\/span><span>Example site data is fictional.<\/span><\/div><\/footer>\r\n<div id=\"toast\" class=\"toast\" role=\"status\" hidden><\/div>\r\n\r\n<script>\r\n(function(){\r\n'use strict';\r\n\r\n\/* ---------- helpers ---------- *\/\r\nconst $=(s,r=document)=>r.querySelector(s), $$=(s,r=document)=>Array.from(r.querySelectorAll(s));\r\nconst esc=s=>String(s==null?'':s).replace(\/[&<>\"']\/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\r\nconst store={get(k){try{return JSON.parse(localStorage.getItem(k))}catch(e){return null}},set(k,v){try{localStorage.setItem(k,JSON.stringify(v));return true}catch(e){return false}},del(k){try{localStorage.removeItem(k)}catch(e){}}};\r\nconst short=(s,n)=>{s=String(s||'');return s.length>n?s.slice(0,n-1)+'\u2026':s};\r\nconst fmt=n=>Number(n).toLocaleString('en-US');\r\nconst pathOf=u=>{try{const x=new URL(u);const p=x.pathname.replace(\/index\\.html?$\/i,'');return p||'\/'}catch(e){return u}};\r\nlet toastT;\r\nfunction toast(m){const t=$('#toast');t.textContent=m;t.hidden=false;clearTimeout(toastT);toastT=setTimeout(()=>{t.hidden=true},2400)}\r\nfunction copyText(text,okMsg){\r\n  const fallback=()=>{try{const ta=document.createElement('textarea');ta.value=text;ta.style.position='fixed';ta.style.opacity='0';document.body.appendChild(ta);ta.select();const ok=document.execCommand('copy');ta.remove();toast(ok?(okMsg||'Copied'):'Copy is blocked here. Select the text and copy it.')}catch(e){toast('Copy is blocked here. Select the text and copy it.')}};\r\n  try{navigator.clipboard.writeText(text).then(()=>toast(okMsg||'Copied'),fallback)}catch(e){fallback()}\r\n}\r\nconst PIC={\r\n  pass:'<circle cx=\"10\" cy=\"10\" r=\"8.5\"\/><path d=\"M6.2 10.4l2.5 2.5 5-5.2\"\/>',\r\n  warn:'<path d=\"M10 2.8l8 14H2z\"\/><path d=\"M10 8.2v4M10 14.6v.1\"\/>',\r\n  fail:'<circle cx=\"10\" cy=\"10\" r=\"8.5\"\/><path d=\"M7 7l6 6M13 7l-6 6\"\/>',\r\n  info:'<circle cx=\"10\" cy=\"10\" r=\"8.5\"\/><path d=\"M10 9v4.6M10 6.4v.1\"\/>'};\r\nconst PLAB={pass:'Pass',ok:'Pass',warn:'Warning',fail:'Issue',info:'Note'};\r\nconst pill=(st,label)=>`<span class=\"pill ${st}\"><svg class=\"ic\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${PIC[st==='ok'?'pass':st]}<\/svg>${esc(label||PLAB[st])}<\/span>`;\r\nconst tic=d=>`<span class=\"tic-wrap\"><svg class=\"tic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"${d}\"\/><\/svg><\/span>`;\r\nconst tone=s=>s>=80?'ok':s>=50?'warn':'fail';\r\nconst grade=s=>s>=90?'A':s>=80?'B':s>=65?'C':s>=50?'D':'F';\r\nfunction ring(score,label,sm){const r=52,c=2*Math.PI*r,off=c*(1-score\/100);return `<div class=\"ring ${tone(score)}${sm?' sm':''}\"><svg viewBox=\"0 0 120 120\" role=\"img\" aria-label=\"Score ${score} out of 100\"><circle class=\"ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" fill=\"none\" stroke-width=\"10\"\/><circle class=\"ring-fg\" cx=\"60\" cy=\"60\" r=\"52\" fill=\"none\" stroke-width=\"10\" stroke-linecap=\"round\" stroke-dasharray=\"${c.toFixed(1)}\" stroke-dashoffset=\"${off.toFixed(1)}\" transform=\"rotate(-90 60 60)\"\/><\/svg><div class=\"ring-num\"><strong>${score}<\/strong><span>${esc(label||'out of 100')}<\/span><\/div><\/div>`}\r\nconst tile=(label,val,t)=>`<div class=\"tile ${t||''}\"><b>${val}<\/b><span>${esc(label)}<\/span><\/div>`;\r\nconst table=(heads,rows,cls)=>`<div class=\"tscroll\"><table${cls?` class=\"${cls}\"`:''}><thead><tr>${heads.map(h=>`<th${h.n?' class=\"num\"':''}>${h.t||h}<\/th>`).join('')}<\/tr><\/thead><tbody>${rows.join('')}<\/tbody><\/table><\/div>`;\r\nfunction bindSeg(root,cb){root.addEventListener('click',e=>{const b=e.target.closest('button[data-v]');if(!b)return;$$('button',root).forEach(x=>x.setAttribute('aria-checked',x===b?'true':'false'));cb(b.dataset.v)})}\r\nconst selectField=(id,label)=>`<label class=\"fld\"><span>${label}<\/span><select id=\"${id}\"><\/select><\/label>`;\r\n\r\n\/* ---------- text generator for the example site ---------- *\/\r\nfunction rng(a){return function(){a|=0;a=a+0x6D2B79F5|0;let t=Math.imul(a^a>>>15,1|a);t=t+Math.imul(t^t>>>7,61|t)^t;return((t^t>>>14)>>>0)\/4294967296}}\r\nconst SL={\r\n  A:['every batch','each small lot','the washed beans','our house blend','the natural process lot','every seasonal release','the morning roast'],\r\n  B:['sweetness','body','aroma','acidity','finish','clarity','balance'],\r\n  C:['bright','clean','rounded','lively','smooth','complex','steady'],\r\n  D:['packed','sealed','shipped','labeled','sorted','weighed','checked'],\r\n  E:['two','three','four','five','six','seven','nine'],\r\n  F:['stone fruit','dark chocolate','jasmine','toasted almond','red apple','brown sugar','citrus peel'],\r\n  H:['a pour over','a French press','an AeroPress','a moka pot','cold brew','a flat white','an espresso'],\r\n  J:['a medium grind','a coarse grind','a fine grind','medium-coarse','medium-fine','about the size of sea salt','slightly finer than sand'],\r\n  K:['in a cool cupboard','away from sunlight','in an airtight jar','away from the stove','at room temperature','out of the fridge','in its original valve bag']\r\n};\r\nconst TPL=[\r\n  (p,o)=>`We roast ${p('A')} in small lots so the ${p('B')} stays ${p('C')} from the first cup to the last.`,\r\n  (p,o)=>`Each bag is ${p('D')} within ${p('E')} days of roasting and sent straight to your door.`,\r\n  (p,o)=>`${o} beans bring notes of ${p('F')} and ${p('F')}, with a ${p('C')} ${p('B')} that holds up as the cup cools.`,\r\n  (p,o)=>`Our team cups ${p('A')} three times before it goes on sale, and we only keep the lots that taste ${p('C')}.`,\r\n  (p,o)=>`Brew it as ${p('H')} for a ${p('C')} cup with a long ${p('B')} and a clean finish.`,\r\n  (p,o)=>`Grind size matters, so start with ${p('J')} and adjust until the ${p('B')} tastes right to you.`,\r\n  (p,o)=>`Keep the bag ${p('K')} to protect the ${p('B')} for as long as possible.`,\r\n  (p,o)=>`Ask us about ${o} if you want something with ${p('F')} and a ${p('C')} ${p('B')}.`\r\n];\r\nfunction gen(seed,n,o){\r\n  const r=rng(seed),p=k=>{const a=SL[k==='F2'?'F':k];return a[Math.floor(r()*a.length)]};\r\n  let out=[],words=0,para=[];\r\n  while(words<n){const s=TPL[Math.floor(r()*TPL.length)](p,o||'single origin');para.push(s);words+=s.split(\/\\s+\/).length;if(para.length===4){out.push('<p>'+para.join(' ')+'<\/p>');para=[]}}\r\n  if(para.length)out.push('<p>'+para.join(' ')+'<\/p>');\r\n  return out.join('');\r\n}\r\nconst SB='https:\/\/brewhouse.example';\r\nconst NAV='<a href=\"\/\">Home<\/a> <a href=\"\/shop\/\">Shop<\/a> <a href=\"\/about\/\">About<\/a> <a href=\"\/blog\/\">Blog<\/a> <a href=\"\/contact\/\">Contact<\/a>';\r\nfunction mk(o){\r\n  return '<!doctype html><html'+(o.nolang?'':' lang=\"en\"')+'><head>'+(o.nocharset?'':'<meta charset=\"utf-8\">')+(o.title!=null?'<title>'+o.title+'<\/title>':'')+(o.desc?'<meta name=\"description\" content=\"'+o.desc+'\">':'')+(o.noviewport?'':'<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">')+(o.canon?'<link rel=\"canonical\" href=\"'+o.canon+'\">':'')+(o.robots?'<meta name=\"robots\" content=\"'+o.robots+'\">':'')+(o.og?'<meta property=\"og:title\" content=\"'+o.og+'\"><meta property=\"og:description\" content=\"Small-batch coffee roasted weekly.\"><meta property=\"og:image\" content=\"'+SB+'\/img\/og.jpg\"><meta name=\"twitter:card\" content=\"summary_large_image\">':'')+(o.ld?'<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"'+o.ld+'\",\"name\":\"Brewhouse Coffee Roasters\"}<\\\/script>':'')+'<link rel=\"icon\" href=\"\/favicon.ico\"><\/head><body><header><nav>'+NAV+'<\/nav><\/header><main>'+(o.h1?'<h1>'+o.h1+'<\/h1>':'')+o.body+'<\/main><footer><p>Brewhouse Coffee Roasters, Pune<\/p><\/footer><\/body><\/html>';\r\n}\r\nfunction sampleData(){\r\n  const pages=[\r\n    [SB+'\/',mk({title:'Brewhouse Coffee Roasters | Fresh Beans Delivered',desc:'Small-batch coffee roasted weekly in Pune and delivered to your door. Shop single origins, blends and brewing gear.',canon:SB+'\/',og:'Brewhouse Coffee Roasters',ld:'Organization',h1:'Fresh coffee, roasted this week',body:'<img fetchpriority=\"high\" decoding=\"async\" src=\"\/img\/hero-roaster.jpg\" alt=\"Roaster pouring beans into the cooling tray\" width=\"1200\" height=\"600\">'+gen(11,340,'Brewhouse')+'<img decoding=\"async\" src=\"\/img\/beans.png\"><p><a href=\"\/shop\/\">Shop all beans<\/a> <a href=\"\/blog\/brew-guide\/\">Read our brew guide<\/a> <a href=\"\/sale-2023\/\">Sale<\/a> <a href=\"#\">Gift cards<\/a> <a href=\"\/blog\/\">click here<\/a><\/p>'})],\r\n    [SB+'\/shop\/',mk({title:'Shop Coffee Beans | Brewhouse Coffee Roasters',desc:'Browse single origin coffees and house blends roasted to order in Pune, with free delivery on orders over 1,500 rupees.',canon:SB+'\/shop\/',og:'Shop Coffee Beans',h1:'Shop coffee beans',body:gen(21,320,'Ethiopia')+'<img loading=\"lazy\" decoding=\"async\" src=\"\/img\/bag-ethiopia.webp\" alt=\"Ethiopia Guji coffee bag\" width=\"600\" height=\"600\" loading=\"lazy\"><p><a href=\"\/shop\/ethiopia\/\">Ethiopia Guji<\/a> <a href=\"\/shop\/kenya\/\">Kenya AA<\/a> <a href=\"#reviews\">Read reviews<\/a> <a href=\"http:\/\/partner.example\/roasters\">Partner roaster<\/a><\/p>'})],\r\n    [SB+'\/shop\/ethiopia\/',mk({title:'Single Origin Coffee Beans | Brewhouse Coffee Roasters',desc:'Buy single origin coffee beans roasted fresh in small batches.',canon:SB+'\/shop\/ethiopia\/',h1:'Ethiopia Guji Natural',body:gen(31,330,'Ethiopia')+'<img decoding=\"async\" src=\"\/img\/ethiopia-1.jpg\"><img decoding=\"async\" src=\"\/img\/ethiopia-2.jpg\" alt=\"\">'+'<p><a href=\"\/shop\/\">Back to the shop<\/a><\/p>'})],\r\n    [SB+'\/shop\/kenya\/',mk({title:'Single Origin Coffee Beans | Brewhouse Coffee Roasters',desc:'Buy single origin coffee beans roasted fresh in small batches.',canon:SB+'\/shop\/kenya\/',h1:'Kenya AA Washed',body:gen(31,330,'Kenya')+'<img decoding=\"async\" src=\"\/img\/kenya-1.jpg\" alt=\"Kenya AA coffee beans\" width=\"800\" height=\"600\"><p><a href=\"\/shop\/\">Back to the shop<\/a><\/p>'})],\r\n    [SB+'\/about\/',mk({title:'About Brewhouse | Our Story and Roasters',h1:'Our story',nolang:true,body:gen(41,160,'Brewhouse')+'<h4>Meet the roasters<\/h4>'+gen(42,150,'Brewhouse')+'<img loading=\"lazy\" decoding=\"async\" src=\"\/img\/team.jpg\" alt=\"IMG_2043.jpg\" width=\"900\" height=\"600\"><p><a href=\"\/contact\/\">Get in touch<\/a><\/p>'})],\r\n    [SB+'\/blog\/',mk({title:'Coffee Blog | Brewhouse Coffee Roasters',desc:'Brewing tips, roast notes and farm stories from the Brewhouse team in Pune.',canon:SB+'\/blog\/',og:'Coffee Blog',h1:'The Brewhouse journal',body:gen(51,320,'Brewhouse')+'<p><a href=\"\/blog\/brew-guid\/\">How to brew better coffee<\/a> <a href=\"\/blog\/brew-guide\/\">Brew guide<\/a> <a href=\"https:\/\/sca.example\/standards\">Industry standards<\/a><\/p>'})],\r\n    [SB+'\/blog\/brew-guide\/',mk({title:'How to Brew Better Coffee at Home | Brewhouse Coffee Roasters',desc:'A practical guide to grind size, water temperature and brew ratio, with simple recipes for pour over, French press and AeroPress.',canon:SB+'\/blog\/brew-guide\/',og:'How to Brew Better Coffee at Home',ld:'Article',h1:'How to brew better coffee at home',body:'<h2>Start with fresh beans<\/h2>'+gen(61,230,'Ethiopia')+'<h2>Dial in your grind<\/h2>'+gen(62,230,'Kenya')+'<h2>Control water and time<\/h2>'+gen(63,240,'Brewhouse')+'<img loading=\"lazy\" decoding=\"async\" src=\"\/img\/pour-over.jpg\" alt=\"Pouring hot water over coffee in a V60\" width=\"1000\" height=\"700\" loading=\"lazy\"><p>Ready to try it? <a href=\"\/shop\/\">Shop single origin beans<\/a>.<\/p>'})],\r\n    [SB+'\/blog\/old-roast-notes\/',mk({title:'Roast notes',h1:'Roast notes 2021',body:gen(71,55,'Brewhouse')})],\r\n    [SB+'\/contact\/',mk({title:'Contact Brewhouse Coffee Roasters in Pune',desc:'Visit the roastery, call us or send a message. We reply to every email within one working day.',canon:SB+'\/contact\/',h1:'Contact us',body:gen(81,110,'Brewhouse')+'<p><a href=\"mailto:hello@brewhouse.example\">hello@brewhouse.example<\/a> <a href=\"tel:+910200000000\">Call the roastery<\/a><\/p>'})]\r\n  ];\r\n  const map=pages.map(p=>p[0]).concat([SB+'\/gift-cards\/']).join('\\n');\r\n  return {pages,map};\r\n}\r\n\r\n\/* ---------- parsing ---------- *\/\r\nconst GENERIC=\/^(click here|here|read more|more|learn more|link|this|this link|details|click|see more)$\/i;\r\nconst ASSET=\/\\.(pdf|jpe?g|png|gif|webp|avif|svg|ico|css|js|json|xml|txt|zip|mp4|mp3|woff2?|docx?|xlsx?|csv)$\/i;\r\nconst cleanTxt=s=>String(s||'').replace(\/\\s+\/g,' ').trim();\r\nfunction parseHtml(html){\r\n  const doc=new DOMParser().parseFromString(html,'text\/html');\r\n  const meta=n=>{const m=doc.querySelector('meta[name=\"'+n+'\" i]');return m?cleanTxt(m.getAttribute('content')):null};\r\n  const prop=n=>{const m=doc.querySelector('meta[property=\"'+n+'\" i]');return m?cleanTxt(m.getAttribute('content')):null};\r\n  const titleEl=doc.querySelector('title');\r\n  const heads=$$('h1,h2,h3,h4,h5,h6',doc).map(h=>({level:+h.tagName[1],text:cleanTxt(h.textContent)}));\r\n  const canon=$$('link[rel~=\"canonical\" i]',doc).map(l=>(l.getAttribute('href')||'').trim());\r\n  const root=doc.body?doc.body.cloneNode(true):doc.createElement('body');\r\n  $$('script,style,noscript,template,svg',root).forEach(e=>e.remove());\r\n  let region=root.querySelector('main,[role=\"main\"],article');\r\n  if(!region){region=root;$$('nav,header,footer,aside,[role=\"navigation\"]',region).forEach(e=>e.remove())}\r\n  const text=cleanTxt(region.textContent);\r\n  const words=text?text.split(' ').filter(w=>\/[\\p{L}\\p{N}]\/u.test(w)).length:0;\r\n  const ids=new Set([...$$('[id]',doc).map(e=>e.id),...$$('a[name]',doc).map(a=>a.getAttribute('name'))]);\r\n  const links=$$('a[href]',doc).map(a=>({href:(a.getAttribute('href')||'').trim(),text:cleanTxt(a.textContent)||cleanTxt((a.querySelector('img')||{getAttribute(){return ''}}).getAttribute('alt'))||cleanTxt(a.getAttribute('aria-label')),nofollow:\/nofollow\/i.test(a.getAttribute('rel')||'')}));\r\n  const imgs=$$('img',doc).map(i=>({src:(i.getAttribute('src')||i.getAttribute('data-src')||'').trim(),alt:i.hasAttribute('alt')?i.getAttribute('alt'):null,w:i.getAttribute('width'),h:i.getAttribute('height'),lazy:\/lazy\/i.test(i.getAttribute('loading')||''),srcset:!!i.getAttribute('srcset')}));\r\n  const ld=$$('script[type=\"application\/ld+json\" i]',doc).map(s=>{try{const j=JSON.parse(s.textContent);const t=(Array.isArray(j)?j:[j]).map(x=>x&&x['@type']).flat().filter(Boolean);return{ok:true,types:t}}catch(e){return{ok:false,types:[]}}});\r\n  const httpRes=$$('img[src],script[src],link[rel~=\"stylesheet\"][href],iframe[src]',doc).filter(e=>\/^http:\\\/\\\/\/i.test(e.getAttribute('src')||e.getAttribute('href')||'')).length;\r\n  return {title:titleEl?cleanTxt(titleEl.textContent):'',desc:meta('description'),robots:((meta('robots')||'')+' '+(meta('googlebot')||'')).toLowerCase(),canon,\r\n    viewport:meta('viewport'),lang:doc.documentElement.getAttribute('lang'),charset:!!doc.querySelector('meta[charset],meta[http-equiv=\"content-type\" i]'),\r\n    og:{title:prop('og:title'),desc:prop('og:description'),image:prop('og:image')},twitter:meta('twitter:card'),favicon:!!doc.querySelector('link[rel~=\"icon\" i]'),\r\n    heads,h1s:heads.filter(h=>h.level===1).map(h=>h.text),text,words,htmlLen:html.length,ids,links,imgs,ld,httpRes};\r\n}\r\n\r\n\/* ---------- state + link graph ---------- *\/\r\nconst S={pages:[],extra:[],sample:false,nextId:1,ver:0,sel:{},tool:null,pgOpen:null,pgTab:'paste'};\r\nfunction normKey(u){try{const x=new URL(u);const h=x.hostname.toLowerCase().replace(\/^www\\.\/,'');let p=x.pathname.replace(\/\\\/index\\.html?$\/i,'\/').replace(\/\\.html?$\/i,'').replace(\/\\\/+$\/,'').toLowerCase();return h+p}catch(e){return null}}\r\nfunction addPage(html,url){\r\n  const raw=parseHtml(html);\r\n  let u=(url||'').trim()||(raw.canon[0]||'');\r\n  if(!u)throw new Error('Add the page address so links can be matched to it.');\r\n  if(!\/^[a-z][a-z0-9+.-]*:\\\/\\\/\/i.test(u))u='https:\/\/'+u;\r\n  let parsed;try{parsed=new URL(u)}catch(e){throw new Error('That page address is not valid. Use a full address such as https:\/\/yoursite.com\/page\/.')}\r\n  const key=normKey(parsed.href);\r\n  const i=S.pages.findIndex(p=>p.key===key);\r\n  const page={id:S.nextId++,url:parsed.href,key,raw};\r\n  if(i>-1)S.pages[i]=page;else S.pages.push(page);\r\n  return page;\r\n}\r\nfunction leaveSample(){if(S.sample){S.pages=[];S.extra=[];S.sample=false;const m=$('#pgMap');if(m)m.value=''}}\r\nfunction recompute(){\r\n  S.ver++;\r\n  const hosts=new Set();\r\n  S.pages.forEach(p=>{try{hosts.add(new URL(p.url).hostname.toLowerCase().replace(\/^www\\.\/,''))}catch(e){}});\r\n  const map=new Map();S.pages.forEach(p=>map.set(p.key,p));\r\n  const extra=new Set(S.extra.map(normKey).filter(Boolean));\r\n  S.map=map;S.extraKeys=extra;\r\n  const inKeys=new Map();\r\n  S.pages.forEach(p=>{\r\n    p._a=null;p._c=null;p._sh=null;\r\n    p.links=p.raw.links.map(l=>{\r\n      const o={href:l.href,text:l.text,nofollow:l.nofollow,kind:'internal'};\r\n      const h=l.href;\r\n      if(!h||h==='#'){o.kind='placeholder';return o}\r\n      if(\/^javascript:\/i.test(h)){o.kind='placeholder';return o}\r\n      if(\/^mailto:\/i.test(h)){o.kind='mailto';return o}\r\n      if(\/^tel:\/i.test(h)){o.kind='tel';return o}\r\n      if(h[0]==='#'){o.kind='anchor';let a=h.slice(1);try{a=decodeURIComponent(a)}catch(e){}o.anchorMissing=!(p.raw.ids.has(a)||p.raw.ids.has(h.slice(1))||a==='top');return o}\r\n      let u;try{u=new URL(h,p.url)}catch(e){o.kind='malformed';return o}\r\n      if(!\/^https?:$\/.test(u.protocol)){o.kind='other';return o}\r\n      o.abs=u.href;o.insecure=u.protocol==='http:';\r\n      const host=u.hostname.toLowerCase().replace(\/^www\\.\/,'');\r\n      if(!hosts.has(host)){o.kind='external';o.host=host;return o}\r\n      o.key=normKey(u.href);o.target=map.get(o.key)||null;o.known=!!o.target||extra.has(o.key);o.asset=ASSET.test(u.pathname);\r\n      if(u.hash&&o.target&&u.hash.length>1){let a=u.hash.slice(1);try{a=decodeURIComponent(a)}catch(e){}o.anchorMissing=!o.target.raw.ids.has(a)}\r\n      if(o.key){if(!inKeys.has(o.key))inKeys.set(o.key,new Set());if(o.key!==p.key)inKeys.get(o.key).add(p.id)}\r\n      return o;\r\n    });\r\n  });\r\n  S.inKeys=inKeys;\r\n  S.pages.forEach(p=>{p.inbound=[...(inKeys.get(p.key)||[])].map(id=>S.pages.find(x=>x.id===id)).filter(Boolean)});\r\n  \/\/ crawl depth by breadth-first search from the home page\r\n  S.home=S.pages.find(p=>{try{return new URL(p.url).pathname.replace(\/index\\.html?$\/i,'')==='\/'}catch(e){return false}})||S.pages[0]||null;\r\n  S.pages.forEach(p=>p.depth=null);\r\n  if(S.home){S.home.depth=0;const q=[S.home];while(q.length){const c=q.shift();c.links.forEach(l=>{if(l.target&&l.target.depth===null){l.target.depth=c.depth+1;q.push(l.target)}})}}\r\n  S.dup={title:groupBy('title'),desc:groupBy('desc'),h1:groupBy('h1')};\r\n}\r\nfunction groupBy(kind){\r\n  const m=new Map(),missing=[];\r\n  S.pages.forEach(p=>{const v=cleanTxt(kind==='h1'?(p.raw.h1s[0]||''):kind==='title'?p.raw.title:(p.raw.desc||''));if(!v){missing.push(p);return}const k=v.toLowerCase();if(!m.has(k))m.set(k,{text:v,pages:[]});m.get(k).pages.push(p)});\r\n  return {dups:[...m.values()].filter(g=>g.pages.length>1).sort((a,b)=>b.pages.length-a.pages.length),missing};\r\n}\r\nconst isOrphan=p=>p!==S.home&&p.inbound.length===0;\r\n\r\n\/* ---------- audit checks ---------- *\/\r\nfunction auditChecks(p){\r\n  if(p._a)return p._a;\r\n  const r=p.raw,L=p.links,o=[];\r\n  const add=(key,cat,name,status,detail,fix,w,crawl)=>o.push({key,cat,name,status,detail,fix:fix||'',w:w===undefined?1:w,crawl:!!crawl});\r\n  const tl=r.title.length;\r\n  add('title','On-page','Title tag',!tl?'fail':(tl<30||tl>60)?'warn':'pass',!tl?'No title tag found.':`${tl} characters: \"${r.title}\"`+(tl>60?'. It will likely be cut off in search results.':tl<30?'. It is short and may miss useful keywords.':''),'Write a unique title of 30 to 60 characters. Lead with the main topic and end with your brand name.',3,1);\r\n  const dl=r.desc==null?0:r.desc.length;\r\n  add('desc','On-page','Meta description',!dl?'warn':(dl<70||dl>160)?'warn':'pass',!dl?'No meta description found. Search engines will pick text from the page instead.':`${dl} characters`+(dl>160?'. It will likely be truncated.':dl<70?'. It is short, so you are not using the space to earn the click.':'.'),'Write a unique description of 70 to 160 characters that says what the page offers and invites the click.',2,1);\r\n  const h1n=r.h1s.length;\r\n  add('h1','On-page','H1 heading',h1n===0?'fail':h1n>1?'warn':'pass',h1n===0?'No H1 heading found.':h1n>1?`${h1n} H1 headings found. Use one per page.`:`\"${r.h1s[0]}\"`,'Use exactly one H1 that states the topic of the page. Use H2 and H3 for the sections below it.',3,1);\r\n  let skip=null,prev=0;r.heads.forEach(h=>{if(prev&&h.level>prev+1&&!skip)skip=`H${prev} is followed by H${h.level}`;prev=h.level});\r\n  add('headings','On-page','Heading order',skip?'warn':'pass',skip?`Heading levels are skipped: ${skip}.`:`${r.heads.length} headings in a logical order.`,'Do not jump levels. Put an H2 between an H1 and an H3.',1);\r\n  add('content','On-page','Content length',r.words<150?'fail':r.words<300?'warn':'pass',`${fmt(r.words)} words of main content.`+(r.words<300?' Pages this short rarely satisfy a search.':''),'Expand the page until it fully answers the question a visitor came with. Add detail, examples, FAQs or images with captions.',3,1);\r\n  const cn=r.canon.length;let cst='pass',cd='Canonical points to this page.';\r\n  if(!cn){cst='warn';cd='No canonical tag found.'}else if(cn>1){cst='fail';cd=`${cn} canonical tags found. Only one is allowed.`}\r\n  else{const ck=(()=>{try{return normKey(new URL(r.canon[0],p.url).href)}catch(e){return null}})();if(ck&&ck!==p.key){cst='info';cd='Canonical points to another page: '+r.canon[0]}}\r\n  add('canonical','Technical','Canonical tag',cst,cd,'Add one self-referencing canonical link in the head so duplicate URLs resolve to this page.',2,1);\r\n  const noidx=\/noindex\/.test(r.robots);\r\n  add('index','Technical','Indexability',noidx?'fail':'pass',noidx?'The robots meta tag contains noindex. Search engines will drop this page.':'No noindex directive found.','Remove noindex from the robots meta tag if this page should appear in search.',3,1);\r\n  add('viewport','Technical','Mobile viewport',r.viewport?'pass':'fail',r.viewport?'Viewport tag present.':'No viewport meta tag. The page will not scale on phones.','Add <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> to the head.',3,1);\r\n  add('lang','Technical','Language attribute',r.lang?'pass':'warn',r.lang?`lang=\"${r.lang}\"`:'The html tag has no lang attribute.','Add lang=\"en\" (or your language code) to the html tag.',1);\r\n  add('charset','Technical','Character set',r.charset?'pass':'warn',r.charset?'Character set declared.':'No charset declaration found.','Add <meta charset=\"utf-8\"> as the first tag in the head.',1);\r\n  const isHttps=\/^https:\/i.test(p.url);\r\n  add('https','Technical','HTTPS',isHttps?'pass':'warn',isHttps?'Page address uses HTTPS.':'Page address uses http:\/\/.','Install a certificate and redirect every http:\/\/ address to https:\/\/.',2);\r\n  add('mixed','Technical','Mixed content',(isHttps&&r.httpRes)?'fail':'pass',(isHttps&&r.httpRes)?`${r.httpRes} resources load over http:\/\/ on an https page.`:'No insecure resources found.','Change every http:\/\/ image, script and stylesheet address to https:\/\/.',2);\r\n  const bad=r.ld.filter(x=>!x.ok).length;\r\n  add('schema','Technical','Structured data',bad?'fail':r.ld.length?'pass':'warn',bad?`${bad} JSON-LD block(s) contain invalid JSON.`:r.ld.length?'Found: '+[...new Set(r.ld.flatMap(x=>x.types))].join(', '):'No JSON-LD structured data found.','Add schema.org markup that matches the page, such as Organization, Article, Product or FAQPage.',1);\r\n  add('favicon','Technical','Favicon',r.favicon?'pass':'info',r.favicon?'Favicon link present.':'No favicon link in the head.','Add <link rel=\"icon\" href=\"\/favicon.ico\"> so your brand shows in browser tabs and results.',0);\r\n  const ogN=['title','desc','image'].filter(k=>r.og[k]).length;\r\n  add('og','Social','Open Graph tags',ogN===3?'pass':'warn',ogN===3?'og:title, og:description and og:image are set.':`${ogN} of 3 Open Graph tags found (og:title, og:description, og:image).`,'Add all three tags so links shared on Facebook, LinkedIn and WhatsApp show a proper preview.',1);\r\n  add('twitter','Social','Twitter card',r.twitter?'pass':'warn',r.twitter?`twitter:card is \"${r.twitter}\".`:'No twitter:card tag.','Add <meta name=\"twitter:card\" content=\"summary_large_image\">.',1);\r\n  const noAlt=r.imgs.filter(i=>i.alt===null).length;\r\n  add('alt','Images','Image alt text',!r.imgs.length?'pass':noAlt?'fail':'pass',!r.imgs.length?'No images on this page.':noAlt?`${noAlt} of ${r.imgs.length} images have no alt attribute.`:`All ${r.imgs.length} images have an alt attribute.`,'Describe each image in a short phrase. Use alt=\"\" only for purely decorative images.',2,1);\r\n  const noDim=r.imgs.filter(i=>!(i.w&&i.h)).length;\r\n  add('dims','Images','Image dimensions',noDim?'warn':'pass',noDim?`${noDim} of ${r.imgs.length} images have no width and height. The page will jump while loading.`:'Images declare width and height.','Add width and height attributes so the browser reserves space before the image loads.',1);\r\n  const internal=L.filter(l=>l.kind==='internal'&&!l.asset);\r\n  add('intlinks','Links','Internal links',internal.length?'pass':'warn',internal.length?`${internal.length} internal links.`:'No internal links to other pages.','Link to related pages with descriptive anchor text so visitors and crawlers can move on.',1);\r\n  const ph=L.filter(l=>l.kind==='placeholder'||(!l.text&&l.kind!=='anchor')).length;\r\n  add('placeholder','Links','Empty or placeholder links',ph?'warn':'pass',ph?`${ph} link(s) go nowhere (# or javascript:) or have no text.`:'No empty or placeholder links.','Point each link to a real address and give it readable text.',1);\r\n  const gen=L.filter(l=>GENERIC.test(l.text)).length;\r\n  add('anchortext','Links','Anchor text',gen?'warn':'pass',gen?`${gen} link(s) use vague text such as \"click here\".`:'Link text is descriptive.','Replace \"click here\" with words that describe the destination, such as \"view our brew guide\".',1);\r\n  if(S.pages.length>1){\r\n    const br=L.filter(l=>l.kind==='internal'&&!l.asset&&!l.known).length;\r\n    add('broken','Links','Broken internal links',br?'fail':'pass',br?`${br} internal link(s) point to addresses that are not among your loaded pages or sitemap.`:'All internal links match a loaded page.','Fix the address, redirect it, or remove the link. Use the Broken Link Checker for details.',3,1);\r\n  }\r\n  p._a=o;return o;\r\n}\r\nfunction auditScore(checks){let g=0,t=0;checks.forEach(c=>{if(c.status==='info'||!c.w)return;t+=c.w;g+=c.w*(c.status==='pass'?1:c.status==='warn'?.5:0)});return t?Math.round(g\/t*100):0}\r\nfunction crawlIssues(p){\r\n  if(p._c)return p._c;\r\n  const o=[];\r\n  auditChecks(p).forEach(c=>{if(c.crawl&&(c.status==='fail'||c.status==='warn'))o.push({sev:c.status,type:c.name,msg:c.detail})});\r\n  p.links.forEach(l=>{if(l.kind==='internal'&&!l.asset&&!l.known)o.push({sev:'fail',type:'Broken internal link',msg:`${l.href} (${l.text||'no text'})`});if(l.anchorMissing)o.push({sev:'warn',type:'Broken anchor',msg:l.href})});\r\n  if(isOrphan(p))o.push({sev:'warn',type:'Orphan page',msg:'No other loaded page links here.'});\r\n  [['title','Duplicate title'],['desc','Duplicate meta description'],['h1','Duplicate H1']].forEach(([k,t])=>{const g=S.dup[k].dups.find(g=>g.pages.includes(p));if(g)o.push({sev:'warn',type:t,msg:`Shared with ${g.pages.length-1} other page(s).`})});\r\n  \/\/ merge: broken-link checks from audit duplicate the per-link rows, so keep per-link rows only\r\n  p._c=o.filter(i=>i.type!=='Broken internal links');return p._c;\r\n}\r\n\r\n\/* ---------- near-duplicate text ---------- *\/\r\nfunction shingles(text,n){const w=(text.toLowerCase().match(\/[\\p{L}\\p{N}']+\/gu))||[];const s=new Set();if(w.length<n){if(w.length)s.add(w.join(' '));return s}for(let i=0;i<=w.length-n;i++)s.add(w.slice(i,i+n).join(' '));return s}\r\nfunction jaccard(a,b){if(!a.size||!b.size)return 0;let i=0;const[s,l]=a.size<b.size?[a,b]:[b,a];s.forEach(x=>{if(l.has(x))i++});return i\/(a.size+b.size-i)}\r\nconst shOf=p=>p._sh||(p._sh=shingles(p.raw.text,5));\r\n\r\n\/* ---------- tools ---------- *\/\r\nconst emptyState=()=>`<div class=\"empty\"><h3>No pages loaded yet<\/h3><p>Add a page above, or load the example site to see this tool at work.<\/p><button class=\"btn primary\" type=\"button\" data-act=\"sample\">Load the example site<\/button><\/div>`;\r\nconst GENERIC_NOTE='Runs in your browser on the page source you add. Nothing is uploaded.';\r\nfunction fillSelect(el,key,all){\r\n  const stamp=String(S.ver);if(el.dataset.ver===stamp)return;el.dataset.ver=stamp;\r\n  const cur=S.sel[key];\r\n  el.innerHTML=(all?`<option value=\"all\">All pages (${S.pages.length})<\/option>`:'')+S.pages.map(p=>`<option value=\"${p.id}\">${esc(pathOf(p.url))}${p.raw.title?' | '+esc(short(p.raw.title,44)):''}<\/option>`).join('');\r\n  const ok=Array.from(el.options).some(o=>o.value===String(cur));\r\n  el.value=ok?String(cur):(all?'all':(S.pages[0]?String(S.pages[0].id):''));S.sel[key]=el.value;\r\n}\r\nconst selPage=key=>S.pages.find(p=>String(p.id)===String(S.sel[key]))||S.pages[0];\r\nconst selPages=key=>S.sel[key]==='all'||!S.sel[key]?S.pages:S.pages.filter(p=>String(p.id)===String(S.sel[key]));\r\n\r\nconst TOOLS=[\r\n\/* 1 ---- audit *\/\r\n{id:'audit',scope:'page',name:'Free Website SEO Audit',desc:'Score a page out of 100 and get a fix list covering titles, headings, links, images and technical tags.',icon:'M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6zM9 12l2 2 4-4',needs:true,\r\n shell:()=>`<div class=\"controls\">${selectField('auSel','Page to audit')}<label class=\"switch\"><input type=\"checkbox\" id=\"auOnly\"><span>Show only problems<\/span><\/label><\/div><div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div>`,\r\n bind(){$('#auSel').addEventListener('change',e=>{S.sel.audit=e.target.value;this.run()});$('#auOnly').addEventListener('change',()=>this.run())},\r\n run(){\r\n  const out=$('#out');if(!S.pages.length){out.innerHTML=emptyState();return}\r\n  fillSelect($('#auSel'),'audit',false);\r\n  const p=selPage('audit'),checks=auditChecks(p),score=auditScore(checks),only=$('#auOnly').checked;\r\n  const n=s=>checks.filter(c=>c.status===s).length;\r\n  const cats=[...new Set(checks.map(c=>c.cat))];\r\n  const ord={fail:0,warn:1,info:2,pass:3};\r\n  out.innerHTML=`<div class=\"scorecard\">${ring(score)}<div class=\"meta\"><div class=\"tag\" style=\"align-self:flex-start\">Grade ${grade(score)}<\/div><h2>${esc(p.raw.title||pathOf(p.url))}<\/h2><p class=\"muted mono\" style=\"word-break:break-all\">${esc(p.url)}<\/p><div class=\"tally\">${n('fail')?pill('fail',n('fail')+' to fix'):''}${n('warn')?pill('warn',n('warn')+' warnings'):''}${pill('pass',n('pass')+' passed')}${n('info')?pill('info',n('info')+' notes'):''}<\/div><\/div><\/div>`+\r\n  cats.map(cat=>{\r\n    const list=checks.filter(c=>c.cat===cat&&(!only||c.status!=='pass')).sort((a,b)=>ord[a.status]-ord[b.status]);\r\n    if(!list.length)return '';\r\n    return `<section class=\"cat\"><h3>${esc(cat)} <small>${checks.filter(c=>c.cat===cat&&c.status==='pass').length} of ${checks.filter(c=>c.cat===cat).length} passed<\/small><\/h3><ul class=\"clist\">${list.map(c=>`<li><div class=\"cr-h\">${pill(c.status)}<b>${esc(c.name)}<\/b><\/div><p class=\"cr-d\">${esc(c.detail)}<\/p>${c.fix&&c.status!=='pass'?`<p class=\"cr-f\"><span>How to fix<\/span>${esc(c.fix)}<\/p>`:''}<\/li>`).join('')}<\/ul><\/section>`}).join('')||`<div class=\"okbox\">No problems found on this page.<\/div>`;\r\n }},\r\n\/* 2 ---- broken links *\/\r\n{id:'links',scope:'page',name:'Broken Link Checker',desc:'Find internal links that lead nowhere, missing anchors, placeholder links and insecure addresses.',icon:'M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7M4 4l16 16',needs:true,\r\n shell:()=>`<div class=\"controls\">${selectField('blSel','Check links on')}<\/div><div class=\"chips\" id=\"blChips\" role=\"group\" aria-label=\"Filter by problem\"><\/div><div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div>`,\r\n filter:'all',\r\n bind(){$('#blSel').addEventListener('change',e=>{S.sel.links=e.target.value;this.run()});$('#blChips').addEventListener('click',e=>{const b=e.target.closest('button[data-f]');if(!b)return;this.filter=b.dataset.f;this.run()})},\r\n run(){\r\n  const out=$('#out');if(!S.pages.length){out.innerHTML=emptyState();$('#blChips').innerHTML='';return}\r\n  fillSelect($('#blSel'),'links',true);\r\n  const pages=selPages('links');const probs=[],ext=new Map();let total=0,internal=0;\r\n  pages.forEach(p=>p.links.forEach(l=>{\r\n    total++;const where=pathOf(p.url);\r\n    if(l.kind==='internal'){internal++;\r\n      if(!l.asset&&!l.known)probs.push({t:'broken',lab:'Not found',st:'fail',where,text:l.text,target:l.href,fix:'No loaded page or sitemap entry matches this address. Correct the spelling, redirect the old address, or remove the link.'});\r\n      if(l.anchorMissing)probs.push({t:'anchor',lab:'Anchor missing',st:'warn',where,text:l.text,target:l.href,fix:'The page has no element with this id. Add the id to the heading or section, or fix the link.'});\r\n      if(l.insecure)probs.push({t:'insecure',lab:'Insecure http:\/\/',st:'warn',where,text:l.text,target:l.href,fix:'Change the link to https:\/\/.'});\r\n    }else if(l.kind==='anchor'){if(l.anchorMissing)probs.push({t:'anchor',lab:'Anchor missing',st:'warn',where,text:l.text,target:l.href,fix:'The page has no element with this id. Add the id or fix the link.'})}\r\n    else if(l.kind==='placeholder')probs.push({t:'placeholder',lab:'Placeholder link',st:'warn',where,text:l.text,target:l.href||'(empty)',fix:'Point the link to a real page or remove it. Links to # do not help visitors or crawlers.'});\r\n    else if(l.kind==='malformed')probs.push({t:'broken',lab:'Malformed address',st:'fail',where,text:l.text,target:l.href,fix:'The address cannot be read. Check for spaces or missing characters.'});\r\n    else if(l.kind==='external'){const k=l.abs;if(!ext.has(k))ext.set(k,{url:k,host:l.host,n:0,insecure:l.insecure});ext.get(k).n++;if(l.insecure)probs.push({t:'insecure',lab:'Insecure http:\/\/',st:'warn',where,text:l.text,target:l.href,fix:'Use the https:\/\/ version of the address if the site offers one.'})}\r\n    if((l.kind==='internal'||l.kind==='external')&&!l.text)probs.push({t:'emptytext',lab:'No link text',st:'warn',where,text:'',target:l.href,fix:'Add visible text or an aria-label so the link has an anchor text.'});\r\n  }));\r\n  const cnt=t=>probs.filter(x=>x.t===t).length;\r\n  const defs=[['all','All problems',probs.length],['broken','Not found',cnt('broken')],['anchor','Anchors',cnt('anchor')],['placeholder','Placeholders',cnt('placeholder')],['insecure','Insecure',cnt('insecure')],['emptytext','No text',cnt('emptytext')]];\r\n  if(!defs.some(d=>d[0]===this.filter))this.filter='all';\r\n  $('#blChips').innerHTML=defs.map(d=>`<button type=\"button\" class=\"chip\" data-f=\"${d[0]}\" aria-pressed=\"${this.filter===d[0]}\">${d[1]} (${d[2]})<\/button>`).join('');\r\n  const shown=probs.filter(x=>this.filter==='all'||x.t===this.filter);\r\n  const bad=cnt('broken');\r\n  out.innerHTML=`<div class=\"tiles\">${tile('Links checked',fmt(total))}${tile('Internal links',fmt(internal))}${tile('Not found',bad,bad?'fail':'ok')}${tile('Other problems',probs.length-bad,probs.length-bad?'warn':'ok')}${tile('External to verify',ext.size)}<\/div>`+\r\n  (shown.length?`<section class=\"sec\"><h3>Problems found<\/h3>${table(['Problem','Found on','Link text','Address','How to fix'],shown.map(x=>`<tr><td>${pill(x.st,x.lab)}<\/td><td><span class=\"u\">${esc(x.where)}<\/span><\/td><td>${esc(x.text||'None')}<\/td><td><span class=\"u\">${esc(x.target)}<\/span><\/td><td>${esc(x.fix)}<\/td><\/tr>`))}<\/section>`:`<div class=\"okbox\">${probs.length?'No problems in this category.':`No broken links found among ${fmt(total)} links.`}<\/div>`)+\r\n  (ext.size?`<section class=\"sec\"><h3>External links to verify<\/h3><p class=\"sec-sub\">A browser cannot read another site's response, so open these to confirm they still load.<\/p>${table(['Site','Address','Used','Open'],[...ext.values()].map(e=>`<tr><td>${esc(e.host)}<\/td><td><span class=\"u\">${esc(e.url)}<\/span><\/td><td class=\"num\">${e.n}<\/td><td><a href=\"${esc(e.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">Open link<\/a><\/td><\/tr>`))}<\/section>`:'')+\r\n  `<div class=\"callout\"><b>How this check works.<\/b> Internal links are matched against the pages and sitemap you loaded. A link is flagged when no loaded page has that address, so load every page of the site (or paste your sitemap) for an accurate result.<\/div>`;\r\n }},\r\n\/* 3 ---- crawler *\/\r\n{id:'crawler',scope:'site',name:'Full Site Crawler',desc:'Crawl every loaded page, follow its links and list titles, depth, word counts and issues in one table.',icon:'M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zM3 12h18M12 3c3.2 3 3.2 15 0 18M12 3c-3.2 3-3.2 15 0 18',needs:true,\r\n st:{sort:'issues',dir:-1,q:'',only:false,type:'',open:new Set()},\r\n shell:()=>`<div class=\"controls\"><label class=\"fld\"><span>Filter by address or title<\/span><input type=\"search\" id=\"crQ\" placeholder=\"Type to filter pages\"><\/label><label class=\"switch\"><input type=\"checkbox\" id=\"crOnly\"><span>Only pages with issues<\/span><\/label><button type=\"button\" class=\"btn ghost\" id=\"crCopy\">Copy as CSV<\/button><\/div><div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div>`,\r\n bind(){const st=this.st;$('#crQ').value=st.q;$('#crOnly').checked=st.only;\r\n  $('#crQ').addEventListener('input',e=>{st.q=e.target.value;this.run()});$('#crOnly').addEventListener('change',e=>{st.only=e.target.checked;this.run()});\r\n  $('#crCopy').addEventListener('click',()=>{const q=s=>'\"'+String(s).replace(\/\"\/g,'\"\"')+'\"';const rows=[['URL','Title','Words','Depth','Inbound links','Internal links out','Issues','Warnings']].concat(S.pages.map(p=>{const is=crawlIssues(p);return[p.url,p.raw.title,p.raw.words,p.depth===null?'':p.depth,p.inbound.length,p.links.filter(l=>l.kind==='internal'&&l.target).length,is.filter(i=>i.sev==='fail').length,is.filter(i=>i.sev==='warn').length]}));copyText(rows.map(r=>r.map(q).join(',')).join('\\n'),'CSV copied')});\r\n  $('#out').addEventListener('click',e=>{const s=e.target.closest('[data-sort]');if(s){const k=s.dataset.sort;if(st.sort===k)st.dir*=-1;else{st.sort=k;st.dir=(k==='path'||k==='title')?1:-1}this.run();return}\r\n   const r=e.target.closest('[data-row]');if(r){const id=+r.dataset.row;st.open.has(id)?st.open.delete(id):st.open.add(id);this.run();return}\r\n   const t=e.target.closest('[data-type]');if(t){st.type=st.type===t.dataset.type?'':t.dataset.type;this.run();return}\r\n   if(e.target.closest('[data-clear]')){st.type='';this.run()}})},\r\n run(){\r\n  const out=$('#out'),st=this.st;if(!S.pages.length){out.innerHTML=emptyState();return}\r\n  const t0=performance.now();\r\n  const rows=S.pages.map(p=>{const is=crawlIssues(p);return{p,is,crit:is.filter(i=>i.sev==='fail').length,warn:is.filter(i=>i.sev==='warn').length,out:p.links.filter(l=>l.kind==='internal'&&l.target).length}});\r\n  const types=new Map();rows.forEach(r=>r.is.forEach(i=>{if(!types.has(i.type))types.set(i.type,{sev:i.sev,n:0,pages:new Set()});const t=types.get(i.type);t.n++;t.pages.add(r.p.id);if(i.sev==='fail')t.sev='fail'}));\r\n  const q=st.q.trim().toLowerCase();\r\n  let list=rows.filter(r=>(!q||(r.p.url+' '+r.p.raw.title).toLowerCase().includes(q))&&(!st.only||r.is.length)&&(!st.type||r.is.some(i=>i.type===st.type)));\r\n  const val={path:r=>pathOf(r.p.url),title:r=>r.p.raw.title.toLowerCase(),words:r=>r.p.raw.words,depth:r=>r.p.depth===null?99:r.p.depth,inbound:r=>r.p.inbound.length,issues:r=>r.crit*100+r.warn}[st.sort];\r\n  list.sort((a,b)=>{const x=val(a),y=val(b);return(x>y?1:x<y?-1:0)*st.dir});\r\n  const withIssues=rows.filter(r=>r.is.length).length;\r\n  const crit=rows.reduce((a,r)=>a+r.crit,0),warn=rows.reduce((a,r)=>a+r.warn,0);\r\n  const avg=Math.round(rows.reduce((a,r)=>a+r.p.raw.words,0)\/rows.length);\r\n  const maxD=Math.max(0,...S.pages.map(p=>p.depth===null?0:p.depth));\r\n  const th=(k,label,num)=>`<th class=\"${num?'num':''}\" aria-sort=\"${st.sort===k?(st.dir>0?'ascending':'descending'):'none'}\"><button type=\"button\" data-sort=\"${k}\">${label}${st.sort===k?(st.dir>0?' \u25b2':' \u25bc'):''}<\/button><\/th>`;\r\n  const body=list.map(r=>{const p=r.p,open=st.open.has(p.id);\r\n    const row=`<tr><td><button type=\"button\" class=\"rb\" data-row=\"${p.id}\" aria-expanded=\"${open}\">${esc(pathOf(p.url))}<\/button><\/td><td>${p.raw.title?esc(short(p.raw.title,54)):'<span class=\"muted\">Missing<\/span>'}<\/td><td class=\"num\">${fmt(p.raw.words)}<\/td><td class=\"num\">${p.depth===null?'Not reached':p.depth}<\/td><td class=\"num\">${p.inbound.length}<\/td><td class=\"num\">${r.out}<\/td><td>${r.crit?pill('fail',r.crit):''} ${r.warn?pill('warn',r.warn):''}${!r.is.length?pill('pass','Clean'):''}<\/td><\/tr>`;\r\n    const det=open?`<tr class=\"detail\"><td colspan=\"7\">${r.is.length?`<ul class=\"fixes\">${r.is.map(i=>`<li>${pill(i.sev,i.type)} ${esc(i.msg)}<\/li>`).join('')}<\/ul>`:'No issues found on this page.'}<\/td><\/tr>`:'';\r\n    return row+det}).join('');\r\n  out.innerHTML=`<div class=\"tiles\">${tile('Pages crawled',rows.length)}${tile('Pages with issues',withIssues,withIssues?'warn':'ok')}${tile('Critical issues',crit,crit?'fail':'ok')}${tile('Warnings',warn,warn?'warn':'ok')}${tile('Average words',fmt(avg))}${tile('Deepest page',maxD+' clicks')}<\/div>`+\r\n  `<section class=\"sec\"><h3>Issues by type<\/h3><p class=\"sec-sub\">Select an issue to filter the table.${st.type?` Showing: ${esc(st.type)}. <button type=\"button\" class=\"rb\" data-clear=\"1\">Clear filter<\/button>`:''}<\/p><div class=\"bars\">${[...types.entries()].sort((a,b)=>b[1].pages.size-a[1].pages.size).map(([t,v])=>`<button type=\"button\" class=\"brow\" data-type=\"${esc(t)}\" style=\"all:unset;cursor:pointer;display:grid;grid-template-columns:minmax(120px,260px) 1fr auto;gap:12px;align-items:center;min-height:30px\" aria-pressed=\"${st.type===t}\"><span class=\"l\" style=\"font-family:var(--f-body);font-weight:${st.type===t?800:600};color:var(--strong)\">${esc(t)}<\/span><span class=\"btrack\"><span class=\"bfill ${v.sev==='fail'?'fail':'warn'}\" style=\"width:${Math.max(4,v.pages.size\/rows.length*100)}%\"><\/span><\/span><span class=\"bval\">${v.pages.size} page${v.pages.size>1?'s':''}<\/span><\/button>`).join('')||'<div class=\"okbox\">No issues found on any page.<\/div>'}<\/div><\/section>`+\r\n  `<section class=\"sec\"><h3>All pages <small class=\"muted\" style=\"font:600 14px var(--f-body)\">${list.length} of ${rows.length}<\/small><\/h3><p class=\"sec-sub\">Crawled ${rows.length} page${rows.length>1?'s':''} in ${Math.max(1,Math.round(performance.now()-t0))} ms. Select a page address to see its issues. Depth is the number of clicks from the home page.<\/p><div class=\"tscroll\"><table><thead><tr>${th('path','Page')}${th('title','Title')}${th('words','Words',1)}${th('depth','Depth',1)}${th('inbound','Links in',1)}<th class=\"num\">Links out<\/th>${th('issues','Issues')}<\/tr><\/thead><tbody>${body||'<tr><td colspan=\"7\">No pages match.<\/td><\/tr>'}<\/tbody><\/table><\/div><\/section>`;\r\n }},\r\n\/* 4 ---- duplicate content *\/\r\n{id:'duplicates',scope:'site',name:'Duplicate Content Checker',desc:'Compare the text of your pages and see which ones overlap, so you can merge, rewrite or canonicalize them.',icon:'M9 9h11v11H9zM5 15V5h10',needs:true,\r\n shell:()=>`<div class=\"controls\"><label class=\"fld\" style=\"max-width:420px\"><span>Report pages that are at least <b id=\"dpVal\">60<\/b>% similar<\/span><input type=\"range\" id=\"dpThr\" min=\"20\" max=\"100\" step=\"5\" value=\"60\"><\/label><\/div><div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div>\r\n <section class=\"sec\" style=\"margin-top:28px\"><h3>Compare two texts<\/h3><p class=\"sec-sub\">Paste any two passages, such as a product description and a competitor's.<\/p><div class=\"cmp\"><label class=\"fld\"><span>Text A<\/span><textarea id=\"cmpA\" rows=\"6\" placeholder=\"Paste the first text\"><\/textarea><\/label><label class=\"fld\"><span>Text B<\/span><textarea id=\"cmpB\" rows=\"6\" placeholder=\"Paste the second text\"><\/textarea><\/label><\/div><div><button type=\"button\" class=\"btn primary\" id=\"cmpGo\">Compare texts<\/button><\/div><div id=\"cmpOut\" aria-live=\"polite\"><\/div><\/section>`,\r\n bind(){const t=$('#dpThr');t.addEventListener('input',()=>{$('#dpVal').textContent=t.value;this.run()});\r\n  $('#cmpGo').addEventListener('click',()=>{const a=$('#cmpA').value,b=$('#cmpB').value,o=$('#cmpOut');if(a.trim().split(\/\\s+\/).length<6||b.trim().split(\/\\s+\/).length<6){o.innerHTML='<div class=\"warnbox\" style=\"margin-top:12px\">Paste at least six words in each box.<\/div>';return}\r\n   const sa=shingles(a,5),sb=shingles(b,5),s=Math.round(jaccard(sa,sb)*100);const shared=[...sa].filter(x=>sb.has(x));\r\n   o.innerHTML=`<div class=\"scorecard\" style=\"margin-top:12px\">${ring(100-s,'unique',1)}<div class=\"meta\"><h2>${s}% similar<\/h2><p>${s>=90?'These texts are almost identical.':s>=60?'These texts overlap heavily.':s>=25?'These texts share some passages.':'These texts are mostly different.'}<\/p><p class=\"muted\">${shared.length} shared five-word phrases.${shared.length?' Examples: '+shared.slice(0,3).map(x=>'\"'+esc(x)+'\"').join(', '):''}<\/p><\/div><\/div>`})},\r\n run(){\r\n  const out=$('#out');if(S.pages.length<2){out.innerHTML=S.pages.length?`<div class=\"empty\"><h3>Add at least two pages<\/h3><p>The checker compares pages against each other.<\/p><\/div>`:emptyState();return}\r\n  const thr=+$('#dpThr').value\/100;const cand=S.pages.filter(p=>p.raw.words>=30),skipped=S.pages.length-cand.length;const pairs=[];\r\n  for(let i=0;i<cand.length;i++)for(let j=i+1;j<cand.length;j++){const s=jaccard(shOf(cand[i]),shOf(cand[j]));if(s>=thr)pairs.push({a:cand[i],b:cand[j],s})}\r\n  pairs.sort((x,y)=>y.s-x.s);\r\n  const affected=new Set();pairs.forEach(x=>{affected.add(x.a.id);affected.add(x.b.id)});\r\n  const verdict=s=>s>=.9?['fail','Near identical','Keep one page and 301 redirect the other, or add a canonical tag to the one you want ranked.']:s>=.7?['warn','Heavy overlap','Rewrite one page so it targets a different topic, or merge the two into a single stronger page.']:['info','Partial overlap','Check that each page adds something new. Differentiate the intro, examples and headings.'];\r\n  out.innerHTML=`<div class=\"tiles\">${tile('Pages compared',cand.length)}${tile('Similar pairs',pairs.length,pairs.length?'warn':'ok')}${tile('Pages affected',affected.size,affected.size?'warn':'ok')}${tile('Too short to compare',skipped)}<\/div>`+\r\n  (pairs.length?`<section class=\"sec\"><h3>Similar pages<\/h3>${table(['Similarity','Page A','Page B','What to do'],pairs.map(x=>{const v=verdict(x.s);return`<tr><td style=\"min-width:150px\"><div style=\"display:flex;flex-direction:column;gap:6px\"><b style=\"font-size:18px;color:var(--strong)\">${Math.round(x.s*100)}%<\/b><span class=\"btrack\"><span class=\"bfill ${v[0]==='info'?'pri':v[0]}\" style=\"width:${Math.round(x.s*100)}%\"><\/span><\/span>${pill(v[0],v[1])}<\/div><\/td><td><span class=\"u\">${esc(pathOf(x.a.url))}<\/span><br><span class=\"muted\">${esc(short(x.a.raw.title,50))}<\/span><\/td><td><span class=\"u\">${esc(pathOf(x.b.url))}<\/span><br><span class=\"muted\">${esc(short(x.b.raw.title,50))}<\/span><\/td><td>${esc(v[2])}<\/td><\/tr>`}))}<\/section>`:`<div class=\"okbox\">No pages are ${Math.round(thr*100)}% similar or more.<\/div>`)+\r\n  `<div class=\"callout\"><b>How it is measured.<\/b> Each page's main content is split into overlapping five-word phrases. Similarity is the share of phrases the two pages have in common. Navigation, headers and footers are ignored when the page has a main or article section.<\/div>`;\r\n }},\r\n\/* 5 ---- duplicate title \/ meta *\/\r\n{id:'meta',scope:'site',name:'Duplicate Title and Meta Finder',desc:'Find pages that share the same title, meta description or H1, and pages where these tags are missing.',icon:'M20.6 13.4l-7.2 7.2a2 2 0 0 1-2.8 0L3 13V3h10l7.6 7.6a2 2 0 0 1 0 2.8zM7.5 7.5h.01',needs:true,\r\n kind:'title',\r\n shell:()=>`<div class=\"controls\"><div class=\"seg\" id=\"mtSeg\" role=\"radiogroup\" aria-label=\"Tag to check\"><button type=\"button\" role=\"radio\" aria-checked=\"true\" data-v=\"title\">Titles<\/button><button type=\"button\" role=\"radio\" aria-checked=\"false\" data-v=\"desc\">Meta descriptions<\/button><button type=\"button\" role=\"radio\" aria-checked=\"false\" data-v=\"h1\">H1 headings<\/button><\/div><\/div><div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div>`,\r\n bind(){bindSeg($('#mtSeg'),v=>{this.kind=v;this.run()});$$('#mtSeg button').forEach(b=>b.setAttribute('aria-checked',b.dataset.v===this.kind?'true':'false'))},\r\n run(){\r\n  const out=$('#out');if(!S.pages.length){out.innerHTML=emptyState();return}\r\n  const k=this.kind,g=S.dup[k],label={title:'title',desc:'meta description',h1:'H1'}[k];\r\n  const aff=g.dups.reduce((a,x)=>a+x.pages.length,0);\r\n  out.innerHTML=`<div class=\"tiles\">${tile('Pages checked',S.pages.length)}${tile('Duplicate groups',g.dups.length,g.dups.length?'warn':'ok')}${tile('Pages affected',aff,aff?'warn':'ok')}${tile('Missing',g.missing.length,g.missing.length?'fail':'ok')}<\/div>`+\r\n  (g.dups.length?`<section class=\"sec\"><h3>Duplicate ${label}s<\/h3>${g.dups.map(x=>`<div class=\"panel\" style=\"display:flex;flex-direction:column;gap:10px\"><div style=\"display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between\">${pill('warn',x.pages.length+' pages share this '+label)}<\/div><p style=\"font-weight:700;color:var(--strong);word-break:break-word\">\"${esc(x.text)}\"<\/p><ul class=\"fixes\" style=\"font-family:var(--f-mono);font-size:13px\">${x.pages.map(p=>`<li>${esc(pathOf(p.url))}<\/li>`).join('')}<\/ul><p class=\"cr-f\"><span>How to fix<\/span>Write a unique ${label} for each page that names what is different about it, such as the product, location or topic.<\/p><\/div>`).join('')}<\/section>`:`<div class=\"okbox\">No two pages share the same ${label}.<\/div>`)+\r\n  (g.missing.length?`<section class=\"sec\"><h3>Pages with no ${label}<\/h3>${table(['Page','Title'],g.missing.map(p=>`<tr><td><span class=\"u\">${esc(pathOf(p.url))}<\/span><\/td><td>${esc(short(p.raw.title,70)||'No title')}<\/td><\/tr>`))}<\/section>`:'');\r\n }},\r\n\/* 6 ---- orphans *\/\r\n{id:'orphans',scope:'site',name:'Orphan Page Finder',desc:'Find pages that no other page links to, so crawlers and visitors can reach them.',icon:'M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM4 4l3 3M20 4l-3 3M4 20l3-3M20 20l-3-3',needs:true,\r\n shell:()=>`<div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div>`,bind(){},\r\n run(){\r\n  const out=$('#out');if(!S.pages.length){out.innerHTML=emptyState();return}\r\n  const rows=S.pages.map(p=>({p,n:p.inbound.length})).sort((a,b)=>a.n-b.n||pathOf(a.p.url).localeCompare(pathOf(b.p.url)));\r\n  const orph=rows.filter(r=>isOrphan(r.p)),weak=rows.filter(r=>r.n===1);\r\n  const max=Math.max(1,...rows.map(r=>r.n));\r\n  const sm=[];S.extra.forEach(u=>{const k=normKey(u);if(!k||S.map.has(k))return;const n=(S.inKeys.get(k)||new Set()).size;sm.push({u,n})});\r\n  const smOrph=sm.filter(x=>!x.n);\r\n  out.innerHTML=`<div class=\"tiles\">${tile('Pages analyzed',S.pages.length)}${tile('Orphan pages',orph.length,orph.length?'fail':'ok')}${tile('Only one link in',weak.length,weak.length?'warn':'ok')}${tile('Sitemap URLs not linked',smOrph.length,smOrph.length?'warn':'ok')}<\/div>`+\r\n  `<section class=\"sec\"><h3>Links pointing to each page<\/h3><p class=\"sec-sub\">Counts unique pages that link to the page. The home page is the starting point and is never an orphan.<\/p><div class=\"bars\">${rows.map(r=>{const o=isOrphan(r.p);return`<div class=\"brow\"><span class=\"l\" title=\"${esc(r.p.url)}\">${esc(pathOf(r.p.url))}<\/span><span class=\"btrack\"><span class=\"bfill ${o?'fail':r.n===1?'warn':'pri'}\" style=\"width:${o?0:Math.max(6,r.n\/max*100)}%\"><\/span><\/span><span class=\"bval\">${o?pill('fail','Orphan'):r.p===S.home?'Home page':r.n+' link'+(r.n>1?'s':'')+' in'}<\/span><\/div>`}).join('')}<\/div><\/section>`+\r\n  (orph.length?`<section class=\"sec\"><h3>How to fix ${orph.length} orphan page${orph.length>1?'s':''}<\/h3>${table(['Page','Title','Suggestion'],orph.map(r=>`<tr><td><span class=\"u\">${esc(pathOf(r.p.url))}<\/span><\/td><td>${esc(short(r.p.raw.title,60)||'No title')}<\/td><td>${S.extra.length&&S.extraKeys.has(r.p.key)?'It is in your sitemap but no page links to it. ':''}Link to it from a related page or a hub page using descriptive text. If it has no value, redirect or remove it.<\/td><\/tr>`))}<\/section>`:`<div class=\"okbox\">Every page is linked from at least one other page.<\/div>`)+\r\n  (smOrph.length?`<section class=\"sec\"><h3>In your sitemap, never linked from loaded pages<\/h3><p class=\"sec-sub\">These addresses are not loaded, so add them above to confirm.<\/p>${table(['Address'],smOrph.map(x=>`<tr><td><span class=\"u\">${esc(x.u)}<\/span><\/td><\/tr>`))}<\/section>`:'')+\r\n  `<div class=\"callout\"><b>Accuracy depends on coverage.<\/b> A page counts as linked only when one of the loaded pages links to it. Load every page of the site for a complete answer.<\/div>`;\r\n }},\r\n\/* 7 ---- thin *\/\r\n{id:'thin',scope:'site',name:'Thin Content Detector',desc:'Flag pages with too few words and see how each one compares with your minimum.',icon:'M4 6h16M4 12h10M4 18h6',needs:true,\r\n shell:()=>`<div class=\"controls\"><label class=\"fld\" style=\"max-width:460px\"><span>Minimum words per page: <b id=\"thVal\">300<\/b><\/span><input type=\"range\" id=\"thThr\" min=\"50\" max=\"1500\" step=\"50\" value=\"300\"><\/label><div class=\"chips\" id=\"thPre\" role=\"group\" aria-label=\"Presets\"><button type=\"button\" class=\"chip\" data-v=\"150\" aria-pressed=\"false\">Short pages 150<\/button><button type=\"button\" class=\"chip\" data-v=\"300\" aria-pressed=\"true\">Standard 300<\/button><button type=\"button\" class=\"chip\" data-v=\"600\" aria-pressed=\"false\">Articles 600<\/button><\/div><\/div><div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div>`,\r\n bind(){const t=$('#thThr');const set=v=>{t.value=v;$('#thVal').textContent=v;$$('#thPre .chip').forEach(c=>c.setAttribute('aria-pressed',String(c.dataset.v===String(v))));this.run()};\r\n  t.addEventListener('input',()=>set(t.value));$('#thPre').addEventListener('click',e=>{const b=e.target.closest('[data-v]');if(b)set(b.dataset.v)})},\r\n run(){\r\n  const out=$('#out');if(!S.pages.length){out.innerHTML=emptyState();return}\r\n  const thr=+$('#thThr').value,rows=S.pages.slice().sort((a,b)=>a.raw.words-b.raw.words);\r\n  const thin=rows.filter(p=>p.raw.words<thr),vthin=rows.filter(p=>p.raw.words<thr\/3);\r\n  const scale=Math.max(thr*1.6,...rows.map(p=>p.raw.words));\r\n  const avg=Math.round(rows.reduce((a,p)=>a+p.raw.words,0)\/rows.length);\r\n  out.innerHTML=`<div class=\"tiles\">${tile('Pages checked',rows.length)}${tile('Below minimum',thin.length,thin.length?'warn':'ok')}${tile('Very thin',vthin.length,vthin.length?'fail':'ok')}${tile('Average words',fmt(avg))}<\/div>`+\r\n  `<section class=\"sec\"><h3>Word count by page<\/h3><p class=\"sec-sub\">The dark line marks your minimum of ${fmt(thr)} words. Navigation, header and footer text is not counted.<\/p><div class=\"bars\">${rows.map(p=>{const w=p.raw.words,st=w<thr\/3?'fail':w<thr?'warn':'ok';return`<div class=\"brow\"><span class=\"l\" title=\"${esc(p.url)}\">${esc(pathOf(p.url))}<\/span><span class=\"btrack\"><span class=\"bfill ${st}\" style=\"width:${Math.max(1,w\/scale*100)}%\"><\/span><span class=\"bmark\" style=\"left:${thr\/scale*100}%\"><\/span><\/span><span class=\"bval\">${fmt(w)} words<\/span><\/div>`}).join('')}<\/div><\/section>`+\r\n  (thin.length?`<section class=\"sec\"><h3>Pages to improve<\/h3>${table(['Page','Status','Words','Text to code ratio','What to do'],thin.map(p=>{const v=p.raw.words<thr\/3;const ratio=Math.round(p.raw.text.length\/Math.max(1,p.raw.htmlLen)*100);return`<tr><td><span class=\"u\">${esc(pathOf(p.url))}<\/span><br><span class=\"muted\">${esc(short(p.raw.title,50))}<\/span><\/td><td>${pill(v?'fail':'warn',v?'Very thin':'Thin')}<\/td><td class=\"num\">${fmt(p.raw.words)}<\/td><td class=\"num\">${ratio}%<\/td><td>${v?'Expand it into a useful page, merge it into a stronger page, or noindex it if it has no search value.':'Add detail, examples, FAQs and related links until the page fully answers the topic.'}<\/td><\/tr>`}))}<\/section>`:`<div class=\"okbox\">Every page has at least ${fmt(thr)} words.<\/div>`);\r\n }},\r\n\/* 8 ---- images *\/\r\n{id:'images',scope:'page',name:'Image Audit Tool',desc:'Find missing alt text and layout-shifting images in your pages, or check image files for oversized weight and dimensions.',icon:'M3 5h18v14H3zM8.5 10a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM21 15l-5-5L5 19',needs:true,\r\n mode:'html',filter:'all',\r\n shell:()=>`<div class=\"controls\"><div class=\"seg\" id=\"imSeg\" role=\"radiogroup\" aria-label=\"What to audit\"><button type=\"button\" role=\"radio\" aria-checked=\"true\" data-v=\"html\">Images in my pages<\/button><button type=\"button\" role=\"radio\" aria-checked=\"false\" data-v=\"files\">Image files<\/button><\/div><\/div>\r\n <div id=\"imHtml\"><div class=\"controls\">${selectField('imSel','Audit images on')}<label class=\"switch\"><input type=\"checkbox\" id=\"imOnly\"><span>Show only problems<\/span><\/label><\/div><div id=\"out\" class=\"tool-body\" style=\"margin-top:0\"><\/div><\/div>\r\n <div id=\"imFiles\" hidden><label class=\"drop\" id=\"imDrop\" for=\"imIn\"><input type=\"file\" id=\"imIn\" class=\"sr\" accept=\"image\/*\" multiple>Drop image files here or <u>&nbsp;choose images&nbsp;<\/u><\/label><div id=\"imFOut\" class=\"tool-body\" aria-live=\"polite\"><\/div><\/div>`,\r\n bind(){\r\n  bindSeg($('#imSeg'),v=>{this.mode=v;$('#imHtml').hidden=v!=='html';$('#imFiles').hidden=v!=='files'});\r\n  $('#imSel').addEventListener('change',e=>{S.sel.images=e.target.value;this.run()});$('#imOnly').addEventListener('change',()=>this.run());\r\n  const go=files=>this.files(files);$('#imIn').addEventListener('change',e=>go(e.target.files));\r\n  const d=$('#imDrop');['dragenter','dragover'].forEach(n=>d.addEventListener(n,e=>{e.preventDefault();d.classList.add('over')}));['dragleave','drop'].forEach(n=>d.addEventListener(n,e=>{e.preventDefault();d.classList.remove('over')}));d.addEventListener('drop',e=>go(e.dataTransfer.files));\r\n  this.renderFiles();\r\n },\r\n list:[],\r\n files(fs){const arr=Array.from(fs).filter(f=>\/^image\\\/\/.test(f.type));if(!arr.length){toast('Choose image files such as JPG, PNG or WebP.');return}\r\n  let left=arr.length;arr.forEach(f=>{const url=URL.createObjectURL(f);const im=new Image();const done=(w,h)=>{this.list.push({name:f.name,size:f.size,type:f.type,w,h,url});if(--left===0){this.renderFiles()}};im.onload=()=>done(im.naturalWidth,im.naturalHeight);im.onerror=()=>done(0,0);im.src=url})},\r\n renderFiles(){\r\n  const o=$('#imFOut');if(!o)return;\r\n  if(!this.list.length){o.innerHTML=`<div class=\"callout\"><b>Why check files?<\/b> Large images are the most common cause of slow pages. Drop your images here to see their weight, dimensions and format. Files stay on your device.<\/div>`;return}\r\n  const rows=this.list.map(f=>{const kb=f.size\/1024,fl=[];const legacy=\/image\\\/(jpeg|png|gif|bmp)\/.test(f.type);\r\n    if(kb>500)fl.push(['fail','Very heavy','Compress it or resize it. Aim for under 150 KB.']);else if(kb>200)fl.push(['warn','Heavy','Compress it. Aim for under 150 KB for most images.']);\r\n    if(f.w>2400)fl.push(['warn','Very wide',`${f.w}px is wider than most screens need. Resize to 1600px or less.`]);\r\n    if(legacy&&kb>50)fl.push(['info','Legacy format','Convert to WebP or AVIF for a smaller file at the same quality.']);\r\n    return{...f,kb,fl}});\r\n  const heavy=rows.filter(r=>r.kb>200).length,total=rows.reduce((a,r)=>a+r.size,0)\/1024;\r\n  o.innerHTML=`<div class=\"tiles\">${tile('Files checked',rows.length)}${tile('Over 200 KB',heavy,heavy?'warn':'ok')}${tile('Total weight',total>1024?(total\/1024).toFixed(1)+' MB':Math.round(total)+' KB')}<\/div>`+table(['Preview','File','Size','Dimensions','Findings'],rows.map(r=>`<tr><td><img decoding=\"async\" src=\"${r.url}\" alt=\"\" style=\"width:56px;height:42px;object-fit:cover;border-radius:6px;border:1px solid var(--line)\"><\/td><td><span class=\"u\">${esc(r.name)}<\/span><\/td><td class=\"num nw\">${r.kb>=1024?(r.kb\/1024).toFixed(1)+' MB':Math.round(r.kb)+' KB'}<\/td><td class=\"nw\">${r.w?r.w+' \u00d7 '+r.h:'Unknown'}<\/td><td>${r.fl.length?r.fl.map(f=>`<div style=\"margin-bottom:6px\">${pill(f[0],f[1])} <span class=\"muted\">${esc(f[2])}<\/span><\/div>`).join(''):pill('pass','Looks good')}<\/td><\/tr>`))+`<div><button type=\"button\" class=\"btn ghost\" id=\"imClear\">Clear files<\/button><\/div>`;\r\n  $('#imClear').addEventListener('click',()=>{this.list=[];this.renderFiles()});\r\n },\r\n run(){\r\n  const out=$('#out');if(!S.pages.length){out.innerHTML=emptyState();return}\r\n  fillSelect($('#imSel'),'images',true);\r\n  const pages=selPages('images');const rows=[];\r\n  pages.forEach(p=>p.raw.imgs.forEach(i=>{\r\n    const f=[];const alt=i.alt;\r\n    if(alt===null)f.push(['fail','Missing alt','Add an alt attribute that describes the image.']);\r\n    else if(alt.trim()==='')f.push(['info','Empty alt','Fine for decoration. Add a description if the image carries meaning.']);\r\n    else{if(\/\\.(jpe?g|png|gif|webp|svg)\\b\/i.test(alt)||\/^(img|image|photo|picture|dsc)[_\\- ]?\\d*$\/i.test(alt.trim()))f.push(['warn','Alt is a file name','Replace it with a description of what the image shows.']);if(alt.length>125)f.push(['warn','Alt too long','Keep alt text under 125 characters.'])}\r\n    if(!(i.w&&i.h))f.push(['warn','No width and height','Add both so the page does not jump while loading.']);\r\n    if(\/\\.(jpe?g|png|gif|bmp)(\\?|$)\/i.test(i.src)&&!i.srcset)f.push(['info','Legacy format','Offer WebP or AVIF for a smaller download.']);\r\n    rows.push({page:pathOf(p.url),src:i.src,alt,f,lazy:i.lazy});\r\n  }));\r\n  const c=fn=>rows.filter(fn).length;\r\n  const only=$('#imOnly').checked;const shown=rows.filter(r=>!only||r.f.some(x=>x[0]==='fail'||x[0]==='warn'));\r\n  out.innerHTML=`<div class=\"tiles\">${tile('Images found',rows.length)}${tile('Missing alt',c(r=>r.alt===null),c(r=>r.alt===null)?'fail':'ok')}${tile('Empty alt',c(r=>r.alt!==null&&r.alt.trim()===''))}${tile('No dimensions',c(r=>r.f.some(x=>x[1]==='No width and height')),c(r=>r.f.some(x=>x[1]==='No width and height'))?'warn':'ok')}${tile('Not lazy loaded',c(r=>!r.lazy))}<\/div>`+\r\n  (shown.length?`<div class=\"tscroll\"><table><thead><tr><th>Image<\/th><th>Found on<\/th><th>Alt text<\/th><th>Findings<\/th><\/tr><\/thead><tbody>${shown.map(r=>`<tr><td><span class=\"u\">${esc(short(r.src||'(no src)',60))}<\/span><\/td><td><span class=\"u\">${esc(r.page)}<\/span><\/td><td>${r.alt===null?'<span class=\"muted\">None<\/span>':r.alt===''?'<span class=\"muted\">Empty<\/span>':esc(short(r.alt,70))}<\/td><td>${r.f.length?r.f.map(x=>`<div style=\"margin-bottom:6px\">${pill(x[0],x[1])} <span class=\"muted\">${esc(x[2])}<\/span><\/div>`).join(''):pill('pass','Looks good')}<\/td><\/tr>`).join('')}<\/tbody><\/table><\/div>`:`<div class=\"okbox\">${rows.length?'No problems found in these images.':'No images found in the selected pages.'}<\/div>`)+\r\n  `<div class=\"callout\"><b>File sizes.<\/b> A page's HTML does not say how heavy an image is. Switch to <b>Image files<\/b> above and drop your images to check their size and dimensions.<\/div>`;\r\n }},\r\n\/* 9 ---- score calculator *\/\r\n{id:'score',scope:'list',name:'SEO Score Calculator',desc:'Answer a 24-point checklist and get a weighted SEO score, a grade and your top fixes.',icon:'M4 18a8 8 0 1 1 16 0M12 18l4-6',needs:false,\r\n items:[\r\n  ['Content','c1','Every page has a unique title of 30 to 60 characters',3,'title','Rewrite duplicate or very long titles first.'],\r\n  ['Content','c2','Every page has a meta description of 70 to 160 characters',2,'desc','Write a distinct description for each key page.'],\r\n  ['Content','c3','Each page has exactly one H1 that states its topic',3,'h1','Add or fix the H1 on your top pages.'],\r\n  ['Content','c4','Pages have enough original content to satisfy the search',3,'content','Expand thin pages with real detail and examples.'],\r\n  ['Content','c5','Headings follow a logical order',1,'headings','Do not skip heading levels.'],\r\n  ['Keywords','k1','Each page targets one main keyword or topic',3,null,'Map one primary keyword to each page.'],\r\n  ['Keywords','k2','The main keyword appears in the title, H1 and first paragraph',2,null,'Work the main phrase into those three places.'],\r\n  ['Keywords','k3','Related terms and questions are covered on the page',2,null,'Add sections that answer related questions.'],\r\n  ['Keywords','k4','No two pages compete for the same keyword',2,null,'Merge or differentiate overlapping pages.'],\r\n  ['Technical','t1','The site uses HTTPS on every page',3,'https','Install a certificate and redirect http to https.'],\r\n  ['Technical','t2','Pages work on mobile with a viewport tag and readable text',3,'viewport','Add the viewport tag and test on a phone.'],\r\n  ['Technical','t3','Pages load fast (largest content under 2.5 seconds)',3,null,'Compress images and defer heavy scripts.'],\r\n  ['Technical','t4','An XML sitemap is submitted in Search Console',2,null,'Create a sitemap and submit it.'],\r\n  ['Technical','t5','Important pages are indexable with no stray noindex',3,'index','Remove noindex from pages that should rank.'],\r\n  ['Technical','t6','Canonical tags point to the preferred address',2,'canonical','Add a self-referencing canonical to every page.'],\r\n  ['Links and media','l1','Every important page is linked from another page',2,null,'Link orphan pages from related content.'],\r\n  ['Links and media','l2','Internal links use descriptive anchor text',2,'anchortext','Replace \"click here\" with descriptive words.'],\r\n  ['Links and media','l3','There are no broken internal links',3,'broken','Fix or redirect broken addresses.'],\r\n  ['Links and media','l4','Images have descriptive alt text',2,'alt','Describe every meaningful image.'],\r\n  ['Links and media','l5','Images are compressed and sized for the layout',2,null,'Convert to WebP and resize to display width.'],\r\n  ['Authority and trust','a1','Reputable sites link to your content',3,null,'Earn links with original research and useful tools.'],\r\n  ['Authority and trust','a2','Business name, address and contact details are easy to find',1,null,'Add a contact page and footer details.'],\r\n  ['Authority and trust','a3','Content shows real expertise through authors, sources and dates',2,null,'Add author bios, citations and update dates.'],\r\n  ['Authority and trust','a4','Structured data is added where it fits',1,'schema','Add schema.org markup that matches the page.']],\r\n demo:{c1:'partly',c2:'no',c3:'yes',c4:'partly',c5:'yes',k1:'yes',k2:'partly',k3:'no',k4:'partly',t1:'yes',t2:'yes',t3:'partly',t4:'no',t5:'yes',t6:'partly',l1:'partly',l2:'partly',l3:'no',l4:'partly',l5:'no',a1:'no',a2:'yes',a3:'partly',a4:'no'},\r\n shell(){\r\n  const cats=[...new Set(this.items.map(i=>i[0]))];\r\n  return `<div class=\"score-layout\"><div style=\"display:flex;flex-direction:column;gap:18px;min-width:0\"><div class=\"callout\" id=\"scNote\"><\/div><div class=\"controls\" style=\"margin:0\">${selectField('scSel','Fill answers from a loaded page')}<button type=\"button\" class=\"btn ghost\" id=\"scFill\">Fill from page<\/button><button type=\"button\" class=\"btn ghost\" id=\"scReset\">Clear answers<\/button><\/div>`+\r\n  cats.map(c=>`<section class=\"qcat\"><h3>${esc(c)} <small id=\"cs_${c.replace(\/\\W\/g,'')}\"><\/small><\/h3>${this.items.filter(i=>i[0]===c).map(i=>`<fieldset class=\"q\"><legend class=\"sr\">${esc(i[2])}<\/legend><div class=\"qt\"><b>${esc(i[2])}<\/b><small><span class=\"imp\">${i[3]===3?'High':i[3]===2?'Medium':'Low'} impact<\/span><\/small><\/div><div class=\"seg3\" role=\"radiogroup\" aria-label=\"${esc(i[2])}\">${['yes','partly','no'].map(v=>`<label><input type=\"radio\" name=\"q_${i[1]}\" value=\"${v}\"><span>${v==='yes'?'Yes':v==='partly'?'Partly':'No'}<\/span><\/label>`).join('')}<\/div><\/fieldset>`).join('')}<\/section>`).join('')+\r\n  `<\/div><aside class=\"sumbox\" aria-live=\"polite\" id=\"scSum\"><\/aside><\/div>`;\r\n },\r\n bind(){\r\n  const saved=store.get('og-seo-score-v1');this.ans=saved&&saved.a?saved.a:Object.assign({},this.demo);this.isDemo=!(saved&&saved.a);\r\n  const apply=()=>this.items.forEach(i=>{const v=this.ans[i[1]];$$(`input[name=\"q_${i[1]}\"]`).forEach(r=>r.checked=r.value===v)});\r\n  apply();\r\n  $('#scNote').innerHTML=this.isDemo?'<b>Example answers are loaded.<\/b> Change any answer to match your site and your own score saves in this browser.':'<b>Your saved answers are loaded.<\/b> They are stored in this browser only.';\r\n  $$('input[type=radio]',$('#view')).forEach(r=>r.addEventListener('change',e=>{if(!e.target.name.startsWith('q_'))return;this.ans[e.target.name.slice(2)]=e.target.value;this.persist()}));\r\n  $('#scReset').addEventListener('click',()=>{this.ans={};apply();this.persist();toast('Answers cleared')});\r\n  $('#scFill').addEventListener('click',()=>{\r\n    if(!S.pages.length){toast('Load a page first');return}\r\n    const p=S.pages.find(x=>String(x.id)===$('#scSel').value)||S.pages[0],ch=auditChecks(p);let n=0;\r\n    this.items.forEach(i=>{if(!i[4])return;const c=ch.find(x=>x.key===i[4]);if(!c||c.status==='info')return;this.ans[i[1]]=c.status==='pass'?'yes':c.status==='warn'?'partly':'no';n++});\r\n    apply();this.persist();toast(`Filled ${n} answers from ${pathOf(p.url)}`)});\r\n  this.summary();\r\n },\r\n persist(){this.isDemo=false;store.set('og-seo-score-v1',{a:this.ans});$('#scNote').innerHTML='<b>Your answers are saved<\/b> in this browser only.';this.summary()},\r\n summary(){\r\n  const A=this.ans||{},items=this.items;let earn=0,tot=0,ans=0;const cat={};\r\n  items.forEach(i=>{const w=i[3],v=A[i[1]];tot+=w;const e=v==='yes'?w:v==='partly'?w\/2:0;earn+=e;if(v)ans++;cat[i[0]]=cat[i[0]]||{e:0,t:0};cat[i[0]].e+=e;cat[i[0]].t+=w});\r\n  const score=Math.round(earn\/tot*100);\r\n  const fixes=items.filter(i=>A[i[1]]==='no'||A[i[1]]==='partly').sort((a,b)=>(b[3]-a[3])||((A[a[1]]==='no'?0:1)-(A[b[1]]==='no'?0:1))).slice(0,5);\r\n  Object.keys(cat).forEach(c=>{const el=$('#cs_'+c.replace(\/\\W\/g,''));if(el)el.textContent=Math.round(cat[c].e\/cat[c].t*100)+'% of points'});\r\n  const box=$('#scSum');if(!box)return;\r\n  box.innerHTML=`<div style=\"display:flex;align-items:center;gap:18px\">${ring(score)}<div><div class=\"tag\">Grade ${grade(score)}<\/div><p class=\"muted\" style=\"margin-top:8px\">${ans} of ${items.length} answered<\/p><\/div><\/div><div class=\"bars\">${Object.entries(cat).map(([c,v])=>{const s=Math.round(v.e\/v.t*100);return`<div><div style=\"display:flex;justify-content:space-between;font-weight:700;font-size:14px;color:var(--strong)\"><span>${esc(c)}<\/span><span>${s}%<\/span><\/div><div class=\"btrack\" style=\"margin-top:4px\"><span class=\"bfill ${tone(s)}\" style=\"width:${Math.max(2,s)}%\"><\/span><\/div><\/div>`}).join('')}<\/div><div><h3 style=\"font-size:16px;margin-bottom:8px\">Fix these first<\/h3>${fixes.length?`<ol class=\"fixes\">${fixes.map(i=>`<li><b>${esc(i[2])}.<\/b> <span class=\"muted\">${esc(i[5])}<\/span><\/li>`).join('')}<\/ol>`:'<p class=\"muted\">Nothing left to fix. Great work.<\/p>'}<\/div>`;\r\n },\r\n run(){const s=$('#scSel');if(s){fillSelect(s,'score',false);if(!S.pages.length)s.innerHTML='<option>No pages loaded<\/option>'}this.summary()}},\r\n\/* 10 --- technical checklist *\/\r\n{id:'checklist',scope:'list',name:'Technical SEO Checklist',desc:'Work through 43 technical checks with how-to notes. Your progress saves in this browser.',icon:'M9 11l3 3 8-8M20 12v7a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9',needs:false,\r\n data:[\r\n  ['Crawling and indexing',[\r\n   ['robots','robots.txt loads and does not block important pages','Open yourdomain.com\/robots.txt. Look for \"Disallow: \/\" or rules that block CSS, JavaScript or whole sections you want ranked.'],\r\n   ['sitemap','An XML sitemap lists only indexable, canonical addresses','Include only pages that return 200 and are not noindexed. Keep it under 50,000 URLs per file.'],\r\n   ['sitemaplink','The sitemap is linked in robots.txt','Add a line such as Sitemap: https:\/\/yourdomain.com\/sitemap.xml.'],\r\n   ['gsc','The site is verified in Google Search Console and Bing Webmaster Tools','Use a domain property so every subdomain and protocol is covered.'],\r\n   ['coverage','The indexing report shows no important pages excluded','Review \"Crawled, currently not indexed\" and \"Discovered, currently not indexed\" for pages that should rank.'],\r\n   ['noindex','Private pages use noindex, not only a robots.txt block','A robots.txt block can still leave the address indexed. Use a noindex tag and let it be crawled.'],\r\n   ['params','Filter and tracking parameters do not create duplicate pages','Use canonical tags, noindex or consistent internal links to the clean address.']]],\r\n  ['Site structure and URLs',[\r\n   ['depth','Important pages are within three clicks of the home page','Link top pages from the home page, menus and hub pages.'],\r\n   ['urls','URLs are short, lowercase and use hyphens','Avoid session ids, capital letters and underscores.'],\r\n   ['version','Only one version of the site resolves','Redirect http to https and www to non-www (or the reverse) with a single 301.'],\r\n   ['chains','There are no redirect chains or loops','Each redirect should go straight to the final address in one hop.'],\r\n   ['e404','The 404 page returns a real 404 status','Check the response code, not only the page text. Link to useful pages from it.'],\r\n   ['crumbs','Breadcrumbs show the page path','Use breadcrumbs with matching BreadcrumbList schema.'],\r\n   ['orphans','No important page is an orphan','Every page should receive at least one internal link from a relevant page.']]],\r\n  ['On-page foundations',[\r\n   ['titles','Every page has a unique title of 30 to 60 characters','Put the main topic first and the brand last.'],\r\n   ['descs','Every page has a unique meta description','Write 70 to 160 characters that earn the click.'],\r\n   ['h1s','Every page has one H1','Use H2 and H3 for sections below it.'],\r\n   ['canon','Indexable pages carry a self-referencing canonical tag','This protects you from tracking parameters and copied pages.']]],\r\n  ['Speed and Core Web Vitals',[\r\n   ['lcp','Largest Contentful Paint is under 2.5 seconds','Compress the hero image, preload it, and avoid render-blocking scripts.'],\r\n   ['inp','Interaction to Next Paint is under 200 ms','Break up long JavaScript tasks and remove unused third-party scripts.'],\r\n   ['cls','Cumulative Layout Shift is under 0.1','Set width and height on images and embeds and reserve space for ads.'],\r\n   ['imgfmt','Images use WebP or AVIF and are sized to the layout','Serve responsive sizes with srcset.'],\r\n   ['lazy','Below-the-fold images and iframes load lazily','Add loading=\"lazy\". Do not lazy-load the main hero image.'],\r\n   ['blocking','Render-blocking CSS and JavaScript are minimized','Inline critical CSS, defer scripts and remove unused code.'],\r\n   ['cache','Static files are cached and served from a CDN','Set long cache lifetimes with versioned file names.'],\r\n   ['ttfb','Server response time is under 800 ms','Use page caching and a fast host.'],\r\n   ['fonts','Web fonts use font-display: swap and are preloaded','This stops invisible text while fonts load.']]],\r\n  ['Mobile and usability',[\r\n   ['viewport','Every page has a viewport meta tag','Without it phones show a zoomed-out desktop page.'],\r\n   ['tap','Tap targets are at least 44 pixels','Space links and buttons so thumbs can hit them.'],\r\n   ['interstitial','No intrusive popups cover content on mobile','Search engines can demote pages with full-screen popups.'],\r\n   ['parity','Mobile and desktop show the same main content','Google indexes the mobile version first.']]],\r\n  ['Security',[\r\n   ['https','HTTPS works on every page with a valid certificate','Set a reminder before the certificate expires.'],\r\n   ['hsts','HSTS is enabled','The Strict-Transport-Security header keeps visitors on HTTPS.'],\r\n   ['mixed','No mixed content warnings','Load every image, script and stylesheet over https.'],\r\n   ['hack','Security issues and manual actions are clear in Search Console','Check the Security and Manual actions reports monthly.']]],\r\n  ['Structured data',[\r\n   ['org','Organization schema is on the home page','Include name, logo and social profiles.'],\r\n   ['types','Page-level schema fits the content','Use Article, Product, FAQPage, LocalBusiness or Recipe where it applies.'],\r\n   ['rich','Markup passes the Rich Results Test','Fix errors first, then warnings.'],\r\n   ['visible','Marked-up information is visible on the page','Never mark up content users cannot see.']]],\r\n  ['International and sharing',[\r\n   ['hreflang','hreflang tags are reciprocal and use correct codes','Every language version must link to every other version and to itself.'],\r\n   ['lang','The html tag carries the correct lang attribute','Use lang=\"en\", lang=\"hi\" and so on.'],\r\n   ['og','Open Graph and Twitter card tags are set','Include title, description and a 1200 by 630 image.'],\r\n   ['favicon','A favicon is set','Use an icon of at least 48 by 48 pixels so it can appear in results.']]]\r\n ],\r\n shell(){return `<div class=\"panel\" style=\"display:flex;flex-direction:column;gap:14px\"><div style=\"display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;align-items:center\"><div><h2 style=\"font-size:20px\"><span id=\"ckPct\">0%<\/span> complete<\/h2><p class=\"muted\" id=\"ckSub\"><\/p><\/div><div style=\"display:flex;flex-wrap:wrap;gap:10px\"><button type=\"button\" class=\"btn ghost sm\" id=\"ckCopy\">Copy progress<\/button><button type=\"button\" class=\"btn danger sm\" id=\"ckReset\">Reset all<\/button><\/div><\/div><div class=\"prog\" role=\"progressbar\" aria-label=\"Checklist progress\" aria-valuemin=\"0\" aria-valuemax=\"100\" id=\"ckBar\"><i style=\"width:0%\"><\/i><\/div><p class=\"msg\" id=\"ckMsg\" role=\"status\"><\/p><\/div>`+\r\n  this.data.map((s,si)=>`<section class=\"chk-s\"><div class=\"sh\"><h3>${esc(s[0])}<\/h3><div class=\"sc\"><span id=\"ckS${si}\"><\/span><button type=\"button\" class=\"btn ghost sm\" data-all=\"${si}\">Mark all<\/button><\/div><\/div>${s[1].map(i=>`<div class=\"chk\"><input type=\"checkbox\" id=\"ck_${i[0]}\" data-id=\"${i[0]}\"><div class=\"ct\"><label for=\"ck_${i[0]}\">${esc(i[1])}<\/label><details><summary>How to check<\/summary><p>${esc(i[2])}<\/p><\/details><\/div><\/div>`).join('')}<\/section>`).join('');},\r\n bind(){\r\n  const saved=store.get('og-seo-tech-v1');this.done=new Set(saved&&saved.done?saved.done:[]);this.savedAt=saved&&saved.at||null;\r\n  $$('input[data-id]').forEach(c=>{c.checked=this.done.has(c.dataset.id);c.addEventListener('change',()=>{c.checked?this.done.add(c.dataset.id):this.done.delete(c.dataset.id);this.save()})});\r\n  $$('[data-all]').forEach(b=>b.addEventListener('click',()=>{const s=this.data[+b.dataset.all][1];const all=s.every(i=>this.done.has(i[0]));s.forEach(i=>{const c=$('#ck_'+i[0]);c.checked=!all;all?this.done.delete(i[0]):this.done.add(i[0])});this.save()}));\r\n  $('#ckCopy').addEventListener('click',()=>{const lines=[];this.data.forEach(s=>{lines.push(s[0]);s[1].forEach(i=>lines.push((this.done.has(i[0])?'[x] ':'[ ] ')+i[1]));lines.push('')});copyText(lines.join('\\n'),'Progress copied')});\r\n  const rs=$('#ckReset');rs.addEventListener('click',()=>{if(rs.dataset.arm!=='1'){rs.dataset.arm='1';rs.textContent='Click again to confirm';setTimeout(()=>{rs.dataset.arm='';rs.textContent='Reset all'},3000);return}\r\n    rs.dataset.arm='';rs.textContent='Reset all';this.done.clear();$$('input[data-id]').forEach(c=>c.checked=false);this.save()});\r\n  this.update(false);\r\n },\r\n save(){const ok=store.set('og-seo-tech-v1',{done:[...this.done],at:Date.now()});this.savedAt=Date.now();this.update(ok)},\r\n update(ok){\r\n  const total=this.data.reduce((a,s)=>a+s[1].length,0),n=this.done.size,pct=Math.round(n\/total*100);\r\n  $('#ckPct').textContent=pct+'%';$('#ckSub').textContent=`${n} of ${total} checks done`;\r\n  const b=$('#ckBar');b.setAttribute('aria-valuenow',pct);$('i',b).style.width=pct+'%';\r\n  this.data.forEach((s,i)=>{const d=s[1].filter(x=>this.done.has(x[0])).length;$('#ckS'+i).textContent=d+' of '+s[1].length})\r\n  const m=$('#ckMsg');m.className='msg '+(ok===false?'err':'ok');m.textContent=ok===false?'Progress could not be saved in this browser. Use Copy progress to keep it.':this.savedAt?'Progress saved in this browser.':'Tick items as you complete them. Progress saves automatically.';\r\n },\r\n run(){}}\r\n];\r\nconst BY={};TOOLS.forEach(t=>BY[t.id]=t);\r\nconst SCOPE={list:'Checklist',page:'Page level',site:'Whole site'};\r\n\r\n\/* ---------- pages panel ---------- *\/\r\nfunction pagesPanel(){return `<section class=\"panel pages\" id=\"pgPanel\" aria-labelledby=\"pgH\"><div class=\"panel-head\"><div><h2 id=\"pgH\">Pages to analyze <span class=\"tag\" id=\"pgEx\" hidden>Example site<\/span><\/h2><p id=\"pgSum\" class=\"muted\"><\/p><\/div><button class=\"btn ghost\" id=\"pgToggle\" type=\"button\" aria-expanded=\"false\" aria-controls=\"pgBody\">Add or manage pages<\/button><\/div>\r\n<div id=\"pgBody\" hidden>\r\n <div class=\"seg\" id=\"pgTabs\" role=\"radiogroup\" aria-label=\"How to add pages\"><button type=\"button\" role=\"radio\" aria-checked=\"true\" data-v=\"paste\">Paste page source<\/button><button type=\"button\" role=\"radio\" aria-checked=\"false\" data-v=\"upload\">Upload HTML files<\/button><\/div>\r\n <div id=\"pgPaste\" class=\"pg-pane\"><div class=\"pg-row\"><label class=\"fld\"><span>Page address<\/span><input type=\"url\" id=\"pgUrl\" placeholder=\"https:\/\/yoursite.com\/about\/\"><\/label><\/div>\r\n  <label class=\"fld\"><span>Page source<\/span><textarea id=\"pgHtml\" rows=\"6\" placeholder=\"Paste the full HTML of the page here\"><\/textarea><small>In your browser open the page, press Ctrl+U (Cmd+Option+U on Mac), select all and copy. Add one page at a time.<\/small><\/label>\r\n  <div><button type=\"button\" class=\"btn primary\" id=\"pgAdd\">Add page<\/button><\/div><\/div>\r\n <div id=\"pgUpload\" class=\"pg-pane\" hidden><label class=\"fld\" style=\"max-width:520px\"><span>Your site address<\/span><input type=\"url\" id=\"pgBase\" placeholder=\"https:\/\/yoursite.com\"><small>File paths are turned into addresses. about\/index.html becomes \/about\/.<\/small><\/label>\r\n  <label class=\"drop\" id=\"pgDrop\" for=\"pgFiles\"><input type=\"file\" id=\"pgFiles\" class=\"sr\" accept=\".html,.htm,text\/html\" multiple>Drop .html files here or <u>&nbsp;choose files&nbsp;<\/u><\/label>\r\n  <div><label class=\"btn ghost sm\" for=\"pgDir\" style=\"cursor:pointer\">Choose a whole folder<\/label><input type=\"file\" id=\"pgDir\" class=\"sr\" webkitdirectory multiple><\/div><\/div>\r\n <label class=\"fld\"><span>Sitemap or URL list (optional)<\/span><textarea id=\"pgMap\" rows=\"3\" placeholder=\"Paste sitemap.xml or one address per line\"><\/textarea><small>Used to tell real pages from broken links and to find orphan pages.<\/small><\/label>\r\n <p class=\"msg\" id=\"pgMsg\" role=\"status\"><\/p>\r\n <div id=\"pgList\"><\/div>\r\n <div class=\"pg-foot\"><button type=\"button\" class=\"btn ghost sm\" data-act=\"sample\">Load the example site<\/button><button type=\"button\" class=\"btn danger sm\" id=\"pgClear\">Remove all pages<\/button><\/div>\r\n <p class=\"muted\" style=\"font-size:13.5px\">Browsers cannot read other websites for you, so tools work on page source you add here. It never leaves your device and works on staging and password-protected pages too.<\/p>\r\n<\/div><\/section>`}\r\nfunction pgMsg(t,type){const m=$('#pgMsg');if(m){m.textContent=t;m.className='msg '+(type||'')}}\r\nfunction parseMap(txt){const urls=[];const loc=txt.match(\/<loc>\\s*([^<\\s]+)\\s*<\\\/loc>\/gi);if(loc)loc.forEach(x=>urls.push(x.replace(\/<\\\/?loc>\/gi,'').trim()));else txt.split(\/\\s+\/).forEach(x=>{if(\/^https?:\\\/\\\/\/i.test(x))urls.push(x)});return[...new Set(urls)]}\r\nfunction renderPgList(){\r\n  const sum=$('#pgSum'),l=$('#pgList');if(!sum)return;\r\n  $('#pgEx').hidden=!S.sample;\r\n  sum.textContent=S.pages.length?`${S.pages.length} page${S.pages.length>1?'s':''} loaded${S.sample?'. These are examples, so add your own pages to replace them.':'.'}${S.extra.length?` ${S.extra.length} sitemap address${S.extra.length>1?'es':''}.`:''}`:'No pages loaded yet. Add a page or load the example site.';\r\n  l.innerHTML=S.pages.length?`<div class=\"plist\">${S.pages.map(p=>`<div><span class=\"u\" title=\"${esc(p.url)}\">${esc(p.url.replace(\/^https?:\\\/\\\/\/,''))}<\/span><span class=\"muted nw\">${fmt(p.raw.words)} words<\/span><button type=\"button\" data-rm=\"${p.id}\" aria-label=\"Remove ${esc(pathOf(p.url))}\">&times;<\/button><\/div>`).join('')}<\/div>`:'';\r\n}\r\nfunction onPagesChanged(){recompute();renderPgList();const t=S.tool;if(t&&t.needs)t.run();else if(t&&t.run)t.run();refreshHero()}\r\nfunction loadSample(){\r\n  const d=sampleData();S.pages=[];S.nextId=1;d.pages.forEach(p=>addPage(p[1],p[0]));S.extra=parseMap(d.map);S.sample=true;\r\n  const m=$('#pgMap');if(m)m.value=d.map;\r\n  onPagesChanged();pgMsg('Example site loaded: 9 pages for a fictional coffee roaster.','ok');\r\n}\r\nfunction mountPages(){\r\n  const el=$('#pgPanel');if(!el)return;\r\n  const open=S.pgOpen===null?!S.pages.length:S.pgOpen;\r\n  const setOpen=o=>{S.pgOpen=o;$('#pgBody').hidden=!o;$('#pgToggle').setAttribute('aria-expanded',String(o));$('#pgToggle').textContent=o?'Hide page manager':'Add or manage pages'};\r\n  setOpen(open);$('#pgToggle').addEventListener('click',()=>setOpen($('#pgBody').hidden));\r\n  bindSeg($('#pgTabs'),v=>{S.pgTab=v;$('#pgPaste').hidden=v!=='paste';$('#pgUpload').hidden=v!=='upload'});\r\n  $('#pgMap').value=S.extra.join('\\n');\r\n  $('#pgAdd').addEventListener('click',()=>{\r\n    const html=$('#pgHtml').value;if(html.trim().length<20){pgMsg('Paste the page source first.','err');return}\r\n    try{leaveSample();const p=addPage(html,$('#pgUrl').value);$('#pgHtml').value='';$('#pgUrl').value='';onPagesChanged();pgMsg(`Added ${pathOf(p.url)} with ${fmt(p.raw.words)} words.`,'ok')}catch(e){pgMsg(e.message,'err')}});\r\n  const addFiles=async files=>{\r\n    const baseIn=$('#pgBase').value.trim();if(!baseIn){pgMsg('Enter your site address first, such as https:\/\/yoursite.com.','err');return}\r\n    let b;try{b=new URL(\/^https?:\\\/\\\/\/i.test(baseIn)?baseIn:'https:\/\/'+baseIn)}catch(e){pgMsg('That site address is not valid.','err');return}\r\n    const list=Array.from(files).filter(f=>\/\\.html?$\/i.test(f.name));if(!list.length){pgMsg('No .html files found in that selection.','err');return}\r\n    leaveSample();let ok=0,bad=0;\r\n    for(const f of list){try{const html=await f.text();let rel=f.webkitRelativePath||f.name;if(f.webkitRelativePath&&rel.includes('\/'))rel=rel.split('\/').slice(1).join('\/');addPage(html,b.origin+b.pathname.replace(\/\\\/$\/,'')+'\/'+rel.replace(\/^\\\/+\/,''));ok++}catch(e){bad++}}\r\n    onPagesChanged();pgMsg(`Added ${ok} page${ok===1?'':'s'}${bad?`, ${bad} could not be read`:''}.`,bad?'err':'ok')};\r\n  $('#pgFiles').addEventListener('change',e=>addFiles(e.target.files));$('#pgDir').addEventListener('change',e=>addFiles(e.target.files));\r\n  const d=$('#pgDrop');['dragenter','dragover'].forEach(n=>d.addEventListener(n,e=>{e.preventDefault();d.classList.add('over')}));['dragleave','drop'].forEach(n=>d.addEventListener(n,e=>{e.preventDefault();d.classList.remove('over')}));d.addEventListener('drop',e=>addFiles(e.dataTransfer.files));\r\n  let mt;$('#pgMap').addEventListener('input',e=>{clearTimeout(mt);mt=setTimeout(()=>{S.extra=parseMap(e.target.value);if(S.sample)S.sample=false;onPagesChanged()},300)});\r\n  $('#pgList').addEventListener('click',e=>{const b=e.target.closest('[data-rm]');if(!b)return;S.pages=S.pages.filter(p=>String(p.id)!==b.dataset.rm);onPagesChanged()});\r\n  $('#pgClear').addEventListener('click',()=>{S.pages=[];S.extra=[];S.sample=false;$('#pgMap').value='';onPagesChanged();pgMsg('All pages removed.','ok')});\r\n  renderPgList();\r\n}\r\n\r\n\/* ---------- views ---------- *\/\r\nconst view=()=>$('#view');\r\nfunction showHome(scrollTo){\r\n  S.tool=null;document.title='Onground SEO Tools';\r\n  const groups=[['page','Page level tools','Audit one page at a time, or run the check across every loaded page.'],['site','Whole site tools','Load several pages once and compare them with each other.'],['list','Checklists','Interactive checklists that score your work and save your progress.']];\r\n  view().innerHTML=`<section class=\"hero\"><div class=\"hero-l\"><p class=\"eyebrow\">Free SEO toolkit<\/p><h1>Audit, crawl and fix your site's SEO<\/h1><p class=\"lede\">Ten tools in one place. Add your pages once and every tool works on them, with clear fixes for each problem.<\/p>\r\n  <div class=\"search\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"M20 20l-3.5-3.5\"\/><\/svg><label class=\"sr\" for=\"q\">Search tools<\/label><input type=\"search\" id=\"q\" placeholder=\"Search tools, for example broken links or titles\" autocomplete=\"off\"><\/div>\r\n  <div class=\"hero-actions\"><a class=\"btn accent\" href=\"#audit\">Run a free audit<\/a><a class=\"btn ghost\" href=\"#crawler\">Crawl the example site<\/a><\/div><\/div>\r\n  <div class=\"hero-r\" id=\"heroCard\"><\/div><\/section>\r\n  <div id=\"grid\">${groups.map(g=>`<section class=\"group\" data-g=\"${g[0]}\"><div class=\"group-h\"><h2><span class=\"dot ${g[0]}\"><\/span>${g[1]}<\/h2><span class=\"muted\">${g[2]}<\/span><\/div><div class=\"cards\">${TOOLS.filter(t=>t.scope===g[0]).map(t=>`<a class=\"card\" href=\"#${t.id}\" data-name=\"${esc((t.name+' '+t.desc).toLowerCase())}\"><div class=\"card-top\">${tic(t.icon)}<span class=\"scope\"><span class=\"dot ${t.scope}\"><\/span>${SCOPE[t.scope]}<\/span><\/div><h3>${esc(t.name)}<\/h3><p>${esc(t.desc)}<\/p><span class=\"go\">Open tool &rarr;<\/span><\/a>`).join('')}<\/div><\/section>`).join('')}<div class=\"empty\" id=\"noMatch\" hidden><h3>No tools match that search<\/h3><p>Try a shorter word such as \"links\", \"images\" or \"title\".<\/p><\/div><\/div>\r\n  <section class=\"how\" id=\"howSection\"><h2>How it works<\/h2><div class=\"how-grid\"><div><div class=\"how-n\">1<\/div><h3>Add your pages<\/h3><p>Paste page source or upload HTML files. Want to try first? The example site loads automatically.<\/p><\/div><div><div class=\"how-n\">2<\/div><h3>Pick a tool<\/h3><p>Page tools audit one page. Whole site tools compare pages and trace links between them.<\/p><\/div><div><div class=\"how-n\">3<\/div><h3>Fix what matters<\/h3><p>Every issue comes with a plain-language fix. Start with the red items, then the warnings.<\/p><\/div><\/div><p class=\"note\">Browsers cannot read other websites on your behalf, so these tools work on the HTML you give them. Everything runs on your device and nothing is uploaded, which also means staging sites and private pages are fine.<\/p><\/section>`;\r\n  $('#q').addEventListener('input',e=>{const q=e.target.value.trim().toLowerCase();let any=false;$$('.card').forEach(c=>{const m=!q||c.dataset.name.includes(q);c.hidden=!m;if(m)any=true});$$('.group').forEach(g=>g.hidden=!$$('.card:not([hidden])',g).length);$('#noMatch').hidden=any});\r\n  refreshHero();\r\n  if(scrollTo==='how'){const h=$('#howSection');if(h)h.scrollIntoView()}else window.scrollTo(0,0);\r\n}\r\nfunction refreshHero(){\r\n  const el=$('#heroCard');if(!el)return;\r\n  if(!S.pages.length){el.innerHTML=`<div class=\"report\"><h2 style=\"font-size:18px\">Your report appears here<\/h2><p class=\"muted\">Load the example site to see a live audit.<\/p><button class=\"btn primary\" type=\"button\" data-act=\"sample\">Load the example site<\/button><\/div>`;return}\r\n  const p=S.home||S.pages[0],sc=auditScore(auditChecks(p)),iss=S.pages.reduce((a,x)=>{crawlIssues(x).forEach(i=>a[i.sev]++);return a},{fail:0,warn:0});\r\n  const top=[...S.pages.flatMap(x=>crawlIssues(x).map(i=>({...i,pg:x})))].sort((a,b)=>(a.sev==='fail'?0:1)-(b.sev==='fail'?0:1)).slice(0,3);\r\n  el.innerHTML=`<div class=\"report\"><div class=\"report-h\">${ring(sc,'home page',1)}<div><span class=\"tag\">${S.sample?'Live example':'Your site'}<\/span><h2 style=\"font-size:19px;margin-top:6px\">${S.pages.length} pages crawled<\/h2><p class=\"muted\">${iss.fail} critical issues, ${iss.warn} warnings<\/p><\/div><\/div><ul>${top.map(i=>`<li>${pill(i.sev,i.sev==='fail'?'Issue':'Warning')}<span><b>${esc(i.type)}<\/b> on ${esc(pathOf(i.pg.url))}<\/span><\/li>`).join('')}<\/ul><a class=\"btn primary\" href=\"#crawler\">See the full crawl<\/a><\/div>`;\r\n}\r\nfunction showTool(t){\r\n  S.tool=t;document.title=t.name+' | Onground SEO Tools';\r\n  const rel=TOOLS.filter(x=>x.scope===t.scope&&x!==t).concat(TOOLS.filter(x=>x.scope!==t.scope&&x!==t)).slice(0,4);\r\n  view().innerHTML=`<div class=\"tv-head\"><div class=\"crumbs\"><a class=\"back\" href=\"#home\">&larr; All tools<\/a><label class=\"switcher\"><span class=\"sr\">Switch tool<\/span><select id=\"sw\" aria-label=\"Switch tool\">${TOOLS.map(x=>`<option value=\"${x.id}\"${x===t?' selected':''}>${esc(x.name)}<\/option>`).join('')}<\/select><\/label><\/div><div class=\"tv-title\">${tic(t.icon)}<h1>${esc(t.name)}<\/h1><\/div><p class=\"tv-desc\">${esc(t.desc)}<\/p><p><span class=\"tag\"><span class=\"dot ${t.scope}\" style=\"margin-right:6px\"><\/span>${SCOPE[t.scope]}<\/span><\/p><\/div>\r\n  ${t.needs?pagesPanel():''}<div class=\"tool-body\" id=\"toolBody\">${t.shell()}<\/div>\r\n  <section class=\"related\"><h2>More tools<\/h2><div class=\"related-l\">${rel.map(x=>`<a href=\"#${x.id}\">${esc(x.name)}<\/a>`).join('')}<\/div><\/section>`;\r\n  $('#sw').addEventListener('change',e=>{location.hash=e.target.value});\r\n  if(t.needs)mountPages();\r\n  t.bind();t.run();window.scrollTo(0,0);\r\n}\r\nfunction route(){\r\n  const id=(location.hash||'#home').slice(1);\r\n  if(BY[id])showTool(BY[id]);else showHome(id);\r\n}\r\ndocument.addEventListener('click',e=>{if(e.target.closest('[data-act=\"sample\"]')){e.preventDefault();loadSample()}});\r\nwindow.addEventListener('hashchange',route);\r\n\r\n\/* ---------- boot ---------- *\/\r\n(function(){\r\n  const d=sampleData();d.pages.forEach(p=>addPage(p[1],p[0]));S.extra=parseMap(d.map);S.sample=true;recompute();route();\r\n})();\r\n})();\r\n<\/script>\r\n\r\n<\/body><\/html>\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Onground SEO Tools Onground MediaSEO Tools All toolsHow it works &copy; 2026 Onground Media. All tools run in your browser.Example [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-278","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=\/wp\/v2\/pages\/278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=278"}],"version-history":[{"count":4,"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=\/wp\/v2\/pages\/278\/revisions"}],"predecessor-version":[{"id":282,"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=\/wp\/v2\/pages\/278\/revisions\/282"}],"wp:attachment":[{"href":"https:\/\/ongroundmedia.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}