{
  "version": 3,
  "sources": ["/cdn/shop/t/21/assets/learn-guides.js?build=20260628-blog-guides-2"],
  "sourcesContent": ["(() => {\n  const EDITORIAL_GUIDES = [\n    {\n      slug: \"double-cleanse\",\n      title: \"The double cleanse, demystified\",\n      category: \"Skincare 101\",\n      summary: \"Why two cleansers beat one, how to layer an oil balm with a gel wash, and the order that finally cleared our skin.\",\n      readTime: \"5 min read\",\n      image: \"cleanse-ritual.png\",\n      intro:\n        \"If you only change one thing about your routine this year, make it this. Double cleansing is the quiet upgrade that makes everything you apply afterward \u2014 serums, moisturizers, treatments \u2014 actually work. Here is the whole method, minus the jargon.\",\n      sections: [\n        {\n          heading: 'What \"double cleansing\" actually means',\n          body: [\n            \"Double cleansing is exactly what it sounds like: you wash your face twice, with two different kinds of cleanser. The first is oil-based and dissolves everything oil-based \u2014 sunscreen, makeup, sebum, the grime of the day. The second is water-based and clears away sweat, dead skin and whatever the first one loosened.\",\n            \"One cleanser asks a single product to do two opposite jobs, so it either leaves a film behind or strips your skin raw trying to get everything off. Two cleansers, each doing the job it is built for, leave skin genuinely clean and still comfortable.\"\n          ]\n        },\n        {\n          heading: \"Step one \u2014 melt it away with a balm\",\n          body: [\n            \"Start on dry skin with a balm or oil cleanser. Warm a small scoop between dry fingers and massage it over dry skin for a full minute. It will turn silky and lift sunscreen and makeup off without any tugging. Add a splash of warm water to emulsify, then rinse.\",\n            \"Take your time along the jaw, hairline and the sides of the nose \u2014 that is where the day quietly collects.\"\n          ],\n          tip: \"Massaging dry balm into dry skin is the part most people rush. Sixty unhurried seconds here is what makes the difference.\",\n          spotlights: [\n            {\n              handle: \"routeine-first-melt-calming-balm-cleanser\",\n              note: \"A buttery first-step balm that melts on contact to dissolve SPF, makeup and pollution \u2014 without stripping.\"\n            }\n          ]\n        },\n        {\n          heading: \"Step two \u2014 reset with a gel wash\",\n          body: [\n            \"Now go in with a water-based gel cleanser on damp skin. This is the step that clears what the balm lifted and rebalances your skin's pH. Lather one pump between your palms, massage over damp skin for thirty seconds, and rinse with lukewarm \u2014 never hot \u2014 water.\",\n            \"Pat dry with a clean towel rather than rubbing, and move straight into your serums while skin is still slightly damp.\"\n          ],\n          spotlights: [\n            {\n              handle: \"routeine-activated-charcoal-cleanser\",\n              note: \"A pH-balanced gel with activated charcoal \u2014 the perfect second step to clarify without over-drying.\"\n            }\n          ]\n        },\n        {\n          heading: \"The shortcut: both steps in one set\",\n          body: [\n            \"If buying two products feels like a lot, start with a matched duo. Having the balm and the gel designed to work together takes the guesswork out \u2014 you know the order, the amounts and that they will not fight each other.\"\n          ],\n          spotlights: [\n            {\n              handle: \"the-routeine-box\",\n              note: \"The high-conviction ROUTEine ritual if you want cleansing to live inside a full morning-and-night routine.\"\n            },\n            {\n              handle: \"home-cleansing-kit\",\n              note: \"Everything you need for the full at-home cleanse, bundled into one starter set.\"\n            }\n          ]\n        },\n        {\n          heading: \"Small things that make it stick\",\n          body: [\n            \"A few unglamorous extras turn double cleansing from a chore into a ritual you keep. A dedicated face towel that you actually change keeps bacteria off freshly cleaned skin, and a reusable makeup-erasing cloth handles eye makeup gently before you even start.\"\n          ],\n          spotlights: [\n            {\n              handle: \"makeup-erasing-towel-7-day-set\",\n              note: \"A reusable, machine-washable cloth that takes off makeup with just water before your first cleanse.\"\n            }\n          ],\n          tip: \"Keep step two for both AM and PM, but you only need the balm at night \u2014 mornings rarely have makeup or SPF to dissolve.\"\n        }\n      ],\n      products: [\n        \"routeine-first-melt-calming-balm-cleanser\",\n        \"routeine-activated-charcoal-cleanser\",\n        \"the-routeine-box\",\n        \"home-cleansing-kit\",\n        \"makeup-erasing-towel-7-day-set\"\n      ],\n      relatedCollection: {\n        slug: \"face-care\",\n        label: \"Shop all Face Care\",\n        url: \"/collections/face-care\"\n      }\n    },\n    {\n      slug: \"red-light-therapy\",\n      title: \"A beginner's guide to red light therapy\",\n      category: \"Light Therapy\",\n      summary: \"What red and near-infrared light actually do for skin and recovery, plus how to fit a panel or mask into your week.\",\n      readTime: \"6 min read\",\n      image: \"wellness-room-recovery.png\",\n      intro:\n        \"Red light therapy has gone from elite recovery rooms to bathroom counters \u2014 and for good reason. Here is what the light actually does, how to choose between a mask and a panel, and how to use it so you see results without overthinking it.\",\n      sections: [\n        {\n          heading: \"What red light actually does\",\n          body: [\n            \"Red and near-infrared light are specific wavelengths your cells absorb and turn into energy. In skin, that extra energy supports the fibroblasts that make collagen, which is why people reach for it to soften fine lines and even out tone. In muscle and joints, it is used to ease soreness and speed recovery.\",\n            \"It is not a magic wand \u2014 it is a consistency game. Short sessions a few times a week, over weeks, are where the visible payoff lives.\"\n          ]\n        },\n        {\n          heading: \"Red vs. near-infrared\",\n          body: [\n            \"Red light (roughly 630\u2013660nm) works closer to the surface, so it is the one associated with skin tone, texture and a healthy glow. Near-infrared (around 810\u2013850nm) is invisible and travels deeper, which is why it shows up in recovery and muscle-relief tools. Many quality devices combine both so you get surface and depth in one session.\"\n          ]\n        },\n        {\n          heading: \"Choosing your first device \u2014 face\",\n          body: [\n            \"If skin is your goal, start small and hands-free. A flexible LED mask wraps the whole face so you can wear it while you do something else, and a targeted wand or device lets you spot-treat. Even light-therapy glasses have a place if your focus is the delicate eye area.\"\n          ],\n          spotlights: [\n            {\n              handle: \"led-flex-mask\",\n              note: \"A flexible, full-face LED mask \u2014 the easiest hands-free way to start a skin-focused routine.\"\n            },\n            {\n              handle: \"hadaka-illumen-face-photon-thermal-skin-revitalizing-device\",\n              note: \"A photon thermal facial device for targeted treatment when you want to focus on specific zones.\"\n            },\n            {\n              handle: \"led-red-light-therapy-glasses\",\n              note: \"Purpose-built for the delicate eye area, where a full panel is hard to aim.\"\n            }\n          ]\n        },\n        {\n          heading: \"Going bigger \u2014 panels for face and body\",\n          body: [\n            \"Once you want recovery as well as skin benefits, a panel covers more ground. A flexible-stand panel is the flexible starting point; a full elite panel delivers stronger, full-body sessions for muscles, joints and skin at once.\"\n          ],\n          spotlights: [\n            {\n              handle: \"led-flex-panel-lamp-with-stand\",\n              note: \"A red light panel on an adjustable stand \u2014 the versatile step up from a mask.\"\n            },\n            {\n              handle: \"kala-red-light-elite-panel\",\n              note: \"A full-size elite panel for serious full-body skin and recovery sessions at home.\"\n            },\n            {\n              handle: \"trifold-led-photo-therapy-7-color-s-table\",\n              note: \"A trifold panel with seven light cycles if you want to experiment beyond red alone.\"\n            }\n          ]\n        },\n        {\n          heading: \"How to fit it into your week\",\n          body: [\n            \"Aim for ten to fifteen minutes per area, three to five times a week, on clean bare skin (light cannot do much through makeup or thick cream). Pick a time you already pause \u2014 your morning coffee, an evening podcast \u2014 and let the device do its thing.\"\n          ],\n          steps: [\n            \"Cleanse first so light reaches bare skin.\",\n            \"Position the device 15\u201330cm away (follow your device's guidance).\",\n            \"Run 10\u201315 minutes per area, eyes closed or protected.\",\n            \"Apply serums and moisturizer right after, while skin is primed.\"\n          ],\n          tip: \"Consistency beats intensity. Three short sessions you actually do every week will always beat one long one you keep skipping.\"\n        }\n      ],\n      products: [\n        \"led-flex-mask\",\n        \"hadaka-illumen-face-photon-thermal-skin-revitalizing-device\",\n        \"led-red-light-therapy-glasses\",\n        \"led-flex-panel-lamp-with-stand\",\n        \"kala-red-light-elite-panel\",\n        \"trifold-led-photo-therapy-7-color-s-table\"\n      ],\n      relatedCollection: {\n        slug: \"led-light-therapy\",\n        label: \"Shop Red Light & LED\",\n        url: \"/collections/led-light-therapy\"\n      }\n    },\n    {\n      slug: \"gua-sha\",\n      title: \"How to gua sha (without the guesswork)\",\n      category: \"Tools & Rituals\",\n      summary: \"A simple, repeatable sequence to sculpt, de-puff and relax \u2014 with the pressure and angles that make a difference.\",\n      readTime: \"5 min read\",\n      image: \"gua-sha-use.png\",\n      intro:\n        \"A gua sha tool is one of the most rewarding five-dollar-feeling rituals you can add \u2014 but only if you use it right. Here is the no-guesswork sequence, the pressure that actually works, and the tools worth reaching for.\",\n      sections: [\n        {\n          heading: \"What gua sha does\",\n          body: [\n            \"Gua sha is a smooth-edged tool you glide across the face to encourage lymphatic drainage, release the tension we hold in the jaw and brow, and leave skin looking lifted and less puffy. It will not change your bone structure, but used regularly it visibly de-puffs and relaxes \u2014 and it feels wonderful.\"\n          ]\n        },\n        {\n          heading: \"The non-negotiable: always use slip\",\n          body: [\n            \"Never drag a tool across dry skin. Apply a facial oil or a generous layer of moisturizer first so the stone glides instead of tugs. Dragging dry skin is how you cause irritation, not contour.\"\n          ],\n          tip: \"Chill your gua sha in the fridge for ten minutes before a morning session \u2014 the cold gives you bonus de-puffing.\"\n        },\n        {\n          heading: \"The five-step sequence\",\n          body: [\n            \"Hold the tool almost flat against your skin \u2014 about a 15-degree angle \u2014 with light, steady pressure. Sweep upward and outward, and do five to eight strokes per zone before moving on.\"\n          ],\n          steps: [\n            \"Neck: sweep downward from jaw to collarbone to open the drainage path first.\",\n            \"Jaw: glide from chin out toward the ear along the jawbone.\",\n            \"Cheeks: sweep from the side of the nose out toward the temple.\",\n            \"Brow & forehead: move from the brow up toward the hairline.\",\n            \"Finish: return to the neck with a few downward strokes to drain.\"\n          ]\n        },\n        {\n          heading: \"Choosing your tool\",\n          body: [\n            \"A classic flat gua sha is all you need to start, and crystal versions feel beautiful in the hand. If you prefer rolling to scraping, a facial roller covers the same drainage work with less technique, and an ice roller is the fastest morning de-puff there is.\"\n          ],\n          spotlights: [\n            {\n              handle: \"humanity-cosmetics-crystal-gua-sha\",\n              note: \"A classic crystal gua sha \u2014 the simplest, most affordable way to start the ritual.\"\n            },\n            {\n              handle: \"hadaka-wandlove-rose-quartz-face-roller\",\n              note: \"A rose quartz roller for those who prefer rolling to scraping.\"\n            },\n            {\n              handle: \"glacial-glow-ice-facial-roller\",\n              note: \"A stainless ice roller \u2014 the fastest possible morning de-puff straight from the freezer.\"\n            }\n          ]\n        },\n        {\n          heading: \"When you want to go further\",\n          body: [\n            \"Once the basics feel natural, powered tools take it up a level. A microcurrent-and-radio-frequency massager adds gentle stimulation for firmness, and a facial cupping kit lifts and boosts circulation in a different way than scraping does.\"\n          ],\n          spotlights: [\n            {\n              handle: \"facial-massager-with-micro-current-radio-frequency\",\n              note: \"Adds microcurrent and radio frequency for a firmer, more sculpted finish.\"\n            },\n            {\n              handle: \"dear-derm-facial-cupping-therapy-kit\",\n              note: \"Facial cupping to lift and stimulate circulation \u2014 a complement to gua sha, not a replacement.\"\n            }\n          ]\n        }\n      ],\n      products: [\n        \"humanity-cosmetics-crystal-gua-sha\",\n        \"hadaka-wandlove-rose-quartz-face-roller\",\n        \"glacial-glow-ice-facial-roller\",\n        \"facial-massager-with-micro-current-radio-frequency\",\n        \"dear-derm-facial-cupping-therapy-kit\"\n      ],\n      relatedCollection: {\n        slug: \"beauty-tools\",\n        label: \"Shop Beauty Tools & Accessories\",\n        url: \"/collections/beauty-tools\"\n      }\n    },\n    {\n      slug: \"body-care-ritual\",\n      title: \"Building a body-care ritual you'll keep\",\n      category: \"Body Care\",\n      summary: \"Scrub, butter, oil \u2014 the three steps that turn a rushed shower into the most grounding part of your day.\",\n      readTime: \"4 min read\",\n      image: \"am-ritual.png\",\n      intro:\n        \"We pour attention into our faces and treat the rest of the body like an afterthought. A body-care ritual does not need to be elaborate \u2014 three steps, done consistently, are enough to make your skin softer and your shower the calmest part of the day.\",\n      sections: [\n        {\n          heading: \"Why most body routines fail\",\n          body: [\n            \"They fail because they are too complicated, or because the products feel like a punishment. The fix is to keep it to three steps \u2014 exfoliate, nourish, seal \u2014 and to choose textures you genuinely look forward to. Pleasure is what makes a routine repeatable.\"\n          ]\n        },\n        {\n          heading: \"Step one \u2014 exfoliate, twice a week\",\n          body: [\n            \"A good scrub clears dead skin so everything after it absorbs, and it is the step that makes butters and oils actually work. Twice a week is plenty \u2014 over-scrubbing does more harm than good.\"\n          ],\n          spotlights: [\n            {\n              handle: \"innersense-inner-glow-body-scrub\",\n              note: \"A clean, glow-giving body scrub that buffs without stripping.\"\n            },\n            {\n              handle: \"coffee-body-scrub-go-simple-naturals\",\n              note: \"A small-batch coffee scrub for an invigorating, whole-ingredient option.\"\n            }\n          ]\n        },\n        {\n          heading: \"Step two \u2014 nourish on damp skin\",\n          body: [\n            \"Right out of the shower, while skin is still damp, is the moment to lock in moisture. A rich body butter or a whole-ingredient tallow balm sinks in far better now than on bone-dry skin an hour later.\"\n          ],\n          spotlights: [\n            {\n              handle: \"innersense-blissful-body-butter\",\n              note: \"A blissful, deeply hydrating butter that melts into damp skin.\"\n            },\n            {\n              handle: \"tallow-balm-go-simple-naturals\",\n              note: \"A whole-ingredient tallow balm \u2014 a Diana favorite for very dry skin.\"\n            }\n          ],\n          tip: \"Apply within three minutes of getting out of the shower. That short window is when your skin drinks in the most.\"\n        },\n        {\n          heading: \"Step three \u2014 seal and stimulate\",\n          body: [\n            \"A dry brush before you shower wakes up circulation and preps skin to absorb, and it doubles as a daily moment of intention. It is the cheapest upgrade in the whole ritual.\"\n          ],\n          spotlights: [\n            {\n              handle: \"hadaka-sissi-sisal-body-brush\",\n              note: \"A natural sisal dry brush \u2014 use on dry skin before showering to boost circulation.\"\n            }\n          ]\n        },\n        {\n          heading: \"Make it stick\",\n          body: [\n            \"Keep the scrub in the shower, the butter where you dry off, and the brush on a hook you pass every day. The easier a ritual is to reach, the more likely you are to keep it. Within two weeks it stops feeling like a routine and starts feeling like yours.\"\n          ]\n        }\n      ],\n      products: [\n        \"innersense-inner-glow-body-scrub\",\n        \"coffee-body-scrub-go-simple-naturals\",\n        \"innersense-blissful-body-butter\",\n        \"tallow-balm-go-simple-naturals\",\n        \"hadaka-sissi-sisal-body-brush\"\n      ],\n      relatedCollection: {\n        slug: \"body-care\",\n        label: \"Shop all Body Care\",\n        url: \"/collections/body-care\"\n      }\n    },\n    {\n      slug: \"clean-ingredients\",\n      title: \"Clean ingredients: what to look for\",\n      category: \"Ingredients\",\n      summary: \"A plain-language cheat sheet for reading labels \u2014 the actives worth seeking, and the fillers worth skipping.\",\n      readTime: \"7 min read\",\n      image: \"hero-shelf.png\",\n      intro:\n        '\"Clean\" has become a marketing word with no fixed meaning. Rather than chase a label, it helps to know what a handful of proven ingredients actually do \u2014 and which fillers add nothing. Here is the cheat sheet we use ourselves.',\n      sections: [\n        {\n          heading: 'Why \"clean\" is confusing',\n          body: [\n            'There is no legal definition of \"clean\" or \"natural\" in skincare, so brands use them however they like. A more useful question than \"is this clean?\" is \"what is in here, and does it earn its place?\" Once you can read a few key actives, the marketing noise fades into the background.'\n          ]\n        },\n        {\n          heading: \"Actives worth seeking\",\n          body: [\n            \"A short list of well-studied ingredients does most of the heavy lifting. Niacinamide calms redness and strengthens the skin barrier. Vitamin C brightens and protects against daily environmental stress. Hyaluronic acid holds water in the skin for plumper, smoother texture. You do not need all of them at once \u2014 but these are the names worth recognizing.\"\n          ],\n          spotlights: [\n            {\n              handle: \"routeine-niacinamide-serum-5\",\n              note: \"Niacinamide at a gentle, effective 5% \u2014 for redness, pores and barrier support.\"\n            },\n            {\n              handle: \"routeine-vitamin-c-serum\",\n              note: \"A brightening vitamin C serum for tone and daytime antioxidant protection.\"\n            },\n            {\n              handle: \"routeine-hyaluronic-acid-serum-2\",\n              note: \"Hyaluronic acid to draw and hold moisture for plumper-looking skin.\"\n            }\n          ]\n        },\n        {\n          heading: \"Fillers worth skipping\",\n          body: [\n            'High-up synthetic fragrance is the most common irritant in an otherwise good product \u2014 if \"fragrance/parfum\" sits near the top of the list and your skin is reactive, be cautious. Long lists of fillers and dyes rarely add benefit; they are there for color, scent or shelf appeal. Shorter, recognizable ingredient lists are usually a good sign.'\n          ],\n          tip: \"Ingredients are listed in order of concentration. The first five tell you most of the story; everything after them is usually present in tiny amounts.\"\n        },\n        {\n          heading: \"Whole-ingredient brands we trust\",\n          body: [\n            \"Some of the cleanest products are also the simplest. Whole-ingredient lines \u2014 tallow balms, plant-oil cleansers \u2014 keep their lists short on purpose, which makes them easy to vet and gentle on reactive skin.\"\n          ],\n          spotlights: [\n            {\n              handle: \"tallow-balm-go-simple-naturals\",\n              note: \"A short-ingredient tallow balm \u2014 about as simple and recognizable as a label gets.\"\n            },\n            {\n              handle: \"wildcraft-cleanse-makeup-remover\",\n              note: \"A plant-based makeup remover with a clean, easy-to-read formula.\"\n            }\n          ]\n        },\n        {\n          heading: \"How to read a label in ten seconds\",\n          body: [\"You do not need a chemistry degree \u2014 just a quick scan.\"],\n          steps: [\n            \"Look at the first five ingredients \u2014 that is most of the formula.\",\n            \"Spot an active you recognize (niacinamide, vitamin C, hyaluronic acid).\",\n            'Check where \"fragrance/parfum\" sits if your skin is sensitive.',\n            \"Be wary of very long lists that are mostly fillers and dyes.\",\n            \"When in doubt, simpler and shorter usually wins.\"\n          ]\n        }\n      ],\n      products: [\n        \"routeine-niacinamide-serum-5\",\n        \"routeine-vitamin-c-serum\",\n        \"routeine-hyaluronic-acid-serum-2\",\n        \"tallow-balm-go-simple-naturals\",\n        \"wildcraft-cleanse-makeup-remover\"\n      ],\n      relatedCollection: {\n        slug: \"face-care\",\n        label: \"Shop all Face Care\",\n        url: \"/collections/face-care\"\n      }\n    },\n    {\n      slug: \"total-wellness\",\n      title: \"Total wellness: grounding, rest & recovery\",\n      category: \"Wellness\",\n      summary: \"Beyond skincare \u2014 how saunas, grounding and intentional rest support your nervous system and your glow.\",\n      readTime: \"5 min read\",\n      image: \"diana-couch.jpeg\",\n      intro:\n        \"Real glow starts under the skin \u2014 in how you sleep, recover and regulate stress. These are the wellness practices we keep coming back to, and the tools that make each one easier to actually do at home.\",\n      sections: [\n        {\n          heading: \"Glow is a whole-body project\",\n          body: [\n            \"No serum outruns chronic stress and poor sleep. The practices below are not about adding more to your day \u2014 they are about giving your nervous system regular cues to slow down and recover. Pick one to start; you do not need all of them.\"\n          ]\n        },\n        {\n          heading: \"Grounding \u2014 the simplest reset\",\n          body: [\n            'Grounding (or \"earthing\") is the practice of reconnecting with the earth\\'s surface. When stepping outside barefoot is not practical, a grounding mat brings the idea indoors \u2014 many people use one at their desk or under their feet in the evening as a calming wind-down.'\n          ],\n          spotlights: [\n            {\n              handle: \"earthing-mat-grounding-kit\",\n              note: \"An earthing mat kit to bring grounding indoors, at your desk or by the couch.\"\n            }\n          ]\n        },\n        {\n          heading: \"Heat and recovery\",\n          body: [\n            \"Heat is one of the oldest recovery rituals there is. An infrared sauna warms the body deeply for a sweat that feels restorative, and a heated foot massager is the small daily luxury that melts tension after a long day on your feet.\"\n          ],\n          spotlights: [\n            {\n              handle:\n                \"costway-2-3-person-3d-premium-infrared-sauna\",\n              note: \"A best-selling infrared sauna for deep, restorative heat at home.\"\n            },\n            {\n              handle: \"shiatsu-foot-massager-with-heat\",\n              note: \"A heated shiatsu foot massager \u2014 the easiest daily recovery ritual to keep.\"\n            }\n          ]\n        },\n        {\n          heading: \"Light, breath and stillness\",\n          body: [\n            \"Combining gentle infrared heat and red light with a few minutes of stillness turns a meditation into a recovery session. A heated mat gives you somewhere intentional to land each day.\"\n          ],\n          spotlights: [\n            {\n              handle: \"lava-infrared-meditation-mat\",\n              note: \"An infrared-and-red-light meditation mat for warmth and stillness in one.\"\n            }\n          ],\n          tip: \"Pair five minutes on the mat with slow breathing. The combination of warmth and breath is what shifts you out of stress mode.\"\n        },\n        {\n          heading: \"Hydration and reflection\",\n          body: [\n            \"Two of the most underrated habits cost the least. Better hydration supports everything from energy to skin, and a few minutes of journaling at the start or end of the day quiets the mental noise that disrupts sleep.\"\n          ],\n          spotlights: [\n            {\n              handle: \"hydrogen-water-bottle\",\n              note: \"A hydrogen water bottle to make daily hydration feel like a ritual, not a chore.\"\n            },\n            {\n              handle: \"the-routeine-box\",\n              note: \"A simple founder-built ritual for the days when skincare is the anchor that helps the rest of your routine hold.\"\n            }\n          ]\n        }\n      ],\n      products: [\n        \"earthing-mat-grounding-kit\",\n        \"shiatsu-foot-massager-with-heat\",\n        \"lava-infrared-meditation-mat\",\n        \"hydrogen-water-bottle\",\n        \"the-routeine-box\"\n      ],\n      relatedCollection: {\n        slug: \"home-spa-outfitting\",\n        label: \"Shop Home Spa Outfitting\",\n        url: \"/collections/home-spa-outfitting\"\n      }\n    }\n  ];\n\n  const ROUTEINE_CORE_HANDLES = [\n    \"the-routeine-box\",\n    \"routeine-first-melt-calming-balm-cleanser\",\n    \"routeine-activated-charcoal-cleanser\",\n    \"routeine-morning-shield-daily-protective-moisturizer\",\n    \"routeine-night-renew-dream-cream\"\n  ];\n\n  const ROUTEINE_GUIDE_PROFILES = {\n    \"routeine-first-melt-calming-balm-cleanser\": {\n      title: \"ROUTEine First Melt Calming Balm Cleanser\",\n      category: \"ROUTEine ritual\",\n      summary:\n        \"The first step in Diana's ROUTEine: a balm cleanse that melts off SPF, makeup, and buildup without stripping your skin.\",\n      readTime: \"4 min read\",\n      intro:\n        \"FIRST MELT is the step that makes the rest of the ritual work. It softens makeup, sunscreen, and daily buildup so your second cleanse can actually clear skin instead of fighting through a film.\",\n      sections: [\n        {\n          heading: \"What it is\",\n          body: [\n            \"FIRST MELT is the oil-based first cleanse in ROUTEine. It starts as a balm, melts on contact, and breaks down everything stubborn enough to stay sitting on the skin at the end of the day.\"\n          ]\n        },\n        {\n          heading: \"What it does\",\n          body: [\n            \"It removes the surface layer of the day gently: makeup, sunscreen, excess oil, and pollution. That means your second cleanse can finish cleanly instead of overworking the skin barrier.\"\n          ]\n        },\n        {\n          heading: \"How to use it\",\n          body: [\"Use FIRST MELT as the opening step in your evening ritual, or anytime skin needs a full reset.\"],\n          steps: [\n            \"Start on dry skin with dry hands.\",\n            \"Massage a pea-sized amount over the face for 45 to 60 seconds.\",\n            \"Add warm water to emulsify the balm into a milk.\",\n            \"Rinse thoroughly, then follow with DEEP RESET.\"\n          ]\n        },\n        {\n          heading: \"How it fits into the ROUTEine\",\n          body: [\n            \"This step is what makes ROUTEine feel elevated instead of rushed. Once the day is fully melted away, everything that follows feels cleaner, calmer, and more effective.\"\n          ],\n          tip: \"Do not rush this step. A full minute of massage is what turns cleansing into a ritual instead of a chore.\"\n        }\n      ],\n      products: [\n        \"routeine-first-melt-calming-balm-cleanser\",\n        \"the-routeine-box\",\n        \"routeine-activated-charcoal-cleanser\",\n        \"routeine-morning-shield-daily-protective-moisturizer\",\n        \"routeine-night-renew-dream-cream\"\n      ],\n      relatedCollection: {\n        slug: \"ritual-guide\",\n        label: \"See the full ROUTEine ritual guide\",\n        url: \"/pages/ritual-guide\"\n      }\n    },\n    \"routeine-activated-charcoal-cleanser\": {\n      title: \"ROUTEine Activated Charcoal Cleanser\",\n      category: \"ROUTEine ritual\",\n      summary:\n        \"The second cleanse in Diana's ROUTEine: a charcoal gel wash that clears what the balm lifted without leaving skin tight.\",\n      readTime: \"4 min read\",\n      intro:\n        \"DEEP RESET is the follow-through step. It finishes the cleanse, clears what FIRST MELT loosened, and leaves skin balanced enough to absorb the rest of the ritual beautifully.\",\n      sections: [\n        {\n          heading: \"What it is\",\n          body: [\n            \"DEEP RESET is the water-based second cleanse in ROUTEine. It is the gel wash that comes in after the balm to actually clear the skin rather than just loosen the day's buildup.\"\n          ]\n        },\n        {\n          heading: \"What it does\",\n          body: [\n            \"Activated charcoal helps pull away lingering residue while the formula keeps the finish comfortable. Skin feels clean and reset, not squeaky or stripped.\"\n          ]\n        },\n        {\n          heading: \"How to use it\",\n          body: [\"Use DEEP RESET after FIRST MELT, or on its own in the morning when you want a quick clean start.\"],\n          steps: [\n            \"Apply one pump to damp skin.\",\n            \"Massage gently for 30 seconds across the face and neck.\",\n            \"Rinse with lukewarm water.\",\n            \"Follow with MORNING SHIELD in the daytime or NIGHT RENEW at night.\"\n          ]\n        },\n        {\n          heading: \"How it fits into the ROUTEine\",\n          body: [\n            \"This is the step that takes ROUTEine from good intentions to real consistency. When your second cleanse feels clean but not aggressive, the rest of the ritual becomes easier to keep.\"\n          ],\n          tip: \"Use it every morning and every night. That steady cadence is what keeps the full ritual feeling simple.\"\n        }\n      ],\n      products: [\n        \"routeine-activated-charcoal-cleanser\",\n        \"the-routeine-box\",\n        \"routeine-first-melt-calming-balm-cleanser\",\n        \"routeine-morning-shield-daily-protective-moisturizer\",\n        \"routeine-night-renew-dream-cream\"\n      ],\n      relatedCollection: {\n        slug: \"ritual-guide\",\n        label: \"See the full ROUTEine ritual guide\",\n        url: \"/pages/ritual-guide\"\n      }\n    },\n    \"routeine-morning-shield-daily-protective-moisturizer\": {\n      title: \"ROUTEine Morning Shield Daily Protective Moisturizer (Day Cream)\",\n      category: \"ROUTEine ritual\",\n      summary:\n        \"The daytime moisture step in Diana's ROUTEine: light enough for every morning, supportive enough to keep skin comfortable and balanced.\",\n      readTime: \"4 min read\",\n      intro:\n        \"MORNING SHIELD is the daytime finish that keeps the ritual feeling polished. It hydrates, smooths, and protects the skin so your face feels looked after before the day properly starts.\",\n      sections: [\n        {\n          heading: \"What it is\",\n          body: [\n            \"MORNING SHIELD is the daily moisturizer in ROUTEine. It is designed to be the easy morning layer you actually use, not the heavy cream you keep avoiding.\"\n          ]\n        },\n        {\n          heading: \"What it does\",\n          body: [\n            \"It cushions the skin with hydration and helps it feel more balanced through weather, indoor air, and the general stress of the day. The texture is intentionally light enough to sit well under SPF.\"\n          ]\n        },\n        {\n          heading: \"How to use it\",\n          body: [\"Use MORNING SHIELD every morning after cleansing.\"],\n          steps: [\n            \"Cleanse first so the cream is going onto fresh skin.\",\n            \"Warm a fingertip-sized amount between your hands.\",\n            \"Press into slightly damp face and neck.\",\n            \"Finish with SPF as your final daytime layer.\"\n          ]\n        },\n        {\n          heading: \"How it fits into the ROUTEine\",\n          body: [\n            \"This is the step that makes the ritual feel complete before you walk out the door. It is less about doing something dramatic and more about making good skin days easier to repeat.\"\n          ],\n          tip: \"Press it in instead of rubbing it around. That small shift makes the finish feel calmer and more intentional.\"\n        }\n      ],\n      products: [\n        \"routeine-morning-shield-daily-protective-moisturizer\",\n        \"the-routeine-box\",\n        \"routeine-first-melt-calming-balm-cleanser\",\n        \"routeine-activated-charcoal-cleanser\",\n        \"routeine-night-renew-dream-cream\"\n      ],\n      relatedCollection: {\n        slug: \"ritual-guide\",\n        label: \"See the full ROUTEine ritual guide\",\n        url: \"/pages/ritual-guide\"\n      }\n    },\n    \"routeine-night-renew-dream-cream\": {\n      title: \"ROUTEine Night Renew (Dream Cream)\",\n      category: \"ROUTEine ritual\",\n      summary:\n        \"The night step in Diana's ROUTEine: a richer cream meant to close the day with hydration, comfort, and a slower reset.\",\n      readTime: \"4 min read\",\n      intro:\n        \"NIGHT RENEW is the evening close to ROUTEine. It is the step that tells your skin the day is over and gives the whole ritual its softer, more restorative finish.\",\n      sections: [\n        {\n          heading: \"What it is\",\n          body: [\n            \"NIGHT RENEW is the evening moisturizer in ROUTEine. It is intentionally richer than MORNING SHIELD so your PM routine feels more nourishing and complete.\"\n          ]\n        },\n        {\n          heading: \"What it does\",\n          body: [\n            \"It seals in hydration, supports a smoother overnight finish, and gives skin a more replenished feel by morning. It is the product that slows the ritual down just enough to make it feel restorative.\"\n          ]\n        },\n        {\n          heading: \"How to use it\",\n          body: [\"Use NIGHT RENEW as the final skincare step in your evening ROUTEine.\"],\n          steps: [\n            \"Cleanse with FIRST MELT and DEEP RESET first.\",\n            \"Warm a small amount between your palms.\",\n            \"Press into clean skin over the face and neck.\",\n            \"Optional: glide your gua sha over the cream for a slower, more sculpting finish.\"\n          ]\n        },\n        {\n          heading: \"How it fits into the ROUTEine\",\n          body: [\n            \"This is where the ritual becomes a wind-down instead of just another skincare task. It closes the loop on the full ROUTEine and helps the routine feel worth keeping.\"\n          ],\n          tip: \"Use a little more at night than you think you need. The richer finish is part of what makes this step feel luxurious.\"\n        }\n      ],\n      products: [\n        \"routeine-night-renew-dream-cream\",\n        \"the-routeine-box\",\n        \"routeine-first-melt-calming-balm-cleanser\",\n        \"routeine-activated-charcoal-cleanser\",\n        \"routeine-morning-shield-daily-protective-moisturizer\"\n      ],\n      relatedCollection: {\n        slug: \"ritual-guide\",\n        label: \"See the full ROUTEine ritual guide\",\n        url: \"/pages/ritual-guide\"\n      }\n    },\n    \"the-routeine-box\": {\n      title: \"The ROUTEine Ritual Guide\",\n      category: \"ROUTEine ritual\",\n      summary:\n        \"The founder-built four-step ROUTEine: a complete cleanse, hydrate, protect, and renew system made to feel simple enough to keep.\",\n      readTime: \"5 min read\",\n      intro:\n        \"The ROUTEine Box is Diana's answer to decision fatigue in skincare. Four full-size steps, morning and night, arranged in the exact order that makes the routine feel calmer, cleaner, and far easier to stay consistent with.\",\n      sections: [\n        {\n          heading: \"What is inside the box\",\n          body: [\n            \"The box includes FIRST MELT, DEEP RESET, MORNING SHIELD, and NIGHT RENEW, plus the spa tools that make the ritual feel polished instead of messy. It is meant to be the full system, not a random bundle.\"\n          ]\n        },\n        {\n          heading: \"Your morning ROUTEine\",\n          body: [\"In the morning, the goal is to cleanse lightly, hydrate well, and get out the door without overthinking it.\"],\n          steps: [\n            \"Use FIRST MELT if needed to dissolve buildup or leftover product.\",\n            \"Cleanse with DEEP RESET on damp skin.\",\n            \"Press MORNING SHIELD into face and neck.\",\n            \"Finish with SPF.\"\n          ]\n        },\n        {\n          heading: \"Your evening ROUTEine\",\n          body: [\"At night, the ritual slows down and becomes a proper reset.\"],\n          steps: [\n            \"Start with FIRST MELT on dry skin to dissolve SPF, makeup, and the day.\",\n            \"Follow with DEEP RESET to clear what the balm lifted.\",\n            \"Press NIGHT RENEW into clean skin as the final step.\",\n            \"Use your gua sha a few nights a week if you want a slower sculpting finish.\"\n          ]\n        },\n        {\n          heading: \"Why Diana built it\",\n          body: [\n            \"ROUTEine was built for people who wanted real results without a crowded shelf or a 12-step routine. The value of the box is not just the formulas. It is the structure, the order, and the ease of repeating the ritual long enough to see a difference.\"\n          ],\n          tip: \"If your skincare never sticks, do not add more steps. Tighten the ritual you already have and make it easier to repeat.\"\n        }\n      ],\n      products: [\n        \"the-routeine-box\",\n        \"routeine-first-melt-calming-balm-cleanser\",\n        \"routeine-activated-charcoal-cleanser\",\n        \"routeine-morning-shield-daily-protective-moisturizer\",\n        \"routeine-night-renew-dream-cream\"\n      ],\n      relatedCollection: {\n        slug: \"ritual-guide\",\n        label: \"See the full ROUTEine ritual guide\",\n        url: \"/pages/ritual-guide\"\n      }\n    }\n  };\n\n  const GENERIC_VENDOR_LABELS = new Set([\"wellness route\", \"the wellness route\"]);\n  const INTERNAL_GUIDE_PATTERNS = [\n    /^best-?for notes?/i,\n    /^the strongest reasons to buy/i,\n    /^materials,\\s*size,\\s*features/i,\n    /^size and details buyers look for before checkout/i,\n    /^included pieces/i,\n    /^internal note/i\n  ];\n  const GUIDE_STOP_WORDS = new Set([\n    \"about\",\n    \"after\",\n    \"again\",\n    \"all\",\n    \"and\",\n    \"are\",\n    \"but\",\n    \"can\",\n    \"for\",\n    \"from\",\n    \"into\",\n    \"its\",\n    \"just\",\n    \"more\",\n    \"not\",\n    \"our\",\n    \"out\",\n    \"that\",\n    \"the\",\n    \"their\",\n    \"them\",\n    \"this\",\n    \"with\",\n    \"your\"\n  ]);\n  const BRAND_HINTS = [\n    \"The Spa Slipper Co.\",\n    \"Go Simple Naturals\",\n    \"Dear Derm\",\n    \"Humanity Cosmetics\",\n    \"Hadaka\",\n    \"Innersense\",\n    \"LYLYL\",\n    \"Ruddi\",\n    \"Kala\",\n    \"Revive7\",\n    \"EyEnvy\",\n    \"Baby Foot\",\n    \"Costway\",\n    \"truMedic\",\n    \"iComfort\"\n  ];\n  const ROUTEINE_STEP_LABELS = {\n    \"routeine-first-melt-calming-balm-cleanser\": \"Step 01\",\n    \"routeine-activated-charcoal-cleanser\": \"Step 02\",\n    \"routeine-morning-shield-daily-protective-moisturizer\": \"Step 03\",\n    \"routeine-night-renew-dream-cream\": \"Step 04\",\n    \"the-routeine-box\": \"4-step ritual\"\n  };\n  const ROUTEINE_GUIDE_HIGHLIGHTS = {\n    \"routeine-first-melt-calming-balm-cleanser\": [\n      \"Melts off SPF, makeup, and daily buildup without stripping.\",\n      \"Designed to open the PM ROUTEine with a calmer, cleaner first step.\",\n      \"Pairs with DEEP RESET so the full cleanse feels thorough, not aggressive.\"\n    ],\n    \"routeine-activated-charcoal-cleanser\": [\n      \"Finishes the cleanse after FIRST MELT without leaving skin tight.\",\n      \"Built for morning-and-night use when you want skin to feel reset fast.\",\n      \"Creates the clean base that helps MORNING SHIELD and NIGHT RENEW layer better.\"\n    ],\n    \"routeine-morning-shield-daily-protective-moisturizer\": [\n      \"Light enough for every morning and comfortable under SPF.\",\n      \"Hydrates and smooths without making the ritual feel heavy.\",\n      \"Built by Diana to be the daytime step people actually keep using.\"\n    ],\n    \"routeine-night-renew-dream-cream\": [\n      \"A richer evening step that closes the ritual with comfort and hydration.\",\n      \"Turns a quick skincare routine into a proper wind-down moment.\",\n      \"Designed to help skin feel softer, calmer, and more replenished by morning.\"\n    ],\n    \"the-routeine-box\": [\n      \"Four full-size steps arranged in the exact order Diana teaches them.\",\n      \"Built to remove decision fatigue and make consistency easier to keep.\",\n      \"Pairs cleansing, hydration, and ritual tools into one founder-led system.\"\n    ]\n  };\n  const ROUTEINE_FOUNDER_NOTE =\n    \"Diana built ROUTEine after years in wellness and medi-spa spaces seeing the same problem over and over: great products, no repeatable ritual. Each step is designed to feel simple enough to keep, polished enough to enjoy, and effective enough to notice when you stay consistent.\";\n\n  function escapeHtml(value) {\n    return String(value ?? \"\")\n      .replace(/&/g, \"&amp;\")\n      .replace(/</g, \"&lt;\")\n      .replace(/>/g, \"&gt;\")\n      .replace(/\\\"/g, \"&quot;\")\n      .replace(/'/g, \"&#39;\");\n  }\n\n  function normalizeHandle(value) {\n    return String(value ?? \"\").trim().toLowerCase();\n  }\n\n  function slugify(value) {\n    return String(value ?? \"\")\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, \"-\")\n      .replace(/^-+|-+$/g, \"\");\n  }\n\n  function uniqueItems(values) {\n    return Array.from(new Set((values || []).filter(Boolean)));\n  }\n\n  function sanitizeGuideLine(value) {\n    return String(value ?? \"\")\n      .replace(/\\u00a0/g, \" \")\n      .replace(/^[\\s\u2022\\-\u2013\u2014]+/, \"\")\n      .replace(/\\s+/g, \" \")\n      .trim();\n  }\n\n  function normalizeGuideHeadingText(value) {\n    return sanitizeGuideLine(value)\n      .replace(/^[^a-z0-9]+/i, \"\")\n      .replace(/:+$/, \"\")\n      .trim();\n  }\n\n  function isInternalGuideText(value) {\n    const cleaned = sanitizeGuideLine(value);\n    if (!cleaned) return true;\n\n    return INTERNAL_GUIDE_PATTERNS.some((pattern) => pattern.test(cleaned));\n  }\n\n  function filterGuideLines(values) {\n    return uniqueItems(\n      (values || [])\n        .map((value) => sanitizeGuideLine(value))\n        .filter((value) => value && !isInternalGuideText(value))\n    );\n  }\n\n  function firstSentence(value) {\n    const cleaned = sanitizeGuideLine(value);\n    if (!cleaned) return \"\";\n\n    const match = cleaned.match(/.+?[.!?](?=\\s|$)/);\n    return match ? match[0].trim() : cleaned;\n  }\n\n  function truncateSentence(value, maxLength) {\n    return truncate(firstSentence(value), maxLength);\n  }\n\n  function ensureTerminalPunctuation(value) {\n    const cleaned = sanitizeGuideLine(value);\n    if (!cleaned) return \"\";\n    return /[.!?]$/.test(cleaned) ? cleaned : `${cleaned}.`;\n  }\n\n  function getMeaningfulSentence(value, minLength = 28) {\n    const cleaned = sanitizeGuideLine(value);\n    if (!cleaned) return \"\";\n\n    const sentences =\n      cleaned\n        .match(/[^.!?]+[.!?]?/g)\n        ?.map((sentence) => sentence.trim())\n        .filter(Boolean) || [];\n\n    return sentences.find((sentence) => sentence.length >= minLength) || sentences.join(\" \");\n  }\n\n  function buildGuideSummary(...values) {\n    for (const value of values) {\n      const summary = truncate(getMeaningfulSentence(value), 170);\n      if (summary) return summary;\n    }\n\n    return \"\";\n  }\n\n  function splitIntoSentences(value) {\n    const cleaned = sanitizeGuideLine(value);\n    if (!cleaned) return [];\n\n    return (\n      cleaned\n        .match(/[^.!?]+[.!?]?/g)\n        ?.map((sentence) => sentence.trim())\n        .filter(Boolean) || []\n    );\n  }\n\n  function buildIntroParagraphs(value) {\n    const sentences = splitIntoSentences(value);\n\n    if (sentences.length <= 2) {\n      return [sanitizeGuideLine(value)].filter(Boolean);\n    }\n\n    return [sentences.slice(0, 2).join(\" \"), sentences.slice(2).join(\" \")].filter(Boolean);\n  }\n\n  function looksLikeBrandSegment(segment) {\n    const cleaned = sanitizeGuideLine(segment);\n\n    if (!cleaned || cleaned.length > 36) return false;\n    if (/\\d/.test(cleaned) && cleaned.split(/\\s+/).length > 2) return false;\n    if (\n      /(cleanser|cream|mask|serum|kit|roller|massager|sauna|bottle|slippers|chair|liner|mascara|duo|bundle|gel|oil|butter|peel|panel|mat|device|therapy)/i.test(\n        cleaned\n      )\n    ) {\n      return false;\n    }\n\n    return /^[a-z0-9 .&'\u2019+-]+$/i.test(cleaned);\n  }\n\n  function deriveBrandFromTitle(title) {\n    const rawTitle = String(title ?? \"\").trim();\n    if (!rawTitle) return \"\";\n\n    const brandHint = BRAND_HINTS.find((hint) => rawTitle.toLowerCase().includes(hint.toLowerCase()));\n    if (brandHint) return brandHint;\n\n    const dashSegments = rawTitle\n      .split(/\\s+-\\s+/)\n      .map((segment) => sanitizeGuideLine(segment))\n      .filter(Boolean);\n\n    if (dashSegments.length > 1) {\n      const preferredSegment = dashSegments.find((segment) => looksLikeBrandSegment(segment));\n      if (preferredSegment) return preferredSegment;\n    }\n\n    const firstToken = rawTitle.split(/\\s+/)[0] || \"\";\n    if (/^[A-Z0-9]{2,}$/.test(firstToken)) return firstToken;\n\n    const firstTwoWords = rawTitle.split(/\\s+/).slice(0, 2).join(\" \").trim();\n    if (/^[A-Z][A-Za-z0-9&'.-]+(?:\\s+[A-Z][A-Za-z0-9&'.-]+)?$/.test(firstTwoWords)) {\n      return firstTwoWords;\n    }\n\n    return \"\";\n  }\n\n  function getRouteineStepLabel(handle) {\n    return ROUTEINE_STEP_LABELS[normalizeHandle(handle)] || \"ROUTEine\";\n  }\n\n  function isRouteineFamilyHandle(value) {\n    const handle = normalizeHandle(value);\n    return handle === \"the-routeine-box\" || handle.startsWith(\"routeine-\");\n  }\n\n  function getRouteineGuideProfile(value) {\n    return ROUTEINE_GUIDE_PROFILES[normalizeHandle(value)] || null;\n  }\n\n  function getRouteineGuideProducts(handle) {\n    const normalizedHandle = normalizeHandle(handle);\n    const profile = getRouteineGuideProfile(normalizedHandle);\n\n    if (Array.isArray(profile?.products) && profile.products.length) {\n      return profile.products;\n    }\n\n    const ordered = [\n      normalizedHandle,\n      \"the-routeine-box\",\n      ...ROUTEINE_CORE_HANDLES,\n      \"routeine-niacinamide-serum-5\",\n      \"routeine-hydration-mask\",\n      \"routeine-microdermabrasion-cream\",\n      \"routeine-vitamin-c-serum\",\n      \"routeine-hyaluronic-acid-serum-2\"\n    ];\n\n    return Array.from(new Set(ordered.filter(Boolean))).slice(0, 5);\n  }\n\n  function humanizeHandle(handle) {\n    return String(handle ?? \"\")\n      .split(\"-\")\n      .filter(Boolean)\n      .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n      .join(\" \");\n  }\n\n  function titleCase(value) {\n    return String(value ?? \"\")\n      .split(/\\s+/)\n      .filter(Boolean)\n      .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n      .join(\" \");\n  }\n\n  function normalizeVendorLabel(product) {\n    const rawVendor = String(product?.vendor ?? \"\").trim();\n    const vendorLower = rawVendor.toLowerCase();\n    const handle = normalizeHandle(product?.handle);\n    const collectionHandle = normalizeHandle(product?.collection_handle);\n    const derivedBrand = deriveBrandFromTitle(product?.title);\n\n    if (collectionHandle === \"the-wellness-route\") return \"The Wellness Route\";\n    if (collectionHandle === \"innersense\") return \"Innersense\";\n    if (collectionHandle === \"hadaka\") return \"Hadaka\";\n    if (collectionHandle === \"dear-derm\") return \"Dear Derm\";\n    if (collectionHandle === \"go-simple-naturals\") return \"Go Simple Naturals\";\n\n    if (\n      /routeine|first-melt|morning-shield|night-renew|dream-cream|deep-reset/.test(handle) ||\n      vendorLower.includes(\"wellnessroute\") ||\n      vendorLower.includes(\"wellness route\")\n    ) {\n      return \"The Wellness Route\";\n    }\n\n    if (GENERIC_VENDOR_LABELS.has(vendorLower)) {\n      return derivedBrand || \"The Wellness Route\";\n    }\n\n    if (!rawVendor) return derivedBrand;\n\n    if (vendorLower.includes(\"http\") || vendorLower.includes(\".ca\") || vendorLower.includes(\".com\") || vendorLower.includes(\".shop\")) {\n      const derived = vendorLower\n        .replace(/^https?:\\/\\//, \"\")\n        .replace(/^www\\./, \"\")\n        .split(\"/\")[0]\n        .replace(/\\.com$|\\.ca$|\\.co$|\\.shop$/g, \"\")\n        .replace(/[-_]+/g, \" \")\n        .trim();\n\n      return titleCase(derived || derivedBrand || \"Wellness Route\");\n    }\n\n    return rawVendor || derivedBrand;\n  }\n\n  function getProductDisplayBrand(product) {\n    if (isRouteineFamilyHandle(product?.handle)) {\n      return \"The Wellness Route\";\n    }\n\n    const derivedBrand = deriveBrandFromTitle(product?.title);\n    const vendorLabel = product?.vendor_label || normalizeVendorLabel(product);\n    const rawVendor = sanitizeGuideLine(product?.vendor || \"\");\n\n    if (vendorLabel && !GENERIC_VENDOR_LABELS.has(vendorLabel.toLowerCase())) {\n      return vendorLabel;\n    }\n\n    if (derivedBrand) return derivedBrand;\n    if (rawVendor && !GENERIC_VENDOR_LABELS.has(rawVendor.toLowerCase())) return rawVendor;\n\n    return vendorLabel || \"The Wellness Route\";\n  }\n\n  function truncate(text, maxLength) {\n    const normalized = String(text ?? \"\").replace(/\\s+/g, \" \").trim();\n    if (!normalized || normalized.length <= maxLength) return normalized;\n    return `${normalized.slice(0, maxLength - 1).trimEnd()}\u2026`;\n  }\n\n  function money(cents) {\n    const value = Number(cents ?? 0);\n    if (!Number.isFinite(value)) return \"\";\n    try {\n      return new Intl.NumberFormat(\"en-CA\", {\n        style: \"currency\",\n        currency: \"CAD\"\n      }).format(value / 100);\n    } catch (_error) {\n      return `$${(value / 100).toFixed(2)}`;\n    }\n  }\n\n  function parseJson(root, selector) {\n    const element = root.querySelector(selector);\n    if (!element) return null;\n\n    try {\n      return JSON.parse(element.textContent || \"null\");\n    } catch (error) {\n      console.error(\"Unable to parse Learn page data\", error);\n      return null;\n    }\n  }\n\n  function stripHtml(html) {\n    const doc = new DOMParser().parseFromString(`<div>${html || \"\"}</div>`, \"text/html\");\n    return String(doc.body.textContent || \"\").replace(/\\s+/g, \" \").trim();\n  }\n\n  function estimateReadTime(text) {\n    const words = String(text ?? \"\")\n      .split(/\\s+/)\n      .filter(Boolean).length;\n\n    return `${Math.max(2, Math.round(words / 200))} min read`;\n  }\n\n  function resolveGuideImage(guide, state) {\n    return state.assetMap[guide.image] || guide.image || \"\";\n  }\n\n  function normalizeEmbeddedProduct(product) {\n    if (!product || !product.handle) return null;\n\n    const descriptionHtml = product.description_html || product.description || \"\";\n    const featuredImage = product.featured_image || product.featured_image_url || \"\";\n    const tags = Array.isArray(product.tags)\n      ? product.tags\n      : typeof product.tags === \"string\"\n      ? product.tags.split(\",\")\n      : [];\n\n    return {\n      handle: normalizeHandle(product.handle),\n      title: product.title || \"\",\n      vendor: product.vendor || \"\",\n      vendor_label: normalizeVendorLabel(product),\n      type: product.type || \"\",\n      url: product.url || `/products/${product.handle}`,\n      price: Number(product.price || 0),\n      compare_at_price: product.compare_at_price ? Number(product.compare_at_price) : null,\n      read_time: product.read_time || estimateReadTime(stripHtml(descriptionHtml)),\n      description_html: descriptionHtml,\n      tags: filterGuideLines(tags),\n      featured_image: featuredImage,\n      images: Array.isArray(product.images) ? product.images.filter(Boolean) : featuredImage ? [featuredImage] : [],\n      collection_handle: normalizeHandle(product.collection_handle),\n      collection_title: product.collection_title || \"\",\n      collection_url: product.collection_url || \"\",\n      variant_id: product.variant_id || null,\n      available: product.available !== false\n    };\n  }\n\n  function normalizeRemoteProduct(product, collectionContext, existingProduct) {\n    const variants = Array.isArray(product?.variants) ? product.variants : [];\n    const firstVariant = variants.find((variant) => variant.available) || variants[0] || null;\n\n    return normalizeEmbeddedProduct({\n      handle: product.handle,\n      title: product.title,\n      vendor: product.vendor,\n      type: product.type,\n      url: `/products/${product.handle}`,\n      price: product.price,\n      compare_at_price: product.compare_at_price,\n      description_html: product.description,\n      tags: product.tags,\n      featured_image: product.featured_image,\n      images: product.images,\n      collection_handle: collectionContext?.handle || existingProduct?.collection_handle || \"\",\n      collection_title: collectionContext?.title || existingProduct?.collection_title || \"\",\n      collection_url: collectionContext?.url || existingProduct?.collection_url || \"\",\n      read_time: existingProduct?.read_time,\n      variant_id: firstVariant?.id || null,\n      available: firstVariant ? Boolean(firstVariant.available) : true\n    });\n  }\n\n  function parseProductSections(product) {\n    const title = product.title || \"This product\";\n    const html = product.description_html || \"\";\n    const doc = new DOMParser().parseFromString(`<div>${html}</div>`, \"text/html\");\n    const wrapper = doc.body.firstElementChild || doc.body;\n    const blocks = Array.from(wrapper.querySelectorAll(\"h1, h2, h3, h4, p, ul, ol\"));\n    const leadParagraphs = [];\n    const leadSteps = [];\n    const sections = [];\n    let currentSection = null;\n\n    const classifyHeading = (rawHeading) => {\n      const cleanedHeading = normalizeGuideHeadingText(rawHeading);\n      const normalizedHeading = cleanedHeading.toLowerCase();\n\n      if (\n        normalizedHeading.includes(\"how to use\") ||\n        normalizedHeading.includes(\"directions\") ||\n        normalizedHeading.includes(\"how to apply\") ||\n        normalizedHeading.includes(\"application\")\n      ) {\n        return { heading: \"How to use it\", mode: \"steps\" };\n      }\n\n      if (\n        normalizedHeading.includes(\"key benefits\") ||\n        normalizedHeading === \"benefits\" ||\n        normalizedHeading.includes(\"why you'll love it\") ||\n        normalizedHeading.includes(\"why you\u2019ll love it\") ||\n        normalizedHeading.includes(\"what you'll love\") ||\n        normalizedHeading.includes(\"what you\u2019ll love\")\n      ) {\n        return { heading: \"Why you'll love it\", mode: \"body\" };\n      }\n\n      if (\n        normalizedHeading.includes(\"ingredients\") ||\n        normalizedHeading.includes(\"key ingredients\") ||\n        normalizedHeading.includes(\"what's inside\") ||\n        normalizedHeading.includes(\"whats inside\") ||\n        normalizedHeading.includes(\"hero ingredients\")\n      ) {\n        return { heading: \"What's inside\", mode: \"body\" };\n      }\n\n      if (\n        normalizedHeading.includes(\"perfect for\") ||\n        normalizedHeading.includes(\"best for\") ||\n        normalizedHeading.includes(\"who it's for\") ||\n        normalizedHeading.includes(\"who it\u2019s for\")\n      ) {\n        return { heading: \"Who it's for\", mode: \"body\" };\n      }\n\n      return { heading: cleanedHeading, mode: \"body\" };\n    };\n\n    const toLines = (markup) => {\n      const probe = doc.createElement(\"div\");\n      probe.innerHTML = String(markup || \"\").replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n      return String(probe.textContent || \"\")\n        .replace(/\\u00a0/g, \" \")\n        .replace(/\\s*\u2022\\s+/g, \"\\n\u2022 \")\n        .split(/\\n+/)\n        .map((line) => line.replace(/\\s+/g, \" \").trim())\n        .filter(Boolean);\n    };\n\n    const pushSection = (heading, mode) => {\n      currentSection = { heading, body: [], steps: [], mode: mode || \"body\" };\n      sections.push(currentSection);\n      return currentSection;\n    };\n\n    const appendSectionCopy = (section, text, mode) => {\n      const cleanedText = String(text || \"\").replace(/\\s+/g, \" \").trim();\n      if (!cleanedText) return;\n\n      if (mode === \"steps\") {\n        section.steps.push(cleanedText);\n      } else {\n        section.body.push(cleanedText);\n      }\n    };\n\n    blocks.forEach((block) => {\n      const tag = block.tagName.toLowerCase();\n      const text = String(block.textContent || \"\").replace(/\\s+/g, \" \").trim();\n\n      if (!text) return;\n\n      if (/^h[1-4]$/.test(tag)) {\n        const classifiedHeading = classifyHeading(text);\n        pushSection(classifiedHeading.heading, classifiedHeading.mode);\n        return;\n      }\n\n      if (tag === \"p\") {\n        const lines = toLines(block.innerHTML);\n        const labelMatch = lines[0]?.match(/^([^:]{2,40}):\\s*(.*)$/);\n\n        if (labelMatch) {\n          const classifiedHeading = classifyHeading(labelMatch[1]);\n          const section = pushSection(classifiedHeading.heading, classifiedHeading.mode);\n          const firstLineRemainder = labelMatch[2].trim();\n\n          if (firstLineRemainder) {\n            appendSectionCopy(section, firstLineRemainder, section.mode);\n          }\n\n          lines.slice(1).forEach((line) => {\n            appendSectionCopy(section, line, section.mode);\n          });\n\n          return;\n        }\n\n        if (currentSection) {\n          currentSection.body.push(...lines);\n        } else {\n          leadParagraphs.push(...lines);\n        }\n\n        return;\n      }\n\n      if (tag === \"ul\" || tag === \"ol\") {\n        const items = Array.from(block.querySelectorAll(\"li\"))\n          .map((item) => String(item.textContent || \"\").replace(/\\s+/g, \" \").trim())\n          .filter(Boolean);\n\n        if (!items.length) return;\n\n        if (currentSection) {\n          const shouldUseSteps =\n            currentSection.mode === \"steps\" ||\n            /how to use|steps|directions/i.test(currentSection.heading);\n\n          if (shouldUseSteps) {\n            currentSection.steps.push(...items);\n          } else {\n            currentSection.body.push(...items);\n          }\n        } else {\n          leadSteps.push(...items);\n        }\n      }\n    });\n\n    const filteredSections = sections\n      .map((section) => ({\n        heading: section.heading,\n        body: section.body.filter(Boolean),\n        steps: section.steps.filter(Boolean),\n        mode: section.mode\n      }))\n      .filter((section) => section.heading && (section.body.length || section.steps.length));\n\n    const intro =\n      leadParagraphs.slice(0, 2).join(\" \") ||\n      filteredSections[0]?.body[0] ||\n      filteredSections[0]?.steps[0] ||\n      `A closer look at ${title}.`;\n\n    if (!filteredSections.length) {\n      const paragraphs = leadParagraphs.filter(Boolean);\n      const fallbackSections = [];\n\n      fallbackSections.push({\n        heading: \"Why you'll love it\",\n        body: [\n          paragraphs[0] ||\n            `${title} is designed to make your routine easier, more intentional, and more effective.`\n        ]\n      });\n\n      if (leadSteps.length) {\n        fallbackSections.push({\n          heading: \"How to use it\",\n          body: [`Make ${title} part of your ritual in a few simple steps:`],\n          steps: leadSteps.slice(0, 6)\n        });\n      }\n\n      if (paragraphs.length > 1) {\n        fallbackSections.push({\n          heading: \"More to know\",\n          body: paragraphs.slice(1, 4)\n        });\n      }\n\n      if (fallbackSections.length === 1 && !leadSteps.length) {\n        fallbackSections.push({\n          heading: \"How it fits\",\n          body: [\n            `Use ${title} consistently and pair it with the rest of your routine based on your skin's needs.`\n          ]\n        });\n      }\n\n      return {\n        intro,\n        sections: fallbackSections\n      };\n    }\n\n    if (leadParagraphs.length > 2) {\n      filteredSections.unshift({\n        heading: \"More to know\",\n        body: leadParagraphs.slice(2),\n        steps: [],\n        mode: \"body\"\n      });\n    } else if (leadSteps.length && !filteredSections.some((section) => /how to use/i.test(section.heading))) {\n      filteredSections.unshift({\n        heading: \"How to use it\",\n        body: [`Make ${title} part of your ritual in a few simple steps:`],\n        steps: leadSteps.slice(0, 6),\n        mode: \"steps\"\n      });\n    }\n\n    return {\n      intro,\n      sections: filteredSections.map((section) => {\n        const normalized = {\n          heading: section.heading,\n          body: section.body\n        };\n\n        if (section.steps.length) normalized.steps = section.steps;\n        return normalized;\n      })\n    };\n  }\n\n  function getGuideSectionKind(heading) {\n    const normalizedHeading = normalizeGuideHeadingText(heading).toLowerCase();\n\n    if (\n      normalizedHeading.includes(\"how to use\") ||\n      normalizedHeading.includes(\"directions\") ||\n      normalizedHeading.includes(\"how to apply\") ||\n      normalizedHeading.includes(\"application\")\n    ) {\n      return \"usage\";\n    }\n\n    if (\n      normalizedHeading.includes(\"key benefits\") ||\n      normalizedHeading === \"benefits\" ||\n      normalizedHeading.includes(\"why you'll love it\") ||\n      normalizedHeading.includes(\"why you\u2019ll love it\") ||\n      normalizedHeading.includes(\"what you'll love\") ||\n      normalizedHeading.includes(\"what you\u2019ll love\") ||\n      normalizedHeading.includes(\"what it does\")\n    ) {\n      return \"benefits\";\n    }\n\n    if (\n      normalizedHeading.includes(\"ingredients\") ||\n      normalizedHeading.includes(\"key ingredients\") ||\n      normalizedHeading.includes(\"actives\") ||\n      normalizedHeading.includes(\"what's inside\") ||\n      normalizedHeading.includes(\"whats inside\") ||\n      normalizedHeading.includes(\"hero ingredients\")\n    ) {\n      return \"ingredients\";\n    }\n\n    if (\n      normalizedHeading.includes(\"perfect for\") ||\n      normalizedHeading.includes(\"best for\") ||\n      normalizedHeading.includes(\"who it's for\") ||\n      normalizedHeading.includes(\"who it\u2019s for\")\n    ) {\n      return \"best-for\";\n    }\n\n    if (\n      normalizedHeading.includes(\"specifications\") ||\n      normalizedHeading.includes(\"specs\") ||\n      normalizedHeading.includes(\"materials\") ||\n      normalizedHeading.includes(\"details\") ||\n      normalizedHeading.includes(\"features\") ||\n      normalizedHeading.includes(\"size\") ||\n      normalizedHeading.includes(\"dimensions\") ||\n      normalizedHeading.includes(\"included\") ||\n      normalizedHeading.includes(\"please note\")\n    ) {\n      return \"details\";\n    }\n\n    if (\n      normalizedHeading.includes(\"about this product\") ||\n      normalizedHeading.includes(\"why diana built it\") ||\n      normalizedHeading.includes(\"why it was made\")\n    ) {\n      return \"story\";\n    }\n\n    return \"overview\";\n  }\n\n  function findGuideSection(sections, heading) {\n    const normalizedHeading = normalizeGuideHeadingText(heading).toLowerCase();\n    return (sections || []).find(\n      (section) => normalizeGuideHeadingText(section.heading).toLowerCase() === normalizedHeading\n    ) || null;\n  }\n\n  function getGuideContext(product, collectionTitle, collectionHandle) {\n    const title = collectionTitle || product?.collection_title || \"product\";\n    const handle = normalizeHandle(collectionHandle || product?.collection_handle);\n    const base = {\n      collectionLabel: title,\n      collectionPhrase: `${title.toLowerCase()} routine`,\n      audienceLabel: `people building a more intentional ${title.toLowerCase()} routine`,\n      useMoment: \"when you want your routine to feel easier to keep\",\n      pairingPhrase: `the rest of your ${title.toLowerCase()} ritual`\n    };\n\n    switch (handle) {\n      case \"face-care\":\n        return {\n          ...base,\n          collectionPhrase: \"face care routine\",\n          audienceLabel: \"skin that needs comfort, hydration, and a routine that feels easy to repeat\",\n          useMoment: \"in a consistent morning or evening skincare ritual\",\n          pairingPhrase: \"the rest of your face care ritual\"\n        };\n      case \"body-care\":\n        return {\n          ...base,\n          collectionPhrase: \"body-care ritual\",\n          audienceLabel: \"dry, dull, or neglected skin that needs a little more softness and care\",\n          useMoment: \"after the shower or whenever skin feels depleted\",\n          pairingPhrase: \"the rest of your body-care ritual\"\n        };\n      case \"hair-care\":\n        return {\n          ...base,\n          collectionPhrase: \"hair-care routine\",\n          audienceLabel: \"hair that needs more consistency, less guesswork, and better-feeling upkeep\",\n          useMoment: \"on wash day or as part of your regular hair-care cadence\",\n          pairingPhrase: \"the rest of your hair-care lineup\"\n        };\n      case \"beauty-tools\":\n        return {\n          ...base,\n          collectionPhrase: \"beauty-tools routine\",\n          audienceLabel: \"people who want more payoff from the products they already own\",\n          useMoment: \"when you want a low-lift upgrade to your ritual\",\n          pairingPhrase: \"the tools and formulas around it\"\n        };\n      case \"led-light-therapy\":\n        return {\n          ...base,\n          collectionPhrase: \"red-light routine\",\n          audienceLabel: \"people building a recovery-forward skin or wellness ritual at home\",\n          useMoment: \"in dedicated recovery or skin sessions a few times a week\",\n          pairingPhrase: \"the rest of your red-light setup\"\n        };\n      case \"massagers\":\n        return {\n          ...base,\n          collectionPhrase: \"recovery routine\",\n          audienceLabel: \"anyone who wants more relief, less tension, and something they will actually use\",\n          useMoment: \"when recovery needs to feel fast, accessible, and worth repeating\",\n          pairingPhrase: \"the rest of your recovery setup\"\n        };\n      case \"wellness-decor\":\n        return {\n          ...base,\n          collectionPhrase: \"at-home wellness setup\",\n          audienceLabel: \"people trying to make home feel calmer, warmer, and more intentional\",\n          useMoment: \"when you want the space itself to support the ritual\",\n          pairingPhrase: \"the rest of your at-home wellness setup\"\n        };\n      default:\n        return base;\n    }\n  }\n\n  function inferGuideUseMoment(product, usageSection, context) {\n    const source = [\n      product?.title,\n      product?.type,\n      ...(usageSection?.body || []),\n      ...(usageSection?.steps || []),\n      product?.description_html ? stripHtml(product.description_html) : \"\"\n    ]\n      .filter(Boolean)\n      .join(\" \")\n      .toLowerCase();\n\n    if (/morning|day cream|spf|sunscreen|makeup/.test(source)) {\n      return \"in the morning, before SPF or makeup\";\n    }\n\n    if (/night|evening|pm|overnight|wind-down/.test(source)) {\n      return \"at night, when the rest of the routine is slowing down\";\n    }\n\n    if (/shower|body butter|body scrub|body oil/.test(source)) {\n      return \"right after the shower, while skin is still warm and slightly damp\";\n    }\n\n    if (/mask|panel|red light|led/.test(source)) {\n      return \"during a dedicated skin or recovery session a few times a week\";\n    }\n\n    return context.useMoment;\n  }\n\n  function inferAudienceLines(product, shapedSections, context) {\n    const explicitAudience = findGuideSection(shapedSections, \"Who it's for\");\n    if (explicitAudience?.body?.length) {\n      return explicitAudience.body.map((line) => ensureTerminalPunctuation(line)).slice(0, 4);\n    }\n\n    const source = [\n      product?.title,\n      product?.type,\n      product?.description_html ? stripHtml(product.description_html) : \"\",\n      ...((findGuideSection(shapedSections, \"What it does\")?.body || []).slice(0, 5))\n    ]\n      .filter(Boolean)\n      .join(\" \")\n      .toLowerCase();\n\n    const inferred = [];\n\n    if (/sensitive|reactive/.test(source)) {\n      inferred.push(\"A strong fit for sensitive or reactive skin that needs comfort without a lot of extra fuss.\");\n    }\n\n    if (/dry|hydration|moisture|barrier/.test(source)) {\n      inferred.push(\"Especially worth a look if dryness, tightness, or dehydration are the issues you keep trying to solve.\");\n    }\n\n    if (/brighten|glow|tone|texture/.test(source)) {\n      inferred.push(\"Best for routines focused on smoother texture, more even tone, and that rested-looking glow.\");\n    }\n\n    if (/recovery|massage|tension|soothe|relief/.test(source)) {\n      inferred.push(\"Ideal for anyone who wants recovery to feel restorative rather than like another task on the list.\");\n    }\n\n    if (/daily|every morning|every night|easy|simple/.test(source)) {\n      inferred.push(\"It makes the most sense for people who want something consistent enough to become second nature.\");\n    }\n\n    if (!inferred.length) {\n      inferred.push(`A smart option for ${context.audienceLabel}.`);\n    }\n\n    return uniqueItems(inferred).slice(0, 4);\n  }\n\n  function buildPairingSpotlights(product, relatedProducts, context) {\n    return (relatedProducts || [])\n      .filter((related) => related && related.handle !== product.handle)\n      .slice(0, 2)\n      .map((related) => ({\n        handle: related.handle,\n        note: truncate(\n          `If ${product.title} is the anchor, ${related.title} is a natural next step for ${context.pairingPhrase}. ${getProductExcerpt(\n            related,\n            100\n          )}`,\n          180\n        )\n      }));\n  }\n\n  function buildProductGuideQuickFacts(product, shapedSections, relatedProducts, context) {\n    const audienceLines = inferAudienceLines(product, shapedSections, context);\n    const bestFor = audienceLines[0]\n      ? audienceLines[0].replace(/\\.$/, \"\")\n      : context.audienceLabel;\n    const usageSection = findGuideSection(shapedSections, \"How to use it\");\n    const pairProduct = (relatedProducts || []).find((related) => related && related.handle !== product.handle);\n\n    return [\n      {\n        label: \"Best for\",\n        value: truncate(bestFor, 88)\n      },\n      {\n        label: \"Use it when\",\n        value: truncate(inferGuideUseMoment(product, usageSection, context), 88)\n      },\n      {\n        label: \"Pairs well with\",\n        value: truncate(pairProduct ? pairProduct.title : context.pairingPhrase, 88)\n      }\n    ];\n  }\n\n  function buildEditNote(product, context) {\n    const brand = getProductDisplayBrand(product);\n\n    if (brand === \"The Wellness Route\") {\n      return `We keep ${product.title} in the edit because it makes a ${context.collectionPhrase} feel more considered without making it more complicated. It solves something specific, feels good to use, and is easy to recommend to someone who actually wants to stick with the ritual.`;\n    }\n\n    return `${product.title} made it into the edit because ${brand} brings a clear point of view without overcomplicating the routine. It is the kind of product that earns trust by being useful, well-made, and easy to come back to.`;\n  }\n\n  function buildEditorialProductSections(product, shapedSections, relatedProducts, context) {\n    const introSection = findGuideSection(shapedSections, \"What it is\");\n    const benefitsSection = findGuideSection(shapedSections, \"What it does\");\n    const usageSection = findGuideSection(shapedSections, \"How to use it\");\n    const audienceLines = inferAudienceLines(product, shapedSections, context);\n    const ingredientsSection = findGuideSection(shapedSections, \"What's inside\");\n    const detailsSection = findGuideSection(shapedSections, \"Everything else you should know\");\n    const pairingSpotlights = buildPairingSpotlights(product, relatedProducts, context);\n    const sections = [];\n\n    if (introSection?.body?.length) {\n      sections.push({\n        heading: \"Why it earns a place in the routine\",\n        body: uniqueItems([\n          `The products that stay in a routine are usually the ones that solve one clear problem and still feel good enough to keep using. ${product.title} fits that lane inside a ${context.collectionPhrase}.`,\n          ...introSection.body.map((line) => ensureTerminalPunctuation(line)).slice(0, 3)\n        ])\n      });\n    }\n\n    if (benefitsSection?.body?.length) {\n      sections.push({\n        heading: \"What makes it worth reaching for\",\n        body: uniqueItems([\n          `This is the part that matters most: not just what the product claims to do, but why it tends to become one of the things people keep repurchasing.`,\n          ...benefitsSection.body.map((line) => ensureTerminalPunctuation(line)).slice(0, 5)\n        ])\n      });\n    }\n\n    if ((usageSection?.body?.length || usageSection?.steps?.length)) {\n      sections.push({\n        heading: \"How to actually use it\",\n        body: uniqueItems([\n          `The easiest way to get more out of ${product.title} is to give it a real place in the ritual rather than treating it like an occasional extra.`,\n          ...(usageSection.body || []).map((line) => ensureTerminalPunctuation(line)).slice(0, 2)\n        ]),\n        steps: (usageSection.steps || []).slice(0, 6)\n      });\n    }\n\n    if (audienceLines.length) {\n      sections.push({\n        heading: \"Who will love it most\",\n        body: uniqueItems([\n          `If you are deciding whether it belongs on your shelf, this is usually where the answer becomes obvious.`,\n          ...audienceLines\n        ]).slice(0, 5)\n      });\n    }\n\n    if (ingredientsSection?.body?.length) {\n      sections.push({\n        heading: \"What's inside and why it matters\",\n        body: uniqueItems([\n          `You do not need to memorize every ingredient to shop well, but these are the pieces worth paying attention to.`,\n          ...ingredientsSection.body.map((line) => ensureTerminalPunctuation(line)).slice(0, 6)\n        ])\n      });\n    }\n\n    if (pairingSpotlights.length) {\n      sections.push({\n        heading: \"What to pair it with\",\n        body: [\n          `If ${product.title} is the starting point, these are the most natural next adds for the rest of ${context.pairingPhrase}.`\n        ],\n        spotlights: pairingSpotlights\n      });\n    }\n\n    if (detailsSection?.body?.length) {\n      sections.push({\n        heading: \"The last few things to know before you buy\",\n        body: uniqueItems(detailsSection.body.map((line) => ensureTerminalPunctuation(line)).slice(0, 5))\n      });\n    }\n\n    return sections.filter((section) => {\n      const hasBody = Array.isArray(section.body) && section.body.length;\n      const hasSteps = Array.isArray(section.steps) && section.steps.length;\n      const hasSpotlights = Array.isArray(section.spotlights) && section.spotlights.length;\n      return hasBody || hasSteps || hasSpotlights;\n    });\n  }\n\n  function buildRouteineEditorialSections(product, sections, relatedProducts, context) {\n    const pairings = getRouteineGuideProducts(product.handle)\n      .filter((handle) => normalizeHandle(handle) !== normalizeHandle(product.handle))\n      .slice(0, 2)\n      .map((handle) => ({\n        handle,\n        note:\n          normalizeHandle(handle) === \"the-routeine-box\"\n            ? \"The full ROUTEine if you want all four steps in the exact founder-built order, without piecing it together yourself.\"\n            : \"A natural next step if you want to make the ROUTEine feel more complete, cohesive, and easier to keep.\"\n      }));\n    const transformed = (sections || []).map((section) => {\n      const heading = normalizeGuideHeadingText(section.heading);\n      const body = (section.body || []).map((line) => ensureTerminalPunctuation(line));\n\n      if (/^what it is$/i.test(heading)) {\n        return {\n          ...section,\n          heading: \"Why it matters in the ritual\",\n          body: uniqueItems([\n            `ROUTEine works best when every step has a clear job. ${product.title} is there to make the ritual feel more intentional, not more crowded.`,\n            ...body\n          ])\n        };\n      }\n\n      if (/^what it does$/i.test(heading)) {\n        return {\n          ...section,\n          heading: \"What makes it worth reaching for\",\n          body: uniqueItems([\n            `This is usually the part people feel fastest: the payoff of a well-built step that does not ask you to overthink it.`,\n            ...body\n          ])\n        };\n      }\n\n      if (/^how to use it$/i.test(heading)) {\n        return {\n          ...section,\n          heading: \"How to actually use it\",\n          body: uniqueItems([\n            `The easiest way to get the full benefit is to anchor it to the same point in your morning or evening rhythm every time.`,\n            ...body\n          ])\n        };\n      }\n\n      if (/^how it fits into the routeine$/i.test(heading)) {\n        return {\n          ...section,\n          heading: \"Where it sits in the ROUTEine\",\n          body: uniqueItems([\n            `The real value of ROUTEine is the structure. This is the role ${product.title} plays inside the full flow.`,\n            ...body\n          ])\n        };\n      }\n\n      return {\n        ...section,\n        body\n      };\n    });\n\n    if (pairings.length) {\n      transformed.push({\n        heading: \"What to pair it with\",\n        body: [\n          `If you are building out the full ROUTEine rather than buying one step in isolation, these are the most natural companions to add next.`\n        ],\n        spotlights: pairings\n      });\n    }\n\n    return transformed;\n  }\n\n  function buildStructuredProductSections(product, parsed) {\n    const intro = sanitizeGuideLine(parsed?.intro) || `A closer look at ${product?.title || \"this product\"}.`;\n    const buckets = {\n      overview: [],\n      benefits: [],\n      usageBody: [],\n      usageSteps: [],\n      ingredients: [],\n      bestFor: [],\n      details: [],\n      story: []\n    };\n\n    (parsed?.sections || []).forEach((section) => {\n      const kind = getGuideSectionKind(section.heading);\n      const body = filterGuideLines(section.body || []);\n      const steps = filterGuideLines(section.steps || []);\n\n      if (kind === \"usage\") {\n        buckets.usageBody.push(...body);\n        buckets.usageSteps.push(...steps);\n        return;\n      }\n\n      if (kind === \"benefits\") {\n        buckets.benefits.push(...body, ...steps);\n        return;\n      }\n\n      if (kind === \"ingredients\") {\n        buckets.ingredients.push(...body, ...steps);\n        return;\n      }\n\n      if (kind === \"best-for\") {\n        buckets.bestFor.push(...body, ...steps);\n        return;\n      }\n\n      if (kind === \"details\") {\n        buckets.details.push(...body, ...steps);\n        return;\n      }\n\n      if (kind === \"story\") {\n        buckets.story.push(...body, ...steps);\n        return;\n      }\n\n      buckets.overview.push(...body, ...steps);\n    });\n\n    const sections = [];\n    const whatItIs = filterGuideLines([intro, ...buckets.overview.slice(0, 3)]);\n    const whatItDoes = filterGuideLines(buckets.benefits);\n    const howToBody = filterGuideLines(buckets.usageBody.slice(0, 2));\n    const normalizedHowToBody = [...howToBody];\n    let howToSteps = filterGuideLines(buckets.usageSteps).slice(0, 6);\n\n    if (howToSteps.length === 1 && howToSteps[0].length > 110) {\n      normalizedHowToBody.push(howToSteps[0]);\n      howToSteps = [];\n    }\n\n    const whoItsFor = filterGuideLines(buckets.bestFor);\n    const ingredients = filterGuideLines(buckets.ingredients);\n    const details = filterGuideLines([...buckets.details, ...buckets.story]);\n\n    if (whatItIs.length) {\n      sections.push({\n        heading: \"What it is\",\n        body: whatItIs\n      });\n    }\n\n    if (whatItDoes.length) {\n      sections.push({\n        heading: \"What it does\",\n        body: whatItDoes.slice(0, 5)\n      });\n    }\n\n    if (normalizedHowToBody.length || howToSteps.length) {\n      sections.push({\n        heading: \"How to use it\",\n        body: normalizedHowToBody.length\n          ? normalizedHowToBody\n          : [`Make ${product.title} part of your routine in a few simple steps:`],\n        steps: howToSteps\n      });\n    }\n\n    if (whoItsFor.length) {\n      sections.push({\n        heading: \"Who it's for\",\n        body: whoItsFor.slice(0, 4)\n      });\n    }\n\n    if (ingredients.length) {\n      sections.push({\n        heading: \"What's inside\",\n        body: ingredients.slice(0, 6)\n      });\n    }\n\n    if (details.length) {\n      sections.push({\n        heading: \"Everything else you should know\",\n        body: details.slice(0, 6)\n      });\n    }\n\n    return {\n      intro,\n      sections: sections.filter((section) => (section.body && section.body.length) || (section.steps && section.steps.length))\n    };\n  }\n\n  function tokenizeProductText(value) {\n    return String(value ?? \"\")\n      .toLowerCase()\n      .split(/[^a-z0-9]+/)\n      .map((part) => part.trim())\n      .filter((part) => part.length > 2 && !GUIDE_STOP_WORDS.has(part));\n  }\n\n  function getProductKeywords(product) {\n    return new Set(\n      tokenizeProductText(\n        [\n          product?.title,\n          product?.type,\n          product?.collection_title,\n          product?.collection_handle,\n          ...(Array.isArray(product?.tags) ? product.tags : [])\n        ]\n          .filter(Boolean)\n          .join(\" \")\n      )\n    );\n  }\n\n  function getProductExcerpt(product, maxLength = 124) {\n    const text = stripHtml(product?.description_html || \"\");\n    return truncate(getMeaningfulSentence(text), maxLength);\n  }\n\n  function sharedSetCount(left, right) {\n    let count = 0;\n    left.forEach((value) => {\n      if (right.has(value)) count += 1;\n    });\n    return count;\n  }\n\n  function getRelatedProducts(product, state) {\n    const allProducts = Array.from(state.productMap.values());\n    const referenceKeywords = getProductKeywords(product);\n    const referenceVendor = product.vendor_label || normalizeVendorLabel(product);\n\n    const ranked = allProducts\n      .filter((candidate) => candidate.handle !== product.handle && candidate.available !== false)\n      .map((candidate) => {\n        const candidateKeywords = getProductKeywords(candidate);\n        const sharedKeywords = sharedSetCount(referenceKeywords, candidateKeywords);\n        const sharedTags = sharedSetCount(\n          new Set((product.tags || []).map((tag) => normalizeHandle(tag))),\n          new Set((candidate.tags || []).map((tag) => normalizeHandle(tag)))\n        );\n        const candidateVendor = candidate.vendor_label || normalizeVendorLabel(candidate);\n        let score = 0;\n\n        if (candidate.collection_handle && candidate.collection_handle === product.collection_handle) score += 60;\n        if (candidate.type && product.type && candidate.type === product.type) score += 18;\n        if (sharedTags) score += sharedTags * 14;\n        if (sharedKeywords) score += sharedKeywords * 5;\n        if (\n          referenceVendor &&\n          candidateVendor &&\n          referenceVendor === candidateVendor &&\n          !GENERIC_VENDOR_LABELS.has(referenceVendor.toLowerCase())\n        ) {\n          score += 16;\n        }\n\n        return { candidate, score };\n      })\n      .sort((left, right) => right.score - left.score || left.candidate.title.localeCompare(right.candidate.title));\n\n    return [product, ...ranked.map((entry) => entry.candidate)].slice(0, 5);\n  }\n\n  function buildProductGuide(product, state, explicitCollectionHandle) {\n    const normalizedHandle = normalizeHandle(product.handle);\n    const guideProfile = getRouteineGuideProfile(normalizedHandle);\n    const collectionHandle = normalizeHandle(explicitCollectionHandle || product.collection_handle);\n    const defaultCollectionTitle =\n      product.collection_title ||\n      (collectionHandle ? humanizeHandle(collectionHandle) : \"\") ||\n      product.vendor_label ||\n      \"Product guide\";\n    const collectionTitle = guideProfile?.category || (isRouteineFamilyHandle(normalizedHandle) ? \"ROUTEine ritual\" : defaultCollectionTitle);\n    const collectionUrl =\n      product.collection_url || (collectionHandle ? `/collections/${collectionHandle}` : \"\");\n    const parsed = parseProductSections(product);\n    const shaped = buildStructuredProductSections(product, parsed);\n    const summary =\n      guideProfile?.summary ||\n      buildGuideSummary(shaped.intro, stripHtml(product.description_html)) ||\n      `A closer look at ${product.title}.`;\n    const relatedProducts = getRelatedProducts(\n      {\n        ...product,\n        collection_handle: collectionHandle,\n        collection_title: collectionTitle,\n        collection_url: collectionUrl\n      },\n      state\n    );\n    const routeineProducts = isRouteineFamilyHandle(normalizedHandle)\n      ? getRouteineGuideProducts(normalizedHandle)\n      : null;\n    const context = getGuideContext(product, collectionTitle, collectionHandle);\n    const editorialSections = buildEditorialProductSections(product, shaped.sections, relatedProducts, context);\n    const routeineSections =\n      guideProfile?.sections && isRouteineFamilyHandle(normalizedHandle)\n        ? buildRouteineEditorialSections(product, guideProfile.sections, relatedProducts, context)\n        : null;\n    const guideSections = routeineSections || guideProfile?.sections || (editorialSections.length ? editorialSections : shaped.sections);\n    const quickFacts = buildProductGuideQuickFacts(product, shaped.sections, relatedProducts, context);\n    const editNote = buildEditNote(product, context);\n\n    return {\n      slug: product.handle,\n      title: guideProfile?.title || product.title,\n      category: collectionTitle,\n      summary,\n      readTime:\n        guideProfile?.readTime ||\n        product.read_time ||\n        estimateReadTime(`${shaped.intro} ${stripHtml(product.description_html)}`),\n      image: product.featured_image || product.images[0] || \"\",\n      intro: guideProfile?.intro || shaped.intro,\n      sections: guideSections,\n      products: routeineProducts || relatedProducts.map((entry) => entry.handle),\n      relatedCollection: guideProfile?.relatedCollection || (isRouteineFamilyHandle(normalizedHandle)\n        ? {\n            slug: \"ritual-guide\",\n            label: \"See the full ROUTEine ritual guide\",\n            url: \"/pages/ritual-guide\"\n          }\n        : collectionHandle\n        ? {\n            slug: collectionHandle,\n            label: `Shop all ${collectionTitle}`,\n            url: collectionUrl\n          }\n        : null),\n      quickFacts,\n      editNote,\n      primaryHandle: product.handle,\n      isProductGuide: true\n    };\n  }\n\n  function buildGuideChips(guide, primaryProduct) {\n    const chips = [guide.readTime, guide.category];\n\n    if (primaryProduct?.handle && isRouteineFamilyHandle(primaryProduct.handle)) {\n      chips.push(getRouteineStepLabel(primaryProduct.handle));\n      chips.push(\"Founder-built\");\n    } else if (primaryProduct?.collection_title && primaryProduct.collection_title !== guide.category) {\n      chips.push(primaryProduct.collection_title);\n    }\n\n    return uniqueItems(chips).slice(0, 4);\n  }\n\n  function buildGuideHighlights(guide, primaryProduct) {\n    if (primaryProduct?.handle && ROUTEINE_GUIDE_HIGHLIGHTS[normalizeHandle(primaryProduct.handle)]) {\n      return ROUTEINE_GUIDE_HIGHLIGHTS[normalizeHandle(primaryProduct.handle)];\n    }\n\n    return uniqueItems(\n      (guide.sections || [])\n        .filter((section) =>\n          [\"What it does\", \"Who it's for\", \"What's inside\", \"Everything else you should know\"].includes(section.heading)\n        )\n        .flatMap((section) => [...(section.body || []), ...(section.steps || [])])\n        .map((line) => truncateSentence(line, 120))\n        .filter(Boolean)\n    ).slice(0, 3);\n  }\n\n  function buildGuideFounderNote(primaryProduct) {\n    if (primaryProduct?.handle && isRouteineFamilyHandle(primaryProduct.handle)) {\n      return ROUTEINE_FOUNDER_NOTE;\n    }\n\n    return \"\";\n  }\n\n  function renderPrice(product) {\n    const price = money(product.price);\n    const compareAt =\n      product.compare_at_price && product.compare_at_price > product.price\n        ? money(product.compare_at_price)\n        : \"\";\n\n    return compareAt\n      ? `<p class=\"learn-price\"><span>${escapeHtml(price)}</span><s>${escapeHtml(compareAt)}</s></p>`\n      : `<p class=\"learn-price\"><span>${escapeHtml(price)}</span></p>`;\n  }\n\n  function renderAddToCartControl(product, label, accent) {\n    if (!product?.variant_id || product.available === false) {\n      return `<span class=\"learn-product-card__unavailable\">Sold out</span>`;\n    }\n\n    return `\n      <form class=\"learn-add-form learn-add-form--dual\" action=\"/cart/add\" method=\"post\">\n        <input type=\"hidden\" name=\"id\" value=\"${escapeHtml(String(product.variant_id))}\">\n        <input type=\"hidden\" name=\"quantity\" value=\"1\">\n        <div class=\"learn-product-card__action-group\">\n          <button class=\"learn-pill-button\" type=\"submit\">${escapeHtml(label || \"Add to cart\")}</button>\n          <button class=\"learn-pill-button learn-pill-button--accent\" type=\"submit\" data-buy-now>Buy now</button>\n        </div>\n      </form>\n    `;\n  }\n\n  function renderProductCard(product) {\n    if (!product) return \"\";\n\n    const image = product.featured_image || product.images[0] || \"\";\n    const secondaryImage = product.images[1] && product.images[1] !== image ? product.images[1] : \"\";\n    const kicker = product.vendor || product.collection_title || product.type || \"Wellness Route\";\n    const vendorLabel = getProductDisplayBrand(product);\n    const displayKicker = vendorLabel || (kicker === \"Wellness Route\" ? \"The Wellness Route\" : kicker);\n    const saleBadge =\n      product.compare_at_price && product.compare_at_price > product.price\n        ? '<span class=\"learn-product-card__badge\">Sale</span>'\n        : \"\";\n    const cardClass = secondaryImage ? \"learn-product-card learn-product-card--dual\" : \"learn-product-card\";\n    const note = getProductExcerpt(product, 104);\n\n    return `\n      <article class=\"${cardClass}\">\n        <a class=\"learn-product-card__media\" href=\"${escapeHtml(product.url)}\">\n          <span class=\"learn-product-card__image-frame\">\n            ${saleBadge}\n            ${image ? `<img class=\"learn-product-card__primary\" src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(product.title)}\" loading=\"lazy\">` : \"\"}\n            ${\n              secondaryImage\n                ? `<img class=\"learn-product-card__secondary\" src=\"${escapeHtml(secondaryImage)}\" alt=\"\" loading=\"lazy\" aria-hidden=\"true\">`\n                : \"\"\n            }\n          </span>\n        </a>\n        <div class=\"learn-product-card__body\">\n          <p class=\"learn-product-card__kicker\">${escapeHtml(displayKicker)}</p>\n          <h3><a href=\"${escapeHtml(product.url)}\">${escapeHtml(product.title)}</a></h3>\n          ${note ? `<p class=\"learn-product-card__note\">${escapeHtml(note)}</p>` : \"\"}\n          <div class=\"learn-product-card__footer\">\n            ${renderPrice(product)}\n            <div class=\"learn-product-card__actions\">\n              ${renderAddToCartControl(product, \"Add to cart\", false)}\n            </div>\n          </div>\n        </div>\n      </article>\n    `;\n  }\n\n  function renderSpotlightCard(product, note) {\n    if (!product) return \"\";\n\n    const image = product.featured_image || product.images[0] || \"\";\n    const vendorLabel = getProductDisplayBrand(product);\n\n    return `\n      <article class=\"learn-spotlight\">\n        <a class=\"learn-spotlight__media\" href=\"${escapeHtml(product.url)}\">\n          ${image ? `<img src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(product.title)}\" loading=\"lazy\">` : \"\"}\n        </a>\n        <div class=\"learn-spotlight__body\">\n          <p class=\"page-card__kicker\">${escapeHtml(vendorLabel)} \u00B7 In this guide</p>\n          <h3>${escapeHtml(product.title)}</h3>\n          <p>${escapeHtml(note || product.summary || \"\")}</p>\n          <div class=\"learn-spotlight__footer\">\n            ${renderPrice(product)}\n            <div class=\"learn-spotlight__actions\">\n              ${renderAddToCartControl(product, \"Add to cart\", true)}\n            </div>\n          </div>\n        </div>\n      </article>\n    `;\n  }\n\n  function renderSteps(steps) {\n    if (!Array.isArray(steps) || !steps.length) return \"\";\n\n    return `\n      <ol class=\"learn-step-list\">\n        ${steps\n          .map(\n            (step, index) => `\n              <li>\n                <span>${index + 1}</span>\n                <p>${escapeHtml(step)}</p>\n              </li>\n            `\n          )\n          .join(\"\")}\n      </ol>\n    `;\n  }\n\n  function renderTip(tip) {\n    if (!tip) return \"\";\n\n    return `\n      <div class=\"learn-tip\">\n        <p><strong>Diana's tip:</strong> ${escapeHtml(tip)}</p>\n      </div>\n    `;\n  }\n\n  function renderGuideRailCard(product, guide, highlights) {\n    if (!product) return \"\";\n\n    const image = product.featured_image || product.images[0] || \"\";\n    const vendorLabel = getProductDisplayBrand(product);\n    const note = guide.summary || getProductExcerpt(product, 150);\n    const highlightMarkup = Array.isArray(highlights) && highlights.length\n      ? `<ul class=\"guide-editorial__trust-list\">${highlights\n          .map((highlight) => `<li>${escapeHtml(highlight)}</li>`)\n          .join(\"\")}</ul>`\n      : \"\";\n\n    return `\n      <article class=\"guide-editorial__rail-card\">\n        <a class=\"guide-editorial__rail-media\" href=\"${escapeHtml(product.url)}\">\n          ${image ? `<img src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(product.title)}\" loading=\"lazy\">` : \"\"}\n        </a>\n        <div class=\"guide-editorial__rail-copy\">\n          <p class=\"guide-editorial__rail-kicker\">${escapeHtml(vendorLabel)}</p>\n          <h2>${escapeHtml(product.title)}</h2>\n          <p class=\"guide-editorial__rail-note\">${escapeHtml(note)}</p>\n          ${renderPrice(product)}\n          <div class=\"guide-editorial__rail-actions\">\n            ${renderAddToCartControl(product, \"Add to cart\", true)}\n          </div>\n          ${highlightMarkup}\n        </div>\n      </article>\n    `;\n  }\n\n  function renderGuideToc(sections) {\n    const entries = (sections || [])\n      .map((section) => ({\n        id: slugify(section.heading),\n        heading: sanitizeGuideLine(section.heading)\n      }))\n      .filter((section) => section.id && section.heading);\n\n    if (!entries.length) return \"\";\n\n    return `\n      <aside class=\"guide-editorial__toc\">\n        <p class=\"guide-editorial__toc-kicker\">On this page</p>\n        <ul>\n          ${entries\n            .map(\n              (entry) => `<li><a href=\"#${escapeHtml(entry.id)}\">${escapeHtml(entry.heading)}</a></li>`\n            )\n            .join(\"\")}\n        </ul>\n      </aside>\n    `;\n  }\n\n  function renderFounderNote(note) {\n    if (!note) return \"\";\n\n    return `\n      <aside class=\"guide-editorial__founder\">\n        <p class=\"guide-editorial__founder-kicker\">From Diana</p>\n        <p>${escapeHtml(note)}</p>\n      </aside>\n    `;\n  }\n\n  function renderGuideQuickFacts(facts) {\n    if (!Array.isArray(facts) || !facts.length) return \"\";\n\n    return `\n      <section class=\"guide-editorial__facts\" aria-label=\"Quick take\">\n        ${facts\n          .map(\n            (fact) => `\n              <article class=\"guide-editorial__fact\">\n                <p class=\"guide-editorial__fact-label\">${escapeHtml(fact.label)}</p>\n                <p class=\"guide-editorial__fact-value\">${escapeHtml(fact.value)}</p>\n              </article>\n            `\n          )\n          .join(\"\")}\n      </section>\n    `;\n  }\n\n  function renderGuideEditNote(note) {\n    if (!note) return \"\";\n\n    return `\n      <aside class=\"guide-editorial__edit-note\">\n        <p class=\"guide-editorial__edit-note-kicker\">Why it's in the edit</p>\n        <p>${escapeHtml(note)}</p>\n      </aside>\n    `;\n  }\n\n  function renderShareSheetMarkup(config) {\n    const title = config?.title || \"Wellness Route\";\n    const text = config?.text || title;\n    const url = config?.url || window.location.href;\n    const label = config?.label || \"Share\";\n    const shareClass = config?.shareClass ? ` ${config.shareClass}` : \"\";\n    const useLocation = config?.useLocation ? ' data-share-use-location=\"true\"' : \"\";\n\n    return `\n      <details\n        class=\"share-sheet${shareClass}\"\n        data-share-root\n        data-share-mode=\"${escapeHtml(config?.mode || \"page\")}\"\n        data-share-title=\"${escapeHtml(title)}\"\n        data-share-text=\"${escapeHtml(text)}\"\n        data-share-url=\"${escapeHtml(url)}\"${useLocation}\n      >\n        <summary class=\"button button--secondary share-sheet__summary\">\n          <span class=\"button__icon share-sheet__summary-icon\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\">\n              <path d=\"M14.25 5.25h4.5v4.5\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n              <path d=\"M10.5 13.5 18.75 5.25\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n              <path d=\"M18.75 12.75v4.125A1.875 1.875 0 0 1 16.875 18.75H7.125A1.875 1.875 0 0 1 5.25 16.875V7.125A1.875 1.875 0 0 1 7.125 5.25h4.125\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n            </svg>\n          </span>\n          <span>${escapeHtml(label)}</span>\n        </summary>\n        <div class=\"share-sheet__menu\" role=\"group\" aria-label=\"Share options\">\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"native\">More options</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"copy\">Copy link</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"email\">Email</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"text\">Text</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"whatsapp\">WhatsApp</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"facebook\">Facebook</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"twitter\">X</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"linkedin\">LinkedIn</button>\n          <button class=\"share-sheet__option\" type=\"button\" data-share-action=\"pinterest\">Pinterest</button>\n        </div>\n        <p class=\"u-visually-hidden\" data-share-status aria-live=\"polite\"></p>\n      </details>\n    `;\n  }\n\n  function renderKeepReadingCard(guide) {\n    return `\n      <a class=\"journey-card page-card--link learn-keep-reading__card\" href=\"/pages/learn?guide=${encodeURIComponent(\n        guide.slug\n      )}\">\n        <div class=\"journey-card__image journey-card__image--editorial\">\n          <img src=\"${escapeHtml(guide.image)}\" alt=\"${escapeHtml(guide.title)}\" loading=\"lazy\">\n        </div>\n        <div class=\"journey-card__body\">\n          <p class=\"journey-card__kicker\">${escapeHtml(guide.category)}</p>\n          <h3>${escapeHtml(guide.title)}</h3>\n          <div class=\"learn-card__footer\">\n            <span class=\"learn-inline-link\">Read <span aria-hidden=\"true\">&rarr;</span></span>\n            <span class=\"learn-read-time\">${escapeHtml(guide.readTime)}</span>\n          </div>\n        </div>\n      </a>\n    `;\n  }\n\n  async function fetchProduct(handle, state, collectionContext) {\n    const normalizedHandle = normalizeHandle(handle);\n\n    if (!normalizedHandle) return null;\n    if (state.productMap.has(normalizedHandle)) return state.productMap.get(normalizedHandle);\n    if (state.pendingProducts.has(normalizedHandle)) return state.pendingProducts.get(normalizedHandle);\n\n    const request = window\n      .fetch(`/products/${encodeURIComponent(normalizedHandle)}.js`, {\n        headers: { Accept: \"application/json\" }\n      })\n      .then((response) => (response.ok ? response.json() : null))\n      .then((product) => {\n        if (!product) return null;\n        const normalizedProduct = normalizeRemoteProduct(\n          product,\n          collectionContext,\n          state.productMap.get(normalizedHandle)\n        );\n\n        if (normalizedProduct) {\n          state.productMap.set(normalizedHandle, normalizedProduct);\n        }\n\n        return normalizedProduct;\n      })\n      .catch(() => null)\n      .finally(() => {\n        state.pendingProducts.delete(normalizedHandle);\n      });\n\n    state.pendingProducts.set(normalizedHandle, request);\n    return request;\n  }\n\n  async function ensureProducts(handles, state, collectionHandle) {\n    const collectionContext = collectionHandle\n      ? {\n          handle: normalizeHandle(collectionHandle),\n          title: humanizeHandle(collectionHandle),\n          url: `/collections/${collectionHandle}`\n        }\n      : null;\n\n    const uniqueHandles = Array.from(new Set((handles || []).map((handle) => normalizeHandle(handle)).filter(Boolean)));\n    await Promise.all(uniqueHandles.map((handle) => fetchProduct(handle, state, collectionContext)));\n  }\n\n  async function renderGuideView(root, state, slug, explicitCollectionHandle) {\n    const guideShell = root.querySelector(\"[data-learn-guide-page]\");\n    const guideView = root.querySelector(\"[data-learn-guide-view]\");\n    const hub = root.querySelector(\"[data-learn-hub]\");\n\n    if (!guideShell || !guideView || !hub) return;\n\n    hub.hidden = true;\n    guideShell.hidden = false;\n    guideView.innerHTML = '<div class=\"learn-guide-loading\"><p>Loading guide...</p></div>';\n\n    const editorialGuide = state.editorialGuideMap.get(slug);\n    let guide = editorialGuide || null;\n\n    if (!guide) {\n      const product =\n        (await fetchProduct(\n          slug,\n          state,\n          explicitCollectionHandle\n            ? {\n                handle: normalizeHandle(explicitCollectionHandle),\n                title: humanizeHandle(explicitCollectionHandle),\n                url: `/collections/${explicitCollectionHandle}`\n              }\n            : null\n        )) || state.productMap.get(slug);\n\n      if (product) {\n        guide = buildProductGuide(product, state, explicitCollectionHandle);\n      }\n    }\n\n    if (!guide) {\n      guideView.innerHTML = `\n        <article class=\"learn-not-found\">\n          <h2>Guide not found</h2>\n          <p>We couldn't find that guide. Head back to the hub and choose another ritual.</p>\n          <a class=\"button\" href=\"/pages/learn\">Back to Learn</a>\n        </article>\n      `;\n      return;\n    }\n\n    const image = guide.isProductGuide ? guide.image : resolveGuideImage(guide, state);\n    const relatedHandles = Array.isArray(guide.products) ? guide.products : [];\n    const spotlightHandles = guide.sections.flatMap((section) =>\n      Array.isArray(section.spotlights) ? section.spotlights.map((spotlight) => spotlight.handle) : []\n    );\n\n    await ensureProducts([...relatedHandles, ...spotlightHandles], state, explicitCollectionHandle);\n\n    const sectionsMarkup = guide.sections\n      .map((section) => {\n        const spotlightsMarkup = Array.isArray(section.spotlights)\n          ? section.spotlights\n              .map((spotlight) =>\n                renderSpotlightCard(state.productMap.get(normalizeHandle(spotlight.handle)), spotlight.note)\n              )\n              .join(\"\")\n          : \"\";\n        const sectionId = slugify(section.heading);\n\n        return `\n          <section class=\"learn-article__section\" id=\"${escapeHtml(sectionId)}\">\n            <h2>${escapeHtml(section.heading)}</h2>\n            ${section.body.map((paragraph) => `<p>${escapeHtml(paragraph)}</p>`).join(\"\")}\n            ${renderSteps(section.steps)}\n            ${spotlightsMarkup}\n            ${renderTip(section.tip)}\n          </section>\n        `;\n      })\n      .join(\"\");\n\n    const shopProducts = relatedHandles\n      .map((handle) => state.productMap.get(normalizeHandle(handle)))\n      .filter(Boolean)\n      .slice(0, 5);\n\n    const shopMarkup = shopProducts.length\n      ? `\n          <section class=\"learn-shop\">\n            <div class=\"learn-shop__header section__header section__header--center\">\n              <p class=\"eyebrow\">Shop this guide</p>\n              <h2 class=\"section__title\">Everything mentioned, <span class=\"learn-accent-italic\">in one place.</span></h2>\n              <p class=\"section__intro\">The exact products from this article \u2014 ready when you are.</p>\n            </div>\n            <div class=\"learn-shop__grid\">\n              ${shopProducts.map((product) => renderProductCard(product)).join(\"\")}\n            </div>\n            ${\n              guide.relatedCollection?.url\n                ? `<div class=\"learn-shop__cta\"><a class=\"button button--secondary\" href=\"${escapeHtml(\n                    guide.relatedCollection.url\n                  )}\">${escapeHtml(guide.relatedCollection.label || \"Shop the collection\")}</a></div>`\n                : \"\"\n            }\n          </section>\n        `\n      : \"\";\n\n    const primaryProduct =\n      state.productMap.get(normalizeHandle(guide.primaryHandle || guide.slug)) ||\n      shopProducts[0] ||\n      null;\n    const heroChips = buildGuideChips(guide, primaryProduct);\n    const railHighlights = buildGuideHighlights(guide, primaryProduct);\n    const founderNote = buildGuideFounderNote(primaryProduct);\n    const railMarkup = primaryProduct\n      ? renderGuideRailCard(primaryProduct, guide, railHighlights)\n      : \"\";\n    const tocMarkup = renderGuideToc(guide.sections);\n    const founderMarkup = renderFounderNote(founderNote);\n    const factsMarkup = renderGuideQuickFacts(guide.quickFacts);\n    const editNoteMarkup = renderGuideEditNote(guide.editNote);\n    const introParagraphs = buildIntroParagraphs(guide.intro);\n    const secondaryActionHref =\n      primaryProduct && guide.relatedCollection?.url && guide.relatedCollection.url !== primaryProduct.url\n        ? guide.relatedCollection.url\n        : primaryProduct?.url || guide.relatedCollection?.url || \"/pages/learn\";\n    const secondaryActionLabel =\n      primaryProduct && guide.relatedCollection?.url && guide.relatedCollection.url !== primaryProduct.url\n        ? guide.relatedCollection.label || \"Keep exploring\"\n        : primaryProduct\n        ? \"View product\"\n        : \"Back to Learn\";\n\n    const keepReadingGuides = state.editorialGuides\n      .filter((entry) => entry.slug !== guide.slug)\n      .map((entry) => ({\n        ...entry,\n        image: resolveGuideImage(entry, state)\n      }))\n      .slice(0, 3);\n\n    guideView.innerHTML = `\n      <article class=\"guide-editorial learn-guide-article\">\n        <section class=\"section guide-editorial__hero\">\n          <div class=\"guide-editorial__hero-shell${image ? \"\" : \" guide-editorial__hero-shell--single\"}\">\n            <div class=\"guide-editorial__copy\">\n              <a class=\"learn-article__back\" href=\"/pages/learn\">\u2190 Back to the guides hub</a>\n              <p class=\"eyebrow\">${escapeHtml(guide.category)}</p>\n              <h1 class=\"section__title\">${escapeHtml(guide.title)}</h1>\n              <p class=\"section__intro\">${escapeHtml(guide.summary)}</p>\n              <div class=\"guide-editorial__chips\">\n                ${heroChips.map((chip) => `<span class=\"guide-editorial__chip\">${escapeHtml(chip)}</span>`).join(\"\")}\n              </div>\n              <div class=\"guide-editorial__hero-actions\">\n                <a class=\"button\" href=\"#guide-shop\">Shop this guide</a>\n                <a class=\"button button--secondary\" href=\"${escapeHtml(secondaryActionHref)}\">${escapeHtml(\n                  secondaryActionLabel\n                )}</a>\n                ${renderShareSheetMarkup({\n                  title: guide.title,\n                  text: guide.summary,\n                  url: window.location.href,\n                  label: \"Share\",\n                  mode: \"page\",\n                  shareClass: \"share-sheet--hero\",\n                  useLocation: true\n                })}\n              </div>\n            </div>\n            ${\n              image\n                ? `<div class=\"guide-editorial__media\"><div class=\"guide-editorial__media-card\"><img src=\"${escapeHtml(\n                    image\n                  )}\" alt=\"${escapeHtml(guide.title)}\" loading=\"lazy\"></div></div>`\n                : \"\"\n            }\n          </div>\n        </section>\n\n        <section class=\"section section--alt\">\n          <div class=\"guide-editorial__content-grid\">\n            <div class=\"guide-editorial__article\">\n              <div class=\"guide-editorial__article-shell\">\n                <div class=\"guide-editorial__article-intro\">\n                  ${introParagraphs.map((paragraph) => `<p>${escapeHtml(paragraph)}</p>`).join(\"\")}\n                </div>\n                ${factsMarkup}\n                ${editNoteMarkup}\n                <div class=\"learn-article__body\">\n                  ${sectionsMarkup}\n                </div>\n              </div>\n\n              ${shopMarkup.replace('<section class=\"learn-shop\">', '<section class=\"learn-shop\" id=\"guide-shop\">')}\n            </div>\n\n            <aside class=\"guide-editorial__rail\">\n              ${railMarkup}\n              ${tocMarkup}\n              ${founderMarkup}\n            </aside>\n          </div>\n        </section>\n      </article>\n\n      <section class=\"learn-keep-reading\">\n        <div class=\"section__header section__header--center\">\n          <h2 class=\"section__title\">Keep reading</h2>\n        </div>\n        <div class=\"learn-keep-reading__grid\">\n          ${keepReadingGuides.map((entry) => renderKeepReadingCard(entry)).join(\"\")}\n        </div>\n      </section>\n\n      <section class=\"section\">\n        <div class=\"quiz-cta\">\n          <h2 class=\"section__title\">Ready to put it into practice?</h2>\n          <p class=\"section__intro\">Take the quiz and we'll turn these ideas into a routine made for you.</p>\n          <a class=\"button\" href=\"/pages/quiz\">Take the quiz</a>\n        </div>\n      </section>\n    `;\n\n    if (window.WellnessRoute?.syncShareSheets instanceof Function) {\n      window.WellnessRoute.syncShareSheets(guideView);\n    }\n  }\n\n  function renderHub(root) {\n    const guideShell = root.querySelector(\"[data-learn-guide-page]\");\n    const hub = root.querySelector(\"[data-learn-hub]\");\n\n    if (!guideShell || !hub) return;\n\n    hub.hidden = false;\n    guideShell.hidden = true;\n  }\n\n  document.querySelectorAll(\"[data-learn-page-root]\").forEach((root) => {\n    const assetMap = parseJson(root, \"[data-learn-asset-map]\") || {};\n    const productData = parseJson(root, \"[data-learn-product-data]\") || [];\n    const productMap = new Map();\n\n    productData\n      .map((product) => normalizeEmbeddedProduct(product))\n      .filter(Boolean)\n      .forEach((product) => {\n        productMap.set(product.handle, product);\n      });\n\n    const editorialGuides = EDITORIAL_GUIDES.slice();\n\n    const state = {\n      assetMap,\n      editorialGuides,\n      editorialGuideMap: new Map(editorialGuides.map((guide) => [guide.slug, guide])),\n      productMap,\n      pendingProducts: new Map()\n    };\n\n    const url = new URL(window.location.href);\n    const queryGuide = normalizeHandle(url.searchParams.get(\"guide\"));\n    const collectionHandle = normalizeHandle(url.searchParams.get(\"collection\"));\n    const hashMatch = window.location.hash.match(/^#guide-(.+)$/);\n\n    if (!queryGuide && hashMatch?.[1]) {\n      url.searchParams.set(\"guide\", hashMatch[1]);\n      url.hash = \"\";\n      window.location.replace(url.toString());\n      return;\n    }\n\n    if (!queryGuide) {\n      renderHub(root);\n      return;\n    }\n\n    renderGuideView(root, state, queryGuide, collectionHandle);\n  });\n})();\n"],
  "mappings": "CAAC,IAAM,CACL,MAAM,iBAAmB,CACvB,CACE,KAAM,iBACN,MAAO,kCACP,SAAU,eACV,QAAS,qHACT,SAAU,aACV,MAAO,qBACP,MACE,qQACF,SAAU,CACR,CACE,QAAS,yCACT,KAAM,CACJ,oUACA,0PACF,CACF,EACA,CACE,QAAS,2CACT,KAAM,CACJ,sQACA,iHACF,EACA,IAAK,4HACL,WAAY,CACV,CACE,OAAQ,4CACR,KAAM,iHACR,CACF,CACF,EACA,CACE,QAAS,wCACT,KAAM,CACJ,iRACA,uHACF,EACA,WAAY,CACV,CACE,OAAQ,uCACR,KAAM,0GACR,CACF,CACF,EACA,CACE,QAAS,sCACT,KAAM,CACJ,kOACF,EACA,WAAY,CACV,CACE,OAAQ,mBACR,KAAM,4GACR,EACA,CACE,OAAQ,qBACR,KAAM,iFACR,CACF,CACF,EACA,CACE,QAAS,kCACT,KAAM,CACJ,mQACF,EACA,WAAY,CACV,CACE,OAAQ,iCACR,KAAM,qGACR,CACF,EACA,IAAK,8HACP,CACF,EACA,SAAU,CACR,4CACA,uCACA,mBACA,qBACA,gCACF,EACA,kBAAmB,CACjB,KAAM,YACN,MAAO,qBACP,IAAK,wBACP,CACF,EACA,CACE,KAAM,oBACN,MAAO,0CACP,SAAU,gBACV,QAAS,sHACT,SAAU,aACV,MAAO,6BACP,MACE,sPACF,SAAU,CACR,CACE,QAAS,+BACT,KAAM,CACJ,sTACA,4IACF,CACF,EACA,CACE,QAAS,wBACT,KAAM,CACJ,6VACF,CACF,EACA,CACE,QAAS,yCACT,KAAM,CACJ,+QACF,EACA,WAAY,CACV,CACE,OAAQ,gBACR,KAAM,mGACR,EACA,CACE,OAAQ,8DACR,KAAM,iGACR,EACA,CACE,OAAQ,gCACR,KAAM,6EACR,CACF,CACF,EACA,CACE,QAAS,+CACT,KAAM,CACJ,oOACF,EACA,WAAY,CACV,CACE,OAAQ,iCACR,KAAM,oFACR,EACA,CACE,OAAQ,6BACR,KAAM,mFACR,EACA,CACE,OAAQ,4CACR,KAAM,qFACR,CACF,CACF,EACA,CACE,QAAS,+BACT,KAAM,CACJ,oQACF,EACA,MAAO,CACL,4CACA,yEACA,6DACA,iEACF,EACA,IAAK,+HACP,CACF,EACA,SAAU,CACR,gBACA,8DACA,gCACA,iCACA,6BACA,2CACF,EACA,kBAAmB,CACjB,KAAM,oBACN,MAAO,uBACP,IAAK,gCACP,CACF,EACA,CACE,KAAM,UACN,MAAO,yCACP,SAAU,kBACV,QAAS,yHACT,SAAU,aACV,MAAO,kBACP,MACE,kOACF,SAAU,CACR,CACE,QAAS,oBACT,KAAM,CACJ,oTACF,CACF,EACA,CACE,QAAS,sCACT,KAAM,CACJ,iMACF,EACA,IAAK,uHACP,EACA,CACE,QAAS,yBACT,KAAM,CACJ,kMACF,EACA,MAAO,CACL,+EACA,6DACA,iEACA,8DACA,kEACF,CACF,EACA,CACE,QAAS,qBACT,KAAM,CACJ,oQACF,EACA,WAAY,CACV,CACE,OAAQ,qCACR,KAAM,yFACR,EACA,CACE,OAAQ,0CACR,KAAM,gEACR,EACA,CACE,OAAQ,iCACR,KAAM,+FACR,CACF,CACF,EACA,CACE,QAAS,8BACT,KAAM,CACJ,gPACF,EACA,WAAY,CACV,CACE,OAAQ,qDACR,KAAM,2EACR,EACA,CACE,OAAQ,uCACR,KAAM,qGACR,CACF,CACF,CACF,EACA,SAAU,CACR,qCACA,0CACA,iCACA,qDACA,sCACF,EACA,kBAAmB,CACjB,KAAM,eACN,MAAO,kCACP,IAAK,2BACP,CACF,EACA,CACE,KAAM,mBACN,MAAO,0CACP,SAAU,YACV,QAAS,gHACT,SAAU,aACV,MAAO,gBACP,MACE,iQACF,SAAU,CACR,CACE,QAAS,8BACT,KAAM,CACJ,4QACF,CACF,EACA,CACE,QAAS,0CACT,KAAM,CACJ,oMACF,EACA,WAAY,CACV,CACE,OAAQ,mCACR,KAAM,+DACR,EACA,CACE,OAAQ,uCACR,KAAM,0EACR,CACF,CACF,EACA,CACE,QAAS,uCACT,KAAM,CACJ,yMACF,EACA,WAAY,CACV,CACE,OAAQ,kCACR,KAAM,gEACR,EACA,CACE,OAAQ,iCACR,KAAM,2EACR,CACF,EACA,IAAK,kHACP,EACA,CACE,QAAS,uCACT,KAAM,CACJ,6KACF,EACA,WAAY,CACV,CACE,OAAQ,gCACR,KAAM,yFACR,CACF,CACF,EACA,CACE,QAAS,gBACT,KAAM,CACJ,8PACF,CACF,CACF,EACA,SAAU,CACR,mCACA,uCACA,kCACA,iCACA,+BACF,EACA,kBAAmB,CACjB,KAAM,YACN,MAAO,qBACP,IAAK,wBACP,CACF,EACA,CACE,KAAM,oBACN,MAAO,sCACP,SAAU,cACV,QAAS,oHACT,SAAU,aACV,MAAO,iBACP,MACE,0OACF,SAAU,CACR,CACE,QAAS,2BACT,KAAM,CACJ,4RACF,CACF,EACA,CACE,QAAS,wBACT,KAAM,CACJ,wWACF,EACA,WAAY,CACV,CACE,OAAQ,+BACR,KAAM,sFACR,EACA,CACE,OAAQ,2BACR,KAAM,4EACR,EACA,CACE,OAAQ,mCACR,KAAM,qEACR,CACF,CACF,EACA,CACE,QAAS,yBACT,KAAM,CACJ,6VACF,EACA,IAAK,wJACP,EACA,CACE,QAAS,mCACT,KAAM,CACJ,0NACF,EACA,WAAY,CACV,CACE,OAAQ,iCACR,KAAM,yFACR,EACA,CACE,OAAQ,mCACR,KAAM,kEACR,CACF,CACF,EACA,CACE,QAAS,qCACT,KAAM,CAAC,8DAAyD,EAChE,MAAO,CACL,yEACA,0EACA,iEACA,+DACA,kDACF,CACF,CACF,EACA,SAAU,CACR,+BACA,2BACA,mCACA,iCACA,kCACF,EACA,kBAAmB,CACjB,KAAM,YACN,MAAO,qBACP,IAAK,wBACP,CACF,EACA,CACE,KAAM,iBACN,MAAO,6CACP,SAAU,WACV,QAAS,+GACT,SAAU,aACV,MAAO,mBACP,MACE,iNACF,SAAU,CACR,CACE,QAAS,+BACT,KAAM,CACJ,mPACF,CACF,EACA,CACE,QAAS,sCACT,KAAM,CACJ,kRACF,EACA,WAAY,CACV,CACE,OAAQ,6BACR,KAAM,+EACR,CACF,CACF,EACA,CACE,QAAS,oBACT,KAAM,CACJ,yOACF,EACA,WAAY,CACV,CACE,OACE,+CACF,KAAM,mEACR,EACA,CACE,OAAQ,kCACR,KAAM,kFACR,CACF,CACF,EACA,CACE,QAAS,8BACT,KAAM,CACJ,yLACF,EACA,WAAY,CACV,CACE,OAAQ,+BACR,KAAM,2EACR,CACF,EACA,IAAK,+HACP,EACA,CACE,QAAS,2BACT,KAAM,CACJ,yNACF,EACA,WAAY,CACV,CACE,OAAQ,wBACR,KAAM,kFACR,EACA,CACE,OAAQ,mBACR,KAAM,kHACR,CACF,CACF,CACF,EACA,SAAU,CACR,6BACA,kCACA,+BACA,wBACA,kBACF,EACA,kBAAmB,CACjB,KAAM,sBACN,MAAO,2BACP,IAAK,kCACP,CACF,CACF,EAEM,sBAAwB,CAC5B,mBACA,4CACA,uCACA,uDACA,kCACF,EAEM,wBAA0B,CAC9B,4CAA6C,CAC3C,MAAO,4CACP,SAAU,kBACV,QACE,0HACF,SAAU,aACV,MACE,oMACF,SAAU,CACR,CACE,QAAS,aACT,KAAM,CACJ,6LACF,CACF,EACA,CACE,QAAS,eACT,KAAM,CACJ,0LACF,CACF,EACA,CACE,QAAS,gBACT,KAAM,CAAC,gGAAgG,EACvG,MAAO,CACL,oCACA,iEACA,mDACA,gDACF,CACF,EACA,CACE,QAAS,gCACT,KAAM,CACJ,yKACF,EACA,IAAK,2GACP,CACF,EACA,SAAU,CACR,4CACA,mBACA,uCACA,uDACA,kCACF,EACA,kBAAmB,CACjB,KAAM,eACN,MAAO,qCACP,IAAK,qBACP,CACF,EACA,uCAAwC,CACtC,MAAO,uCACP,SAAU,kBACV,QACE,2HACF,SAAU,aACV,MACE,iLACF,SAAU,CACR,CACE,QAAS,aACT,KAAM,CACJ,iLACF,CACF,EACA,CACE,QAAS,eACT,KAAM,CACJ,2JACF,CACF,EACA,CACE,QAAS,gBACT,KAAM,CAAC,kGAAkG,EACzG,MAAO,CACL,+BACA,0DACA,6BACA,oEACF,CACF,EACA,CACE,QAAS,gCACT,KAAM,CACJ,wLACF,EACA,IAAK,yGACP,CACF,EACA,SAAU,CACR,uCACA,mBACA,4CACA,uDACA,kCACF,EACA,kBAAmB,CACjB,KAAM,eACN,MAAO,qCACP,IAAK,qBACP,CACF,EACA,uDAAwD,CACtD,MAAO,mEACP,SAAU,kBACV,QACE,0IACF,SAAU,aACV,MACE,2LACF,SAAU,CACR,CACE,QAAS,aACT,KAAM,CACJ,2JACF,CACF,EACA,CACE,QAAS,eACT,KAAM,CACJ,sMACF,CACF,EACA,CACE,QAAS,gBACT,KAAM,CAAC,mDAAmD,EAC1D,MAAO,CACL,uDACA,oDACA,0CACA,8CACF,CACF,EACA,CACE,QAAS,gCACT,KAAM,CACJ,qLACF,EACA,IAAK,+GACP,CACF,EACA,SAAU,CACR,uDACA,mBACA,4CACA,uCACA,kCACF,EACA,kBAAmB,CACjB,KAAM,eACN,MAAO,qCACP,IAAK,qBACP,CACF,EACA,mCAAoC,CAClC,MAAO,qCACP,SAAU,kBACV,QACE,yHACF,SAAU,aACV,MACE,oKACF,SAAU,CACR,CACE,QAAS,aACT,KAAM,CACJ,2JACF,CACF,EACA,CACE,QAAS,eACT,KAAM,CACJ,uMACF,CACF,EACA,CACE,QAAS,gBACT,KAAM,CAAC,sEAAsE,EAC7E,MAAO,CACL,gDACA,0CACA,gDACA,kFACF,CACF,EACA,CACE,QAAS,gCACT,KAAM,CACJ,uKACF,EACA,IAAK,uHACP,CACF,EACA,SAAU,CACR,mCACA,mBACA,4CACA,uCACA,sDACF,EACA,kBAAmB,CACjB,KAAM,eACN,MAAO,qCACP,IAAK,qBACP,CACF,EACA,mBAAoB,CAClB,MAAO,4BACP,SAAU,kBACV,QACE,mIACF,SAAU,aACV,MACE,gOACF,SAAU,CACR,CACE,QAAS,yBACT,KAAM,CACJ,2MACF,CACF,EACA,CACE,QAAS,wBACT,KAAM,CAAC,6GAA6G,EACpH,MAAO,CACL,oEACA,wCACA,2CACA,kBACF,CACF,EACA,CACE,QAAS,wBACT,KAAM,CAAC,6DAA6D,EACpE,MAAO,CACL,0EACA,wDACA,uDACA,6EACF,CACF,EACA,CACE,QAAS,qBACT,KAAM,CACJ,0PACF,EACA,IAAK,yHACP,CACF,EACA,SAAU,CAC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",
  "names": []
}
