{
  "version": "1.0.0",
  "exported_at": "2026-06-02T20:10:00.000Z",
  "project": {
    "name": "Bwin Spain Scraper",
    "description": "Extracts football odds from Bwin Spain/Mexico/Colombia listing URLs, matching the Octoparse fields: Pais_Liga, Local, Visitante, Fecha, Resultado_1, Resultado_X, Resultado_2, Goles, Más_de, Menos_de. Uses a multi-URL navigation loop and appends all extracted rows to one CSV. It safely dismisses cookie banners via JavaScript, scrolls to trigger lazy loading, and marks likely Bwin event rows only when they contain at least two participant/team elements plus multiple odds. If Bwin shows a geo/IP-block, closed/unavailable page, CAPTCHA, or no detectable odds rows, the template writes a diagnostic row to the same CSV and continues to the next URL. Use an appropriate Spain/Mexico/Colombia regional proxy for real odds data.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser window dimensions",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "width": 1920,
        "height": 1080,
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 456,
      "position_y": 220,
      "config": {
        "urls": [
          "https://sports.bwin.mx/es/sports/f%C3%BAtbol-4/apuestas/italia-20",
          "https://sports.bwin.com/es/sports/f%C3%BAtbol-4/apuestas/argentina-38/liga-profesional-102540",
          "https://sports.bwin.es/es/sports/f%C3%BAtbol-4/apuestas/europa-7/uefa-europa-conference-league-0:9"
        ],
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "timeout": 45,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1128,
      "position_y": 220,
      "config": {
        "duration": 5,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1464,
      "position_y": 220,
      "config": {
        "jsCode": "(()=>{try{if(window.OneTrust&&typeof OneTrust.AcceptAll==='function')OneTrust.AcceptAll();}catch(e){};const sels=['#onetrust-accept-btn-handler','#accept-recommended-btn-handler','button[data-testid=\"cookie-banner-accept-button\"]','button[id*=accept i]','button[class*=accept i]'];for(const sel of sels){try{document.querySelectorAll(sel).forEach(b=>{try{b.click();}catch(e){}});}catch(e){}}document.querySelectorAll('[id*=onetrust i],[class*=onetrust i],[id*=cookie i],[class*=cookie i]').forEach(e=>{try{if(getComputedStyle(e).position==='fixed'||/banner|consent|cookie|onetrust/i.test(e.id+' '+e.className)){e.style.display='none';e.style.visibility='hidden';e.style.pointerEvents='none';}}catch(x){}});return true;})()",
        "waitForCompletion": true,
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1800,
      "position_y": 220,
      "config": {
        "duration": 1,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "text-contains-1",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 2136,
      "position_y": 220,
      "config": {
        "selector": "body",
        "text": "blocked",
        "caseSensitive": false,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "text-contains-2",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 2136,
      "position_y": 520,
      "config": {
        "selector": "body",
        "text": "bloquead",
        "caseSensitive": false,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "text-contains-3",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 2640,
      "position_y": 800,
      "config": {
        "selector": "body",
        "text": "not available",
        "caseSensitive": false,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "scroll-1",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll page or element",
      "position_x": 2976,
      "position_y": 800,
      "config": {
        "direction": "down",
        "amount": 1200,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-3",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3312,
      "position_y": 800,
      "config": {
        "duration": 4,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-2",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 3648,
      "position_y": 800,
      "config": {
        "jsCode": "(()=>{const text=e=>(e&&e.textContent?e.textContent:'').trim().replace(/\\s+/g,' ');document.querySelectorAll('[data-uscraper-bwin-row]').forEach(e=>e.removeAttribute('data-uscraper-bwin-row'));const oddRe=/[+−-]?\\d{2,4}\\b|\\b\\d+[,.]\\d{2}\\b/;const rowSelectors=['ms-event','ms-prematch-event','ms-event-group ms-event','ms-six-pack-event','ms-coupon-event','ms-grid-event','.grid-event','.event-row','[data-testid*=event i]','[data-test-id*=event i]','[class*=event-card i]','[class*=fixture i]','[class*=grid-event i]'];const participantSel='[class*=participant i],[class*=competitor i],[class*=team i],[class*=player i],[data-testid*=participant i],[data-test-id*=participant i],[data-testid*=competitor i],[data-test-id*=competitor i]';const oddsSel='button,ms-option,ms-event-pick,[class*=odd i],[class*=odds i],[class*=option i],[class*=price i],[data-testid*=option i],[data-test-id*=option i]';const badShell=s=>/tal[oó]n de apuestas|mis apuestas|bet slip|my bets|iniciar sesi[oó]n|registr/i.test(s);const mark=e=>{if(!e||e===document.body||e===document.documentElement)return false;const r=e.getBoundingClientRect();if(r.width<80||r.height<20)return false;const allText=text(e);if(!allText||allText.length<20||allText.length>2500||badShell(allText))return false;const oddEls=[...e.querySelectorAll(oddsSel)].map(text).filter(s=>oddRe.test(s));const participantEls=[...e.querySelectorAll(participantSel)].map(text).filter(s=>s&&s.length<90&&!oddRe.test(s)&&!badShell(s));const uniqueParticipants=[...new Set(participantEls)];if(oddEls.length>=2&&uniqueParticipants.length>=2){e.setAttribute('data-uscraper-bwin-row','1');return true;}return false;};document.querySelectorAll(rowSelectors.join(',')).forEach(mark);document.querySelectorAll(participantSel).forEach(p=>{let e=p;for(let i=0;e&&i<8;i++,e=e.parentElement){if(mark(e))break;}});return document.querySelectorAll('[data-uscraper-bwin-row=\"1\"]').length;})()",
        "waitForCompletion": true,
        "timeout": 15,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 3984,
      "position_y": 800,
      "config": {
        "selector": "[data-uscraper-bwin-row='1']",
        "color": "bg-[#42be65]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 4320,
      "position_y": 800,
      "config": {
        "rowSelector": "[data-uscraper-bwin-row='1']",
        "fileName": "bwin-spanish-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "Pais_Liga",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';let e=ROW;while(e&&e!==document.body){const prev=e.previousElementSibling;if(prev){const h=prev.querySelector?.('[class*=league i],[class*=competition i],[class*=tournament i],h1,h2,h3')||prev;const s=t(h);if(s&&s.length<140&&!/[+−-]?\\d+[,.]?\\d+/.test(s))return s;}const h=e.querySelector?.('[class*=league i],[class*=competition i],[class*=tournament i],h1,h2,h3');if(h&&h!==ROW){const s=t(h);if(s&&s.length<140&&!/[+−-]?\\d+[,.]?\\d+/.test(s))return s;}e=e.parentElement;}return t(document.querySelector('h1,h2,[class*=breadcrumb i],[class*=competition i]'));})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Local",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const bad=s=>!s||s.length>90||/[+−-]?\\d+[,.]?\\d*\\s*$/.test(s)||/tal[oó]n de apuestas|mis apuestas|bet slip|my bets/i.test(s);let names=[...ROW.querySelectorAll('[class*=participant i],[class*=competitor i],[data-test-id*=participant i],[data-testid*=participant i],[class*=team i],[class*=player i]')].map(t).filter(s=>!bad(s));names=[...new Set(names)];return names[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Visitante",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const bad=s=>!s||s.length>90||/[+−-]?\\d+[,.]?\\d*\\s*$/.test(s)||/tal[oó]n de apuestas|mis apuestas|bet slip|my bets/i.test(s);let names=[...ROW.querySelectorAll('[class*=participant i],[class*=competitor i],[data-test-id*=participant i],[data-testid*=participant i],[class*=team i],[class*=player i]')].map(t).filter(s=>!bad(s));names=[...new Set(names)];return names[1]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Fecha",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const el=ROW.querySelector('time,[datetime],[class*=date i],[class*=time i],[data-test-id*=time i],[data-testid*=time i]');if(el)return el.getAttribute('datetime')||t(el);const m=t(ROW).match(/(Hoy|Mañana|Today|Tomorrow|\\d{1,2}\\/\\d{1,2}\\/\\d{2,4})\\s*\\/?\\s*\\d{1,2}:\\d{2}/i);return m?m[0]:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Resultado_1",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const odds=[...ROW.querySelectorAll('button,ms-option,ms-event-pick,[class*=option i],[class*=odd i],[class*=odds i],[class*=price i],[data-test-id*=option i],[data-testid*=option i]')].map(t).map(s=>s.match(/[+−-]?\\d+[,.]?\\d*/)?.[0]||'').filter(Boolean);return odds[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Resultado_X",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const odds=[...ROW.querySelectorAll('button,ms-option,ms-event-pick,[class*=option i],[class*=odd i],[class*=odds i],[class*=price i],[data-test-id*=option i],[data-testid*=option i]')].map(t).map(s=>s.match(/[+−-]?\\d+[,.]?\\d*/)?.[0]||'').filter(Boolean);return odds[1]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Resultado_2",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const odds=[...ROW.querySelectorAll('button,ms-option,ms-event-pick,[class*=option i],[class*=odd i],[class*=odds i],[class*=price i],[data-test-id*=option i],[data-testid*=option i]')].map(t).map(s=>s.match(/[+−-]?\\d+[,.]?\\d*/)?.[0]||'').filter(Boolean);return odds[2]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Goles",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const vals=[...ROW.querySelectorAll('*')].map(t).map(s=>s.match(/\\b\\d+[,.]5\\b/)?.[0]||'').filter(Boolean);return vals[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Más_de",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const odds=[...ROW.querySelectorAll('button,ms-option,ms-event-pick,[class*=option i],[class*=odd i],[class*=odds i],[class*=price i],[data-test-id*=option i],[data-testid*=option i]')].map(t).map(s=>s.match(/[+−-]?\\d+[,.]?\\d*/)?.[0]||'').filter(Boolean);return odds[3]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Menos_de",
            "selector": "(()=>{const t=e=>e?e.textContent.trim().replace(/\\s+/g,' '):'';const odds=[...ROW.querySelectorAll('button,ms-option,ms-event-pick,[class*=option i],[class*=odd i],[class*=odds i],[class*=price i],[data-test-id*=option i],[data-testid*=option i]')].map(t).map(s=>s.match(/[+−-]?\\d+[,.]?\\d*/)?.[0]||'').filter(Boolean);return odds[4]||'';})()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "structured-export-2",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2472,
      "position_y": 520,
      "config": {
        "rowSelector": "body",
        "fileName": "bwin-spanish-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#da1e28]",
        "columns": [
          {
            "name": "Pais_Liga",
            "selector": "(()=>{const body=(document.body&&document.body.innerText||'').replace(/\\s+/g,' ').trim();if(/blocked|bloquead/i.test(body)||/blocked|bloquead/i.test(document.title||''))return 'DIAGNOSTIC: BWIN GEO/IP BLOCKED';if(/not available|no longer available|closed/i.test(body)||/closed/i.test(location.href))return 'DIAGNOSTIC: BWIN UNAVAILABLE/CLOSED PAGE';if(/captcha|verify|robot/i.test(body))return 'DIAGNOSTIC: CAPTCHA/VERIFICATION PAGE';return 'DIAGNOSTIC: NO DETECTABLE BWIN ODDS ROWS';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Local",
            "selector": "location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Visitante",
            "selector": "document.title || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Fecha",
            "selector": "new Date().toISOString()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Resultado_1",
            "selector": "''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Resultado_X",
            "selector": "''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Resultado_2",
            "selector": "''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Goles",
            "selector": "''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Más_de",
            "selector": "''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Menos_de",
            "selector": "''",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2808,
      "position_y": 520,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    }
  ],
  "connections": [
    {
      "from_block_id": "set-window-size-1",
      "from_connector_id": "right",
      "to_block_id": "navigate-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "navigate-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-2",
      "from_connector_id": "right",
      "to_block_id": "text-contains-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "true",
      "to_block_id": "structured-export-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "false",
      "to_block_id": "text-contains-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-2",
      "from_connector_id": "true",
      "to_block_id": "structured-export-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-2",
      "from_connector_id": "false",
      "to_block_id": "text-contains-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-3",
      "from_connector_id": "true",
      "to_block_id": "structured-export-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-3",
      "from_connector_id": "false",
      "to_block_id": "scroll-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-3",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-2",
      "from_connector_id": "right",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "structured-export-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-2",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-entry",
      "element_type": "group",
      "title": "Entry & Setup",
      "color": "#4589ff",
      "position_x": 48,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "set-window-size-1"
        ]
      }
    },
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 384,
      "position_y": 116,
      "width": 3176,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "sleep-2",
          "sleep-3"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1392,
      "position_y": 116,
      "width": 2504,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1",
          "scroll-1",
          "inject-javascript-2"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 2064,
      "position_y": 116,
      "width": 2168,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "text-contains-1",
          "text-contains-2",
          "text-contains-3",
          "element-exists-1",
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2400,
      "position_y": 416,
      "width": 2168,
      "height": 576,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1",
          "structured-export-2"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Extracts football odds from Bwin Spain/Mexico/Colombia listing URLs, matching the Octoparse fields: Pais_Liga, Local, Visitante, Fecha, Resultado_1, Resultado_X, Resultado_2, Goles, Más_de, Menos_de. Uses a multi-URL navigation loop and appends all extracted rows to one CSV. It safely dismisses cookie banners via JavaScript, scrolls to trigger lazy loading, and marks likely Bwin event rows only when they contain at least two participant/team elements plus multiple odds. If Bwin shows a geo/IP-block, closed/unavailable page, CAPTCHA, or no detectable odds rows, the template writes a diagnostic row to the same CSV and continues to the next URL. Use an appropriate Spain/Mexico/Colombia regional proxy for real odds data.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(()=>{try{if(window.OneTrust&&typeof OneTrust.AcceptAll==='function')OneTrust.AcceptAll();}catch(e){...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1664,
      "position_y": 200,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-text-contains-1",
      "element_type": "note",
      "title": "Note: Text Contains",
      "content": "Condition block: checks `body`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2336,
      "position_y": 200,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-1"
      }
    },
    {
      "id": "note-block-text-contains-2",
      "element_type": "note",
      "title": "Note: Text Contains",
      "content": "Condition block: checks `body`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2336,
      "position_y": 500,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-2"
      }
    },
    {
      "id": "note-block-text-contains-3",
      "element_type": "note",
      "title": "Note: Text Contains",
      "content": "Condition block: checks `body`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2840,
      "position_y": 780,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-3"
      }
    },
    {
      "id": "note-block-inject-javascript-2",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(()=>{const text=e=>(e&&e.textContent?e.textContent:'').trim().replace(/\\s+/g,' ');document.querySel...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 3848,
      "position_y": 780,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-2"
      }
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `[data-uscraper-bwin-row='1']`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 4184,
      "position_y": 780,
      "width": 340,
      "height": 139,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (Pais_Liga, Local, Visitante, Fecha, Resultado_1). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 4520,
      "position_y": 780,
      "width": 340,
      "height": 129,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-structured-export-2",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (Pais_Liga, Local, Visitante, Fecha, Resultado_1). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2672,
      "position_y": 500,
      "width": 340,
      "height": 129,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-2"
      }
    },
    {
      "id": "note-block-loop-continue-1",
      "element_type": "note",
      "title": "Note: Loop Continue",
      "content": "Loop Continue advances a multi-URL or multi-text loop. Place at the end of the loop body with a clear back-edge to the loop start.",
      "color": "#ee5396",
      "position_x": 3008,
      "position_y": 500,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}