{"id":299485,"date":"2026-04-29T15:56:25","date_gmt":"2026-04-29T19:56:25","guid":{"rendered":"https:\/\/borhanifar.com\/?page_id=299485"},"modified":"2026-07-19T16:45:29","modified_gmt":"2026-07-19T20:45:29","slug":"latest-draws","status":"publish","type":"page","link":"https:\/\/borhanifar.com\/en\/immigrate-canada\/express-entry\/latest-draws\/","title":{"rendered":"Latest Express Entry Draws (IRCC) \u2013 Updated Today"},"content":{"rendered":"\n<div class=\"et_pb_section_0 et_pb_section et_section_regular et_block_section\"><div class=\"et_pb_row_0 et_pb_row et_block_row\"><div class=\"et_pb_column_0 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\"><div class=\"et_pb_text_0 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h1 style=\"text-align: left; direction: ltr;\">Latest Express Entry Draws (IRCC) \u2013 Updated Today<\/h1>\n<section dir=\"ltr\" role=\"region\" aria-label=\"Express Entry latest draws quick overview\">\n<div class=\"featured-snippet\">\n<p class=\"snippet-text\">\n      Stay updated with the latest Express Entry draws, including CRS scores, number of invitations, and draw types. Data is updated frequently to reflect the most recent IRCC rounds.\n    <\/p>\n<\/p><\/div>\n<\/section>\n<\/div><\/div><\/div><div class=\"et_pb_column_1 et_pb_column et_pb_column_1_2 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\"><div class=\"et_pb_post_title_0 et_pb_post_title et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_title_container\"><\/div><\/div><\/div><\/div><\/div><div class=\"et_pb_section_1 et_pb_section et_section_regular et_block_section\"><div class=\"et_pb_row_1 et_pb_row et_pb_row_3-4_1-4 et_block_row et_block_row_3-4_1-4\"><div class=\"et_pb_column_2 et_pb_column et_pb_column_3_4 et_block_column et_pb_css_mix_blend_mode_passthrough\"><div class=\"et_pb_text_1 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h2 style=\"text-align: left; direction: ltr;\">Latest Express Entry Draw Results (CRS Scores &amp; Invitations)<\/h2>\n<p style=\"text-align: left; direction: ltr;\">In the latest Express Entry draw, IRCC announces the CRS cut-off score, number of invitations issued, and draw type. These results show current selection trends for Canada PR.<\/p>\n<\/div><\/div><div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><section id=\"ee-draws-table\" dir=\"ltr\" style=\"margin: 30px 0; text-align: left;\" aria-label=\"Canada Express Entry draws table\">\n <style>\n    .ee-fa-wrap{\n      max-width:100%;\n      margin:0 auto;\n      font-family:inherit;\n      color:#2f2f2f;\n    }\n\n    .ee-fa-head{margin-bottom:16px;}\n\n    .ee-fa-head h3{\n      margin:0 0 8px;\n      font-size:24px;\n      line-height:1.7;\n      color:#1f2937;\n    }\n\n    .ee-fa-head p{\n      margin:0;\n      font-size:16px;\n      line-height:2;\n      color:#4b5563;\n    }\n\n    .ee-fa-meta{\n      display:flex;\n      flex-wrap:wrap;\n      gap:10px;\n      margin-top:12px;\n      align-items:center;\n    }\n\n    .ee-fa-badge{\n      background:#f8fafc;\n      border:1px solid #d1d5db;\n      border-radius:10px;\n      padding:8px 12px;\n      font-size:16px;\n      color:#374151;\n    }\n\n    .ee-fa-refresh{\n      height:40px;\n      border:1px solid #2563eb;\n      background:#2563eb;\n      color:#fff;\n      border-radius:8px;\n      padding:0 14px;\n      font-size:16px;\n      font-family:inherit;\n      cursor:pointer;\n    }\n\n    .ee-fa-refresh:disabled{\n      opacity:.6;\n      cursor:not-allowed;\n    }\n\n    .ee-fa-controls{\n      display:flex;\n      justify-content:space-between;\n      align-items:center;\n      flex-wrap:wrap;\n      gap:14px;\n      margin:18px 0 14px;\n    }\n\n    .ee-fa-search,\n    .ee-fa-length{\n      display:flex;\n      align-items:center;\n      gap:10px;\n      flex-wrap:wrap;\n    }\n\n    .ee-fa-label{\n      font-size:16px;\n      font-weight:500;\n      color:#1f2937;\n    }\n\n    .ee-fa-input{\n      width:260px;\n      max-width:100%;\n      height:42px;\n      border:1px solid #9ca3af;\n      border-radius:8px;\n      padding:0 12px;\n      font-size:16px;\n      font-family:inherit;\n      background:#fff;\n      outline:none;\n    }\n\n    .ee-fa-input:focus,\n    .ee-fa-select:focus{\n      border-color:#2563eb;\n      box-shadow:0 0 0 3px rgba(37,99,235,.12);\n    }\n\n    .ee-fa-select{\n      height:42px;\n      border:1px solid #9ca3af;\n      border-radius:8px;\n      padding:0 10px;\n      font-size:16px;\n      font-family:inherit;\n      background:#fff;\n      outline:none;\n    }\n\n    .ee-fa-info{\n      font-size:16px;\n      color:#4b5563;\n    }\n\n    .ee-fa-table-wrap{\n      overflow-x:auto;\n      border:1px solid #e5e7eb;\n      border-radius:14px;\n      background:#fff;\n    }\n\n    .ee-fa-table{\n      width:100%;\n      border-collapse:collapse;\n      table-layout:auto;\n    }\n\n    .ee-fa-table th,\n    .ee-fa-table td{\n      padding:6px 12px;\n      text-align:left;\n      vertical-align:top;\n      border-bottom:1px solid #e5e7eb;\n      font-size:15px;\n      line-height:1.6;\n    }\n\n    .ee-fa-table th{\n      background:#f9fafb;\n      color:#1f2937;\n      font-size:14px;\n      font-weight:600;\n      white-space:normal;\n    }\n\n    .ee-fa-table tr:last-child td{border-bottom:none;}\n\n    .ee-fa-table a{\n      color:#1f4a83;\n      text-decoration:underline;\n    }\n\n    .ee-fa-sort{\n      display:inline-flex;\n      flex-direction:column;\n      justify-content:center;\n      align-items:center;\n      width:22px;\n      height:22px;\n      margin-left:6px;\n      border:1px solid #cbd5e1;\n      background:#f3f4f6;\n      border-radius:4px;\n      font-size:10px;\n      line-height:10px;\n      cursor:pointer;\n      color:#6b7280;\n      vertical-align:middle;\n      user-select:none;\n    }\n\n    .ee-fa-sort.active{\n      color:#111827;\n      border-color:#94a3b8;\n      background:#e5e7eb;\n    }\n\n    .ee-fa-loading,\n    .ee-fa-empty,\n    .ee-fa-error{\n      padding:22px 12px;\n      text-align:center;\n      font-size:16px;\n      color:#4b5563;\n    }\n\n    .ee-fa-error{color:#b91c1c;}\n\n    .ee-fa-pagination{\n      display:flex;\n      justify-content:center;\n      align-items:center;\n      flex-wrap:wrap;\n      gap:8px;\n      margin-top:16px;\n    }\n\n    .ee-fa-page{\n      min-width:42px;\n      height:42px;\n      padding:0 12px;\n      border:1px solid #d1d5db;\n      background:#fff;\n      border-radius:8px;\n      cursor:pointer;\n      font-size:15px;\n      font-family:inherit;\n      color:#1f2937;\n    }\n\n    .ee-fa-page.active{\n      background:#2563eb;\n      border-color:#2563eb;\n      color:#fff;\n    }\n\n    .ee-fa-page:disabled{\n      opacity:.5;\n      cursor:not-allowed;\n    }\n\n    @media (max-width:768px){\n      .ee-fa-head h3{font-size:23px;}\n      .ee-fa-head p{font-size:15px;}\n      .ee-fa-label{font-size:16px;}\n      .ee-fa-input{width:100%;}\n      .ee-fa-search{width:100%;}\n      .ee-fa-table{min-width:760px;}\n      .ee-fa-table th,\n      .ee-fa-table td{\n        font-size:15px;\n        padding:12px 10px;\n      }\n    }\n  <\/style>\n\n\n\n<div class=\"ee-fa-wrap\">\n\n\n<div class=\"ee-fa-head\">\n\n\n<h3>Canada Express Entry Draws Table: Latest Rounds<\/h3>\n\n\n\n This table lets you search and sort the latest Canada Express Entry draws, from draw number 1 on January 31, 2015 to today, by date, draw type, number of invitations, and minimum CRS score.\n\n\n\n\n\n\n<div class=\"ee-fa-meta\">\n\n\n<div id=\"ee-fa-updated\" class=\"ee-fa-badge\">Last table update: Loading...<\/div>\n\n\n <button id=\"ee-fa-refresh-btn\" class=\"ee-fa-refresh\" type=\"button\">Refresh Data<\/button>\n<\/div>\n\n\n<\/div>\n\n\n\n\n\n<div class=\"ee-fa-controls\">\n\n\n<div class=\"ee-fa-search\">\n <label class=\"ee-fa-label\" for=\"ee-fa-search-input\">Search the table<\/label>\n <input id=\"ee-fa-search-input\" class=\"ee-fa-input\" type=\"text\" placeholder=\"Example: Canadian Experience or 2026\" \/>\n\n\n<div id=\"ee-fa-info\" class=\"ee-fa-info\">Loading data...<\/div>\n\n\n<\/div>\n\n\n\n\n\n<div class=\"ee-fa-length\">\n <label class=\"ee-fa-label\" for=\"ee-fa-length-select\">Show entries<\/label>\n<select id=\"ee-fa-length-select\" class=\"ee-fa-select\">\n\n\n<option selected=\"selected\" value=\"10\">10<\/option>\n\n\n<option value=\"25\">25<\/option>\n\n\n<option value=\"50\">50<\/option>\n\n\n<option value=\"100\">100<\/option>\n\n\n<\/select>\n<\/div>\n\n\n<\/div>\n\n\n\n\n\n<div class=\"ee-fa-table-wrap\">\n\n\n<table class=\"ee-fa-table\">\n\n\n<thead>\n\n\n<tr>\n\n\n<th>\n Draw\n <button class=\"ee-fa-sort active\" type=\"button\" data-key=\"drawNumber\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n Date\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawDate\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n Draw Type\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawName\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n ITAs Issued\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawSize\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n Minimum CRS\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawCRS\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n<\/tr>\n\n\n<\/thead>\n\n\n\n\n<tbody id=\"ee-fa-tbody\">\n\n\n<tr>\n\n<td class=\"ee-fa-loading\" colspan=\"5\">Loading data...<\/td>\n\n<\/tr>\n\n\n<\/tbody>\n\n\n<\/table>\n\n\n<\/div>\n\n\n\n\n\n<div id=\"ee-fa-pagination\" class=\"ee-fa-pagination\"><\/div>\n\n\n<\/div>\n\n\n\n <script>\n    (function(){\n      const JSON_URL = \"https:\/\/www.canada.ca\/content\/dam\/ircc\/documents\/json\/ee_rounds_123_en.json\";\n      const CACHE_KEY = \"ee_draws_cache_v7_en\";\n\n      const tbody = document.getElementById(\"ee-fa-tbody\");\n      const searchInput = document.getElementById(\"ee-fa-search-input\");\n      const lengthSelect = document.getElementById(\"ee-fa-length-select\");\n      const infoBox = document.getElementById(\"ee-fa-info\");\n      const paginationBox = document.getElementById(\"ee-fa-pagination\");\n      const updatedBox = document.getElementById(\"ee-fa-updated\");\n      const refreshBtn = document.getElementById(\"ee-fa-refresh-btn\");\n      const sortButtons = document.querySelectorAll(\".ee-fa-sort\");\n\n      let allRows = [];\n      let filteredRows = [];\n      let currentPage = 1;\n      let pageLength = 10;\n      let sortKey = \"drawNumber\";\n      let sortDir = \"desc\";\n\n      const seedRows = [\n        { drawNumberURL:'<a href=\"\/en\/immigration-refugees-citizenship\/corporate\/mandate\/policies-operational-instructions-agreements\/ministerial-instructions\/express-entry-rounds\/invitations-408.html\">408<\/a>', drawDateFull:\"April 2, 2026\", drawDate:\"02-04-2026\", drawName:\"Trades Occupations, 2026-Version 3\", drawSize:\"3,000\", drawCRS:\"477\" },\n        { drawNumberURL:'<a href=\"\/en\/immigration-refugees-citizenship\/corporate\/mandate\/policies-operational-instructions-agreements\/ministerial-instructions\/express-entry-rounds\/invitations-407.html\">407<\/a>', drawDateFull:\"March 31, 2026\", drawDate:\"31-03-2026\", drawName:\"Canadian Experience Class\", drawSize:\"2,250\", drawCRS:\"509\" },\n        { drawNumberURL:'<a href=\"\/en\/immigration-refugees-citizenship\/corporate\/mandate\/policies-operational-instructions-agreements\/ministerial-instructions\/express-entry-rounds\/invitations-406.html\">406<\/a>', drawDateFull:\"March 30, 2026\", drawDate:\"30-03-2026\", drawName:\"Provincial Nominee Program\", drawSize:\"356\", drawCRS:\"802\" }\n      ];\n\n      function drawTypeLabel(text){\n        if (!text) return \"\";\n        const direct = {\n          \"Provincial Nominee Program\":\"Provincial Nominee Program\",\n          \"Provincial Nominee Class\":\"Provincial Nominee Program\",\n          \"Canadian Experience Class\":\"Canadian Experience Class\",\n          \"French-Language proficiency 2026-Version 2\":\"French Language Proficiency 2026 - Version 2\",\n          \"French language proficiency (Version 1)\":\"French Language Proficiency - Version 1\",\n          \"Trades Occupations, 2026-Version 3\":\"Trades Occupations 2026 - Version 3\",\n          \"Senior managers with Canadian Work Experience, 2026-Version 1\":\"Senior Managers with Canadian Work Experience 2026 - Version 1\",\n          \"Healthcare and Social Services Occupations, 2026-Version 3\":\"Healthcare and Social Services Occupations 2026 - Version 3\",\n          \"Healthcare and social services occupations (Version 2)\":\"Healthcare and Social Services Occupations - Version 2\",\n          \"Healthcare and social services occupations (Version 1)\":\"Healthcare and Social Services Occupations - Version 1\",\n          \"Physicians with Canadian Work Experience, 2026-Version 1\":\"Physicians with Canadian Work Experience 2026 - Version 1\",\n          \"No program specified\":\"No Program Specified\",\n          \"Federal Skilled Trades\":\"Federal Skilled Trades\"\n        };\n        if (direct[text]) return direct[text];\n\n        return String(text)\n          .replace(\/Healthcare and social services occupations\/gi, \"Healthcare and Social Services Occupations\")\n          .replace(\/French-Language proficiency\/gi, \"French Language Proficiency\")\n          .replace(\/French language proficiency\/gi, \"French Language Proficiency\")\n          .replace(\/Trades Occupations\/gi, \"Trades Occupations\")\n          .replace(\/Senior managers with Canadian Work Experience\/gi, \"Senior Managers with Canadian Work Experience\")\n          .replace(\/\\\\s+\/g, \" \")\n          .trim();\n      }\n\n      function numberFormat(value){\n        const n = parseInt(String(value).replace(\/,\/g, \"\").trim(), 10);\n        if (isNaN(n)) return value;\n        return n.toLocaleString(\"en-US\");\n      }\n\n      function dateFormat(dateText){\n        if (!dateText) return \"\";\n        const parsed = Date.parse(String(dateText).trim());\n        if (isNaN(parsed)) return dateText;\n        return new Date(parsed).toLocaleDateString(\"en-CA\", {\n          year: \"numeric\",\n          month: \"long\",\n          day: \"numeric\"\n        });\n      }\n\n      function dateTimeFormat(ts){\n        const d = new Date(ts);\n        return d.toLocaleString(\"en-CA\", {\n          year: \"numeric\",\n          month: \"2-digit\",\n          day: \"2-digit\",\n          hour: \"2-digit\",\n          minute: \"2-digit\",\n          hour12: false\n        });\n      }\n\n      function drawNumberData(drawNumberURL){\n        const wrapper = document.createElement(\"div\");\n        wrapper.innerHTML = drawNumberURL || \"\";\n        const a = wrapper.querySelector(\"a\");\n        if (!a) return { text: \"\", href: \"#\" };\n        const href = a.getAttribute(\"href\") || \"#\";\n        return {\n          text: a.textContent.trim(),\n          href: href.startsWith(\"http\") ? href : \"https:\/\/www.canada.ca\" + href\n        };\n      }\n\n      function getDrawNumberInt(row){\n        const num = drawNumberData(row.drawNumberURL).text;\n        return parseInt(String(num).replace(\/,\/g, \"\").trim(), 10) || 0;\n      }\n\n      function parseDrawDate(row){\n        const raw = String(row.drawDate || \"\").trim();\n\n        let m = raw.match(\/^(\\\\d{2})-(\\\\d{2})-(\\\\d{4})$\/);\n        if (m) return new Date(Number(m[3]), Number(m[2]) - 1, Number(m[1])).getTime();\n\n        m = raw.match(\/^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})$\/);\n        if (m) return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])).getTime();\n\n        const parsed = Date.parse(String(row.drawDateFull || \"\").trim());\n        return isNaN(parsed) ? 0 : parsed;\n      }\n\n      function sortValue(row, key){\n        if (key === \"drawDate\") return parseDrawDate(row);\n        if (key === \"drawNumber\") return getDrawNumberInt(row);\n        if (key === \"drawSize\" || key === \"drawCRS\") {\n          return parseInt(String(row[key]).replace(\/,\/g, \"\").trim(), 10) || 0;\n        }\n        return String(row[key] || \"\").toLowerCase();\n      }\n\n      function sortRows(rows){\n        rows.sort((a,b)=>{\n          const av = sortValue(a, sortKey);\n          const bv = sortValue(b, sortKey);\n          if (av < bv) return sortDir === \"asc\" ? -1 : 1;\n          if (av > bv) return sortDir === \"asc\" ? 1 : -1;\n          return 0;\n        });\n      }\n\n      function saveCache(rows){\n        try{\n          localStorage.setItem(CACHE_KEY, JSON.stringify({\n            fetchedAt: Date.now(),\n            rows\n          }));\n        } catch(e){}\n      }\n\n      function loadCache(){\n        try{\n          const raw = localStorage.getItem(CACHE_KEY);\n          if (!raw) return null;\n          return JSON.parse(raw);\n        } catch(e){\n          return null;\n        }\n      }\n\n      function clearCache(){\n        try{\n          localStorage.removeItem(CACHE_KEY);\n        } catch(e){}\n      }\n\n      function updateMeta(){\n        const cache = loadCache();\n        if (cache && cache.fetchedAt) {\n          updatedBox.textContent = `Last table update: ${dateTimeFormat(cache.fetchedAt)}`;\n        } else {\n          updatedBox.textContent = \"\";\n        }\n      }\n\n      function applyFilter(){\n        const q = searchInput.value.trim().toLowerCase();\n\n        filteredRows = allRows.filter(row => {\n          const num = drawNumberData(row.drawNumberURL);\n          const haystack = [\n            num.text,\n            row.drawDateFull,\n            row.drawName,\n            drawTypeLabel(row.drawName),\n            row.drawSize,\n            row.drawCRS\n          ].join(\" \").toLowerCase();\n\n          return haystack.includes(q);\n        });\n\n        sortRows(filteredRows);\n        currentPage = 1;\n        render();\n      }\n\n      function renderInfo(total, start, end){\n        infoBox.textContent = `Showing ${start} to ${end} of ${total} entries`;\n      }\n\n      function renderTable(){\n        if (!filteredRows.length) {\n          tbody.innerHTML = `<tr><td colspan=\"5\" class=\"ee-fa-empty\">No results found.<\/td><\/tr>`;\n          renderInfo(0,0,0);\n          paginationBox.innerHTML = \"\";\n          return;\n        }\n\n        const startIndex = (currentPage - 1) * pageLength;\n        const endIndex = Math.min(startIndex + pageLength, filteredRows.length);\n        const pageRows = filteredRows.slice(startIndex, endIndex);\n\n        tbody.innerHTML = pageRows.map(row => {\n          const num = drawNumberData(row.drawNumberURL);\n          return `\n            <tr>\n              <td><a href=\"${num.href}\" target=\"_blank\" rel=\"noopener\">${num.text}<\/a><\/td>\n              <td>${dateFormat(row.drawDateFull)}<\/td>\n              <td>${drawTypeLabel(row.drawName)}<\/td>\n              <td>${numberFormat(row.drawSize)}<\/td>\n              <td>${numberFormat(row.drawCRS)}<\/td>\n            <\/tr>\n          `;\n        }).join(\"\");\n\n        renderInfo(filteredRows.length, startIndex + 1, endIndex);\n      }\n\n      function renderPagination(){\n        const totalPages = Math.ceil(filteredRows.length \/ pageLength);\n        paginationBox.innerHTML = \"\";\n        if (totalPages <= 1) return;\n\n        function addBtn(label, page, active = false, disabled = false){\n          const btn = document.createElement(\"button\");\n          btn.className = \"ee-fa-page\" + (active ? \" active\" : \"\");\n          btn.textContent = label;\n          btn.disabled = disabled;\n          if (!disabled) {\n            btn.addEventListener(\"click\", () => {\n              currentPage = page;\n              render();\n            });\n          }\n          paginationBox.appendChild(btn);\n        }\n\n        addBtn(\"Previous\", Math.max(1, currentPage - 1), false, currentPage === 1);\n\n        const total = Math.ceil(filteredRows.length \/ pageLength);\n        for (let i = 1; i <= total; i++) {\n          if (i <= 3 || i > total - 3 || Math.abs(i - currentPage) <= 1) {\n            addBtn(String(i), i, i === currentPage, false);\n          } else if (\n            (i === 4 && currentPage > 5) ||\n            (i === total - 3 && currentPage < total - 4)\n          ) {\n            addBtn(\"\u2026\", 1, false, true);\n          }\n        }\n\n        addBtn(\"Next\", Math.min(total, currentPage + 1), false, currentPage === total);\n      }\n\n      function render(){\n        renderTable();\n        renderPagination();\n      }\n\n      function hydrate(rows){\n        allRows = rows.slice();\n        filteredRows = rows.slice();\n\n        sortKey = \"drawNumber\";\n        sortDir = \"desc\";\n\n        sortRows(filteredRows);\n        currentPage = 1;\n\n        sortButtons.forEach(b => b.classList.remove(\"active\"));\n        const drawBtn = document.querySelector('.ee-fa-sort[data-key=\"drawNumber\"]');\n        if (drawBtn) drawBtn.classList.add(\"active\");\n\n        render();\n        updateMeta();\n      }\n\n      function fetchFreshData(forceRefresh = false){\n        refreshBtn.disabled = true;\n        refreshBtn.textContent = \"Refreshing...\";\n\n        const url = forceRefresh ? `${JSON_URL}?t=${Date.now()}` : JSON_URL;\n\n        fetch(url, { cache: \"no-store\" })\n          .then(res => {\n            if (!res.ok) throw new Error(\"Fetch failed\");\n            return res.json();\n          })\n          .then(data => {\n            const rows = Array.isArray(data.rounds) ? data.rounds : [];\n            if (!rows.length) throw new Error(\"Empty data\");\n\n            saveCache(rows);\n            hydrate(rows);\n          })\n          .catch(() => {\n            if (!allRows.length) {\n              tbody.innerHTML = `<tr><td colspan=\"5\" class=\"ee-fa-error\">Failed to load data.<\/td><\/tr>`;\n            }\n          })\n          .finally(() => {\n            refreshBtn.disabled = false;\n            refreshBtn.textContent = \"Refresh Data\";\n          });\n      }\n\n      sortButtons.forEach(btn => {\n        btn.addEventListener(\"click\", () => {\n          const key = btn.getAttribute(\"data-key\");\n          if (sortKey === key) {\n            sortDir = sortDir === \"asc\" ? \"desc\" : \"asc\";\n          } else {\n            sortKey = key;\n            sortDir = (key === \"drawNumber\" || key === \"drawDate\") ? \"desc\" : \"asc\";\n          }\n\n          sortButtons.forEach(b => b.classList.remove(\"active\"));\n          btn.classList.add(\"active\");\n\n          sortRows(filteredRows);\n          currentPage = 1;\n          render();\n        });\n      });\n\n      searchInput.addEventListener(\"input\", applyFilter);\n\n      lengthSelect.addEventListener(\"change\", () => {\n        pageLength = parseInt(lengthSelect.value, 10);\n        currentPage = 1;\n        render();\n      });\n\n      refreshBtn.addEventListener(\"click\", () => {\n        clearCache();\n        fetchFreshData(true);\n      });\n\n      hydrate(seedRows);\n\n      const cached = loadCache();\n      if (cached && Array.isArray(cached.rows) && cached.rows.length) {\n        hydrate(cached.rows);\n      }\n\n      fetchFreshData(false);\n    })();\n  <\/script>\n<\/section><\/div><\/div><div class=\"et_pb_text_2 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p style=\"text-align: left; direction: ltr;\">\u2192 To understand how Express Entry works, including eligibility requirements, CRS scoring, and step-by-step application, read our complete <a href=\"https:\/\/borhanifar.com\/en\/immigrate-canada\/express-entry\/\" target=\"_blank\" rel=\"noopener\">Express Entry Guide for Canada PR<\/a>.<\/p>\n<\/div><\/div><\/div><div class=\"et_pb_column_3 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\"><div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_0_wrapper\"><a class=\"et_pb_button_0 et_pb_button et_pb_bg_layout_light et_pb_module et_block_module\" href=\"https:\/\/wa.me\/16474500450?text=Hello%20Borhanifar!%20I%20would%20like%20to%20apply%20for%20a%20Canadian%20Study%20Permit.%20Please%20guide%20me%20on%20the%20process,%20requirements,%20and%20next%20steps.%20Thank%20you.\" data-icon=\"!\" target=\"_blank\" rel=\"noopener\">WhatsApp<\/a><\/div><div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_1_wrapper\"><a class=\"et_pb_button_1 et_pb_button et_pb_bg_layout_light et_pb_module et_block_module\" href=\"https:\/\/borhanifar.com\/en\/consultation\/\" data-icon=\"!\">Consultation<\/a><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":299497,"parent":297655,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-299485","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/299485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/comments?post=299485"}],"version-history":[{"count":14,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/299485\/revisions"}],"predecessor-version":[{"id":304207,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/299485\/revisions\/304207"}],"up":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/297655"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/media\/299497"}],"wp:attachment":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/media?parent=299485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}