{"id":139,"date":"2026-05-06T19:24:45","date_gmt":"2026-05-06T19:24:45","guid":{"rendered":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/"},"modified":"2026-05-11T15:13:39","modified_gmt":"2026-05-11T15:13:39","slug":"grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum","status":"publish","type":"post","link":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/","title":{"rendered":"Destination Success | Grant Murray"},"content":{"rendered":"<article class=\"hpu-video-article\">\n<div class=\"hpu-video-layout\">\n<aside class=\"hpu-video-sidebar\">\n<div class=\"hpu-video-sidebar-inner\">\n<div class=\"hpu-video-cta-container\">\n<div id=\"hpu-video-cta\"><\/div>\n<\/p><\/div>\n<section id=\"hpu-video-transcript\" class=\"hpu-video-transcript\" aria-label=\"Video Transcript\">\n<div class=\"hpu-video-transcript-header\">\n                        <span class=\"hpu-video-transcript-title\">Chapters &amp; Transcript<\/span>\n                    <\/div>\n<div id=\"hpu-video-transcript-content\" class=\"hpu-video-transcript-content\" role=\"region\" aria-label=\"Transcript chapters\">\n<div class=\"hpu-video-transcript-chapter expanded\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">1<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">Why do High Point University graduates succeed?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=0\">0:00<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">My name is Grant Murray. I am from Winter Haven, Florida, and I graduated in May 2025 with a double major in finance and marketing. After graduation, I now work at Bank of New York in Lake Mary, Florida in the rotational analyst program.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">2<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">What are dorms like at High Point University?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=25\">0:25<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">When I first came and toured High Point University, it was me and my mom. And when we saw the freshman year dorms, my mom looked at me and said, &#039;This is not normal.&#039; And you should 100% really look into this place because I have never seen anything like it.<\/p>\n<p class=\"hpu-video-transcript-text\">And I saw the campus and I saw the opportunities and everybody, you know, walking and smiling and, you know, clearly I could see that people are enjoying this place and, you know, I want a part of that, too.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">3<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">What is the High Point University motto?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=51\">0:51<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">And seeing that HPU&#039;s motto is God, family, country. I cared about that a lot because having a father as a veteran and also an uncle, you know, it&#039;s important to me.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">4<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">How does High Point University help students find jobs?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=61\">1:01<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">When I started, I wasn&#039;t sure what field and route I wanted to go in finance. So, I went to the career and professional development office and I met with Dr. Doug Hall, which was a huge inspiration and mentor to me.<\/p>\n<p class=\"hpu-video-transcript-text\">Every time I went to his office and left, I felt more confident in what I needed to do and that I actually was going to be able to land an opportunity. After perfecting my interview process, I received an offer and here we are.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">5<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">How do High Point University professors mentor students?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=86\">1:26<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">Another huge mentor to me was Dr. Larry Quinn. I&#039;ve never seen him without a smile on his face and, you know, giving me a hug and saying, you know, how am I doing?<\/p>\n<p class=\"hpu-video-transcript-text\">You know, he truly is a great person to sit down and learn from or if you&#039;re having a bad day, I would say that&#039;s the person to go to.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">6<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">What is the High Point University community like?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=104\">1:44<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">There are so many different opportunities at High Point University to really get that feeling of community and truly immerse yourself and that is what I miss the most.<\/p>\n<p class=\"hpu-video-transcript-text\">I definitely miss like the opportunity and availability of seeing my friends and faculty at HPU having that like small community feeling.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">7<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">What is the HPU in the City networking program?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=123\">2:03<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">You know, HPU has so many opportunities for the students to take advantage of. And one of them that I actually did was HPU in the city trip to New York City.<\/p>\n<p class=\"hpu-video-transcript-text\">And there&#039;s mentors there that go with you and essentially you get to go to the headquarters of many globally known name brand offices such as you know I went to the headquarters of Morgan Stanley got to sit down with suite execs and really dive into what their day-to-day is how to accomplish what you want to do and how to be in their shoes.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">8<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">Does High Point University have Greek life?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=150\">2:30<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">You know other great opportunities that HPU offers are the clubs. I was in Greek life. I was in cap for order. I missed that a lot.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">9<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">How does High Point University honor military veterans?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=158\">2:38<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">We actually hold the Veterans Day event here at High Point. It&#039;s the largest Veterans Day event on a college campus. Essentially, we raise money to build these track chairs for these wounded veterans.<\/p>\n<p class=\"hpu-video-transcript-text\">And seeing their smile and seeing how happy they are because of what we have put in the work for them, it really was special. And I also was part of the investment club and sales club.<\/p>\n<p class=\"hpu-video-transcript-text\">And I feel like, you know, those are three different opportunities and, you know, different types of clubs. But at the end of the day, you&#039;re having fun with the people that you&#039;re around.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">10<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">What is the best career advice for college students?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=190\">3:10<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">My top piece of advice is take action early. It&#039;s not just about GPA. Step out of your comfort zone. Join clubs, meet people, attend events, network, give back to the community. Try your best to, you know, just become a completely well-rounded individual.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-chapter\">\n<div class=\"hpu-video-transcript-chapter-header\" role=\"button\" aria-expanded=\"true\">\n<div class=\"hpu-video-transcript-chapter-header-top\">\n<div class=\"hpu-video-transcript-chapter-number\">11<\/div>\n<h2 class=\"hpu-video-transcript-speaker\">What does it mean to choose to be extraordinary?<\/h2>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"hpu-video-transcript-text-container\">\n<div class=\"hpu-video-transcript-text-inner\">\n                                    <span class=\"hpu-video-transcript-chapter-time\"><a href=\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU&amp;t=207\">3:27<\/a><\/span><\/p>\n<p class=\"hpu-video-transcript-text\">Choose to be extraordinary to me means pushing past my own limits, hitting my goals that I&#039;ve set for myself, and also just never forget the people that helped you along the way.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/section><\/div>\n<\/aside>\n<div class=\"hpu-video-main\">\n<section class=\"hpu-video-section\" aria-label=\"Video Player\">\n<div class=\"hpu-video-section-iframe\">\n                    <iframe loading=\"lazy\" title=\"Destination Success | Grant Murray\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/XRLDt7eKnQU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n                <\/div>\n<\/section>\n<div class=\"hpu-video-body\">\n<div class=\"hpu-video-tabs\">\n                    <button class=\"hpu-video-tab-btn active\" data-tab=\"description\">Description<\/button><br \/>\n                    <button class=\"hpu-video-tab-btn\" data-tab=\"related\">Related Videos<\/button>\n                <\/div>\n<div class=\"hpu-video-tab-content active\" id=\"tab-description\">\n<section class=\"hpu-video-summary\" aria-label=\"Video Description\">\n<p>Grant Murray, a High Point University graduate now working at Bank of New York, shares his HPU experience highlighting exceptional facilities, mentor relationships, community atmosphere, and networking opportunities like the HPU in the City program. He emphasizes the importance of student engagement through clubs, Greek life, and service initiatives, and advises students to take action early, step outside their comfort zone, and choose to be extraordinary.<\/p>\n<div class=\"hpu-video-tags\"><\/div>\n<\/section><\/div>\n<div class=\"hpu-video-tab-content\" id=\"tab-related\">\n<section class=\"hpu-related-videos\" aria-label=\"Related Videos\">\n<div class=\"hpu-related-videos-slider\"><\/div>\n<p class=\"hpu-related-videos-none\">No related videos found.<\/p>\n<\/section><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<script>\r\n  \/\/ \u2500\u2500 Initialize Transcript Headings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  const firstChapterHeading = document.querySelector('.hpu-video-transcript-chapter:first-child .hpu-video-transcript-speaker');\r\n  if (firstChapterHeading) {\r\n    firstChapterHeading.innerHTML = 'Introduction';\r\n  }\r\n\r\n  \/\/ \u2500\u2500 Transcript Accordion Logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  const chapters = document.querySelectorAll(\".hpu-video-transcript-chapter\");\r\n  \r\n  chapters.forEach(chapter => {\r\n    const header = chapter.querySelector(\".hpu-video-transcript-chapter-header\");\r\n    const content = chapter.querySelector(\".hpu-video-transcript-text-container\");\r\n    \r\n    \/\/ Initialize height for expanded ones\r\n    if (chapter.classList.contains(\"expanded\")) {\r\n      content.style.height = \"auto\";\r\n    }\r\n\r\n    header.addEventListener(\"click\", () => {\r\n      const isExpanded = chapter.classList.contains(\"expanded\");\r\n      \r\n      if (!isExpanded) {\r\n        \/\/ Expand\r\n        chapter.classList.add(\"expanded\");\r\n        header.setAttribute(\"aria-expanded\", \"true\");\r\n        content.style.height = content.scrollHeight + \"px\";\r\n        \r\n        content.addEventListener(\r\n          \"transitionend\",\r\n          function handler() {\r\n            content.style.height = \"auto\";\r\n            content.removeEventListener(\"transitionend\", handler);\r\n          },\r\n          { once: true }\r\n        );\r\n      } else {\r\n        \/\/ Collapse\r\n        content.style.height = content.scrollHeight + \"px\";\r\n        content.offsetHeight; \/\/ force reflow\r\n        content.style.height = \"0\";\r\n        chapter.classList.remove(\"expanded\");\r\n        header.setAttribute(\"aria-expanded\", \"false\");\r\n      }\r\n    });\r\n  });\r\n\r\n  \/\/ \u2500\u2500 Tab Logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  const tabBtns = document.querySelectorAll(\".hpu-video-tab-btn\");\r\n  const tabContents = document.querySelectorAll(\".hpu-video-tab-content\");\r\n\r\n  tabBtns.forEach(btn => {\r\n    btn.addEventListener(\"click\", () => {\r\n      const targetId = \"tab-\" + btn.getAttribute(\"data-tab\");\r\n      \r\n      tabBtns.forEach(b => b.classList.remove(\"active\"));\r\n      tabContents.forEach(c => c.classList.remove(\"active\"));\r\n      \r\n      btn.classList.add(\"active\");\r\n      const targetContent = document.getElementById(targetId);\r\n      if (targetContent) targetContent.classList.add(\"active\");\r\n    });\r\n  });\r\n\r\n  \/\/ \u2500\u2500 Fancybox Modal Logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  document\r\n    .querySelectorAll(\".hpu-video-transcript-text-inner\")\r\n    .forEach(function (inner) {\r\n      inner.addEventListener(\"click\", function (e) {\r\n        var link = inner.querySelector(\".hpu-video-transcript-chapter-time a\");\r\n        if (!link) return;\r\n        e.stopPropagation(); \/\/ prevent accordion toggle when clicking timestamp\r\n        e.preventDefault();\r\n        var url = new URL(link.href);\r\n        var t = parseInt(url.searchParams.get(\"t\"), 10);\r\n        if (isNaN(t)) t = 0;\r\n        var videoWrapper = document.querySelector(\r\n          \".hpu-video-section-iframe .video-wrapper\",\r\n        );\r\n        var baseUrl = videoWrapper\r\n          ? videoWrapper.getAttribute(\"href\")\r\n          : \"https:\/\/www.youtube.com\/embed\/1qN81LI7qok?feature=oembed\";\r\n        var embedBase = baseUrl.split(\"?\")[0];\r\n\r\n        \/\/ Dynamically fit the modal to the viewport at 16:9, no black bars\r\n        var pad = 40; \/\/ breathing room around the modal\r\n        var vw = window.innerWidth - pad * 2;\r\n        var vh = window.innerHeight - pad * 2;\r\n        var modalWidth, modalHeight;\r\n\r\n        if (vw \/ vh >= 16 \/ 9) {\r\n          \/\/ Viewport is wider than 16:9 \u2014 height is the constraint\r\n          modalHeight = vh;\r\n          modalWidth = Math.round((vh * 16) \/ 9);\r\n        } else {\r\n          \/\/ Viewport is taller than 16:9 \u2014 width is the constraint\r\n          modalWidth = vw;\r\n          modalHeight = Math.round((vw * 9) \/ 16);\r\n        }\r\n\r\n        $.fancybox.open([\r\n          {\r\n            src: embedBase + \"?autoplay=1&start=\" + t,\r\n            type: \"iframe\",\r\n            width: modalWidth,\r\n            height: modalHeight,\r\n          },\r\n        ]);\r\n      });\r\n    });\r\n\r\n  \/\/ \u2500\u2500 CTA Logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  const ctaLibrary = {\r\n    apply: {\r\n      title: \"Apply to High Point\",\r\n      text: \"The application takes about 20 minutes. Early Decision closes November 1.\",\r\n      buttons: [\r\n        {\r\n          text: \"Start Your Application\",\r\n          link: \"https:\/\/www.highpoint.edu\/admissions\/apply\/\",\r\n        },\r\n      ],\r\n    },\r\n    visit: {\r\n      title: \"See It for Yourself\",\r\n      text: \"Daily visits and fall open houses. Sit in on a class, see a residence hall and eat in the dining halls.\",\r\n      buttons: [\r\n        {\r\n          text: \"Book a Visit\",\r\n          link: \"https:\/\/www.highpoint.edu\/admissions\/experience-high-point-university\/\",\r\n        },\r\n      ],\r\n    },\r\n    request: {\r\n      title: \"Get Program Details\",\r\n      text: \"Tell us what you want to study, and the admissions counselor for your region will follow up.\",\r\n      buttons: [\r\n        {\r\n          text: \"Request Info\",\r\n          link: \"https:\/\/discover.highpoint.edu\/register\/inquiry\",\r\n        },\r\n      ],\r\n    },\r\n    deposit: {\r\n      title: \"Make Your Deposit\",\r\n      text: \"Ready to join the #HPUFamily? Secure your place in the incoming class and unlock access to the nation's best dorms today. Your housing preference is based on your deposit date!\",\r\n      buttons: [\r\n        {\r\n          text: \"Submit Your Deposit\",\r\n          link: \"\/admissions\/landing-deposit\",\r\n        },\r\n      ],\r\n    },\r\n  };\r\n\r\n  const urlParams = new URLSearchParams(window.location.search);\r\n\r\n  const ctaElement = document.getElementById(\"hpu-video-cta\");\r\n  const ctaParam = urlParams.get(\"cta\");\r\n\r\n  \/\/ \u2500\u2500 Start time: ?t=SECONDS starts this page's video there (ads use it to open on the right moment).\r\n  \/\/ Destination Success videos open with a ~10 second logo intro, so they start past it unless ?t says otherwise.\r\n  const hpuStartAt = (function () { var v = parseInt(urlParams.get(\"t\"), 10); return v > 0 && v < 36000 ? v : 0; })();\r\n  const HPU_DS_SKIP = 10;\r\n  function hpuIsDS(title) { return \/^\\s*Destination Success\\b\/i.test(title || \"\"); }\r\n  function hpuPageTitle() { var h = document.querySelector(\"h1\"); return (h && h.textContent) || document.title || \"\"; }\r\n  const hpuMainStart = hpuStartAt || (hpuIsDS(hpuPageTitle()) ? HPU_DS_SKIP : 0);\r\n\r\n  if (ctaElement) {\r\n    const ctaData = ctaLibrary[ctaParam] || ctaLibrary[\"visit\"];\r\n\r\n    \/\/ Title\r\n    const ctaTitleEl = document.createElement(\"h2\");\r\n    ctaTitleEl.textContent = ctaData.title;\r\n    ctaElement.appendChild(ctaTitleEl);\r\n\r\n    \/\/ Text\r\n    const ctaTextEl = document.createElement(\"p\");\r\n    ctaTextEl.textContent = ctaData.text;\r\n    ctaElement.appendChild(ctaTextEl);\r\n\r\n    \/\/ Button\r\n    if (ctaData.buttons && ctaData.buttons.length > 0) {\r\n      ctaData.buttons.forEach(function (button) {\r\n        const ctaButtonEl = document.createElement(\"a\");\r\n        const ctaClass = button?.class ?? \"hpu-btn-purple-outline\";\r\n        ctaButtonEl.textContent = button.text;\r\n        ctaButtonEl.setAttribute(\"href\", button.link);\r\n        ctaButtonEl.setAttribute(\"class\", ctaClass);\r\n        ctaButtonEl.addEventListener(\"click\", function () { if (ctaParam === \"apply\") { try { sessionStorage.setItem(\"hpu_apply_clicked\", \"1\"); } catch (e) {} } });\r\n        ctaElement.appendChild(ctaButtonEl);\r\n      });\r\n    }\r\n  }\r\n\r\n  \/\/ \u2500\u2500 Captions on by default: add cc_load_policy to the main YouTube embed \u2500\u2500\r\n  (function () {\r\n    \/\/ The theme lazy-loads the embed: the URL can sit in data-src until the player loads, so update both.\r\n    var f = document.querySelector('.hpu-video-section-iframe iframe[src*=\"youtube\"], .hpu-video-section-iframe iframe[data-src*=\"youtube\"]');\r\n    if (!f) return;\r\n    ['src', 'data-src'].forEach(function (attr) {\r\n      var v = f.getAttribute(attr);\r\n      if (!v || v.indexOf('youtube') < 0) return;\r\n      try {\r\n        var u = new URL(v, location.href);\r\n        u.searchParams.set('cc_load_policy', '1');\r\n        u.searchParams.set('cc_lang_pref', 'en');\r\n        if (hpuMainStart) u.searchParams.set('start', String(hpuMainStart));\r\n        var nv = u.toString();\r\n        if (nv !== v) f.setAttribute(attr, nv);\r\n      } catch (e) {}\r\n    });\r\n  })();\r\n\r\n  \/\/ \u2500\u2500 Mobile CTA placement: move the CTA directly under the video at <=1365px \u2500\u2500\r\n  (function () {\r\n    var cta = document.querySelector('.hpu-video-cta-container');\r\n    var home = document.querySelector('.hpu-video-sidebar-inner');\r\n    var video = document.querySelector('.hpu-video-main > .hpu-video-section');\r\n    if (!cta || !home || !video) return;\r\n    var mq = window.matchMedia('(max-width: 1365px)');\r\n    function place() {\r\n      if (mq.matches) { if (video.nextElementSibling !== cta) video.insertAdjacentElement('afterend', cta); }\r\n      else if (cta.parentElement !== home) { home.insertBefore(cta, home.firstChild); }\r\n    }\r\n    place();\r\n    if (mq.addEventListener) mq.addEventListener('change', place); else if (mq.addListener) mq.addListener(place);\r\n  })();\r\n\r\n  \/\/ \u2500\u2500 Mobile video modal: edge-to-edge player, larger captions, CTA, swipe feed of related videos \u2500\u2500\r\n  (function () {\r\n    var PHONE = window.matchMedia('(max-width: 900px), (max-height: 500px) and (pointer: coarse)');\r\n    \/\/ Desktop (wide screen, mouse or trackpad): the viewer opens here too, with up\/down arrows, keyboard and wheel.\r\n    var DESK = window.matchMedia('(min-width: 1024px) and (hover: hover) and (pointer: fine)');\r\n    function useModal() { return PHONE.matches || DESK.matches; }\r\n    var LAND = window.matchMedia('(orientation: landscape)');\r\n    var CALM = window.matchMedia('(prefers-reduced-motion: reduce)');\r\n    var box = document.querySelector('.hpu-video-section-iframe');\r\n    if (!box) return;\r\n    \/\/ TikTok test mode (?vmfeed=tiktok, remembered for the browser tab) runs the \"HPU Video TikTok Feed\" snippet instead of this viewer.\r\n    var hpuFeed = (location.search.match(\/[?&]vmfeed=(tiktok|youtube)\\b\/) || [])[1]; try { if (!hpuFeed) hpuFeed = sessionStorage.getItem('hpu_vm_feed'); } catch (e) {}\r\n    if (hpuFeed === 'tiktok') return;\r\n    var css = document.createElement('style');\r\n    css.textContent = [\r\n      '.hpu-vm{--hpu-vm-font:Poppins,system-ui,-apple-system,sans-serif;position:fixed;inset:0;z-index:2147483000;background:#0d0a14;opacity:0;transition:opacity .2s ease;overscroll-behavior:contain}',\r\n      '.hpu-vm.is-open{opacity:1}',\r\n      '.hpu-vm.is-standby{visibility:hidden;pointer-events:none}',\r\n      '.hpu-vm-feed{position:relative;height:100%;overflow-x:hidden;overflow-y:auto;scroll-snap-type:y mandatory;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-width:none}',\r\n      '.hpu-vm-feed::-webkit-scrollbar{display:none}',\r\n      '.hpu-vm-slide{position:relative;height:100%;box-sizing:border-box;scroll-snap-align:start;scroll-snap-stop:always;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:22px;padding:env(safe-area-inset-top,0px) env(safe-area-inset-right,0px) env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px)}',\r\n      '.hpu-vm-frame{position:relative;width:100vw;aspect-ratio:16\/9;background:#000 center\/cover no-repeat;flex:none}',\r\n      '.hpu-vm-glow{position:absolute;inset:-9% -2%;z-index:-1;pointer-events:none;filter:blur(20px) saturate(1.2);opacity:.22;transform:translateZ(0)}',\r\n      '.hpu-vm-glow i{position:absolute;inset:0;background:center\/cover no-repeat;transition:opacity 2.4s ease;will-change:opacity}',\r\n      '.hpu-vm-glow i.off{opacity:0}',\r\n      '.hpu-vm-stage{position:absolute;left:0;top:0;z-index:2;background:#000;opacity:0;pointer-events:none;transition:opacity .12s ease}',\r\n      '.hpu-vm-stage.is-live{opacity:1;pointer-events:auto}',\r\n      '.hpu-vm-stage.no-fade{transition:none}',\r\n      '.hpu-vm-stage.is-preview{opacity:1}',\r\n      '.hpu-vm-stage > div,.hpu-vm-stage iframe{position:absolute;inset:0;width:100%;height:100%;border:0}',\r\n      '.hpu-vm-close{position:absolute;top:calc(env(safe-area-inset-top,0px) + 10px);right:calc(env(safe-area-inset-right,0px) + 10px);width:44px;height:44px;border-radius:50%;border:0;background:rgba(255,255,255,.14);color:#fff;font:400 26px\/44px system-ui,sans-serif;cursor:pointer;z-index:6;touch-action:manipulation}',\r\n      '.hpu-vm-close::before{content:\"\";position:absolute;inset:-10px}',\r\n      '.hpu-vm-cta{position:relative;z-index:3;display:flex;flex-direction:column;align-items:center;gap:12px;padding:0 24px;text-align:center;transition:opacity .45s ease,transform .45s ease}',\r\n      '.hpu-vm-cta p{margin:0;color:#fff;font:500 18px\/1.35 var(--hpu-vm-font);letter-spacing:0;text-shadow:0 1px 14px rgba(0,0,0,.55)}',\r\n      '.hpu-vm-cta a{display:inline-block;padding:12px 24px;border:2px solid #fff;border-radius:5px;background:#fff;color:#330072;font:500 15px\/18px var(--hpu-vm-font);letter-spacing:.01em;text-decoration:none}',\r\n      '.hpu-vm.cta-hidden .hpu-vm-cta,.hpu-vm-slide:not(.is-active) .hpu-vm-cta{opacity:0;transform:translateY(10px);pointer-events:none}',\r\n      '.hpu-vm-sound{display:none;position:absolute;left:12px;top:12px;z-index:2;padding:8px 14px;border-radius:999px;border:0;background:rgba(0,0,0,.65);color:#fff;font:500 13px\/1 var(--hpu-vm-font)}',\r\n      '.hpu-vm.needs-sound .hpu-vm-stage.is-live .hpu-vm-sound{display:block}',\r\n      '.hpu-vm-more{position:absolute;left:50%;bottom:max(4px, calc(env(safe-area-inset-bottom,0px) - 6px));transform:translateX(-50%);z-index:4;display:flex;flex-direction:column;align-items:center;gap:4px;padding:6px 20px;border:0;background:none;color:rgba(255,255,255,.92);font:500 11px\/1 var(--hpu-vm-font);letter-spacing:.12em;text-transform:uppercase;cursor:pointer;transition:opacity .35s ease;-webkit-tap-highlight-color:transparent;pointer-events:none}',\r\n      '.hpu-vm-more svg{width:26px;height:26px;filter:drop-shadow(0 1px 3px rgba(0,0,0,.55));animation:hpuVmNudge 2.4s ease-in-out infinite}',\r\n      '@keyframes hpuVmNudge{0%,100%{transform:translateY(0);opacity:.7}50%{transform:translateY(-6px);opacity:1}}',\r\n      '.hpu-vm.is-swiping .hpu-vm-more,.hpu-vm.at-end .hpu-vm-more{opacity:0;pointer-events:none}',\r\n      '@media (prefers-reduced-motion: reduce){.hpu-vm-more svg{animation:none}.hpu-vm-cta{transition:opacity .2s ease}}',\r\n      '@media (orientation: landscape){',\r\n      ' .hpu-vm-slide{padding:0;gap:0}',\r\n      ' .hpu-vm-frame{width:min(100vw,calc(100dvh * 16 \/ 9));height:auto}',\r\n      ' .hpu-vm-cta{position:absolute;right:calc(env(safe-area-inset-right,0px) + 14px);bottom:14px;padding:0;flex-direction:row;gap:0}',\r\n      ' .hpu-vm-cta p{display:none}',\r\n      ' .hpu-vm-cta a{padding:9px 18px;font-size:13px;line-height:16px;box-shadow:0 4px 18px rgba(0,0,0,.4)}',\r\n      ' .hpu-vm-close{background:rgba(0,0,0,.5)}',\r\n      ' .hpu-vm-more{display:none}',\r\n      ' .hpu-vm-glow{inset:-2% -4%}',\r\n      '}',\r\n      '.hpu-vm-close:hover,.hpu-vm-nav button:hover:not(:disabled){background:rgba(255,255,255,.26)}',\r\n      '.hpu-vm-close:focus-visible,.hpu-vm-nav button:focus-visible{outline:2px solid #fff;outline-offset:2px}',\r\n      '.hpu-vm-nav{display:none;position:absolute;right:calc(env(safe-area-inset-right,0px) + 10px);top:50%;transform:translateY(-50%);z-index:6;flex-direction:column;gap:12px}',\r\n      '.hpu-vm-nav button{position:relative;width:44px;height:44px;border-radius:50%;border:0;padding:0;background:rgba(0,0,0,.5);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s ease,opacity .15s ease}',\r\n      '.hpu-vm-nav svg{width:22px;height:22px}',\r\n      '.hpu-vm-nav button:disabled{opacity:.35;cursor:default}',\r\n      '@media (min-width:1024px) and (hover:hover) and (pointer:fine){',\r\n      ' .hpu-vm-nav{display:flex}',\r\n      ' .hpu-vm-more{display:none}',\r\n      ' .hpu-vm-close{background:rgba(0,0,0,.5)}',\r\n      ' .hpu-vm-frame{width:min(calc(100vw - 150px),calc((100dvh - 48px) * 16 \/ 9))}',\r\n      '}',\r\n      '.hpu-vm-slide.is-rfi{padding:calc(env(safe-area-inset-top,0px) + 64px) 16px calc(env(safe-area-inset-bottom,0px) + 40px)}',\r\n      '.hpu-vm-rfi{position:relative;z-index:3;box-sizing:border-box;width:100%;max-width:460px;max-height:100%;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;background:#fff;color:#1c1c1c;border-radius:10px;padding:26px 22px 18px;font:400 15px\/1.45 var(--hpu-vm-font);text-align:left}',\r\n      '.hpu-vm-rfi h2{margin:0 0 8px;color:#330072;font:600 22px\/1.25 var(--hpu-vm-font);text-wrap:balance}',\r\n      '.hpu-vm-rfi > p{margin:0 0 16px;color:#444;font-size:15px;text-wrap:balance}',\r\n      '.hpu-vm-rfi a{color:#330072}',\r\n      '.hpu-vm-rfi .form_page{display:flex;flex-direction:column}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:first\"]{order:-3}.hpu-vm-rfi .form_question[data-export=\"sys:last\"]{order:-2}.hpu-vm-rfi .form_question[data-export=\"sys:email\"]{order:-1}',\r\n      '.hpu-vm-rfi .form_question[data-hpu-step=\"0\"],.hpu-vm-rfi .form_question:not([data-hpu-step]){display:none !important}',\r\n      '.hpu-vm-rfi[data-step=\"1\"] .form_question:not([data-hpu-step=\"1\"]),.hpu-vm-rfi[data-step=\"2\"] .form_question:not([data-hpu-step=\"2\"]),.hpu-vm-rfi[data-step=\"3\"] .form_question:not([data-hpu-step=\"3\"]),.hpu-vm-rfi[data-step=\"4\"] .form_question:not([data-hpu-step=\"4\"]),.hpu-vm-rfi[data-step=\"5\"] .form_question:not([data-hpu-step=\"5\"]),.hpu-vm-rfi[data-step=\"6\"] .form_question:not([data-hpu-step=\"6\"]),.hpu-vm-rfi[data-step=\"7\"] .form_question:not([data-hpu-step=\"7\"]){display:none !important}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:birthdate\"]{order:1}.hpu-vm-rfi .form_question[data-export=\"sys:sex\"]{order:2}.hpu-vm-rfi .form_question[data-export=\"sys:preferred\"]{order:3}.hpu-vm-rfi .form_question[data-export=\"sys:middle\"]{order:4}.hpu-vm-rfi .form_question[data-export=\"sys:suffix\"]{order:5}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:birthdate\"] .form_responses{display:flex;gap:8px}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:address\"] fieldset > .form_label,.hpu-vm-rfi .form_question[data-export=\"sys:address\"] legend{display:none}',\r\n      '.hpu-vm-rfi .form_action{display:flex !important;align-items:center;gap:12px}.hpu-vm-rfi .form_action .hpu-vm-rfi-back{order:-1}',\r\n      '.hpu-vm-rfi .form_question[id*=\"fea9b7ff\"] .form_label{font-size:12px;line-height:1.45;color:#666}.hpu-vm-rfi .form_question[id*=\"fea9b7ff\"] strong{font-weight:400}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:field:ug_preprofessional\"] .form_responses{display:grid;grid-template-columns:1fr 1fr;gap:4px 12px}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:birthdate\"] select{width:auto !important;flex:1 1 0;min-width:0}',\r\n      '.hpu-vm-rfi:not(.is-last) .form_action{display:none !important}',\r\n      '.hpu-vm-rfi > .hpu-vm-rfi-count{margin:0 0 8px;color:#666;font:500 12px\/1 var(--hpu-vm-font);letter-spacing:.08em;text-transform:uppercase}',\r\n      '.hpu-vm-rfi-bar{height:4px;border-radius:2px;background:#e6e1ee;margin:0 0 16px;overflow:hidden}',\r\n      '.hpu-vm-rfi-bar i{display:block;height:100%;width:0;background:#330072;transition:width .3s ease}',\r\n      '.hpu-vm-rfi-nav{display:flex;align-items:center;gap:12px;margin-top:4px}',\r\n      '.hpu-vm-rfi-back{margin-top:4px;padding:12px 22px;border:2px solid #330072;border-radius:5px;background:#fff;color:#330072;font:600 15px\/18px var(--hpu-vm-font);cursor:pointer;transition:background-color .2s}',\r\n      '.hpu-vm-rfi-back:hover{background:#f3eff8}',\r\n      '.hpu-vm-rfi[data-step=\"1\"] .hpu-vm-rfi-back,.hpu-vm-rfi.is-last .hpu-vm-rfi-go{display:none}',\r\n      '.hpu-vm-rfi .form_question{margin:0 0 12px !important;float:none !important;width:auto !important}',\r\n      '.hpu-vm-rfi input[type=text],.hpu-vm-rfi input[type=email],.hpu-vm-rfi input[type=tel],.hpu-vm-rfi select,.hpu-vm-rfi textarea{width:100% !important;max-width:100% !important;box-sizing:border-box;height:50px;margin:0 !important;padding:5px 20px;border:1px solid #9b9b9b !important;border-radius:5px !important;background-color:#fff;color:#000;font-family:var(--hpu-vm-font) !important;font-size:16px !important;font-weight:400;line-height:1.25;box-shadow:none;outline:none}',\r\n      '.hpu-vm-rfi textarea{height:auto;min-height:84px;padding:12px 20px;resize:vertical}',\r\n      '.hpu-vm-rfi select{-webkit-appearance:none;appearance:none;padding-right:44px;color:#45454a;background-color:#fff;background-image:linear-gradient(45deg,transparent 50%,#45454a 50%),linear-gradient(135deg,#45454a 50%,transparent 50%);background-position:calc(100% - 25px) 50%,calc(100% - 20px) 50%;background-size:5px 5px,5px 5px;background-repeat:no-repeat}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:birthdate\"] select{padding:5px 30px 5px 14px;background-position:calc(100% - 17px) 50%,calc(100% - 12px) 50%}',\r\n      '.hpu-vm-rfi input:focus,.hpu-vm-rfi select:focus,.hpu-vm-rfi textarea:focus{border-color:#330072 !important;box-shadow:0 0 0 3px rgba(51,0,114,.15)}',\r\n      '.hpu-vm-rfi input::placeholder{color:#9b9b9b}',\r\n      '.hpu-vm-rfi .form_label{display:block;margin:0 0 6px;color:#45454a;font:400 16px\/1.3 var(--hpu-vm-font)}',\r\n      '.hpu-vm-rfi .form_question{margin:0 0 16px !important}',\r\n      '.hpu-vm-rfi .form_question[data-export=\"sys:address\"] .form_responses{margin-bottom:12px}',\r\n      '.hpu-vm-rfi .form_response{display:flex;align-items:center;gap:8px;margin:2px 0}.hpu-vm-rfi .form_response label{color:#45454a;font:400 14px\/1.3 var(--hpu-vm-font)}',\r\n      '.hpu-vm-rfi .hpu-req::after{content:\"*\";margin-left:3px;color:#c8102e;font-weight:600}.hpu-vm-rfi-legend b{color:#c8102e;font-weight:600}',\r\n      '.hpu-vm-rfi > .hpu-vm-rfi-legend{margin:-6px 0 14px;color:#666;font-size:13px}',\r\n      '.hpu-vm-rfi-go,.hpu-vm-rfi .form_button_submit{display:inline-block;margin-top:4px;padding:12px 28px;border:2px solid #330072;border-radius:5px;background:#330072;color:#fff;font:600 15px\/18px var(--hpu-vm-font);cursor:pointer;transition:background-color .2s,border-color .2s}',\r\n      '.hpu-vm-rfi-go:hover,.hpu-vm-rfi .form_button_submit:hover{background:#22004d;border-color:#22004d}',\r\n      '.hpu-vm-rfi-skip{display:block;margin:14px auto 0;padding:8px 12px;border:0;background:none;color:#555;font:500 13px\/1 var(--hpu-vm-font);text-decoration:underline;cursor:pointer}',\r\n      '.hpu-vm.on-rfi .hpu-vm-sound{display:none !important}'\r\n    ].join('');\r\n    document.head.appendChild(css);\r\n\r\n    function ytId(u) {\r\n      var m = (u || '').match(\/(?:embed\\\/|youtu\\.be\\\/|[?&]v=)([A-Za-z0-9_-]{11})\/);\r\n      return m ? m[1] : null;\r\n    }\r\n    function mainId() {\r\n      var el = box.querySelector('[href*=\"youtube\"], iframe[src*=\"youtube\"], iframe[data-src*=\"youtube\"]');\r\n      return el ? ytId(el.getAttribute('href') || el.getAttribute('src') || el.getAttribute('data-src')) : null;\r\n    }\r\n    var cta = (typeof ctaLibrary !== 'undefined' && (ctaLibrary[ctaParam] || ctaLibrary.visit)) || null;\r\n    var hasCta = !!(cta && cta.buttons && cta.buttons[0]);\r\n\r\n    var ytReady = null;\r\n    function loadYT() {\r\n      if (ytReady) return ytReady;\r\n      ytReady = new Promise(function (res) {\r\n        if (window.YT && window.YT.Player) return res();\r\n        if (window.YT && window.YT.ready) return window.YT.ready(res);\r\n        var prev = window.onYouTubeIframeAPIReady;\r\n        window.onYouTubeIframeAPIReady = function () { if (prev) try { prev(); } catch (e) {} res(); };\r\n        var s = document.createElement('script'); s.src = 'https:\/\/www.youtube.com\/iframe_api'; document.head.appendChild(s);\r\n      });\r\n      return ytReady;\r\n    }\r\n    if (PHONE.matches) loadYT();\r\n\r\n    var modal = null, feed = null;\r\n    var items = [], slides = [], idx = 0, swiping = false;\r\n    var SKIP = 0.8; \/\/ our videos open with a fade from black: start every feed video just past it\r\n    \/\/ Where a video starts: the page's own video honors ?t, and Destination Success videos skip their logo intro.\r\n    function startFor(it, isMain) { if (isMain && hpuMainStart) return hpuMainStart; return it && hpuIsDS(it.title) ? HPU_DS_SKIP : SKIP; }\r\n    var standby = false; \/\/ viewer built ahead of time, hidden, with the page's video already buffering\r\n    var wantAudio = true; \/\/ the viewer's sound choice, remembered across videos until the viewer is closed\r\n    var decks = [], cur = null; \/\/ two players: one on screen, one quietly preloading the next video\r\n    var hideTimer = null, settleTimer = null, ctaTimer = null, soundTimer = null, revealTimer = null, preloadTimer = null;\r\n\r\n    \/\/ iPhone drops the click when a tap lands while the feed is still gliding after a swipe (the tap just stops the\r\n    \/\/ scroll). Buttons in the viewer act on the touch itself, so they work every time.\r\n    function fastTap(el, fn) {\r\n      var start = null;\r\n      el.addEventListener('touchstart', function (e) { var t = e.touches[0]; start = [t.clientX, t.clientY]; }, { passive: true });\r\n      el.addEventListener('touchend', function (e) {\r\n        var t = e.changedTouches[0], ok = start && Math.abs(t.clientX - start[0]) < 24 && Math.abs(t.clientY - start[1]) < 24;\r\n        start = null;\r\n        if (ok) { e.preventDefault(); fn(e); }\r\n      });\r\n      el.addEventListener('click', function (e) { fn(e); });\r\n    }\r\n    function current() { return (items[idx] && items[idx].id) || mainId(); }\r\n    function onCard() { return !!(items[idx] && items[idx].rfi); }\r\n    function track(name, extra) {\r\n      try { (window.dataLayer = window.dataLayer || []).push(Object.assign({ event: name, video_id: current(), cta_type: ctaParam || 'visit' }, extra || {})); } catch (e) {}\r\n    }\r\n    function capSize() { return LAND.matches ? 1 : 2; }\r\n    function applyCaptions(d) {\r\n      d = d || cur;\r\n      if (!d || !d.player || !d.player.setOption) return;\r\n      try { d.player.loadModule('captions'); d.player.setOption('captions', 'track', { languageCode: 'en' }); d.player.setOption('captions', 'fontSize', capSize()); } catch (e) {}\r\n    }\r\n\r\n    \/\/ Playlist: this page's video first, then an endless random run through the whole \/watch library.\r\n    function feedItems() {\r\n      var first = mainId(); if (!first) return [];\r\n      return [{ id: first, title: hpuPageTitle() }];\r\n    }\r\n    \/\/ Every video post id, shuffled once per page. Each is used once; after the whole library has been shown it reshuffles.\r\n    var pool = null, poolAll = null, usedPosts = {}, seenVids = {}, fetching = false, emptyRuns = 0;\r\n    function apiBase() {\r\n      var el = document.querySelector('link[rel=\"https:\/\/api.w.org\/\"]');\r\n      return ((window.wpApiSettings && window.wpApiSettings.root) || (el && el.getAttribute('href')) || '\/wp-json\/').replace(\/\\\/$\/, '');\r\n    }\r\n    function thisPostId() { var m = document.body.className.match(\/\\bpostid-(\\d+)\\b\/); return m ? +m[1] : 0; }\r\n    function shuffled(a) { a = a.slice(); for (var i = a.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)), t = a[i]; a[i] = a[j]; a[j] = t; } return a; }\r\n    function getJSON(u) { return fetch(u).then(function (r) { if (!r.ok) throw new Error(r.status); return r.json().then(function (j) { return { j: j, pages: +(r.headers.get('X-WP-TotalPages') || 1) }; }); }); }\r\n    function loadPool() {\r\n      if (pool) return Promise.resolve();\r\n      var base = apiBase(), cached = null;\r\n      try { cached = sessionStorage.getItem('hpu_rv_cat'); } catch (e) {}\r\n      var cat = cached ? Promise.resolve(+cached) : getJSON(base + '\/wp\/v2\/categories?slug=hpu-videos&per_page=1&_fields=id').then(function (x) {\r\n        try { sessionStorage.setItem('hpu_rv_cat', x.j[0].id); } catch (e) {}\r\n        return x.j[0].id;\r\n      });\r\n      return cat.then(function (c) {\r\n        var url = function (p) { return base + '\/wp\/v2\/posts?categories=' + c + '&per_page=100&page=' + p + '&_fields=id'; };\r\n        return getJSON(url(1)).then(function (first) {\r\n          var rest = []; for (var p = 2; p <= first.pages; p++) rest.push(getJSON(url(p)));\r\n          return Promise.all(rest).then(function (more) { return more.reduce(function (all, x) { return all.concat(x.j); }, first.j); });\r\n        });\r\n      }).then(function (list) {\r\n        var me = thisPostId();\r\n        poolAll = list.map(function (p) { return p.id; }).filter(function (id) { return id !== me; });\r\n        pool = shuffled(poolAll);\r\n      });\r\n    }\r\n    function takeIds(k) {\r\n      var out = [];\r\n      while (out.length < k && poolAll && poolAll.length) {\r\n        if (!pool.length) { usedPosts = {}; pool = shuffled(poolAll); seenVids = {}; if (items[0]) seenVids[items[0].id] = 1; } \/\/ whole library shown: start a fresh shuffle\r\n        var id = pool.shift();\r\n        if (!usedPosts[id]) { usedPosts[id] = 1; out.push(id); }\r\n      }\r\n      return out;\r\n    }\r\n    \/\/ Hidden and waiting: keep two queued (light on page load). Open: keep four queued ahead of the one on screen, so the feed never ends.\r\n    function ahead() { return standby ? 2 : 4; }\r\n    function fillFeed() {\r\n      if (!modal || fetching || items.length - idx > ahead()) return;\r\n      fetching = true;\r\n      loadPool().then(function () {\r\n        var ids = takeIds(standby ? 2 : 4); if (!ids.length) return [];\r\n        return getJSON(apiBase() + '\/wp\/v2\/posts?include=' + ids.join(',') + '&per_page=' + ids.length + '&_fields=id,link,title,content').then(function (x) {\r\n          var byId = {}; x.j.forEach(function (p) { byId[p.id] = p; });\r\n          var dec = document.createElement('textarea');\r\n          return ids.map(function (id) {\r\n            var p = byId[id]; if (!p) return null;\r\n            var m = ((p.content && p.content.rendered) || '').match(\/youtube(?:-nocookie)?\\.com\\\/embed\\\/([A-Za-z0-9_-]{11})\/) || JSON.stringify(p.meta || {}).match(\/embed\\\\*\\\/([A-Za-z0-9_-]{11})\/);\r\n            dec.innerHTML = (p.title && p.title.rendered) || '';\r\n            return m ? { id: m[1], title: dec.value, link: p.link } : null;\r\n          }).filter(Boolean);\r\n        });\r\n      }).then(function (list) {\r\n        fetching = false;\r\n        if (!modal) return;\r\n        var added = 0;\r\n        list.forEach(function (v) {\r\n          if (seenVids[v.id]) return;\r\n          seenVids[v.id] = 1; added++;\r\n          items.push(v); var sl = makeSlide(v); slides.push(sl); feed.insertBefore(sl, decks[0] ? decks[0].el : null);\r\n        });\r\n        emptyRuns = added ? 0 : emptyRuns + 1;\r\n        modal.classList.toggle('at-end', idx >= slides.length - 1); navState();\r\n        if (!standby) preloadNext();\r\n        if (items.length - idx <= ahead() && emptyRuns < 3) fillFeed();\r\n      }).catch(function () { fetching = false; });\r\n    }\r\n    \/\/ \u2500\u2500 Inline RFI card \u2500\u2500\r\n    \/\/ After the visitor's second video, the next item in the feed is a request-info card built on the same Slate form\r\n    \/\/ as \/discoverCLT (same fields, endpoint and tagging). Step 1 shows first name, last name and email; Continue opens\r\n    \/\/ the rest of the Slate form inside the card. Slate's own submit, and GTM's existing slate_form_submission tag,\r\n    \/\/ handle the lead exactly as they do on \/discoverCLT.\r\n    var RFI_FORM = 'a9ec0982-d54a-4a59-97d9-7b14c638a048';\r\n    var rfiHost = null, rfiCard = null, rfiIdx = -1, rfiStarted = false, rfiSent = false, leftVids = 0;\r\n    function rfiState() { var s = null; try { s = JSON.parse(sessionStorage.getItem('hpu_rfi') || 'null'); } catch (e) {} return s || { views: 0, since: 0, started: 0, sent: 0 }; }\r\n    function rfiSave(s) { try { sessionStorage.setItem('hpu_rfi', JSON.stringify(s)); } catch (e) {} }\r\n    \/\/ Once per session. Skipped: once more after four more videos. Never for 30 days after a submit, never once the\r\n    \/\/ visitor has started the form, and never for an ?cta=apply visitor who already clicked Apply this session.\r\n    function rfiBlocked() {\r\n      try { var t = +localStorage.getItem('hpu_rfi_sent') || 0; if (t && Date.now() - t < 30 * 864e5) return true; } catch (e) {}\r\n      try { if (ctaParam === 'apply' && sessionStorage.getItem('hpu_apply_clicked')) return true; } catch (e) {}\r\n      var s = rfiState();\r\n      return !!(s.sent || s.started || s.views >= 2 || (s.views === 1 && s.since < 4));\r\n    }\r\n    function rfiTrack(name) { track(name, { feed_position: rfiIdx, video_id: mainId() }); }\r\n    function rfiForm() { if (!rfiHost) { rfiHost = document.createElement('div'); rfiHost.id = 'form_' + RFI_FORM; } return rfiHost; }\r\n    function rfiLoad() { \/\/ Slate's embed script renders into its div, so this runs once the card is in the page\r\n      if (rfiForm().__loading) return; rfiHost.__loading = 1;\r\n      var s = document.createElement('script'); s.async = true;\r\n      s.src = 'https:\/\/discover.highpoint.edu\/register\/?id=' + RFI_FORM + '&output=embed&div=form_' + RFI_FORM + (location.search.length > 1 ? '&' + location.search.substring(1) : '');\r\n      document.head.appendChild(s);\r\n      var t0 = Date.now(), iv = setInterval(function () {\r\n        if (rfiTagSteps(rfiHost)) { clearInterval(iv); var card = rfiHost.closest('.hpu-vm-rfi'); if (card) rfiMarkRequired(card, +card.getAttribute('data-step')); }\r\n        else if (Date.now() - t0 > 30000) clearInterval(iv);\r\n      }, 300);\r\n    }\r\n    \/\/ The full Slate form, one short step at a time. Questions go to a step by their Slate export key; anything\r\n    \/\/ unrecognized rides along with the question before it, so a field admissions adds later never gets lost.\r\n    var RFI_TOTAL = 7, RFI_STEPS = [null,\r\n      { title: 'Want the inside track on High&nbsp;Point&nbsp;University?', text: 'A few quick steps, and the admissions counselor for your area will follow up.' },\r\n      { title: 'A little about you' },\r\n      { title: 'How can we reach you?', text: 'Phone numbers are optional.' },\r\n      { title: 'Your plans' },\r\n      { title: 'Your mailing address' },\r\n      { title: 'Your high school' },\r\n      { title: 'Parent or guardian', text: 'Optional. Add a parent or guardian if you&rsquo;d like them included.' }];\r\n    function rfiStepOf(q) {\r\n      var k = q.getAttribute('data-export') || '', id = q.id || '';\r\n      if (\/^sys:(first|last|email)$\/.test(k)) return 1;\r\n      if (\/^sys:(suffix|preferred|birthdate|middle|sex)$\/.test(k)) return 2;\r\n      if (\/^sys:(mobile|phone)$\/.test(k) || k === 'sys:field:text_permission') return 3;\r\n      if (\/^sys:field:(prospect_type|ugstu_type|ugstart_term|ug_major|ug_preprofessional)$\/.test(k) || k === 'hs_grad' || id.indexOf('fea9b7ff') >= 0) return 4;\r\n      if (k === 'sys:address') return 5;\r\n      if (\/^sys:school:\/.test(k)) return 6;\r\n      if (\/^sys:relationship:\/.test(k) || id.indexOf('9007f0d0') >= 0) return 7;\r\n      if (\/241f7635|ce840c3c|279e25ea\/.test(id)) return 0; \/\/ Slate's section headings: the step titles replace them\r\n      return -1;\r\n    }\r\n    function rfiTagSteps(root) {\r\n      var qs = root ? root.querySelectorAll('.form_question') : [], last = 1;\r\n      for (var i = 0; i < qs.length; i++) { var n = rfiStepOf(qs[i]); if (n > 0) last = n; qs[i].setAttribute('data-hpu-step', n >= 0 ? n : last); }\r\n      return qs.length > 0;\r\n    }\r\n    function rfiHasFields(c, n) { \/\/ false when Slate's own logic has hidden every question in a step\r\n      var qs = c.querySelectorAll('.form_question[data-hpu-step=\"' + n + '\"]');\r\n      for (var i = 0; i < qs.length; i++) if (qs[i].style.display !== 'none' && !qs[i].classList.contains('hidden') && qs[i].querySelector('input:not([type=hidden]),select,textarea')) return true;\r\n      return false;\r\n    }\r\n    function rfiValid(c) { \/\/ required fields the visitor can see in the current step\r\n      var qs = c.querySelectorAll('.form_question[data-hpu-step=\"' + c.getAttribute('data-step') + '\"]');\r\n      for (var i = 0; i < qs.length; i++) {\r\n        if (!qs[i].offsetParent) continue;\r\n        var els = qs[i].querySelectorAll('input:not([type=hidden]),select,textarea');\r\n        for (var j = 0; j < els.length; j++) if (els[j].offsetParent && !els[j].checkValidity()) { try { els[j].reportValidity(); } catch (e) {} return false; }\r\n      }\r\n      return true;\r\n    }\r\n    \/\/ Star every required field in the step (the label it belongs to), and show the \"* Required\" note when there is one.\r\n    function rfiMarkRequired(c, n) {\r\n      [].forEach.call(c.querySelectorAll('.hpu-req'), function (l) { l.classList.remove('hpu-req'); });\r\n      var any = false, qs = c.querySelectorAll('.form_question[data-hpu-step=\"' + n + '\"]');\r\n      for (var i = 0; i < qs.length; i++) {\r\n        var req = qs[i].querySelectorAll('[required]');\r\n        for (var j = 0; j < req.length; j++) {\r\n          var el = req[j], lbl = (el.type !== 'radio' && el.type !== 'checkbox' && el.id) ? c.querySelector('label[for=\"' + el.id + '\"]') : null;\r\n          lbl = lbl || qs[i].querySelector('.form_label');\r\n          if (lbl) { lbl.classList.add('hpu-req'); if (qs[i].offsetParent) any = true; } \/\/ the note only counts questions on screen\r\n        }\r\n      }\r\n      var lg = c.querySelector('.hpu-vm-rfi-legend'); if (lg) lg.hidden = !any;\r\n    }\r\n    function rfiShow(c, n, dir) {\r\n      n = Math.max(1, Math.min(RFI_TOTAL, n));\r\n      while (dir && n > 1 && n < RFI_TOTAL && !rfiHasFields(c, n)) n += dir; \/\/ skip a step that has nothing to ask\r\n      var st = RFI_STEPS[n] || {}, p = c.querySelector('.hpu-vm-rfi-intro');\r\n      c.setAttribute('data-step', n); c.classList.toggle('is-last', n === RFI_TOTAL);\r\n      \/\/ On the last step, Back sits beside Slate's own Submit button (which has to stay inside Slate's form).\r\n      var bk = c.querySelector('.hpu-vm-rfi-back'), fa = c.querySelector('.form_action'), nv = c.querySelector('.hpu-vm-rfi-nav');\r\n      if (bk && fa && n === RFI_TOTAL) fa.insertBefore(bk, fa.firstChild); else if (bk && nv && bk.parentNode !== nv) nv.insertBefore(bk, nv.firstChild);\r\n      c.querySelector('.hpu-vm-rfi-count').textContent = 'Step ' + n + ' of ' + RFI_TOTAL;\r\n      c.querySelector('.hpu-vm-rfi-bar i').style.width = Math.round(n \/ RFI_TOTAL * 100) + '%';\r\n      c.querySelector('h2').innerHTML = st.title || '';\r\n      p.innerHTML = st.text || ''; p.hidden = !st.text;\r\n      rfiMarkRequired(c, n);\r\n      c.scrollTop = 0;\r\n      if (dir > 0) track('rfi_inline_step', { feed_position: rfiIdx, video_id: mainId(), step: n });\r\n    }\r\n    function makeRfiSlide() {\r\n      var s = document.createElement('section'); s.className = 'hpu-vm-slide is-rfi'; s.setAttribute('aria-label', 'Request information');\r\n      var c = document.createElement('div'); c.className = 'hpu-vm-rfi'; c.setAttribute('data-step', '1');\r\n      c.innerHTML = '<p class=\"hpu-vm-rfi-count\"><\/p><div class=\"hpu-vm-rfi-bar\"><i><\/i><\/div><h2><\/h2><p class=\"hpu-vm-rfi-intro\"><\/p><p class=\"hpu-vm-rfi-legend\" hidden><b aria-hidden=\"true\">*<\/b> Required<\/p>';\r\n      var old = rfiHost && rfiHost.closest ? rfiHost.closest('.hpu-vm-rfi') : null;\r\n      c.appendChild(rfiForm());\r\n      if (old) old.innerHTML = '<h2>Want the inside track on High&nbsp;Point&nbsp;University?<\/h2><p><a href=\"https:\/\/discover.highpoint.edu\/register\/inquiry\">Request information<\/a><\/p>';\r\n      var nav = document.createElement('div'); nav.className = 'hpu-vm-rfi-nav';\r\n      var back = document.createElement('button'); back.type = 'button'; back.className = 'hpu-vm-rfi-back'; back.textContent = 'Back';\r\n      var btn = document.createElement('button'); btn.type = 'button'; btn.className = 'hpu-vm-rfi-go'; btn.textContent = 'Continue';\r\n      var skip = document.createElement('button'); skip.type = 'button'; skip.className = 'hpu-vm-rfi-skip'; skip.textContent = 'Keep watching';\r\n      nav.appendChild(back); nav.appendChild(btn);\r\n      c.appendChild(nav); c.appendChild(skip); s.appendChild(c);\r\n      rfiShow(c, 1, 0);\r\n      fastTap(btn, function () {\r\n        if (!rfiTagSteps(rfiHost)) return; \/\/ Slate is still loading\r\n        if (rfiValid(c)) rfiShow(c, +c.getAttribute('data-step') + 1, 1);\r\n      });\r\n      fastTap(back, function () { rfiShow(c, +c.getAttribute('data-step') - 1, -1); });\r\n      \/\/ Enter moves to the next step instead of submitting the form early.\r\n      c.addEventListener('keydown', function (e) {\r\n        if (e.key !== 'Enter' || !e.target.matches || !e.target.matches('input:not([type=checkbox]):not([type=radio]):not([type=button]):not([type=submit])')) return;\r\n        e.preventDefault(); if (!c.classList.contains('is-last')) btn.click();\r\n      });\r\n      \/\/ Slate shows and hides questions as answers change (text reminders after a mobile number, say): re-check the note.\r\n      c.addEventListener('change', function () { setTimeout(function () { rfiMarkRequired(c, +c.getAttribute('data-step')); }, 60); });\r\n      fastTap(skip, function () { go(idx + 1, 'rfi_skip'); });\r\n      c.addEventListener('focusin', function (e) {\r\n        if (rfiStarted || !e.target.matches || !e.target.matches('input,select,textarea')) return;\r\n        rfiStarted = true; var st = rfiState(); st.started = 1; rfiSave(st); rfiTrack('rfi_inline_start');\r\n      });\r\n      \/\/ Slate validates and submits on its own button; a successful submit replaces the form with Slate's confirmation.\r\n      c.addEventListener('click', function (e) {\r\n        if (rfiSent || !e.target.closest || !e.target.closest('.form_button_submit')) return;\r\n        var t0 = Date.now();\r\n        (function check() {\r\n          if (rfiSent) return;\r\n          if (!c.querySelector('.form_question[data-export=\"sys:email\"]')) {\r\n            rfiSent = true; var st = rfiState(); st.sent = 1; rfiSave(st);\r\n            try { localStorage.setItem('hpu_rfi_sent', String(Date.now())); } catch (er) {}\r\n            rfiTrack('rfi_inline_submit'); return;\r\n          }\r\n          if (Date.now() - t0 < 20000) setTimeout(check, 400);\r\n        })();\r\n      }, true);\r\n      return s;\r\n    }\r\n    function rfiInsertAfter(i) {\r\n      if (rfiCard || !feed || rfiBlocked()) return;\r\n      var p = i + 1, sl = makeRfiSlide();\r\n      rfiCard = sl; rfiIdx = p;\r\n      items.splice(p, 0, { id: null, rfi: true, title: 'Request information' });\r\n      slides.splice(p, 0, sl);\r\n      feed.insertBefore(sl, slides[p + 1] || (decks[0] ? decks[0].el : null));\r\n      rfiLoad();\r\n      decks.forEach(function (d) { if (d.slot >= p) placeDeck(d, d.slot + 1); }); \/\/ players below the card move down one slide\r\n      modal.classList.toggle('at-end', idx >= slides.length - 1); navState();\r\n    }\r\n    function cardLanded(n, how) {\r\n      modal.classList.add('on-rfi', 'cta-hidden');\r\n      clearTimeout(soundTimer); clearTimeout(hideTimer);\r\n      if (cur) { cur.warm = false; cur.leaving = false; try { cur.player.pauseVideo(); } catch (e) {} cur.el.classList.remove('is-live'); cur.el.classList.add('is-preview'); }\r\n      track('video_modal_swipe', { feed_position: n, method: how });\r\n      rfiIdx = n;\r\n      if (!slides[n].__viewed) { slides[n].__viewed = 1; var st = rfiState(); st.views++; st.since = 0; rfiSave(st); rfiTrack('rfi_inline_view'); }\r\n      preloadNext();\r\n    }\r\n    function rfiLeft(from, n) {\r\n      if (from === n || !items[from] || !items[from].rfi) return;\r\n      modal.classList.remove('on-rfi');\r\n      if (!rfiStarted && !rfiSent && !slides[from].__skipped) { slides[from].__skipped = 1; rfiIdx = from; rfiTrack('rfi_inline_skip'); rfiCard = null; }\r\n    }\r\n    function rfiAfterVideo(from, n) {\r\n      if (from === n) return;\r\n      if (items[from] && !items[from].rfi) leftVids++;\r\n      if (n > from) { var st = rfiState(); if (st.views) { st.since++; rfiSave(st); } }\r\n      if (leftVids >= 1) rfiInsertAfter(n);\r\n    }\r\n    function makeCta() {\r\n      var wrap = document.createElement('div'); wrap.className = 'hpu-vm-cta';\r\n      var p = document.createElement('p'); p.textContent = cta.title;\r\n      var a = document.createElement('a'); a.textContent = cta.buttons[0].text; a.href = cta.buttons[0].link;\r\n      fastTap(a, function (e) {\r\n        track('video_modal_cta_click', { link_url: a.href, feed_position: idx });\r\n        if (ctaParam === 'apply') { try { sessionStorage.setItem('hpu_apply_clicked', '1'); } catch (er) {} }\r\n        if (e.type === 'touchend') window.location.href = a.href; \/\/ a plain click follows the link on its own\r\n      });\r\n      wrap.appendChild(p); wrap.appendChild(a);\r\n      return wrap;\r\n    }\r\n    function makeSlide(item) {\r\n      var s = document.createElement('section'); s.className = 'hpu-vm-slide';\r\n      if (item.title) s.setAttribute('aria-label', item.title);\r\n      var f = document.createElement('div'); f.className = 'hpu-vm-frame';\r\n      \/\/ No cover image: the frame stays black until the video itself is on screen.\r\n      \/\/ Ambient glow: the video's own colors, blurred out around the frame.\r\n      var g = document.createElement('div'); g.className = 'hpu-vm-glow'; g.setAttribute('aria-hidden', 'true');\r\n      g.innerHTML = '<i><\/i><i class=\"off\"><\/i>'; g.firstChild.style.backgroundImage = 'url(\"https:\/\/i.ytimg.com\/vi\/' + item.id + '\/mq1.jpg\")';\r\n      f.appendChild(g);\r\n      s.appendChild(f);\r\n      if (hasCta) s.appendChild(makeCta());\r\n      return s;\r\n    }\r\n    function addSlides() {\r\n      if (!modal) return;\r\n      feedItems().forEach(function (v) {\r\n        if (items.some(function (x) { return x.id === v.id; })) return;\r\n        items.push(v); var s = makeSlide(v); slides.push(s); feed.insertBefore(s, decks[0] ? decks[0].el : null);\r\n      });\r\n      modal.classList.toggle('at-end', idx >= slides.length - 1);\r\n      if (!standby && decks.length) preloadNext();\r\n    }\r\n    function markActive() {\r\n      slides.forEach(function (s, i) { s.classList.toggle('is-active', i === idx); });\r\n      modal.classList.toggle('at-end', idx >= slides.length - 1);\r\n      navState();\r\n    }\r\n    function navState() {\r\n      if (!modal) return;\r\n      var up = modal.querySelector('.hpu-vm-up'), dn = modal.querySelector('.hpu-vm-down');\r\n      if (up) up.disabled = idx <= 0;\r\n      if (dn) dn.disabled = idx >= slides.length - 1;\r\n    }\r\n    \/\/ Tint the phone's status bar \/ notch area to match the dark viewer while it is open.\r\n    \/\/ theme-color covers older iOS Safari; Safari 26 reads the page background near the top, so set that too.\r\n    var tint = null;\r\n    function setTint(on) {\r\n      var de = document.documentElement, b = document.body;\r\n      if (on && !tint) {\r\n        var metas = [].slice.call(document.querySelectorAll('meta[name=\"theme-color\"]'));\r\n        tint = { metas: metas.map(function (m) { return [m, m.getAttribute('content')]; }), html: de.style.backgroundColor, body: b.style.backgroundColor, created: null };\r\n        if (!metas.length) { var m = document.createElement('meta'); m.name = 'theme-color'; document.head.appendChild(m); tint.created = m; metas = [m]; }\r\n        metas.forEach(function (m) { m.setAttribute('content', '#0d0a14'); });\r\n        de.style.backgroundColor = '#0d0a14'; b.style.backgroundColor = '#0d0a14';\r\n      } else if (!on && tint) {\r\n        tint.metas.forEach(function (p) { if (p[1] === null) p[0].removeAttribute('content'); else p[0].setAttribute('content', p[1]); });\r\n        if (tint.created) tint.created.remove();\r\n        de.style.backgroundColor = tint.html; b.style.backgroundColor = tint.body; tint = null;\r\n      }\r\n    }\r\n    \/\/ Three players: the one on screen, the next video and the previous one, so swiping either way is instant.\r\n    function vidNear(i, dir) { var j = i + dir; if (items[j] && items[j].rfi) j += dir; return j; }\r\n    function holding(i) {\r\n      if (i < 0 || i >= items.length || items[i].rfi) return null;\r\n      var oc = onCard(); \/\/ on the RFI card, the paused video next to it still counts as ready\r\n      for (var k = 0; k < decks.length; k++) { var d = decks[k]; if ((d !== cur || oc) && d.vid === items[i].id) return d; }\r\n      return null;\r\n    }\r\n    function makeDeck(n) {\r\n      var el = document.createElement('div'); el.className = 'hpu-vm-stage';\r\n      el.innerHTML = '<button type=\"button\" class=\"hpu-vm-sound\">Tap for sound<\/button><div><\/div>';\r\n      feed.appendChild(el);\r\n      var d = { el: el, host: el.lastChild, player: null, ready: false, vid: null, slot: -1, preloading: false, seekOnSwap: false, parkTimer: null, loopTimer: null, wantSound: false, forcedMute: false, warm: false, capsDone: false, startAt: 0 };\r\n      fastTap(el.querySelector('.hpu-vm-sound'), function () {\r\n        wantAudio = true; d.forcedMute = false;\r\n        unlockAudio(); \/\/ inside the tap: allows sound on both players, so no second tap is needed\r\n        try { d.player.unMute(); d.player.setVolume(100); d.player.playVideo(); } catch (e) {}\r\n        modal && modal.classList.remove('needs-sound');\r\n      });\r\n      return d;\r\n    }\r\n    function hideDeck(d) {\r\n      if (!d) return;\r\n      d.el.classList.add('no-fade'); d.el.classList.remove('is-live', 'is-preview');\r\n      void d.el.offsetWidth; \/\/ apply the hide instantly, before the player moves\r\n      d.el.classList.remove('no-fade');\r\n    }\r\n    function placeDeck(d, slot) {\r\n      var s = slides[slot]; if (!d || !s) return;\r\n      d.slot = slot;\r\n      var r = s.querySelector('.hpu-vm-frame').getBoundingClientRect(), fr = feed.getBoundingClientRect();\r\n      d.el.style.top = (r.top - fr.top + feed.scrollTop) + 'px';\r\n      d.el.style.left = (r.left - fr.left) + 'px';\r\n      d.el.style.width = r.width + 'px';\r\n      d.el.style.height = r.height + 'px';\r\n    }\r\n    \/\/ iPhone only lets a player make sound if it was unmuted during a tap. Call this inside a tap: it unmutes the\r\n    \/\/ player on screen and briefly unmutes then re-mutes the others, which unlocks them for later swipes.\r\n    function unlockAudio() {\r\n      decks.forEach(function (d) {\r\n        if (!d.player || !d.ready || !d.player.unMute) return;\r\n        try {\r\n          if (d === cur) { d.player.unMute(); d.player.setVolume(100); }\r\n          else { d.player.unMute(); d.player.mute(); }\r\n        } catch (e) {}\r\n      });\r\n    }\r\n    function createPlayer(d, vid, o) {\r\n      d.vid = vid; d.ready = false;\r\n      return (d.creating = loadYT().then(function () {\r\n        return new Promise(function (res) {\r\n          if (!modal) return;\r\n          d.player = new YT.Player(d.host, {\r\n            videoId: vid,\r\n            playerVars: { autoplay: o.autoplay ? 1 : 0, mute: o.mute ? 1 : 0, playsinline: 1, cc_load_policy: 1, cc_lang_pref: 'en', rel: 0, start: Math.floor(o.start || 0) },\r\n            events: {\r\n              onReady: function () { if ((o.start || 0) % 1) { try { d.player.seekTo(o.start, true); } catch (e) {} } d.ready = true; res(); },\r\n              onApiChange: function () { if (d === cur) applyCaptions(d); },\r\n              onStateChange: function (e) { onState(d, e.data); }\r\n            }\r\n          });\r\n        });\r\n      }));\r\n    }\r\n    \/\/ While a video plays, drift the glow through YouTube's frame stills (about 25\/50\/75% in) so it shifts with the video.\r\n    var glowTimer = null;\r\n    function stopGlow() { clearInterval(glowTimer); glowTimer = null; }\r\n    function startGlow() {\r\n      stopGlow();\r\n      if (CALM.matches) return;\r\n      var s = slides[idx], item = items[idx]; if (!s || !item) return;\r\n      var g = s.querySelector('.hpu-vm-glow'); if (!g) return;\r\n      var list = [];\r\n      ['mq1', 'mq2', 'mq3'].forEach(function (n) { list.push('https:\/\/i.ytimg.com\/vi\/' + item.id + '\/' + n + '.jpg'); });\r\n      var k = 0;\r\n      glowTimer = setInterval(function () {\r\n        k = (k + 1) % list.length;\r\n        var src = list[k], im = new Image();\r\n        im.onload = function () {\r\n          if (!g.isConnected) return;\r\n          var on = g.querySelector('i:not(.off)'), off = g.querySelector('i.off');\r\n          if (!on || !off) return;\r\n          off.style.backgroundImage = 'url(\"' + src + '\")';\r\n          off.classList.remove('off'); on.classList.add('off');\r\n        };\r\n        im.src = src;\r\n      }, 6500);\r\n    }\r\n    \/\/ Keep the cover image up until the new video is really rolling, so no loading chrome or old frame shows.\r\n    function revealWhenRolling(d) {\r\n      clearTimeout(revealTimer);\r\n      var want = items[idx] && items[idx].id, t0 = Date.now();\r\n      (function check() {\r\n        if (!modal || d !== cur) return;\r\n        var ok;\r\n        try {\r\n          var vd = d.player.getVideoData ? d.player.getVideoData() : null;\r\n          ok = (!vd || !vd.video_id || vd.video_id === want) && d.player.getPlayerState() === 1 && d.player.getCurrentTime() > d.startAt + 0.05;\r\n        } catch (e) { ok = true; }\r\n        if (ok || Date.now() - t0 > 3000) { d.el.classList.add('is-live'); d.el.classList.remove('is-preview'); showCta(300); startGlow(); return; }\r\n        revealTimer = setTimeout(check, 60);\r\n      })();\r\n    }\r\n    function onState(d, s) {\r\n      if (!modal) return;\r\n      if (d === cur && onCard()) return; \/\/ the video next to the RFI card stays paused\r\n      if (d !== cur || standby) {\r\n        \/\/ Next-up player: plays muted for a moment so a few seconds buffer, then parks paused on its opening frame\r\n        \/\/ and shows under the next slide, so the swipe brings in the real first frame. It plays when the slide lands.\r\n        if (s === 1 && d.preloading) {\r\n          d.preloading = false; stopPreview(d);\r\n          d.parkTimer = setTimeout(function () {\r\n            d.parkTimer = null;\r\n            if (d === cur) return;\r\n            try { d.player.pauseVideo(); d.player.seekTo(d.skipAt || SKIP, true); } catch (e) {}\r\n            d.seekOnSwap = false;\r\n            if (d.slot !== idx && Math.abs(d.slot - idx) <= 2) d.el.classList.add('is-preview');\r\n          }, 1500);\r\n        } else if (s === 1 && !d.parkTimer && !d.warm) {\r\n          try { d.player.pauseVideo(); } catch (e) {} \/\/ only one video ever plays\r\n        }\r\n        return;\r\n      }\r\n      clearTimeout(hideTimer);\r\n      if (s === 1) {\r\n        if (d.wantSound) {\r\n          \/\/ Start muted (always allowed), then match the viewer's sound choice. If the browser pauses the video\r\n          \/\/ for unmuting (iPhone, on a player that hasn't been tapped yet), go back to muted playback and offer the tap.\r\n          d.wantSound = false;\r\n          if (wantAudio) {\r\n            try { d.player.unMute(); d.player.setVolume(100); } catch (e) {}\r\n            setTimeout(function () {\r\n              if (d !== cur || !modal || onCard()) return;\r\n              try { if (d.player.getPlayerState() === 2) { d.forcedMute = true; d.player.mute(); d.player.playVideo(); modal.classList.add('needs-sound'); } } catch (e) {}\r\n            }, 350);\r\n          } else {\r\n            try { d.player.mute(); } catch (e) {}\r\n          }\r\n        }\r\n        if (!d.el.classList.contains('is-live')) revealWhenRolling(d);\r\n        if (!d.capsDone) { d.capsDone = true; applyCaptions(d); }\r\n        hideTimer = setTimeout(function () { modal && modal.classList.add('is-playing'); }, 4000);\r\n        clearTimeout(preloadTimer); preloadTimer = setTimeout(preloadNext, 0); \/\/ queue the next video the moment this one starts\r\n      } else {\r\n        modal.classList.remove('is-playing');\r\n        if (s === 0 && idx < slides.length - 1) go(idx + 1, 'auto');\r\n      }\r\n    }\r\n    function stopPreview(d) { clearTimeout(d.parkTimer); clearInterval(d.loopTimer); d.parkTimer = null; d.loopTimer = null; }\r\n    function loadInto(d, n) {\r\n      if (!d.player && d.creating) { d.creating.then(function () { preloadNext(); }); return; } \/\/ still being built\r\n      hideDeck(d); placeDeck(d, n); d.capsDone = false; d.skipAt = startFor(items[n]); d.startAt = d.skipAt; d.preloading = true; d.seekOnSwap = true; stopPreview(d);\r\n      if (!d.player) {\r\n        createPlayer(d, items[n].id, { autoplay: true, mute: true, start: d.skipAt }).then(function () { try { d.player.mute(); if (d.player.getPlayerState() !== 1 && d.player.getPlayerState() !== 3) d.player.playVideo(); } catch (e) {} });\r\n      } else {\r\n        d.vid = items[n].id;\r\n        try { d.player.mute(); d.player.loadVideoById({ videoId: items[n].id, startSeconds: d.skipAt }); } catch (e) {}\r\n      }\r\n    }\r\n    \/\/ Make sure the next and previous videos each sit ready in a spare player (next first).\r\n    function preloadNext() {\r\n      if (!modal || standby) return;\r\n      var nn = vidNear(idx, 1), pp = vidNear(idx, -1); \/\/ the RFI card holds no video: look past it\r\n      [nn, pp].forEach(function (n) {\r\n        if (n < 0 || n >= items.length || holding(n)) return;\r\n        var keep = [cur, holding(nn), holding(pp)];\r\n        var free = decks.filter(function (d) { return keep.indexOf(d) < 0; })[0];\r\n        if (free) loadInto(free, n);\r\n      });\r\n    }\r\n    function soundCheck(d) {\r\n      clearTimeout(soundTimer);\r\n      soundTimer = setTimeout(function () {\r\n        if (!modal || d !== cur || !d.player || !d.player.getPlayerState || onCard()) return;\r\n        try {\r\n          if (d.player.getPlayerState() === 2 || d.player.getPlayerState() === 5) { d.forcedMute = true; d.player.mute(); d.player.playVideo(); if (wantAudio) modal.classList.add('needs-sound'); }\r\n          else if (wantAudio && d.player.isMuted && d.player.isMuted()) { d.forcedMute = true; modal.classList.add('needs-sound'); }\r\n          else modal.classList.remove('needs-sound');\r\n        } catch (e) {}\r\n      }, 1500);\r\n    }\r\n    function showCta(delay) {\r\n      clearTimeout(ctaTimer);\r\n      ctaTimer = setTimeout(function () { if (modal && !swiping) modal.classList.remove('cta-hidden'); }, delay || 0);\r\n    }\r\n    \/\/ How the visitor moved, sent as method on video_modal_swipe: touch, arrow_click, keyboard, wheel,\r\n    \/\/ auto (a video ended and the next one came up) or rfi_skip (Keep watching on the RFI card).\r\n    var navMethod = null;\r\n    function go(n, how) {\r\n      if (!feed || n < 0 || n >= slides.length) return;\r\n      navMethod = how || null;\r\n      feed.scrollTo({ top: slides[n].offsetTop, behavior: CALM.matches ? 'auto' : 'smooth' });\r\n    }\r\n\r\n    function onScroll() {\r\n      if (resizing || !slides[idx]) return;\r\n      if (lastH && feed.clientHeight !== lastH) { onResize(); return; } \/\/ the phone turned: this scroll is the layout shifting, not a swipe\r\n      if (!swiping && Math.abs(feed.scrollTop - slides[idx].offsetTop) > 6) {\r\n        swiping = true; clearTimeout(ctaTimer);\r\n        modal.classList.add('is-swiping', 'cta-hidden');\r\n      }\r\n      \/\/ The moment a swipe starts, the video coming in starts playing (muted), so it is already moving as it slides in.\r\n      if (swiping) {\r\n        var dir = feed.scrollTop > slides[idx].offsetTop ? 1 : -1, w = holding(idx + dir);\r\n        if (w && w.ready && !w.warm) {\r\n          w.warm = true; w.preloading = false; stopPreview(w);\r\n          if (w.seekOnSwap) { try { w.player.seekTo(w.skipAt || SKIP, true); } catch (e) {} w.seekOnSwap = false; }\r\n          try { w.player.mute(); w.player.playVideo(); } catch (e) {}\r\n        }\r\n      }\r\n      \/\/ Start the next video while the snap is still finishing, so it is already rolling when the slide lands.\r\n      var h = feed.clientHeight || 1, p = feed.scrollTop \/ h, n = Math.round(p);\r\n      if (n !== idx && n >= 0 && n < slides.length && Math.abs(p - n) < 0.3) {\r\n        var nx = holding(n);\r\n        if (nx && nx.ready) commit(n);\r\n      }\r\n      clearTimeout(settleTimer); settleTimer = setTimeout(settle, 90);\r\n    }\r\n    function settle() {\r\n      if (!modal || resizing) return;\r\n      clearTimeout(settleTimer);\r\n      var h = feed.clientHeight || 1;\r\n      var n = Math.max(0, Math.min(slides.length - 1, Math.round(feed.scrollTop \/ h)));\r\n      if (Math.abs(feed.scrollTop - slides[n].offsetTop) > 2) return; \/\/ still snapping\r\n      swiping = false; modal.classList.remove('is-swiping');\r\n      \/\/ Anything still rolling off screen stops once the slide has landed.\r\n      decks.forEach(function (d) { if (d !== cur && (d.warm || d.leaving)) { d.warm = false; d.leaving = false; try { d.player.pauseVideo(); } catch (e) {} } });\r\n      if (n === idx) { showCta(cur && cur.el.classList.contains('is-live') ? 150 : 1200); return; }\r\n      commit(n);\r\n    }\r\n    function commit(n) {\r\n      var from = idx, how = navMethod || 'touch'; navMethod = null;\r\n      idx = n; markActive();\r\n      fillFeed();\r\n      modal.classList.remove('is-playing', 'needs-sound');\r\n      clearTimeout(preloadTimer); clearTimeout(revealTimer); stopGlow();\r\n      rfiLeft(from, n);\r\n      if (items[n].rfi) { cardLanded(n, how); return; }\r\n      if (items[from] && items[from].rfi && cur && cur.vid === items[n].id) {\r\n        \/\/ Back from the RFI card to the video it paused: carry on from where it stopped.\r\n        cur.warm = false; cur.leaving = false; cur.forcedMute = false; cur.wantSound = true; placeDeck(cur, n);\r\n        cur.el.classList.add('is-live'); cur.el.classList.remove('is-preview');\r\n        try { cur.player.playVideo(); if (cur.player.getPlayerState() === 1) onState(cur, 1); } catch (e) {}\r\n        soundCheck(cur); showCta(300);\r\n        track('video_modal_swipe', { feed_position: idx, method: how });\r\n        rfiAfterVideo(from, n);\r\n        return;\r\n      }\r\n      var prev = cur, nx = holding(n);\r\n      \/\/ Remember the sound choice from the video being left: muted by the viewer (YouTube's own button) stays muted,\r\n      \/\/ unmuted stays unmuted. A mute we forced because the browser blocked sound doesn't count as their choice.\r\n      try { if (prev && prev.player && prev.player.isMuted && !prev.forcedMute) wantAudio = !prev.player.isMuted(); } catch (e) {}\r\n      if (nx && nx.ready) {\r\n        \/\/ The next video is already buffered in the other player: swap to it.\r\n        cur = nx; nx.preloading = false; nx.warm = false; stopPreview(nx);\r\n        \/\/ The video being left stays ready (paused, in view on its slide) for an instant swipe back.\r\n        \/\/ It keeps playing (muted) while it slides away, and pauses once the new slide has landed.\r\n        stopPreview(prev); prev.leaving = true; try { prev.player.mute(); } catch (e) {}\r\n        prev.el.classList.add('no-fade'); prev.el.classList.remove('is-live'); prev.el.classList.add('is-preview'); void prev.el.offsetWidth; prev.el.classList.remove('no-fade');\r\n        prev.seekOnSwap = false; \/\/ swiping back resumes where it was paused\r\n        placeDeck(cur, n);\r\n        try {\r\n          if (cur.seekOnSwap && !(cur.player.getPlayerState() === 1 && cur.player.getCurrentTime() < (cur.skipAt || SKIP) + 3)) { cur.player.seekTo(cur.skipAt || SKIP, true); cur.startAt = cur.skipAt || SKIP; }\r\n          else cur.startAt = cur.player.getCurrentTime() || 0;\r\n          cur.seekOnSwap = false;\r\n          cur.forcedMute = false;\r\n          cur.wantSound = true;\r\n          cur.player.playVideo();\r\n          if (cur.player.getPlayerState() === 1) onState(cur, 1); \/\/ it was still pre-buffering, so no state change will fire\r\n        } catch (e) {}\r\n        var sw = cur;\r\n        setTimeout(function () { try { if (sw === cur && sw.player.getPlayerState() === 1 && !sw.el.classList.contains('is-live')) onState(sw, 1); } catch (e) {} }, 400);\r\n      } else {\r\n        hideDeck(cur); placeDeck(cur, n); cur.capsDone = false; cur.skipAt = startFor(items[n]); cur.startAt = cur.skipAt; cur.vid = items[n].id; cur.forcedMute = false; cur.wantSound = true;\r\n        try { cur.player.loadVideoById({ videoId: items[n].id, startSeconds: cur.skipAt }); } catch (e) {}\r\n      }\r\n      soundCheck(cur);\r\n      showCta(1500); \/\/ fallback if the new video is slow to start\r\n      track('video_modal_swipe', { feed_position: idx, method: how });\r\n      rfiAfterVideo(from, n);\r\n    }\r\n    \/\/ Turning the phone: every slide changes height, so the feed's scroll position briefly points at the wrong video.\r\n    \/\/ While that settles, swipe handling is paused and the feed is pinned to the current video; playback is untouched.\r\n    var resizing = false, resizeTimer = null, lastH = 0;\r\n    function onResize() {\r\n      if (!modal) return;\r\n      resizing = true; clearTimeout(resizeTimer); lastH = feed.clientHeight;\r\n      function pin() {\r\n        if (!modal || !slides[idx]) return;\r\n        feed.style.scrollSnapType = 'none';\r\n        feed.scrollTop = slides[idx].offsetTop;\r\n        decks.forEach(function (d) { if (d.slot >= 0) placeDeck(d, d.slot); });\r\n      }\r\n      pin(); requestAnimationFrame(pin);\r\n      resizeTimer = setTimeout(function () {\r\n        pin();\r\n        if (!modal) return;\r\n        feed.style.scrollSnapType = '';\r\n        resizing = false; swiping = false; modal.classList.remove('is-swiping'); lastH = feed.clientHeight;\r\n        \/\/ Only the caption size changes with orientation; don't reload the captions module mid-playback.\r\n        decks.forEach(function (d) { try { if (d.player && d.player.setOption) d.player.setOption('captions', 'fontSize', capSize()); } catch (e) {} });\r\n        showCta(0);\r\n      }, 500);\r\n    }\r\n\r\n    function close(fromPop) {\r\n      if (!modal) return;\r\n      var wasOpen = !standby;\r\n      decks.forEach(function (d) { stopPreview(d); try { if (d.player && d.player.destroy) d.player.destroy(); } catch (e) {} });\r\n      decks = []; cur = null; standby = false;\r\n      [hideTimer, settleTimer, ctaTimer, soundTimer, revealTimer, preloadTimer].forEach(clearTimeout); stopGlow();\r\n      if (modal.__ro) modal.__ro.disconnect();\r\n      if (rfiHost && rfiHost.parentNode) rfiHost.parentNode.removeChild(rfiHost); \/\/ keep the form (and anything typed) for next time\r\n      rfiCard = null; rfiIdx = -1; leftVids = 0;\r\n      modal.remove(); modal = feed = null; items = []; slides = []; idx = 0; swiping = false;\r\n      document.documentElement.style.overflow = '';\r\n      setTint(false);\r\n      LAND.removeEventListener && LAND.removeEventListener('change', onResize);\r\n      window.removeEventListener('resize', onResize);\r\n      window.removeEventListener('orientationchange', onResize);\r\n      clearTimeout(resizeTimer); resizing = false;\r\n      if (wasOpen && !fromPop && history.state && history.state.hpuVm) history.back();\r\n      if (wasOpen) setTimeout(prewarm, 1500); \/\/ get ready again in case they reopen\r\n    }\r\n    \/\/ Build the viewer hidden, with the page's own video loading muted and parked just past the fade,\r\n    \/\/ so tapping the video opens it as fast as a swipe does.\r\n    function build() {\r\n      items = feedItems(); if (!items.length) return false;\r\n      modal = document.createElement('div');\r\n      modal.className = 'hpu-vm cta-hidden is-standby'; modal.setAttribute('role', 'dialog'); modal.setAttribute('aria-modal', 'true'); modal.setAttribute('aria-label', 'Video player'); modal.setAttribute('aria-hidden', 'true');\r\n      var x = document.createElement('button'); x.type = 'button'; x.className = 'hpu-vm-close'; x.setAttribute('aria-label', 'Close video'); x.innerHTML = '&times;';\r\n      feed = document.createElement('div'); feed.className = 'hpu-vm-feed';\r\n      slides = items.map(function (v) { var s = makeSlide(v); feed.appendChild(s); return s; });\r\n      decks = [makeDeck(0), makeDeck(1), makeDeck(2)]; cur = decks[0];\r\n      var more = document.createElement('button'); more.type = 'button'; more.className = 'hpu-vm-more'; more.setAttribute('aria-label', 'Next video');\r\n      more.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 11l6-6 6 6\"\/><path d=\"M6 18l6-6 6 6\" opacity=\".5\"\/><\/svg>';\r\n      var nav = document.createElement('div'); nav.className = 'hpu-vm-nav';\r\n      nav.innerHTML = '<button type=\"button\" class=\"hpu-vm-up\" aria-label=\"Previous video\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 15l6-6 6 6\"\/><\/svg><\/button>' +\r\n        '<button type=\"button\" class=\"hpu-vm-down\" aria-label=\"Next video\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/button>';\r\n      modal.appendChild(x); modal.appendChild(feed); modal.appendChild(more); modal.appendChild(nav);\r\n      nav.firstChild.addEventListener('click', function () { go(idx - 1, 'arrow_click'); });\r\n      nav.lastChild.addEventListener('click', function () { go(idx + 1, 'arrow_click'); });\r\n      document.body.appendChild(modal);\r\n      standby = true;\r\n      idx = 0; markActive(); placeDeck(cur, 0); lastH = feed.clientHeight;\r\n      seenVids = {}; seenVids[items[0].id] = 1; emptyRuns = 0; fetching = false;\r\n      fillFeed(); \/\/ line up the first random videos while the page is being read\r\n\r\n      fastTap(x, function () { close(false); });\r\n      \/\/ The arrows don't catch touches, so a swipe that starts on them still moves the feed. A tap on them goes to the next video.\r\n      feed.addEventListener('click', function (e) {\r\n        if (modal.classList.contains('at-end')) return;\r\n        var r = more.getBoundingClientRect(); if (!r.width) return;\r\n        if (e.clientX >= r.left - 20 && e.clientX <= r.right + 20 && e.clientY >= r.top - 16 && e.clientY <= r.bottom + 16) go(idx + 1);\r\n      });\r\n      feed.addEventListener('scroll', onScroll, { passive: true });\r\n      feed.addEventListener('scrollend', settle);\r\n      \/\/ Desktop: one video per wheel or trackpad gesture, with a short lockout so one flick doesn't skip three videos.\r\n      var wheelAt = 0, wheelLock = 0, wheelMoved = false;\r\n      modal.addEventListener('wheel', function (e) {\r\n        if (!DESK.matches || Math.abs(e.deltaY) <= Math.abs(e.deltaX)) return;\r\n        var card = e.target.closest && e.target.closest('.hpu-vm-rfi');\r\n        if (card && card.scrollHeight > card.clientHeight + 1 && (e.deltaY > 0 ? card.scrollTop + card.clientHeight < card.scrollHeight - 1 : card.scrollTop > 0)) return; \/\/ the form scrolls first\r\n        e.preventDefault();\r\n        var now = Date.now();\r\n        if (now - wheelAt > 250) wheelMoved = false; \/\/ a new gesture\r\n        wheelAt = now;\r\n        if (wheelMoved || now < wheelLock || Math.abs(e.deltaY) < 4) return;\r\n        wheelMoved = true; wheelLock = now + 600;\r\n        go(idx + (e.deltaY > 0 ? 1 : -1), 'wheel');\r\n      }, { passive: false });\r\n      LAND.addEventListener && LAND.addEventListener('change', onResize);\r\n      window.addEventListener('resize', onResize);\r\n      window.addEventListener('orientationchange', onResize);\r\n      if (window.ResizeObserver) { var ro = new ResizeObserver(function () { onResize(); }); ro.observe(modal); modal.__ro = ro; }\r\n\r\n      \/\/ The other two players are created now too (idle, no video loading), so a tap on open can unlock their sound.\r\n      [decks[1], decks[2]].forEach(function (d) { createPlayer(d, items[0].id, { autoplay: false, mute: true }); d.vid = null; });\r\n      var first = cur; first.preloading = true; first.skipAt = startFor(items[0], true); first.startAt = first.skipAt; first.seekOnSwap = true; first.startOnReady = null;\r\n      createPlayer(first, items[0].id, { autoplay: true, mute: true, start: first.skipAt }).then(function () {\r\n        if (!modal || first !== cur) return;\r\n        if (!standby && first.startOnReady !== null) {\r\n          \/\/ They tapped before the player finished loading: start it now.\r\n          var at = first.startOnReady; first.startOnReady = null;\r\n          try { first.player.seekTo(at, true); first.player.playVideo(); if (first.player.getPlayerState() === 1) onState(first, 1); } catch (e) {}\r\n          applyCaptions(first); soundCheck(first);\r\n        } else {\r\n          try { first.player.mute(); var st = first.player.getPlayerState(); if (st !== 1 && st !== 3) first.player.playVideo(); } catch (e) {}\r\n        }\r\n      });\r\n      return true;\r\n    }\r\n    function prewarm() {\r\n      if (modal || !PHONE.matches || document.hidden) return;\r\n      build();\r\n    }\r\n    function open(start) {\r\n      if (!modal && !build()) return false;\r\n      if (!standby) return false; \/\/ already open\r\n      standby = false;\r\n      modal.classList.remove('is-standby'); modal.removeAttribute('aria-hidden');\r\n      document.documentElement.style.overflow = 'hidden';\r\n      setTint(true);\r\n      feed.scrollTop = 0; idx = 0; markActive(); placeDeck(cur, 0);\r\n      requestAnimationFrame(function () { modal && modal.classList.add('is-open'); });\r\n      try { history.pushState({ hpuVm: 1 }, ''); } catch (e) {}\r\n      track('video_modal_open', { feed_length: items.length });\r\n      fillFeed(); \/\/ open: top the queue up to four\r\n      showCta(1800);\r\n\r\n      wantAudio = true;\r\n      var first = cur, at = start || startFor(items[0], true);\r\n      first.preloading = false; stopPreview(first); first.seekOnSwap = false; first.startAt = at;\r\n      first.forcedMute = false; first.wantSound = true;\r\n      if (first.ready && first.player) {\r\n        try { first.player.seekTo(at, true); first.player.playVideo(); } catch (e) {}\r\n        if (wantAudio) unlockAudio(); \/\/ still inside the tap, so iPhone allows sound on both players\r\n        try { if (first.player.getPlayerState() === 1) onState(first, 1); } catch (e) {}\r\n        applyCaptions(first); soundCheck(first);\r\n      } else {\r\n        first.startOnReady = at; \/\/ still loading: it starts the moment it is ready\r\n      }\r\n      preloadNext(); \/\/ queue the next video right away\r\n      return true;\r\n    }\r\n    if (PHONE.matches) {\r\n      var kick = function () { setTimeout(prewarm, 800); };\r\n      if (document.readyState === 'complete') kick(); else window.addEventListener('load', kick);\r\n    }\r\n    \/\/ Desktop: build the viewer when the pointer reaches the video, so the click opens it fast.\r\n    box.addEventListener('pointerenter', function () { if (DESK.matches && !modal && !document.hidden) build(); });\r\n    window.addEventListener('popstate', function () { if (modal && !standby) close(true); });\r\n    document.addEventListener('keydown', function (e) {\r\n      if (!modal || standby) return;\r\n      var tg = e.target;\r\n      if (tg && tg.closest && tg.closest('input,select,textarea,[contenteditable=\"true\"]')) return; \/\/ typing in the RFI form\r\n      if (e.key === 'Escape') close(false);\r\n      else if (e.key === 'ArrowDown' || e.key === 'PageDown') { e.preventDefault(); go(idx + 1, 'keyboard'); }\r\n      else if (e.key === 'ArrowUp' || e.key === 'PageUp') { e.preventDefault(); go(idx - 1, 'keyboard'); }\r\n    });\r\n\r\n    \/\/ Tap on the main video (theme turns it into a thumbnail that opens Fancybox): phones get our modal instead.\r\n    document.addEventListener('click', function (e) {\r\n      if (!useModal()) return;\r\n      if (e.target.closest && e.target.closest('.hpu-video-section-iframe')) {\r\n        if (open(0)) { e.preventDefault(); e.stopPropagation(); }\r\n      }\r\n    }, true);\r\n    \/\/ Chapter timestamps: same modal on phones, starting at that time.\r\n    document.addEventListener('click', function (e) {\r\n      if (!useModal() || !e.target.closest) return;\r\n      var inner = e.target.closest('.hpu-video-transcript-text-inner'); if (!inner) return;\r\n      var link = inner.querySelector('.hpu-video-transcript-chapter-time a'); if (!link) return;\r\n      var t = parseInt(new URL(link.href).searchParams.get('t'), 10);\r\n      if (open(isNaN(t) ? 0 : t)) { e.preventDefault(); e.stopPropagation(); }\r\n    }, true);\r\n  })();\r\n\r\n  \/\/ \u2500\u2500 Tag Pills \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  (function() {\r\n    var containers = document.querySelectorAll('.hpu-video-tags');\r\n    if (!containers.length) return;\r\n\r\n    var match = document.body.className.match(\/\\bpostid-(\\d+)\\b\/);\r\n    if (!match) return;\r\n\r\n    var apiRootEl = document.querySelector('link[rel=\"https:\/\/api.w.org\/\"]');\r\n    var apiRoot = (window.wpApiSettings && window.wpApiSettings.root)\r\n      || (apiRootEl && apiRootEl.getAttribute('href'))\r\n      || '\/wp-json\/';\r\n    var url = apiRoot.replace(\/\\\/$\/, '') + '\/wp\/v2\/tags?post=' + match[1] + '&per_page=100';\r\n\r\n    fetch(url)\r\n      .then(function(r) { return r.ok ? r.json() : Promise.reject(); })\r\n      .then(function(tags) {\r\n        if (!tags.length) return;\r\n        var decoder = document.createElement('textarea');\r\n        containers.forEach(function(container) {\r\n          tags.forEach(function(tag) {\r\n            decoder.innerHTML = tag.name;\r\n            var pill = document.createElement('span');\r\n            pill.className = 'hpu-video-tag';\r\n            pill.textContent = decoder.value;\r\n            container.appendChild(pill);\r\n          });\r\n        });\r\n      })\r\n      .catch(function() {});\r\n  })();\r\n\r\n  \/\/ \u2500\u2500 Related Videos: Loader + Scroll Indicators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  (function() {\r\n    var slider    = document.querySelector('.hpu-related-videos-slider');\r\n    var noResults = document.querySelector('.hpu-related-videos-none');\r\n    var section   = slider && slider.closest('.hpu-related-videos');\r\n    if (!slider || !section) return;\r\n\r\n    \/\/ Scroll indicators \u2014 wired immediately, before any fetch\r\n    function updateIndicators() {\r\n      section.classList.toggle('has-scroll-left',  slider.scrollLeft > 0);\r\n      section.classList.toggle('has-scroll-right',\r\n        slider.scrollLeft + slider.clientWidth < slider.scrollWidth - 1);\r\n    }\r\n    slider.addEventListener('scroll', updateIndicators, { passive: true });\r\n    window.addEventListener('load', updateIndicators);\r\n\r\n    \/\/ Nav chevron buttons\r\n    var prevBtn = document.createElement('button');\r\n    prevBtn.className = 'hpu-rv-nav hpu-rv-nav-prev';\r\n    prevBtn.setAttribute('aria-label', 'Scroll left');\r\n    var prevChev = document.createElement('span');\r\n    prevChev.className = 'hpu-rv-nav-chevron';\r\n    prevBtn.appendChild(prevChev);\r\n    section.appendChild(prevBtn);\r\n\r\n    var nextBtn = document.createElement('button');\r\n    nextBtn.className = 'hpu-rv-nav hpu-rv-nav-next';\r\n    nextBtn.setAttribute('aria-label', 'Scroll right');\r\n    var nextChev = document.createElement('span');\r\n    nextChev.className = 'hpu-rv-nav-chevron';\r\n    nextBtn.appendChild(nextChev);\r\n    section.appendChild(nextBtn);\r\n\r\n    prevBtn.addEventListener('click', function() {\r\n      var firstCard = slider.querySelector('.hpu-related-videos-card, .hpu-rv-skel');\r\n      var n = window.innerWidth <= 1279 ? 2 : 4;\r\n      var dist = firstCard ? (firstCard.offsetWidth + 12) * n : slider.clientWidth * 0.8;\r\n      slider.scrollBy({ left: -dist, behavior: 'smooth' });\r\n    });\r\n    nextBtn.addEventListener('click', function() {\r\n      var firstCard = slider.querySelector('.hpu-related-videos-card, .hpu-rv-skel');\r\n      var n = window.innerWidth <= 1279 ? 2 : 4;\r\n      var dist = firstCard ? (firstCard.offsetWidth + 12) * n : slider.clientWidth * 0.8;\r\n      slider.scrollBy({ left: dist, behavior: 'smooth' });\r\n    });\r\n\r\n    \/\/ Align nav buttons to the vertical center of the thumbnail image row\r\n    function positionNavButtons() {\r\n      var firstThumb = slider.querySelector('.hpu-related-videos-card-thumb, .hpu-rv-skel-thumb');\r\n      if (!firstThumb) return;\r\n      var thumbH = firstThumb.getBoundingClientRect().height;\r\n      if (!thumbH) return; \/\/ element is hidden (display:none tab)\r\n      var top = slider.getBoundingClientRect().top - section.getBoundingClientRect().top + thumbH \/ 2;\r\n      [prevBtn, nextBtn].forEach(function(btn) {\r\n        btn.style.top = top + 'px';\r\n        btn.style.transform = 'translateY(-50%)';\r\n      });\r\n    }\r\n    if (typeof ResizeObserver !== 'undefined') {\r\n      new ResizeObserver(positionNavButtons).observe(section);\r\n    }\r\n    window.addEventListener('resize', positionNavButtons);\r\n\r\n    \/\/ Related videos fetch \u2014 runs after page load, yields to idle work\r\n    function loadRelatedVideos() {\r\n      var match = document.body.className.match(\/\\bpostid-(\\d+)\\b\/);\r\n      if (!match) return;\r\n      var postId = match[1];\r\n\r\n      var apiRootEl = document.querySelector('link[rel=\"https:\/\/api.w.org\/\"]');\r\n      var base = ((window.wpApiSettings && window.wpApiSettings.root)\r\n        || (apiRootEl && apiRootEl.getAttribute('href'))\r\n        || '\/wp-json\/').replace(\/\\\/$\/, '');\r\n\r\n      var decoder = document.createElement('textarea');\r\n      var catId   = null;\r\n\r\n      function showSkeletons() {\r\n        for (var i = 0; i < 5; i++) {\r\n          var skel = document.createElement('div');\r\n          skel.className = 'hpu-rv-skel';\r\n          var t = document.createElement('div');\r\n          t.className = 'hpu-rv-skel-thumb';\r\n          var l1 = document.createElement('div');\r\n          l1.className = 'hpu-rv-skel-line';\r\n          var l2 = document.createElement('div');\r\n          l2.className = 'hpu-rv-skel-line hpu-rv-skel-line-short';\r\n          skel.appendChild(t); skel.appendChild(l1); skel.appendChild(l2);\r\n          slider.appendChild(skel);\r\n        }\r\n      }\r\n\r\n      function shuffle(arr) {\r\n        for (var i = arr.length - 1; i > 0; i--) {\r\n          var j = Math.floor(Math.random() * (i + 1));\r\n          var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;\r\n        }\r\n        return arr;\r\n      }\r\n\r\n      function appendCard(post) {\r\n        decoder.innerHTML = (post.title && post.title.rendered) ? post.title.rendered : 'Untitled';\r\n        var title    = decoder.value;\r\n        var link     = post.link || '#';\r\n        var embedded = post._embedded && post._embedded['wp:featuredmedia'];\r\n        var thumbUrl = Array.isArray(embedded) && embedded[0] && embedded[0].source_url\r\n          ? embedded[0].source_url : null;\r\n\r\n        var card = document.createElement('a');\r\n        card.className = 'hpu-related-videos-card';\r\n        card.href = link;\r\n\r\n        var thumb = document.createElement('div');\r\n        thumb.className = 'hpu-related-videos-card-thumb';\r\n        if (thumbUrl) {\r\n          var img = document.createElement('img');\r\n          img.src = thumbUrl; img.alt = title; img.loading = 'lazy';\r\n          thumb.appendChild(img);\r\n        } else {\r\n          var ph = document.createElement('div');\r\n          ph.className = 'hpu-related-videos-card-thumb-placeholder';\r\n          thumb.appendChild(ph);\r\n        }\r\n\r\n        var titleEl = document.createElement('div');\r\n        titleEl.className = 'hpu-related-videos-card-title';\r\n        titleEl.textContent = title;\r\n\r\n        card.appendChild(thumb);\r\n        card.appendChild(titleEl);\r\n        slider.appendChild(card);\r\n      }\r\n\r\n      \/\/ Share the related list with the mobile video modal's swipe feed.\r\n      function pushFeed(list) {\r\n        try {\r\n          var add = list.map(function(p) {\r\n            var c = (p.content && p.content.rendered) || '';\r\n            var m = c.match(\/youtube(?:-nocookie)?\\.com\\\/embed\\\/([A-Za-z0-9_-]{11})\/) || JSON.stringify(p.meta || {}).match(\/embed\\\\*\\\/([A-Za-z0-9_-]{11})\/);\r\n            var e = p._embedded && p._embedded['wp:featuredmedia'];\r\n            decoder.innerHTML = (p.title && p.title.rendered) || '';\r\n            return { id: m ? m[1] : null, title: decoder.value, link: p.link, thumb: (Array.isArray(e) && e[0] && e[0].source_url) || null };\r\n          }).filter(function(v) { return v.id; });\r\n          window.hpuRelatedFeed = (window.hpuRelatedFeed || []).concat(add);\r\n          document.dispatchEvent(new CustomEvent('hpu:related-ready'));\r\n        } catch (err) {}\r\n      }\r\n\r\n      var cachedCatId = (function() { try { return sessionStorage.getItem('hpu_rv_cat'); } catch(e) { return null; } })();\r\n\r\n      showSkeletons();\r\n\r\n      Promise.all([\r\n        fetch(base + '\/wp\/v2\/posts\/' + postId + '?_fields=tags')\r\n          .then(function(r) { return r.ok ? r.json() : Promise.reject(); }),\r\n        cachedCatId\r\n          ? Promise.resolve(+cachedCatId)\r\n          : fetch(base + '\/wp\/v2\/categories?slug=hpu-videos&per_page=1&_fields=id')\r\n              .then(function(r) { return r.ok ? r.json() : Promise.reject(); })\r\n              .then(function(cats) {\r\n                if (!cats.length) return Promise.reject();\r\n                try { sessionStorage.setItem('hpu_rv_cat', cats[0].id); } catch(e) {}\r\n                return cats[0].id;\r\n              })\r\n      ])\r\n      .then(function(results) {\r\n        var tagIds = Array.isArray(results[0].tags) ? results[0].tags : [];\r\n        catId = results[1];\r\n        var params = new URLSearchParams({\r\n          categories: catId,\r\n          per_page: 12,\r\n          status: 'publish',\r\n          orderby: 'date',\r\n          order: 'desc',\r\n          exclude: postId,\r\n          _embed: 'wp:featuredmedia'\r\n        });\r\n        if (tagIds.length) params.set('tags', tagIds.join(','));\r\n        return fetch(base + '\/wp\/v2\/posts?' + params)\r\n          .then(function(r) { return r.ok ? r.json() : Promise.reject(); });\r\n      })\r\n        .then(function(posts) {\r\n          var verticalMode = window.innerWidth <= 900;\r\n          slider.innerHTML = '';\r\n          shuffle(posts);\r\n          pushFeed(posts);\r\n          (verticalMode ? posts.slice(0, 6) : posts).forEach(appendCard);\r\n          updateIndicators();\r\n\r\n          if (posts.length < 12 && catId) {\r\n            var excludeIds = [postId].concat(posts.map(function(p) { return p.id; }));\r\n            var backfillParams = new URLSearchParams({\r\n              categories: catId,\r\n              per_page: 12 - posts.length,\r\n              status: 'publish',\r\n              orderby: 'date',\r\n              order: 'desc',\r\n              exclude: excludeIds.join(','),\r\n              _embed: 'wp:featuredmedia'\r\n            });\r\n            fetch(base + '\/wp\/v2\/posts?' + backfillParams)\r\n              .then(function(r) { return r.ok ? r.json() : []; })\r\n              .then(function(extra) {\r\n                if (!extra.length) {\r\n                  if (!slider.children.length) noResults.style.display = 'block';\r\n                  return;\r\n                }\r\n                shuffle(extra);\r\n                pushFeed(extra);\r\n                if (!verticalMode) extra.forEach(appendCard);\r\n                else if (!slider.children.length) noResults.style.display = 'block';\r\n                updateIndicators();\r\n              })\r\n              .catch(function() {\r\n                if (!slider.children.length) noResults.style.display = 'block';\r\n              });\r\n          } else if (!slider.children.length) {\r\n            noResults.style.display = 'block';\r\n          }\r\n        })\r\n        .catch(function() { slider.innerHTML = ''; noResults.style.display = 'block'; });\r\n    }\r\n\r\n    if (document.readyState === 'loading') {\r\n      document.addEventListener('DOMContentLoaded', loadRelatedVideos);\r\n    } else {\r\n      loadRelatedVideos();\r\n    }\r\n  })();\r\n\r\n  \/\/ \u2500\u2500 Dynamic Breadcrumb Logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  (function() {\r\n    try {\r\n      const breadcrumbElements = document.querySelectorAll('.breadcrumbs [property=\"v:title\"]');\r\n      \r\n      breadcrumbElements.forEach(el => {\r\n        if (el.textContent.trim().toLowerCase() === 'hpu videos') {\r\n          const wrapper = el.closest('[typeof=\"v:Breadcrumb\"]');\r\n          \r\n          if (wrapper) {\r\n            \/\/ Find and remove the text node following the span to get rid of the stray \">\"\r\n            const nextNode = wrapper.nextSibling;\r\n            if (nextNode && nextNode.nodeType === Node.TEXT_NODE) {\r\n              nextNode.remove();\r\n            }\r\n            \/\/ Remove the parent span element itself\r\n            wrapper.remove();\r\n          } else {\r\n            \/\/ Fallback: just remove the element if no wrapper is found\r\n            el.remove();\r\n          }\r\n        }\r\n      });\r\n    } catch (error) {\r\n      \/\/ Fail gracefully: Do nothing and prevent JS from breaking\r\n      \/\/ console.warn('Breadcrumb swap skipped.');\r\n    }\r\n  })();\r\n\r\n\r\n\r\n\r\n\r\n\r\n  \/\/ \u2500\u2500 Mobile Transcript Tab \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  (function () {\r\n    const BREAKPOINT       = 1365;\r\n    const LABEL_BREAKPOINT = 767;\r\n\r\n    const transcriptEl = document.getElementById('hpu-video-transcript');\r\n    const sidebarInner = document.querySelector('.hpu-video-sidebar-inner');\r\n    const tabsBar      = document.querySelector('.hpu-video-tabs');\r\n    const videoBody    = document.querySelector('.hpu-video-body');\r\n\r\n    if (!transcriptEl || !sidebarInner || !tabsBar || !videoBody) return;\r\n\r\n    const relatedBtn = tabsBar.querySelector('[data-tab=\"related\"]');\r\n\r\n    \/\/ New tab button\r\n    const tabBtn = document.createElement('button');\r\n    tabBtn.className = 'hpu-video-tab-btn';\r\n    tabBtn.setAttribute('data-tab', 'transcript');\r\n    tabBtn.textContent = 'Chapters & Transcript';\r\n    tabBtn.style.display = 'none';\r\n    tabsBar.appendChild(tabBtn);\r\n\r\n    \/\/ New tab content wrapper\r\n    const tabContent = document.createElement('div');\r\n    tabContent.className = 'hpu-video-tab-content';\r\n    tabContent.id = 'tab-transcript';\r\n    videoBody.appendChild(tabContent);\r\n\r\n    \/\/ Wire new tab button (uses fresh querySelectorAll to cover all tabs\/contents)\r\n    tabBtn.addEventListener('click', () => {\r\n      document.querySelectorAll('.hpu-video-tab-btn').forEach(b => b.classList.remove('active'));\r\n      document.querySelectorAll('.hpu-video-tab-content').forEach(c => c.classList.remove('active'));\r\n      tabBtn.classList.add('active');\r\n      tabContent.classList.add('active');\r\n    });\r\n\r\n    \/\/ Patch existing buttons \u2014 their load-time NodeLists don't include the new tab,\r\n    \/\/ so add a second listener that deactivates it when they're clicked\r\n    tabsBar.querySelectorAll('.hpu-video-tab-btn:not([data-tab=\"transcript\"])').forEach(btn => {\r\n      btn.addEventListener('click', () => {\r\n        tabBtn.classList.remove('active');\r\n        tabContent.classList.remove('active');\r\n      });\r\n    });\r\n\r\n    let currentlyMobile = null;\r\n    let currentlySmall  = null;\r\n\r\n    function applyLayout() {\r\n      const mobile = window.innerWidth <= BREAKPOINT;\r\n      const small  = window.innerWidth <= LABEL_BREAKPOINT;\r\n\r\n      \/\/ \u2500\u2500 Transcript tab: show\/hide at 1365px \u2500\u2500\r\n      if (mobile !== currentlyMobile) {\r\n        currentlyMobile = mobile;\r\n\r\n        if (mobile) {\r\n          tabContent.appendChild(transcriptEl);\r\n          tabBtn.style.display = '';\r\n        } else {\r\n          sidebarInner.appendChild(transcriptEl);\r\n          tabBtn.style.display = 'none';\r\n          \/\/ Fall back to description tab if transcript was active\r\n          if (tabContent.classList.contains('active')) {\r\n            tabContent.classList.remove('active');\r\n            tabBtn.classList.remove('active');\r\n            const descBtn = document.querySelector('[data-tab=\"description\"]');\r\n            const descContent = document.getElementById('tab-description');\r\n            if (descBtn) descBtn.classList.add('active');\r\n            if (descContent) descContent.classList.add('active');\r\n          }\r\n        }\r\n      }\r\n\r\n      \/\/ \u2500\u2500 Tab labels: shorten at 767px \u2500\u2500\r\n      if (small !== currentlySmall) {\r\n        currentlySmall = small;\r\n        tabBtn.textContent = small ? 'Transcript' : 'Chapters & Transcript';\r\n        if (relatedBtn) relatedBtn.textContent = small ? 'Related' : 'Related Videos';\r\n      }\r\n    }\r\n\r\n    applyLayout();\r\n    window.addEventListener('resize', applyLayout);\r\n  })();\r\n<\/script>\r\n\r\n<style>\r\n  \/* \u2500\u2500 HPU Video Article \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n\r\n  .hpu-video-article {\r\n    --purple:     #330072;\r\n    --purple-tint: rgba(51, 0, 114, .08);\r\n    --gray:       #f5f5f5;\r\n    --border:     #e0e0e0;\r\n    --muted:      #6b6b6b;\r\n    --r:          15px;\r\n    --r-sm:       5px;\r\n    --gap:        16px;\r\n  }\r\n  p:empty{\r\n    display: none;\r\n  }\r\n  .hpu-tm-r {\r\n    font-size: .75rem;\r\n  }\r\n\r\n  \/* Suppress page header on video posts *\/\r\n  .archives_related.article-header { display: none; }\r\n\r\n  \/* Widen the WordPress content frame to accommodate the full layout *\/\r\n  .wysiwyg-content.wysiwyg-frame:has(.hpu-video-article) { max-width: 1800px !important; }\r\n\r\n \/* \u2500\u2500 Main Layout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.hpu-video-layout {\r\n  display: flex;\r\n  flex-wrap: nowrap;\r\n  gap: var(--gap);\r\n  align-items: stretch;\r\n  max-width: 1800px;\r\n  margin: 0 auto;\r\n}\r\n \r\n.hpu-video-sidebar {\r\n  width: 380px; \r\n  flex-shrink: 0;\r\n  position: relative;\r\n  overflow: hidden; \/* hide native scrollbars *\/\r\n  border-radius: var(--r);\r\n}\r\n\r\n\/* \u2500\u2500 Sidebar Inner (Scroll Container) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.hpu-video-sidebar-inner {\r\n  position: absolute;\r\n  top: 0; \r\n  left: 0; \r\n  right: 0; \r\n  bottom: 0;\r\n  background: var(--gray);\r\n  padding: 20px;\r\n  border-radius: var(--r);\r\n  overflow-y: auto; \r\n  \r\n  \/* Firefox: Default state is completely invisible *\/\r\n  scrollbar-width: thin; \r\n  scrollbar-color: transparent transparent; \r\n  transition: scrollbar-color 0.3s ease;\r\n}\r\n\r\n\/* Firefox: Hover state *\/\r\n.hpu-video-sidebar-inner:hover {\r\n  scrollbar-color: rgba(0, 0, 0, 0.2) transparent;\r\n}\r\n\r\n\/* WebKit (Chrome, Edge, Safari): Base Structure *\/\r\n.hpu-video-sidebar-inner::-webkit-scrollbar {\r\n  width: 6px; \r\n}\r\n\r\n.hpu-video-sidebar-inner::-webkit-scrollbar-track {\r\n  background: transparent; \r\n}\r\n\r\n\/* WebKit: Default state is completely invisible *\/\r\n.hpu-video-sidebar-inner::-webkit-scrollbar-thumb {\r\n  background: transparent; \r\n  border-radius: 10px;\r\n}\r\n\r\n\/* WebKit: Hover state makes the thumb visible *\/\r\n.hpu-video-sidebar-inner:hover::-webkit-scrollbar-thumb {\r\n  background: rgba(0, 0, 0, 0.2); \r\n}\r\n\r\n\/* \u2500\u2500 Main Video Area \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.hpu-video-main {\r\n  flex-grow: 1;\r\n  min-width: 0; \r\n}\r\n\r\n  \/* \u2500\u2500 Video player \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  .hpu-video-section { margin-bottom: 24px; }\r\n\r\n  .hpu-video-section-iframe {\r\n    position: relative;\r\n    aspect-ratio: 16 \/ 9;\r\n    background: #000;\r\n    border-radius: var(--r);\r\n    overflow: hidden;\r\n    box-shadow: 0 4px 24px rgba(0, 0, 0, .14);\r\n  }\r\n\r\n  \/* Flatten WordPress oEmbed wrappers (figure, div, etc.) *\/\r\n  .hpu-video-section-iframe > *,\r\n  .hpu-video-section-iframe .wp-block-embed,\r\n  .hpu-video-section-iframe .wp-block-embed__wrapper {\r\n    position: absolute !important;\r\n    inset: 0 !important;\r\n    width:  100% !important;\r\n    height: 100% !important;\r\n    margin:  0 !important;\r\n    padding: 0 !important;\r\n  }\r\n\r\n  .hpu-video-section-iframe iframe {\r\n    position: absolute;\r\n    inset: 0;\r\n    width:  100%;\r\n    height: 100%;\r\n    border: 0;\r\n  }\r\n\r\n  \/* \u2500\u2500 Tabbed Container \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  .hpu-video-body {\r\n    background: var(--gray);\r\n    border-radius: var(--r);\r\n    padding: 20px 24px;\r\n  }\r\n\r\n  .hpu-video-tabs {\r\n    display: flex;\r\n    gap: 16px;\r\n    margin-bottom: 16px;\r\n    border-bottom: 2px solid var(--border);\r\n  }\r\n\r\n  .hpu-video-tab-btn {\r\n    background: none;\r\n    border: none;\r\n    padding: 10px 4px;\r\n    cursor: pointer;\r\n    font-size: 15px;\r\n    font-weight: 600;\r\n    color: var(--muted);\r\n    position: relative;\r\n    margin-bottom: -2px; \/* overlay the border *\/\r\n    transition: color 0.2s;\r\n  }\r\n\r\n  .hpu-video-tab-btn:hover {\r\n    color: #000;\r\n  }\r\n\r\n  .hpu-video-tab-btn.active:not(:only-child) {\r\n    color: var(--purple);\r\n  }\r\n\r\n  .hpu-video-tab-btn.active:not(:only-child)::after {\r\n    content: '';\r\n    position: absolute;\r\n    bottom: 0;\r\n    left: 0;\r\n    width: 100%;\r\n    height: 2px;\r\n    background: var(--purple);\r\n    border-radius: 2px 2px 0 0;\r\n  }\r\n\r\n  .hpu-video-tab-content {\r\n    display: none;\r\n  }\r\n\r\n  .hpu-video-tab-content.active {\r\n    display: block;\r\n    animation: fadeIn 0.4s ease;\r\n  }\r\n\r\n  @keyframes fadeIn {\r\n    from { opacity: 0; transform: translateY(4px); }\r\n    to { opacity: 1; transform: translateY(0); }\r\n  }\r\n\r\n  .hpu-video-summary p {\r\n    font-size: 14px;\r\n    line-height: 1.7;\r\n    color: var(--muted);\r\n    margin: 0 0 12px;\r\n  }\r\n\r\n  .hpu-video-tags {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 6px;\r\n    margin-top: 4px;\r\n  }\r\n\r\n  .hpu-video-tag {\r\n    display: inline-block;\r\n    font-size: 12px;\r\n    font-weight: 500;\r\n    color: var(--purple);\r\n    background: var(--purple-tint);\r\n    border: 1px solid rgba(51, 0, 114, .18);\r\n    border-radius: 20px;\r\n    padding: 3px 10px;\r\n    white-space: nowrap;\r\n  }\r\n\r\n  \/* \u2500\u2500 CTA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  .hpu-btn-purple-outline {\r\n    display: inline-block;\r\n    border: 2px solid var(--purple);\r\n    color: var(--purple);\r\n    background: transparent;\r\n    padding: 10px 24px;\r\n    border-radius: 5px;\r\n    font-size: 15px;\r\n    font-weight: 600;\r\n    font-family: Bitter, sans-serif;\r\n    text-decoration: none !important;\r\n    transition: all 0.2s ease;\r\n  }\r\n  \r\n  .hpu-btn-purple-outline:hover {\r\n    background: var(--purple);\r\n    color: #fff !important;\r\n  }\r\n\r\n  .hpu-video-cta-container {\r\n    background: #fff;\r\n    padding: 24px;\r\n    text-align: center;\r\n    border: 1px solid var(--border);\r\n    border-radius: var(--r);\r\n    margin-bottom: 20px;\r\n  }\r\n\r\n  #hpu-video-cta { margin-top: 0; }\r\n  \r\n  #hpu-video-cta h2 {\r\n    margin-top: 0;\r\n    margin-bottom: 8px;\r\n    font-size: 20px;\r\n    font-weight: 600;\r\n    line-height: 1.3;\r\n  }\r\n\r\n  #hpu-video-cta p {\r\n    color: var(--muted);\r\n    margin-bottom: 16px;\r\n    font-size: 13px;\r\n  }\r\n\r\n  \/* \u2500\u2500 Transcript container \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  .hpu-video-transcript {\r\n    background: #fff;\r\n    border: 1px solid var(--border);\r\n    border-radius: var(--r);\r\n    overflow: hidden;\r\n  }\r\n\r\n  \/* \u2500\u2500 Transcript header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  .hpu-video-transcript-header {\r\n    padding: 16px 20px;\r\n    background: transparent;\r\n    border-bottom: 1px solid var(--border);\r\n  }\r\n\r\n  .hpu-video-transcript-title {\r\n    font-size: 16px;\r\n    font-weight: 500;\r\n    color: #333;\r\n  }\r\n\r\n  .hpu-video-transcript-content {\r\n    background: transparent;\r\n  }\r\n\r\n  \/* \u2500\u2500 FAQ Accordion Chapters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  .hpu-video-transcript-chapter {\r\n    border-bottom: 1px solid var(--border);\r\n  }\r\n\r\n  .hpu-video-transcript-chapter:last-child { \r\n    border-bottom: none; \r\n  }\r\n\r\n  .hpu-video-transcript-chapter-header {\r\n    padding: 16px 20px;\r\n    cursor: pointer;\r\n    position: relative;\r\n    transition: background-color 0.2s;\r\n  }\r\n\r\n  .hpu-video-transcript-chapter-header:hover {\r\n    background-color: rgba(0,0,0,0.02);\r\n  }\r\n\r\n  \/* Accordion chevron *\/\r\n  .hpu-video-transcript-chapter-header::after {\r\n    content: '';\r\n    position: absolute;\r\n    right: 20px;\r\n    top: 50%;\r\n    transform: translateY(-50%) rotate(45deg); \/* Point straight down *\/\r\n    width: 10px;\r\n    height: 10px;\r\n    border-right: 2px solid var(--muted);\r\n    border-bottom: 2px solid var(--muted);\r\n    transition: transform 0.3s ease;\r\n    transform-origin: 65% 65%;\r\n  }\r\n\r\n  .hpu-video-transcript-chapter.expanded .hpu-video-transcript-chapter-header::after {\r\n    transform: translateY(-50%) rotate(-135deg); \/* Point straight up *\/\r\n  }\r\n\r\n  .hpu-video-transcript-chapter-header-top {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n    padding-right: 24px; \/* avoid chevron *\/\r\n  }\r\n\r\n  .hpu-video-transcript-chapter-number {\r\n    font-size: 14px;\r\n    font-weight: 700;\r\n    color: #333;\r\n  }\r\n\r\n  \/* h2 preserved for heading hierarchy and AEO *\/\r\n  .hpu-video-transcript-speaker {\r\n    font-size: 16px !important;\r\n    font-weight: 500 !important;\r\n    font-family: Poppins, sans-serif !important;\r\n    color: #333 !important;\r\n    margin: 0 !important;\r\n    line-height: 1.4 !important;\r\n  }\r\n\r\n  .hpu-video-transcript-text-container {\r\n    height: 0;\r\n    overflow: hidden;\r\n    transition: height 0.3s ease;\r\n  }\r\n\r\n  .hpu-video-transcript-text-inner {\r\n    padding: 0 20px 20px;\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 12px;\r\n    cursor: pointer;\r\n  }\r\n\r\n  .hpu-video-transcript-chapter-time {\r\n    margin-top: 4px;\r\n  }\r\n\r\n  .hpu-video-transcript-chapter-time a {\r\n    font-size: 11px;\r\n    font-weight: 400;\r\n    color: #000;\r\n    text-decoration: none;\r\n    background: var(--purple-tint);\r\n    padding: 3px 8px;\r\n    border-radius: var(--r-sm);\r\n    font-variant-numeric: tabular-nums;\r\n    display: inline-block;\r\n  }\r\n\r\n  .hpu-video-transcript-text-inner:hover .hpu-video-transcript-chapter-time a {\r\n    background: var(--purple);\r\n    color: #fff;\r\n  }\r\n\r\n  .hpu-video-transcript-text {\r\n    font-size: 13px;\r\n    line-height: 1.6;\r\n    color: var(--muted);\r\n    margin: 0;\r\n  }\r\n\r\n  \/* \u2500\u2500 Related Videos \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  .hpu-related-videos {\r\n    position: relative;\r\n  }\r\n\r\n  .hpu-related-videos::before,\r\n  .hpu-related-videos::after {\r\n    content: '';\r\n    position: absolute;\r\n    top: 0;\r\n    bottom: 0;\r\n    width: 16px;\r\n    pointer-events: none;\r\n    z-index: 1;\r\n    opacity: 0;\r\n    transition: opacity 0.3s ease;\r\n  }\r\n\r\n  .hpu-related-videos::before {\r\n    left: 0;\r\n    background: linear-gradient(to right, var(--gray), transparent);\r\n  }\r\n\r\n  .hpu-related-videos::after {\r\n    right: 0;\r\n    background: linear-gradient(to left, var(--gray), transparent);\r\n  }\r\n\r\n  .hpu-related-videos.has-scroll-left::before  { opacity: 1; }\r\n  .hpu-related-videos.has-scroll-right::after  { opacity: 1; }\r\n\r\n  .hpu-rv-nav {\r\n    position: absolute;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    width: 48px;\r\n    height: 48px;\r\n    padding: 0;\r\n    background: rgba(255, 255, 255, 0.7);\r\n    border: 1px solid var(--border);\r\n    border-radius: 50%;\r\n    cursor: pointer;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    z-index: 2;\r\n    opacity: 0;\r\n    transition: opacity 0.3s ease;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .hpu-rv-nav-prev { left: 8px; }\r\n  .hpu-rv-nav-next { right: 8px; }\r\n\r\n  .hpu-related-videos.has-scroll-left  .hpu-rv-nav-prev,\r\n  .hpu-related-videos.has-scroll-right .hpu-rv-nav-next {\r\n    opacity: 1;\r\n    pointer-events: auto;\r\n  }\r\n\r\n  .hpu-rv-nav-chevron {\r\n    display: block;\r\n    width: 12px;\r\n    height: 12px;\r\n    border-right: 2.5px solid var(--muted);\r\n    border-bottom: 2.5px solid var(--muted);\r\n  }\r\n\r\n  .hpu-rv-nav-prev .hpu-rv-nav-chevron { transform: rotate(135deg);  margin-left: 3px; }\r\n  .hpu-rv-nav-next .hpu-rv-nav-chevron { transform: rotate(-45deg);  margin-right: 3px; }\r\n\r\n  .hpu-related-videos-none {\r\n    display: none;\r\n    font-size: 13px;\r\n    color: var(--muted);\r\n    margin: 8px 0 0;\r\n  }\r\n\r\n  @keyframes hpu-rv-shimmer {\r\n    0%   { background-position: 200% 0; }\r\n    100% { background-position: -200% 0; }\r\n  }\r\n\r\n  .hpu-rv-skel {\r\n    flex: 0 0 calc((100% - 132px) \/ 4);\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 8px;\r\n    flex-shrink: 0;\r\n  }\r\n\r\n  .hpu-rv-skel-thumb {\r\n    width: 100%;\r\n    aspect-ratio: 16 \/ 9;\r\n    border-radius: var(--r-sm);\r\n    background: linear-gradient(90deg, #e8e8e8 25%, #f4f4f4 50%, #e8e8e8 75%);\r\n    background-size: 200% 100%;\r\n    animation: hpu-rv-shimmer 1.4s ease-in-out infinite;\r\n  }\r\n\r\n  .hpu-rv-skel-line {\r\n    height: 12px;\r\n    border-radius: 4px;\r\n    background: linear-gradient(90deg, #e8e8e8 25%, #f4f4f4 50%, #e8e8e8 75%);\r\n    background-size: 200% 100%;\r\n    animation: hpu-rv-shimmer 1.4s ease-in-out infinite;\r\n  }\r\n\r\n  .hpu-rv-skel-line-short {\r\n    width: 60%;\r\n  }\r\n\r\n  .hpu-related-videos-slider {\r\n    display: flex;\r\n    gap: 12px;\r\n    overflow-x: auto;\r\n    min-height: 130px;\r\n    scroll-snap-type: x mandatory;\r\n    -webkit-overflow-scrolling: touch;\r\n    padding-bottom: 6px;\r\n    scroll-padding-left: 48px;\r\n    scrollbar-width: thin;\r\n    scrollbar-color: transparent transparent;\r\n    transition: scrollbar-color 0.3s ease;\r\n  }\r\n\r\n  .hpu-related-videos-slider:hover {\r\n    scrollbar-color: rgba(0, 0, 0, 0.2) transparent;\r\n  }\r\n\r\n  .hpu-related-videos-slider::-webkit-scrollbar { height: 4px; }\r\n  .hpu-related-videos-slider::-webkit-scrollbar-track { background: transparent; }\r\n  .hpu-related-videos-slider::-webkit-scrollbar-thumb {\r\n    background: transparent;\r\n    border-radius: 10px;\r\n  }\r\n  .hpu-related-videos-slider:hover::-webkit-scrollbar-thumb {\r\n    background: rgba(0, 0, 0, 0.2);\r\n  }\r\n\r\n  .hpu-related-videos-card {\r\n    flex: 0 0 calc((100% - 132px) \/ 4);\r\n    scroll-snap-align: start;\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 8px;\r\n    text-decoration: none !important;\r\n    color: inherit;\r\n    transition: transform 0.2s ease;\r\n  }\r\n\r\n  .hpu-related-videos-card:last-child  { scroll-snap-align: end; }\r\n\r\n  .hpu-related-videos-card:hover {\r\n    transform: translateY(-2px);\r\n  }\r\n\r\n  .hpu-related-videos-card-thumb {\r\n    width: 100%;\r\n    aspect-ratio: 16 \/ 9;\r\n    border-radius: var(--r-sm);\r\n    overflow: hidden;\r\n    background: #ccc;\r\n    flex-shrink: 0;\r\n  }\r\n\r\n  .hpu-related-videos-card-thumb img {\r\n    width: 100%;\r\n    height: 100%;\r\n    object-fit: cover;\r\n    display: block;\r\n    transition: transform 0.3s ease;\r\n  }\r\n\r\n  .hpu-related-videos-card:hover .hpu-related-videos-card-thumb img {\r\n    transform: scale(1.05);\r\n  }\r\n\r\n  .hpu-related-videos-card-thumb-placeholder {\r\n    width: 100%;\r\n    height: 100%;\r\n    background: linear-gradient(135deg, #e0e0e0, #c8c8c8);\r\n  }\r\n\r\n  .hpu-related-videos-card-title {\r\n    font-size: 13px;\r\n    font-weight: 600;\r\n    line-height: 1.4;\r\n    color: #111;\r\n    display: -webkit-box;\r\n    -webkit-line-clamp: 2;\r\n    line-clamp: 2;\r\n    -webkit-box-orient: vertical;\r\n    overflow: hidden;\r\n    transition: color 0.2s;\r\n  }\r\n\r\n  .hpu-related-videos-card:hover .hpu-related-videos-card-title {\r\n    color: var(--purple);\r\n  }\r\n\r\n  \/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n  @media (max-width: 1365px) {\r\n    .hpu-video-layout {\r\n      flex-direction: column;\r\n    }\r\n\r\n    .hpu-video-sidebar {\r\n      width: 100%;\r\n      order: 2;\r\n    }\r\n    \r\n    .hpu-video-sidebar-inner {\r\n      position: static;\r\n      overflow-y: visible; \/* normal scrolling on mobile *\/\r\n    }\r\n    \r\n    .hpu-video-main {\r\n      order: 1;\r\n      width: 100%;\r\n    }\r\n\r\n   .hpu-video-cta-container { margin-bottom: 0; }\r\n   .hpu-video-main > .hpu-video-cta-container { margin: 20px 0 24px; }\r\n  }\r\n\r\n  @media (max-width: 1279px) {\r\n    .hpu-related-videos-card,\r\n    .hpu-rv-skel {\r\n      flex: 0 0 calc((100% - 108px) \/ 2);\r\n    }\r\n    .hpu-related-videos::before,\r\n    .hpu-related-videos::after { width: 8px; }\r\n  }\r\n\r\n  @media (max-width: 900px) {\r\n    \/* \u2500\u2500 Related videos: vertical list, 10 items, container fits content \u2500\u2500 *\/\r\n    .hpu-related-videos-slider {\r\n      display: flex !important;\r\n      flex-direction: column !important;\r\n      overflow-x: hidden !important;\r\n      overflow-y: visible !important;\r\n      scroll-snap-type: none !important;\r\n    }\r\n\r\n    .hpu-related-videos-slider > * {\r\n      width: 100% !important;\r\n      min-width: 0 !important;\r\n      flex-shrink: 0;\r\n      transform: none !important;\r\n    }\r\n\r\n    .hpu-related-videos-card,\r\n    .hpu-rv-skel {\r\n      flex: 0 0 auto !important;\r\n    }\r\n\r\n    .hpu-rv-nav { display: none; }\r\n\r\n    \/* \u2500\u2500 Tab button spacing \u2500\u2500 *\/\r\n    .hpu-video-tabs {\r\n      gap: 0;\r\n    }\r\n    .hpu-video-tab-btn {\r\n      flex: 1;\r\n      text-align: center;\r\n      padding: 10px 6px;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 767px) {\r\n    .hpu-related-videos-card,\r\n    .hpu-rv-skel {\r\n      flex: 0 0 calc(100% - 96px);\r\n    }\r\n    .hpu-related-videos::before,\r\n    .hpu-related-videos::after { width: 4px; }\r\n    .hpu-rv-nav { display: none; }\r\n\r\n    .hpu-related-videos-slider {\r\n      gap: 16px;\r\n    }\r\n    .hpu-related-videos-card-title {\r\n      font-size: 14px;\r\n    }\r\n    .wysiwyg-frame { padding: 0 10px; }\r\n  }\r\n\r\n<\/style><\/div>\n<\/article>\n","protected":false},"excerpt":{"rendered":"<p>Chapters &amp; Transcript 1 Why do High Point University graduates succeed? 0:00 My name is Grant Murray. I am from Winter Haven, Florida, and I graduated in May 2025 with a double major in finance and marketing. After graduation, I now work at Bank of New York in Lake Mary, Florida in the rotational analyst&#8230;<\/p>\n","protected":false},"author":13788,"featured_media":301,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_hpuaeo_plugin_post_data":"{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"VideoObject\",\"@id\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#video\",\"isPartOf\":{\"@id\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#webpage\"},\"name\":\"Destination Success | Grant Murray\",\"description\":\"Grant Murray, a High Point University graduate now working at Bank of New York, shares his HPU experience highlighting exceptional facilities, mentor relationships, community atmosphere, and networking opportunities like the HPU in the City program. He emphasizes the importance of student engagement through clubs, Greek life, and service initiatives, and advises students to take action early, step outside their comfort zone, and choose to be extraordinary.\",\"thumbnailUrl\":\"https:\/\/i.ytimg.com\/vi\/XRLDt7eKnQU\/maxresdefault.jpg\",\"uploadDate\":\"2026-02-25\",\"duration\":\"PT3M48S\",\"embedUrl\":\"https:\/\/www.youtube.com\/embed\/XRLDt7eKnQU\",\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/\",\"sameAs\":[\"https:\/\/www.youtube.com\/watch?v=XRLDt7eKnQU\"],\"publisher\":{\"@id\":\"https:\/\/www.highpoint.edu\/#University\"},\"transcript\":\"My name is Grant Murray. I am from Winter Haven, Florida, and I graduated in May 2025 with a double major in finance and marketing. After graduation, I now work at Bank of New York in Lake Mary, Florida in the rotational analyst program. When I first came and toured High Point University, it was me and my mom. And when we saw the freshman year dorms, my mom looked at me and said, \\\"This is not normal.\\\" And you should 100% really look into this place because I have never seen anything like it. And I saw the campus and I saw the opportunities and everybody, you know, walking and smiling and, you know, clearly I could see that people are enjoying this place and, you know, I want a part of that, too. And seeing that HPU's motto is God, family, country. I cared about that a lot because having a father as a veteran and also an uncle, you know, it's important to me. When I started, I wasn't sure what field and route I wanted to go in finance. So, I went to the career and professional development office and I met with Dr. Doug Hall, which was a huge inspiration and mentor to me. Every time I went to his office and left, I felt more confident in what I needed to do and that I actually was going to be able to land an opportunity. After perfecting my interview process, I received an offer and here we are. Another huge mentor to me was Dr. Larry Quinn. I've never seen him without a smile on his face and, you know, giving me a hug and saying, you know, how how am I doing? You know, he truly is a great person to sit down and learn from or if you're having a bad day, I would say that's the person to go to. There are so many different opportunities at High Point University to to really get that feeling of of community and and truly immerse yourself and that is what I miss the most. I definitely miss like the opportunity and availability of seeing my friends and faculty at HPU having that like small community feeling. You know, HPU has so many opportunities for the students to take advantage of. And one of them that I actually did was HPU in the city trip to New York City. And there's mentors there that go with you and essentially you get to go to the headquarters of many globally known name brand offices such as you know I went to the headquarters of Morgan Stanley got to sit down with suite execs and really dive into what their day-to-day is how to accomplish what you want to do and how to be in their shoes. You know other great opportunities that HPU offers are the clubs. I was in Greek life. I was in cap for order. I missed that a lot. We actually hold the Veterans Day event here at High Point. It's the largest Veterans Day event on a college campus. Essentially, we raise money to build these track chairs for these wounded veterans. And seeing their smile and seeing how happy they are because of what we have put in the work for for them, it really was special. And I also was part of the investment club and sales club. And I feel like, you know, those are three different opportunities and, you know, different types of clubs. But at the end of the day, you're having fun with the people that you're around. My top piece of advice is take action early. It's not just about GPA. Step out of your comfort zone. Join clubs, meet people, attend events, network, give back to the community. Try your best to, you know, just become a a completely well-rounded individual. Choose to be extraordinary to me means pushing past my own limits, hitting my goals that I've set for myself, and also just never forget the people that helped you along the way.\",\"keywords\":[\"High Point University\",\"Bank of New York\",\"Mentorship\",\"Community\",\"HPU in the City\",\"Morgan Stanley\",\"Veterans Day\",\"Career development\",\"Choose to be extraordinary\"],\"hasPart\":[{\"@type\":\"Clip\",\"name\":\"Why do High Point University graduates succeed?\",\"description\":\"Why do High Point University graduates succeed\",\"startOffset\":0,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=0\",\"transcript\":\"My name is Grant Murray. I am from Winter Haven, Florida, and I graduated in May 2025 with a double major in finance and marketing. After graduation, I now work at Bank of New York in Lake Mary, Florida in the rotational analyst program.\",\"endOffset\":25},{\"@type\":\"Clip\",\"name\":\"What are dorms like at High Point University?\",\"description\":\"What are dorms like at High Point University\",\"startOffset\":25,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=25\",\"transcript\":\"When I first came and toured High Point University, it was me and my mom. And when we saw the freshman year dorms, my mom looked at me and said, 'This is not normal.' And you should 100% really look into this place because I have never seen anything like it. And I saw the campus and I saw the opportunities and everybody, you know, walking and smiling and, you know, clearly I could see that people are enjoying this place and, you know, I want a part of that, too.\",\"endOffset\":51},{\"@type\":\"Clip\",\"name\":\"What is the High Point University motto?\",\"description\":\"What is the High Point University motto\",\"startOffset\":51,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=51\",\"transcript\":\"And seeing that HPU's motto is God, family, country. I cared about that a lot because having a father as a veteran and also an uncle, you know, it's important to me.\",\"endOffset\":61},{\"@type\":\"Clip\",\"name\":\"How does High Point University help students find jobs?\",\"description\":\"How does High Point University help students find jobs\",\"startOffset\":61,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=61\",\"transcript\":\"When I started, I wasn't sure what field and route I wanted to go in finance. So, I went to the career and professional development office and I met with Dr. Doug Hall, which was a huge inspiration and mentor to me. Every time I went to his office and left, I felt more confident in what I needed to do and that I actually was going to be able to land an opportunity. After perfecting my interview process, I received an offer and here we are.\",\"endOffset\":86},{\"@type\":\"Clip\",\"name\":\"How do High Point University professors mentor students?\",\"description\":\"How do High Point University professors mentor students\",\"startOffset\":86,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=86\",\"transcript\":\"Another huge mentor to me was Dr. Larry Quinn. I've never seen him without a smile on his face and, you know, giving me a hug and saying, you know, how am I doing? You know, he truly is a great person to sit down and learn from or if you're having a bad day, I would say that's the person to go to.\",\"endOffset\":104},{\"@type\":\"Clip\",\"name\":\"What is the High Point University community like?\",\"description\":\"What is the High Point University community like\",\"startOffset\":104,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=104\",\"transcript\":\"There are so many different opportunities at High Point University to really get that feeling of community and truly immerse yourself and that is what I miss the most. I definitely miss like the opportunity and availability of seeing my friends and faculty at HPU having that like small community feeling.\",\"endOffset\":123},{\"@type\":\"Clip\",\"name\":\"What is the HPU in the City networking program?\",\"description\":\"What is the HPU in the City networking program\",\"startOffset\":123,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=123\",\"transcript\":\"You know, HPU has so many opportunities for the students to take advantage of. And one of them that I actually did was HPU in the city trip to New York City. And there's mentors there that go with you and essentially you get to go to the headquarters of many globally known name brand offices such as you know I went to the headquarters of Morgan Stanley got to sit down with suite execs and really dive into what their day-to-day is how to accomplish what you want to do and how to be in their shoes.\",\"endOffset\":150},{\"@type\":\"Clip\",\"name\":\"Does High Point University have Greek life?\",\"description\":\"Does High Point University have Greek life\",\"startOffset\":150,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=150\",\"transcript\":\"You know other great opportunities that HPU offers are the clubs. I was in Greek life. I was in cap for order. I missed that a lot.\",\"endOffset\":158},{\"@type\":\"Clip\",\"name\":\"How does High Point University honor military veterans?\",\"description\":\"How does High Point University honor military veterans\",\"startOffset\":158,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=158\",\"transcript\":\"We actually hold the Veterans Day event here at High Point. It's the largest Veterans Day event on a college campus. Essentially, we raise money to build these track chairs for these wounded veterans. And seeing their smile and seeing how happy they are because of what we have put in the work for them, it really was special. And I also was part of the investment club and sales club. And I feel like, you know, those are three different opportunities and, you know, different types of clubs. But at the end of the day, you're having fun with the people that you're around.\",\"endOffset\":190},{\"@type\":\"Clip\",\"name\":\"What is the best career advice for college students?\",\"description\":\"What is the best career advice for college students\",\"startOffset\":190,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=190\",\"transcript\":\"My top piece of advice is take action early. It's not just about GPA. Step out of your comfort zone. Join clubs, meet people, attend events, network, give back to the community. Try your best to, you know, just become a completely well-rounded individual.\",\"endOffset\":207},{\"@type\":\"Clip\",\"name\":\"What does it mean to choose to be extraordinary?\",\"description\":\"What does it mean to choose to be extraordinary\",\"startOffset\":207,\"url\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#t=207\",\"transcript\":\"Choose to be extraordinary to me means pushing past my own limits, hitting my goals that I've set for myself, and also just never forget the people that helped you along the way.\",\"endOffset\":228}]},{\"@type\":\"FAQPage\",\"@id\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#faqpage\",\"isPartOf\":{\"@id\":\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#webpage\"},\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Why do High Point University graduates succeed?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"My name is Grant Murray. I am from Winter Haven, Florida, and I graduated in May 2025 with a double major in finance and marketing. After graduation, I now work at Bank of New York in Lake Mary, Florida in the rotational analyst program.\"}},{\"@type\":\"Question\",\"name\":\"What are dorms like at High Point University?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"When I first came and toured High Point University, it was me and my mom. And when we saw the freshman year dorms, my mom looked at me and said, 'This is not normal.' And you should 100% really look into this place because I have never seen anything like it. And I saw the campus and I saw the opportunities and everybody, you know, walking and smiling and, you know, clearly I could see that people are enjoying this place and, you know, I want a part of that, too.\"}},{\"@type\":\"Question\",\"name\":\"What is the High Point University motto?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"And seeing that HPU's motto is God, family, country. I cared about that a lot because having a father as a veteran and also an uncle, you know, it's important to me.\"}},{\"@type\":\"Question\",\"name\":\"How does High Point University help students find jobs?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"When I started, I wasn't sure what field and route I wanted to go in finance. So, I went to the career and professional development office and I met with Dr. Doug Hall, which was a huge inspiration and mentor to me. Every time I went to his office and left, I felt more confident in what I needed to do and that I actually was going to be able to land an opportunity. After perfecting my interview process, I received an offer and here we are.\"}},{\"@type\":\"Question\",\"name\":\"How do High Point University professors mentor students?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Another huge mentor to me was Dr. Larry Quinn. I've never seen him without a smile on his face and, you know, giving me a hug and saying, you know, how am I doing? You know, he truly is a great person to sit down and learn from or if you're having a bad day, I would say that's the person to go to.\"}},{\"@type\":\"Question\",\"name\":\"What is the High Point University community like?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"There are so many different opportunities at High Point University to really get that feeling of community and truly immerse yourself and that is what I miss the most. I definitely miss like the opportunity and availability of seeing my friends and faculty at HPU having that like small community feeling.\"}},{\"@type\":\"Question\",\"name\":\"What is the HPU in the City networking program?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"You know, HPU has so many opportunities for the students to take advantage of. And one of them that I actually did was HPU in the city trip to New York City. And there's mentors there that go with you and essentially you get to go to the headquarters of many globally known name brand offices such as you know I went to the headquarters of Morgan Stanley got to sit down with suite execs and really dive into what their day-to-day is how to accomplish what you want to do and how to be in their shoes.\"}},{\"@type\":\"Question\",\"name\":\"Does High Point University have Greek life?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"You know other great opportunities that HPU offers are the clubs. I was in Greek life. I was in cap for order. I missed that a lot.\"}},{\"@type\":\"Question\",\"name\":\"How does High Point University honor military veterans?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"We actually hold the Veterans Day event here at High Point. It's the largest Veterans Day event on a college campus. Essentially, we raise money to build these track chairs for these wounded veterans. And seeing their smile and seeing how happy they are because of what we have put in the work for them, it really was special. And I also was part of the investment club and sales club. And I feel like, you know, those are three different opportunities and, you know, different types of clubs. But at the end of the day, you're having fun with the people that you're around.\"}},{\"@type\":\"Question\",\"name\":\"What is the best career advice for college students?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"My top piece of advice is take action early. It's not just about GPA. Step out of your comfort zone. Join clubs, meet people, attend events, network, give back to the community. Try your best to, you know, just become a completely well-rounded individual.\"}},{\"@type\":\"Question\",\"name\":\"What does it mean to choose to be extraordinary?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Choose to be extraordinary to me means pushing past my own limits, hitting my goals that I've set for myself, and also just never forget the people that helped you along the way.\"}}]}]}","_hpuaeo_plugin_meta_tags":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[2],"tags":[4,3],"class_list":["post-139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hpu-videos","tag-alumni-spotlights","tag-business-finance"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.9 (Yoast SEO v27.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Destination Success | Grant Murray | Watch HPU<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Destination Success | Grant Murray | Watch HPU\" \/>\n<meta name=\"twitter:description\" content=\"Chapters &amp; Transcript 1 Why do High Point University graduates succeed? 0:00 My name is Grant Murray. I am from Winter Haven, Florida, and I graduated in May 2025 with a double major in finance and marketing. After graduation, I now work at Bank of New York in Lake Mary, Florida in the rotational analyst...\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.highpoint.edu\/watch\/files\/2026\/05\/destination-success-grant-murray.jpg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"aeobot\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/\"},\"author\":{\"name\":\"aeobot\",\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/#\\\/schema\\\/person\\\/0f62f0c5c689c6a208cbc696466175f8\"},\"headline\":\"Destination Success | Grant Murray\",\"datePublished\":\"2026-05-06T19:24:45+00:00\",\"dateModified\":\"2026-05-11T15:13:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/\"},\"wordCount\":876,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/files\\\/2026\\\/05\\\/destination-success-grant-murray.jpg\",\"keywords\":[\"Alumni Spotlights\",\"Business &amp; Finance\"],\"articleSection\":[\"HPU Videos\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#respond\"]}],\"publisher\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/#University\"},\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/\",\"url\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/\",\"name\":\"Destination Success | Grant Murray | Watch HPU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/files\\\/2026\\\/05\\\/destination-success-grant-murray.jpg\",\"datePublished\":\"2026-05-06T19:24:45+00:00\",\"dateModified\":\"2026-05-11T15:13:39+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/#\\\/schema\\\/person\\\/0f62f0c5c689c6a208cbc696466175f8\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/\"]}],\"publisher\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/#University\"}},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/files\\\/2026\\\/05\\\/destination-success-grant-murray.jpg\",\"contentUrl\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/files\\\/2026\\\/05\\\/destination-success-grant-murray.jpg\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Destination Success | Grant Murray\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/#website\",\"url\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/\",\"name\":\"Watch HPU\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/#University\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/#\\\/schema\\\/person\\\/0f62f0c5c689c6a208cbc696466175f8\",\"name\":\"aeobot\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a47823927b1f146f27e8fb23ab760191ad6f9660023944ab144ff01c5135251d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a47823927b1f146f27e8fb23ab760191ad6f9660023944ab144ff01c5135251d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a47823927b1f146f27e8fb23ab760191ad6f9660023944ab144ff01c5135251d?s=96&d=mm&r=g\",\"caption\":\"aeobot\"},\"url\":\"https:\\\/\\\/www.highpoint.edu\\\/watch\\\/author\\\/aeobot\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Destination Success | Grant Murray | Watch HPU","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/","twitter_card":"summary_large_image","twitter_title":"Destination Success | Grant Murray | Watch HPU","twitter_description":"Chapters &amp; Transcript 1 Why do High Point University graduates succeed? 0:00 My name is Grant Murray. I am from Winter Haven, Florida, and I graduated in May 2025 with a double major in finance and marketing. After graduation, I now work at Bank of New York in Lake Mary, Florida in the rotational analyst...","twitter_image":"https:\/\/www.highpoint.edu\/watch\/files\/2026\/05\/destination-success-grant-murray.jpg","twitter_misc":{"Written by":"aeobot","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#article","isPartOf":{"@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/"},"author":{"name":"aeobot","@id":"https:\/\/www.highpoint.edu\/watch\/#\/schema\/person\/0f62f0c5c689c6a208cbc696466175f8"},"headline":"Destination Success | Grant Murray","datePublished":"2026-05-06T19:24:45+00:00","dateModified":"2026-05-11T15:13:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/"},"wordCount":876,"commentCount":0,"image":{"@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#primaryimage"},"thumbnailUrl":"https:\/\/www.highpoint.edu\/watch\/files\/2026\/05\/destination-success-grant-murray.jpg","keywords":["Alumni Spotlights","Business &amp; Finance"],"articleSection":["HPU Videos"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#respond"]}],"publisher":{"@id":"https:\/\/www.highpoint.edu\/#University"},"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/www.highpoint.edu\/#organization"}},{"@type":"WebPage","@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/","url":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/","name":"Destination Success | Grant Murray | Watch HPU","isPartOf":{"@id":"https:\/\/www.highpoint.edu\/watch\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#primaryimage"},"image":{"@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#primaryimage"},"thumbnailUrl":"https:\/\/www.highpoint.edu\/watch\/files\/2026\/05\/destination-success-grant-murray.jpg","datePublished":"2026-05-06T19:24:45+00:00","dateModified":"2026-05-11T15:13:39+00:00","author":{"@id":"https:\/\/www.highpoint.edu\/watch\/#\/schema\/person\/0f62f0c5c689c6a208cbc696466175f8"},"breadcrumb":{"@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/"]}],"publisher":{"@id":"https:\/\/www.highpoint.edu\/#University"}},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#primaryimage","url":"https:\/\/www.highpoint.edu\/watch\/files\/2026\/05\/destination-success-grant-murray.jpg","contentUrl":"https:\/\/www.highpoint.edu\/watch\/files\/2026\/05\/destination-success-grant-murray.jpg","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/www.highpoint.edu\/watch\/grant-murray-bank-of-new-york-rotational-analyst-hpu-finance-alum\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.highpoint.edu\/watch\/"},{"@type":"ListItem","position":2,"name":"Destination Success | Grant Murray"}]},{"@type":"WebSite","@id":"https:\/\/www.highpoint.edu\/watch\/#website","url":"https:\/\/www.highpoint.edu\/watch\/","name":"Watch HPU","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.highpoint.edu\/watch\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US","publisher":{"@id":"https:\/\/www.highpoint.edu\/#University"}},{"@type":"Person","@id":"https:\/\/www.highpoint.edu\/watch\/#\/schema\/person\/0f62f0c5c689c6a208cbc696466175f8","name":"aeobot","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a47823927b1f146f27e8fb23ab760191ad6f9660023944ab144ff01c5135251d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a47823927b1f146f27e8fb23ab760191ad6f9660023944ab144ff01c5135251d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a47823927b1f146f27e8fb23ab760191ad6f9660023944ab144ff01c5135251d?s=96&d=mm&r=g","caption":"aeobot"},"url":"https:\/\/www.highpoint.edu\/watch\/author\/aeobot\/"}]}},"_links":{"self":[{"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/posts\/139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/users\/13788"}],"replies":[{"embeddable":true,"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/comments?post=139"}],"version-history":[{"count":0,"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/posts\/139\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/media\/301"}],"wp:attachment":[{"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/media?parent=139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/categories?post=139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.highpoint.edu\/watch\/wp-json\/wp\/v2\/tags?post=139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}