

Depending on who you ask, the Macy’s Thanksgiving Day Parade is either pure holiday magic or three hours of televised torment. Truly a choose-your-own-adventure situation that remains a deeply rooted part of Thanksgiving tradition regardless of where you land on the topic.This year’s parade actually delivered some solid entertainment, especially if you’re an elder millennial. We got performances from Busta Rhymes, Lil Jon, and Shaggy — basically the soundtrack of every early-2000s house party. And for Gen Z and Gen Alpha, the parade threw in a K-pop Demon Hunter performance, so everyone got at least one moment to yell, \"Oh my god, I know them!\"However, the thing that caught everyone by surprise was the appearance of Mr. Fantasy — KJ Apa’s chaotic, wig-wearing TikTok alter ego — materializing at the Macy’s Parade like a fever dream come to life.Thus, it's been a great time for social media.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\nWithout the full backstory behind Apa’s alter ego, many viewers were not thrilled to see Mr. Fantasy haunting their Thanksgiving morning. But hey, at least Busta Rhymes is here.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\n This Tweet is currently unavailable. It might be loading or has been removed.\n\n let cbeScripts = {\"twitterEmbed\":[\"https:\\/\\/platform.twitter.com\\/widgets.js\"]};\n let cbeScriptObserver = function (nodeType, scriptsArr) {\n let firstElem = document.querySelector('.' + nodeType)\n let self = this\n\n if (firstElem == null) {\n console.warn(`CBE cannot find element with class .${nodeType} for script observer.`)\n\n scriptsArr.forEach((scriptSrc) => {\n const linkEl = document.createElement('link')\n linkEl.rel = 'dns-prefetch'\n linkEl.href = scriptSrc\n document.head.append(linkEl)\n\n window[nodeType + 'Loaded'] = false\n\n this.embedObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && window[nodeType + 'Loaded'] === false) {\n scriptsArr.forEach((scriptSrc) => {\n const el = document.createElement('script')\n el.src = scriptSrc\n el.async = true\n document.head.append(el);\n\n window[nodeType + 'Loaded'] = true\n self.embedObserver.disconnect()\n\n }, {root: null, rootMargin: '750px'})\n this.embedObserver.observe(firstElem)\n\n for (const item in cbeScripts) {\n new cbeScriptObserver(item, cbeScripts[item])