{"id":9399,"date":"2026-07-16T09:24:44","date_gmt":"2026-07-16T09:24:44","guid":{"rendered":"https:\/\/itbd.net\/lp\/?page_id=9399"},"modified":"2026-09-22T18:41:53","modified_gmt":"2026-09-22T18:41:53","slug":"msp-bench-engineers","status":"publish","type":"page","link":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/","title":{"rendered":"MSP Bench Engineers"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"9399\" class=\"elementor elementor-9399\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ca36f61 e-con-full e-flex e-con e-parent\" data-id=\"ca36f61\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;background_motion_fx_motion_fx_mouse&quot;:&quot;yes&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-72e9644 e-con-full e-flex e-con e-child\" data-id=\"72e9644\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-b6958a5 e-con-full e-flex e-con e-child\" data-id=\"b6958a5\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a9c7734 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"a9c7734\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Scale Fast With<\/br>ITBD Tech Talent<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4f9f257 elementor-widget elementor-widget-text-editor\" data-id=\"4f9f257\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Here&#8217;s your\u00a0<b>needle in a haystack.<\/b><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-864d699 e-con-full elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-child\" data-id=\"864d699\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-be88e97 e-con-full e-flex e-con e-child\" data-id=\"be88e97\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e99a224 elementor-align-justify elementor-widget elementor-widget-button\" data-id=\"e99a224\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/itbd.net\/global_talent\/tnd\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Talent Needs Form<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6ce5ee7d e-flex e-con-boxed e-con e-parent\" data-id=\"6ce5ee7d\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-76bf9475 fin-frame padding-reset panel-dark e-flex e-con-boxed e-con e-child\" data-id=\"76bf9475\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7106e170 elementor-widget elementor-widget-html\" data-id=\"7106e170\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"cbd-paths\">\r\n  <div class=\"cbdp-inner\">\r\n    <div class=\"cbdp-head\">\r\n      <span class=\"cbdp-eyebrow\">How It Works<\/span>\r\n      <h2 class=\"cbdp-h2\">Help Us Help You In 2 Easy Steps<\/h2>\r\n    <\/div>\r\n    <div class=\"cbdp-grid\">\r\n      <a class=\"cbdp-card pc-cyan\" href=\"https:\/\/itbd.net\/global_talent\/tnd\/\">\r\n        <div class=\"cbdp-ico\">\r\n          <svg width=\"30\" height=\"30\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M15.6 8.4l-2.1 5.1-5.1 2.1 2.1-5.1z\"\/><\/svg>\r\n        <\/div>\r\n        <h3>Tell us what you need<\/h3>\r\n        <p>Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack.<\/p>\r\n        <span class=\"cbdp-go\">Talent Needs Form\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M3 8h10M9 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\r\n        <\/span>\r\n      <\/a>\r\n      <a class=\"cbdp-card pc-green\" href=\"#bench-engineers\">\r\n        <div class=\"cbdp-ico\">\r\n          <svg width=\"30\" height=\"30\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"9\" cy=\"8\" r=\"3\"\/><path d=\"M3 20c0-3.3 2.7-5.5 6-5.5s6 2.2 6 5.5\"\/><path d=\"M16 6.2a3 3 0 010 5.6M18.5 20c0-2.4-1-4.2-2.7-5.1\"\/><\/svg>\r\n        <\/div>\r\n        <h3>Meet the engineers<\/h3>\r\n        <p>Choose View Resume or Arrange an Interview with any of the engineers in the directory below.<\/p>\r\n        <span class=\"cbdp-go\">Browse the bench\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M3 8h10M9 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\r\n        <\/span>\r\n      <\/a>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <style>\r\n    @import url('https:\/\/fonts.googleapis.com\/css2?family=Bebas+Neue&family=Inter:wght@400;500;600&family=Inter+Tight:wght@400;500;600;700&display=swap');\r\n\r\n    .cbd-paths{\r\n      --cbd-cyan:#00ADDA; --cbd-cyan-soft:#4DDBFF; --cbd-green:#BED62F;\r\n      --cbd-ink:#07101F; --cbd-line:rgba(244,241,236,0.22);\r\n      background:#07101F; color:#fff;\r\n      font-family:\"Inter Tight\",\"Inter\",-apple-system,BlinkMacSystemFont,sans-serif;\r\n      -webkit-font-smoothing:antialiased;  box-sizing:border-box;\r\n    }\r\n    .cbd-paths *{ box-sizing:border-box; }\r\n    .cbd-paths .cbdp-inner{  margin:0 auto;  }\r\n    .cbd-paths .cbdp-eyebrow{ font-family:\"Inter\",sans-serif; font-size:14px; font-weight:500; letter-spacing:0.18em; text-transform:uppercase; color:var(--cbd-cyan); }\r\n    .cbd-paths .cbdp-h2{ font-family:\"Bebas Neue\",sans-serif; font-weight:400; font-size:clamp(36px,4.4vw,70px); line-height:1.04; letter-spacing:0.01em; text-transform:uppercase; color:#fff; margin:10px 0 0; }\r\n    .cbd-paths .cbdp-grid{ display:grid; grid-template-columns:1fr 1fr; gap:20px; margin-top:28px; }\r\n    .cbd-paths .cbdp-card{\r\n      position:relative; display:flex; flex-direction:column; gap:18px; text-decoration:none;\r\n      padding:40px 38px 36px; border:1px solid var(--cbd-line); border-radius:22px; overflow:hidden;\r\n      background:linear-gradient(180deg,rgba(244,241,236,0.035),rgba(244,241,236,0.008));\r\n      transition:border-color .25s, transform .25s; min-height:300px;\r\n    }\r\n    .cbd-paths .cbdp-card::before{ content:\"\"; position:absolute; top:0; left:0; right:0; height:4px; }\r\n    .cbd-paths .pc-cyan::before{ background:var(--cbd-cyan); }\r\n    .cbd-paths .pc-green::before{ background:var(--cbd-green); }\r\n    .cbd-paths .cbdp-card:hover{ transform:translateY(-4px); }\r\n    .cbd-paths .pc-cyan:hover{ border-color:var(--cbd-cyan); }\r\n    .cbd-paths .pc-green:hover{ border-color:var(--cbd-green); }\r\n    .cbd-paths .cbdp-ico{ width:62px; height:62px; border-radius:15px; display:flex; align-items:center; justify-content:center; }\r\n    .cbd-paths .pc-cyan .cbdp-ico{ background:rgba(0,173,218,0.12); border:1px solid rgba(0,173,218,0.4); color:var(--cbd-cyan); }\r\n    .cbd-paths .pc-green .cbdp-ico{ background:rgba(190,214,47,0.12); border:1px solid rgba(190,214,47,0.4); color:var(--cbd-green); }\r\n    .cbd-paths .cbdp-card h3{ font-family:\"Bebas Neue\",sans-serif; font-weight:400!important; font-size:clamp(32px,3.2vw,44px); line-height:1; letter-spacing:0.01em; color:#fff; margin:0; }\r\n    .cbd-paths .cbdp-card p{ font-size:18px; line-height:1.5; color:#fff; margin:0; }\r\n    .cbd-paths .cbdp-go{\r\n      margin-top:auto; align-self:flex-start; display:inline-flex; align-items:center; gap:10px;\r\n      padding:14px 28px; border-radius:999px; font-family:\"Inter\",sans-serif; font-size:14px;\r\n      font-weight:600; letter-spacing:0.08em; text-transform:uppercase; transition:transform .2s, background .2s;\r\n    }\r\n    .cbd-paths .pc-cyan .cbdp-go{ background:var(--cbd-cyan); color:var(--cbd-ink); }\r\n    .cbd-paths .pc-cyan:hover .cbdp-go{ background:var(--cbd-cyan-soft); }\r\n    .cbd-paths .pc-green .cbdp-go{ background:var(--cbd-green); color:var(--cbd-ink); }\r\n    .cbd-paths .pc-green:hover .cbdp-go{ background:#cfe34f; }\r\n    .cbd-paths .cbdp-go svg{ transition:transform .2s; }\r\n    .cbd-paths .cbdp-card:hover .cbdp-go svg{ transform:translateX(4px); }\r\n    @media (max-width:760px){ .cbd-paths .cbdp-grid{ grid-template-columns:1fr; \r\n\r\n    } }\r\n  <\/style>\r\n<\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7237cb51 elementor-widget elementor-widget-html\" data-id=\"7237cb51\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"corner-bl\"><\/div>\n<div class=\"corner-br\"><\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-28a05b98 fin-frame padding-reset panel-dark e-flex e-con-boxed e-con e-child\" data-id=\"28a05b98\" data-element_type=\"container\" id=\"contact bench-engineers\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0e92a5c elementor-widget elementor-widget-html\" data-id=\"0e92a5c\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div id=\"itbd-be-root\"><\/div>\n\n<script>\n(function(){\n\n  \/* ====================================================================\n     CONFIG \u2014 everything you're likely to edit lives here\n     ==================================================================== *\/\n  const ITBD_CONFIG = {\n\n    \/* ------------------------------------------------------------------\n       SHOW ALL LOCATIONS, OR ONLY SPECIFIC ONES\n       Leave both of these blank to show every engineer in the directory.\n       To show only a subset, list taxonomy TERM SLUGS (not names),\n       comma-separated if more than one. You can find slugs on the\n       \"Edit Tags\" screen in wp-admin (hover a term's Edit link, or check\n       the \"Slug\" column).\n       ------------------------------------------------------------------ *\/\n    filterBySupport: \"\",   \/\/ find-your-support term slug(s), e.g. \"nz\" or \"nz,helpdesk\"\n    filterBySpec: \"\",      \/\/ specification term slug(s), e.g. \"networking,firewall-vpn-management\"\n\n    \/\/ \"restrict\" -> ONLY shows engineers matching the above (use this\n    \/\/   to embed a themed subset, e.g. just NZ engineers, on another page)\n    \/\/ \"filter\"   -> loads every engineer, just pre-checks the filter UI for\n    \/\/   the visitor (use this on the main directory page)\n    filterMode: \"filter\",\n\n    showFilters: true,   \/\/ set false to hide the sidebar entirely (e.g. for a small teaser block)\n\n    \/* ------------------------------------------------------------------\n       DATA SOURCE \u2014 a single pre-generated JSON file (built by the\n       Bench Engineer JSON Cache plugin) instead of live REST calls.\n       This file already contains every post's ACF fields plus the full\n       find-your-support \/ specification term lists in one payload.\n       ------------------------------------------------------------------ *\/\n    jsonUrl: \"https:\/\/itbd.net\/lp\/wp-content\/uploads\/bench-engineers.json\",\n\n    taxSupport: \"find-your-support\",   \/\/ taxonomy key as it appears in the JSON\n    taxSpec:    \"specification\",       \/\/ taxonomy key as it appears in the JSON\n\n    \/\/ ACF field names on each engineer post (edit if yours differ)\n    acfFields: {\n      role:      \"engineer_role\",      \/\/ text\n      location:  \"engineer_location\",  \/\/ text\n      photo:     \"engineer_photo\",     \/\/ image field\n      resume:    \"resume\",             \/\/ now holds raw embed HTML (e.g. a per-engineer HubSpot CTA snippet), rendered as HTML \u2014 not a plain URL\n      interview: \"engineer_interview\" , \/\/ url field\n      sortOrder: \"sort_order\"          \/\/ number \u2014 controls display order (asc)\n    },\n\n    \/\/ Fallback link for CTA buttons when a post has no resume\/interview value\n    contactUrl: \"#contact\",\n\n    heading: \"\", \/\/ sidebar title above the filters \u2014 leave blank to hide it\n\n    \/\/ Some ACF\/REST setups don't return \"acf\" data on the list endpoint\n    \/\/ even though it's set \u2014 that quirk only applied to the old live-REST\n    \/\/ approach. The cached JSON always carries full ACF data per post, so\n    \/\/ this workaround is no longer needed and has been removed.\n  };\n\n  \/\/ URL query params can override the preset above, so a link from another\n  \/\/ page can drive this block: yoursite.com\/engineers\/?support=nz&spec=networking\n  (function applyUrlOverrides(){\n    const params = new URLSearchParams(window.location.search);\n    if (params.get('support')) ITBD_CONFIG.filterBySupport = params.get('support');\n    if (params.get('spec')) ITBD_CONFIG.filterBySpec = params.get('spec');\n  })();\n\n  \/* ====================================================================\n     STYLES (scoped under #itbd-be-root, safe to paste on any page)\n     ==================================================================== *\/\n  const style = document.createElement('style');\n  style.textContent = `\n  @import url('https:\/\/fonts.googleapis.com\/css2?family=Bebas+Neue&family=Oswald:wght@400;500;600;700&family=Inter:wght@400;450;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');\n  #itbd-be-root{\n    --be-bg:#080C14; --be-bg-2:#0B111B; --be-panel:#0F1724; --be-panel-2:#131D2C;\n    --be-line:#1E2A3C; --be-line-2:#2B3C53; --be-ink:#EEF3F9; --be-ink-2:#FFFFFF; --be-muted:#74859B;\n    --be-cyan:#1BA8E8; --be-cyan-2:#5EC8F5; --be-cyan-deep:#0E6FA0; --be-white:#FFFFFF;\n    --be-mono:'JetBrains Mono',ui-monospace,monospace; --be-disp:'Bebas Neue',Impact,sans-serif;\n    --be-cond:'Oswald',system-ui,sans-serif; --be-body:'Inter',system-ui,sans-serif;\n    font-family:var(--be-body); color:var(--be-ink); background:var(--be-bg);\n    padding:64px 26px; box-sizing:border-box;\n    scrollbar-width:thin; scrollbar-color:var(--be-cyan-deep) transparent;\n    overflow-x:hidden;\n  }\n  #itbd-be-root *{scrollbar-width:thin; scrollbar-color:var(--be-cyan-deep) transparent}\n  #itbd-be-root ::-webkit-scrollbar{width:8px;height:8px}\n  #itbd-be-root ::-webkit-scrollbar-track{background:transparent}\n  #itbd-be-root ::-webkit-scrollbar-thumb{background:linear-gradient(var(--be-cyan-deep),var(--be-cyan));border-radius:8px;border:1px solid transparent;background-clip:padding-box}\n  #itbd-be-root ::-webkit-scrollbar-thumb:hover{background:var(--be-cyan);background-clip:padding-box}\n  #itbd-be-root *{box-sizing:border-box}\n  #itbd-be-root a{text-decoration:none}\n  .itbd-be-headerbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:20px;max-width:1240px;margin:0 auto 26px}\n  .itbd-be-top{display:flex;align-items:center;justify-content:flex-end;gap:20px;flex-wrap:wrap}\n  .itbd-be-pagehead{font-family:\"Bebas Neue\",sans-serif !important;font-weight:400;font-size:clamp(40px,4.4vw,60px) !important;line-height:1.04 !important;letter-spacing:0.01em !important;text-transform:uppercase;color:#fff;margin:0;}\n  .itbd-be-cy{color:var(--be-cyan)}\n  #itbd-be-root .itbd-be-resultline{font-family:var(--be-body)!important;font-size:12px;letter-spacing:.06em;color:var(--be-white);border:1px solid var(--be-line);border-radius:3px;padding:9px 14px;background:var(--be-panel);text-transform:uppercase}\n  .itbd-be-resultline b{color:var(--be-ink)}\n  .itbd-be-grid{display:grid;grid-template-columns:300px 1fr;gap:24px;align-items:start;max-width:1240px;margin:0 auto}\n  .itbd-be-grid.itbd-be-nofilters{grid-template-columns:1fr}\n\n  \/* ------------------------------------------------------------------\n     STICKY SIDEBAR \u2014 hardened against Elementor wrapper defaults.\n     If a parent Section\/Column has \"Overflow: Hidden\" or a Motion\n     Effects transform applied, sticky positioning will still fail \u2014\n     these !important rules only guarantee THIS element's own CSS wins,\n     they cannot override a parent's overflow\/transform. See the note\n     at the very bottom of this file for what to check in Elementor.\n     ------------------------------------------------------------------ *\/\n  .itbd-be-filters{\n    position:-webkit-sticky!important;\n    position:sticky!important;\n    top:120px!important;\n    align-self:start!important;\n    border:1px solid var(--be-line);border-radius:10px;background:var(--be-panel);overflow:hidden;max-height:calc(100vh - 32px);display:flex;flex-direction:column\n  }\n\n  .itbd-be-filter-toggle{display:none;align-items:center;gap:8px;font-family:var(--be-body);font-size:13px;font-weight:600;color:var(--be-ink);background:var(--be-panel);border:1px solid var(--be-line-2);border-radius:7px;padding:9px 16px;cursor:pointer}\n  .itbd-be-filter-toggle:hover{border-color:var(--be-cyan);color:#00ADDA;}\n  .itbd-be-fclose{display:none;position:absolute;top:10px;right:10px;z-index:5;background:none;border:0;color:var(--be-ink-2);font-size:22px;line-height:1;cursor:pointer;padding:4px 8px}\n  .itbd-be-backdrop{display:none;position:fixed;inset:0;background:rgba(4,8,14,.6);z-index:250;opacity:0;pointer-events:none;transition:opacity .25s ease}\n  .itbd-be-backdrop.itbd-be-backdrop-open{opacity:1;pointer-events:auto}\n  @media(max-width:940px){\n    .itbd-be-grid{grid-template-columns:1fr}\n    .itbd-be-cards-col{order:1}\n    .itbd-be-filter-toggle{display:inline-flex}\n    .itbd-be-backdrop{display:block}\n    .itbd-be-filters{\n      position:fixed!important; top:0!important; left:0; height:100dvh; max-height:100dvh;\n      width:86vw; max-width:340px; border-radius:0; z-index:260;\n      transform:translateX(-102%); transition:transform .28s ease;\n    }\n    .itbd-be-filters.itbd-be-filters-open{transform:translateX(0)}\n    .itbd-be-fclose{display:block}\n    .itbd-be-fscroll{padding-top:36px}\n  }\n  @media(max-width:640px){\n    #itbd-be-root{padding:40px 16px}\n    .itbd-be-pagehead{ font-size:clamp(32px,10vw,44px) !important; }\n    .itbd-be-top{ justify-content:flex-start; }\n  }\n  .itbd-be-fhead{padding:18px 20px 14px;border-bottom:1px solid var(--be-line);flex:none}\n  .itbd-be-fhead h3{font-family:var(--be-cond);font-weight:600;text-transform:uppercase;letter-spacing:.08em;font-size:16px;margin:0;color:var(--be-ink)}\n  .itbd-be-fscroll{overflow-y:auto;overscroll-behavior:contain}\n  .itbd-be-fsearch-wrap{padding:8px 12px 4px}\n  .itbd-be-fsearch-wrap-support{position:sticky;top:0;background:var(--be-panel);z-index:4}\n  #itbd-be-root .itbd-be-fsearch{width:100%;background-color:var(--be-panel-2)!important;border:1px solid var(--be-line-2);border-radius:6px;padding:9px 12px 9px 36px!important;color:var(--be-ink);font-family:var(--be-body);font-size:13px;outline:none;box-sizing:border-box!important;background-repeat:no-repeat!important;background-position:12px center!important;background-size:14px 14px!important;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2374859B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C\/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C\/line%3E%3C\/svg%3E\")!important}\n  #itbd-be-root .itbd-be-fsearch::placeholder{color:var(--be-muted)}\n  #itbd-be-root .itbd-be-fsearch:focus{border-color:var(--be-cyan);box-shadow:0 0 0 3px rgba(27,168,232,.15)}\n  .itbd-be-fopt.itbd-be-hidden{display:none}\n  .itbd-be-fgroup{padding:8px}\n  .itbd-be-fopt{display:flex;align-items:center;gap:11px;padding:8px 12px;border-radius:5px;cursor:pointer;font-size:14px;line-height:1.6em;color:var(--be-ink-2);transition:.14s;user-select:none}\n  .itbd-be-fopt:hover{color:#00adda;}\n  .itbd-be-fopt.itbd-be-sub{padding-left:30px}\n  #itbd-be-root .itbd-be-fopt input{position:absolute!important;opacity:0!important;width:0!important;height:0!important;margin:0!important;padding:0!important;appearance:none!important;-webkit-appearance:none!important}\n  #itbd-be-root .itbd-be-mark{width:16px!important;height:16px!important;min-width:16px;border:1.5px solid var(--be-line-2)!important;background:transparent!important;flex:none!important;display:grid!important;place-items:center;transition:.14s;box-sizing:border-box!important}\n  #itbd-be-root .itbd-be-fopt[data-type=\"radio\"] .itbd-be-mark{border-radius:50%!important}\n  #itbd-be-root .itbd-be-fopt[data-type=\"check\"] .itbd-be-mark{border-radius:3px!important}\n  #itbd-be-root .itbd-be-fopt:hover .itbd-be-mark{border-color:var(--be-cyan-deep)!important}\n  #itbd-be-root .itbd-be-fopt input:checked ~ .itbd-be-mark{border-color:var(--be-cyan)!important;background:var(--be-cyan)!important}\n  #itbd-be-root .itbd-be-fopt input:checked ~ .itbd-be-mark::after{content:\"\"!important;display:block!important;box-sizing:border-box!important}\n  #itbd-be-root .itbd-be-fopt[data-type=\"radio\"] input:checked ~ .itbd-be-mark::after{width:7px!important;height:7px!important;background:#06202e!important;border-radius:50%!important}\n  #itbd-be-root .itbd-be-fopt[data-type=\"check\"] input:checked ~ .itbd-be-mark::after{width:4px!important;height:8px!important;border:solid #06202e!important;border-width:0 2px 2px 0!important;background:transparent!important;border-radius:0!important;transform:rotate(45deg)!important;margin-top:-2px}\n  #itbd-be-root .itbd-be-fopt input:checked ~ .itbd-be-ftxt{color:var(--be-white)}\n  .itbd-be-ftxt{flex:1}\n  .itbd-be-cnt{font-family:var(--be-mono);font-size:11px;color:var(--be-muted)}\n  .itbd-be-fopt input:checked ~ .itbd-be-cnt{color:var(--be-cyan)}\n  .itbd-be-fsub{border-top:1px solid var(--be-line);padding:14px 20px 12px;flex:none}\n  .itbd-be-fsub h3{font-family:var(--be-cond);font-weight:600;text-transform:uppercase;letter-spacing:.08em;font-size:16px;margin:0;color:var(--be-ink)}\n  .itbd-be-fclearrow{display:flex;justify-content:space-between;align-items:center}\n  .itbd-be-clear{font-family:var(--be-mono);font-size:11px;color:var(--be-cyan);background:none;border:0;cursor:pointer;letter-spacing:.06em;padding:0}\n  .itbd-be-clear:hover{text-decoration:underline}\n  .itbd-be-cards-col{min-width:0}\n  .itbd-be-cards{display:flex;flex-direction:column;gap:20px}\n  .itbd-be-card{border:1px solid var(--be-line);border-radius:12px;background:linear-gradient(180deg,var(--be-panel),var(--be-bg-2));padding:26px 28px;display:grid;grid-template-columns:126px 1fr;gap:26px;transition:.22s;position:relative;animation:itbdBeCardIn .45s ease both}\n  @keyframes itbdBeCardIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\n  .itbd-be-card:hover{border-color:var(--be-cyan-deep);transform:translateY(-2px);box-shadow:0 10px 30px rgba(0,0,0,.25)}\n  .itbd-be-avatar{width:126px;height:148px;border-radius:10px;position:relative;overflow:hidden;background:linear-gradient(150deg,var(--be-cyan),var(--be-cyan-deep));box-shadow:inset 0 0 0 1px rgba(255,255,255,.06)}\n  #itbd-be-root .itbd-be-avatar img{position:absolute!important;inset:0!important;top:0!important;left:0!important;right:0!important;bottom:0!important;margin:0!important;width:100%!important;height:100%!important;max-width:none!important;max-height:none!important;object-fit:cover!important;object-position:center top!important;z-index:1}\n  .itbd-be-avatar .itbd-be-mono{position:absolute;inset:0;display:grid;place-items:center;font-family:var(--be-disp);font-size:50px;letter-spacing:.02em;color:#06202e;z-index:0}\n  .itbd-be-ar{position:absolute;right:7px;bottom:6px;font-family:var(--be-mono);font-size:8px;letter-spacing:.1em;color:rgba(255,255,255,.85);z-index:2;background:rgba(6,20,31,.55);padding:2px 5px;border-radius:2px}\n  .itbd-be-card-body{display:flex;flex-direction:column}\n  .itbd-be-namerow{display:flex;align-items:baseline;flex-wrap:wrap;gap:10px;margin-bottom:12px}\n  .itbd-be-ename, .itbd-be-loc-badge{font-family:var(--be-disp);font-weight:400;font-size:28px;letter-spacing:-.01em;color:var(--be-ink);margin:0}\n  .itbd-be-erole{font-family:var(--be-mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--be-ink-2);margin:0 0 18px;padding-left:12px;border-left:2px solid var(--be-cyan-deep)}\n  .itbd-be-skills{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:22px;max-width:100%}\n  .itbd-be-skill{font:inherit;font-size:12.5px;color:var(--be-ink-2);border:1px solid var(--be-line-2);border-radius:20px;padding:6px 13px 6px 11px;background:var(--be-panel-2);font-family:var(--be-mono);letter-spacing:.01em;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:.15s;max-width:100%;white-space:normal;overflow-wrap:break-word;word-break:break-word;text-align:left}\n  .itbd-be-skill::before{content:\"+\";color:var(--be-muted);font-family:var(--be-body);font-size:13px;line-height:1;transition:.15s}\n  .itbd-be-skill:hover{border-color:var(--be-cyan);color:var(--be-ink);background:rgba(27,168,232,.1)}\n  .itbd-be-skill:hover::before{color:var(--be-cyan)}\n  .itbd-be-skill.itbd-be-skill-active{border-color:var(--be-cyan);color:#04141f;background:var(--be-cyan)}\n  .itbd-be-skill.itbd-be-skill-active::before{content:\"\\\\2713\";color:#04141f}\n  .itbd-be-cta{display:flex;gap:12px;flex-wrap:wrap;margin-top:auto; font-weight:400;}\n  #itbd-be-root .itbd-be-btn{font-family:var(--be-body)!important;font-size:11.5px!important;font-weight:700!important;letter-spacing:.01em!important;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 14px!important;border-radius:7px!important;border:1px solid transparent;cursor:pointer;flex:1;min-width:0;max-width:200px}\n  #itbd-be-root .itbd-be-btn-cyan{background:var(--be-cyan);color:#fff;border-color:var(--be-cyan);font-family:'Inter',system-ui,sans-serif!important;font-size:17px!important;font-weight:400!important}\n  #itbd-be-root .itbd-be-btn-cyan:hover{background:var(--be-cyan);color:#06202e}\n  #itbd-be-root .itbd-be-btn-ghost{background:transparent;border-color:var(--be-line-2);color:var(--be-ink);font-family:'Inter',system-ui,sans-serif!important;font-size:17px!important;font-weight:400!important}\n  #itbd-be-root .itbd-be-btn-ghost:hover{background:transparent;border-color:var(--be-line-2);color:var(--be-ink)}\n  .itbd-be-resume-embed{display:inline-flex;flex:1;min-width:0;max-width:200px;align-items:center;justify-content:center}\n  .itbd-be-resume-embed > *{max-width:100%}\n  .itbd-be-resume-embed img{display:block;max-width:100%;height:auto;border-radius:7px}\n  @media(max-width:540px){\n    .itbd-be-resume-embed{flex:none;width:100%;max-width:none}\n  }\n  .itbd-be-empty{display:none;border:1px dashed var(--be-line-2);border-radius:10px;padding:40px;text-align:center;color:var(--be-muted);font-family:var(--be-mono);font-size:13px;letter-spacing:.05em}\n  .itbd-be-loading{font-family:var(--be-mono);font-size:13px;color:var(--be-muted);text-align:center;padding:40px;max-width:1240px;margin:0 auto}\n  .itbd-be-spinner-wrap{display:flex;justify-content:center;align-items:center;padding:90px 20px;max-width:1240px;margin:0 auto}\n  .itbd-be-spinner{width:40px;height:40px;border:3px solid var(--be-line-2);border-top-color:var(--be-cyan);border-radius:50%;animation:itbdBeSpin .8s linear infinite}\n  @keyframes itbdBeSpin{to{transform:rotate(360deg)}}\n  @media(max-width:540px){.itbd-be-card{grid-template-columns:1fr}.itbd-be-avatar{width:100%;height:200px}}\n  @media(max-width:540px){ #itbd-be-root .itbd-be-avatar img{object-fit:contain!important;background:rgba(6,20,31,.25)} }\n  @media(max-width:540px){\n    .itbd-be-cta{flex-direction:column;align-items:stretch;width:100%}\n    #itbd-be-root .itbd-be-btn{flex:none!important;width:100%!important;max-width:none!important;margin:0!important;box-sizing:border-box!important;text-align:center}\n  }\n\n  #itbd-be-root{\n      background:none;\n      padding:10px;\n  }\n  `;\n  document.head.appendChild(style);\n\n  const root = document.getElementById('itbd-be-root');\n  root.innerHTML = '<div class=\"itbd-be-spinner-wrap\"><span class=\"itbd-be-spinner\"><\/span><\/div>';\n\n  \/* ====================================================================\n     DATA LOADING \u2014 single fetch of the pre-generated JSON cache instead\n     of three separate live REST calls (2 taxonomies + paginated posts,\n     potentially plus a per-post re-fetch for ACF). This is the piece\n     that replaces the old fetchTerms \/ fetchAllPages \/ fixMissingAcf \/\n     Promise.all block.\n     ==================================================================== *\/\n  function buildTermMap(list){\n    const map = {};\n    (list || []).forEach(t => { map[t.id] = t; });\n    return map;\n  }\n\n  async function fetchCachedData(){\n    const url = `${ITBD_CONFIG.jsonUrl}?_ts=${Date.now()}`;\n    let res;\n    try {\n      res = await fetch(url, { cache: 'no-store' });\n    } catch (networkErr) {\n      throw new Error(`Couldn't reach ${url} (network error \/ CORS). ${networkErr.message}`);\n    }\n    let body;\n    try { body = await res.json(); } catch (e) { body = null; }\n    if (!res.ok) {\n      throw new Error(`${url} returned ${res.status} ${res.statusText}.`);\n    }\n    if (!body || !Array.isArray(body.posts)) {\n      throw new Error(`${url} didn't return the expected { posts, taxonomies } shape. Has bench-engineers.json been generated yet? Save a bench-engineer post once, or trigger a manual rebuild.`);\n    }\n    return body;\n  }\n\n  fetchCachedData().then(body => {\n    const supportMap = buildTermMap(body.taxonomies && body.taxonomies[ITBD_CONFIG.taxSupport]);\n    const specMap = buildTermMap(body.taxonomies && body.taxonomies[ITBD_CONFIG.taxSpec]);\n    let posts = body.posts || [];\n\n    if (ITBD_CONFIG.filterMode === 'restrict') {\n      if (ITBD_CONFIG.filterBySupport) {\n        const slugs = ITBD_CONFIG.filterBySupport.split(',').map(s => s.trim()).filter(Boolean);\n        const ids = Object.values(supportMap).filter(t => slugs.includes(t.slug)).map(t => t.id);\n        posts = posts.filter(p => (p[ITBD_CONFIG.taxSupport] || []).some(id => ids.includes(id)));\n      }\n      if (ITBD_CONFIG.filterBySpec) {\n        const slugs = ITBD_CONFIG.filterBySpec.split(',').map(s => s.trim()).filter(Boolean);\n        const ids = Object.values(specMap).filter(t => slugs.includes(t.slug)).map(t => t.id);\n        posts = posts.filter(p => (p[ITBD_CONFIG.taxSpec] || []).some(id => ids.includes(id)));\n      }\n    }\n\n    render(posts, supportMap, specMap);\n  }).catch(err => {\n    root.innerHTML = `<div class=\"itbd-be-loading\">Couldn't load the engineer directory.<br><br><span style=\"color:var(--be-cyan-2)\">${esc(err.message)}<\/span><\/div>`;\n    console.error('ITBD bench engineers:', err);\n  });\n\n  \/* ====================================================================\n     SMALL HELPERS\n     ==================================================================== *\/\n  function slugifyList(termIds, termMap){\n    return (termIds || []).map(id => termMap[id] ? termMap[id].slug : null).filter(Boolean);\n  }\n\n  function acfValue(post, fieldName){\n    if(post && post.acf && typeof post.acf[fieldName] !== 'undefined') return post.acf[fieldName];\n    return null;\n  }\n\n  function resolveImage(post){\n    const raw = acfValue(post, ITBD_CONFIG.acfFields.photo);\n    if(raw){\n      if(typeof raw === 'string') return raw;                 \/\/ URL return format\n      if(raw.url) return raw.url;                              \/\/ array\/object return format\n    }\n    if(post.featured_image) return post.featured_image;\n    return '';\n  }\n\n  function resolveLink(post, fieldName){\n    const raw = acfValue(post, fieldName);\n    if(raw){\n      if(typeof raw === 'string') return raw;\n      if(raw.url) return raw.url;\n    }\n    return ITBD_CONFIG.contactUrl;\n  }\n\n  function stripHtml(html){\n    const tmp = document.createElement('div');\n    tmp.innerHTML = html || '';\n    return tmp.textContent || tmp.innerText || '';\n  }\n\n  \/\/ WP returns term names \/ text fields already HTML-entity-encoded\n  \/\/ (e.g. \"Security & Backup\" -> \"Security &amp; Backup\"). Decode once here\n  \/\/ so esc() below doesn't double-encode it into \"&amp;amp;\".\n  function decodeEntities(str){\n    if(!str) return '';\n    const tmp = document.createElement('textarea');\n    tmp.innerHTML = str;\n    return tmp.value;\n  }\n\n  \/\/ Reads a \"sort_order\" custom field off a taxonomy term as it comes\n  \/\/ through in the cached JSON (top-level term.sort_order), with fallbacks\n  \/\/ for a couple of other shapes just in case. Terms without a usable\n  \/\/ value sort to the end, and ties fall back to alphabetical order.\n  function termSortOrder(term){\n    const raw = term && (\n      term.sort_order !== undefined && term.sort_order !== null ? term.sort_order :\n      (term.meta && term.meta.sort_order !== undefined) ? term.meta.sort_order :\n      (term.acf && term.acf.sort_order !== undefined) ? term.acf.sort_order :\n      undefined\n    );\n    const n = parseFloat(raw);\n    return isNaN(n) ? Number.MAX_SAFE_INTEGER : n;\n  }\n  function bySortOrder(a, b){\n    const oa = termSortOrder(a), ob = termSortOrder(b);\n    if(oa !== ob) return oa - ob;\n    return String(a.name||'').localeCompare(String(b.name||''));\n  }\n\n  \/* ====================================================================\n     RENDER\n     ==================================================================== *\/\n  function render(posts, supportMap, specMap){\n\n    const preselectedSupport = ITBD_CONFIG.filterBySupport ? ITBD_CONFIG.filterBySupport.split(',').map(s=>s.trim()).filter(Boolean) : [];\n    const preselectedSpec = ITBD_CONFIG.filterBySpec ? ITBD_CONFIG.filterBySpec.split(',').map(s=>s.trim()).filter(Boolean) : [];\n\n    Object.values(supportMap).forEach(t => { t.name = decodeEntities(t.name); });\n    Object.values(specMap).forEach(t => { t.name = decodeEntities(t.name); });\n\n    \/\/ Flat (no-parent, no-children) find-your-support terms represent role\n    \/\/ names (Advanced System Administrator, Helpdesk Support Specialist,\n    \/\/ etc), as opposed to the hierarchical parent\/child terms used for\n    \/\/ Location.\n    const flatRoleTermsById = {};\n    const flatRoleTermsBySlug = {};\n    Object.values(supportMap).forEach(t => {\n      const hasChildren = Object.values(supportMap).some(c => c.parent === t.id);\n      if(!t.parent && !hasChildren){\n        flatRoleTermsById[t.id] = t;\n        flatRoleTermsBySlug[t.slug] = t;\n        flatRoleTermsBySlug[slugifyRole(t.name)] = t;\n      }\n    });\n\n   posts.forEach(p => {\n  p._supportSlugs = slugifyList(p[ITBD_CONFIG.taxSupport], supportMap);\n  p._specPairs = (p[ITBD_CONFIG.taxSpec] || []).map(id => specMap[id] ? { slug: specMap[id].slug, name: specMap[id].name } : null).filter(Boolean);\n  p._specSlugs = p._specPairs.map(pair => pair.slug);\n\n  const supportTermObjs = (p[ITBD_CONFIG.taxSupport] || []).map(id => supportMap[id]).filter(Boolean);\n  const childTerm = supportTermObjs.find(t => t.parent);\n  p._locationName = childTerm ? childTerm.name : (supportTermObjs[0] ? supportTermObjs[0].name : '');\n\n  const roleTermObj = supportTermObjs.find(t => flatRoleTermsById[t.id]);\n  p._role = (roleTermObj && roleTermObj.name) || decodeEntities(acfValue(p, ITBD_CONFIG.acfFields.role) || '') || extractRoleFromContent(p.content);\n  p._roleSlug = roleTermObj ? roleTermObj.slug : (p._role ? slugifyRole(p._role) : '');\n\n  \/\/ sort_order \u2014 coerce to number; posts missing\/invalid sort_order sink to the bottom\n  const rawSort = acfValue(p, ITBD_CONFIG.acfFields.sortOrder);\n  const parsedSort = parseFloat(rawSort);\n  p._sortOrder = isNaN(parsedSort) ? Number.MAX_SAFE_INTEGER : parsedSort;\n});\n\n\/\/ sort ascending by sort_order; ties fall back to stable original order\nposts.sort((a, b) => a._sortOrder - b._sortOrder);\n\n    const countBySupport = slugs => slugs.length === 0\n      ? posts.length\n      : posts.filter(p => p._supportSlugs.some(s => slugs.includes(s))).length;\n    const countBySpec = slug => posts.filter(p => p._specSlugs.includes(slug)).length;\n\n    \/\/ ---- build support filter groups (hierarchical: parent w\/ children = grouped, like Location) ----\n    const topTerms = Object.values(supportMap).filter(t => !t.parent).sort(bySortOrder);\n    let supportHtml = '';\n    let firstLocationGroupSeen = false;\n\n    topTerms.forEach(term => {\n      const children = Object.values(supportMap).filter(t => t.parent === term.id).sort(bySortOrder);\n      if(children.length){\n        const groupSlugs = [term.slug, ...children.map(c=>c.slug)];\n        const groupLabel = term.name.startsWith('All ') ? term.name : 'All ' + term.name;\n        const isChecked = preselectedSupport.length === 0 ? !firstLocationGroupSeen : preselectedSupport.includes(term.slug);\n        if(preselectedSupport.length === 0) firstLocationGroupSeen = true;\n        supportHtml += radioOption(term.slug, groupLabel, countBySupport(groupSlugs), groupSlugs.join('|'), isChecked, false);\n        children.forEach(child => {\n          supportHtml += radioOption(child.slug, child.name, countBySupport([child.slug]), child.slug, preselectedSupport.includes(child.slug), true);\n        });\n      }\n    });\n\n    \/\/ ---- build role filter group ----\n    const countByRole = slug => posts.filter(p => p._roleSlug === slug).length;\n    const roleMap = {};\n    posts.forEach(p => { if(p._roleSlug && !roleMap[p._roleSlug]) roleMap[p._roleSlug] = p._role; });\n    const roleList = Object.keys(roleMap).map(slug => ({ slug, name: roleMap[slug] })).sort((a,b) => {\n      const ta = flatRoleTermsBySlug[a.slug];\n      const tb = flatRoleTermsBySlug[b.slug];\n      const oa = ta ? termSortOrder(ta) : Number.MAX_SAFE_INTEGER;\n      const ob = tb ? termSortOrder(tb) : Number.MAX_SAFE_INTEGER;\n      if(oa !== ob) return oa - ob;\n      return a.name.localeCompare(b.name);\n    });\n\n    let roleHtml = radioOption('all', 'All Engineers', posts.length, 'all', true, false, 'itbd-be-role');\n    roleList.forEach(role => {\n      roleHtml += radioOption(role.slug, role.name, countByRole(role.slug), role.slug, false, true, 'itbd-be-role');\n    });\n\n    \/\/ ---- specification checkboxes (sorted by sort_order custom field, ascending) ----\n    const specList = Object.values(specMap).sort(bySortOrder);\n    const specHtml = specList.map(term =>\n      `<label class=\"itbd-be-fopt\" data-type=\"check\"><input type=\"checkbox\" value=\"${esc(term.slug)}\" ${preselectedSpec.includes(term.slug)?'checked':''}><span class=\"itbd-be-mark\"><\/span><span class=\"itbd-be-ftxt\">${esc(term.name)}<\/span><span class=\"itbd-be-cnt\">(${countBySpec(term.slug)})<\/span><\/label>`\n    ).join('');\n\n    \/\/ ---- cards ----\n    const cardsHtml = posts.map((p,i) => cardHTML(p,i)).join('');\n\n    root.innerHTML = `\n      <div class=\"itbd-be-headerbar\">\n        <h1 class=\"itbd-be-pagehead\">Bench Engineers<\/h1>\n        <div class=\"itbd-be-top\">\n          ${ITBD_CONFIG.showFilters ? `<button type=\"button\" class=\"itbd-be-filter-toggle\">&#9776; Filters<\/button>` : ''}\n          <div class=\"itbd-be-resultline\">FOUND <b class=\"itbd-be-count\">${posts.length}<\/b> <span class=\"itbd-be-result-word\">${posts.length===1?'RESULT':'RESULTS'}<\/span><\/div>\n        <\/div>\n      <\/div>\n      <div class=\"itbd-be-grid ${ITBD_CONFIG.showFilters ? '' : 'itbd-be-nofilters'}\">\n        ${ITBD_CONFIG.showFilters ? `\n        <div class=\"itbd-be-backdrop\"><\/div>\n        <aside class=\"itbd-be-filters\">\n          <button type=\"button\" class=\"itbd-be-fclose\" aria-label=\"Close filters\">&times;<\/button>\n          ${ITBD_CONFIG.heading ? `<div class=\"itbd-be-fhead\"><h3>${esc(ITBD_CONFIG.heading)}<\/h3><\/div>` : ''}\n          <div class=\"itbd-be-fscroll\">\n            <div class=\"itbd-be-fsearch-wrap itbd-be-fsearch-wrap-support\"><input type=\"text\" class=\"itbd-be-fsearch itbd-be-search-support\" placeholder=\"Search roles \/ locations&hellip;\"><\/div>\n            <div class=\"itbd-be-fgroup itbd-be-support-group\">${supportHtml}<\/div>\n            <div class=\"itbd-be-fgroup itbd-be-role-group\">${roleHtml}<\/div>\n            <div class=\"itbd-be-fsub\">\n              <div class=\"itbd-be-fclearrow\"><h3>Specification<\/h3><button class=\"itbd-be-clear\" type=\"button\">CLEAR ALL<\/button><\/div>\n            <\/div>\n            <div class=\"itbd-be-fsearch-wrap\"><input type=\"text\" class=\"itbd-be-fsearch itbd-be-search-spec\" placeholder=\"Search specifications&hellip;\"><\/div>\n            <div class=\"itbd-be-fgroup itbd-be-spec-group\">${specHtml}<\/div>\n          <\/div>\n        <\/aside>` : ''}\n        <div class=\"itbd-be-cards-col\">\n          <div class=\"itbd-be-cards\">${cardsHtml}<\/div>\n          <div class=\"itbd-be-empty\">NO ENGINEERS MATCH THESE FILTERS &mdash; TRY CLEARING A FEW.<\/div>\n        <\/div>\n      <\/div>\n    `;\n\n    wireFilters();\n    fixStickyAncestors();\n    activateEmbeddedScripts(root);\n  }\n\n  \/**\n   * Belt-and-suspenders fix for position:sticky failing inside Elementor.\n   * Walks up the real DOM at runtime and clears overflow\/transform on any\n   * ancestor that would break sticky, stopping at <body>. Safe no-op if\n   * nothing is actually broken.\n   *\/\n  function fixStickyAncestors(){\n    const filters = root.querySelector('.itbd-be-filters');\n    if(!filters) return;\n    let el = filters.parentElement;\n    while(el && el !== document.body && el.nodeType === 1){\n      const cs = window.getComputedStyle(el);\n      if(cs.overflow !== 'visible') el.style.setProperty('overflow', 'visible', 'important');\n      if(cs.overflowX !== 'visible') el.style.setProperty('overflow-x', 'visible', 'important');\n      if(cs.overflowY !== 'visible') el.style.setProperty('overflow-y', 'visible', 'important');\n      if(cs.transform && cs.transform !== 'none') el.style.setProperty('transform', 'none', 'important');\n      if(cs.willChange && cs.willChange.includes('transform')) el.style.setProperty('will-change', 'auto', 'important');\n      el = el.parentElement;\n    }\n  }\n\n  \/\/ Renders whatever raw HTML the admin pasted into this engineer's Resume\n  \/\/ field directly, unescaped, so the browser treats it as real markup.\n  \/\/ Falls back to a plain text button pointing at the fallback contact URL\n  \/\/ if the field is empty for a post.\n  function resumeCtaHTML(post){\n    const raw = acfValue(post, ITBD_CONFIG.acfFields.resume);\n    const html = typeof raw === 'string' ? raw : (raw && raw.value) ? raw.value : '';\n    if (html && html.trim()){\n      return `<div class=\"itbd-be-resume-embed\">${html}<\/div>`;\n    }\n    return `<a href=\"${esc(ITBD_CONFIG.contactUrl)}\" class=\"itbd-be-btn itbd-be-btn-cyan\">View Resume<\/a>`;\n  }\n\n  \/\/ HTML inserted via innerHTML never executes any <script> tags inside it \u2014\n  \/\/ this finds every <script> that came in through a pasted embed snippet\n  \/\/ and replaces it with a freshly created <script> node, which DOES execute.\n  function activateEmbeddedScripts(container){\n    container.querySelectorAll('.itbd-be-resume-embed script').forEach(oldScript => {\n      const newScript = document.createElement('script');\n      Array.from(oldScript.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value));\n      newScript.textContent = oldScript.textContent;\n      oldScript.parentNode.replaceChild(newScript, oldScript);\n    });\n  }\n\n  function radioOption(id, label, count, groupValue, checked, isSub, radioName){\n    const name = radioName || 'itbd-be-support';\n    return `<label class=\"itbd-be-fopt${isSub?' itbd-be-sub':''}\" data-type=\"radio\"><input type=\"radio\" name=\"${esc(name)}\" value=\"${esc(id)}\" data-group=\"${esc(groupValue)}\" ${checked?'checked':''}><span class=\"itbd-be-mark\"><\/span><span class=\"itbd-be-ftxt\">${esc(label)}<\/span><span class=\"itbd-be-cnt\">(${count})<\/span><\/label>`;\n  }\n\n  \/\/ turns role text like \"Advance System Administrator\" into a filterable slug\n  function slugifyRole(str){\n    return String(str).toLowerCase().trim().replace(\/[^a-z0-9]+\/g, '-').replace(\/^-+|-+$\/g, '');\n  }\n\n  \/\/ role isn't an ACF field on this post type \u2014 it's the first paragraph of\n  \/\/ the post content (e.g. \"Helpdesk Support Specialist\"), with the skills\n  \/\/ list below it duplicating the specification taxonomy\n  function extractRoleFromContent(html){\n    if(!html) return '';\n    const tmp = document.createElement('div');\n    tmp.innerHTML = html;\n    const p = tmp.querySelector('p');\n    return p ? p.textContent.trim() : '';\n  }\n\n  function cardHTML(post, i){\n    const name = stripHtml(post.title);\n    const role = post._role || '';\n    const photo = resolveImage(post);\n    const interviewHref = resolveLink(post, ITBD_CONFIG.acfFields.interview);\n    return `<article class=\"itbd-be-card\" style=\"animation-delay:${i*60}ms\" data-support=\"${esc(post._supportSlugs.join('|'))}\" data-spec=\"${esc(post._specSlugs.join('|'))}\" data-role=\"${esc(post._roleSlug||'')}\">\n      <div class=\"itbd-be-avatar\">\n        <span class=\"itbd-be-mono\">${esc(name ? name.charAt(0) : '?')}<\/span>\n        ${photo ? `<img decoding=\"async\" src=\"${esc(photo)}\" alt=\"${esc(name)}${role ? ', '+esc(role) : ''}\" loading=\"lazy\" onerror=\"this.remove()\">` : ''}\n      <\/div>\n      <div class=\"itbd-be-card-body\">\n        <div class=\"itbd-be-namerow\">\n          <p class=\"itbd-be-ename\">${esc(name)}<\/p>\n        <\/div>\n        ${role ? `<div class=\"itbd-be-erole\">${esc(role)}<\/div>` : ''}\n        <div class=\"itbd-be-skills\">${post._specPairs.map(pair=>`<button type=\"button\" class=\"itbd-be-skill\" data-spec-slug=\"${esc(pair.slug)}\" title=\"Filter by ${esc(pair.name)}\">${esc(pair.name)}<\/button>`).join('')}<\/div>\n        <div class=\"itbd-be-cta\">\n          ${resumeCtaHTML(post)}\n          <a href=\"${esc(interviewHref)}\" class=\"itbd-be-btn itbd-be-btn-ghost benchpopup\">Arrange Interview<\/a>\n        <\/div>\n      <\/div>\n    <\/article>`;\n  }\n\n  function wireFilters(){\n    const roleInputs = root.querySelectorAll('.itbd-be-role-group input');\n    const supportInputs = root.querySelectorAll('.itbd-be-support-group input');\n    const specInputs = root.querySelectorAll('.itbd-be-spec-group input');\n    const cards = root.querySelectorAll('.itbd-be-card');\n    const skillBtns = root.querySelectorAll('.itbd-be-skill');\n    const countEl = root.querySelector('.itbd-be-count');\n    const resultWordEl = root.querySelector('.itbd-be-result-word');\n    const emptyEl = root.querySelector('.itbd-be-empty');\n    const clearBtn = root.querySelector('.itbd-be-clear');\n    const searchSupport = root.querySelector('.itbd-be-search-support');\n    const searchSpec = root.querySelector('.itbd-be-search-spec');\n\n    const filterToggle = root.querySelector('.itbd-be-filter-toggle');\n    const filtersPanel = root.querySelector('.itbd-be-filters');\n    const backdrop = root.querySelector('.itbd-be-backdrop');\n    const fclose = root.querySelector('.itbd-be-fclose');\n\n    function openDrawer(){\n      if(filtersPanel) filtersPanel.classList.add('itbd-be-filters-open');\n      if(backdrop) backdrop.classList.add('itbd-be-backdrop-open');\n      document.body.style.overflow = 'hidden';\n    }\n    function closeDrawer(){\n      if(filtersPanel) filtersPanel.classList.remove('itbd-be-filters-open');\n      if(backdrop) backdrop.classList.remove('itbd-be-backdrop-open');\n      document.body.style.overflow = '';\n    }\n    if(filterToggle) filterToggle.addEventListener('click', openDrawer);\n    if(fclose) fclose.addEventListener('click', closeDrawer);\n    if(backdrop) backdrop.addEventListener('click', closeDrawer);\n\n    function apply(){\n      let activeRole = null;\n      roleInputs.forEach(i => { if(i.checked && i.value !== 'all') activeRole = i.value; });\n      let activeSupport = null;\n      supportInputs.forEach(i => { if(i.checked && i.value !== 'all') activeSupport = i.dataset.group.split('|'); });\n      const activeSpecs = [];\n      specInputs.forEach(i => { if(i.checked) activeSpecs.push(i.value); });\n\n      let visible = 0;\n      cards.forEach(card => {\n        const cSupport = (card.dataset.support||'').split('|').filter(Boolean);\n        const cSpec = (card.dataset.spec||'').split('|').filter(Boolean);\n        const cRole = card.dataset.role || '';\n        const okRole = !activeRole || cRole === activeRole;\n        const okSupport = !activeSupport || cSupport.some(s => activeSupport.includes(s));\n        const okSpec = activeSpecs.length === 0 || cSpec.some(s => activeSpecs.includes(s));\n        const show = okRole && okSupport && okSpec;\n        card.style.display = show ? '' : 'none';\n        if(show) visible++;\n      });\n      if(countEl) countEl.textContent = visible;\n      if(resultWordEl) resultWordEl.textContent = visible === 1 ? 'RESULT' : 'RESULTS';\n      if(emptyEl) emptyEl.style.display = visible ? 'none' : 'block';\n\n      skillBtns.forEach(btn => {\n        btn.classList.toggle('itbd-be-skill-active', activeSpecs.includes(btn.dataset.specSlug));\n      });\n\n      updateAllCounts();\n    }\n\n    function getActiveFilters(){\n      let activeRole = null;\n      roleInputs.forEach(i => { if(i.checked && i.value !== 'all') activeRole = i.value; });\n      let activeSupport = null;\n      supportInputs.forEach(i => { if(i.checked && i.value !== 'all') activeSupport = i.dataset.group.split('|'); });\n      const activeSpecs = [];\n      specInputs.forEach(i => { if(i.checked) activeSpecs.push(i.value); });\n      return { activeRole, activeSupport, activeSpecs };\n    }\n\n    function cardsMatchingExcluding(filters, excludeDimension){\n      return Array.from(cards).filter(card => {\n        const cSupport = (card.dataset.support||'').split('|').filter(Boolean);\n        const cSpec = (card.dataset.spec||'').split('|').filter(Boolean);\n        const cRole = card.dataset.role || '';\n        const okRole = excludeDimension === 'role' || !filters.activeRole || cRole === filters.activeRole;\n        const okSupport = excludeDimension === 'support' || !filters.activeSupport || cSupport.some(s => filters.activeSupport.includes(s));\n        const okSpec = excludeDimension === 'spec' || filters.activeSpecs.length === 0 || cSpec.some(s => filters.activeSpecs.includes(s));\n        return okRole && okSupport && okSpec;\n      });\n    }\n\n    function updateAllCounts(){\n      const filters = getActiveFilters();\n\n      const roleSubset = cardsMatchingExcluding(filters, 'role');\n      const roleCounts = {};\n      roleSubset.forEach(card => { const r = card.dataset.role; if(r) roleCounts[r] = (roleCounts[r]||0) + 1; });\n      const allRoleOpt = root.querySelector('.itbd-be-role-group input[value=\"all\"]');\n      if(allRoleOpt){\n        const cnt = allRoleOpt.closest('label').querySelector('.itbd-be-cnt');\n        if(cnt) cnt.textContent = '(' + roleSubset.length + ')';\n      }\n      root.querySelectorAll('.itbd-be-role-group input:not([value=\"all\"])').forEach(inp => {\n        const cnt = inp.closest('label').querySelector('.itbd-be-cnt');\n        if(cnt) cnt.textContent = '(' + (roleCounts[inp.value] || 0) + ')';\n      });\n\n      const supportSubset = cardsMatchingExcluding(filters, 'support');\n      root.querySelectorAll('.itbd-be-support-group input').forEach(inp => {\n        const groupSlugs = (inp.dataset.group || '').split('|').filter(Boolean);\n        const total = supportSubset.filter(card =>\n          (card.dataset.support||'').split('|').filter(Boolean).some(s => groupSlugs.includes(s))\n        ).length;\n        const label = inp.closest('label');\n        const cnt = label.querySelector('.itbd-be-cnt');\n        if(cnt) cnt.textContent = '(' + total + ')';\n        label.classList.toggle('itbd-be-hidden', !(total > 0 || inp.checked));\n      });\n\n      const specSubset = cardsMatchingExcluding(filters, 'spec');\n      const specCounts = {};\n      specSubset.forEach(card => {\n        (card.dataset.spec||'').split('|').filter(Boolean).forEach(slug => {\n          specCounts[slug] = (specCounts[slug] || 0) + 1;\n        });\n      });\n      const query = searchSpec ? searchSpec.value.trim().toLowerCase() : '';\n      root.querySelectorAll('.itbd-be-spec-group .itbd-be-fopt').forEach(opt => {\n        const input = opt.querySelector('input');\n        const slug = input ? input.value : '';\n        const count = specCounts[slug] || 0;\n        const relevant = count > 0 || (input && input.checked);\n        const labelEl = opt.querySelector('.itbd-be-ftxt');\n        const matchesSearch = !query || (labelEl && labelEl.textContent.toLowerCase().includes(query));\n        opt.classList.toggle('itbd-be-hidden', !(relevant && matchesSearch));\n        const cntEl = opt.querySelector('.itbd-be-cnt');\n        if(cntEl) cntEl.textContent = '(' + count + ')';\n      });\n    }\n\n    roleInputs.forEach(i => i.addEventListener('change', () => { apply(); scrollToResultsTop(); }));\n    supportInputs.forEach(i => i.addEventListener('change', () => { apply(); scrollToResultsTop(); }));\n    specInputs.forEach(i => i.addEventListener('change', () => { apply(); scrollToResultsTop(); }));\n\n    function scrollToResultsTop(){\n      const target = root.closest('.elementor-element-28a05b98') || document.getElementById('itbd-be-root');\n      if(!target) return;\n      const y = target.getBoundingClientRect().top + window.pageYOffset - 20;\n      window.scrollTo({ top: y, behavior: 'smooth' });\n    }\n\n    if(clearBtn){\n      clearBtn.addEventListener('click', () => {\n        specInputs.forEach(i => i.checked = false);\n        const allRoleOpt = root.querySelector('.itbd-be-role-group input[value=\"all\"]');\n        if(allRoleOpt) allRoleOpt.checked = true;\n        const firstLocationOpt = root.querySelector('.itbd-be-support-group input');\n        if(firstLocationOpt) firstLocationOpt.checked = true;\n        apply();\n        scrollToResultsTop();\n      });\n    }\n\n    skillBtns.forEach(btn => {\n      btn.addEventListener('click', () => {\n        const slug = btn.dataset.specSlug;\n        const input = root.querySelector('.itbd-be-spec-group input[value=\"' + CSS.escape(slug) + '\"]');\n        if(input){\n          input.checked = !input.checked;\n          apply();\n          input.closest('label').scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n        }\n      });\n    });\n\n    function wireSearch(input, groupSelectors){\n      if(!input) return;\n      const selector = groupSelectors.map(sel => sel + ' .itbd-be-fopt').join(', ');\n      input.addEventListener('input', () => {\n        const q = input.value.trim().toLowerCase();\n        root.querySelectorAll(selector).forEach(opt => {\n          const label = opt.querySelector('.itbd-be-ftxt').textContent.toLowerCase();\n          opt.classList.toggle('itbd-be-hidden', q.length > 0 && !label.includes(q));\n        });\n      });\n    }\n    wireSearch(searchSupport, ['.itbd-be-role-group', '.itbd-be-support-group']);\n    if(searchSpec){\n      searchSpec.addEventListener('input', updateAllCounts);\n    }\n\n    apply();\n  }\n\n  function esc(str){\n    return String(str==null?'':str).replace(\/[&<>\"']\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[m]));\n  }\n\n})();\n<\/script>\n\n<!--\n  NOTE ON THE DATA SOURCE:\n  This version reads one static file (jsonUrl, above) instead of hitting\n  three live REST endpoints per page load. If the sidebar ever looks empty\n  or stale after editing engineers\/terms in wp-admin, the JSON cache hasn't\n  regenerated \u2014 check that the Bench Engineer JSON Cache plugin is active,\n  and trigger a manual rebuild (WP-CLI or the admin-ajax action) if needed.\n\n  NOTE ON THE STICKY SIDEBAR:\n  If the sidebar still doesn't stick after pasting this, the cause is on an\n  Elementor PARENT element wrapping this HTML widget, not in this file. Check:\n  1) Section\/Column (or Container) wrapping this widget \u2192 Advanced tab \u2192\n     Overflow \u2192 must be \"Default\/Visible\", not \"Hidden\".\n  2) Advanced \u2192 Motion Effects on that Section\/Column and any ancestor \u2192\n     remove any entrance animation \/ sticky effect (these apply a CSS\n     \"transform\" which silently breaks position:sticky on children).\n  No CSS inside this widget can override those two settings from outside.\n\n  NOTE ON THE \"ARRANGE INTERVIEW\" EMBED:\n  The button already carries class=\"benchpopup\" \u2014 if there's an existing\n  Elementor Pro Popup or Popup Maker popup on the site set to trigger on\n  that class, paste your embed code into THAT popup's content, not into\n  this file.\n-->\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5cf18944 elementor-widget elementor-widget-html\" data-id=\"5cf18944\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"corner-bl\"><\/div>\n<div class=\"corner-br\"><\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1fb033f e-con-full fin-frame padding-reset panel-dark e-flex e-con e-child\" data-id=\"1fb033f\" data-element_type=\"container\" id=\"get-started\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-69ea635 e-con-full e-flex e-con e-child\" data-id=\"69ea635\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-46ca1c6 e-con-full e-flex e-con e-child\" data-id=\"46ca1c6\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-334eb78d elementor-widget elementor-widget-html\" data-id=\"334eb78d\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"cbd-coaches\">\r\n  <div class=\"cbc-inner\">\r\n    <div class=\"cbc-head\">\r\n      <span class=\"cbc-eyebrow\"> Still Looking? <\/span>\r\n      <h2 class=\"cbc-h2\">Didn't Find Your\r\nPerfect Fit?<\/h2>\r\n      <p class=\"cbc-lead\">Our dedicated engineers end your talent acquisition and retention challenges - so you can focus on company goals and growth. Reach out and we'll line up more options.<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <style>\r\n    @import url('https:\/\/fonts.googleapis.com\/css2?family=Bebas+Neue&family=Inter:wght@400;500;600&family=Inter+Tight:wght@400;500;600;700&display=swap');\r\n\r\n    .cbd-coaches{\r\n      --cbc-cyan:#00ADDA;\r\n      background:#07101F; color:#fff;\r\n      font-family:\"Inter Tight\",\"Inter\",-apple-system,BlinkMacSystemFont,sans-serif;\r\n      -webkit-font-smoothing:antialiased;  box-sizing:border-box;\r\n    }\r\n    .cbd-coaches *{ box-sizing:border-box; }\r\n    .cbd-coaches .cbc-inner{ margin:0 auto;  }\r\n    .cbd-coaches .cbc-eyebrow{ font-family:\"Inter\",sans-serif; font-size:14px; font-weight:500; letter-spacing:0.18em; text-transform:uppercase; color:var(--cbc-cyan); }\r\n    .cbd-coaches .cbc-h2{ font-family:\"Bebas Neue\",sans-serif; font-weight:400; font-size:clamp(36px,4.4vw,70px); line-height:1.04; letter-spacing:0.01em; text-transform:uppercase; color:#fff; margin:10px 0 0; }\r\n    .cbd-coaches .cbc-lead{ font-size:clamp(16px,1.5vw,19px); line-height:1.55; color:#fff; margin:18px 0 0; }\r\n  <\/style>\r\n<\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-eeab77b e-con-full e-flex e-con e-child\" data-id=\"eeab77b\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59790b94 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"59790b94\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\n    .elementor-element-59790b94{\n        background:#fff;\n        padding:15px 25px;\n        border-radius: 12px;\n    }\n    \n   \n<\/style>\n<div>\n<script charset=\"utf-8\" type=\"text\/javascript\" src=\"\/\/js.hsforms.net\/forms\/embed\/v2.js\"><\/script>\n<script>\n  hbspt.forms.create({\n    region: \"na1\",\n    portalId: \"3388800\",\n    formId: \"eee5bf3a-bfb4-4a5c-b1eb-2d887b7b18a0\"\n  });\n<\/script>\n<\/div>\n \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-26d4a82a elementor-widget elementor-widget-html\" data-id=\"26d4a82a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"corner-bl\"><\/div>\n<div class=\"corner-br\"><\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Scale Fast WithITBD Tech Talent Here&#8217;s your\u00a0needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements &#8211; roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":10926,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-9399","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"Scale Fast WithITBD Tech Talent Here\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/itbd.net\/lp\/msp-bench-engineers\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"IT By Design - Technical Solutions for MSPs\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"MSP Bench Engineers - IT By Design\" \/>\n\t\t<meta property=\"og:description\" content=\"Scale Fast WithITBD Tech Talent Here\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/itbd.net\/lp\/msp-bench-engineers\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/itbd.net\/wp-content\/uploads\/2024\/04\/IT-By-Design.webp\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/itbd.net\/wp-content\/uploads\/2024\/04\/IT-By-Design.webp\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-16T09:24:44+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-22T18:41:53+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ITByDesign.NA\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@IT_BY_DESIGN\" \/>\n\t\t<meta name=\"twitter:title\" content=\"MSP Bench Engineers - IT By Design\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Scale Fast WithITBD Tech Talent Here\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@IT_BY_DESIGN\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/itbd.net\/wp-content\/uploads\/2024\/04\/IT-By-Design.webp\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/itbd.net\\\/lp\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#listItem\",\"name\":\"MSP Bench Engineers\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#listItem\",\"position\":2,\"name\":\"MSP Bench Engineers\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/#organization\",\"name\":\"IT By Design\",\"description\":\"Technical Solutions for MSPs\",\"url\":\"https:\\\/\\\/itbd.net\\\/lp\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/itbd.net\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/IT-By-Design.webp\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#organizationLogo\"},\"image\":{\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/ITByDesign.NA\",\"https:\\\/\\\/twitter.com\\\/IT_BY_DESIGN\",\"https:\\\/\\\/www.instagram.com\\\/it.by.design\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCCXfeAqGb6xO1uQ5Zkuf42g\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/it-by-design\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#webpage\",\"url\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/\",\"name\":\"MSP Bench Engineers - IT By Design\",\"description\":\"Scale Fast WithITBD Tech Talent Here\\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#breadcrumblist\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/itbd.net\\\/lp\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/ITBD-OG-Image-1.jpg\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#mainImage\",\"width\":1200,\"height\":628},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/msp-bench-engineers\\\/#mainImage\"},\"datePublished\":\"2026-07-16T09:24:44+00:00\",\"dateModified\":\"2026-09-22T18:41:53+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/#website\",\"url\":\"https:\\\/\\\/itbd.net\\\/lp\\\/\",\"name\":\"IT By Design\",\"description\":\"Technical Solutions for MSPs\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/itbd.net\\\/lp\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"MSP Bench Engineers - IT By Design","description":"Scale Fast WithITBD Tech Talent Here\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume","canonical_url":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/itbd.net\/lp\/#listItem","position":1,"name":"Home","item":"https:\/\/itbd.net\/lp\/","nextItem":{"@type":"ListItem","@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#listItem","name":"MSP Bench Engineers"}},{"@type":"ListItem","@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#listItem","position":2,"name":"MSP Bench Engineers","previousItem":{"@type":"ListItem","@id":"https:\/\/itbd.net\/lp\/#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/itbd.net\/lp\/#organization","name":"IT By Design","description":"Technical Solutions for MSPs","url":"https:\/\/itbd.net\/lp\/","logo":{"@type":"ImageObject","url":"https:\/\/itbd.net\/wp-content\/uploads\/2024\/04\/IT-By-Design.webp","@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#organizationLogo"},"image":{"@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/ITByDesign.NA","https:\/\/twitter.com\/IT_BY_DESIGN","https:\/\/www.instagram.com\/it.by.design\/","https:\/\/www.youtube.com\/channel\/UCCXfeAqGb6xO1uQ5Zkuf42g","https:\/\/www.linkedin.com\/company\/it-by-design"]},{"@type":"WebPage","@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#webpage","url":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/","name":"MSP Bench Engineers - IT By Design","description":"Scale Fast WithITBD Tech Talent Here\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/itbd.net\/lp\/#website"},"breadcrumb":{"@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#breadcrumblist"},"image":{"@type":"ImageObject","url":"https:\/\/itbd.net\/lp\/wp-content\/uploads\/2026\/08\/ITBD-OG-Image-1.jpg","@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#mainImage","width":1200,"height":628},"primaryImageOfPage":{"@id":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/#mainImage"},"datePublished":"2026-07-16T09:24:44+00:00","dateModified":"2026-09-22T18:41:53+00:00"},{"@type":"WebSite","@id":"https:\/\/itbd.net\/lp\/#website","url":"https:\/\/itbd.net\/lp\/","name":"IT By Design","description":"Technical Solutions for MSPs","inLanguage":"en-US","publisher":{"@id":"https:\/\/itbd.net\/lp\/#organization"}}]},"og:locale":"en_US","og:site_name":"IT By Design - Technical Solutions for MSPs","og:type":"article","og:title":"MSP Bench Engineers - IT By Design","og:description":"Scale Fast WithITBD Tech Talent Here\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume","og:url":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/","og:image":"https:\/\/itbd.net\/wp-content\/uploads\/2024\/04\/IT-By-Design.webp","og:image:secure_url":"https:\/\/itbd.net\/wp-content\/uploads\/2024\/04\/IT-By-Design.webp","article:published_time":"2026-07-16T09:24:44+00:00","article:modified_time":"2026-09-22T18:41:53+00:00","article:publisher":"https:\/\/www.facebook.com\/ITByDesign.NA","twitter:card":"summary_large_image","twitter:site":"@IT_BY_DESIGN","twitter:title":"MSP Bench Engineers - IT By Design","twitter:description":"Scale Fast WithITBD Tech Talent Here\u2019s your needle in a haystack. Talent Needs Form How It Works Help Us Help You In 2 Easy Steps Tell us what you need Fill the Talent Needs (TND) form to elaborate on your requirements - roles, skills, shifts, and stack. Talent Needs Form Meet the engineers Choose View Resume","twitter:creator":"@IT_BY_DESIGN","twitter:image":"https:\/\/itbd.net\/wp-content\/uploads\/2024\/04\/IT-By-Design.webp"},"aioseo_meta_data":{"post_id":"9399","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-07-06 11:33:51","updated":"2026-09-22 19:44:09","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/itbd.net\/lp\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tMSP Bench Engineers\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/itbd.net\/lp\/"},{"label":"MSP Bench Engineers","link":"https:\/\/itbd.net\/lp\/msp-bench-engineers\/"}],"_links":{"self":[{"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/pages\/9399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/comments?post=9399"}],"version-history":[{"count":286,"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/pages\/9399\/revisions"}],"predecessor-version":[{"id":11230,"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/pages\/9399\/revisions\/11230"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/media\/10926"}],"wp:attachment":[{"href":"https:\/\/itbd.net\/lp\/wp-json\/wp\/v2\/media?parent=9399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}