<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://henry.codes/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Writing from the desk of Henry (From Online)</title>
    <link>https://henry.codes/</link>
    <atom:link href="https://henry.codes/rss/writing.xml" rel="self" type="application/rss+xml" />
    <description>The personal site and portfolio of creative web developer Henry from Online</description>
    <language>en</language>
    
<item>
    <title>Dark Forestry</title>
    <link>https://henry.codes/writing/dark-forestry/</link>
    <description>

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot; class=&quot;no-js&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Dark Forestry | Henry From Online&lt;/title&gt;
    &lt;meta name=&quot;description&quot; content=&quot;Seasons are changing for technologists, and the industry we work in isn&amp;#39;t the same as it was a decade ago. We have new realities and new responsibilities to accept.&quot;&gt;

    &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;180x180&quot; href=&quot;https://henry.codes/meta/apple-touch-icon.png&quot;&gt;
    &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;32x32&quot; href=&quot;https://henry.codes/meta/favicon-32x32.png&quot;&gt;
    &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;16x16&quot; href=&quot;https://henry.codes/meta/favicon-16x16.png&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;https://front-end.social/@henry&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;https://github.com/xdesro&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;mailto:yo@henry.codes&quot;&gt;
    &lt;link rel=&quot;manifest&quot; href=&quot;https://henry.codes/meta/site.webmanifest&quot;&gt;
    &lt;link rel=&quot;mask-icon&quot; href=&quot;https://henry.codes/meta/safari-pinned-tab.svg&quot; color=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;msapplication-TileColor&quot; content=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;theme-color&quot; content=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;generator&quot; content=&quot;eleventy&quot;&gt;

    &lt;meta property=&quot;og:url&quot; content=&quot;https://henry.codes/writing/dark-forestry/&quot;&gt;
    &lt;meta property=&quot;og:image&quot; content=&quot;https://henry.codes/img/og/og-dark-forestry.jpg&quot;&gt;
    &lt;meta property=&quot;og:type&quot; content=&quot;website&quot;&gt;
    &lt;meta property=&quot;og:description&quot; content=&quot;Seasons are changing for technologists, and the industry we work in isn&amp;#39;t the same as it was a decade ago. We have new realities and new responsibilities to accept.&quot;&gt;

    &lt;!-- Webmentions --&gt;
    &lt;link rel=&quot;webmention&quot; href=&quot;https://webmention.io/henry.codes/webmention&quot;&gt;
    &lt;link rel=&quot;pingback&quot; href=&quot;https://webmention.io/henry.codes/xmlrpc&quot;&gt;

    &lt;!-- AT Proto --&gt;
    &lt;link rel=&quot;site.standard.document&quot; href=&quot;at://did:plc:pbr2nzfsr6bcqjeqlvohmh5y/site.standard.document/3mx5jua65ms2p&quot;&gt;

    &lt;link rel=&quot;preload&quot; href=&quot;https://henry.codes/fonts/subset-Louize.woff2&quot; as=&quot;font&quot; type=&quot;font/woff2&quot; crossorigin=&quot;&quot;&gt;
    &lt;link rel=&quot;preload&quot; href=&quot;https://henry.codes/img/custom/dark-forestry/albert-bierstadt_buffalo-trail.jpg&quot; as=&quot;image&quot; type=&quot;image/jpeg&quot;&gt;
    &lt;link rel=&quot;preload&quot; href=&quot;https://henry.codes/fonts/forevs-thin.woff2&quot; as=&quot;font&quot; type=&quot;font/woff2&quot; crossorigin=&quot;&quot;&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://henry.codes/css/fonts.css&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://henry.codes/css/custom/dark-forestry/index.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;main&gt;
        &lt;canvas class=&quot;forest&quot; aria-hidden=&quot;true&quot;&gt;&lt;/canvas&gt;
        &lt;section class=&quot;intro&quot;&gt;
            &lt;a class=&quot;intro__label intro__label--author&quot; href=&quot;https://henry.codes/&quot;&gt;A tiny website by Henry (from Online)&lt;/a&gt;
            &lt;div&gt;
                &lt;h1 class=&quot;intro__title&quot;&gt;Dark Forestry&lt;/h1&gt;
                &lt;p class=&quot;intro__subtitle&quot;&gt;notes on a new season for technologists&lt;/p&gt;
            &lt;/div&gt;
            &lt;div class=&quot;intro__footer&quot;&gt;
                &lt;span class=&quot;intro__label intro__label--word-count&quot;&gt;~1232 words; about a 5 minute read&lt;/span&gt;
                &lt;a class=&quot;intro__label intro__label--photo-cite&quot; href=&quot;https://www.nga.gov/artworks/166427-buffalo-trail-impending-storm&quot;&gt;Bierstadt, Albert. &lt;em&gt;Buffalo Trail: The Impending Storm&lt;/em&gt;. 1869.&lt;/a&gt;
            &lt;/div&gt;
            &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/albert-bierstadt_buffalo-trail-400w.webp 400w, https://henry.codes/img/albert-bierstadt_buffalo-trail-800w.webp 800w, https://henry.codes/img/albert-bierstadt_buffalo-trail-1400w.webp 1400w, https://henry.codes/img/albert-bierstadt_buffalo-trail-2000w.webp 2000w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;eager&quot; decoding=&quot;async&quot; class=&quot;intro__background&quot; src=&quot;https://henry.codes/img/albert-bierstadt_buffalo-trail-400w.jpeg&quot; alt=&quot; &quot; fetchpriority=&quot;high&quot; formats:=&quot;&quot; [&quot;avif&quot;,=&quot;&quot; &quot;webp&quot;,=&quot;&quot; &quot;jpeg&quot;]=&quot;&quot; width=&quot;2000&quot; height=&quot;1192&quot; srcset=&quot;https://henry.codes/img/albert-bierstadt_buffalo-trail-400w.jpeg 400w, https://henry.codes/img/albert-bierstadt_buffalo-trail-800w.jpeg 800w, https://henry.codes/img/albert-bierstadt_buffalo-trail-1400w.jpeg 1400w, https://henry.codes/img/albert-bierstadt_buffalo-trail-2000w.jpeg 2000w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
        &lt;/section&gt;
        &lt;section class=&quot;section&quot; id=&quot;a-walk-in-the-woods&quot;&gt;
        &lt;p class=&quot;punch punch--first&quot;&gt;We walk together in an autumnal spruce-fir forest on a crisp mountain morning.&lt;/p&gt;
&lt;p&gt;The peaks are yet enwreathed in fog, and the sunlight comes at an uncanny angle through the conifers and aspens. The air is cool and the understory is damp, all but silencing our footfall at the trailhead. The trail is wide and well-trod, but as we make our way up through the woods, the path forward becomes harder to find and follow. The underbrush overgrows, the canopy above weeps heavy yellow leaves and rusty needles, and the pines lift snide roots to catch unwary heels and ankles.&lt;/p&gt;
&lt;p&gt;You and I laugh off this encroachment, turning sideways to step between skeletal branches, reassuring each other it’ll clear up soon. Soon the trail will open to a wide open sky, we tell each other, a marshy meadow, a gossipy little snowmelt creek making its way with first-day-of-school nerves down to meet the Colorado River.&lt;/p&gt;
&lt;p&gt;But it doesn’t clear up. In fact it grows darker as Douglas Firs grow taller, blocking out the October sunlight. The trees are unkempt, sick with dwarf mistletoe and pine beetle. They lean claustrophobically into each other, and they choke the young trees below out of sun and nutrients and water.&lt;/p&gt;
&lt;p&gt;Then all at once we are plunged into darkness. That promised meadow lies unseen, and the trail is lost in every direction, scattered by a lack of care and by relentless, blighted growth.&lt;/p&gt;

        &lt;/section&gt;
        &lt;section class=&quot;section&quot; id=&quot;a-new-season&quot;&gt;
        &lt;p&gt;Well, old friends, I reckon this a new season for us.&lt;/p&gt;
&lt;p&gt;We don’t write code anymore, freelance budgets have turned to token spend, our email inboxes are stuffed with letters no one wrote, and our bosses make threats that we use the tech that usurps us or be fired. And the tech is effective — all of our last-season nervous laughter about &lt;em&gt;spicy autocorrect&lt;/em&gt; echoes off austere walls as agents write more and better code each day. And what recourse have we? What defense against this onslaught of talking machines? Craft, and &lt;em&gt;“the nobility of a day’s work”&lt;/em&gt;, once-proud heraldry against inconsiderate design and careless release cycles, are threadbare banners in winter winds.&lt;/p&gt;
&lt;p&gt;Beyond the day-to-day, bright-eyed technologists, come for the promise of creative problem-solving and good salaries, now squint into the unforgiving white glare of this new strange season. We’re not saving the world, rather we’re building the tools to surveil it. We’re training the machines that will come tomorrow to threaten our livelihoods. We sheepishly forgive ourselves daily for transgressions committed obliquely against our neighbors out of what we consider necessity — laboring daily under the maniacal feet of transphobic, racist billionaires, who use the profits we grow for them to subsidize the withering and delitigation of our human and civil rights. &lt;em&gt;Gotta pay the bills.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;All the infinite promise of technology is swallowed by the maw of capital’s seething hate of the labor on which it was, for so long, so reluctantly dependent.&lt;/p&gt;

        &lt;/section&gt;
        &lt;section class=&quot;section&quot; id=&quot;erosion&quot;&gt;
        &lt;p&gt;And frankly, my optimism for a better fate falters: The organized labor revolution never came. Workers walk a razorwire between rising costs of living and companies with bottomless coffers for legal violence, and for most of us, the risk is too high to try. Protests against the ecological impacts, or the extractive nature of the tooling and the work, or the ultimate impact to labor, are made to individuals — turning our ire against each other instead of the forces that demand we &lt;del&gt;adapt&lt;/del&gt; &lt;ins&gt;adopt&lt;/ins&gt; or die. It’s hard to fault people willing to compromise with these tools and their makers: as we’re finding out more than ever before, it doesn’t pay to stand on ethics. &lt;em&gt;Gotta pay the bills.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Higher up the chain, corporations have long abandoned an interest in delivering good products, narcotized in dogged pursuit of short-term profit and quarterly bottom lines. Venture capital props up parasitic mutants that extract subscription fees and dignity from workers in increasingly far-reaching industries. Those misshapen corporations then lurch forward, limping on predatory attention practices, sinister user experiences, and voracious data mining — animated by some twisted hope they might some day be profitable, no matter the cost.&lt;/p&gt;

        &lt;/section&gt;
        &lt;section class=&quot;section&quot;&gt;
        &lt;p class=&quot;punch&quot;&gt;The groundcover of the forest stays woefully damp &amp;amp; fetid in the eternal shade of rotten overgrowth, and healing wildfire never comes.&lt;/p&gt;

        &lt;/section&gt;
        &lt;section class=&quot;section&quot; id=&quot;tallying-up&quot;&gt;
        &lt;p&gt;So what is there to be made of work? For most of us, it’s resignation without resignation — a get-the-bag-and-go-home mindset. &lt;em&gt;It’s just a job. We gotta pay the bills.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s self-indulgent of me to not propose another path, to not think critically and tirelessly and synthesize some miraculous Brave Way Forward, but I’m weary too. I’ve got no solutions to offer those who have lost their enthusiasm and creative inertia to white-collar erosion. It’s somehow all connected and totally disconnected, and quite by design there’s no time in the day to make any sense of the whole dizzying machine.&lt;/p&gt;
&lt;p&gt;For technology, I don’t think there’s gonna be any going back. The jury is out for other industries, but at least for us computer freaks, especially those at companies well-funded enough to easily weather the changing cost of tokens, I don’t think most will be seeing a future without prompted code. I think there will always be real creatives &amp;amp; sickos in this industry who write amazing things by hand and properly innovate, and there will be prompt-maximalists who gastown their way through the 9-5, and there will always be folks who came here because it’s a paycheck, and find some balance between the two.&lt;/p&gt;
&lt;p&gt;As is often the case with these things, the path forward probably lies somewhere in the middle.&lt;/p&gt;

        &lt;/section&gt;
        &lt;section class=&quot;section&quot; id=&quot;some-theses&quot;&gt;
        &lt;p class=&quot;center&quot;&gt;&lt;em&gt;Here is what I think I know:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In this new season, &lt;span class=&quot;focus&quot;&gt;the threats to our livelihood loom larger than ever&lt;/span&gt;, and so too do the threats we pose to society &lt;em&gt;with&lt;/em&gt; our livelihood, as technologists in an increasingly technocratic environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a result of our own work, as a result of the technologies we ourselves developed, &lt;span class=&quot;focus&quot;&gt;it is harder than ever to connect with our fellow worker, with our fellow man&lt;/span&gt;, &lt;em&gt;so:&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;focus&quot;&gt;There has never been a better time for us to develop a system of principles and ethics&lt;/span&gt;, by which we weigh our decisions. Ultimately, we can be held accountable by no one but ourselves, so it &lt;em&gt;must&lt;/em&gt; be us, as individuals, as technologists, who do the holding.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In turn, &lt;span class=&quot;focus&quot;&gt;there has never been a better time to develop a strong sense of empathy for our neighbors&lt;/span&gt;. Especially as we come to this system of principled clarity, and — at the risk of appearing too sentimental — we should make room in our hearts for those of us who have not come to the same principles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In most things, &lt;span class=&quot;focus&quot;&gt;take a stance of harm reduction&lt;/span&gt;. Our generation will not be a pure and perfect one. We are all culpable, we are all great works-in-progress, and &lt;em&gt;a bit better&lt;/em&gt; is preferable to a perfection that never comes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As technologists, &lt;span class=&quot;focus&quot;&gt;we must organize our labor&lt;/span&gt;. Not only do &lt;a href=&quot;https://ethanmarcotte.com/books/you-deserve-a-tech-union/&quot;&gt;we deserve it&lt;/a&gt;, and not only do we owe it to ourselves, but most of all we owe it to the society that our output — our laggy websites, our UX anti-patterns, our data centers — will be inflicted upon. It is the only chance we have, and the only material impact we can have on our fate and the fate of our neighbors.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

        &lt;/section&gt;
        &lt;section class=&quot;section&quot; id=&quot;in-conclusion&quot;&gt;
        &lt;p&gt;And outside of work? How do we shake off the doom of the day? Beats me. Try taking the bus even if it takes a bit longer. Get a library card. Compliment your neighbors and drink iced tea on a park bench. Slow down and &lt;a href=&quot;https://www.ronnowpoetry.com/contents/ohara/TrueAccount.html#:~:text=And%20now,eyes%2E%22&quot;&gt;make your own days&lt;/a&gt;, rather than let them be made for you. We must be intentional, active members of our communities if we are to understand how we can serve them better. I have found I really enjoy reading books by careful thinkers and working on old motorcycles, and you might see if that works for you also.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today, however, we are having a hard time living because we are so bent on outwitting death.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;— Simone de Beauvoir&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks for reading. If you liked this, you can find me on my personal websites &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;on Bluesky&lt;/a&gt; and &lt;a href=&quot;https://front-end.social/@henry/&quot;&gt;Mastodon&lt;/a&gt; or reach me &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;via email&lt;/a&gt;. If you &lt;em&gt;didn’t&lt;/em&gt; like this, I must tell you that you dreamed the whole thing: Henry (from Online) was never real.&lt;/p&gt;
&lt;p&gt;As ever, unionize, free Palestine, trans rights are human rights, fix your heart or die.&lt;/p&gt;
&lt;p class=&quot;fin&quot;&gt;&lt;em&gt;fin.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://henry.codes/&quot; class=&quot;go-home&quot;&gt;go home&lt;/a&gt;&lt;/p&gt;

        &lt;/section&gt;
    &lt;/main&gt;
    &lt;script&gt;document.documentElement.classList.remove(&#39;no-js&#39;)&lt;/script&gt;
    &lt;script data-taxi-reload=&quot;&quot; src=&quot;https://henry.codes/js/dark-forestry/index.js&quot;&gt;&lt;/script&gt;
    &lt;script data-taxi-reload=&quot;&quot; src=&quot;https://cdn.usefathom.com/script.js&quot; data-site=&quot;ADEBIAUD&quot; defer=&quot;&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</description>
    <pubDate>Mon, 05 Oct 2026 18:16:54 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/dark-forestry/</guid>
</item>
<item>
    <title>I made a Plex server</title>
    <link>https://henry.codes/writing/i-made-a-plex-server/</link>
    <description>&lt;p&gt;There’s a lot to like about Plex from a philosophical standpoint — it’s local-first software centered around sharing your favorite art with your friends. Plex hosts movies, TV, and music — media you purchase because you love it, and share with your friends because we share media we love with our friends since time immemorial.&lt;/p&gt;
&lt;p&gt;I’ve been shaking loose streaming services for the past three or four years, kicking the strident bells of subscription renewal emails back into the grass — I think ownership is important. If I love a book I can keep it on my shelf, but if I love a movie I have to pay $19.99/mo forever and hope that the higher-ups at &lt;a href=&quot;https://i.kym-cdn.com/photos/images/original/003/056/633/b8b.png&quot;&gt;Poob Streaming Inc.&lt;/a&gt; don’t  decide to take it down. Plex is a natural answer to the tension between on-shelf ownership and on-line convenience: I purchase movies and I upload them to a server I own, and then I can conveniently share them with folks I love, and those folks can share with me in the same stroke.&lt;/p&gt;
&lt;p&gt;Here’s how I started hosting my own Plex server.&lt;/p&gt;
&lt;h2 id=&quot;hardware&quot; tabindex=&quot;-1&quot;&gt;Hardware&lt;/h2&gt;
&lt;p&gt;To run Plex the software, you need some hardware to run it on. Many folks will use a cloud service, but paying a new subscription to have someone else’s computer in another data center hold my media is opposed to the goal of paying once to hold a thing I own. I did a bit of research and decided to pick up a network-attached storage (NAS) device from Synology. This would offer a middle-of-the-road affordable home for the server to run on. This solution isn’t super cheap, but it’s also not super expensive.&lt;/p&gt;
&lt;p&gt;A NAS is basically just a toaster for hard drives that you staple to your internet router: the DS225+ I chose lets you mount two hard drives of basically any size and connect that storage to the internet. It has a 2.5Gb ethernet port, which is far more bandwidth than my small group of friends would ever use, has a decent operating system, and doesn’t use too much power. The downsides are chiefly that it &lt;em&gt;only&lt;/em&gt; lets you mount two drives (there are variants that are expandable), and it has pretty limited actual CPU and memory capacity (you can expand it), but I was happy with those downsides for my first foray into local server hosting.&lt;/p&gt;
&lt;p&gt;I bought the Synology DS225+ and a Seagate 4TB HDD from Micro Center for $500 total — again, you could go more premium or less, depending on your needs and allergies to tinkering.&lt;/p&gt;
&lt;h2 id=&quot;server-setup&quot; tabindex=&quot;-1&quot;&gt;Server setup&lt;/h2&gt;
&lt;p&gt;The first step of building the server was to install the drive, which was as simple as mounting the hard drive in the NAS hard drive tray and slotting it back in. This process had an extremely satisfying mechanical reload effect to it and I’d recommend this NAS purely off the &lt;em&gt;kachunk&lt;/em&gt; of it all.&lt;/p&gt;
&lt;p&gt;Second step was to connect the 2.5GbE port (there are two ethernet ports) to my router.&lt;/p&gt;
&lt;p&gt;Thirdly, I followed the setup wizard on &lt;a href=&quot;https://find.synology.com&quot;&gt;find.synology.com&lt;/a&gt;, which automatically detects Synology devices and lets you configure them for your &lt;abbr title=&quot;redundant array of independent disks&quot;&gt;RAID&lt;/abbr&gt; preferences, setup the operating system behaviors and user accounts.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-400w.webp 400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-800w.webp 800w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-1400w.webp 1400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-2154w.webp 2154w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-400w.jpeg&quot; alt=&quot;A website screenshot showing the headline &amp;quot;Find your Synology device&amp;quot;. There is a table of devices, one labeled plexiglass, which is presumably the author&#39;s device.&quot; width=&quot;2154&quot; height=&quot;602&quot; srcset=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-400w.jpeg 400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-800w.jpeg 800w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-1400w.jpeg 1400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-13_at_12.45.08_2x_pkkcpo-2154w.jpeg 2154w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;After this configuration process was completed, I’m able to visit the operating system (Synology calls it DiskStation Manager/DSM) at the IP address I got back from the wizard.&lt;/p&gt;
&lt;h3 id=&quot;folder-structure&quot; tabindex=&quot;-1&quot;&gt;Folder structure&lt;/h3&gt;
&lt;p&gt;Next I created a shared folder to keep my Plex libraries (Movies, TV, etc) in. The way the app works is that there is a place where the files that run the server live, and a separate place where the files that are &lt;em&gt;on&lt;/em&gt; the server live.&lt;/p&gt;
&lt;p&gt;In the Synology OS, &lt;strong&gt;Control Panel → Shared Folder → Create&lt;/strong&gt; gets me a new shared folder, which I called &lt;code&gt;media&lt;/code&gt;. In there, I created additional folders for each library Plex should be concerned with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;. 
└── media/ 
	├── Movies/ 
	├── TV/ 
	└── Music/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once I’ve got the Plex server installed on the NAS, I can point it at these directories, and keep my media files separate.&lt;/p&gt;
&lt;p&gt;As a quick important reiteration: &lt;code&gt;Plex Media Server/&lt;/code&gt; in the filesystem is &lt;em&gt;not&lt;/em&gt; where media lives. One needs to upload media to the dedicated library folders created.&lt;/p&gt;
&lt;h3 id=&quot;installing-plex&quot; tabindex=&quot;-1&quot;&gt;Installing Plex&lt;/h3&gt;
&lt;p&gt;In the Synology OS, I went to the Package Center and installed Plex Media Server, which is conveniently a first-class package for Synology.&lt;/p&gt;
&lt;p&gt;Once launched, I viewed the server setup screen at port &lt;code&gt;:32400&lt;/code&gt; on my NAS IP — the previous screenshot shows that the Plex URL would be &lt;code&gt;10.0.0.200:32400&lt;/code&gt;. The Plex setup is fairly straightforward, creating libraries like &lt;em&gt;Movies&lt;/em&gt; or &lt;em&gt;Music&lt;/em&gt; and pointing them at the correct folders.&lt;/p&gt;
&lt;p&gt;Also important to note, when configuring the Plex transcoding preferences, the DS225+ off the shelf does not have a ton of power for this kind of thing. I would recommend erring on the side of being kind to the CPU and scheduled transcoding tasks.&lt;/p&gt;
&lt;p&gt;Once the server is up-and-running, you’ll be able to access it as a user (instead of a server admin) by visiting &lt;code&gt;app.plex.tv/desktop&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;adding-media&quot; tabindex=&quot;-1&quot;&gt;Adding media&lt;/h2&gt;
&lt;p&gt;On my Mac laptop and my Windows workhorse PC, I added the NAS as a filesystem target so I could move files onto it.&lt;/p&gt;
&lt;h3 id=&quot;on-windows&quot; tabindex=&quot;-1&quot;&gt;On Windows&lt;/h3&gt;
&lt;p&gt;It’s called “&lt;a href=&quot;https://support.microsoft.com/en-us/windows/experience/connectivity-networking/file-sharing-over-a-network-in-windows&quot;&gt;mapping a network drive&lt;/a&gt;” on Windows — &lt;strong&gt;File Explorer → More ⋯ → Map network drive&lt;/strong&gt;, and then set the network address to the network of the NAS.&lt;/p&gt;
&lt;h3 id=&quot;on-mac-os&quot; tabindex=&quot;-1&quot;&gt;On MacOS&lt;/h3&gt;
&lt;p&gt;On a Mac it’s called “Connect to Server” in Finder: &lt;strong&gt;Finder → Go → Connect to Server&lt;/strong&gt;, and then &lt;code&gt;smb:${WHATEVER_THE_NAS_IP_IS}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then it was as simple as moving the media files I own off my personal computers and into the NAS filesystem. I’ve learned through trial and error and a lot of jank that names are very important and useful to the Plex ecosystem. They’ve got some strong guidance on their blog for naming and organizing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.plex.tv/articles/naming-and-organizing-your-movie-media-files/&quot;&gt;Naming and organizing your Movie files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.plex.tv/articles/naming-and-organizing-your-tv-show-files/&quot;&gt;Naming and organizing your TV show files&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;granting-access-to-the-plex-library&quot; tabindex=&quot;-1&quot;&gt;Granting access to the Plex library&lt;/h2&gt;
&lt;p&gt;Now for the &lt;em&gt;sharing with friends&lt;/em&gt; aspect. In your server under the extra items menu, there’s a &lt;em&gt;Grant Access…&lt;/em&gt; option. You can add your friends by their Plex emails.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_11.56.59_2x_rzwlb8-400w.webp 400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_11.56.59_2x_rzwlb8-800w.webp 800w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_11.56.59_2x_rzwlb8-860w.webp 860w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_11.56.59_2x_rzwlb8-400w.jpeg&quot; alt=&quot;A portion of the Plex dashboard user interface, showing the server name selected, then a dropdown menu with &#39;grant access...&#39; as the top item.&quot; width=&quot;860&quot; height=&quot;424&quot; srcset=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_11.56.59_2x_rzwlb8-400w.jpeg 400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_11.56.59_2x_rzwlb8-800w.jpeg 800w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_11.56.59_2x_rzwlb8-860w.jpeg 860w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;One thing to note here is that folks can setup their personal Plex dashboard however they want. Plex the app has some rentals and Live TV, and we found a bit of friction with some users who didn’t realize you could pin our hosted server libraries.&lt;/p&gt;
&lt;h2 id=&quot;granting-access-to-the-nas&quot; tabindex=&quot;-1&quot;&gt;Granting access to the NAS&lt;/h2&gt;
&lt;p&gt;To let my friends upload their own files, I used Synology’s &lt;em&gt;QuickConnect&lt;/em&gt; service, which lets me configure a URL that folks can log in with. This is a &lt;em&gt;tiny&lt;/em&gt; bit of a hassle but in a trusted network of friends it works great.&lt;/p&gt;
&lt;p&gt;I created a user account for visitors on the NAS itself (not on the Plex dashboard) via &lt;strong&gt;Control Panel → User &amp;amp; Group&lt;/strong&gt;, and gave the user access to the shared &lt;code&gt;media/&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;Then after configuring QuickConnect through &lt;strong&gt;Control Panel → QuickConnect&lt;/strong&gt;, I had a URL (something like &lt;code&gt;https://quickconnect.to/true-terrors-nas&lt;/code&gt;) which would allow my friends to visit, log in as the NAS user account, and upload files in the Synology &lt;strong&gt;File Station&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;going-further&quot; tabindex=&quot;-1&quot;&gt;Going further&lt;/h2&gt;
&lt;p&gt;Since setting up the server, I’ve made some changes.&lt;/p&gt;
&lt;h3 id=&quot;expanding-the-ram&quot; tabindex=&quot;-1&quot;&gt;Expanding the RAM&lt;/h3&gt;
&lt;p&gt;The DS225+ has like 2GB of RAM off the rip, which is tremendously bad, and I found that the NAS was crashing the second I uploaded a full season of TV (from Plex trying to identify the intro and credits sections). The NAS has a single expansion slot, and I added &lt;a href=&quot;https://www.newegg.com/crucial-8gb-ddr4-2666-cas-latency-cl19-notebook-memory/p/0RM-0006-00C66&quot;&gt;an 8GB card&lt;/a&gt;, which improved the responsiveness of everything immediately.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;Important to note that Synology has very strict rules about which RAM you can use, and using a non-approved RAM module will void your warranty. The linked module is not approved but has more memory capacity than the approved modules.&lt;/p&gt;
&lt;h3 id=&quot;adding-transcoding-drivers&quot; tabindex=&quot;-1&quot;&gt;Adding transcoding drivers&lt;/h3&gt;
&lt;p&gt;The DS225+ actually does have an integrated graphics processing unit, &lt;em&gt;but&lt;/em&gt; Synology removed hardware transcoding drivers for some reason. Someone added the necessary modules for adding those drivers back, and I would recommend installing those. You can &lt;a href=&quot;https://github.com/007revad/Transcode_for_x25&quot;&gt;read more about improving that transcoding functionality on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;plex-pass&quot; tabindex=&quot;-1&quot;&gt;Plex Pass&lt;/h3&gt;
&lt;p&gt;Plex actually does charge users to use features like skipping intros/credits, downloading media offline, and manage additional server settings. They do &lt;em&gt;unfortunately&lt;/em&gt; offer this as a subscription, but they also offer it as a lifetime buy-once pass. When I bought the lifetime Plex Pass it was literally $500 cheaper than it apparently is now, which to me sounds absurd, and I’d be interested to hear if anyone’s found a better route.&lt;/p&gt;
&lt;h3 id=&quot;additional-pieces&quot; tabindex=&quot;-1&quot;&gt;Additional pieces&lt;/h3&gt;
&lt;p&gt;You can host tools like &lt;a href=&quot;https://seerr.dev/&quot;&gt;Seerr&lt;/a&gt; and additionally the &lt;a href=&quot;https://wiki.servarr.com/&quot;&gt;Servarr&lt;/a&gt; stack on your NAS via Docker, to allow users to discover, request, and source additional media. This is tentative territory and if you go, go with caution and with care.&lt;/p&gt;
&lt;p&gt;I also built a Discord bot that leverages Plex webhooks to notify folks in Discord when media they’ve requested via Seerr is available.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_12.19.28_2x_rrglda-400w.webp 400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_12.19.28_2x_rrglda-800w.webp 800w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_12.19.28_2x_rrglda-1178w.webp 1178w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_12.19.28_2x_rrglda-400w.jpeg&quot; alt=&quot;A message from a Discord bot called Plexy, which reads &amp;quot;Hear ye, hear ye, @henry! A movie you requested has been added to the plexiglass server!&amp;quot;, and has an embed for the Sam Neill movie Event Horizon.&quot; width=&quot;1178&quot; height=&quot;476&quot; srcset=&quot;https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_12.19.28_2x_rrglda-400w.jpeg 400w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_12.19.28_2x_rrglda-800w.jpeg 800w, https://henry.codes/writing/i-made-a-plex-server/CleanShot_2026-07-14_at_12.19.28_2x_rrglda-1178w.jpeg 1178w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Anyway that’s all for me for this one. As ever, if anything’s unclear, or if I can answer any questions, feel free to reach out to me &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;via email&lt;/a&gt; or &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;on Bluesky&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Tue, 14 Jul 2026 18:26:16 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/i-made-a-plex-server/</guid>
</item>
<item>
    <title>It doesn’t matter if it works</title>
    <link>https://henry.codes/writing/it-doesnt-matter-if-it-works/</link>
    <description>&lt;p&gt;There are about a thousand and one debates about the ecology of AI, the ethics of AI, the governance of AI. As the technology advances, the debate with the slipperiest footing is on the actual efficacy of AI: does this work for this application? Or for this one? Ultimately, whether LLMs “work” as a technology or not doesn’t matter. &lt;em&gt;The function of a system is its output&lt;/em&gt;, and no matter what utility individuals find in the tech, the widespread adoption and deployment should be considered and regarded firstly as a threat to the labor force.&lt;/p&gt;
&lt;p&gt;To illustrate, we’ll consider a few scenarios.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;This is a short preface to a larger piece I’m working on called &lt;em&gt;The Threat&lt;/em&gt;, which covers AI mandates at work, harm reduction in the use of LLMs, and long-term strategies as industries expand their adoption of this technology.&lt;/p&gt;
&lt;h2 id=&quot;ai-works&quot; tabindex=&quot;-1&quot;&gt;AI works&lt;/h2&gt;
&lt;p&gt;O, great miracle — the tech advances! It will soon be as good or better per dollar than its human equivalent. Under the current economic system, there exists no incentive for corporations to keep those human equivalents employed. Humans necessitate sticky conversations about benefits, work hours, protections, and accountability that AI frankly does not. What happens to those jobs?&lt;/p&gt;
&lt;p&gt;AI proponents often compare the advent of the tech to the Industrial Revolution — many jobs were lost as industries were completely refactored and destroyed by these technologies, like we expect AI to, they say, but as you can clearly see, humans are still here, working now in different or differently-shaped industries. Those jobs are considered unfortunate collateral in a necessary technological reshuffling of the labor market.&lt;/p&gt;
&lt;p&gt;But the buried lede of the Industrial Revolution comparison is that the revolution didn’t simply exchange some jobs for others. It developed a new capitalist system of labor &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Deskilling&quot;&gt;de-skilling&lt;/a&gt;&lt;/em&gt;. De-skilling extracts the knowledge of design, craft, and mastery from high-skill workers and replaces those craftsperson type roles with new types of less-skilled and more-specialized roles. Those increasingly specific roles, in increasingly complex systems, meant that the average level of wide conceptual understanding of each worker was reduced, resulting in concentrated power of the managerial class.&lt;/p&gt;
&lt;p&gt;As the average skill level of a worker goes down, the easier it becomes for capitalists to control a labor force. If a worker can be easily replaced, there is no justification to pay that worker high wages, or ultimately to keep that worker employed.&lt;/p&gt;
&lt;p&gt;In this future where LLMs really are the be-all end-all many techno-optimists purport them to be, they will expand to wider and wider industries. Benefitting from narrowed and more specific job requirements, they will capture more roles, automate and de-skill more industries, and result in a widespread lowering of wages, job security, and employment.&lt;/p&gt;
&lt;p&gt;And while those tech leaders on the optimistic far end of the axis pretend to believe this will open doors for some utopia where mankind does not work, it is plain to see the dishonesty of this when looking at how those tech leaders treat humans of any class lower than theirs, be it in their &lt;a href=&quot;https://webflow.com/blog/evolving-webflow-for-the-agentic-web&quot;&gt;brutal mass layoffs of white collar workers&lt;/a&gt;, or the &lt;a href=&quot;https://www.rollingstone.com/politics/politics-features/joe-lonsdale-cicero-trump-leo-homeless-crime-1235078795/&quot;&gt;criminalization of homeless folks&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;ai-doesn-t-work&quot; tabindex=&quot;-1&quot;&gt;AI doesn’t work&lt;/h2&gt;
&lt;p&gt;The second scenario is that AI is not nearly as effective or useful in replacing labor as it is lauded to be. In this scenario, the explanation for these mass layoffs by Amazon, Atlassian, Autodesk, Block, Cisco, Coinbase, Dell, Dropbox, Fiverr, Goldman Sachs, Google, Grammarly, HP, IBM, Intel, Intuit, Klarna, Meta, Microsoft, Nike, Oracle, PayPal, Pinterest, Salesforce, TikTok, UPS, Unity, YouTube, &lt;em&gt;et al&lt;/em&gt;, is that AI is merely the foil by which companies can cover up all manner of business failings or strategies.&lt;/p&gt;
&lt;p&gt;The problem now is that, because there are scant worker protections (especially in the US), the onus to prove any claims about AI efficiencies does not exist. Businesses are enabled to use the magic spectre of AI to justify an any% RIF and spin great successes out of their operational failures.&lt;/p&gt;
&lt;p&gt;However, while this is likely at least a contributor to the layoffs sweeping the technology and finance industries, it does not account for the massive scale of the cuts we’re seeing in this industry. Instead, these cuts must be lensed by class. Whether they mean to or not, owners of capital have exceptional class solidarity, because they have the shared goal of reducing the cost of labor. This, then, explains mass layoffs attributed to a technology like LLMs, regardless of actual LLM “productivity gains”: If the technology causing all the layoffs does not &lt;em&gt;actually&lt;/em&gt; replace workers, then the workers will need to be rehired. Herein likes the rub — if large portions of the workforce have just spent 6 months or a year searching for jobs in an extremely employer-favored labor market, workers will take what work is available, and as a result wages, role quality, and benefits will nosedive.&lt;/p&gt;
&lt;h2 id=&quot;the-material-outcomes&quot; tabindex=&quot;-1&quot;&gt;The material outcomes&lt;/h2&gt;
&lt;p&gt;Both of these scenarios result in the same outcome: reduced worker solidarity, reduced worker skill, and reduced worker wages. AI/LLMs are the perfect tool for the capitalist because it doesn’t matter if it works; it threatens the workforce either way.&lt;/p&gt;
&lt;p&gt;There exists precedent for this type of threat in the practice of “offshoring”, where companies move work to markets with cheaper labor and make layoffs in more expensive markets. Whether or not this move is useful can obviously vary widely as there are many variables to offshoring, but that companies consider it a tool, that it can happen at any time to large groups of workers &lt;em&gt;is&lt;/em&gt; its functional impact.&lt;/p&gt;
&lt;p&gt;Furthermore, &lt;em&gt;because&lt;/em&gt; it weakens the local labor market and the bargaining power of labor, offshoring, like AI, creates an incentive for companies to position workers to be more easily replaced, through de-skilling and other strategies.&lt;/p&gt;
&lt;h2 id=&quot;eat-the-frame&quot; tabindex=&quot;-1&quot;&gt;Eat the frame&lt;/h2&gt;
&lt;p&gt;The widespread deployment of AI/LLMs constitutes an existential threat to labor whether or not it is an adept move by the adoptive industries. Thus it is essential for workers to stop asking whether or not AI works and start asking &lt;em&gt;who ultimately benefits from its deployment&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The answer to that question is capitalists, who have a persistent vested interest in weakening the labor market. Consequently it is imperative for workers to join forces in defense of their work, whether or not they are optimistic about LLMs as a technology. If a functional future of AI is realized, labor must be strong enough to withstand its seismic effects. If the brilliant AI future never dawns, labor must be strong enough to survive the ramifications of all of these companies making existential threats.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;This means of course both bargaining for protections against successful widespread automation of the workforce, but protection against widespread automation &lt;em&gt;as pretext&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Throughout history, workers have proven that when they stand together, they take control of their fate and the fate of their industries. &lt;a href=&quot;https://ethanmarcotte.com/books/you-deserve-a-tech-union/&quot;&gt;You deserve a tech union&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Mon, 08 Jun 2026 12:04:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/it-doesnt-matter-if-it-works/</guid>
</item>
<item>
    <title>The first thing I did last year was run</title>
    <link>https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/</link>
    <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot; class=&quot;no-js&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;The first thing I did last year was run | Henry From Online&lt;/title&gt;
    &lt;meta name=&quot;description&quot; content=&quot;On the eve of the new year, 2025, I was possessed by the spirit of adventure, and drove to Wyoming in the middle of the night. Hijinks, as is eternally their way, ensued.&quot;&gt;

    &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;180x180&quot; href=&quot;https://henry.codes/meta/apple-touch-icon.png&quot;&gt;
    &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;32x32&quot; href=&quot;https://henry.codes/meta/favicon-32x32.png&quot;&gt;
    &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;16x16&quot; href=&quot;https://henry.codes/meta/favicon-16x16.png&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;https://front-end.social/@henry&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;https://github.com/xdesro&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;mailto:yo@henry.codes&quot;&gt;
    &lt;link rel=&quot;manifest&quot; href=&quot;https://henry.codes/meta/site.webmanifest&quot;&gt;
    &lt;link rel=&quot;mask-icon&quot; href=&quot;https://henry.codes/meta/safari-pinned-tab.svg&quot; color=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;msapplication-TileColor&quot; content=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;theme-color&quot; content=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;generator&quot; content=&quot;eleventy&quot;&gt;

    &lt;meta property=&quot;og:url&quot; content=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/&quot;&gt;
    &lt;meta property=&quot;og:image&quot; content=&quot;https://henry.codes/img/og/og-the-first-thing-i-did-last-year-was-run.png&quot;&gt;
    &lt;meta property=&quot;og:type&quot; content=&quot;website&quot;&gt;
    &lt;meta property=&quot;og:title&quot; content=&quot;The first thing I did last year was run | Henry From Online&quot;&gt;
    &lt;meta property=&quot;og:description&quot; content=&quot;On the eve of the new year, 2025, I was possessed by the spirit of adventure, and drove to Wyoming in the middle of the night. Hijinks, as is eternally their way, ensued.&quot;&gt;

    &lt;!-- Webmentions --&gt;
    &lt;link rel=&quot;webmention&quot; href=&quot;https://webmention.io/henry.codes/webmention&quot;&gt;
    &lt;link rel=&quot;pingback&quot; href=&quot;https://webmention.io/henry.codes/xmlrpc&quot;&gt;

    &lt;!-- AT Proto --&gt;
    &lt;link rel=&quot;site.standard.document&quot; href=&quot;at://did:plc:pbr2nzfsr6bcqjeqlvohmh5y/site.standard.document/3mn3zccrnlk2y&quot;&gt;

    &lt;link rel=&quot;preload&quot; href=&quot;https://henry.codes/fonts/subset-Louize.woff2&quot; as=&quot;font&quot; type=&quot;font/woff2&quot; crossorigin=&quot;&quot;&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://henry.codes/css/fonts.css&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://henry.codes/css/custom/the-first-thing-i-did-was-run/index.css&quot;&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;main&gt;
    &lt;canvas class=&quot;stars&quot;&gt;&lt;/canvas&gt;
    &lt;nav&gt;
      &lt;div&gt;A tiny website by &lt;a href=&quot;https://henry.codes/&quot; class=&quot;home-link&quot;&gt;Henry (From Online)&lt;/a&gt;&lt;/div&gt;
      &lt;div&gt;which I am publishing in February 2026&lt;/div&gt;
      &lt;div&gt;for your exclusive reading pleasure :)&lt;/div&gt;
    &lt;/nav&gt;
    &lt;header class=&quot;hero&quot;&gt;
      &lt;h1&gt;The &lt;span&gt;first thing&lt;/span&gt; I did last year &lt;span&gt;was run&lt;/span&gt;.&lt;/h1&gt;

      &lt;div class=&quot;hero__background&quot;&gt;
        &lt;div class=&quot;moon&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 417 424&quot;&gt;
  &lt;path d=&quot;M205.9 424c-5.7-.6-8.6-1.3-14.8-1.6-17.3-.6-34.1-2-49.9-9.5-1.4-.6-2.3-2.2-3.6-2.7-3.7-1.6-8.8-1.3-12.5-4.8-.3-3.8 4.4-4.6 7.4-3.7 1.6.5 3 3.4 6.1 2.2l-.8-2.8 1.2-1.2c4.1.5 10.6 1.8 14.5 1.6 2.6 0 4-1.4 6.4-1.7 8.5-1 17.3 1.3 26.3-.2.7 0 2.4-.3 2.2-1.4-19-3-38.5-1.7-57.1-7.4-1.7-.5-3-2.4-4.4-2.8-2.8-.7-7.3-.2-10-1.2-2-.7-4.4-5.1-9.3-6.8A146 146 0 0 1 65 358.4c-7-5.7-12.6-12.8-18.8-19.3-4.5-4.5-9.2-7.7-13.3-13-2.3-2.7-3.9-8-7.7-10.5-1.6-.3-1.4.6-1 1.8 1.7 5 8 12.4 11.5 16.6 4.8 5.8 9.2 9.3 14.7 14.2 5.2 4.5 10.6 12.4 16.6 17 3.8 3 9.8 4.6 13.2 7 2 1.3 2.5 3.8 4.5 5 1.2.8 4.7 1.5 5 1.9.6.9 0 3.8 3.1 5.3 6 2.9 10.9 3.8 17 7.8 1.4.9 10.6 7.1 9.7 8.3-5.5 2-10.1-3.7-14.4-5.9-2.3-1.1-7.2-2.2-9.5-3.1-.7-.3-5.8-5.4-7.5-6.5-2.4-1.5-7.5-2.8-9.1-4.4-1.2-1.1-1.2-2.7-2-3.7-4-4.5-8.6-2.6-12-4.7-.4-.3-1-2-2.1-3-2.6-1.9-8.8-4.7-10.7-6.6-1-1-1-3.4-2-4.4a194 194 0 0 1-43.7-64c-1.5-3.7-8.8-17-5.8-19.9 1.1-1 6.4-3 8-2.4.7.3 6.9 8.3 7.8 9.6 9.3 13.3 15.6 22.4 28.3 33 5.3 4.4 10.9 11.5 16.2 15.8 6.7 5.4 15.8 8.5 23 13 4.3 2.6 10.8 8.6 14.6 10.2 7.4 3 6.7 3.3 12.8 7.2 7.1 4.5 11.5 5 19 7.4 5 1.6 7.7 5.2 14 2.5 1.3-.5 1.6-2.2 3.2-3.2 6.5-3.9 15.6-5.9 22.3-9.7 1.7-1 3.4-.7 5-2.2 2.9-2.4 4.2-7.7 6.2-10 1.6-1.8 5-2 6.4-3.9 1.2-1.4 4-8.9 4.3-10.9 1.1-6.5-3.3-18-6-24-2.1-4.3-8-7-9.3-10.9-2.8-7.8 0-16.6-2.1-23.5-.5-1.7-2.3-2.6-3.3-4-.5-.7-.3-2-.5-2.3 0 0-2.8 1.5-3.2-.4-.5-3.2 3-2.6 3.2-2.8.3-.3-.8-2.7-.5-4 1-4.3 8.4-9.1 3.8-14.7-.3-.3-6.7-3.6-7.6-3.9-5-2-8.1-3-13.1-5.2-3.4-1.6-10.2-2.3-9.9-7 .1-1.8 1.5-2.8 1.7-4.7.3-2.6-1.4-5.6-.5-7.7.6-1.3 6.2-6.9 7.7-9.4 2.5-4.2 4.6-12 7.3-14.8 2-2 4.1-2.1 5.8-3.8.5-.5 6.3-8.4 6.6-8.9.9-2-.7-3.5.3-6 .8-2.2 3-3.3 4.2-5.4 2.5-4.2 8-16.4 7-21-1.1-5.5-6.1-.8-9.3-.5-4 .4-6.6-.8-6-5 1.4-9.7 8-12.3 16-15.8-.2-2.3-2.7-3.7-3.4-5-1.5-2.9-.6-6.4-4.4-6.4v-3.9h3.9c-2.8-5.2 2.4-9.1 4.3-13.6 1.1-2.6 1.6-7 2.6-9.4.5-1.2 2-1 2.5-2.3 2.3-5.7 2.4-14.4 3.8-20.3a46 46 0 0 1 5.2-12.3c-1.6-3.6-4.4-2.8-6.6-3.8-8.2-3.9-5.8-2.7-14.3-3.5-9.3-.9-18.5-3.4-27.6-1.2-2.3.5-6 1.8-8 1.7-2.4 0-3.7-2.5-5.5-2.3-1.6.2-3.3 2.6-5.1 3-1.8.2-3.3-1.2-5-.4-3.7 1.6-10 8.8-14.2 10.7-5.5 2.6-13.6 2.7-19.7 6-2.7 1.4-8.8 8.2-10.2 9s-3.3.5-5.8 2.1C70.2 77.2 63.8 85.8 59.1 91c-8.2 8.8-21.4 19.7-27.1 29.8-1.3 2.2-2 6.4-3.2 8-1.3 1.8-5.2 2-6.2 5.2l-6-1 .9-2.3-5.6.8c-1.8-2 2.2-10.7 3.4-13 7.4-14.3 32.3-50.4 43.9-60.3.9-.8 5.5-4.6 6.4-3.7 0 3.6-2 9.6-4.8 11.7-1.7 1.2-4.1 1-4.6 1.4-.3.3-.2 1.8-1 2.6-2.6 2.7-7.9 1-4 9.2-1.5.5-2.2-1.4-2.9-1.4-2.7 0-3.5 5.4-.7 7 5.5-3 13.4-3.9 18.2-8 1.6-1.4 2.1-4.3 4.3-5.5s6.4-.9 8.2-2.7c.8-.8.9-2.6 2.2-3.8 7.4-7.4 16.1-9 25.2-13.3 7.5-3.4 15.2-8 23.3-11.1 9.8-3.6 37.4-6.8 47.6-5.7a193 193 0 0 1 102.3 38.6c30.1 22.3 44.2 53.7 52.6 88.4A197 197 0 0 1 294.4 329c-4 5-5.3 5.2-9.5 9.3a137 137 0 0 1-36.4 27.3 186 186 0 0 1-68.4 19c-6.5.2-13.2-.3-19.7 0-.5 1.6 1.5 2.5 2.5 2.7 3.4.9 13.4.8 17.2.5a176 176 0 0 0 83.3-26.5c12-7.6 22.5-17 33.3-26 16.7-14.2 36.6-52.2 42.3-73.2 7.6-28 8.9-57.2 6.6-86.3l.4-8.4c1.9 2.6 2.2 7 2.7 10.1 5.2 37-1.9 73.5-13.2 108.3-10 30.8-40.7 63.3-67 80.5-1.7 1.2-9.4 4.8-10 5.5-.6.5-.3 2.1-1 2.6-3.9 2.8-20.3 8-25 9.4-4 1.2-8.1 2-11.1 5 2.3 1.5 7.9 0 10.5-.6a234 234 0 0 0 45.3-24c52-37.6 78.2-85.6 82-150 .7-10-1.5-20.1 0-30l1.3.8c5.2 34.6.3 69-12.3 101.5-17.6 45.1-54.4 79.1-97.4 99.8-2.7 1.3-7.4 4.2-9.5 4.9a164 164 0 0 1-36 6.8l2.4 1.6c2.3 2.5-11.7 5-13 5.1-7.3 1-16.2.2-24 .7-5.4.4-8 0-13 0-1.8 0-7 .6-8.6 1.1-1.5.4-2 .3-1.7 2 2.7.4 5.3 2.2 7.8 2.5 4.2.5 6.2.7 10.7 2a168 168 0 0 0 36.5 4.5c6.2 0 15.8.7 20-4l1.8 2.4c4.4-2 9.1-1.1 13.5-1.7 17.5-2 37.8-8.6 54.4-13.9 4.2-1.4 11.5-5.5 15.6-7.6a169 169 0 0 0 67.1-66 294 294 0 0 0 28.2-65.6c14.8-52.4 10.7-109-20.3-154A241 241 0 0 0 334 57.6l-28.2-21.7c-1.4-3 2.3-3.3 4.2-3.1 4 .4 9.6 7.7 13 10.3 22.6 17.6 40.8 26 57.8 51a205 205 0 0 1 35 99.6c.4 4.6-.8 11 1.2 15.3v16c-2.8 2.5-1.2 6.9-1.6 10.1-4.6 39.4-21.9 78-45.5 109.6-7 9.3-15.5 21.3-23.5 28.8-3.2 3-8.3 6.4-11.9 9.5l.8 1.5c-10.9 3-22 16.6-31.8 20.7-3 1.2-6.3 1-9.3 2-18.3 5.8-34.5 12.6-54.4 14.6-9 .9-18.5-.3-27.7.6-1.6.2-4 .3-5.2 1.4h-.8zm56.3-344.7c-9.2-6.6-17.6-14.4-28.7-19-5.5-2.2-10.7-2.3-16-3.8-5.9-1.8-11.4-6.4-17.3-4 0 1.2 1 2.2 1.2 3.5 2.4 19.8-4.6 29.6-9.8 46.8-.7 2.5 0 4.8-.3 6-.2.7-4.3 3.6-4.5 6.7-.4 4.7 8.4 13 10.3 17.6.9 5.1-4.7 22.2-7 27.5-5.7 13.1-19.5 40.6-28.7 50.5-1.8 2-6.4 4-6 6.7.2.6 2.5 4.5 3 4.6 1.7.4 3.7-1 5.4-.8a86 86 0 0 1 18 8.4c2.7 1.8 5.6 5.5 8.3 7 3 1.6 15.8 4.7 15.7-.8-.1-4.2-12.5-5.2-15.9-6.7v-2c.7-2 15.5-9.4 18-9.3q1-.1 2 .4l2 9.2c2.6-2.5-2.3-15-1.3-16 1.6-.4 2.1.2 3.2 1.1 5.5 4.2 7.2 11.5 10 16.4 1 1.8 3.6 3.1 4.4 5.3l-2.4 2.8h5.6c1 1.3 1 7 1.2 7.2.8 1.4 5.5 2.6 4.4 6.5-2 .6-3.2 1.4-5.2 0-3-2-1.3-4.9-2.1-6.4-.4-.6-3.4-1-4.1-2.7-.7-1.6-.2-4.5-.7-5.3-.2-.4-2.5-.6-3.5-1.7-2-2.2 0-5.8-4.9-6.4-3.3-.4 1.1 4.2 1.5 4.9 5.2 10 10.9 20.2 16.4 29.3 2 3.2 5.5 6.3 5.8 10.6-1.8-.8-2.3-3-3.5-4.5-5.9-7.1-11-15.7-17.3-23-2.2-2.5-5.9-3-5.7-6.9l-2 7.2c-5.3 4.4-12 5.7-18.7 6.3-1.6 0-3-.8-4.5-.6-4 .5-7.5 9.3-6.1 13.1 2.3 2.7 5.4 1 8 1.7 4 1.3 18.3 11 21.3 10.8.6 0 4.3-2.5 4.4-3 .7-2.4-2.9-16.1 4.4-11.3 2.9 1.9 1 3.7 1.7 5.5 2.9 10.2 9 17.2 14.2 25.9 1.6 2.7 4.7 7.1.7 8.5-1.6-3.3-5.4-5.4-8-8.4-2-2.2-3-7.2-7.2-6.8l-.8 5.2 2.3 19.9c-5.6 7.2-11 1.3-13.3-5-1.5-3.8-2.4-13.5-5-16.5a95 95 0 0 0-12.4-10c-5.8-2.3-10.7 2-8 8 1.8 4 12 10.5 15.2 15.3a43.6 43.6 0 0 1-3.5 53 68 68 0 0 1-28.6 16.6l-7.1.5c-1.2 0-2.7-1.8-4.4-1.3 2 3.4 10.2 3.8 14 3.9 19.4.5 40.7-2.9 59.2-8.9s30.5-16 44.2-28.8c14.5-13.6 22.4-27.9 32.5-45.1 4-7 6.2-13 9-20.6 9.6-24.5 11.4-55.3 9.4-81-.6-7.1.6-21.3-1.6-27.1-.3-1-1.8-1-2.4-2.5-6.3-15.6-8.6-27.5-17.4-42.7-11.8-20.6-22.2-28-40.8-41.4zM199 278c-2-2-1.7-3.7-6-2.9 2.6 2.4 4 5.5 8 4.8 0-1-1.4-1.2-2-1.9M20.3 302.5c-.6-.5-3.1-2.5-3.7-1.9-1.2 3.7 1.9 5.2 2.7 7.2 1 2.2.5 7.2 4.4 6.4-1.8-2.1-2.9-3.5-2.4-6.5 0 .5 7.8 6.7 6.4 2.8-.6-1.5-6-6.9-7.5-8zm20.6 24.3c-1-1-1.6-3-3.1-3.7-2-.3-1.3 1.4-.8 2.4.8 1.4 6 6.8 7.5 8.4a161 161 0 0 0 26.2 22.7c12 7.7 27 13.2 39.4 19.2 2.1 1 9.5 3.5 11.4 1.3l-24.3-10.3a238 238 0 0 1-56.4-40.1zm100.6 53.4c-2.7-1.2-5.3.8-7.4.6-1.6-.2-2.1-2-3.4-2.2-2.1-.6-5 .3-7-1.5-2.6 1.5-3.5 4.6.6 3.8l1-1.6c2.3 3.4 5.7 1.8 8.6 2.4.6 0 .5 1.4 1.6 1.7 1.4.4 9.4 2.7 8.5-.5-1-.2-2.4-2.5-2.6-2.6zm9.9 6.2c.7-3.6-3.8-4-6.5-4 .2 3 3.9 4.3 6.5 4m44.9 7.1c2.8 1.1 4.2-.8 6.8-.9 3.1-.1 7.8.5 11 0 2.1-.3 4.8-1 6.3-2.6 0-3.3-10.2.9-11 1.1-1.5.2-2.8-.6-3.8-.4-2.6.5-7.7 1-9.3 3zm-6.5 6.4h11.7s1.3-1 1.2-1.6c-4 .3-7.7-.7-11.7 0-1.3.3-1.4-.5-1.2 1.6&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M150.6 12.3c.3 1.4 1.5 1.6 2.8 1.6 6.5 0 16.2-2.6 23.3-2.8 63-1.2 123 33 156.2 84.7 8.2 12.5 10.3 19.3 15.1 33.8 2.8 8.6 7.2 16.4 7.1 26l-8.7-24.4c-8.2-17.2-16-33.6-28-48.7-33.6-42.3-78.8-63-132.9-67-14.3-1-21.4 1.1-34.6 3-1.8.3-5.2-.8-7.5.2-.6-3.2 4.8-.8 4-4-4.2-1.8-5.2.2-8 1.1-18 5-37 17.5-52 27.4-4.8 3.2-9.3 8-14.8 10.1-7.1 3-7.1 0-2.9-5.3 3.2-4.2 12.8-8.4 17.5-11.3C98.6 29.6 111 21 123.7 15.4c8.6-3.8 18.2-6.1 27-9.1 39.8-13.4 113.8-4.4 149.5 18.2q3.6 2 6.1 5c-3 7.5-9.6 2.2-14.6-.5-16.7-9.4-29.9-14-49.1-17.4-7.3-1.3-13.5-2.8-21-4a154 154 0 0 0-59.8.9c-3.3.9-7.2 3.5-11 3.8z&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M290.7 64.6c.8.8 1 2.3 1.8 3 26 27.7 36 41.7 47.6 78.5.8 2.6 2.7 5.6 3.2 8 .3 1.4.7 1.8-1 2.3q-1.8-5.6-4-11c-5.7-13.4-11.5-29-19.4-41.4-15.2-23.4-48.7-54.6-75.8-63.6-27.2-9-61.8-14.8-90.3-11.2-25 3.2-43.4 15.7-66.3 23.4q-3.2 1-6 2.8l-.4-2L95.3 44c18.4-5.5 36-17.7 55.9-19.5 34-3.2 78.5 4.7 109.5 20.1a178 178 0 0 1 30 20m52.8 271.8-6 5.3-1.2 2.8c-20.6 21-41.3 42.5-69.8 53.1-19.2 7.1-58 17.8-77.9 16.9-2 0-12.6-1-13.2-1.6-3.1-3.4 9.2-2.7 9.8-2.7 16.7-1.4 33.3-4.4 49.5-8a162 162 0 0 0 47.3-16.8 230 230 0 0 0 44.4-35.7c18.2-17.8 30.2-36 41.2-60 2.2-4.6 1.7-8.2 2.8-11.6.7-2.2 4.5-5.6 4.6-8.6l-.3 6.6c-7.8 21.4-15.6 43.3-31.3 60.4&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M359.5 336.3a176 176 0 0 1-51.9 49.6c-3.4 2-8 4-11.6 6.3-3.8 2.5-2.3 1.1-6.1 2.3-2 .6-4.2 3-6.3 1.8 1.6-1.4 3.5-3.1 5.4-4.3 10.9-6.8 26.8-15 36-23.4 3.2-3 6-7.5 9.4-10.4 7.9-6.3 7.8-5.6 14.1-14 18.3-24.4 30.1-44.7 37.8-75.3 4.6-18.5 12-45.2 12-64.2 0-5.3-2.6-13.5-2.5-19.1q0-2.7 2-4.5c1.4 1 1.1 2.1 1.2 3.6 4 54.8-9.4 106-39.6 151.4zM288.8 35.2c28.4 20 52.9 43.1 66.2 76 3.1 7.6 7 18.6 9.4 26.6a172 172 0 0 1 6.6 41c-3.5-2-1.5-6-1.8-8.2A202 202 0 0 0 319.8 67c-11.8-12.7-30.2-30.7-46-39.1-4.5-2.5-11.3-3.4-15-7.3 1-1.7 3.2-.5 4.7 0 10.8 3.8 16.6 8.5 25.3 14.6&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M371 227c-.2 4.1.3 8.3 0 12.4-1.6 19.7-11.1 45.3-19 63.4-11.1 25.5-36.8 49.7-58.3 66.7a182 182 0 0 1-35.6 22.2q-4.7 1.8-9.8 1.8c-.4-2.1.5-1.4 1.6-2 2.5-1.5 5.2-1.6 7-2.6 8.5-4.4 17.6-12.3 25.6-17a170 170 0 0 0 67.5-73.6c2.1-4.2 5.2-10.6 6.6-15 3.7-11.3 7.8-24 10.2-36.3 1-5.8 1-12.9 2.5-18.3.4-1.4-.6-2.2 1.7-1.8M336.3 65.4c20.3 16.6 32.9 40.2 40.7 66.2 3.2 10.7 7.5 25.2 8.2 36.6.2 4.1-1 6.7-1.3 10.6-1.4 2-2.7-3.5-2.8-4-7-34.5-10.6-54.4-29.5-85.7a126 126 0 0 0-20-26c1.2-.8 3.6 1.6 4.6 2.4zM132.7 360.1s1.3 2.4.6 3c-1.7 2.3-17.2-2.1-17.3-4.4 3.6-3.5 8 .1 11 .9 1.3.3 4.3-.5 5.6.5m148.5 40.6q-7.3 2.8-15.1 4.1c.8-6.2 9.7-5 14-8zM359 170.1l-2.5-.5c-.4-4.3-2.6-9-1.5-13.1 1.2 0 1.7 3 2 4 .8 3.2 1 6.5 2 9.6m28.9-39.3c-2.4.4-1.2-.7-1.7-2-1.1-3-2.7-6-3.1-9.3 3 2.3 4.5 7.6 4.8 11.3M183.3 306.3c1.1 2-3.1 5.5-4 4.7v-6.4zm194.9-46.5c.8 1-1.2 11-3.2 8.8l1.5-7c.4-1.2-.6-2.1 1.7-1.7zm3.2-12.1-2.8 9.7c-1.9-1.7.2-6.1 1-7.8.5-1.2-.5-2.3 1.8-1.8M267.9 114.5a81 81 0 0 1 24.2 30.7c2.5 5 7.9 14.8 3.2 19-12.7-9.6-16.7-26.2-28.4-37-2.6-2.3-6.3-3-7.9-6.8l-20.7-8.9c-.9 1-5 3.3-5 3.6-.3.3-.4 2 .4 2 3.1 2.3 7.5 3.2 10.5 4.7 19.1 9.9 21.2 14.6 32 32 2.3 3.9 7.7 10.5 9.2 14.1.6 1.4 1.1 7-1.2 6-1.6-.6-7.5-13.4-9.4-16.2-1.7-2.6-4.8-5.2-6.2-7.8l-1.6.4.4 2-2.3.8c-1-2.7-4.2-3.2-5.2-4.2-.8-.8-.4-2.4-1.5-3-1.5-1-4.1-.8-5.9-.8l6.4 4.4c3.1 6.9 11.3 13.3 13.4 20.3.7 2.2 2.2 5.4-1 5.8-3-3.8-5-8-10-9.6-1.2 1.1 10.7 14.6 10.9 16.5 0 .6-.3 6.8-2.2 5.2 0-2.6-9.8-13.5-11.3-12 1 5.5 8.3 9.9 7.7 15.2-3-2.4-5-5.6-7.7-8.5-3.6-4-7.7-4.4-5.6-10.8 9 2.2 1.6-3 .6-5-.6-1.2-.4-2.6-1.1-3.8-.4-.7-3.5-3-4-4.8-3.2.2.7 3.6 1 4.6 2.6 5.7 1 12-2.5 17l-2-1.4c1.6-5.3-3.6-6.9-7-9.7-6.9 1.7-14.5-5.1-17.1-11-3-6.5 2.8-5.6 3.2-10.8-6.5.2-9.6 6.3-8.9 12-1 .3-1.3 0-2-.7-.4-.3-4-8-4.2-8.7-.3-3.2 1.3-6.8.5-9.2-.5-1.4-3.6-2.2-4.3-3.7-.6-1.4 1-4.2.3-6.6-.7-2.2-4.4-2.3-4.7-5s2.3-5 3-7.5c1-3.5.6-7.3 1.7-10.8.4-.7 8-2.7 9.3-2.9 11.3-1.3 33.2-2 43.1 3.3 3.8 2 6.6 5.2 9.7 7.6zm-44.4-6.9c-5.9-.2-12-.5-14.4 6 5.2 5.7 17.3 4.3 14.4-6m27.8 22.7c-1.3-1-3.1-.5-4.6-.2.7 1.9 3.6 2.5 2.4 4.8 3-1.6 5.1 1.3 7.6 3.2.7.5 1 2 1.4 2.2 1.8 1 3.7-.3 5 4.2l1.1-4.7c-1.6-.4-4.4-1.5-5.7-2.5-2-1.6-3.2-3-5.8-4.8-.7-.5-.8-1.7-1.4-2.2m21.9 202.4c-1.5-1.4 3.7-6.4 4.2-7.4 8.4-16.4 11.4-41.1 11.4-59.5 0-6.4-1.6-13.3 0-19.7 1.4 1 1 2.3 1.2 3.7 2.2 21 3.7 34.6-1.1 55.8-1.4 5.8-3.9 7-6 11.7-1.7 3.4-3.5 13.1-6.7 15-.7.4-3 .7-3.2.4zm38.4-56.1c-1.6.2-1.3.1-1.8-1-1.6-3.6.5-6 .5-9.3a263 263 0 0 0-7.9-59.4c-1.6-7.4-4.3-14.7-3.6-22.4 1.1-.2 1.1 1.4 1.4 2.2 6.5 20.7 9.2 42.5 12.4 63.8.5 3.7 3 10.5 2.8 14.1-.2 2.7-3.8 8.4-3.6 12zm8.1-33.6c-1.3 1.1-1.4-.2-1.6-1.3-1-5.9-1-11.8-1.7-17.5-2.2-15.6-7.2-31-10.8-46.2-.6-2.6-.5-5.4-1.2-8 1.7-.3 2 .8 2.4 2 3.8 9.5 6.3 21.5 8.7 31.5 2.9 12.1 5.8 21 5 34.2q-.1 2.6-.8 5.2m-72.1 110.6c-.6-.6 6.2-13.5 6.8-15.2l2.4-7.2c1.5-5 8.8-39.2 12.9-39.2 3 0-.6 6.8-.8 8-3.6 16-7.9 33.2-15.6 47.7-1.6 2.9-.4 6.7-5.7 5.9m54.2-60.3-4.5 4.3c3.9-22.9 2.1-46-.8-69 1-.1 1.2 2.3 1.4 3.1.3 1.7 0 3.5.4 5.2.9 4 2.2 7.7 3.1 12.2 1 4.7 1 5.5 1.1 10.3.4 7.8 2 21.9 1.3 29-.2 1.9-1.2 3.2-1.9 4.9&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;m281.2 259.8 1.5 23.6c-1.8 8-3 16.5-5.1 24.5-.7 3-1.4 6.2-4 8-1.6 0-.4-5.8-.3-6.7 1.7-10 7.6-33.3 6.2-42.5-.3-2.2-3.8-5.5 1.6-6.8zM234 362.3c1.7-4.8 4.8-8.8 6.7-13.6 3.4-8.7 6.2-19.5 9-28.6 1.2-3.6.6-6 5.1-8.3-2.6 12.8-4.8 25.1-11 36.8-1.4 2.9-4 5.8-5.7 8.7-1.2 2-.4 5.7-4.2 5M213 368c-1.2-5.4 3.8-9.3 5.9-13.1 3.5-6.7 2.9-16.6 9.4-21.4A89 89 0 0 1 224 349c-1 2.5-7.3 17-8.3 18.2s-1.5 1-2.8.8m14.9-12.6c3.7-8.8 6.8-19.8 10.7-28.1.5-1 1.4-2.3 2.6-2.6q.2 2-.4 4c-2.2 10-7.9 22.5-12.7 31.3-.3.5-3.1 8-3.7 3.5 0-.4 3-6.8 3.5-8.1M210.3 180c3.4 5 7.4 12 8.4 18-2.8-1-2.9-4.2-4.3-6-1.2-1.5-5.9-4.8-7-6.4-1.5-2.3-5.2-10.3-.4-10.7 1.5 1 1 2.8 1.7 4 .4.5 1.4.7 1.6 1m2.7 163.9c1.5.5 1.5 1.2 1.3 2.5-.9 6.7-6.4 14.2-9.6 20-1 2-1 6.3-4.1 5.5-3.7-1 2.6-7 3-8 1.4-2.5 2.3-5.4 3.9-8.2 2-3.5 6.1-6.7 5.5-11.8m49.7-133.7c-.9 1.2-13.4-14.5-11.2-16.8 1.9-2 3.3 2.7 3.7 3 3.5 3.8 8 8.2 7.5 13.8m-8.8-30.4c.8 4.8 6 7 6.4 12-.5.5-4.7-.6-5.6-1.2-2.4-2-6.8-11.4-.9-10.8zm-34.4 30.4c-1.6.2-2.4-1-3.3-2s-10.4-11.4-6-11.6c2.7-.1 10.6 12 9.3 13.6m-.1-51.1 4 11.1c-.8 1-9.5-6.5-6.8-10.4zm96.3 9.5c1 6.4 5.2 12.3 4 19.3-1.1 0-1.7-2.4-2-3.2-.8-2.8-3.8-12.9-3.6-14.8 0-1.2.7-2.4 1.6-1.2zm-72.9 89.7c-3.5 1.2-7.4 2-7.9-2.7 2.7-4.1 8.4-2.5 7.9 2.7m9.2-41.6c2.8-.8 5.4 7 2.4 8.8-3.6-.4-5.6-8-2.4-8.8M226.7 299c.6 3.5 4.8 5 4 8.8-5 2-6.5-4.5-5.6-8.3l1.6-.4m-3.2-36.9c-1.2 1.4-7.7-7.1-5.7-9.6 4.3.9 6 5.7 5.7 9.6m27.3 6.4c-1.3 0-3.6 0-4.6-1-4.3-4.3 6.2-9.3 4.6 1m4.6-58.3s5.8 7 5 7.9c-2.5 2.4-4-4.4-4.3-4.7-.5-.5-2.4-.2-3-1.4l.4-2c.6 0 1.2-.2 1.8.2zM217.8 178h-3l-2.6-7.2c1.3-1.4 6.5 6.5 5.6 7.2&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/div&gt;
        &lt;div class=&quot;sun&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 424 417&quot;&gt;
  &lt;path d=&quot;m276.3 212.1-.1-.5-1.6-1.3-1.5-.2-.8.9q-.8 0-1.6.3-.7.3-1.2 1c-1-.3-.4-1.8-1.5-2h-1.4l-.5-.7.6-1h1.4q.8.5 1.4 1.2l.7-.2q.4-.2.8-1l-1-.6.2-1.4-1 .4a7 7 0 0 1-2.8.8l-1.8.4-.8-.2.4-.8 1 .2q.6.1 1.9-1.3c-.8-.3-.8-.3-1.4-.2l-3.4.8q-.6.1-.8-.4 0-.8.9-.8.7.1 1.1-.6-.7-.4-1.2 0-1.7.9-3.6.6a10 10 0 0 1-4.4 2q-1 0-1.9.7l2.1.5 2.6-1.2q.7-.4 1.5.2l-.1.5c-1.1.9-2.5 1-3.8 1.5q-.5 0-1 .3t-.6.6h.1-2.5q-.8 0-1.4-.2l-.5-.5c.2-.8.8-.8 1.4-1.1l-2.2-.5-.5.4.2 1.3q-1.2.6-2.3.1l-2.7-.4q-1 0-1.7-.3l-4.3-1.7-.6-.2c.3.6.7.9 2.3 1.7l3 1.6c.9.5 2 .4 2.8 1.2l-.4.5-1.3-.5h-.3c-.9.4-1.7-.5-2.6-.1.2.7.8.6 1.3.7l1.6.6q1-.3 2.2 0h2.6c-.8-.4-1.6-.1-1.9-.9q1.5-1 2.9-.5c.5.3.2.8.3 1.1q.1.6.5 1.1l-1.1.7q-1.8 0-3.1-.2l-3.7-.5-3.2-1q-1.7-.1-2.4-1.8l-1.3-.2-.7-1.1h1l1.1.6c.3 0 .6.2.8-.3l-4.7-3.4-.8 1.1-.7-.4-1.4-1.4q-.2-.4-.7 0 1.4 2 3.4 3l1 1q.7.6 1.8.8l.8 1 1.1 1.3q-.2.7-.8.5-1.2-.3-2-1-.7-.8-1.6-1.2-.7-.2-1-.8a9 9 0 0 0-2.6-2q-.6.4-.2 1.3c1 .3 2 .6 2.3 1.8.8.5 1.7.7 2 1.6l.9.5 1.8 1q.7.4.8 1.5h-1l-.8-.7c-1-1.4-2.6-2.1-4-3.1l-1.3-.8-1-1q-.1.7.3 1.5l-.3.2h-.6q-1-.6-1.5-1.9l.8-1a6 6 0 0 1-1.5-2q-.7-.8-1.7-1.6c-.3-.3-1.6-2.7-1.7-3.2q-.2-.3.3-1l1.1.1c0 1.5.8 2.6 1.6 3.7q.4.7 1.2.6v.1l-.2-1q-1.4-1.2-2-3l-.6-.3q0-2.2-.5-4l-.3-.7-1 .5c-.6-.5-.6-.5-.5-1.7.3-1 1.3-1.6 1.1-2.8h.2v-.2l-.2.2-1.7.5q0-.4-.3-.8 1.8-1.5 3-3.2v-.2l-1.2 1-1.4.7-.7-.1c.2-1.2 1.2-1.6 1.9-2.4-.7-.2-1.2.7-1.9 0l.2-.7c.4-.4 1-.5 1.3-1.1l-.2-.2h-1.6l-1 2.1 1 1.4-.2.7-1.1.3-1 .4.4-.8q0-1-.4-2.2l.8-2.3q-.5-.9 0-1.8c.4-.7 1.2-.7 1.8-1l.3-.5-.3-.2a4 4 0 0 1-2.5 1l-.6-2.1c.2-1.2 1-1.8 1.6-2.5-.5-.1-1 .2-1.4-.4-.2-.4.2-.6.3-1l-.2-1 1-2.4.2-.7q0-2 1.6-3 2-1.6 4.3-2.7a17 17 0 0 1 5.5-1.8l1-.2q1.1-.5 2.4-.5 3.1-.3 6.1-1 1.5-.3 3.2-.1 2.1.3 4.2.2h1.4q1.5.4 3.4.4l3.7 1.5 3.7 1.6 3.5 2q3.2 2.2 6.3 4.7 1 .8 2 1.9l3.2 3.1 1-.2.9.6h.4l1.7.3.8.5 2 .2a10 10 0 0 0-6-2.5l-1-1v-.7q1.8-.7 3.1.5h1.6c.4.1.8.5 1.4.3l-.6-.6q-1.4-.6-2.7-1.5l-2.2-.9q-.8-.2-1.2-.9l.2-.4h.4q1 .2 1.9.6l1.9.4q1 0 2 .3l.4.4.2.1h-.2l-.4-.5a10 10 0 0 0-2.4-1.6l-4.3-2.2-.9-.8h1l5.3 1.7 2.5 1h.1-.1v-.2a16 16 0 0 0-5-3.3q-1.8-.8-3.9-2c-.9-.3-2.1-.4-3.1-1.2q-.5-.3-.4-.9l.5-.1 2.9 1.1q1 .6 2.2.7 1.5 0 2.5.9t2.4.6v.2h.1l-.2-.1q-1.2-1.5-3-2l-3.6-1.9-2.6-1.3-.8-.5v-.5l.2-.1h.1l3.6 1.2h1.5v.1h.2l-.3-.1v-.2c-1.4-1.1-2.8-2.4-4.7-2.7a3 3 0 0 1-1.7-1.1l-.2-.5.4-.2 2 .6 5 2q.4-.3.1-.4a10 10 0 0 0-3.5-2.2q-1.2-.3-2.5-1h-.4a10 10 0 0 0-2.9-1.6q-.4-.2-.8-.8.8-.3 1.5 0l1.8.9q.9.1 1.8.5l.7.3 1.5.4 1 .8q.4 0 .5-.2-.5-.7-1.2-1l-1-1q-.5 0-1.2-.5c-1-.8-2.3-1-3.4-1.7q-1-.5-2-.6-1.2-.1-1.7-1v-.3c1-.2 1.6.4 2.4.5l1.3-.3q1.4 1 3.1 1.5l.4-.2-.2-.4q-2.2-1-4.2-2.2-1.5-1-3.3-1.6-1.5-.6-3-.8-1.5-.1-2-1.6l.3-.6c.7-.2 1.2.1 2.8 1.4 1.3 0 1.5-1.3 2.3-2l1.2-.7 1.2-1.9h1.2l.5.4q.7 1 1.7 1.7.4.3.5.6l1.3 1.5q2.3 1.6 3.6 4l.7.8q1.8 1.7 3.2 3.8l2.5 3.4q1 1.8 1.7 3.8l1.4 2.2 2.2 1.3 1.7-.8 1-.5 4.7-1.6 1-.4q2.5-1.6 5.2-2.8l6.8-3.3 3.3-1.4 1.2-.6 1.3-.8 1.7-.8 1.6-.8 1.8-.8 1.2-.7a13 13 0 0 0 3.5-1.6q.9-.7 2-.8l.3-.2q2.1-1.3 4.4-2l7.9-4 4-2 8-3.8 8-4 5-2.9q1.1-.7 2.4-1 .3 0 .5-.2c2.8-1.5 5.8-2.6 8.6-4.2q2.2-1.2 4.4-2 2.8-1.3 5.4-2.8 1.2-.7 2.6-1.2l3.7-2.1q2.8-1.3 5.5-3l.7-.6q.5-.8 1.4-1.1l1.4-.9q.1 1-.4 1.6-.8 1-1.8 1.8-1.2.6-1.8 1.6-.5.7-1 1.1l-2 1-1.7.5q-1.7.3-3.2 1.3l-.7.3q-3 1.1-5.7 2.5l-5.6 2.8q-3.5 1.7-7.1 3.7l-1.6.6q-2.3 1-4.4 2.5-1.5 1.2-3.2 1.3l-.7.2-2 1.2q-.8.4-1.3 1-.8.7-1.8 1-2.4.8-4.6 2.3l-1.3.8q-2.5.7-4.5 2.2l-1.3.6-3 1.6q-.8.6-1.8.9-2 .5-3.7 2-1.4.3-2.5 1l-1.1.4q-1.4.3-2.5 1.1l-.5.3-7.2 3.1-.8.5c-2 1.4-4.4 2-6.6 3q-4.8 2.2-9.6 4.7-1.3.7-2.3 1.7 1-.1 2-.5l3.3-1.2 3.2-1.4 6-2.7q3.8-1.3 7.2-3.2c1.9-.5 3.5-1.6 5.3-2.3q4.1-1.7 8-3.6l6.3-2.7 2-1 3.3-1.4 4.5-2 4.2-2 4.8-2.2 5.9-2.6q.4-.3.9-.4l5.2-2.7.9-.3q3.3-1.1 6.4-2.7l2.7-1.2 2-1.1 1.9-1.5q.9-.2 1.3.6-.3 1.4-1.7 2-3.8 1.7-7.7 3.2-1.8.5-3.4 1.5-2.3 1.3-5 2.2l-2 1q-2.2.8-4.1 2l-1.1.4q-.5 0-1 .3c-1 .7-2.3 1-3.3 1.8-1.8.6-3.3 1.9-5.2 2.3-1.8 1-3.9 1.4-5.6 2.7q-1.3.6-2.7 1l-.7.3q-2.1 1.1-4.3 1.9c-1.1.4-2 1.2-3.1 1.6l-3.2 1.4-4.7 2q-1 .4-1.8 1-1 .8-2.3 1.1L320 156q-1.2.7-2.7 1l-4 1.8q-1 .6-2.4 1-.5.1-.9.4l-1.8.8c-2.2 1-4.6 1.7-6.7 3l-2 .8-3 1.4a36 36 0 0 1-6.4 2.9l-2 .4q-.4 0-.8-.3l.3-1.3q1.6.2 2.7-1-1.7-.2-2.6 1-1.3.1-2.5-.2c-.5.5-.1 1.1-.3 1.6l.4.6q.9.8 1.3 2 .4 1.3 1 2.4 1 1.4 1.3 3.2.2 1.2.7 2.2l-.2 1.2.1.4c.8 1.3 1 2.8 1.5 4.2l.2 1q0 1.8.7 3.5-.5 1.2 0 2.3.8 1.3.2 2.8v.4c.5 1.1.3 2.3.3 3.5v1q.5 1.2.2 2.4v.6q.4 1.5-.5 2.6l.6 1.5c0 1-.3 2 0 2.9l-.1 1-.2 1.3q0 1.5-.5 3-.4 1-.1 2 .3 1.4-.4 2.6c-.8 1.4-1 3-1.6 4.6q-.2.7-.2 1.5v1.7l-1 1.2c-.6 1.9-.8 3.8-1.9 5.4l-.4.9-1.2 3.3q-.8 1.4-1.4 3a10 10 0 0 1-2.7 3.6q-.5 1.8-2 3.2l-.2.3q-1.2 2.4-3.2 4.4l-.3.3c-.1 1.2-1.1 1.8-1.7 2.7l-.7.7a4 4 0 0 0-1.9 2.7c-1 1-1.8 2.2-3.2 2.8q-.7 1.8-2.5 2.2a5 5 0 0 1-2 2.2l-.7.6a17 17 0 0 1-4.2 3.2c-.9.5-1.6 1.2-2.7 1.3l-.9 1.1q-1.3.4-2.3 1.5l-3.2.3-.7 1.4q-.5.4-1.1.6a11 11 0 0 0-3.5 1.9l-.8.4-4 1.5-2.2 1q-2 .8-4 1.2-1.1.1-2.1.6l-1.2.2q-1.7 0-3.2.7l-1.5-.2q-2.4 1-5 1c-2 0-4 .6-6.5.7q-1.4-.5-3.3-.2H209q-1-.2-2 .7l.4 1 1.1.2q.8.7.7 1.4c-.3 1.6.3 3 .1 4.9l1.3-1.5q.6 0 .9.5.6.8.5 1.8v2.6c-.3 1 0 2-.3 3v.4c.6 2.7-.3 5.3 0 8v.4c-.1.8.4 1.5.2 2.3l-.2 2.1v1c.4 1.7.1 3.3 0 5q0 2.3.2 4.4v.4c-.5 2.1-.1 4.2-.3 6.3v3.7q.2.6 0 1.1a6 6 0 0 0 0 3.5v1l-.2 2 .2 2-.2 3.1a21 21 0 0 0 0 6.2l.1 1c-.4 3-.2 6-.3 9v2.9q0 1.5-.3 2.9v.7q.2 2.6 0 5.1v11.7l.2 2.2q-.4 2.5 0 5.4a16 16 0 0 1 0 3.7q-.5 1.8 0 3.7c-.4 1.1-.3 2.4-1.3 3.4q-.9-.2-.8-1l-.1-2.4.2-4v-1c.2-1.6-.2-3 .1-4.5.3-1.4 0-2.9.4-4.3v-.8a16 16 0 0 1 0-5.6q.1-1.5-.2-3.2.5-1.7.3-3.6v-5.4l.3-3.5q-.5-1-.1-2.7l.1-3c0-2.6-.2-5.3.3-8-.5-1.7.4-3.4 0-5.2q-.1-.6.2-1.6-.6-1.3-.2-3 .4-1.4 0-2.8l-.2-1 .1-7.2v-3.6l-.2-3.1.3-11c.1-.7-.4-1.5 0-2.3q-.3-3-.2-6.2 0-2.4-.6-5.3c-.6 1.6-1.3 3-.7 4.4q.2 2.9 0 5.7-.2 1-.2 2.1v2.9l-.1 3.1v3l-.4 6v3.3q-.2 1.6-.1 3.3v3q.2 1.6-.1 3.2v3l-.2 7.9v1.3q-.3.8-.1 1.4v1a4 4 0 0 0 .1 2.6l-.3 1.8c-.4 1.1 0 2.3-.4 3.4l.2 1.4q.3.9.1 1.9-.5 4.5-.4 9.1.1 1.1-.2 2.1v1l-.2 8.2-.1 1.4q-.2 1-.2 2.1.2 2.6 0 5v5l-.3 1.7v1.6q.4 2.2 0 4.6-.2 1.2.2 2.3v1q0 1.7.6 3.2.8 2-.7 3.6l-2 .1-1-1.2.3-1.2q.6-2 .4-4 0-2.5.3-5l.1-.3c-.3-1.6.3-3 0-4.6v-.2c.5-1.6.1-3.3.2-4.9v-.7q-.3-1.1.1-2.1.2-.6.1-1.2l.1-8.4.2-1.2v-1q-.2-1.1 0-2.4-.2-1.5 0-3.1v-3.1l.1-1.8.4-1.7a13 13 0 0 1-.2-5.2q.4-3 .3-6l.1-2.1v-.8l-.1-.8q.5-1.8.3-3.8l.1-3v-1.1l.2-4.3q.2-2 .2-4.3v-9.2q.5-2.8.3-5.8.2-1.5-.2-2.9l.1-.6c.3-.5-.1-.8-.2-1.3l.4-1.9q0-2 .3-4 .3-1.8.1-3.7v-6.8a6 6 0 0 0 .2-2.3q-.3-1.5.3-3l.3-1.4q-.6-1.2-.5-2.4l-.5-1-.9 1.5-.5-.2c-.3-.4 0-1-.7-1.2q-.2 1.4 0 2.8l.8-.5q.6.6.5 1.6l.1 3.7q0 .6-.3 1.1-.2.4-.2 1c.2 1.6-.3 3.2-.2 4.8v1.3l-.2 3.1q.3 1 0 2.5a8 8 0 0 0 0 3.5q.4 2.3 0 4.5l-.2 1q0 2.8-.4 5.8-.2 2 0 4v1q-.6 4-.4 8.2l-.3 3.4-.1 2.8-.1 1-.2 2q0 2.4-.4 4.7l-.2 4.3-.1 1.4v1.5q.3 2.4-.1 4.8v.4l-.2 7.8-.3 5.9-.3 3q-.1 3.8-.5 7.5a37 37 0 0 0 0 8.3l-.1 2.3q-.5 2.1-.1 4.1c.2 1-.3 2-.1 2.8q-.6.8-1.4.6-.8-1.5-.4-3.1l.2-3v-13.6l.4-3.4q0-2.1.3-4.1.2-1.2 0-2.5l.2-6.9q0-2 .3-3.8v-3q1-1.7.7-4.1 0-2.7.3-5.5v-.4c0-.7-.3-1.4 0-2.3v-2q0-1.2-.2-2.3c.5-.8.3-2 .4-3v-3q0-.9.2-1.6.3-1 .2-2l.2-2.8.2-3q0-1.8.3-3.6.3-1.3-.3-2.5.8-2.5.5-5-.1-1 .2-1.7c.6-1.7.3-3.4 0-5l.7-1.7a7 7 0 0 1-.2-3.8c.4-1.4.1-2.8.2-4.3l-.4-1.5-.6 1.3q-.3 1.2-.4 2.5l-.4 5.2q0 1.8-.3 3.5v2.3q0 1-.3 2-.2.3-.2.7c.2 1.2-.2 2.3-.3 3.5l-.1 2.1q0 1.6-.3 3.3-.6 2.6-.5 5.2 0 2.4-.3 4.7-.1 2-.4 3.9v1.1q.5 1.8 0 3.5-.7 2.5-.7 5.2l.1 1.7-.3 2.9v.6c-.7 1.5-.3 3.2-.4 4.8v4.3q-.7 1.5-.7 3.2 0 2.3-.3 4.6-.2.9-.1 1.8.1 2.1-.4 4.3v.2c0 2.8-.7 5.5-.4 8.3q.4 1.9-.5 3.6l-.4.5h-.2l-.4-.3-.2-.7c-1-1.9-.8-3.8-.6-5.8l.3-4.2q0-1.5.3-3v-2.5q-.1-2.2.4-4.4v-1.2q-.2-2 .3-3.9v-1.3c-.2-2 .4-3.9.4-5.8v-2q0-1.1.4-2.2.5-1.5.5-3l.2-2.2q0-2.1.3-4.1c0-1.1.4-2.2 0-3.3l.3-1.1q.7-1.9.4-3.9-.2-1.2.3-2.3.5-1.5.6-3.4 0-2.4.3-4.7 0-1.5.5-3 .3-1 .3-2 0-1.7.3-3.4v-1.4q0-1 .3-2.1v-.4l.5-6q0-1.8.3-3.5.3-1.8.2-3.5l.2-1.8.1-1.1.2-1.3.1-1.2v-1.5q.2-1 0-2.5l.1-4.5q.1-2.2.5-4.7l1.3-.9-1.1-.4-1.5.2-1.5-.3q-1.4-.5-2.7-.7-.7-.2-2-.2-1.6-.9-3.9-.8-1 0-2-.5-1.6-.8-3.4-1.1-.6 0-1-.4c-1.2-1-2.6-1-3.7-1.1l-3.4-2c-.5-.4-1.2 0-1.8-.6l-1.4-1-1.8-.7q-1.3-.4-2.1-1.4a3 3 0 0 0-2.3-1.3q-.4 0-.8-.4l-.3 1.4-.5 1c.2.5.6 0 1 .2l.3.5v1.3q-2.2 3.4-4.2 7l-2.3 3.7-2.2 3.7-3.1 5.4-4.2 6.6-1.2 2.2-.5 1q-1.6 2.3-2.7 4.8-1.2 2.4-2.9 4.6-.4.4-.6 1l-3 5-3 4.8q-1 1.6-1.8 3.4-.6 1.4-1.5 2.3l-.7 1-3.4 5.9-2.2 3.2q-1.2 1.5-2 3.1-.2.9-.8 1.5-1.2 1.6-2 3.1l-1.8 3q-1.4 1.8-2.2 3.7-.4 1-1.2 1.9c-1.3 1.5-2 3.3-3 5.1l-1.6 3q-.7 1.3-2.4 1.9l-.6-.4a4 4 0 0 1 1-2q1-1 1.5-2.3.4-.9 1.1-1.8.6-.5.8-1.1l.7-1.2 3-4.7.7-1 .5-.8q.7-1.9 1.9-3.6.5-1.2 1.5-2.3l.4-.7q.8-2 2.2-3.6.6-1.4 1.6-2.7l3.3-5.3q1.3-1.8 2.2-3.9 1.1-2.6 2.9-4.8 1.3-1.8 2.1-3.7l.7-1.2 2.5-4.2.7-.9 1.4-2.3q.7-1.5 1.6-2.7 1.5-1.7 2.6-3.8l1.4-1.9.2-1.3c1.7-1.4 2.4-3.4 3.5-5.3q.8-1.6 2-3.3l1-1.9q1.5-2.3 2.8-4.7l2-3.5q.6-.7 1.1-1.7.7-1 1-2 .2-1.1.9-2.3l-.5-.6a10 10 0 0 1-2 3l-.7 1-.8 1.2a50 50 0 0 0-4.4 6.7l-1 1.6q-1.2 1-1.6 2.2l-.6 1-3.4 5.2-3.3 5.1-3.7 6c-1.3 1.9-2.3 4-3.8 5.9l-.7 1.1q0 .5-.3.8c-1.5 1.3-1.8 3.4-3.1 4.9q-1 1.1-1.8 2.5l-1 1.4q-1.2 2.6-2.7 5-1 1.3-1.6 2.8l-.2.4-4.1 6-2.1 3.4-1.2 1.8q-2.3 3.1-4.2 6.5l-1.9 2.7-1.6 2.5-2 3.1-3.6 6.3q-.2.6-.6 1-1 1.1-1.7 2.6-.4 1-1.2 1.7l-.5.8A7 7 0 0 1 99 379l-2.4 2-.7-.3.5-1 3-4.4 3.6-4.6.9-1.4q2.3-4.4 4.9-8.5 1-1.7 2-2.9l1.3-2.3.6-1.2 2.6-4.6q2.7-3.5 4.8-7.3a17 17 0 0 1 2.4-3.4q1.4-1.5 2.5-3.4l3.2-5 3.4-5.2q1.5-2.9 3.4-5.4c.8-1.7 2.1-3.2 3-4.8l1.6-3.1.2-.4c1.5-1.5 2.2-3.5 3.6-5 2-2.5 3.2-5.4 5-8l3.5-5.6 1.5-2q1.3-2.4 3-4.4l2-3q1.1-2.7 3-4.9c.5-.7.3-1.6.8-2.2-.5-.5-.8-.2-1 0-.7 1.9-2.4 3-3.2 4.8q-.6 1-1.4 1.7-.9 1.1-1.6 2.4l-3 4.8q0 .3-.3.5c-1.5 1.6-2.5 3.6-4 5.2l-.9 1.3q-.7 1.4-1.8 2.6l-.5.8-1.3 2.1q-2 2.4-3.6 5a73 73 0 0 0-4.7 7.8l-.2.3c-2 2.4-3.3 5.2-5 7.7l-1.6 2.2-3.3 5-1.3 2-.5.6c-.8 2-2.4 3.5-3.4 5.5-1.2.9-1.6 2.3-2.3 3.5l-.8 1.2a26 26 0 0 0-3.6 5.3l-.5.8-3 4.5q-1 1.9-2.3 3.6-.7.8-1 1.7-.6 1.6-1.7 2.2-1.6 3.3-3.7 6l-1 2q-1.4.8-2 2.3-1.2.6-1.7-.6.5-2.1 2-3.8l1.6-2.7a40 40 0 0 1 3.2-5l2.8-3.5q.5-2.3 2.3-3.8 1.3-1.3 2-3.1.7-1.5 1.6-2.7l.8-1.1c1.2-2.5 3-4.7 4.4-7.1l2.1-3 2-2.7q1.4-1.5 2.3-3.4 2.4-4 5.3-8l2-3 2-3 .4-.5c2.2-2.6 3.7-5.6 5.6-8.3l3.3-4.5 2.8-3.8 3.7-5.3 3.8-5.9 2.3-3q.5-.4.8-1 1.6-2.4 2.8-5l1.1-1.7 1.6-2 1.4-.8q.4.1.5.4l.2 1.5q1.4-1.1 2-2.7l1.3-.8q0-.4-.2-.6a7 7 0 0 0-2.6-1.9 5 5 0 0 1-3-2.4 4 4 0 0 0-1.7-1.6l-1-.5a6 6 0 0 1-3-2.7c-1.4-.3-2-1.5-2.8-2.4q-.2-.4-.6-.7a5 5 0 0 1-2.2-2.8l-3.3-3.2q-.6-.6-.8-1.3-.2-1-1-1.7-.7-.9-1.2-2c-1.4-1.2-2-2.9-2.7-4.6l-.8-2-.7-2.5-.9-.7q0-1-.3-1.7l-1.4-2.5q-.6-.7-.8-1.5l-1.6-4.6q-.6-2.2-.7-4.4 0-1.2-.3-2.5v-1.2l-.2-.7q-.6-2.1-.7-4.2-.1-1.5-.7-3l.4-1.2q-1.4-3 .3-5.9-.9-3.5.5-7.8-.7-1.4-.4-3 0-1-.3-2l.4-2.2q0-1.5.4-2.9c.3-2 1.3-3.9 1.5-6 0-.5.5-1 .6-1.4q.4-1 .4-2 0-1.6 1.2-2.7v-1.8l1.7-3.3v-1.5l2-3q.8-1 1.2-2.2.3-1 1-2 .7-1.5 2-2.7l1-1.7q.4-1 1.2-1.7 1.4-1.2 2-2.8c.6-.9 1-1.8 2-2.4q.8-.7 1.5-1.7 1.2-1.7 2.8-3l1.2-.6.8-1.6 3.9-3.6q.7-.7 1.6-1 1.6-.8 3-2.2c1-1 2-2 3.4-2.4l3-1.4q1-.5 1.8-1.3 2.3-.4 4.3-1.6.9-.5 2.2-.8a15 15 0 0 1 5.5-2.8l5.3-1.4q1-.2 1.4-.5l2.6-.5 2.9-.2 1.5-.3q2.4-.6 5-.8l2.7-.3h2.7l3.3.2 1-.1c1.1.7 2.6.6 4 .6h2.5l1 .7 1.2-.3 1.2.5 1.7-.3c1.2 0 2.5.6 3.9.6l.9.3q5 1.4 9.8 3l3.7 1.3.8 1.3h1.2q.9 0 1.8.7l3.6 2.3 1.1.2q1 .8 2 1.3l4 2.7.3.3q.8 1.4 2.4 1.6 1.7 1.3 3 2.7-.2.9-1 1.5l-.5 1-1 .5c-.1.5.1 1-.4 1a9 9 0 0 1-4.8-1.5l-.5-.2-4.5-1.5-1.8-1.4q.7-1 1.1-.5c1 .7 2.4.8 3.2 1.7l2 .2 1.6.8q1 .6 2.3.3l.2-.3c-.7-.8-1-1-2.2-1.3q-1.5-.2-2.4-1.1c-.5-.6-1.2-.6-1.8-.8l-3-.8c-2 .3-4-.9-6.2-1.8q-3-.4-4.2-1.5.4-.7 1.3-1a7 7 0 0 1 2.3 1q.8.4 1.6.1c.5-.7-.2-1.3-.2-2l1-.5c-.5-.8-1.3-.4-1.8-.4l-1 1-1.2-.7-1 .4c-.8 0-1.4-.6-2.2-.5l-.7-.3-.5-.5c.8-1 .8-1 2.8-.4l.2-.5q-.2-1-1.3-1.3h-3l-1 1.3c-.8-.7.4-1.7-.7-2.4-1.1 0-2.3-.6-3.6-.7q-1.9-.1-3.6-.8-2.7-1-5.6-1l-3.4-.2-1.4-.2-.6.7-.5.7-.5.2-4.5.4-.8.2.4.4c1 0 2.1.4 3.3.3l2 .6q2 .1 3.6-.4l.8.2q-.2-.6-.8-.6t-.6-1l.9-.2q1.5.1 3.2.5 1.2.3 2.5.4l.8.5-.7 1 .2.3h1q1.3-.6 2.5-.2h2.4l1.3.6q.7.2 1 .9-.3.7-1 .5-1.4.1-2.7-.7h-.5l-.7 1c-1.4-.2-2.6-1.3-4-.5q-1.6-.6-3.3-.7l-1.9-.6q-1.4.2-3.2-.2-1.9-.3-3.9 0l-1.9-.2-1.1-.1H206l-2.1-.2-1.8.3.4.7 1.5.6h1.7q2 .1 3.9.4 1.2 0 2.2.7l-.7.1-2.4-.2c-.7 0-1.4.3-2 0h-.5c-1.5.4-3 .1-4.6.2q-1.5-.2-3 .3l-.7.1-3.9.1-4.3.5q-.6.2-1.3.1-.5 0-.8.4h1.6l1.5.1h3.8q1.5.2 3-.3a2 2 0 0 1 1.3 0q2.4.6 4.8.7l1.4.2 1 .4c-1 .4-1.8.1-2.7 0q-1.1-.2-2.6-.2l-1 .3q-2.7-.4-6 .3l-1.1-.2-1.6.7c0 .6.5.6.8.8l3.5.1q.1.6-.3.5l-3.3.3-3.3.4q-2.6.3-5.2.9-.8 0-1.3.9h7.2c1.2.2 2.4-.4 3.5.2q0 .6-.4.6l-2 .1q-4.6-.1-8.8 1.1l-2.3.5-4.6.9q-2.5.6-5 1.6l-.6.5h1q1.6-.8 3.5-.8l1-.2q3.7-1.2 7.5-1l.6.3q0 .4-.2.4-.8.4-1.4.5c-1.6 0-3 .7-4.4 1l-2.2.5q-.6.5-.2 1.1.4.4.9 0 .9-.2 1.9-.2 2.8.2 5.5-.3h5q.6.2.6.8l-.4.2-3.4-.2-2.4.2-2-.1-.6.2q-1.9.6-3.8.5l-1.2.2-2.5.6q-.6.1-1 .4c-.6.5-1.4.5-1.8 1l-1.1.2q.7.4 1-.2 1.6 0 3.1-.3h1q2.2 0 4.6-.4 1.5-.2 3 0h4q.7-.2 1 .6l-.4.2h-2q-2.4-.2-5 .3-.7.2-1.4.1-2.5 0-5.1.8l-2.3.7-.9.3q-1 .7-2.3 1l-.8.6c1.9 0 3.3-.6 4.8-.8l4.5-.2q2.3-.4 4.7 0c1.4.2 2.9.1 4.3.6l-1.3.1q-.7.2-1.3 0h-.4c-1 .1-1.8.6-2.7.1l-2.7.5-4 .6-.8.1q-2.2.9-4.6 1.5-1.4.8-3.3 1.4.4.4.5.3l4-1.4 1.9-.6 1.1.1q4.4-.5 8.8-.2l3.8.3q.5 0 1 .4l.2.5-.6.3q-1.5 0-2.9-.2-1.3-.4-2.7-.1-2.6.4-5.2.5-1.4 0-2.7.3-2.5.2-5 1.2c-1 .4-1.2.5-2 1.6q1.5-.1 2.6-1 1.8 0 3.3-.4 2.6-.6 5-.2h1.2c1.5-.4 3 0 4.5-.1q.5 0 .7.6-1 .3-2 .2-2.2 0-4.6.6h-.4c-1.2-.1-2.2.7-3.4.6-1 .6-2.2.2-3.3.5l-1.8 1 .5.2q2.5-.7 5-1c.8-.7 1.8-.1 2.8-.3l2.7-.2h2l3.5.1 1.1.7h.6q2 0 3.7.6 2.2.9 4.6 1.3c1.2.2 2.2.9 3.3 1.3l5.2 2.2.9 1.3 1 1.8 1.2.8q1.9 1.1 2 3.2l.1.5.8.8q1 1 1 2.2c0 1.1.3 2.2 0 3.3v.4c.6 1.6 0 3-.2 4.6a13 13 0 0 0 0 3.7v1.7l-.2 1.6q0 3.6-1.2 7l-.4 1.8q.1 2-.4 3.8v.4l-.7 3.6c-.2 1.2.1 2.4-.3 3.5l-.1 1.6-.3 2.5.1 1.5q-.3.9-1.3.7-.8-.1-1.3.8l.9 1.2 1 1.2q.6.7.8 1.5l.6 1.2 2.3 1.2q1 .4 1.9 0 1.5-.6 3-.6l.4-.1c.6-.4.6-1.1 1-1.7l.9-1.8a4 4 0 0 1-.2-2.9l.6-.3 1.2 1c.4 1.9-.4 3.6.6 5.3l.9.3.5 1 2.5.3.5 1 .1-.1q.2-1 1.2-1.4l.7-.3q.3-.8-.1-1.4l-.9-1.5q-.3-.7.3-1 .5 0 1 .4V223q.2-1 1.4-.6l1.3 2.2.9-.7q.9 1.2 1.6 2.6c.8-.4.2-1.4.8-1.7q.5 0 .6.4l.6 2 .6.3q.3 0 .5.4.2 1-.7 1.7l-.6-.4c-.2.5-.6 1-.3 1.7l1.2-.6q.7.3.6 1v1.2l.2.8c-.3.6-.7-.1-1 .2l-.2.3 1 .8-.7 2 1.3-.6.5.4-.7 1.4.3 1c-.3 1-1.4 1.8-1 3.2l.5.8-.4.8.2.2h2.6q.5-.1.8.5l-.4.5-1.4.6-.8.6.6.4q2.5-.1 4.8-1 .6.7.2.9l-.7.3H235c-.4.7-1.3.7-1.6 1.3 1 .5 2.2 0 3.2.4q0 .6-.3.7l-1.7.5q.1.6.7.6h3.3c-.4.8-.4.8-2.9 1.3q-1.5.4-3 .4 0 .6.4.5h3.1q1.5.2 3.1-.1 1-.3 2 0-.6.6-1.4.8l-5 .7q-.6 0-.8.5c1.2.8 2.5.6 3.8.4l4.4-.8.8.2q.7-.7 1.5-1 .8.3.8 1l-.8.6h-.6l-.7-.2q-.7.4-1.3.5c-1.9 0-3.6.9-5.6 1-1.9-.3-2.2-.3-3.7.3q.6.6 1.4.5l4 .1h.9c1-.5 2.1-.3 3-.4 1-.3 1.7-1.3 2.8-.6l.4 1.4q2.7 1.6 3.4 4.6.1.8 1 1.2l.3-.6-.4-1q-1-3-3.1-5.2l-.8-1q-.4-.5-.3-1.2l1.4-.3.6.7c.3 1.3 1.2 2.3 1.7 3.5l.8.7.6-.5c.1-1-.9-1.7 0-2.6l1.3.8 1.6 3.3q.3-1.3-.6-4.2l-1-1.2q-.2-.8 1-.5c1 1 1.2 2.8 2.7 3.7q.3-1.5-.5-2.7l-1-2.1q-.1-.5.4-.8.7.1.9.7l1.3 2.6q.4 1 1.1 1.8c0-1.8-.2-3-1-4.5l-1-1.7.6-.6q1 .6 1.3 1.6.7 1.6 1.8 2.8l.4.3q0-1.6-.6-3l-1.4-2.8.2-.3q.5 0 .8.4l1.1 1.6a5 5 0 0 0 1.5 1.7l-.3-1.3-.2-1.3-.4-1.1c0-.4-.4-.7 0-1.1q1 .4 1.4 1.5.2 1 1.2 1.4v.2h.2l-.2-.2v-1.3l-1.5-2.6c-.4-.8-1.4-1.1-1.6-2.1l.4-.3q1 .3 1.8 1.3l1 1.7 2 2.5q.6-.2.4-.6-.5-1.5-1.5-3l-1.2-1.7-1.5-1.3q-.6-.6 0-1.1 1.3 0 3.5 2.2l.4-.1.1-.2-.8-1.3.5-.6.4.1 1.2 1 1 1.1v-.7q-.5-1.9-2-3.5l-1.3.2-.2-1.5.5-.6h.4q1.4 1 2.5 2.3l2 2.4.4.1q-.3-1-1-1.8l-1.3-2-1.4-1.6q-.5-1-1.4-1.4l.2-.6h.4l1.8.9c1 .8 1.5 2.4 3 3q0-1.8-3.6-5-.1-.9.2-1.4l.4.1 1.8 1.6 1.3.8.5-.4q-.6-1.8-2-2.7-1-.4-1.4-1.3 0-.3.2-.4h.7l1.2 1.2 3.4 2.3q.4-.3 0-.6l-2-3-2-1.4v-.8l.5-.2q.9 0 1.2.9 1.2 1.3 2.8 2.1h.4q-.1-1.4-1.1-2.1-1.7-1.7-3.5-3.2-.6-.2-.2-.7l.3-.1 1.5.6q1.6.9 3.2 2.2.3.3.9.1c-1.2-1.9-2.2-3-3.9-4.2a4 4 0 0 1-1.7-2.2l.1-.3c.6 0 1 .6 1.4.8l1.4 1 1.5 1 1.5.8.1-.2-.2-.5-2.8-3.3c-1.3-.4-2.3-1.7-3.5-2.7l.3-.6 2.4 1.5h2q-1.9-2.8-4.9-3.6v-.5l.5-.5 1 .2 1.9 1.2q.2.3.6.4 1.5.5 2.6 1.7l.6-.3v-.4l-.7-.7-4.3-2.8-.4-.5.3-.7c1-.1 1.7.8 2.7.8.4-.6-.5-.8-.5-1.4l.3-.5.6-.2q.6 0 1.3.4zq0 .3.3.2zm-43.1-9h-.2zl.1.3zm-41.1 5.5-.4.4q-.4 0-.4.4l-2.2.7-.2-.4c0-.9.7-1.4 1-2.1l-1.1-1.4q-.5.1-.7.4-2 1.4-4.2 2.5l-.7.3q-1.4.1-2.7.8c-.9-.2-1.8.2-2.7-.2-.6-.8.2-1 .4-1.6-.5-.3-1.1-.2-1.3-.8l.4-.8 2-.6-1-.7-1.1-.9h-.4q-.6.3-1.2 1l-1.3-.3-1.3-.9c-.7.7-1.6.7-2.3.8l-.4.8-1.5.8-1-.6a10 10 0 0 1-3.8-2h-1l-.9.3q-.7.3-1.5.2-1.7-.3-3.3.2-1.4.3-2.6 1-1.5 1-2.9 2.2v.2l.1.1.5-.1c1.8-1.6 4-2 6.2-2.1q1 0 2-.3l1.2.2v.6c-.6.7-1.4.7-2.2.8a13 13 0 0 0-7.1 2.8l-.5.6q-.4.3 0 .7c1.7-.7 3.3-1.8 5.2-2q2-.3 3.7-1l1-.2.8.3-.7 1-1.2.1q-1.6 0-3 .9-1.4.7-2.6.8l-2 1.8-.6.6.1.6q.7-.5 1.3-.7l1.5-.3 4.7-1.2.4.5q-1 .8-2.3 1-1 .2-1.8.6a10 10 0 0 0-3 2.5l-.2.8 3.5-1.4 3.4-1.5c1 .1 1 .1 1.6.6a23 23 0 0 0-9.5 6q.2 0 0 0-1.7.8-2.8 2.5l-.2 1.2s-.4 0-.1.2l.1-.3q.3 0 .5-.3.5-.8 1.5-1.5l3.8-2.8q1 0 2-.5.8-.6 1.9-1 .7-.4 1.5 0-1.5 1.2-3 2c-1 .5-1.4 1.3-2.2 1.8a11 11 0 0 0-4.1 4l1.2-.3 2.8-1.8 2.3-1.4q.6-.2.8.3-.1.7-.8 1-1.4 1-2.6 2.1l-2 2c-.2.3-.5.7 0 1.1l.7-.2 2-1.5 3.2-1.6h.6c-.2 1-1 1.5-1.3 2.2-.5.7-1.6 1-1.7 2q.9.1 1.3-.4l1.2-.6.9-.5q.8-.3 1.3.4-.2.8-1 1l-4 3q-.6.4-.2 1.3l2.2-1c1-1 1-1.1 1.8-1.2q1.2-.2 2.2-.8l1-.4.5.4c-.3.7-.3.7-.5.8q-1.2.3-2.2.8-2.4 1.5-4.1 3.8-.5.3-.2 1 .7-.2 1.5-.8t1.8-.7l1.7-.7.3.7q-2.1.9-2.7 3 1.2 0 2-.7c1.4-.8 3-1 4.4-1.8q.5-.3 1 .5l-.5.5-.8.5q-2.8 1-4.8 2.8l-.9.7v1.3h-.2.1q1.5-.5 2.9-1.3l4.6-2 .9-.3q.5-.1.6.5c-.7.7-.7.8-1.5 1q-2.3 1-4 2.6l-.2.5h.6q1-.2 2-.7l3.3-1.7q.6-.4 1.3 0-.3 1.5-1.4 2l-1.3.2c-1 .9-2.3 1.5-3 2.7l-.5.4h-.1v.2l.1-.2.4-.5q1 0 2-.3 1.3 1.5 1.6 1.4.5-.1.6-.7l-.7-.8.2-1 .2-.5 1-.4q1.5 0 3-.7l.3.3q-.4.7-1.4 1-1 0-.8 1.2l.5.2q1.6 0 2.8-.6 1.8-.9 3.6-.6h.4l.4-.6-.4-1.5.8-.9c.8 0 1.4-.3 2 .2l.6 1q.9 0 1.7-.3l.8-1 .6-1.6.9-.4.9-.6.8.1 1.4-1.5-1.3-1.1 1-1.7q0-.7-.3-1.2.5-.9 1.3-1 .6-.4.5-1-.4-.9-1.3-1.4l-1.2-.6q-.7-.4-1.2-1-.5-.3-.8-1c-1 .5-1.9 1.4-3.2 1.3v-1q0-.3.3-.4l.2-.1-.1.1-.4.4H180q-.3-.7 0-1.5l1.6-.5q1.3-.1 2.2-1 .3-.2.7-.2 0 .9-.7 1.2t-.9.8l-.1.1.1-.1h.6a25 25 0 0 0 4.1-2.7l.7-.2q-.6-.3-.6.2l-.5.4-1.4.2-1.3.2q1-1.5 2.7-2.4l1.4-.8q.3-.1.2-.7c-1.1.5-2.3.8-3.2 1.7q-.3.4-.8 0v-.3q.8-1 2-1.6t2.4-1.6q.5-.3.8-1.3-1.4.7-3 1l-.1-.5 2.3-1.6 1.5-2.1h.2v-.2l-.1.2h-1.1l-.3-.6c.1-.6.8-.8.9-1.5-.7 0-1.3.5-2.1.3l-.1-.7c1.2-1 2.5-1.9 3-3.4l.4-.4zl.1-.1zm84.2 13.3q0-.4-.4-.4.1-.4-.5-.6 0 .4.5.6 0 .4.4.4c0 .1 0 .4.3.1zm-1.2 10.6-.1-.3-.1.1zm-49.8 29 .4-.5 1.1-.1 1.4-2 .7.5q.7.1.9-.6l-2.3-1.5-2.3-2.6v-1l-2-.2q-.8-.7-2.1-1l-.9.4q.6 1.5.3 3l1.6.1c-.3 1.3-.2 1.4-.9 1.8q-1 .6-1.5 2l.5-.1q1.3-.6 2.3-1.5l.7-.4.4 1.8.3.3 1.3-.9.9.7-.3 1.4zs-.5 0-.2.2zm50.2-79.6q0 .5.3.2zh-.2zm-107.7 68.6h-.2v.2zq.4 0 .4-.4h.8l3.5-1q2-.8 4.1-1.1.6 0 1.1-.3l4.6-2.2s.4-.2 0-.5l-1 .5q-2.4.4-4.8 1.4-1.1.6-2.4.4-1.5 0-2.5.7-1.8.8-3.4 2.1-.4 0-.3.4m-3.6-95.1q-.6-.2-.7.4h-.2.1q.5 0 .8-.5zm29.4 104.1q0-.3-.3-.1zq.1.6.7.2zM151.2 173h.7q-.5-.3-.6 0l-.2.2zm125.5 42.8q0-.4-.4-.4-.3-.8-1.2-.8l-.1-.1h.2q.3 1 1.1.8zq0 .5.6.3-.3-.3-.6-.2M152.5 202q-.7-.2-.7.7zh.2zm31.7 63 .8-.8 1.3-.2q-.8-.4-1.3.2-.6.2-.8.8l-.7.1q.7.3.7-.1m-29.8-69.7q.8.1 1.4-.2l-.3-.2c-.4 0-.9-.2-1 .4l-.9.2q.7.1.8-.2m123 0-.1-.3h-.4v.2zq1.1.7 1.8.6c-.6-.6-1.2-.4-1.8-.5m16.5-30.2q1.4-.2 1.7-1-.6 0-1.6 1l-.2.2zm-15.6 18.4q0 .6.5.2zq-1-1-1.8-1 .6 1.2 1.9 1m-102.4-.8h.6l.2-1 1.2-.3q-1.1-.4-1.8.3zl-.2.2zm69.4-10.1q.4.5 1.1.2zq-.7-.6-1.4-.7l-1.4.5c1 .3 1.9.7 2.7.2m-60 87.7v-.2zl.1 1.3.7.2.8.1.2-.5zm-33.6-41.9q-.7 0-1 .5l-1.6 1.7.1.5q1.6-1.2 2.4-2.7zm86.6-23.5h-1.4c-.8.2-1 .9-1.3.9-.9-.2-.7-.8-1-1q-.6.5-.5 1.1-.2 1.6.4 3 .3.8 1 1.3h.1l1-.5c1 .5.8 1.5 1 2.2q1.9 1.4 4.4 2l.6-.7-.4-.8-1.7-1.3-1.2-1.6zm-56 58.7-1.9 1.2.1 1c-.2.7-1 .8-1.2 1.6l1.3-.2.7 1.3q1.3-.7 3-1l1 .8.7-.8q2.5-.6 4.7-1.8c.2-1.3 1-2.2 1.6-3l-1-3c-1-.2-1.7.7-2.8.8-.2.1-.5-.6-1.2-.2l-.7.9v1.3c-.8 1-1.6.1-2.3.6l-.7 1.7h-1zq.3 0 .2-.3zm-12.3-60 .1.1-1.2-.7-.2-1.2-.8 1-1.1.4c-.3 1 .3 1.7.8 2.4q.9 1.6 2.8 2.7 1.4-.7 2.4.4c.3 1-.3 1.9.2 2.8l.8.4.9.3q1.4-.6 2.7-.7 1.8 0 3.4-.3 3.3-.3 5.8-2.4l.5-1.5.7-.3c.5 0 .7.7 1.3.4l.3-.9.6-.8v-2.4l-1.1-1.7q-.7-1-1.9-1.3l-2.7-.5-1 .8-.2.6 1.1.7 1.8-.2.3 1q0 2.2-1.6 4a4 4 0 0 0-1 2q-.1.6-.5 1.2-1.2 0-2.1.3c-1.4.6-2.7.5-4 .6q-1.3.1-2.2-.8l.2-1.1c-1.7-1.4-2.7-3.3-3.9-5.2zm52.6 70.6h-.2zc-.2.9.4 1.4.8 2l-.2 1.7 1 .3 1-.8q1.6.4 2 1.6l.4.2.4-1.1-.8-1.7-1-.5-1.2.4q-.6 0-.7-.6.5-1 1.8-1.3.8-.1 1.4.5l1.2 1.8 1.3 1.8V267c0-.4-.4-.8 0-1.3h.3c.4.4.4 1.2 1.1 1.5.6.3.6 1.2 1.2 1.4 1.1-.7-.2-1.7.4-2.5q.6-.2.8.4l1 1.9.6.7.1-.9v-1.9l.4-.1 1 1.3q.3.5.9.3.7-.6.5-1.7l-1-1.5.7-.5 1.4 2h.4v-1.7l.9-.2 1.2 1.3.9 2.4q.3-1.8-.3-3l-.7-1.5q-.1-.5.5-.9c1 .3.9 1.5 1.5 2.1s.5 1.8 1.3 2.4q.3-1.4-.2-2.5t-.6-2.3c-.1-.9-1-1.3-1.3-2.2l.7-.4 1.4 1.3c.4.4.5 1 1.4 1.4q-.4-1.8-1-3.2l-1.3-.3q0-.7-.3-1.4-1.5-.1-3.1.1-1.8.3-3.5 1.3l.6.4q.8 0 1.5.2.3 0 .4.3c-.4 1-1.4.6-2.2 1q1 .1 1.7.7l.3.4-.5 1-3 .1q-.9-.6-1.8-.8-1.9-.3-3.4-1l-2.7.7-1.4 1.2-1.8 1.4zm-16-3.7q-1.4 1.6-3.2.6l-.6-.1q-2.4-.3-4.8.3-1.4.2-2.7 0-.8-.2-1.8 0l-.5 1h-2.5l-1.3 2 .9 1.5-1.2 1.6v1.3q-.1.6-.4 1.1l2 2.2c.4 0 1-.2 1.5.3l.2 1.7q.4.4 1 .6 1 0 1.7.6c.5.3 1 0 1.3.2.5.1.9.7 1.4.6h.3l1-.8 1.1.2c.7-.4.8-1.4 1.8-1.4l.8.7h.2c.5-.1.7-.8 1.4-.7l.9 1 1.6-.8 1.5.9q.4 1 1.6 1.6l1.2-.3c.4 0 .6.7 1.2.3l1-1.5.5-.2 1.2.5 1-.2 1.3.2 1.1-1.5-.4-2.4c.7-.7 1.2 0 1.8.1l.1-.3c0-1.2-.9-2-1-3l-1.2-.5c-.6-1.7-.6-1.7-1.9-2.7l-1.1-1-1.9-1.4q-2.3-.4-3.6-2zm3.6-18.3 2.2.5q1 0 1.6.6 1.2 1 2.6 1.7.8.2 1.2.6c.9 1.2 2.3 1.5 3.1 2.6 1.3 0 1.9-.9 2.7-1.3.1-.7-.5-1.3.3-1.8q1.2.2 2.5-.2-.1-1.6.8-2.6 1-.1 1.5-.5l-3-1q-.7-.2-1-.6c-.5-.6-1.2-.5-1.7-1 0-.7.2-1.3-.3-2q-2-1.2-4.2-.6-1.5.3-3-.1l-.8.4-1.6-.1q-1.4 1.7-3.1 2.8l-.6 1.7zm-13.6 9.5 1.4-.4 1.8 1.4c1.1.2 2-.6 3.4-.1l2 1q1.1.9 2.5.8l3.9.2 2.3-1c1-.6 2.1-1.3 2.2-2.7-.5-.9-1.5-1-2.1-1.5-1.4-.2-2.7-.7-4.1-.5l-4 .8-1.7-.5-3.2-1.3h-1.8q-.7.8-1.7 1.2-.8.3-1.4.9-.4 1 .5 1.7m63-51.9-1-1.3q-1.2-2-3.4-2.8-.6.9-.8 1.8-.7 2.9-3.1 4.6l-1.1.8v.4c.3.3 1-.2 1.3.4q-1.3 1-3.3 1l-.4-1-2.2 1.4-1.4-.4.4.7h1.4q.9-.2 1.9 0c2.5.2 5 .2 7.4-1l.7-.2q1.2-.3 2-1 1.5-1.2 3-1.4l.6-.2q.3-.7-.4-1zm0-7.4v-3.7l-1-1-1.4.6-.7-.6.3-.9q-.7-1.2-1.6-1.6a23 23 0 0 0-7.4-2.3h-.1l.4.7c-.8 1.3-1.8.6-2.8.5q0 .3-.2.5c1 .1 2 0 2.6 1l-.1.1-1.3.4q1.8.7 3.5.5l1.7.8c1.7.6 3 2 4.5 2.7 1 1.4 2.7 2 3.7 3.5q.7 1 2 1zm-55.9 48.9.7 1.6 1.3.4 1.5-.3c.7-.7 1.4-1.5 1.2-2.6l-1-1.2.4-1.4-.7-.5-.6 1.5-.8.2c-.6-.1-.7-.8-1.3-.5zm-23.3-58.7 3.3 1.1 3.3 1.7c1-1.9 1-1.6 2.6-2.1a5 5 0 0 0-2.8-2.2l-1.1 1q-1.2-.6-2.5-.3-.1.8-.8.8-.8-.4-2 0m76-42.5q-.4-1-1.3-1.2l-2.4-1.3q-1.3-.8-2.8-1.3-1.2-.2-2-.8-1 .5-1 1.5 1.4.7 2.7 1.1c1 .3 2 .3 2.7 1l.6.1q1.3.1 2.4.7zm-7.8 34.7q2.2 1 4.3 1.3l.5-.1.3-1.4-1.5-.2a5 5 0 0 0-3-1.4c-.6-.1-1.3-.6-2.2 0l1 .3.7.5zm-69 73.8-1.4.4q-2.3.2-4.4.7-1.8.4-3.1 1.6v.3q1.9-.1 3.7-1.3 3 .7 5.2-1.7M157.8 202l-5.3 2.9c1.1.3 1.8-.5 2.6-.7l2.5-.4q1.2-.3 2.5-1-1-1-2.3-.8m64.9-77q1.1.8 2.4 1 .7 0 1.3.2l3.4.7h.1v-.4c-.5-.4-1-.2-1.5-.2a8 8 0 0 0-5.7-1.4m-69.4 76.4.4.1 5.5-1-.4-.6-3.4.1c-.4.6-1.5.5-2 1.4m6-30.2-2 .4-2.6 1.8.4.7 1-.7q2-.6 3.2-2.2m76 88.5.5-1.2-2.6-.4-.3.1q.4 1 .9 1.7.4.8 1.5.7zm-3.7-58.8-.2-.6q-.2-.4-.5-.6c-.7 0-1.3-.3-2 0q-.2 1.3.9 1.9zm-3.4-7.5c.7.3.7.3 1 .2q1.6-.3 2.8-1.5l-.3-.2c-.5-.1-.8.4-1.3.5q-1 0-1.7.3-.6 0-.5.7m-32-61.8v-.8h-1q-1 0-2 .4l-.3.5c1.1.3 2-.2 3.3 0m54.3 63.1q.3 1 .8 1l1.2-.1.2-1.2c-1-.7-1.5 0-2.2.3m-98.7 19.7-3.2 2.5q-.3.3-.3.5v.5c1.1-1 2.6-1.6 3.5-3.5M197 131c1 .5 1.7 0 2.4 0l.3-.5q-1-.3-2.7.5m16.7-4.5q-.8-.5-2.3-.2l-.9-.2q-.4 0-.6.5 1.6.1 3.8-.1m-62.3 79q-1.8.1-2.4 1.1-.3.5.3.6zm30.3 2.6 1.6-.5.5-.3q.4-.3 0-.6-1.2 0-2.1 1.4m82.4-59.2h1.8q-1.1-1.1-2.7-1zm-82.8-11.5q-1.4-.4-2.5.6c.9-.2 1.8.2 2.5-.6M275 164c1.3 1.2 1.4 1.3 2.5 1.3a6 6 0 0 0-2.5-1.3m-120.4 25 .3.3c.4 0 .8.2 1-.3q-.5-.3-1.3 0m124.5.8c1.2.6 1.2.6 2 .5l-1.6-.9zm-67-65.7-.1.3h2l.2-.1-.1-.1-.2-.1zm-17 118q.8.3 1.2-.4c-.6-.3-.9.1-1.2.4m-2.8-2.8-.8.8q.8 0 .8-.8m86.1-52.9.6.3 1 .4q-.8-.9-1.6-.7m-93.8 76q-1 0-1.2.6zM172.7 164q.7.7 1.7 0zm-16.1 33.8q-.6-.1-.8.5.6.1.8-.5m19.6 54v.2l1-.3zM220 185l-.8.3v.3zm-41.2-2.5h-.6v.1zm6.1-47.5-.4-.5q-.4 1 .4.5m95.7 61.3-.6-.5v.3zm-35.5-10.2v-.2h-.7v.2zm-45.8 54.3q-.7-.1-.4.5zm-38-81.1q-.5-.3-.9.2.5.2.8-.2m48.2-35.2.4.2.3-.1-.2-.2zm-58.8 84.6h.5zm-8 1.2h.1l.1-.3v-.1zM280 184.2h-.4zm-102.3-4.8q-.2 0 0 0-.2 0 0 0m-26.2 0v-.3l-.1.1zm70.5 81.5h-.4.1zm-38-86.6c.1 0 .3.3.4 0zm20 121.8v.4zm0 1.5v-.2h-.1zm0 5.7v-.1h-.1v.3zM186.4 135l-.3-.2h-.2zm-5.2 71v.2h.4v-.1zm-28.4-27.2-.2-.1v.2zm34.3 86.8v.1&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;m248.1 299.8.2-1.5c-2-3.5-2.4-4.7-1.7-6l.7.5c.8.6.7 1.5 1.5 2 0-1-.7-1.7-.8-2.4l-.4-2.2q-1-1.4-.9-3.2l.5-.2q.8.4 1 1.2l1 1.9 2.3 5.1.4-1.7c-.6-2-2.1-3.6-2.4-5.8l-.8-.7-1.2-2q-.6-1 0-1.9c.6-.5 1-.1 1.7.3l1 4 1.2.8.2-.4-1-1.7a7 7 0 0 0-1.4-3.5l-.2-.2c-.9-1.8-1.7-2.6-.3-5.4l.6-.3q2 .3 2.8 2 .8-.5 2 0l.6.8q.8 1.5 2 2.7 1 1.1 1.4 2.5l.7 1.2.5 1 1.5 3.2 2.3 5 2 3.7 1.4 2.3q.9 1.3 1.5 2.8l2 4 1.7 2.9 1.3 2q.2 1.5 1.3 2.7 1 1.6 1.6 3.3l1.6 3 .9 1.4q1 2.8 2.6 5.2t2.5 5l.2.6c1.1 1.8 1.8 3.8 3 5.5l1.9 4q1.1 2.6 2.4 5 .6 1 1 2.3.1.5.5.8l.7 1.2q.7 1.9 1.9 3.4l4 7 1 2.5c-.4.9.3 2-.8 2.7a1 1 0 0 1-1-1q-.1-2.6-1.8-4.5l-.4-.7q-1.9-4.2-4.1-8.2-.7-1-1.2-2.2-.1-.4-.6-1l-2-2.7-.5-1q-.8-2.5-2.4-4.7l-1.6-2.7q-.2-1.5-1.4-3.1l-.5-1.2-.4-1q-1.6-2.7-2.9-5.7-1-1.7-1.6-3.5l-1.4-2.4-.9-1.5-2.6-5.7q0-.4-.3-.7c-1-1-1.2-2.3-1.8-3.4q-.7-1.8-1.7-3.5l-.8-1.4q0-.4-.3-.7c-1.1-1-1.3-2.5-2-3.7l-1.3-2.4-.9-1.5q-.7-2-2-3.8-1-1.6-1.7-3.5-.1-.5-.4-.9-1.6-2.3-2.7-5l-.9-1.4 1 4.2q0 .5.3 1c1.1 1.4 1.4 3.1 2.2 4.7l1.1 2.3 1 2 .3.6 3 5.3 1 2q.1 1 .8 1.8l1.8 3.3q.7 1.8 1.8 3.4l.5 1q1.1 3.2 3 6l1.3 2.4.4.8q.4 1.8 1.5 3.4l.3.5c.5 1.8 1.6 3.3 2.4 4.9.4 1 .5 2 1.2 2.8.3 1.5 1.4 2.5 1.9 3.9q.7 2 1.8 3.9c1 1.7 1.6 3.7 2.8 5.3q.9 1.5 1.4 3c.8 2.1 2.2 4 3 6.1q.7 1.5 1.7 3l.5 1q.6 2.3 2 4.5 2.3 3.6 3.9 7.5l1 1.9q.8 1.1.6 2.6-.6.6-1.4.2a4 4 0 0 1-1.4-2l-1.4-3.7q-.4-.9-.7-1.2l-1.7-4.5c-.3-.9-1.2-1.3-1.7-1.7q-1.6-2.4-2.6-4.6l-1.5-3.4q-1-3.2-2.8-6.2l-2.9-6q-.4-1.4-1.4-2.3l-.3-2-1.7-2.5q-1-1.8-1.7-3.8-.5-2-2-3.5l-.5-.8-1.4-2.1V327a20 20 0 0 1-2.2-4.6q-1.2-2.9-2.7-5.6-1-1.5-1.7-3.2c-.1-.8-.9-1.3-1.1-2l-1.7-3.8q-.2-.7-.8-1.5a13 13 0 0 1-2.3-5.1 5 5 0 0 0-1-2.3q-.5-.5-.7-1.2l-1.3-2.2q-.2-.4-.8-.7v.2l3.5 8.5 2.5 5.7c.6 1.3 1 2.6 2 3.7.3 1.4 1.4 2.5 1.7 4 .9 1.2.9 2.8 2 4 .5 1.6 1.6 2.9 2 4.6q.4 1.5 1.3 2.8l1 1.5q.3.3.4.8c.5 2.1 2 3.9 2.4 6q.5 1.2 1.3 2.4 1 1.6 1.6 3.5.5 1.5 1.6 3 .4 1.8 1.4 3.5l.3 1 1.5 3.1 2.2 4.6c.7 1.5 1.2 3.2 2.3 4.7q.4.6.6 1.4.4 2.2 1.8 4l1.5 1 .2.5-.4 1.6q.9 1.2 1.2 2.8.1.6.5 1 1.1 2 1.7 4.2.6 1.5 1.5 2.7.8 1 1.2 2l1.6 2.7 1.6 3 1.6 1.3.2 2.7a5 5 0 0 1-1.3 1.8l-.4-.1q-2-.7-2.6-2.9c-.7-.6-.7-1.5-1-2.3l-.2-.8c-1-2-1.6-4.3-2.8-6.3q-.6-1.1-.9-2.5l-.6-.6a2 2 0 0 1-1-1.6v-1.8l-2.7-5.2q-.3-.5-.3-1 0-1.3-.7-2.1c-1-1.3-1.3-2.8-2-4.2q-.2-.7-.5-1a8 8 0 0 1-1.6-3q-1-1.5-1.3-3.4 0-.4-.3-.7a7 7 0 0 1-1.2-2.9l-1.5-1.2-.6-1.9q-.5-2.3-2-4.2l-.4-.9q-.1-.7-.6-1.4l-2.3-4.5-.4-1c-.8-1-.9-2.3-1.5-3.4l-.8-2.2-.3-.5c-1.2-3.8-3.1-7.3-4.6-11q-1.2-3-2.8-6l-1-2.3q-.3-1.6-1.3-2.8l-.2-.4-1.7-4.5-1.8-4-1.1-2.5-1.2-1.3v1.6l1.2 3 2.8 6.3c1 1.5 1.4 3.2 2.2 4.8 1.3 2.6 2 5.4 3.4 8q1.9 3.6 3.3 7.3l2 5 .7 1.5 1.1 1.1q.6 2.5 1.7 4.8l2 4.6.2.4q.9 3.5 2.7 6.7 1.1 2.4 2 5 .4.6.6 1.3 2 3.7 3.7 7.7l1.3 3.7.4.9 2.8 6.2.9 2.1q.8 2.3 2.1 4.4.3.4.4 1 .3 1.5 1.3 2.9.5.7.6 1.6l-.2.4q-1.2-.7-2-1.9l-1.5-2.7-1-2.7q-.9-1.2-1.4-2.3-1.2-3.2-2.8-6.3-.6-2-1.9-3.6l-.2-.7-1.3-2.2q-.4-1.5-1.2-2.9-.6-1-.8-2l-2.4-6-.8-1.3-1.8-3.9-.4-.9c-1.3-1.4-1.5-3.2-2.3-4.8q-.5-1-.9-2.3l-.1-2.1c-1.4-1.6-1.8-3.7-2.8-5.6v-.1q-1.7-3.3-2.8-6.7-.8-1.8-1.8-3.4l-.7-1.4-1-2.4-.4-1c-.4-1.7-1.4-3.1-2.1-4.6-.4-.8-1-1.5-1-2.3q-.2-.6-.7-.6l-.3-1.7q-1-3.2-2.3-6.2-1.2-2.3-2.2-4.8 0-.5-.6-.4.4 2.7 1.6 5.1.4.8.4 1.5l.7 1.1.5 1.1 2 4.2h.2l.2 1 1.2 3c.3 1 .3 2 .9 3l.8 2 .7 1.8q.4 1.5 1.1 2.7.4.5.5 1.3l1.2 3.3 4 9.5 1.7 3.3.7 1.8a39 39 0 0 0 2.7 6.6c.4 1.9 1.5 3.5 2 5.3q1.1 2.1 1.5 4.4l.6 1.2c.3.7.9 1.3.8 2.2l.1.3c1 1.5 1.3 3.3 1.8 5q.2.8.6 1.4 1.4 2.5 2.3 5.4l1 2.7.3 1q-.4.5-1.1.2a9 9 0 0 1-1.2-2.5l-1-3.4-1.8-4-1.2-2.8q-1-2.4-1.7-5h-.1l-1.3-2.3q-.2-1.2-.8-2.4l-2-4.4q-.3-.8-.9-1.5a6 6 0 0 1-1.5-3.3 9 9 0 0 0-1.4-3.8q-.7-.8-.8-1.8-.1-1.4-.9-2.5l-1.7-4.1-.5-2.1-.4-.7-1-1.7-.5-1.8q-.3-1.2-1-2.4-.7-1.5-.9-3-1.3-1.3-1.5-3-.4-1.7-1.1-3.3-1.4-2.2-1.8-4.7-1-1.6-1.3-3.5l-.9-2.7q-.8-3-2.3-5.6l-.4-.6c-.3-2-1.6-3.5-2.2-5.2q-.2-.8-1-1v.4q0 2.2 1.2 4l.2.6c.4 2 1.5 3.6 2 5.5.2 1.6 1 3 1.6 4.6a134 134 0 0 1 4 10.3 17 17 0 0 1 1.7 4.4l1 3.2c.8 2.7 2.2 5.2 3 8a30 30 0 0 0 2.2 5l.8 1.8q1.7 3.3 2.8 6.8.9 2.7 2.2 5.2l.4.9 3 8.3.2.5q1 1.8 1.4 4l.6 1.5q1 1.5 1.5 3.1l.9 2.4-.6.5q-1.6-1-1.9-3-1.1-.9-1.4-2.5-1-3.9-2.7-7.3-.1-.5-.4-.9-.7-.9-.9-2-.1-1-.5-2.1c-1-.8-1.2-2-1.6-3.2l-1.8-5.2q-.9-1.7-1.5-3.3-.4-1.4-1.2-2.5 0-1.5-.9-3l-1.2-2.8q-.6-1.6-1.3-2.8l-.4-1q-.7-2.6-2-5.2l-1.7-4.6-.9-2.3-1.2-3.5-1.3-3.3-1.4-3.8q-1-3.5-2.5-6.7l-.5-1.5c-.1-1.2-.9-2.2-1.1-3.3q-.2-.7-1-1zm4-4v.3l-.1-.2-.2-.1zm3.5-4.6v.6q.3-.4 0-.6l-.3-.9v.7zm.7 1.6-.1-.2zq-.1.6.4 1.1l.1.2-.1-.1q0-.7-.4-1.2m-2.8-6.3v-.1c.1.7.1 1.4.9 1.7v.6q.5-.5 0-.6c0-.7 0-1.4-.9-1.6m.3 6.9q.3 1.5 1.2 2.3 0-1-1.2-2.3m0-12.2q-.3.7.4 1.2.3-.9-.5-1.2m-.4 11.1v-.1m38.3-39.8.5.6q1.4.9 2.7 2 1 .8 2.3 1.3 1.1.7 2 1.5c2 1.3 3.6 2.8 5.8 3.7l2.1 1.4 2 1.2 2.5 1.5q.7.7 1.6 1.1l1.3.8 1.5 1 1 .5 2.9 2 2.6 2q2.5 1.9 5 3.4 2 1.5 4.4 2.6.7.4 1.3 1c.7.6.7.6 1.9.7l1.5 1.5q.8.6 1.8 1l1.2.8 4.5 3.3c2.1.9 3.7 2.7 5.9 3.5q.3 0 .5.3 2.3 1.8 4.8 3.3 2.3 1.2 4.2 2.8l.7.3q3.4 1.5 6.4 4l.5.3q.3 0 .5.3c1 .3 1.7 1.2 2.6 1.7l2.5 1.6q.9.6.9 1.8-.6.7-1.6.4l-.5-.2a16 16 0 0 0-4-3q-1.2-.6-2.4-1.5l-.8-.5q-1.3-.5-2.4-1.4l-2-1.5q-1.2-1.4-2.8-1.7l-3.5-2.7-.5-.3q-1.9-.6-3.4-1.9c-1-.7-2.3-1.1-3.2-2.2-1.5-.5-2.4-2-3.8-2.6l-4.1-2.3c-.8-.3-1.2-1-2-1.5a8 8 0 0 1-3.7-2.1q-1.4-1.3-3.2-2.2-1-.5-1.9-1.4a6 6 0 0 0-2-1.5q-1.7-.7-3.2-1.8l-3.1-2-2.2-1.3q-1.3-1.2-2.7-1.3l-2.3-1.8-4.4-3c-2.5-1.5-4.6-3.6-7.3-4.9q-.4-.2-.7-.6-1-.9-2.1-1.4-1.5-.7-2.6-1.8c-1.7-1.4-3.8-2.3-5.6-3.6l-1-.5c-.3-.2-.5-.7-1-.5v.3q.8.8 1.7 1.4l8.8 6.1 5.4 3.9a11 11 0 0 0 3.5 2c1.2 1.3 2.9 2 4.3 3l5.6 3.6 1.6 1.3 3 2.3q1.5 1.2 3.4 2.3l1.9 1.3 2.3 1.7q1.5.7 2.5 1.9l.5.3q1 .4 1.8 1l1.7 1c2 1.5 4 2.6 6 4.2l2.8 2q1.2 1 2.6 1.4 1.7 1.9 3.8 3l.7-.1h.4q.8 1.4 2 2.1c1.7 1.3 3.7 2.2 5.1 3.7l1.4.8q2.4 1.1 4.4 2.8l1.1.8 5.2 3.1q2 1.4 4.2 2.5l2.5 1.5.3.2 3.1 2.5 1.3.4.4.3q.4 1.9 2 2.8.3 0 .5.6l.3 1.2q-.5.6-1.4.6l-.7-1.7-2.9-2c-.5-.6-.4-1.5-1.4-2l-1.1.2-.7-.4-4.9-3.7-.6-.3q-1.8-.6-3.2-1.9l-2.7-2.2-.7-.3h-1.6l-1-1.9a17 17 0 0 1-3.5-2.3q-1.3-1.2-3.1-1.9-.3 0-.5-.3c-1.2-1-2.6-1.5-3.7-2.4l-.9-.5-1-.7-1.7-2-1.5-.4-1.4-1.1a6 6 0 0 0-2.6-1.7 10 10 0 0 1-3-2l-.9-.7q-1.3 0-2.2-1.2l-.8-.6q-1-.5-1.8-1.2-.7-.6-1.8-1-1-1.8-3-2.5l-1.6-1.1q-1.3-1-2.8-1.7-1.8-.6-3-2.1-1-1-2.4-1.7a33 33 0 0 1-6-4l-4.8-3.3-3.8-2.7-1.3-.9q-1.7-.8-3-2c-1.3-1-2.9-1.7-4-3-2-.8-3.4-2.5-5.5-3.2q0 .6.5 1l1.6 1.1 6 4.4 3.8 2.6 3.9 2.4.4.6q.6.9 1.5 1.2c2 .4 3.3 2 5 2.8q1.8 1 3.1 2.4 2.8 2.4 5.8 4.4l7.6 5.5 1.5.9.6 1.4 1.5.2.4.2q2 2 4.6 3.3 2 1 3.6 2.6l2 1.5q.8.4 1.3.9l1.7 1.3q2.5 2 5.4 3.8l3.6 2.7 3.5 2.4 1 .6q2.8 1.4 4.6 4c1.9.3 3.2 1.7 4.8 2.7l2 1.2.8.5 4.4 3 1.3 1.2.4.5q-.1.5-.5.5h-1.6a3 3 0 0 1-2.3-.9l-2-1.5a8 8 0 0 1-3-2.6q-1.1-.5-2.2-1.4a34 34 0 0 0-4.8-3.2 14 14 0 0 1-3.4-2.3q-1.7-1.6-3.8-2.8a47 47 0 0 1-7-5 20 20 0 0 1-4.7-3.3l-.8-.6q-2.4-1.3-4.3-3l-1.3-1q-2.5-1.6-4.8-3.5-2-1.7-4.2-3.1-1.6-1-3-2.2-3.8-2.4-7.2-5-1.6-1-3-2.3-.6-.7-1.6-1-1.6-.8-2.9-2l-2-1.5-5.6-3.8-3-2.4q-2.2-1.5-4.2-3.2-1.4-1.3-3.2-2.3-3-2-5.9-4.7c-1.6-.2-3-1.3-4.5-2.3q-.5-.6-1.1-.8-1.7-.6-2.6-2 0-1 .7-1.2t1.1-.7q1.2-1.1 2.5 0a3 3 0 0 0 1.8 1c.5-.1.3-.6.6-1q1.3-.5 2.5.2l2.4 1.3q.4 0 .8.3zm-8.2.4v.2zq-.2-.3-.7-.1zm5 3.5.2.2zc-.6-.9-.6-.9-1.4-1q.4 1 1.5 1M58 285.6q-1.9.4-3.6 1.6-3 1.9-6 3.5-2.7 1.2-5 2.6-3 1.6-5.7 3.5l-4.5 2.7-2 1.2-1.1.5c-1 .4-1.4.2-2.3-.9q.4-.7 1-.8 2.2-.8 4-2.1l3.6-2 3.9-2.3q3.7-1.9 7.3-4l2.3-1c2.5-1.6 5.2-2.7 7.6-4.5l3-1.7a40 40 0 0 0 5.5-3c2.5-.8 4.7-2.3 7-3.4l1.8-.7q2.3-.9 4.4-2.1l1.2-.6 1-.5 4.6-2.2q.7-.4 1.2-1.1 1.5-.2 2.8-1l.5-.4q2.5-.8 4.7-2.3 1.3-.9 2.8-1.4 2.4-1.2 4.7-2.7l1.4-.6q1.6-.4 2.8-1.4l.6-.5 2-1q1-.8 2-1.1l.8-.5q1.7-1 3.6-1.8 3.6-1.7 7.1-3.7l2-1 1-.5 2.8-1.7.2-.6-.2-.6-1 .6-.9.3q-1 .3-1.9 1l-1 .5q-.7.2-1.3.6-1.4 1-3.3 1.6l-.8.4-.8.6q-1.8.7-3.5 1.6-2.6 1.2-4.8 2.6-2 1.5-4.3 2.3l-6.2 2.8q-1.4.9-2.8 1.5l-4.9 2.3q-.3 0-.5.3c-2.5 1.7-5.4 2.6-8 4.2q-1.8.5-3.3 1.5a72 72 0 0 1-7.3 3.7q-1.6 1.3-3.6 2l-1.5.7q-1.8 1.1-3.7 1.8l-3 1.3-4 2-4 2a45 45 0 0 0-7 3.6q-1.2.4-2.2 1.2l-3 1.5q-1.4.5-2.7 1.4-1 .6-2.1 1l-5.7 3-.6.4c-2 .4-3.4 1.7-5 2.7l-.9-.2v-.5l.7-.7a19 19 0 0 1 5.4-3.7l1.7-1 .4-.2c2.6-1 4.7-2.7 7.1-4q.4 0 .7-.3 1.8-.6 3.4-1.6 2.6-1 5-2.6l.4-.3 8-3.9 3.3-1.8 3.5-1.8q.6-.3 1.3-.4 1.2-.2 2-1 1-.8 2.1-1.2 1.8-.8 3.5-1.8l.3-.2c2-.5 3.7-1.9 5.7-2.5l1-.5q1.6-1 3.3-1.8l.8-.5 1-.6c.7-.5 1.6-.5 2.4-1l2-1q2.3-.7 4.3-1.9l4.7-2.3 4.4-2.2q.6-.5 1.2-.6 1.4-.3 2.6-1.3 1.2-.8 2.4-1.1l1.2-.4c1.3-1 3-1.3 4.3-2.1q1.4-1 3.2-1.5l1-.3q2.3-1.7 5-2.7c1-1.2 2.6-1.3 3.7-2q.6-.6 0-1l-4.6 2.1-.6.2c-1.8 1.4-4.1 1.8-6.1 3l-4.2 2-1.8.7-1 .5q-1.3 1.1-2.7 1.6l-2.2.9q-.8.3-1.7 1a6 6 0 0 1-3.8 1.2l-5.2 2.7-4.6 2a14 14 0 0 0-3.6 1.7l-1.6.3q-2.2 1.5-4.8 2.4-1.2.4-2.3 1l-4.7 2.3-3.6 1.5-1.6.7-4 2-1.6.6a8 8 0 0 0-2.3 1.2q-1 .7-2.2 1-1.6.5-3 1.4l-3.4 1.6q-2.6 1.1-5.1 2.5l-1.8.6-1.5.9q-1 .4-1.7 0-.2-.7.2-1.1 1.2-1.3 2.7-2.2 3-1.6 6.1-2.6 2.6-.9 5-2l8-3.8 2.5-1.4c.8-.5 1.6-.4 2.3-1l2.1-1 6-2.5q2.5-1.1 5-2.7l.8-.4q1.7-.6 3.2-1.5l4.8-2.2c1.4 0 2.5-1.3 4-1.5q.3 0 .7-.3c1.2-.9 2.7-1.2 4-1.9q1.5-.7 2.9-1.1l4.3-1.7 2-1c2.4-1 4.6-2.3 7-3.1l3.4-1.5q3-1.7 6.1-3l1.2-.7.9-.4c2.6-.7 5-2.1 7.5-3.2q.7-.4 1.7-.6l1 .2 1-.1q.2.5 0 1h-1.5q-1.8 1.5-4.1 2.1-.6.6 0 1l1.8-1.1.7-.3 1-.1q.4.1.8.5l-.4.8c-.8.5-1.9.5-2.2 1.4q.6.6 1 .2c1.2-1 2.6-1.2 4-1.9l.6.5.2.7-.7.6-2.4 1.4q-1.6.2-3.2 1.5l-.9.5q-2.9 1.1-5.6 2.7l-.5.3q-3.8 1.6-7.3 3.7c-1.5.8-3.3 1.3-4.6 2.4-1.9.5-3.3 1.9-5 2.5l-1.3.7-6 3-1.4.9-1.6.8q-1.2.4-2.2 1l-5.9 3.1-3.9 2.3q-1.6.7-3 1.8l-.3.2-4.6 2q-.7.2-1 .6-1.5 1-3.1 1.6l-3.1 1.7-1.2.6c-1 .5-2 .6-2.8 1.4q-.1.2-.5.3l-4.7 2.3-2.3 1.6m250.7-71.2q.3.4.5.4 1.2-.1 2.4.5h.6c1.3-.2 2.4.3 3.6.5q1.2.3 2.4.2l3 .2q1.5 0 3 .5 2.5.5 5.1.5l1.6.3h1.1q.8 0 1.5.3l.8.2 4.6.6c2 .3 4 1 6.1 1q2.1.4 4.3.4t4.6.6h1.1q.8 0 1.4.2c3 1 6 1.1 9 1.6q2.4.2 4.8.9h.7q2.2-.1 3.7.8 7.7.9 15.2 2.1l-.4.8h-4l-5.3-.3q-1.9-.1-3.6-.7-2.3-.7-4.7-.6c-1.1.1-2.3-.4-3.4-.5l-1-.2c-2.3 0-4.6-.8-7-.9l-1.8-.4c-.8-.4-1.5 0-2.3-.2q-1-.4-2.3-.5l-2.4-.1-1-.2q-1.4-.5-3.2-.5l-3.6-.6q-1.5-.5-3.1-.2-.7 0-1.3-.3-1.5-.4-3-.5-3.5-.2-6.9-.8-1.8-.4-3.8-.6-2 0-3.6-.7l-.8-.1q-2.6-.2-5.2-.8h-1.1q-.9 0-1.6-.2-1.8-.4-3.7-.3-2.3 0-4.6-.6l-3.2-.3c-1.3-.4-3.3-.3-5-1.3q-1.2-1.5-3.4-2.5l-.5-1.9c.3-.8 1-1 1.2-1h3.3c1 0 2-.3 2.9.2q2-.2 3.8.3 1 .3 2.2.1 2.4-.2 5 .2h.8c1.6-.4 3.2.3 4.8.2q1 0 1.9.4 1.4.6 2.7-.1 1.2.5 2.6.4h1.6q3.5.6 7 .5 1.2-.1 2.3.3 2.7 0 5.4.7 1 .2 2.3 0l1 .1c1.8.4 3.7.2 5.4.4s3.3.2 4.9.6q1.5.3 3-.1 2.5.5 4.9.4 1.3.1 3 .5a6 6 0 0 1 2.8 0l4.3.8 4.5.5 2.5.3h2l1.9.2 1.3.3q2.5 0 5 .4h.2c3-.3 6 .5 9 .3q1.7 0 3.5.4h.7q1.8 0 3.5.5 3.9 1 7.9 1.1l1.3.2.2.1q0 .3-.2.5l-1.2.4q-1.7.3-3.5 0H409q-1.6 0-3.3-.3t-3.2.3q-2.4-.7-4.7-.7-1.7 0-3.5-.3l-4.2-.7h-.8q-1.1.2-2.3-.1-.4-.2-1-.2-1.6 0-3.2-.5l-1.4-.1-2.5-.1-5.6-.4-4-.3q-2.4-.6-5-.2l-1.2-.2c-1.3-.3-2.6-.1-3.9-.4a41 41 0 0 0-7.4-.5q-2.5 0-5-.5l-.6-.2q-4.5-.2-8.9-.8c-1 .4-2 0-2.9 0l-2.6-.4c-2-.5-4.2-.4-6.2-.7q-1.3 0-2.5-.4h-1.8l-5-.1-1-.1a2 2 0 0 0-1.5 0h-1.3q.8.5 1.5.5 2 0 3.9.6h1.1l6.4.8q4.2.6 8.6.5l4.8.6.6.1c1.2-.4 2.4.3 3.6.4q1.7-.1 3.4.5h.6q2.4 0 4.8.5l4 .6c1 .1 2-.2 3 0q2.5.6 5.2.5l1 .2c1 .6 2 .3 3.2.5.6-.4 1.1-.1 1.7 0q1.3.6 2.7.4 1.8 0 3.6.6.9.3 1.7.2 2-.2 4.1.3l4.2.7h1.5l7.6 1.1 1.9.2q2 0 3.7 1l.2.4a2 2 0 0 1-2.1.6c-1.7-.4-3.5-.3-5.2-.6-3-.6-6-.5-9-1.2l-1.9-.1-2-.2-1.2-.1q-1.5 0-2.9-.5c-1.2.1-2.3-.6-3.4 0a19 19 0 0 0-4.7-.7l-4-.6-2.2-.2q-1.6.2-3.2-.2-1.4-.3-2.4.1c-1.8-.5-3.4-1-5.1-.6q-2.5-.8-5.4-.9-4-.2-7.7-.6c-2-.2-3.9-.7-5.9-.6q-1.5 0-3-.5-2.6-.5-5-.6-1.5 0-3-.4-1.3-.3-2.8-.4l-6.2-.7h-.6zm2.6-2.2-1.3-.4-2.7-.3c-1.3-.2-2.7 0-4-.4-1 .1-2.2-.2-3.3.1q-1.7-.3-3.4-.2h-1.4c.5 1.4 1.8 1 2.6 1.4q.6 0 1-.3 1.1 0 2.3.3c.7.1 1.6-.4 2.3-.2l3.5.3q2.2.4 4.4-.3m-3 2h-.9q.4.5.8 0m-5.2-.3h.4zm-13.5 53.4.3.5q1.4 1.4 2.9 2.6.4.2.7.6l1 1q1.3.8 2.5 1.8l2.4 2q1.3 1.3 2.7 2.2t2.9 2.4l.1.1 6.3 5 1.5 1.2q.7.8 1.7 1.3 1.4.8 2.3 2l2 2 .5.5q1.3.7 2.5 1.9.8 1.1 2.1 2c1.2.6 1.9 1.7 3 2.4q1.2.9 2.2 2l.9.7q2.3 1.6 4.2 3.4l.7.7.5.6q1.6 1 3 2.3l5 4q1.3 1 2.4 2.2l-.3.6q-1.6 0-3.3-1a6 6 0 0 0-1.9-1.7q-1.8-1.3-3-3-1.5-1.7-3.5-2.9l-1.5-1.2-2.8-2.4q-1.7-1.6-3.8-2.7l-2.2-2-1.1-1q-2-1.5-3.7-3.1-1-1.3-2.3-2l-2-1.5-.7-.6q-1.6-2-4-3.3l-.7-.7q-.7-.8-1.8-1.5-1.4-.9-2.5-2l-1-1q-.4 0-.6-.2c-1-1.3-2.4-2-3.5-3q-2-1.7-3.8-3.5l-1-.6-.7-.6q-1.1-1.4-2.6-2.3l-7.5-6-.3-.6c0-1 .7-1.1 1.5-1.3a7 7 0 0 0-2.3-1.7q-1.2-.6-1.6-1.9-.2-.4.3-1 1 .1 2 1 1.3 1.3 3 2.1l.7.7.7.6q2.3 1.4 4.3 3l4 3.1q1.1 1 2.4 1.6c.2-.6-.2-.8-.3-1.2l-1-.6q-1.1-.7-2-1.7-.5-.6-1.2-1c-1.6-.8-2.6-2.2-4.2-3q-.5-.1-.9-.7-.8-.8-1.8-1.4-1.5-.8-2.6-2a10 10 0 0 0-3-2.2q-1-.4-2-1.2-.4-.2-.6-.6-.1-.9.7-1 1 .4 1.8 1.2 1.2 1 2.6 1.7 2.1 1 3.9 2.7 1.1 1 2.5 1.8 2.6 1.8 5 3.8.4.4 1 .6 1.5.8 3 2.1 2.6 2.3 5.4 4.1l4.9 3.6 4.6 3.3 4.6 3.3c1.6 1.7 3.8 3 5.6 4.4l1.6 1.2q1 1 2.1 1.6 1.5.7 2.6 1.8l4.3 3.7.6.4 5.4 4.1 3.6 2.7 4 2.8 1.5 1a93 93 0 0 1 7.8 6.4q1.2 1 2.6 1.8l3.8 3.3.2.5q0 .3-.3.5-1.1.2-2-.5-1.8-.9-3.3-2.1-1.5-1.1-2.8-2.4-1.6-1.7-3.7-2.6-1.5-.9-2.8-2l-3.4-3.3q-.7-.8-1.9-1.3l-1-.8-2.5-1.8q-.3-.6-1.3-1.3l-4.6-3.3q-2.2-2-4.7-3.4-1.7-1-3.3-2.4l-4.4-3.3c-.8-1.2-2.3-1.6-3.3-2.6q-.9-.6-1.8-.8-.5-.7-1.1-1c-1.6-1.2-2.8-2.6-4.5-3.5l-1.5-1.3-5.2-3.7-2-1.6q-.9-.8-1.9-1.3l-1.5-1.2-.8-.1q2 2 4 3.5l.6.4c1.5 1.5 3.3 2.5 4.9 4q3 2.5 6.2 4.9 1.6.9 2.8 2.4l.2.3c1.8 1 3.3 2.6 5 3.9q3 2.3 6 5 1.3 1.2 2.9 2.2l6.7 5.3q2.4 2.3 5 4 .8.5 1.5 1.3.7 1 1.7 1.5l2.7 2 1.2 1q.7.5 1.9 1c.2.8 1.3 1.2 1.3 2.4l-.5.6q-2.4-1-4.2-2.9t-3.8-3.6q-.5-.6-1.2-1-1.4-.6-2.4-1.6-1-1.2-2.3-2.1l-.8-.6q-1.6-1-3-2.2-1-1.1-2.3-2-2-1.4-3.8-3c-1-1-2.4-1.6-3.4-2.7l-2-1.5q-1.9-1.3-3.4-2.9l-1.4-1q-1.3-.8-2.2-2a6 6 0 0 1-3-2.3q-.6-.7-1.4-1.1c-2-1-3.5-2.7-5.4-3.8l-1.2-1q-1.3-1.2-2.8-2.1c-1-.5-1.9-1.6-2.9-2.3q-1.8-1.2-3.4-2.9c-1.7-1-3-2.5-4.8-3.6q-1.1-1-2.7-1.5 0-.3-.4-.4v-.1h-.2.3q0 .5.3.5m-116-139v1q0 .6-.7.9c-1.2-.4-1.6-1.6-2.5-2.5q.3-1.2-.5-2.3l-.8-1.8q-.3-1-.9-1.7l-.5-1q-.4-1.6-1.5-3-.3-.2-.4-.6-.6-1.1-1.4-2.1t-1-2l-1.7-3.4-.7-1.4q-.8-1.2-1.3-2.6l-1.2-2.2-3.4-6.1-1.5-2.3-.6-1.2c-.4-1.8-1.5-3.4-2.4-4.9q-1.3-2-1.8-4.4c-1.5-1.6-2.4-3.8-3.4-5.8l-.8-1.3-.3-.5q-.9-1.9-2.2-3.3a13 13 0 0 0-2.2-5l-1.3-2.2-3.4-6.4q-.9-1.4-1.5-3.2-.3-1-1-1.9l-2.3-4q-1.3-2.8-3.1-5.3c-.8-2.3-2.6-4-3.5-6.1q0-.3-.3-.5c-.3-1.7-1.4-3-2-4.4l-.6-.8-1.2-2-1-1.9q-.5-.3-.5-.8c-.2-1.6-1.6-2.7-1.4-4.4l-.1-1.8-1.7-1.4c-.2-1.7-.2-1.8.8-2.2.7.2.8 1.1 1.5 1.2l.7.2-1-1.2-.6-1.2-.7-.4q-.7-.9-.3-2 .3-.6 1.2-.5l.3.4a5 5 0 0 0 1.3 1.7q2.3 2 3.5 4.9 1.2 2.4 2.6 4.7l2.4 4.3q.7 1.6 1.6 2.8.6.6.9 1.6.8 2 2 4l.5.7 1.2 3c.4.8 1.3 1.4 1.5 2.4q.1.8.7 1.4c1 1.5 1 1.6 1.5 3.7l1.3 1.5q.1 1.6 1.4 2.8t1.7 2.8q.5 1.3 1.2 2.4.9 1.5 1.5 3.2.6 2 1.7 3.7.8 1.5 1.3 3 .5 2 1.8 3.7 1 1.5 1.7 3 .1.5.5 1l1.5 3.1q.4 1.2 1.3 2.1L155 87l1.5 3.4c.5 1 .7 2 1.6 2.9q.4.3.6 1c.4 1.9 1.5 3.4 2.3 5q1.2 2.2 2 4.5l-.4.4-.6-.5-2.1-3.7c-1.1-2.1-2.5-4.1-3.3-6.4l-1-1.8-.4-.7q-.6-1.7-1.7-3l-1.2-2.3-4.6-9q-.3-1-1-1.7l-.7-1.4c-.2-1-1-1.9-1.4-2.8q-.7-1-1-2.3l-.6-1.2-1.3-2.2-3.1-6-.4-.7c-1.3-1.8-2-4-3-6q-.1-.7-.7-1.3-1-1.1-1-2.2l-1.4-2.4-.7-1.2-2-3.8-.7-1.6-2.8-5.3q-2.1-3.8-3.9-7.8-.9-1.7-2-3c-.7-.7-1-1.6-2-2.3q0 .6.2.8l.7 1.2q.4.6.6 1.4c.4 2.6.4 2.8 1.7 4.4l1.6 4.4v.2a8 8 0 0 1 2 3.8q2.3 4.1 4.4 8.6 1.4 2.7 3 5.3c.5 1.7 1.7 3.1 2.5 4.8l2 3.3.7 1.8 1.9 3.4q.8 1.5 1.3 3l.5 1 .6 1q.7 1.6 1.8 2.8l1 1.7q1.3 3 3.1 5.6 1.2 1.8 1.9 4c1.3 1.1 2 2.9 2.8 4.5q2 4.3 4.3 8.3l1.5 3.4a34 34 0 0 0 4.6 8.1q.7 2.7 2.4 4.9c.5 1.7 1.8 3 2.2 4.7l.3.5c1.6 1.7 2 4 3.5 5.7l.7 1.8zM77.2 286c-1.1 0-1.8.9-2.7 1.4l.7.5c0 1-1.1 1-1.4 1.6-.8 0-.8-.7-1.2-1q-.8.1-1.7.5l-2 1.1-3 1.5-3.3 2-.8.6q-4.3 2.1-8.2 4.9l-2.3 1.1-.6-.5q.7-1.4 2-2.1l4.6-2.7q.6-.3 1-.8 1.4-1.5 3.3-2.2l.3-.1c1.4-.8 3-1.4 3.7-3a5 5 0 0 0 3.7-1.2q.5-.5 1-.6 2-.6 3.7-1.9 2.6-1.8 5.7-3l.3-.1c2-1.7 4.6-2.5 6.6-4.2l1.2-.7a38 38 0 0 0 6.8-3.8q2.5-1.3 4.8-2.8a32 32 0 0 1 5.1-3l1.2-.6q.8-.7 1.8-1.2l4.6-2.5 2-1.4q2.3-1.4 4.8-2.4l.1-.1c1.8-1.5 4-2.2 5.9-3.5q2.7-2 5.6-3.4l1-.8q-.2-.8-.8-.6c-1.4.9-3.2 1.1-4.5 2.3l-1 .5-1.2.7q-1.4 1-2.9 1.6l-1.5.9-.8.5q-1.2.5-2.3 1.2l-9.9 5.8-2.7 1.5-4 2c-2 1.3-4.1 2-6 3.4q-.1.3-.4.3-2.9 1.1-5.3 3-.2 0-.5.3l-7.3 3.7q-2 .9-3.7 2.2-1 1-2.5 1.5-1.3.5-2.6 1.3l-7 3.7-6 3.2q-3.3 2-6.7 3.8-1.6.8-3 2.1l-.6.6-3 1.2q-1-.2-1-1.2 0-.2.3-.5 3.2-2.4 6.6-4.2l7.1-3.7 5.6-3.3 3.6-1.9 2.8-1.6 4.4-1.8q.4-.2.7-.6 1.5-1.1 3.2-1.9l1.4-.7q1-.8 2.3-1l.8-.5q3-2.1 6.2-3.6l8.2-4.3 1.7-.8.7-.4c1.4-1.3 3.4-1.8 5-2.9 1.5-1 3.2-1.5 4.6-2.6l.5-.2q4-1.5 7.4-4l2.8-1.8 1-.5q2-.7 3.5-1.8l8.3-4.7q.9-.9 2.2-1.2.8 1 .2 1.4l-1.6 1.4q-.6.5-1 .6c-.6 1 .1 1.6 0 2.3v.2l-3.7 2.6-1.2.7-1 .3-.7.9-.5.2q-2.1.5-3.8 2-.5.5-1.3.8l-2.4 1.3-4.8 2.9q-3 1.5-5.6 3.5l-2 1.2-3.7 2.3q-.5.4-1.2.6-2.5 1.1-4.7 2.7-1.2 1-2.6 1.4l-.8.5c-1.6 1.3-3.6 2-5.3 3l-3 1.9q-.3.4-.9.6-2 .7-3.8 2-1.3.6-2.3 1.7zm-3.5 2s.4.1.1-.2zh-.2z&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M248 299.8q0 .7.4 1.5l2.5 8 1.3 3.9.5 2q.9 3 2.2 5.7.4.8.6 1.8l.4 1q.4.6.4 1 1.3 4.4 3.1 8.6l.3.7q.5 2 1.2 3.7l1.6 4.4.7 1.4a7 7 0 0 1 1 3q.3 1.6 1.2 3 1.3 2.1 1.5 4.6l.1.5c1.2 2 1.6 3.1 2 5.4 1.2 1.4 1.4 3.2 2 5l1.3 3.2.5 1.1-.3.4-1 .3-.8-1.4q-.6-1.4-1-2.9l-1.3-3.5q-.4-.8-.6-2a11 11 0 0 1-2-4.6q0-.7-.4-1.3-1-1.9-1.7-4 0-.4-.4-.8l-.5-1-2-5.6-2.1-5.8-.1-.4c-1-1.3-1.2-2.9-1.7-4.4l-1.2-2.8-1-2.8-.3-.9-1.2-2.7-2-4.7-.3-.4q-.2 1 .3 1.7l3.5 11 .6 1.2q1.1 2.2 1.5 4.6l.1.8q1.4 3.4 2.2 7l1 2.4q.5 2.6 1.3 5.3l.3.9q.9 1.5 1 3.3l.7 2.2-.1.7c-.8-.1-.6-.9-1-1.2l-.8-1c-.3-.4 0-1.1-.8-1.4-.2 1.2.3 2.3-.3 3.5l-.5.3-.4-.1q-1-.6-1.3-2l-.8-2c-.8-1.3-1-2.8-1.5-4.3q-.7-2.4-1.6-4.6l-1.5-4.2-2-7-1.5-3.9q-.1-1.5-.8-3.5l-1.8-5q-.4-1.3-1.2-2.8 0-2.3.6-2.8c1 .4 1.3 1.4 2 2.3q0 1.5.4 2.9.1.8.4 1.5l1.3 3.4 1.2 3.2q.6 1 .7 2.4v.2q.9 2.2 1.5 4.6.8 2.1 1.3 4.2.2 1.9 1.2 3.5l.4 1 1 2.5.3.7q.4 2.2 1.8 4.2l.1-.5v-.6l-.5-2.3q-.5-2.7-1.8-5.3l-.3-1-.4-1.2q-1-2.4-1.6-5.2l-.5-1.2q-1-1.4-1.1-3.3l-.3-1.1q-.8-1.4-1-3c-.3-.7-.3-1.5-.8-2.1l-.2-.6-1-4-.9-2q-.8-1.4-1.1-3.2-.2-1.2-.8-2.2l-1.2-3.9q-.3-1.5.1-2.9l.4-.3a6 6 0 0 1 1.4 2.3q.2.6.8 1v1.4c.8 1.5 1 3.2 1.9 4.7q-.2-2.4-1.1-4.4c-.3-.5-.3-1.2-.9-1.6v-1.6q-.5-1.7-1.2-3-.9-1.7-1.5-3.5a7 7 0 0 1-.3-3.6q.1-.4.5-.8c.9 0 1.2.9 1.8 1.1M43.9 91.2l-.9-1q-1.4-1-2.7-.3c-.3.6.3.7.3 1l.2 1.2 1.8 2q1.9.4 3.3 1.9.5.6 1.2.9l4 1.9q2.8 2.5 6.3 4.4 1.2.6 2.2 1.5l.7.5q1.6.7 3 1.8l1.5.9 2 1.2c1.4.8 2.6 1.9 4.1 2.5q.3 0 .5.3c1.4 1.5 3.4 2.2 4.9 3.5 2.2 1 4 2.7 6 4q3 1.5 5.8 3.6c1.6 1.3 3.6 2.1 5.1 3.5l1 .6 2.5 1.6q1.1.8 2.5 1.5l2.7 1.8q1.3 1.4 3 2a5 5 0 0 1 2.4 1.8l1.5 1.7q-.3.4-.7.2c-1-.8-2.3-1.1-3.4-1.8l-3.4-2-3.7-2.7a9 9 0 0 1-4.1-2.3q-2.2-1.7-4.5-3-3.4-2.3-7-4.4l-.9-.7-1.2-1-6.6-4.2-1-.6q-1.6-1.4-3.7-2.5l-1.6-1.1-.5-.3c-2-.9-3.5-2.7-5.5-3.6-1.3-1.3-3-1.7-4.5-2.7l-4.2-2.9-2.1-1q-1.4-.5-2.4-1.3c-2-1.4-3.9-2.9-6.3-3.6l-2-2-.6-1.5q-1.4-.7-2.6-1.7l-.5-.5-1-3c.5-.6 1-.4 1.6-.4l1.1.1c1-.4 2 0 3 .2l2.7.6 1 .3q2.5 1.4 4.5 3.4.2.3.6.5c2.2 1.3 3.9 3.2 6.1 4.4q.4.2.7.6l.6.6c2 .9 3.7 2.4 5.6 3.5q1.6 1.1 3.5 2l.4.2q1.1 1.1 2.5 1.8 1.2.8 2.3 1.8 1.2 1 2.6 1.7l3.8 2.7q1 .8 2.4 1.3 1 .5 1.7 1.2l1.2 1c1.3 1.5 3.2 2 4.7 3.2l1 .6q2.4 1.8 5.2 3.5l1.3.8q.9.3 1.6 1.1.5.6 1.2 1l3.2 2.1q2.3 1.6 4.2 3.2 1 .8 2.7 1.7 1 1.5 2.8 2.5l4.9 3.3.7.6q1.6 1.4 3.5 2.5l3.9 2.7 2.2 1.6q.4.3.4.8h-.3l-2.9-1.6c-1-1-2.1-1.4-3.2-2.2l-3-2.1q-2.3-1.5-4.6-3.4l-1.4-1q-1.6-.8-3-2l-.3-.3-3.5-2.2a36 36 0 0 1-5.7-3.7q-1-.4-1.6-1l-.7-.5q-1.7-.7-3-2l-3-2.2q-2.2-1.7-4.6-3-.5-.1-.8-.5-1.5-1.7-3.5-2.7l-2.6-1.8-3-2q-1.4-1.2-3-2l-2.8-1.7-2-1.5q-1.5-1.5-3.3-2.5-2.3-1.3-4.5-3-3.3-2.5-6.9-4.5l-2-1.4-2-1.3c-.7-.7-1.4-1.5-2.6-1.4q-.4 0-.7-.3zM263 286.9v-1.2q.4-.5 1-.2l1.2.8 2.2 3.7 2.6 4.3 3.2 5 .7 1q1.3 3 3.1 5.7l1.7 3.3q1.5 3 3.4 6l.5 1q.5 1.1 1.3 2.2a9 9 0 0 1 1.5 2.7q.3 1 1.1 2l.2.3c1.7 3.4 4.2 6.5 5.8 10l1.3 2.4 2.7 5.1q.4.7-.1 1.4-1.1-.1-2-.9l-1.9-4.5-1.2-1.3v-.1l-1.6-3.5-1-1.5q-.6-.9-.8-2.1a8 8 0 0 1-3-5.3l-2.5-3.3q-.3-1.5-1.3-2.8c-1.3-1.7-2-3.6-3.2-5.4l-1-1.6-1.4-2.4-1.7-3.5q-.6-1.3-1.6-2.2l-.3-.5q-1.2-2.3-2.7-4.5l-3.3-5.3-.4-.3v.5l.5 1c.4 1.6 1.4 3 2.2 4.3l.7 1.2 3.2 5.8.9 1.7.9 1.8 3 5.4.3 1q.2.7.8 1.5 1.4 2 2.2 4.1.6 1.8 1.8 3.3l.4.6q1 2.2 2.4 4.2.8 1.1 1.2 2.4l1.4 3.2 3.4 6.2q1.6 2.4 2.7 4.9l.9 1.3.7 1 2.2 3.6q.9 1.7 1.3 3.7v1q-.7.5-1 0l-2-2.6-.9-2.6-1.2-2.2q-.6-1.4-1.6-2.6-1.3-1.7-2.1-3.5-.4-.9-1.3-1.5l-.8-.8v-1.5q-1.9-3.5-4.4-6.7-.1-1.2-.8-2.6-1.6-3.3-3.4-6.3c-1-1.6-1.5-3.3-2.6-4.8l-.7-1.6q-.5-1.4-1.2-2.5c-1-1.4-1.3-3-2-4.4l-2-3.6-2.5-4.6q-1.5-3.2-3.5-6l-.5-1q0-.4-.3-.7c-1.5-2-2.2-4.5-3.7-6.5l-.9-1.6q-.4-.9-1-1.7L257 282l.3-.6c1.2 0 2 .8 2.8 1.3 1 1.4 1.6 3 3 4.1q-.2.6.3.8.1-.5-.4-.7m1.5 2.4v-.2zl.1.8q.4-.6 0-.7m-25.2 53.9q1 1.2 1.3 2.6l.5 1.2c.6 0 .5-.6.7-.8l.8-.5q1 .3 1 1c.2 2.3.9 4.4 1 6.7l.1 1.3c.2 1 .7 2 .6 3l.3 1q.7 2.3.8 4.8l.2 1.5c.6 1.3.6 2.7.9 4v1.7q0 3 1 5.8l.2.1c.1 2.2 1.2 4.2 1 6.5 1 1.4 1 3.2 1.6 4.8v3.1q0 .3-1 1c-.5-.3-.4-1-.8-1.6l-1.1-1.8.2-1.3-.4-1.3a5 5 0 0 1-.3-4.6l-1.3-4q.5-3.3-.8-6-.4-1-.5-2l-.2-2.5a23 23 0 0 0-1.3-5.6q0-.4-.5-.9c-.3 3.8.6 7.2 1 11q-.3 1.1.1 2.7c.3.8.7 1.7.2 2.5q.6 1.8.7 3.8c.2 1.6.1 3.1.6 4.7l.1 1q.1 2.9 1.1 5.4.7 1.5.5 3.3-.2 1.3.4 2.4l.3.8q0 1.4.3 2.9l-.6.2-2.2-2c-.7-1.5.3-2.9.2-4.5q-.8-1.1-.8-2.8-.1-1.9-.9-3.8-.3-1.4-.3-2.9.1-1-.2-2l-.2-2q.2-.6 0-1.2c-.6-2.5-.4-5.2-1.5-7.4v-2.3q-.9-1.4-.9-3.4l-.3-6.4v-2.3q.1-1.5-.4-3.1l-.3-2c-.4-.2-.5-1-1.5-.6-.1 1.7-.3 3.4.2 5.1q.7 2.3.6 4.5-.1 2.9.4 5.7l.2 1.2q.2 3.3.8 6.6v.4c-.1 2 .5 4 .5 6v.8q.1.5-.4.7l-.3-.2-1-3.8-.4-3.1-.6-4.6q-.4-1.5.2-3.1-.8-1.3-.8-2.8 0-.6-.6-2-.2-.9.2-2.2l-.4-2.8q0-1.6-.6-3.3l-.1-.5-.4-4.9v-.8l-.7-2.6-.1-2.7a20 20 0 0 1-.5-4.2q-.1-1.9-.5-3.8l.4-1h.6l1.2 1.3.5 3.1q0 1.3.4 2.5.3 2 .3 3.9-.2 1 .6 2 .5 0 .5-.5c0-1.1.6-2.2.2-3.4zm2.1 5.5-.4 1.3.3 1.4-.1 1.5q.6.7.5 1.6 0 2.8 1.5 5.3c.7-1.7.7-1.9.2-3.4q-.4-1.2-.5-2.3-.2-2.7-1.5-5.4M6.3 188c-1.7.1-3.2.6-4.4-.8q1-1.1 2.3-1a5 5 0 0 1 2.4.4l1-.2q2 .6 4 0 3 .7 6.2 1 3 .2 6.2 0 2.3 1.1 5.2.7l1.1-.9c1 0 .9.7 1.3 1.1l.3.2 2.1.3 3 .5 1.6.1h1c1.9.5 3.8.3 5.7.4q1.5 0 3 .5 2.8.7 5.6.7l4 .1 4 .5 1.5.1q2 0 3.7.3t3.5.2h1.1l2.1.6c.8-.4 1.4.2 2 .3l3.5.2h1q1.5.6 2.9.4l2.7.5 2.7.4h1.1l2.1.3 2.4.2.5.1q2.3 0 4.5.8c.6 0 1.3-.4 2 0h.4q4.4.2 8.7 1.1 1.1.1 2.4-.4 1.3.5 2.8.6t2.8.5q1.4.3 2.8 0l2.2.5h4.5q1.1-.2 1.8.7.3.9-.7 1.3h-1.4l-7.3-1h-2.1q-2.7 0-5.3-.7-1.7-.3-3.4-.2l-2.8-.1q-1.5-.3-2.9-.3-1 0-2-.3-3.4-.5-6.9-.5-2 .2-4-.3H90c-3 0-5.9-.7-8.9-1.1l-1.3-.1q-2.4-.2-4.6-.6-3-.6-6.2-.6l-2.2-.2-2.7-.2c-2.2-.4-4.5-.1-6.7-.7l-.6-.1c-2 .2-3.9-.3-5.8-.6h-2q-1.7 0-3.4-.4-2.6-.6-5-.5l-2.4-.1-4-.7q-1.1-.4-2.2-.1l-10-1.3q-1.2-.2-2.4-.1-1.9.2-3.6-.4h-.4c-2.2-.1-4.3-.6-6.5-.5q-1.5.1-3-.5m305.1 133.2v.7q2 2.2 3.6 4.4 1.5 2.5 3.4 4.7l1.9 2.5.5.6q1.3 1 2.2 2.5l3.3 4.6q0 .3.4.6 1.9 2 3.5 4.2l.7 1.1v.7q-.8.1-1.2-.4l-.8-.8-3.5-4.7-.3-.4c-2.3-2-3.7-4.7-5.6-7l-1-1.5q-1.3-1.2-2.2-2.8-1.4-1.9-3-3.3-1-.8-1.6-1.8a36 36 0 0 0-4.5-5.6l-.5-.4-2-3.8.8-.7 1.6 1.2.1.5-.1-.5q0-.5-.2-.7l-1.3-1.4c-.1-.9-.6-1.9 0-3l-1-2c.8-.7 1.7-.4 2.5-.2q2.2 2 4.2 4.3 1.3 1.7 2.8 3.2l1.8 1.8 1.5 1.5q1 1.4 2.4 2.3l.2.3 1.1 1.6 1.3 1.4 3.2 3.1q.4 1 1.6 2 .7.6 1.4 1.6l2.3 2 2.4 2.1 1.8 1.7q.5.5 0 1.4-1.4.4-2.3-.7l-2-2.4-1.4-1q-.8-.4-1.7-1.2c-.5-1.5-1.8-2.5-2.9-3.7l-1.3-1.4q-2.4-2.9-5-5.4l-2.4-1.8-.2-.3q-1.5-2.6-3.7-4.7l-1.6-1.5-2-1.9q-.4-.6-1.2-.5v-.2.1q.5 1.4 1.4 2a8 8 0 0 1 2.4 2.7l.3.4 3.6 4q.6.5 1.1 1.3a10 10 0 0 0 3.2 3.4q1.3 2.3 3.3 4 1.6 1.6 3 3.6.4.7 1 1.2c1.4 2.2 3.6 3.7 5.2 5.8q.2.3.6.5 1 .6 1.6 1.7a9 9 0 0 0 3.2 3.1q1.6 1.9 2.3 4-.8.8-1.5.2l-1.8-1.5-3.5-4.2-.8-1.5c-1.4-1-2.1-2.6-3.8-3l-.7-1.5q-.3-.7-.9-1.2l-1-1q-.3-.6-1-1-.5-.2-1-.8l-3.3-3.9q-1.9-2-4-3.9a9 9 0 0 1-2.7-3.8zc-.1 0 0-.4-.3-.2zm75.1-109.1 1.2-.5c1.5.2 3 .8 4.5 0l2 .6.7.2 5.2.3.8-.3.5.1q1.2.4 2.3.4 2.3-.3 4.5.2h.4q3.3.2 6.6.8c1.2-.3 2.5.3 3.8-.1.7-.2 1.3.4 2 .2l3 1.2.2.4-.3.5-1.8-.2h-1l-.2-.2-.3-.3-1 .4h-1.3q-.6-.2-1.1 0-1.8-.4-3.5-.4l-3-.3-4-.3q-1.8.1-3.8-.4h-.6l-7.8-.5c-1.3-.1-2.7.2-4-.2h-1.4c-1-.1-2 .1-3-.3-1.2.3-2.2-.2-3.3-.2h-4.1c-1.9-.5-3.8-.4-5.7-.6q-2.2-.3-4.6-.4-2-.1-3.7-.4h-1.1q-2 .2-4-.2-3-.4-6.1-.4l-3.1-.2h-1.4q-1.6 0-3.3-.5-1.2.4-2.5.2a32 32 0 0 0-5.5-.2h-4.3c-2 0-4-.5-6.2-.5-.9 0-1.7-.4-2.6 0-1-.4-1.9-.2-2.7-.4q-2.2-.2-4.5 0h-1.7c-1.2-.4-2.2-.1-3.6-.1a16 16 0 0 0-5.3-.6q-1.8 0-3.5-.3h-2l-3.8-.3q-1.1.5-2.8.1l-.5-.8.9-1q3-.4 6 0 2.6.5 5.2.3h1q1.4.6 2.9.4h3l4 .2 3 .2h3q2-.2 3.7.2l2.1.2q1.4 0 2.7.2c.7.1 1.6-.3 2.3.1q2.9 0 5.6.3c1.4-.4 2.7.3 4 .2l4 .2 1.9.2 2.7.1 2.5-.2 2.4.3.5.1c1.5-.1 3 .5 4.5.4l1 .1c1.5.5 3 .2 4.6.2q1.2 0 2.3.2 1.4.4 2.9.4h3.3q1.4 0 2.7.2h.6c2.4-.3 4.6.5 7 1m-262.7-9.6c-2.2-.1-4 .5-5.8-.2h-1l-2.5-.3q-3-.5-6.4-.5l-2.1-.1-6.4-.7H95c-1 0-2-.4-3 0l-.3-.1c-1.5-.6-3.2-.5-4.8-.7l-2.1-.2h-.4c-1.2.6-2.3 0-3.4-.3q-.7-.2-1.5-.2H77l-7.2-.6q-2.1 0-4.2-.3-3-.4-5.7-.4l-2.3-.4q-2.8-.4-5.6-.3-1.4 0-2.7-.3c-.8-.3-1.7-.1-2.6-.2q-3.7-.2-7.3-.8-2.6-.4-5-.3H34c-2.4-.8-5-.7-7.3-1l-4.1-.2-6.3-.6-6.2-.2q-1.3.1-2.5-.4l-.8-.2-2 .2q-2.4.2-4.3-1.2l-.5-.5q.5-1.3 1.8-1.4 1.8.7 3.7 1t3.9.2q1.8 0 3.5.2 1.4.2 2.7.1 1.2 0 2.4.3l1 .1a5 5 0 0 1 2.4.3q.7.2 1.6.1 1.7-.1 3.4.4 1.8.4 3.5.4 1.3 0 2.5.3h1.2q1.4 0 2.7.4h.6c2.8 0 5.7.7 8.6.5l1.9.2 4.8.5 1.2.1c1.3.5 2.7.3 4 .4l3 .3c2.8.4 5.6 1 8.5.7l2.3.3q1.5.3 3.1.3h2.3q3 .6 5.8.7 3 0 5.7.3 1.9 0 3.6.4c1.4-.3 2.7.3 4.1.2h.6c1.2.6 2.5.3 3.8.6q1.8.3 3.7.4l5.8.6q2.4.3 4.9 0 1.5.3 3.2.3 3.3.4 6.4.4l1.6-.2 1.1.6q0 1-.7 1.2-.6.4-1.3.3zM332 43.8q1 .6.6 1.1-.2 1-.8 1.8-1 1.6-2.3 3.1-1.6 1.5-2.8 3.5l-1.2 1.8-.9.6L321 61l-1.5 1.8a11 11 0 0 0-2 2.6q-.5 1.2-1.5 2l-.7 1q-.7 1.3-1.8 2.5-.4.3-.6.8l-1.3 1.7a12 12 0 0 0-2.8 4.1q0 .3-.3.5c-1.4 1-2 2.9-3.6 3.8q-.7.6-1.1 1.3-2 3.5-4.6 6.3l-2.9 3.2q-1.6 1.9-3 4.1-.5 1-1.2 1.7l-2.5 3-1.2 1.5-1.6 2q-.8 1.4-2 2.4-2.7 3-5.1 6.3-1.7 2.6-3.6 5l-3.3 4.5-1.4 1.4-4.6 6q-.9 1-1.6 2.2l-3.9 5-.6-.3.6-1.5 3-4.8 1.1-1.3.6-.8q.8-1.7 2-2.8l1.7-2 5.1-6.3 1.6-2.3q.7-1.2 1.7-2l2-2.5 3.8-5q.9-.9 1.5-2.2l.5-.7 3.5-4.5 2.7-3.5c1-1.5 2.4-2.7 3.2-4.4l1-.8 3.7-5q1.2-1.3 2.1-3 .5-.9 1.4-1.6l.2-.3c.9-1.7 2.4-3 3.5-4.4l2-2.2 1.7-2.6q2.6-3.1 4.8-6.6 1.1-1.5 2.5-3 2.2-2.1 3.5-4.9l.2-.3c1.7-1.6 2.5-3.8 4.4-5.2q.7-.6 1.2-1.6l1.7-2.8q.7-1 1.7-1.9zm-41.9 46.3 2-1.7 3-3.8q1.4-1.6 2.3-3.4.4-.8 1-1.5 1-1 1.7-2l3-4.2.5-.5c.8-2 2.4-3.3 3.6-4.9q.8-1.3 1.8-2.5l2-2.4q2.4-3.5 5.1-6.8c1.1-2 2.8-3.5 3.9-5.4l2.5-3.7 1.6-2.3 1.4-1.5q1.4-1.5 2.1-3.2.6-1.1 1.5-2 1.2-1.3 1.8-2.8 0-.3.3-.5c1-.6 1.2-1.8 2.2-2.4l.7-1q1-.3 1.2.5l.3 1.4-2 3q-2.1 1.5-3.5 4l-.9 1q-1 .6-1.3 1.8 0 .6-.4 1-.7 1.4-1.6 2.5-.3.5-.8.9-1.6 1.1-2.5 3l-.5.8q-1.3 1.3-2.3 2.8-.8 1.1-1.5 2.5l-1.4 1-1 2q-1.3 1-1.9 2.6 0 .4-.4.6c-1 .8-1.5 2-2.4 2.8q-.6.5-1 1.2t-1.3 1.5a6 6 0 0 1-1.4 2.5q-1.5 1.6-2.6 3.4-.9 1.5-2.2 2.8-3 2.7-4.9 6.2l-1.1 1.6a26 26 0 0 0-3 3.8l-.4.7c-1.8 2-3.1 4.5-5 6.5l-1 1.6-1 1.4q-2.3 2.6-4 5.3l-2 2.3q-1.5 2.1-3.4 4.2l-3 4-2.4 3.2-.6 1-.7.9q-1.8 2.2-3.4 4.5c-.8 1.1-1.4 2.5-2.6 3.3l-2.8 4.3-.5.9h-.9l-.2-.4c-.2-1 .6-1.7 1.1-2.4l.8-.9q1.1-1 1.7-2.3 0-.3.3-.5l2.2-3 3.2-3.9 1-1.4q1-1.8 2.4-3.5l2.1-2.8 1-1.2.5-.6c1.4-3 3.7-5.3 5.5-8q1.6-1.6 2.7-3.6l1.7-2 2.6-3.3 1.5-2.7zM14.7 183.8q-.7-.4-.5-1.2l.3-.2q.8-.4 1.5-.4l6.6 1 5.8.6q2.4.1 4.8.6h1.1q1.8 0 3.5.5 1.8.4 3.5.4 1.5 0 3 .3 3.8.8 8.2.8h.8c2 .7 4 .5 6.1.9l2.9.5h2.5l1.5.2a5 5 0 0 1 3 .6l5.8.5q1.4 0 2.7.3 1.4.4 2.7 0c2 .8 4.2.8 6.3 1q1.3 0 2.5.3 1.4.5 2.7.4 1-.1 2.1.2c.6.2 1.3 0 1.9.4l.7.2q3 .2 5.8 1l1 .1c2-.3 4 .4 5.9.6q3 .6 6.2.8 2 0 3.8.4l3.5.3q2.2-.1 4.3.5l2.4.3.5.8-.8.5-1.6-.1q-2.6 0-5-.6l-1.4-.2h-4.1l-1.5-.3-7.8-.9q-1.3-.1-2.7-.5l-1.5-.2q-2.6-.1-5-.6l-4.9-.3-2-.3q-2.5-.4-5.2-.6l-5.1-.9-1.4-.1h-.4c-1.5-.5-3-.4-4.6-.6l-5-.7q-1.7 0-3.5-.3l-3.4-.6c-2.3-.3-4.5-.8-6.5-.4l-3-.6c-2.8-.6-5.8-.5-8.6-1l-1.4-.1q-2.4 0-4.7-.6l-.7-.2c-2.7-.1-5.4-.7-8.2-.8l-4.2-.6q-1-.2-2.1-.2l-5.5-.5-3.7-.4m108.9-53.1h-.8c-1-.6-2.1-.8-2.8-1.8l-.3-.2q-2.3-1.5-4.1-3.6-1.3-1-2.7-1.8l-1-.9q-2.5-2.4-5.2-4.2-1.7-1.4-3.5-2.6l-2.8-2.3-4.4-3.3-.6-.5q-2.4-2.5-5.2-4.3l-3-2.4q-1-1-2.4-1.8l-1-.7c-.7-1-1.8-1.4-2.7-2.1l-1-.4q-1.2 0-2 .6.3 1.4 1.4 1.8 1.2.8 2 1.8l3 2.2q2.4 1.6 4.3 3.3l2.8 2.5 3.3 2 1.2 1.5.6.4q1.1.5 1.9 1.6.4.6 1.1 1 1.2.7 2 1.8c1.3.9 2.2 2.3 3.7 2.9q1.2.5 2 1.7a9 9 0 0 1 4 3.4h-.6l-6-4.2q-1.6-1.4-3.5-2.3l-1.4-1.4-1.4-1.1-.5-.3c-1.1-1.2-2.7-2-4-3l-.9-.8q-1.6-1-3-2.3a18 18 0 0 0-3.3-2.3l-4.2-3.1c-.5-.8-1.3-1-2-1.5l-2.1-1.7q-1.3-1.1-2.7-1.9-.6-.2-1-.6l-5.5-4.5-2-1.4-1-.7q-.2-.4.2-.7 1-.2 1.1.8l.6-.4 1.2.5 1.4.8 4.8 3.3q.6.5 1.6.2l.5-1.7-.4-1.2.5-.2h2l.9.9q.4.5 1 .9c1.6.9 2.8 2.3 4.3 3.3l1 1q.7.6 1.6 1 1.5 1 2.6 2 1.7 1.5 3.7 2.5 2.1 1.2 3.9 3l1.4 1.5q2.5 1.3 4.3 3.4l1.8 1.4q1.2.9 2 1.8 1.3 1.5 3 2.4l.9.7 4 4 .7.6c2.3 1.2 3.7 3.3 5.8 4.7l.8 1M228.8 28.3q-.3-1.5-.1-2.8t.2-2.5q-.1-1.8.8-3.4 0-.8-.2-1.5a6 6 0 0 1 0-3.5l.1-.5q.2-3 .8-6l-.1-1.2q-.4-1.3.2-2.4c-.5-1.2-1-2.4-.7-3.6l.4-.9c.4 2.7 1.5 4.6 2.2 6.5q0 1.5-.5 2.7l-.2.9q-.1 3.3-.8 6.6l-.6 3.6.2 1-.3 1-.2 2.2q.1 1.3-.7 2.4a6 6 0 0 1 .2 3.8v.2c.3 1.6-.2 3.1-.3 4.7q0 3.3-.6 6.8l-.5 4.2-.6 4.8-.2 2v.8q-.3 1.8-.2 3.6-.2 1.8-.6 3.5-.4 2.2-.3 4.4 0 1.1-.3 2.3-.4 1.8-.6 3.7l-.2 1.9-.5 5-.3 2.5-.2.8c.2 2.2-.4 4.3-.4 6.4l-.4 2q-.2 3-.7 6.1c-.2 1.7 0 3.4-.6 5 .2 1.1-.2 2.2-.3 3.3a23 23 0 0 1-.6 5l-.5 7q.1 2.3-.4 4.5l-.6.5-.5-.3q-.5-1-.4-2.1l-.2-2.5a13 13 0 0 0 1-4.5q0-1.6.4-3.3l.3-1.7v-1q.6-1.5.4-3.2.1-3.7.7-7.2l.1-2.4.6-6.8-.2-1.8c.9-1.7.9-3.6 1-5.4q.4-3.5.5-6.8l.4-2.8c.5-2 .3-4 .8-6l.1-1.5.4-3.3.3-3.3.4-4q0-1.5.3-3 .4-1.4.5-3t.4-3.5V42q-.2-2 .2-4.1l.4-2q.2-2.3.6-4.3c.1-1.2 0-2.4.7-3.3m50.6 275c.3 1 1.8 4.6 2.3 5.4q1.7 2.4 3 5l1.3 2.4 2.1 3.7.8 1.4 2.1 3.7 2 3.3q.9 1.2 1.5 2.6l.9 1.5 1.8 3q.8 1.6 2.1 3 .6.4.5 1.2l-.3.3q-1-.1-1.7-.8l-2.1-3.6-.9-1.7q-.5-1.5-1.5-2.7-1.5-1.4-2-3.6-1.4-1.3-2-3.2-1.1-2.3-2.6-4.6c-1-.7-1.3-1.7-2-2.6q-.7-1.9-2-3.6l-.3-1q-.1-.6-.7-1l-.6-1-2.5-3.8q-1.5-2-2.3-4.5-1.5-1.6-2.5-3.6l-.6-.8-1.3-2.4q-.4-1-1.2-2l-1.8-2.6q0-.7.6-1 1.3.8 2.2 2l2.2 3 1 1.1.6-1h.5q2.6 1.6 4.1 4.3 1.5 2.4 2.6 5l.8 1.1 1.1 1.8c2 2.9 3.2 6.2 5.3 8.9 1 2 2.5 3.7 3.2 5.8l.2.3c1.6 2.1 2.8 4.6 4.5 6.6l.5.8 2.3 3.4q1.1 1.5 1.9 3.2l.7 1.4q1.3 2.4 3.2 4.1l.5.5q.2 1-.6 1.1-1.3-.3-2-1.5-1.6-1.7-2.6-4-.6-1-1.5-2-.9-.6-1.3-1.9l-.6-1q-1.2-1.3-2-2.9-1-2.3-2.3-4.4l-1.8-2.5-1-1.3q-.7-1.6-1.8-3.2-.9-1.1-1.3-2.6-.4-1-1.2-1.7l-.7-1c-1-2-2.6-3.7-3.6-5.8l-.7-.9a6 6 0 0 1-1.9-3zq0-.5-.4-.4 0-.3-.2-.2l.3.1q0 .4.3.4m-2.3-3.5 1 2q.5-1.6-1-2M72.6 203l-4.7-.7-5.8-.4q-1.7 0-3.3-.3-3-.5-6-.4h-1.4c-2 .1-3.8-.4-5.6-.6l-1.2-.2-5.6-.4q-1.8 0-3.5-.3h-1.4l-4.7-.1q-3.4-.4-7-.4l-.7-.1q-1.6-.5-2.7 0l-2.3-.3q-2.1 0-3.6-1.2 0-.7.6-.7l2 .1q1.8.5 3.6 0h1l2.9.4q1.3.3 2.2 0l4.3.5h1q1.9-.6 3.6.2l2 .3q2.2 0 4.6.3h2.7q2.5 1 5.2.2l2.5.3q1 .3 1.7.3c1-.3 2 .2 3 .1l3 .2c1.2-.1 2.3.3 3.5.2H66l2 .2q2.2.6 4.8.4h.6c2.4.4 5 .3 7.5.8H83q2.2.6 5 .5l3 .2.5.1 5.9.5 2.3.3h3.5q1.4 0 2.7.3.7.2 1.6.2 2.6-.2 5.2.2 2.7 0 5.2-.4c.8 0 1.5.6 2.5.5q.5 0 1 .3t.6.6l-1.7 1q-1.7.1-3.3-.1l-3.3-.2q-4.7-.5-9.4-.7h-.6c-1-.5-2.1-.3-3.2-.4L96 204h-5.7c-1.3 0-2.6-.3-3.9 0l-.7-.1q-1.4-.4-2.7-.4-2 0-4-.3c-1.1-.3-2.4-.1-3.6-.4a5 5 0 0 0-2.8.2m39.8 69.6 1.5 1 .5-.2a5 5 0 0 1 2-1.2l1.2-.7 2-1.6q1-.7 2-1h.7q.6.9 0 1.3-1.2.6-2 1.3c-.8.9-2 1-2.7 2q-1 1.1-2.4 1.9l-2.8 1.9-2.2 1.5-2.5 1.6-3 2.1q-1.5 1.3-3.4 2.3-1.5.9-2.8 2l-.7.7-5 3.6-2.7 2q-1.5.4-2.9 2a10 10 0 0 1-4.8 3.1l-.7-.4q-.2-1.1.4-1.6l.3-.2q1.8-.7 3.4-2 1.3-1 2.7-1.7.3 0 .5-.3 1-1 2-1.6c.9-.3 1.3-1 2.1-1.4q1-.6 1.7-1.5.9-1 2.1-1.4l.6-.2q1.3-1 2.7-1.8 1.3-.9 2.7-2.2a7 7 0 0 0 2.5-1.6l4.2-3.3q.5-.8 0-1.7l-.5-.1q-3 1-5.7 3.2l-.7.6-6.7 4.2-1.7 1.2-9 6.1a11 11 0 0 1-2.8 1.8q-1.8 1-3.1 2.3-2.2 2-4.8 3.3-1 .6-2 .2 1.4-2 3.2-3 1.5-.8 3-2l5.9-4q2-1 3.8-2.3l3.4-2.3 2.4-1.6 3.1-2q3.3-2.7 6.8-4.6 1.3-.7 2.2-1.6 2.5-2.2 5.3-3.7.7-.3 1.3-.9 1-.7 2.1-1.2.5-.2.9-.6 1-1 2.2-1.8 3.5-2.5 7.1-4l.6-.2q0 .3.3.5a2 2 0 0 1-1.4 1.6c-1.7.6-3 1.8-4.5 2.7q-2.5 1.4-4.9 3.2zm134.1 60.1v1.6l.4 1.5a9 9 0 0 1 .9 3.3q0 1.4.5 2.7.8 2.4 1.4 5v.4c.8 1.1.7 2.4 1 3.6q.2 1.5.7 3 .7 2 1 4t1 4q.9 2.2 1 4.5v1l-1 .3-.4-.5-1.4-4.3-.4-2q0-1.3-.4-2.3l-.8-2q-.3-2-1.2-3.5l-.4-1.1c-.2-1.4-1-2.7-1-4.2l-.2-1.3-1-3q-.5.1-.5.6c.5 1.9.4 3.8 1.3 5.5q.4.8.3 1.7l-.3.6q-1-.1-1.1-.9-.6-1-.5-2a6 6 0 0 0-.6-2.7l-.3-.9q-.3-1.6-1.4-2.8l.3-4.9.5-.2 1.3 3.1q.3-1.7-.3-2.7l-.2-.4c-.1-1.7-1-3.2-1.2-5l-.1-1.9.2-.9c1.2-.1 1.5 1.1 2.4 1.4v-.5q-.1-1-.5-1.9-.8-2-.8-4l-.2-1.4q.5-.5.9 0t.8 1l1 2.4q.4 1.8 1.2 3.7l.1.7.8 2.8c.8 3 2 5.8 2.4 8.8q.4 2.1 1.2 4.2.7 2 1.2 4.3l1.4 4.2.8 2.8q.1 1-.6 1.6-1.1-.1-1.3-1.2l-1-4.4q-.2-1.5-1-3-.7-1.1-.9-2.5 0-.6-.3-1-.7-1.7-1.1-3.4l-1.4-4.9q-.2-.6-.7-1.2v-1.8q-.7-1-1-2.4.1-.7-.5-1.2l-.1-.7q-.4.6.1.7M128.2 27l.5-.3q1.7 1.1 2.4 3a33 33 0 0 0 3.4 6.1q.6 1 .8 2 .5 1.7 1.4 3.2t1.3 3.5q1.4 1.3 2 3l1.3 2.5a48 48 0 0 1 3 6.5l1 2q.8 1.1 1 2.6l.2.5 2.2 4.1.7 1.3q1 2.5 2.6 4.7.8 1.4 1.2 2.8.3 1.2 1 2.2t1.1 2.4q.6 1.9 1.6 3.6 1.6 2.6 2.8 5.3l1.6 3.6q1.4 2.7 2.4 5.5 0 .6.4 1.1 1.4 1.8 2 4l4.2 8.4q.3.3.4.8c0 1.1.9 1.9 1.2 2.9q.8 2.3 2.2 4.5.5.8.8 2 0 .7.6 1.3.7 1 .8 2t-.6 1-.9-.7l-1.6-4.2q-1.3-2.7-2.4-5.5-1.6-3.4-3.4-6.7l-1.5-3.2-1.4-2.8q-.7-1-1-2.2-.9-2.4-2-4.3c-1.6-2.8-2.7-5.8-4.3-8.6q0-.4-.3-.7-.9-1.2-1.3-2.5-1.6-3-2.9-6l-.8-1.3q-.9-1.2-1-2.5l-.2-.5q-1-1.6-1.6-3.4-1.6-2.7-2.8-5.5l-.7-1.8a6 6 0 0 1-1.4-2.3l-1.5-3q-1.3-2.2-2.2-4.5t-2.1-4.2q-1-1.6-1.6-3.4v-.1l-3.5-6.4-1.7-3.5q0-.5-.4-.9c-.8-.7-1-1.7-1.4-2.7l-.7-1.8zm262 84.2q-.2.5-.5.6l-2.3 1.4q-1 .8-2.2 1.3-3.2 1.5-6.2 3.3l-2.6 1.4-2.8 1.7-2.1 1-3.8 2-1.8.8-.9.3q-1.4 1-3 1.4-1.8.8-3.4 1.9l-1 .6c-3.4 1.4-6.4 3.4-9.8 4.8l-.6.4q-1.6 1.2-3.5 1.7l-1.6.8-5.6 2.8-.8.6q-1 .9-2.6 1.2l-1 .5q-1.2.4-2.1 1-2.2 1.6-4.6 2.5-1 1-2.4 1.3-1.1.7-2.2 1.1l-5.8 2.9-4.2 2-1.7.9-2.7 1.3q-1.9.7-3.4 1.8l-.5.4q-2.7 1.2-5.3 2.7l-6.5 3.3-2.2 1.2q-.7.5-1.2-.3.3-1 1.3-1.7l2-1 7.2-3.4q2.6-1.5 5.3-2.8l4.1-2.1 4-2 4.4-2.3 3.3-1.6q2.5-1 5-2.3l5-2.5 6-3 .6-.3q2.6-1.7 5.4-2.7l2.6-1.5q1.7-1 3.7-1.7 1.2-.4 2.2-1.2 1.4-1.2 3-1.8 1-.4 1.8-1.2 1.2-1.2 3-1.8a35 35 0 0 0 6.7-3.4l.9-.6c1.8-.5 3.3-1.7 5-2.5l4.6-2.6q1.6-.7 3.2-1.8 1-.7 2.3-1.1l5.6-2.7q2-1.2 4-1.2zm-99.8 140.5c0-.9 0-.9.5-1.5l1.8.3q2.4 1.3 4.2 2.5 2.2 1.5 4.6 2.6l2.2 1.6a48 48 0 0 0 6.3 3.5q4 2.8 8 5 2.8 2 5.5 3.4l.4.2c1 1.4 2.8 1.8 4.1 2.9l4 2.8.6.4c1.3.4 2.2 1.4 3.4 2q1 .4 1.8 1 1.3.6 2.3 1.5t2.3 1.4q3.8 2.4 7.3 5l1.4.6 2.4 1.3c2 1.2 3.7 2.8 5.9 3.8l4.3 2.3c1 .6 2 1.2 2.3 2.6l-1 .4q-1.6-.5-2.8-1.5l-.4-.2q-3.7-2-7.2-4.6l-1.2-.6q-.8-.4-1.5-1-1-1-2.3-1.7-1.3-1.1-2.7-1.9l-2.8-1.4q-2.3-1.3-4.4-2.9-.7-.5-1.6-.7-1.3-.4-2.4-1.2l-2.2-1.3-.4-.4q-1-.9-2.2-1.5-2.1-1.1-4-2.4-2.1-1.4-4.6-2.7l-4.1-2.5-.6-.3c-1.3-1.4-3.2-2.1-4.8-3.2l-7.5-4.6-4-2.5-.9-.6-4.5-3c-.8-.5-1.4-1.3-2.3-1.5l-2-.7-.4-.4q-.4 0-.8-.4M220.3 86.2q-1 1.2-.8 2.7l-.3 2.1-.4 4q.2 2.6-.3 5.1l-.2 4.9-.2 2-.2 2.6q.2 2.5-.4 5c.8 1.4.2 3 0 4.5q-.1.3-.5.6c-.8-.3-.7-1-1-1.7q.5-2.5.3-5.2v-.8q.6-2.2.4-4.6v-1.2c.4-1.4.2-3 .4-4.4q.2-1.5-.3-3.1.6-3 .8-6c0-1.5.5-3 .6-4.4l.5-6.2q.1-3 .5-6l.2-2.2q0-1.2.2-2.3l.2-1.5q-.1-2 .2-3.7l.2-1q.1-2.6.5-5.2c.4-2.3.3-4.7 1-7q.2-1 0-2 0-3.4.7-6.6l.1-1q-.1-2 .4-3.9v-5.3l.3-1.7.2-1.5q0-2.7.6-5.2a15 15 0 0 0 0-3.6 15 15 0 0 1 .3-3.6l.4-4 .2-5.3v-.8c.7-1.3.4-2.6.1-4l1.7-4 .3-.2c.6.3.6.3 1 1l-.1.5q-1 1.6-.8 3.5-.1 1.2-.5 2.6c.6 1.4 0 3-.2 4.5v1c.3 1.6-.3 3.3-.3 5l-.3 1.5q0 .8.3 1.4l-.8 1.8v1.3q.3 3-.4 6l-.5 3v3.1l-.7 3.6-.3 3.6q0 1.5-.3 3.1-.5 1.9.3 3.6l.1.8-.8 1.2.3 1.4-.7 2q.2 1-.1 2.2a9 9 0 0 0-.1 2.8q.2 2.1-.2 4.3-.7 3-.6 6.3 0 1-.3 2t-.3 2l-.4 5.7zM118.9 188.9l-.5.8c-1.2.3-2.3-.2-3.5-.4l-2.4-.4q-1.1 0-2.1-.4-2-.7-4.3-.6-1 0-2-.3-2.2-.7-4.5-.8c-1.1-.1-2.2-.6-3.4-.6l-3.3-.6-1.1-.1q-1.4 0-2.7-.4-1.6-.4-3.3-.3-1.2.1-2.3-.4-.8-.3-1.7-.3-4-.4-7.7-1.3l-3.5-.4q-2.3-.2-4.6-.8c-.6 0-1.2-.4-2-.2q-.7.2-1.5-.2a53 53 0 0 0-7.8-1.2l-4.1-.7q-1 .5-2.3 0-1.9-.1-3.8-.7l-3.8-.8-1.5-.1q-2.3.1-4.3-.5-.6-.2-.9-.6l.2-.4c1.1-.5 3-.7 4-.6h2q1.8 0 3.6.7l1 .1 3 .2c2.5.6 5.1.5 7.5 1.5l1 .1 1.2 1 1.1-.6 2.6.3 1 .2q2.7.1 5.2.7l3.5.5q3 .2 6.1 1 3.3.7 6.6.7l1 .1c1.2.7 2.6.6 4 1 .9.2 2 0 2.8.6l.3.1c2.2 0 4.2 1 6.4.9 1.4.4 2.8.3 4.2.7l2.1.3c1.5.3 3 .3 4.4.8h1.4q1-.1 2.1.4l1.2.2 4 .9q.5.2 1.4.9m23-108.5c0-1.4-1-2.3-1.5-3.4l-2.1-3.7q-.9-1.3-1.6-2.7-.8-1-1.3-2.2l-3-5.2a20 20 0 0 0-2.1-4l-1.7-3c-.8-.1-1.5.5-2.2 0q-.4-.6-.2-1.2l1.1-1c-.8-1.5-1.3-3.2-2.5-4.4q-.6-.7-1-1.5-.6-1.7-1.7-3.2l-3-4.9-.7-2q0-.3.6-1l.6.5 1.2 2q1.4 2.5 3.3 4.8.9 1 1.3 2.4 0 .6.4 1.3 2 1.5 2.5 4a7 7 0 0 0 1.2 2.6c1 1.3 1.4 2.8 2.7 3.8q.5.3.5.8.8 2.9 2.5 5.3l.8 1.5.5.8q1.3 1.8 2.1 3.7a10 10 0 0 0 2.6 3.8l.7 2.7q.3.9 1 1.6l1.6 2 .5 1.5a11 11 0 0 0 2 4.2c1 1.6 2.3 3.2 2.8 5.1l.3.9 2.1 3.3q.7.8 1 1.9.6 1.8 1.7 3.4 1 1.5 1.7 3.1 1.4 3 3.3 5.7a10 10 0 0 1 1.4 2.8q.5 1.5 1.5 2.4a13 13 0 0 0 3 5.7q.5.6.7 1.4.3 1 1 2l1.6 1.2q.2 1.5 1.1 2.4-.8 1-1.4.6a4 4 0 0 1-1.5-1.4l-2.7-4.5-1.4-2.8q-.6-1.2-1.4-2.3-.5-.7-.6-1.4-.5-1.5-1.3-2.8-1.4-2.2-2.3-4.5l-.9-2-1-1.7q-1-2.6-2.7-4.9l-1-1.9-1.9-3-2.3-4.2-2.3-4.5-.8-1.1q-.8-1-1.1-2-.4-1.6-1.7-2.8M129 156.9h1.3c0-1.2-.9-1.4-1.3-2l-1.6-1.8.4-.4q1.4 1.4 3 2.4t3.6 1.6l.8 1 1 .6q.3.5-.4.8c-1.6-.4-3-1.4-4.5-2-.7.1-.5 1-1.4 1.4q-1.1.3-2.5-.6l-4.5-2.7-1.6-1-5.6-3.7q-2.1-1.1-4.1-2.5-2.2-1.4-4.4-2.5-1-.8-2-1c-.9 0-1.4-.7-2.2-1-.8 0-1.5-.7-2.3-1l-2.9-1.7a41 41 0 0 1-6-3.5q-1-.8-2.2-1.3-3.5-1.7-6.5-3.9l-1.4-.7-3.6-1.9q-1-.5-1.8-1.2l-5-3q-.8-.6-1.9-1l-5.8-3.2-5-2.4q-2.3-1.2-4.3-2.8-.7-.6-1-1.4 0-.6.5-.8 1 0 2 .7c1.3.9 2.6 2 4.2 2.3q.3 0 .5.3 1.6 1.2 3.6 2l.6.4q3.4 2.3 6.9 4.2c2.3 1.2 4.5 2.8 7 3.8q2.6 1.2 4.8 3l1 .6c2.6 1 5 2.7 7.5 4l1.8 1 7.2 4.2 3.3 1.7 2.8 2.1 2.3 1.5 2.8 1.6q4.4 2.4 8.3 5.2 1.9 1 3.7 1.7a17 17 0 0 1 5 2.9m140.4-25.2q-.8-.2-.6-1 .4-1 1.3-2l4.3-5q1.9-2 3.3-4.3 1-1.5 2.2-2.7 2.5-2.4 4.4-5.2l1.2-1.4q.6-.6 1-1.4.1-.4.6-1l2.7-3.5 2.4-2.6.8-1q1.2-2 2.7-3.7 1.9-2 3.4-4.4l1.2-1.4 1.5-1.7q.6-.8 1.6-1.7c.7-1.6 2.1-2.8 3.3-4.3l.8-1q1.6-2.4 3.5-4.4 1.3-1.3 2.3-2.7l2.7-3.6q1.4-1.6 2.6-3.4.3-.5.8-.9 1.3-1.2 2.3-2.9a8 8 0 0 1 3-2.9l1-2.5 2.7-2q1 .4.5 1l-1.8 2.3-1.3 1.3-1.3 2.3q-.2.5-.6.7-1.4 1.1-2.1 2.5-1.1 1.7-2.4 3.3-1 1.6-2.3 2.9c-.5 1.1-1.6 2-2.3 2.9q-1.4 2.2-3.1 4c-.6 1.4-1.8 2.3-2.7 3.5q-1.4 1.5-2.6 3.4-.2.5-.6.8-1.6 1.4-3 3.3l-2.1 2.7q-1.1 1.1-2 2.4l-2 2.2-2.9 4-.7.8-2.3 2.7c-2.7 2.7-4.8 5.8-7.2 8.7l-4 4.8q-1.5 1.5-2.6 3.2l-.8 1c-1.6 2.1-3.6 3.9-5 6q-.8 1.1-1.8 1.9M123.8 193q-1 .8-1.8.3-1.2-.4-2.5-.4a23 23 0 0 1-6.3-1q-1.8-.4-3.7-.5l-5.7-.9q-3-.6-5.8-.8l-1.6-.2-6-.8-4.6-.5c-2.6-.4-5.2-.3-7.7-1h-2a7 7 0 0 0-2.6-.6q-1.6-.1-3.2-.5-1.5-.4-3.1-.3l-1-.2-1.1-.1c-1.4.2-2.7-.3-4-.6q-1.8-.4-3.7-.6l-2-.3q-1.3-.4-2.6-.2-.8 0-1.8-.3-2.6-.5-5.3-.8l-2.3-.3q-3.2-.7-6.5-1l-5.6-.9-1.5.1q-2.9.5-5.4-.3l-.5-.2-.1-.2v-.3q1.6-1 3.3-1.2a5 5 0 0 1 2.5.3q1.2.5 2.5.5 2.5 0 5 .7l3.7.4q2.3.1 4.6.7l1.5.1q2.1-.2 4 .4l1-.3.6.2q2 1 4.3 1 1.6 0 3.3.4 1 0 1.9.3l2.2.7 5 .2q1.5 0 2.9.7l1.5.4 3 .3c2 0 3.8.6 5.6.8l5.8.7q2.2.1 4.3.7 1 0 2 .3 1.5-.1 2.7.5l1 .1q2.7 0 5.4.8 2.3 0 4.6.7h.2c1.5-.3 2.8.2 4.2.5q3.4.7 6.7 1 2.2.2 4.2.8.3.2.5.6m213-102.2q-1.4 2.2-3.4 3.7-1.2.9-2.2 2.2-.1.4-.5.6c-2 1.2-3.2 3.1-4.8 4.8q-.4.6-1.1 1-.8.3-1.6 1l-.5 1.1-1.3.8-.3 1.1.6.1h.2l4.4-3.8 3.4-3q3-2.2 5.5-5 .8-.8 1.8-1.5a18 18 0 0 0 3.3-3l3.7-3.7 6.1-5.7q.7-.6 1.7-.9l.4.5a5 5 0 0 1-1.6 2.1l-.6 1.1q-1.2 1-2 1.9l-2.5 2-2.4 1.9q-1.8 1.3-3.3 2.8l-.4.3c-1.4.5-2.1 1.8-3 2.8q-.9 1-2 1.8-1.4.7-2.3 2 0 .3-.2.3-2 1.3-3.6 3.1l-1 1-.3.4c-1.8 1-3 2.7-4.8 3.7q-.4.2-.7.6a15 15 0 0 1-3.7 3.2l-.6.4-4 1.1-2.2 1.5-1.2.7-.3-.7q.6-1 1.5-2c2.6-1.8 4.6-4.2 6.9-6.3 1.1-1.7 2.9-2.8 4.2-4.3q.2-.3.6-.5 2-1.5 3.6-3.3l5.2-4.9 1-1q1.7-2 3.8-3.6l1.2-1.2q1.7-2 3.7-3.6l.6-.4a10 10 0 0 1 5-2.8h.2l.3.5c-.7 1.3-2 1.2-3.2 1.5q-.7 1-1.9 1.8c-.6 1.3-1.8 2.2-2.7 3.3-.8 1-1.5 2.2-2.7 2.5m24 25.2-.5 1.6q-1.9.7-3.4 2l-.7.2-1.9 1q-1.6 1.3-3.6 2.4-2.5 1.4-5 3.3-1.1.7-2.4 1.2l-1.3.5q-.7 1-2 1.5-2 .9-4 2.3l-.3 1.2q-1.4 1.1-3.2 1.8-2 .7-3.8 2l-5.9 3q-1.1.5-2.4.7c-.7 1-2 1.2-2.9 2.1q-2 .5-3.7 1.7a11 11 0 0 1-5 2q-.8 1.4-2.2 1.8l-7.6 3.5-1.2.8-1.2.5-1-1q.4-.6.9-1c1.2-.4 2-1.4 3.2-1.8 3-1.2 5.7-3 8.7-4.4l2.5-1.4 3.7-2 4.6-2.5c2.4-1.2 4.8-2.8 7.3-4l5-2.6 3.6-2.3 5-2.8 1.3-.7 3.6-2 2.2-1.2 4.3-2.5 1.6-1q1.9-.8 3.5-2c1-.9 2.4-1.3 3.6-2zm-36.9 85.6q2.4.4 4.8.4l4.5.2h2.5q1.2.1 2.3-.1h1.4q1.6.5 3.3.3 1.5.2 3.1.2c1.4-.1 2.8.2 4.2 0q1.5-.4 3 0c2.1 0 4.3.4 6.5 0q.8-.2 1.4 0c2 .4 3.9.2 5.8.2l9 .1 6.2.2q.9.1 2.1-.2l2 .3 3-.6q.8-.2 1.4 0 2 .3 4.3.2l1.1.2q.3 0 .5.4-2.3.6-4.5.6-1 0-2 .3h-1.6l-1 .5-2.6-.3q-1.5-.2-3.1 0h-3.1c-2 .5-4 .3-6 .3l-4.3-.1q-.9 0-1.7-.3h-5.9c-2-.5-3.9-.1-5.8-.4h-.8q-1.6.6-3.3.2h-4.5l-3-.1h-4.7q-3.7 0-7.5-.4l-2.4.2c-.6-.1-1.4-.4-2.2 0h-.8q-.7-.3-1.6-.1h-1.5l-2.3-.2-1.4-.1q-1.7-.4-3.5-.3h-8.8l-1.7.1q-1.1.3-2-.2-.4-.6-.1-1.3 1.5-.7 3.4-.3l4.8.2h10.4q1.4.1 2.7-.1M218.7 20.1q.3-.9 1-1.4l.4.2q.5 1.3.1 2.5-.5 1.5 0 3-.5 2.6-.3 5l-.2 2.8c-.2 1.3-.6 2.6-.3 4v.8q-.2 1.7-.1 3.5l-.2 3.5-.4 4.2a86 86 0 0 0-.5 8.4q0 1.3-.3 2.5v.6q-.1 3-.6 6-.2 1.8-.2 3.8c0 .8-.3 1.5 0 2.3l-.2 1-.2 1c.2 1.6-.3 3.2-.3 4.8v1a17 17 0 0 0-.4 3.8q0 4.8-.7 9.4l-.2 4.3q0 2.4-.4 5v2.3c-.5 1.5-.3 3-.3 4.4v3.8q.1.9-.6 1.8-.7-.4-1-1.3-.2-2 0-3.9.1-1.1-.4-2.3.8-1.2.9-2.7.4-2.8.3-5.6v-1q.4-1.6.4-3.3l.2-4.6q.3-2.1.1-4.1l.3-3.3q.4-2.2.5-4.3-.1-4.5.4-9v-1.3l.6-7v-.4c-.3-1.5.2-3 .1-4.4q0-1.3.3-2.5l.2-1v-4l.6-6.7.2-2.7.3-3.5v-2.7q.6-2.4.4-5l.2-1.2.1-.7c-.5-1.1 0-2.2 0-3.3zm16.3-.5q.5.3.5.8.1 2.1-.5 4.2-.5 1.4-.5 2.9-.4 2-.3 4l-.4 2.7-.1 2q.1 1.6-.4 3.4-.2.7-.2 1.5 0 1.8-.5 3.2l.5 2.4q.2 1.3-.4 2.7a10 10 0 0 0-.7 4.7l-.2 1.8q-.6 2.2-.7 4.6t-.5 4.4l-.7 6.6q0 1-.3 1.7t-.7 1.5c.2 1.4-.4 3 0 4.4l-.2.6-.9 4.5c-.2 1.6-.8 3.2-.5 4.8q0 1.8-.5 3.5l-.3 1.5a21 21 0 0 1-1 5.6q.2 2.2-.3 4.4l-.7 4.8-.4 3.7-.8 6q0 .6-.5 1.1-.6 0-.6-.4l.1-5 .6-2q-.5-1.6 0-3.4l.6-2 .2-1c0-2.7.9-5.4 1-8.1 0-1.8.5-3.6.3-5.4l.2-1.4q.5-1.8.6-3.8l.3-3.3.8-5.8.5-3.3q.3-1.6.3-3.3l.7-4 .3-2.1.6-4 .3-2q-.1-1.7.4-3.5c0-1.8.7-3.7.5-5.6q0-.4.2-.7.5-2.2.8-4.6c.2-1.5 0-3 .5-4.4l.2-1c-.4-1.6.2-3.2.5-4.7l.1-1q-.1-1.4.3-2.7.6-2.2.5-4.6 0-1.3.3-2.5.6-1.7.5-3.3-.2-.7.6-1m-45.2 359c-.5-1-.1-2 .3-3l-.2-1.6 1-4.9.1-5.8.2-1.3 1.1-6.5v-.6q.2-2.9.8-5.6l.1-.8.2-3-.3-3q.7-1.2.9-2.7l.5-4.2.7-5.8q0-1 .4-2.1c.4-1.7.3-3.5.7-5.2q.4-2.2.4-4.5l.1-1.3q.5-2 .3-3.7l.2-1 .3-2.3.3-1.9.3-3.9v-3.7l1-1.8v-3.1q-.1-1.4.6-2.6c.9.1 1 1 1.3 1.6-.4 1-.2 2.2-1.2 3l.2 1.8q.3 1.3.1 2.5l-.2 2.3q-.1 3-.7 6l-.1 1.2q0 2-.6 4-.5 2.7-.6 5.4v1q-.6 2.3-.5 4.4 0 1.6-.4 3.1l-.6 5.6q-.4 2 0 3.7l-.1 1.4-.4 1.9-.7 3.8-.4 3.7a26 26 0 0 1-.8 5.4c.2 2-.4 4-.8 6.1v.6c.1 2.8-.8 5.5-1 8.3l-.3 2.2a27 27 0 0 1-1 5.6q-.2 1-1.2 1.3m-42.1-90.3.4.7q-.2 1-1 1.9-1.6 1.8-3 3.8c-.4.8-1.3 1.1-1.5 2l-3.4 4.8q-1.7 2-3 4.3-1.3 1.6-2.2 3.4l-1 1.5c-1.1.9-1.7 2.3-2.8 3.2q-.4.2-.4.6c-.4 1-1.4 1.8-1.7 2.9l-.4.4q-1 1-1.7 2-1.4 2.4-3 4.5l-1 1.4-3.3 4.8q-1.4 2.4-3.2 4.4c-1.2 2-2.8 3.9-3.5 6.3q-.2.9-1 1.6-1.7 1.9-2.7 4l-1 1.7a26 26 0 0 1-3.1 4.2l-2.8 3.3-.7 1.3-.6.2-.2-.4c0-.7.5-3 .8-3.4q1.3-2.2 2.8-4.2 1.4-1.7 2.6-3.6l3.2-4.7 3.3-4.6q.9-1 1-2a3 3 0 0 1 1.3-2c1.5-1 2-2.7 3.1-4.6q1.6-1.4 2.8-3.8l.9-1.2c.5-1 1.4-1.7 1.8-2.8l.4-.4q2-2.4 3.7-5l1.4-1.4q1.3-2.3 2.7-4.2.8-1.3 2-2.4 1-1.6 2-2.8 1-1.3 1.8-2.8.7-1.2 1.8-2 .6-.6.9-1.3a7 7 0 0 1 1.7-2.4q.3-.2.5-.6l1.5-2.4 1.8-2q.8-1.4 2-2.1m-98.7-15q-1.3-.2-1.1-1.1 0-.2.2-.3l2.6-1.7 2-.8 3.6-1.4 1.2-.6 4-1.6 2.1-1q1.6-.9 3.3-1.2 2.9-.8 5.5-2 .3 0 .5-.3c2.6-.5 4.8-2 7.3-2.8q1.6-1 3.4-1.3 1.5-.5 3-1.3.7-.6 1.8-.3c1-1 2.5-1 3.2-1.8q1.6-.8 2.8-1.1c2.1-.7 4-2 6.1-2.7a22 22 0 0 0 5.1-2.3l4.4-1.7 6.2-2.4 3.3-1.2 1-.4q1-.3 1.6-.7a14 14 0 0 1 4.3-2.3l1-.5q.9.1 1 .7v.3q-1.3 1-2.7 1.7-2.8 1.5-5.7 2.5l-3.3 1.2c-.8.3-1.8.4-2.4 1.1l-.4.2c-1.3.2-2.4 1-3.6 1.4q-2.3.7-4.5 1.8-1.6.8-3.2 1.3l-.8.3q-1.5.9-3.1 1.5l-3.3 1.3q-2 .7-3.7 1.7-2 1.1-4.3 1.8-3.6 1.2-6.8 2.9l-1.1.4q-4 1.3-7.8 3.3c-2 .5-3.6 1.7-5.5 2.3l-1.3.6c-1 .2-1.5 1-2.6 1.2q-1.4.1-2.8.9l-2.7 1c-1.7 1-3.6 1.4-5.3 2.4q-1.2.6-2.5 1m-19.8-69.8 1-.5 2 .1q1.1.2 2.2 0l1.2-.1c2 .3 4.1 0 6.2.5q.8.3 1.7.1h7.2c1.6-.6 3.3 0 4.9.1l4.8.6.5.1c1.4-.4 2.7.1 4.1 0h3.9l2.5.2 6 .3h.5c1.5.5 3 .1 4.6 0 2.1.7 4.4 0 6.5.7h2.4q4 .6 8 .5l2 .1 5 .3 6.4-.1 2.3-.2q1 .3 1.6 1-.1.7-.8.7-1.2.3-2.3 0a22 22 0 0 0-7.2-.3h-8.6q-2.6-.3-5.2-.3l-1.2.1h-.6c-1.8-.4-3.8.1-5.6-.5h-.4l-8-.1q-1.4 0-2.7-.2-2.4-.3-4.9-.2l-3.7-.3-5.4-.1-2.2-.2h-3q-1.2.3-2.1-.2t-2.1-.3l-5 .2h-.3c-3.1-.5-6.2-.2-9.3-.2l-1.6-.2h-1.1q-.5 0-.8-.2zM276.6 105q-.7-.3-.3-.8.4-1.2 1.1-2.3l3-4 .3-.6 4-5.5 4.2-5.6.6-1 .4-.9 2.9-3.9 3-4q1.2-1.6 2.6-3l1-1.4.8-1.1q1.1-1.4 2-2.9t2.1-2.7q1.1-1 1.8-2.3.7-1 1.5-1.8.8-.6 1.2-1.6a9 9 0 0 1 2.5-3.6q.5-.4.8-1.1l1.6-2.4q1-1.3 1.7-2.7T317 47c1-1.1 1.5-2.6 2.5-3.7l.2-.1q1.2-2.4 3.5-4.4l1.4-.6.2.6-2.8 4a14 14 0 0 0-3 4.8q-.2.8-1.1 1.5-.5 1.6-1.7 3l-1.5 2-3.6 4.7q-.7.8-1.2 1.7-.7 1.6-2.1 2.8-.7 2.6-2.9 4.3l-2.2 2-.3 1.3c-.8.8-1.3 2-2.3 2.6-.8 1.8-2.4 3.1-3.2 4.9q-.6 1.2-1.6 2t-1.7 2l-2.2 3-5.5 7.1-2.7 3.8-1.2 2-1.3 1.5-1.2 1.5-2.6 3.5zm-62.8 281.6-.4-1.7q-.2-.7 0-1.6t0-2l.1-2.8q.1-1-.1-2-.4-1.4 0-2.8c-.3-1.3-.7-2.6-.3-4v-1.8a11 11 0 0 1 .2-3.8l.2-1.5q0-3.2-.2-6.2-.1-1.4.1-3.3-.4-1 0-2.7.2-.6.1-1.3l-.2-3.3.1-2.9q-.2-1.7.1-3.5c-.5-1.4.4-3-.2-4.4v-.6q.4-3.3.1-6.6v-2.7a7 7 0 0 1 0-3.4v-2.1q-.2-.8-.1-1.4c.4-1.6-.1-3.2 0-4.8q0-2.4-.2-4.7-.5-3.5-.3-7l-.3-2.3q.1-.9 1.1-1.6c1.1.6 1.3 1.7 1.6 2.8a9 9 0 0 0-.4 3.8q-.2 3.6.2 7v.2l-.2 4-.1 3.6c-.5 1.6-.2 3.2 0 4.8q.2.6 0 1c-.3 1 0 2 0 3.1v1l-.2.6v3l.1 2.3q.2 1 0 2l-.1 1.3c.4 2.3.2 4.5.3 6.8v8.2c-.2 1 .4 1.9.1 2.9q-.2 1.4-.1 2.9v6.4q.3 1.5.3 2.8v3.8l.3 2.2v6.5q-.2.8 0 1.6c.5 1.5 0 3 0 4.6q0 1.2-.3 2.3-.1.5-.4.8l-.5-.2c-.4-1-.9-2.1-.4-3.3M141.5 331c-1.2 1-1.6 2.5-2.3 3.9l-2.5 4.4-.6 1q-1.2 2.6-2.9 4.8l-.6 1.2q-1.2 2.8-2.7 5.2l-3.3 5.8-1.5 2.6-1.8.9q-.7-.3-.4-.8c.9-1.7 1.5-3.4 3-4.8q1-1.2 1.4-2.7l1-1.9.5-.6q1.8-3.3 4-6.7l.3-.7c.1-1.1.9-1.9 1.4-2.8l2.3-3.8 1.3-2.4q1.5-3 3.4-5.9l.4-.9q.5-1.2 1.4-2.3t1.2-2q.5-1.5 1.3-2.6l1.6-2.7 1.7-3 3.5-6q1.5-2.4 2.8-5 .6-1.4 1.4-2.6l3.2-5.3q.9-1.3 1.5-2.6l1.1-2 2.1-4.4 2.4-4.4q1.1.2 1 .8v.6l-1.3 3-3.4 6q-.3.9-1 1.7l-1.5 3q-.5 1.4-1.5 2.3-.3.3-.3.5c-.7 1.6-1.8 3-2.5 4.6l-1.8 2.9-4 7q-1.3 2.1-2.1 4.2-.6 1.3-1.5 2.3-1.2 1.5-1.8 3.2l-.9 1.3a10 10 0 0 0-1.7 3zm-65.8-39.6-2.2 1.5c-4 2-7.5 4.6-11.4 6.7l-1.2-.3v-.6l1-.9q1.8-.7 3.2-2l2.6-1.6 6.5-4.1.4-.7h.8l2.2-1.6q1.5-.9 3.1-1.6l.6-.2 2.6-1.5 3-2 2.3-1.4 3.3-2.1 2.5-1.6c1.1-.7 2.5-1 3.5-2q1.4-.6 2.3-1.7l.7-.5c3.4-1.7 6.4-4.1 9.7-6q3.9-2.3 7.6-4.8l6.2-3.7.7-.4q1-1.3 2.6-1.6l.7-1q.9-.1 1 .5.4 1-.5 1.7l-1.3 1q-1.3.3-2.5 1.4l-.7.3q-1.2.1-1.9.8l-4 2.8a5 5 0 0 1-2.1 1.3l-1.5.6q-2 2.2-4.9 3.4-1.6.8-3 2-2.8 2-5.7 3.5-3 1.8-5.7 3.7-2.2 1.7-4.6 2.9l-.4.2c-1.6 1.3-3.5 2.1-5.1 3.5l-1.2.7a10 10 0 0 0-3 2q-1.9 1.4-3.9 2.4-1 .9-2.3 1m72.9-9.9.4.5-.9 1.5-.6 1.7c-1.3.8-1.8 2.3-2.7 3.5q-1.1 1.7-2.7 3.3l-1.8 2.2-10.7 14.1q-2 2.2-3.7 4.8l-.4.6q-1.9 1.8-3.2 4l-2.2 2.7q-1.2 1.6-2 3.5-.5 1-1.4 1.8-1.2 1-2 2.5-.9 1.9-2.2 3.6-1.6 2.2-3.4 4.3l-2.3 3.4q-1.1 1.9-2.8 3.5l-.4.2q-.6 0-.8-.6c0-1.1.9-2 1.1-2.8l2.3-2.1v-1.2c.8-.8 2.3-3 2.8-4l1-1.6 1.6-2 1.4-1.6 1.1-1.6 1-1.2 2-2.9 3.6-4.8.7-.7q1.6-2.4 3.5-4.7l2.7-3.8q1-1.3 2.3-2.4l.3-.2c.8-1.5 2.2-2.6 3-4q1.6-2.9 3.8-5l1.6-2.2 1.6-2q.5-.4.9-1c1.2-2.3 3-4.3 4.5-6.4q.8-.7 1.3-1.7t1.7-1.2M173.2 110a11 11 0 0 0-1.2-5l-.2-.4c-.7-2.7-2.3-5-3-7.6q-.2-.6-.6-1c-.8-1.4-1.4-3.3-1.7-4.6l-1.7-3.5-2.5-6-2.4-6.5-.1-.3c-1-1.5-1.2-3.3-2.1-4.8q-.8-1-1-2.4 0-.6-.4-1.2l-2-4.3q-1.7-4.5-4-8.6l-.1-.4c-.7-2.8-2.3-5.2-3.5-7.8l-.8-2.2q-.3-.5.2-1.5l.8.4q1.3 1 1.6 2.6l.8 1.8q.8 1.3 1.3 2.8.2 1 .9 1.7 1 1.5 1.3 3.2v.6l.9 1.1a6 6 0 0 1 1.2 2.6q.5 1.9 1.5 3.4l.7 1.4q1.4 2.8 2.4 5.7.9 2.3 1.6 4.8.4 1.8 1.4 3.4l.7 1.4c1.2 3.4 3 6.7 4 10.2q1.3 3 2.2 6l2 4.8 2.1 4.8.6 1.3q.7 2.4 1.8 4.7.5 1 .5 2 0 .4-.3.8-1.5-.5-1.7-1.7-.4-1-1.2-1.8m158.2 112.2q-1.5.5-3 0l-4.2-.8h-.8q-.8.2-1.5-.1-2.4-.8-4.8-1l-.4-.1-4.8-.5q-2.7 0-5.2-.6l-1.4-.2q-1-.1-1.7-.5l-1.3-.4q-.2 0-.6-.4c.8-.8 1.3 0 1.5 0q2 0 3.6-.3 1 0 2 .3 2.6 1 5.3.8 1.5-.1 2.9.3 2.5.2 5 .8h1.5c2.5.8 5.2.4 7.6 1.5l1 .2q1.8 0 3.5.4c2.2.5 4.5.5 6.7 1.1 1.5 0 3 .6 4.4.6l1.2.2q1.2.4 2.5.4h.4q3 1 6 1.4l1.2.2q1.5 0 3 .4l.6.2q2.3 0 4.6.9h1q2.7-.1 5.3 1 1.6.6 3.6.7l2.6.2.8-.2q.5.3.2.6-.3.4-.6.5-1.4.3-2.7.2l-5.3-.4-1.5-.2q-2.7-.7-5.5-1l-3.7-.6q-1.7-.3-3.7-1H354l-1.5-.3-4.8-1-5.8-.7h-.2c-2.5-1-5.2-1-7.8-1.6q-1.2-.3-2.4-1m-23.3-21.5-1-.8c1-1.3 2.2-.9 3.3-.6l1.2-.4q1.4-.5 2.9-.2.6.3 1.3.1c1.7-.4 3.4-.2 5-.3q1.2 0 2.4-.3h.5l5-.1h34.6q3-.1 5.7.2c1.5-.3 3.1-.1 4.7-.2h4.8q1.7 0 3.3-.3t3.2 0c.8.1 1.5-.2 2.3 0h3.3l.7.9-.4.6h-3.1l-2.3.3q-1.2.1-2.8-.1c-1.9.5-4.1 0-6.3.3l-2.4-.3-4.4.2c-3-.2-6 .3-9.1-.2-.7.4-1.6.2-2.5.2q-1.2 0-2.3.3-.9.3-1.8 0-1.2-.4-2.5-.3h-4.3q-1.7-.2-3.2.2-1.3-.6-2.6 0-.9.2-1.9.2l-4-.2h-1l-1 .1q-4.2-.5-8.3 0H324a10 10 0 0 0-4 0h-2c-1.9 0-3.7-.2-5.6.4l-2 .2zm-135-90.6q.3.9-.2 2l-.6-.4q-1-1.5-1.7-3l-2.1-4.9c-.7-1.4-1-3-2-4.2a21 21 0 0 0-1.7-4.2q-2-4.4-4.3-8.7-1-2-1.8-4.2l-.7-1.8-1.2-2.7q-.1-.9-.8-1.6-.8-1-1.2-2.4c-.7-1.5-1-3.2-2.1-4.5l-1-1.3.2-1.1q-1.8-3.4-3.3-7l-2.1-4q-.2 0-.3-.4c-.6-1.9-1.7-3.6-2.3-5.4q-1-2.7-2.5-5.3l-1.1-2.2-2-3.6q-.9-1.2-1-2.7-.2-1.4-.8-2.4-.2-.4 0-.7.8.1 1.1.8 1.8 2.5 2.9 5.2 1.5 4 3.4 7.9l1.4 2.8.2.3c1.6 1.8 2 4.2 3.2 6.2v.2q.9 3 2.7 5.6c.3 1.5 1.6 2.7 1.9 4.2q.2.6.6 1 1.2 1.5 1.7 3.5.2.9.7 1.8 1.1 3.1 2.7 6.2l1.2 2.7q1.1 1.6 1.9 3.6 1.4 2.8 2.4 5.8.2.8.7 1.5 2 4.5 3.7 9l2.1 4.5zM84.4 307q1.8-2.1 4-3.6l.8-.5q2.6-2.4 5.5-4.4l2.4-2 6.1-5.2 1.6-1.4q1.8-1.1 3.3-2.7l1-.8q1.5-.8 2.4-2l2-1 .8.4v.5a8 8 0 0 1-4 4.5q-1.4.6-2.4 1.7l-1.5 1.2-.6.5q-1.4 1.8-3.3 3l-1.1.7q-1.2 1.1-2 1.5c-2.2 2-4 3.8-6.4 5q-1 1.7-2.8 2.7l-1.4 1q-2 2-4.1 3.6l-.2.2q-2.2 2.3-4.8 4.2l-3.4 2.6-1.8 1.5c-.7.6-1.4 1.4-2.5 1.2q-.6-.6-.2-1.3.4-1.4 1.6-2.3l3.7-3q2.5-2 5-4.3a5 5 0 0 1 2.3-1.6M314.6 83.6q-.4 1-1 1.7l-2.9 2.6-.6.7c-.3 1-1.1 1.8-1.6 2.7q-.4 1-1.4 1.6-.5.2-.8.8-1.4 1.9-3 3.5-.9.8-1.3 1.8l-1.4 1.8-2.4 2.4q-1.2 1.2-2.2 2.7-.5.8-1.3 1.4l-.4.4q-1.7 2.4-3.8 4.5-1.7 1.8-3.2 3.9c-.8 1-1.4 2.3-2.7 3l-1.5 2q-1.5 2-3.1 3.7-.7.7-1 1.6a2 2 0 0 1-.8 1q-1.4 1-2.3 2.3-1 1.3-2.3 2.3-.7.4-1 1.2-.7.8-1.5 1.2c.2-1.2.4-1.7 1-2.5q1.2-1.3 2.2-2.9l1.4-1.6a7 7 0 0 0 2-2.4q.3-1.1 1.3-1.9 1.7-1.4 3-3.3l.7-1q2-1.7 3.6-3.8l2.4-3 4-4.9 1-1.2.5-.8c1.7-1.3 2.8-3 4.2-4.5q1-.8 1.5-2l.5-.6 4-4.2.8-1q1.8-2.9 4.2-5.1l1.3-1.5 1.4-1.6q1-.9 1.7-2.1.3-.7.9-1.3l3.5-3.9q1-1.6 2.6-2.9c.7-1.5 2.2-2.5 3-4q.4-.8 1.3-1.4l.6-.3q.7.6.4 1.1l-.7 1.1-1.3 1q-1 1.6-2.6 3l-1 1.2q-.5 1.1-1.3 1.9t-1.3 1.7l-.7 1.2q-.8 1.9-2.6 2.7m-99 222.4c.3-.6.4-1.4 1.3-1.7l.5.5q.5 1.4.5 2.9c-.2 2.5.2 5-.2 7.6v.6q.3 2 .3 4v4c0 2-.3 4.2.2 6.4l-.1 1c-.1 1.6-.4 3.3.2 5-.2 1.2.1 2.4 0 3.6 0 3.3-.2 6.5.3 9.8q.3 2 0 4l.2 6v.9c-.2 1 .2 2 .3 3l.3 1.8c.2 1-.4 2.1 0 3.3q.3 1.5.3 3l-.2 4q0 .7-1 .8a5 5 0 0 1-1-2v-.5q.3-2.7 0-5.4v-4.8q0-1.8-.3-3.5l-.1-4-.4-9.5-.3-4q-.2-3 0-5.9l-.2-10q-.2-4.4-.2-8.9v-5.2l-.2-1.8c-.3-1.7 0-3.3-.2-5M84.1 156.9q-1-.8-2-1.1-2.7-.7-5.2-1.9-2-1-4.1-1.7l-5.8-2.4-4.5-1.7-1.2-.6q-.6-.4-1.3-.5l-2.3-.9c-2-.5-3.5-1.7-5.5-2.1l-.5-.3-4.5-1.8-4.7-2-2.9-1-2.3-1-3-1q-.3-.1-.8-1 1.3-.9 2.8-.3l4.4 1.6 4.1 1.7 2.3 1 1 .1 2.9 1.1q1 .6 2.3 1c.8 0 1.3.7 2.1.8q.8.3 1.4.8 1 .7 2.5 1 2.4.1 4 1.6c2 .7 3.7 1.8 5.7 2l3 .4.5.1.5 1.2q1.1.9 2.5.7c1 1 2.5 1.2 3.8 1.7q2.7 1.2 5.3 2 1.5.7 3.2 1l2.3 1q1.5 1 3.1 1.6 1 .3 1.6 1-.2.4-.5.4-1.8.2-3.6-.6l-1.4-.7-1.6-.5q-.8 0-1.5-.3-1-.4-2-.4m-38-53.4q.3 0 .5-.3.8 0 1.3.3 1.9 1.1 3.6 2.4 1 .8 2 1l.9.6q2.8 2 5.7 3.7l2.2 1q.7.1 1.2.6.8.8 2 1.1l.6.8q3.4 1.3 6 3.7l.8.3c1.2.6 2.2 1.6 3.5 2a12 12 0 0 1 3.3 2.2l1.3.8q1.5.5 2.6 1.5 1 .8 2.3.9 1.6 1.5 3.6 2.6 2.7 1.5 5.3 3.4l.7.4q2.3 1.3 4.4 3l1.8.6c.5 1 1.7 1.3 2.4 2.2q-.8.3-1.4-.1-1.1-.9-2.2-1.3-.4 0-.8-.3-1.6-.1-2.7-1.3l-.5-.4c-2-.7-3.9-2-5.8-3.1l-4.9-2.9q-2-1.1-3.8-2.7l-.7-.4c-2.1-.9-4-2.3-6.1-3.3q-2.7-1.4-5-3-2.8-2.1-5.8-3.6l-1.2-.7-2.8-1.7-6.4-3.8-.6-.2c-2-.7-3.6-2.1-5.3-3.2a5 5 0 0 1-1.8-2q-.2-.3-.2-.8m253.2 212.4c-.1-1.3-1-2-1.8-2.9l-.8-.6-.3-1.6q.3-.4.7-.3 1.9.8 3.3 2.4 1.7 1.6 2.8 3.7l.5.6q1.7 1.9 2.9 4.2l.6 1q1.4 1.3 2.3 2.8l.4.5c2.3 2.4 4 5.2 6 7.7l2.3 3.1 2.3 3.4q1.7 2.5 4 4.8l1.4 2.3q.4.7 1 1.2l1.9 2.4 3.2 4.4.7 1.4-.2.6-.6-.1-1.3-.9q-1.1-.6-1.9-1.6l-4.1-5.2q-1.9-3.2-4.3-6-1-1.1-1.8-2.6l-.5-.8q-1.9-2.5-4-4.7a4 4 0 0 1-1.3-2.6l-4.5-5.2-.7-1q-.8-1.3-2-2.6-.7-.8-1.2-1.9a38 38 0 0 0-4.3-5.3l-.3-.2zm-112.3 58.7-1.6-2.2c0-.7.6-.8.8-1.4q-.4-2.4.8-4.6l.1-1.6-.2-1.4c.8-2 1.5-4 1-6q.1-1.2.4-2.2.2-1 .2-2.1 0-2.1.4-4l.3-2.6.6-2.4v-.4q0-2.6.6-4.8.4-1.5.3-3.1-.1-1.5.4-3 .2-.9 0-1.6 1-3 1.1-5.8 0-1.1.5-2.3l.3-1.3q0-2.4.6-4.8c.3-2 .2-4 .6-6v-1q0-2.5.2-4.9 0-2 .8-4l1-.4.8 1.3c0 .8-.4 1.4 0 2.2l-.2 1.1q-.5 1.8-.5 3.5v.7q-.5 2.3-.7 4.5l-.6 3-.3 2.6-.4 3.4-.8 5.6q0 .8-.3 1.4.2 2.4-.3 4.8l-.9 5.3-.5 4.1-.8 4.8-.2 1q-.1 2.7-.8 5.4v1.3q0 1.3-.4 2.5v.6q-.2 2.4-.6 4.6-.3 1.8-.2 3.5.1 1.2-.4 2.3-.4.8-.4 1.7l-.2 2zm74.5-258.1-1 .2q0-.4-.4-.7 0-.3.2-.5.4-1.2 1.4-2l.5-.6 2-2.7 1.3-2.1q1-1.7 2.3-3.4 1.4-2.1 3-4l.5-1q.7-1.7 2-3.2.3-.1.4-.4c1.5-2.7 3.5-5 5.1-7.7l2.2-3.4 1.4-1.9 1.6-2.4q1-1.8 2.3-3.4l1.3-2q1.7-3 3.8-5.8l3-4.4.7-1.1.4-.6c.4-1.5 1.5-2.7 2-4q.4-1 1.3-1.7l.7-1.2.7-1.7 1.5-1.6h1.7c-.8 2.5-2.4 4.4-4 6.5l-.2 1.4-1.6 1q-.4 1.2-1.3 2.3-.6.7-1 1.9-.2 1-.8 2-1.4 1.1-1.9 2.8a7 7 0 0 1-2.4 3.5l-1.4 1.3-.2 1.8-4.1 5.5-1.1 1.8a14 14 0 0 1-3.6 4.5q-.2 1.3-1.4 2.4l-1.9 2.9q-1.1 2-2.5 3.7-2 2.5-3.7 5.2l-2 2.9q-1.2 1.3-2 3c-1 1-1.3 2.4-2.4 3.4q-1.1 1-1.7 2.3zm35.6 134.1q2.2.6 4.1 1.8l5.3 3c1.1.6 2.1 1.5 3.4 1.8h.2c1.2 1.4 2.8 1.8 4.3 2.7l2.5 1.4q1.3.7 2.4 1.7 1.5.9 2.5 1.1 1.7 1.4 3.1 2.3l4 2.2.2.2q3 2.4 6.6 4.1c.8.4 1.5 1.1 2.5 1.1q.3 0 .5.3 3.5 2.6 7.3 4.4l1.5.9 2 1.1 2.1 1a8 8 0 0 1 4.6 4q-.3.6-.7.4-1.5-.5-2.8-1.3l-5.4-3.3q-2-1.4-4.3-2.3-2.4-1.3-4.4-2.6l-.4-.4c-1.9-.6-3.4-2-5.1-2.8l-.9-.5q-1-.8-2.3-1.5l-2.5-.9-.5-.7q-1.4-1-2.6-1.5c-2.1-.9-3.9-2.4-5.9-3.4q-3-1.6-5.9-3.5l-.1-.1c-1.4-1.3-3.2-2-4.8-3l-4.6-3-1-.4-.6-.2c-1-1-2.4-1.3-3.6-2q-.5-.2-1-.8-.7-.5.3-1.2M375.4 136q0 1-.7 1.1-1.6.6-3 1.5l-1 .5-4.2 1.6-1 .5-1.8.8-1 .5q-1.8.9-3.7 1.5l-2 .8q-1.4 1-3.4 1.2-1.4 1-3 1.2c-.6 0-1.2.5-1.8.7A137 137 0 0 0 336 153q-2 .6-3.8 1.4-2.2 1.2-4.5 1.8-.7 0-1.5.6a17 17 0 0 1-4 1.7q-.7 0-1.2.4l-2 .8c-.8.4-1.8.4-2.7 1q-1.2.7-2.6 1.2l-6 2.3-1.4.3q-2.8 1.6-4.8 1.8-.2-.7.4-1 1.3-1.1 3-1.3.9-.1 1.7-.5 3.3-1.8 7-3l3.6-1.4.3-.1c1-1 2.4-1.1 3.5-1.7 3-1.5 6.1-2.3 9.1-3.5l4.1-1.8q1.4-.7 2.8-1 1.7-.5 3.3-1.6c.8-.8 2-1 3-1.4l5.4-2.2.7-.2q1.5-.3 3-1.2l1-.4q1.2-.1 2.2-.7l2.4-1 1.3-.9 3-1.2 1-.4q3.6-1 6.8-2.5.6-.4 1.1-.4 1.7-.3 3.2-1 .4-.3.9.2M303.5 60l.5 1.6q-.8 1.5-2.3 2.3-1 2.6-2.6 4.8-2 2.3-3.4 5-.6 1.3-1.6 2.4-.3.7-.9 1-1.2 1-1.8 2.3l-1.2 2q-1.9 2.5-3.5 5.1-1 1.5-2.1 2.8l-2.3 3.5-.8 1q-1.9 2.3-3.3 4.9-1.5 2.5-3.4 4.7l-3 3.4-1 1.6-1.2 1.5-4 6a24 24 0 0 0-3.2 4.4q-.3 1-1.4 1-.5-.7-.3-1.7l2-2.6.8-1q.4-.9 1-1.5l2.8-3.8q.8-.8 1.2-2a5 5 0 0 1 1.2-1.7q1.5-2 3.3-3.8l.5-.7.2-.5q1.6-1.7 2.6-3.8l2.7-3.8 2.5-3.5a57 57 0 0 0 3.9-6l.6-.8.6-.5c.7-2 2.3-3.3 3.5-4.9l1.2-1.8 2.4-3.7.8-1.2.6-1.2 5.1-6.9.8-1c.5-1.2 1.5-1.9 2.5-3M88.4 310.3q1.3-2.2 3-3.7l.3-.3c1.2-.3 2-1.3 2.9-2l2.3-2q1.2-1.3 2.6-2.1l.8-.8 2-2.1 2-1.3 1.6-1.7.7-.3.8.1-.1.7q-.9 1.5-2.2 2.7-.5.2-.6.7-1.7 2.5-4 4.2t-4.2 3.8l-2.2 2-2.6 2.3-2.3 1.7c-.6.5-1.5.7-2 1.5q-.7.8-1.8 1.5l-6.4 5.4-.8.6-1.2 1-1 1.3q-1.3.8-2.5 2l-4 3.6q-1.4 1-2.2 2.2-.5 1-1.4 1.8h-1.3l-.3-.6q-.2-1.6 1-2.6l3.2-2.8a17 17 0 0 0 2.6-2.9q1-1.5 2.6-2c2.2-1 3.8-2.5 5.6-4 .7-.6 1.1-1.5 2-2 1.4-1.6 3.2-2.7 4.6-4.2q1-1.1 2.5-1.7m70.1-194 1.4 1.4 2.7 3.9.5 1.7-.5.6-.4-.2q-.7-.7-1.3-1.7l-3.4-6.1q-1-2-2.4-4-1.2-1.8-2-3.7l-7-12q-1.2-2.6-2.8-5-.8-1-1.3-2.4-.7-2.2-2.2-4-.6-.7-.7-1.4-.3-1.2-1-2.3-1.5-2.8-3.3-5.6l-.7-1.4a10 10 0 0 0-1.4-2.5q-.6-.6-.9-1.3c-.2-1.2-1-2.1-1.6-3l-.5-1a6 6 0 0 0-1.6-2.8q-.3-.2-.4-.6-.7-1.5-1.6-2.7l-1.3-2.4q-.6-1.3-1.5-2.2-1.2-1.1-1.6-2.8-1.4-1.1-2-3c.2-.4.1-1 .6-1.3h.4q1.8 1.7 2.8 4 .8 2 2.2 3.7.6.8 1 1.9.5 1.5 1.5 2.9l1.6 2.7q1.3 2.5 3 5 .6 1.6 2 3.1l.2.6a7 7 0 0 0 2 3.2 25 25 0 0 0 2.4 5l.3.4a5 5 0 0 0 2 2.9q.6.5.6 1.4v.8q1.4 1.7 2.3 3.8l2.3 4.3.8 1.5q1.3 2.9 2.9 5.6l2.9 5.3 4 7.3q.5.6.7 1.2zm-49.2 13.2q-.5 0-.8-.3l-4.4-3-3.3-2.4q-1.7-1.3-3.6-2.2l-.7-.4-4.1-3.3-2-1.4L87 114l-2.7-1.5-.9-.5q-1.4-1.4-3.3-2.4l-5-3.6-1-.8q-.3-.4-.7-.6-2.1-1.2-4.1-2.6-.3 0-.5-.3l-3-2.5-.4-.4c-1.6-.6-2.8-1.7-4.1-2.5l-3.8-2.8q-1.8-1.4-3.4-2.9l-.3-.5.6-.2h1.2l2 1q1.5.8 2.8 2a8 8 0 0 0 2.3 1.8q1 .5 1.7 1.2L66 97c1.1.7 2.2 1.2 2.9 2.3q.3.4 1 .7l1.2.6q2 1.7 4.3 3c1.8 1 3.3 2.5 5.1 3.5q.5.2.8.6 1.4 1.3 3.3 2l1.1.8q1.8 1.6 3.8 2.7l1.3 1.2q1.4 1 2.7 2.2.4.5 1 .7 1.8 1 3.3 2.6l.1.2c1.8 1.2 3.3 2.8 5.1 4 1.9 1.1 3.5 2.7 5.3 3.9q1 .4 1 1.5M121.4 239l-.2.7q-.9.8-2 1-1 0-1.7.4l-2.4 1q-1.7.4-3.2 1.2l-2.9 1.3-.5.3-2 .6-2 .8-2.7 1.1q-4 1.8-8 3.2c-2 .6-3.7 1.6-5.7 2q-1.5.3-3 1.1l-6.7 2.5-2 .8c-1.4.2-2.5 1.2-3.9 1.5l-4 1.5a43 43 0 0 0-6.5 2.8l-4.6 1.6q-.6.4-1.3 0c.6-1.4 1.3-2.5 3-2.9q3.4-1 6.7-2.3l7.5-3 1-.3q.5 0 .8-.3c1.7-1.2 3.7-1.5 5.6-2.3 3-1 6-2 9-3.3l1-.4q2.2-.7 4-1.6l1.5-.6q4-1.1 7.7-2.8l1.2-.4q3-.6 5.8-2l3.2-1.2 2.8-1.4q1.8-1 3.8-1l.5.2zm27.4 126.1q0-1.2.6-2.4a5 5 0 0 0 .7-2q.1-1.4 1-2.4l.8-3.3.6-1.4c.5-.9.6-1.4.5-2.7 1.2-1 1.4-2.7 2.1-4l.7-1.9q1.5-2.7 2-5.6.7-1.9 1.6-3.6 1-2 1.3-4.3.8-1.5 2-3v-1.3l.5-1.5a11 11 0 0 0 1.8-3.6l.3-.6.8.2q.4 3-.9 5.4l-1.6 3.7-.3 1q0 .6-.2 1c-.7 1-.8 2.1-1.3 3.1q-1.1 2.2-1.9 4.5l-1.6 4.4-.3.7q-1 1.5-1.4 3.2-.6 1-.7 2.2 0 .6-.4 1.1c-1.1 1.4-1.4 3.2-2 4.9l-.6 1.6-2.5 6.5-2.7 7.5-1.8 4.4-.3.2q-.6 0-.5-.6.2-2.3.8-4.6l1.4-4q.4-1.6 1.5-2.8m-71.3-188q1.2 0 2.3.3h1.8l5.8 1.6q2.5 0 4.6 1c1.8-.2 3.6.5 5.4.8l3.9.8c1.2.3 2.6.3 3.7 1h.2c1.7 0 3.2.7 4.8 1 1 .1 1 .1 2 1q0 .4-.5.4l-1-.1-1.9-.5q-1.5 0-2.8-.6l-1.4-.2q-3 0-5.7-.8-1.3-.4-2.7-.4-2.7-.4-5.2-1l-6-1-4.2-.9q-3-.6-6.3-1-3.4-.5-6.9-1.4l-3.6-.6q-3.6-.7-7.1-1-1.3 0-2.5-.6-1-.6-2.3-.4-2.2 0-4.2-.8-.3-.1-.6-.5l.2-.3q2-1 4-.5 2.5.7 5 1 3.3.8 6.5 1.2h.8l5.2.8q2 0 4 .6c.8.3 1.7 0 2.5.4zm239.4 44.3q2-.2 4.3.7 2 .6 4.1 1l4 .7 4.7.8 2.6.7q1.3 0 2.5.3 3.9.7 7.8 1.7l3.9.6q3 .5 5.9 1.2l.5.1c2.6 0 5 1 7.5 1.3l3.6.8q.9 0 1.1.7-.2.8-.8.8l-3.2-.4h-.6c-1.8-.7-3.7-.7-5.6-1l-5.3-1q-1 0-1.7-.3l-3-.6-2.7-.6-1.4-.2-2.9-.5-2-.4q-1.5-.5-3.1-.6l-4.2-.7-2.5-.7-2-.4q-1.5 0-2.8-.4-3-.7-6-1.1-3-.3-5.6-1-1.6-.6-3.3-.6-1.5.1-3.1-.5l-.4-.7c.8-1.2 1.8-.6 2.7-.3l1-.4h1.8q1.9.3 4.2 1m-214.7-63-2.8.5q-2-.7-3.8-1.8l-5.7-3q-.5 0-.8-.2c-1.3-1.2-3.2-1.4-4.7-2.1l-3.2-.9a8 8 0 0 0-3.7-2.2l-2.7-1-1.5-.4a10 10 0 0 1-4-1.6l-2.3-1-3.8-1.5q-2.2-.8-4.3-1.9l-1.3-.4q-.6-.1-1-.4L51 138q-1.6-.6-3.3-1c-.9-.4-1.8-.6-2.2-1.5q0-.6.7-.6 1.7-.2 3.4.6l1.8.6 2.5 1 2.9 1.3q1.4.7 2.9 1.1 1.8.9 3.8 1.5.5.1 1 .5 1.4 1 3 1.5l2.5 1q1.5.7 3 1 1.2.3 2 1 .7.5 1.8.8.6.1 1.2.5 1.5.7 3 1 .4 0 .9.4l6 2.7q1.6 1 3.4 1.4l1.3.5 4.6 2.3c2.3.2 3.6 1 5 2.8m47.7 235.9-1 1.7-1.2 1.8-.8.3q-.7-1-.2-2 .9-3.1 2.2-6.2.3-.6.3-1.3l.2-2.5q1.3-1 1.2-2.8.1-.9.8-1.8.9-1.4 1-3 .4-1.4.4-2.9 0-.9.6-1.6c.9-1.4 1.3-3 2.1-4.4q.7-1.5.2-3l.9-3 .7-1q.4-2.1 1.3-4.2l.6-1.7q.8-1.6.7-3.3l1-1.7q.6-.6.7-1.4l.7-1.8a9 9 0 0 0 1.4-4l.2-.6 1.2-.6.6.7v.5q-1 1.4-1.2 3v.4l-1.8 5.8-2.6 7.5-.5 1.5q-.2 1-.7 1.8-.9 1.6-1 3.3a37 37 0 0 1-2.7 7.5q-.2 1-.6 1.9c-.5 1.4-1.3 2.8-1.6 4.3l-1.3 4.3q-1 2.7-1.3 5.5-.1 1.4-.5 3&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M299.8 316.2q.1 1.6 1 3 .7 1.5 2 2.7l.4.6c1 2 2.7 3.6 4.1 5.4q.3.3.4.7 1 2.2 2.3 4l1.3 1.7q2.7 3.6 5 7.2l2.3 3.2q.5 1.2 1.3 2.2l1.5 1.8q.6.5.7 1.4l-.6.6c-1.6-1-2.2-2.5-3.2-4q-1.7-1.3-2.8-3.3-.9-1.5-2-2.6-1-1-1.3-2.4a15 15 0 0 1-2.6-3.9c-1-1-2-2-2.8-3.4q-.9-1.5-2.2-2.7-1.6-2.1-2.8-4.5l-1.2-1-1.2-2q-1.4-2.4-3.4-4.6-.9-.8-1.4-1.9-.8-1.6-2.1-2.7l-.3-.3q-1-2-2.2-3.7-.4-.6-.6-1.8c-.5-.5-1.4-.8-1.6-1.8q0-.4.6-.3.7 0 1.1.6l.7 1 1.5.8.3.4a32 32 0 0 0 5 6.7l1.5 2q.3.5 1 .6h-.1zm-88-222 .5.8-.5.9-.1 7-.1 2.3q0 1 .4 1.7l-.5 2.7c-1-.5-1.1-1.5-1.6-2.2l.7-11a24 24 0 0 1-.1-5.6l.3-4.2V86c-.4-2.1 0-4.3 0-6.4V78q.2-2.2.1-4.5l.2-1 .1-1c-.3-1.8 0-3.5.1-5.1l.4-6.4q.4-3 .2-5.6 0-2.6.3-5l.2-5.5q-.1-2.5.1-4.9.4-3 .2-5.8 0-1 .8-1.4.7.1.6.7.3 2.4.2 4.7l-.2 2.5q-.3 1 0 2a5 5 0 0 1-.4 3.6q.4 1.1 0 2.4l-.1 1.2-.5 5.2q.2 1 .1 2.3V58l-.1 1.9q-.4 1.3 0 2.7.2.5 0 1.3l-.3 1.3-.2 5.3q-.3 3.7-.2 7.3l-.1 2.2q-.4 1.4 0 2.7v.6c-.4 2-.2 4-.2 6q0 2.6-.3 5M102 144.8c1.5 1.6 3.4 2.4 5 3.5l2.2 1.4q2.3.6 4.5 2.2l.3.2c1.8.5 3.1 1.9 4.8 2.7q.8.4 1.7 1.2c1.3.1 2.4 1 3.8 1.6l.2.5v.2l-.9.5c-1.2-.1-2-1-2.9-1.6a50 50 0 0 0-5.6-3.5l-1.5-.9-.5-.3a9 9 0 0 1-3.3-1.7q-1.4-1-3-1.8l-2.3-1q-3.4-1.8-7-3.4-1.3-.5-2.4-1.3-1.2-.7-2.5-1.2-.8-.3-1.4-1-.5-.4-1-.5c-1 0-1.6-.7-2.3-1l-2.6-1.4q-1.5-.7-2.8-1.7l-2.8-1.3-2.7-1.6-1.7-1-2.6-1.3-1.5-.9-.8-.5q-2.2-.8-4-2-.4 0-.7-.3a10 10 0 0 1-4.4-3.2v-.3l.7-.1q.4 0 .7.2 3 1 6 2.9 3.3 2 7 3.5l1 .5q2 1.4 4.3 2.5l6 3q2.2 1.3 4.6 2.4 1.9.9 3.6 2 1.6 1.1 3.3 2 .4 0 .7.4 1 1.3 2.8 1.4m220.7-65.7.2 1a10 10 0 0 1-2 3.3l-2 2-1.5 1.7q-2.1 2.2-4 4.6l-.7 1c-.7 1.7-2.2 2.8-3.4 4.1q-1.8 1.5-3.2 3.5l-.9 1q-2.2 2-4 4.4l-1.8 1.9-1.4 1.5q-1 1.3-2.3 2.5-1.3 1.3-2.4 2.8-1.5 2-3.4 3.7l-.6.6c-.8 1.4-2.2 2.4-3.2 3.6l-3.4 4q-1 1.5-2.4 2.6-1.4 1-2.5 2.5h-.6v-.5c.7-1.1 1.1-2.5 2.3-3.3 1.2-2 3.4-3.2 4.4-5.4l.3-.3c2-1.2 3-3.6 4.8-5 .3-1 1.2-1.4 1.8-2l2.3-3q.6-1 1.6-1.9 2-1.7 3.7-4l.8-.8q1-.8 1.8-2l1-1.1q.6-.4 1-1 1.8-2.2 4-4.3.6-.6 1-1.3 1-1.7 2.5-2.8 1.4-1.2 2.4-2.5l1.6-2c2.2-2.4 4-5.1 6.4-7.4zM152.3 315.6q2-2.6 3-5.3l2.5-4.7q1.6-2.8 3-5.7l.4-1.5 1.2-1.4q.6-.9.8-1.8.8-2.1 2-4l1.7-2.7.6-.3q.8.5.6 1.2-.1.6-.5 1.2l-1.6 3-.8 1.9-1.8 3.2-1.7 3-1.7 3.4-3.9 6.3q-.1 1.5-1.3 2.8l-.8 1.3q-1.6 3.4-3.5 6.8l-3.4 6.5q-.4 1-1.1 2-.4.6-.6 1.3-.3 1.5-1.3 2.6-.6.7-1 1.6-1.3 3-3.1 5.7-.4.4-.6 1c-.5 1-.7 2.2-1.6 3-.3 1.3-1.4 2.3-1.5 3.7l-.3.7-1.4 3-1.1.6-.5-1.2 1-2 1.1-2a14 14 0 0 0 1.6-3l1-2 1-2.2.7-1.4q.9-1 1.5-2.3l1.4-2.8.4-.7q.6-2 2-3.7.4-.5.5-1 .4-1.5 1.3-2.9l2.5-4.4.4-.9.9-2.3q.6-1.1 1.4-2 .4-.7.6-1.6M233 353a4 4 0 0 0-.1-2.6l-.1-.6q0-1.4-.3-2.7c-.2-.8 0-1.6-.3-2.5l-.1-2a74 74 0 0 1-.7-9.1q.4-1.3 0-2.5l-.1-1v-2.5q.6 0 .8.4l.8 1.8q.6 2.2.6 4.6l.1 5.5.4 3 1.2 11.3q.3 4.8 1 9.5.3 2 .2 4.3l.2 1.5q.5 2 .4 4c-.1 2.3.4 4.5.7 6.8q.4 1.2.3 2.5l.3 1.3q.2 1-.7 2l-1.2-.7c-.1-.8-.5-1.6-.2-2.5v-.4c-.5-1-.2-2.1-.4-3.2-.3-2.2-.1-4.4-.6-6.6v-.4q-.1-2.6-.5-5l-.6-3.9q-.4-2.5-.6-5.2-.1-2.1-.5-5m87.8-52.9c-.9-.1-1.6-1-2.3-1.7q-1.4-1.9-3.6-3.2-.6-.4-1-1-1.7-1.8-3.7-3.3l-1.4-1.1q-1.3-1.4-2.7-2.5l-3-2.1c-2.2-2-4.6-3.7-6.3-6l-1.4-.6q0-.2-.3-.5l-.7-.9c-1.9-1.2-3.3-3-5.3-4-1-.4-1.3-1.3-1.8-2q.1-.8 1.1-1l1.8 1.5 6.5 5.2.7.7q1.6 1.6 3.6 3 .6.3 1 .8 2 2.1 4.3 3.9l2 2 5 4.2 2.1 2 2.5 2.2q1 .7 2 1.8.7 1 2 1.8c1.4 1.3 2.7 2.8 4.5 3.7 1 1.5 2.6 2.3 3.9 3.5l4 3.4.8.5q1.2.5 1.6 2l-.7.5-1.2-.3q-1.5-.4-2.6-1.6l-3.6-3.9-.8-.8-1.8-1.5-2-1.8-1.4-1.3zM62.7 337.8l-.3-1c1-1.2 2.5-1.1 3.6-1.5l3.3-2.6 3.3-3.4.8-.5 2-1.6.7-.7q2.5-1.6 4.3-3.9l1-1 3.5-2.7 1.1-1.1 1.6-1.4 2.3-2.1q2.4-2.7 5.3-4.8l2.4-1.4a8 8 0 0 1 3.2-3l1.4-1.1 1-.9q.4.4.2.7a10 10 0 0 1-3 3.5q-2 1.4-3.5 3.1-1.1 1.3-2.4 2.4-1.7 1.4-3.3 3-1.1 1.3-2.6 2.3l-4 4-1.7 1.3q-1 1.5-2.9 2.8a36 36 0 0 0-6.2 5.6l-.9.7q-1.5 1.4-2.9 3l-1.5 1.1-1.4.7-2.5.4zm340.2-129.5-1.7.7c-1.3-.4-2.7-.1-4.1 0l-2-.2-1-.1q-1.5.2-3 .1-1.5-.2-3 0h-.7l-4.3-.1-4-.1h-4.4l-2.1-.2a9 9 0 0 0-3.5 0q-.7.2-1.6.1c-2.3-.5-4.8-.2-7.2-.3q-1.7 0-3.5-.3h-2.5a15 15 0 0 0-4-.1c-1.4-.5-2.8 0-4-.1-1.4-.3-2.7-.1-4-.3l-5.6-.4q-.8 0-1.6-.6l.2-.8.5-.2 5.6.2h.8c1.7-.3 3.3.2 5 .5l1.1-.3 1.7.3q.9-.2 1.7 0h1.6l5.8.1 5.9.1 1.1.2.8.1c2.7 0 5.4.6 8.2.3l3.1.2q1 .3 2.1 0l.8.1q2.9.5 5.6 0l2.7.1 2.8-.2h2a11 11 0 0 1 3.7.1q1.8.6 3.7.5.6-.2 1.3.6M278.7 83.1a6 6 0 0 1 2.1-3.3q.7-2 2.1-3.6l.7-1.2q.3-.7.8-1.2a5 5 0 0 0 1.2-2l.3-.4c1.2-1.3 1.8-3 3-4.4l.7-1.5q1-2.5 2.6-4.6c.7-1 .7-1 1.9-1.9q1.2-.1 1.8 1c-.2.8-1 .8-1.7 1.3l-1.7 2.5-.1 1q0 .8-.5 1.4a9 9 0 0 0-2 3.4q-1.8 1.4-2.7 3.5c-.8 1.4-2 2.4-2.5 3.3l-2.4 4.1q-.3.3-.4.7-.7 1.7-2.4 2.7l-.3.4-.2 1.4c-1.5 1.9-2.6 4.2-4.3 6l-.3.5c-.4 1.6-1.6 2.7-2.4 4a46 46 0 0 1-4.6 6.5c-.8 1.5-2 2.8-2.6 4.3q-1 2-2.7 3.3l-.5.3q-.7-.3-.6-1 0-1.1.9-2l1.5-1.1 2.4-4 .2-.4c1.6-1.6 2.4-3.7 4-5.3l.2-.3c.4-1.6 1.7-2.6 2.2-4v-.3q1.8-2 2.9-4.2l1.2-1.8zM44.2 210.7l-.2-.6.2-.3 2.3-.4h5.9q2.1.7 4.2.1c.6-.1 1.2.4 1.7 0 2.4 0 4.7-.3 7 0q.3.2.7 0c1.3-.4 2.5-.1 3.7-.1h.8q2.7-.3 5.4 0h3.8q2.7-.1 5.4.2l.6.1 2.7-.2 2.7.2q3.2 0 6.4.3h1c2.2-.4 4.5 0 6.8-.3l4.5-.2c.4.1.9.4.6 1.3l-1.2.2-3.3.2q-2.7-.4-5.5 0-1 .2-2 0c-1 0-1.7-.3-2.6 0q-1.2-.2-2.3.1c-1 .1-2.1-.2-3.3 0q-1.5.2-3.1 0L86 211q-1.2 0-2.3.3H76c-.7 0-1.5-.4-2.3-.1q-1 .2-2.1-.2h-.4c-1.5.5-3.1 0-4.7.2l-1.3-.1-1.2-.1c-1-.2-2.1.1-3.3 0q-1.6-.2-3.3-.2h-6.3l-.5.1c-1.3.6-2.6.3-3.8.3q-1.4 0-2.6-.6M322 196.5l-1.4.3q-2.4 0-4.7.3-1.1.3-2.1-.5-.2-.7.4-.8 1.2-.6 2.5-.6h6.6q2 0 4-.3h2q2.4.1 4.8-.2h.4q1.5.3 3-.2 1.5.5 2.8.2h.5c2 .4 3.8 0 5.7.1h.2c1.8-.5 3.6 0 5.4-.3h.4q1.7.2 3.3 0 1.6 0 3.2-.4 1.2-.3 2.6.1.9.4 1.9 0 1.3-.3 2.4-.3l2.6-.2h1.5q.7 0 1.7.4c.4 0 1-.5 1.5-.2h.8l1.1-.2q2.7 0 5.2-.7l1.7.5v.8l-6.1 1.2-2.3-.4a6 6 0 0 1-4 .3h-1.3q-2.8.5-5.7.2h-1.5l-2 .1-2.4.2a4 4 0 0 1-1.8.2c-1.9-.2-3.7 0-5.6-.3q-1.2-.3-2.3.1-.9.3-1.8.2-2.1-.2-4.2.7l-1.5-.6q-2.2.4-4.4.3l-3.5.2q-3 .5-5.8 0h-1.4l-1.1.1zM267.7 65.7c-.6 2.4-1 4.5-2.6 6l-1 2.5-.6-.3c0-.7.4-1.3 0-2 .2-.8 0-1.7.6-2.5l.6-1.3 2.1-6.2q.6-2 1.5-3.8l.1-.2 3.5-8.2 1-2.7 1-2.6q.3-.5.3-1 .1-1.4.8-2.5l1.1-2.3 1.2-2.4q.4-1.2 1-2.3.3-.2.3-.5c0-1.2 1-2.2 1-3.4q0-.8.4-1.4a5 5 0 0 0 .8-2.2q0-1 .9-1.3l.3.2q.5 2-.3 3.8l-1.1 3.3q-1.5 3.6-2.7 7.1a56 56 0 0 1-2.6 7.1l-1 3.3q-.6 1.5-1.5 3-.5 1-.7 2.2t-.8 2.2q-.8 1.5-1.3 3 0 .5-.4 1-.5.8-.6 1.5-.3 1.7-1.3 2.9M146.3 362.6l.3 1.7q-.3.9-1.6 2-.5 0-.6-.5a6 6 0 0 1 .3-3.7q.5-1.2 1-3.2 1-1.1 1.4-3.3.1-.5.4-.9l2.5-5.5 1.6-4.1 1.4-3.9.4-1.7q1.2-1.2 1.7-3.2 1.6-3.9 3.5-7.8 1.1-2.2 1.5-4.6.3-2 1.4-3.6l.5-.8.5-2.1q.3-1 1-2 .5-2 1.9-3.7l.5-.4q.7 0 .7.6l-.1 1.6-.7 2.2q-1.1 2.5-2.5 4.9a4 4 0 0 0-.8 2q-.1 1-.8 2.1-1.7 2.9-2.2 6l-.6 1.6-.6 1.7q0 .3-.3.7l-2.5 5-.4 1.1-1 2.2-2.3 5.3-.4 1.5-.5 1.9-2 4.6q-.6 1.1-.8 2.2 0 .4-.4 1zm86.4 14q-1 0-1.3-.6c-.5-1.4-1.3-2.7-1-4.3q0-3.5-.3-7-.4-2.4-.4-4.8.2-1.7-.3-3.3v-1q0-.8-.2-1.5c-.3-.8-.1-1.6-.3-2.5q-.5-1.5-.2-3.2v-1l-.3-3.7-.3-3q-.1-3.7-.4-7.3 0-1-.3-2l-.2-2.4-.2-2.7q-.3-1.5 0-3c.8-.4.8-.5 1.7.4 0 1 .4 1.9.4 3q-.1 1.6.3 3.2l.3 2.7q.1 3.3.4 6.4.4 2.2.4 4.6l.1.8q.3 1 .2 2.1-.2 2 0 3.7.4 1.5.2 3-.4 1.5 0 3.2 0 2.4.6 4.8v2.1q0 1.2.3 2.3v.6q.4 4 1.1 7.9v1.7q0 .5-.3.8m-80.9-9 .1-.4c.8-1.5 2.5-5.6 2.5-7.3v-.6c.8-.8.7-2 1.3-2.8q1-1.1.5-2.5l.5-.8 1.6-4q.8-1.4 1-3 .2-1.5.7-3.1 1.4-1.2 2-3c0-2 1.1-3.4 2-5q.7 0 .8.5v1.4q-.2 2-1.2 3.9-.8 1-1 2.3 0 .5-.4.9l-.5 1.2q-.6 2-1.7 4l-.2.7q-.3 2.6-1.6 5l-.5 1.2q-1 3.5-2.3 6.6l-2.6 7-.8 2.6-3.1 10-.4 1.3q-.2 1.8-1 3.2 0 .7-.9.8-.6 0-.7-.5-.8-1.9.1-3.6.5-.9.7-1.8l1.8-4.7.4-1q.6-2.6 1.9-5.2l.8-1.7zM14.5 246l-.7-.4v-.4q.8-1.2 2.1-1.6a33 33 0 0 1 5.2-1l3-.6c2-.4 3.7-1.2 5.7-1.4a18 18 0 0 0 5-1l4.2-.6q3-.5 5.9-1.3l2.5-.3.7-.2 4.5-1.4 1.1-.2c1.3 0 2.4-.5 3.7-.6 2.7-.4 5.4-1.3 8.2-1.4l2.1-.4 2.4-.6q1.2.1 1.4 1.3l-.7.4q-4.2.6-8.3 1.4l-1.9.5q-2.3.9-4.5 1l-.8.2-3 .6-3.3.7-4 .8-5 1-6.3 1.2q-.8.3-1.7.2-.7 0-1.3.3-1.2.6-2.5.6l-1.5.1q-2.5 1-5 1.4-2.3.8-4.6 1.1zm286.1-75.8-1-.9 1.6-.8q.5-.3 1.1-.3t1.1-.3c.8-.5 1.8-.6 2.6-1.2q1.2-.6 2.6-1l3.4-1.3 1.6-1q1.2-.2 2.1-.6c.9-.3 1.6-1 2.5-1.1q1.4-.3 2.6-1l3.2-1.3.7-.3q3-.8 5.8-2 4.5-1.9 9-3.5l3.1-1 4-1.2 4.4-1.7q1.8-.7 3.6-1l1.6-.6q1.7-.9 3.5-1.2 1.7-.1 2.7-1.4c.8.1 1.6-.2 2 .7q0 .7-.6 1l-1.8.3q-2.7.3-5.1 1.8l-1.3.2c-2.1 1.4-4.5 2.1-6.8 3l-4.5 1.6q-2.2 1-4.5 1.4-.8 0-1.3.3c-1.6 1-3.4 1.3-5.1 2q-.5 0-1 .3-1 .7-2.3.9l-2 .8-1 .5c-2.2.4-4.1 1.6-6.3 2.1a34 34 0 0 0-5.3 2q-2.3 1-4.8 1.7c-2 .5-3.8 1.5-5.8 2.2q-1.7.5-3.3 1.6zm-177 138.5q-.4 1-1 1.7-2.2 2.4-3.9 5-.7 1-1.8 2-1.1 1.2-2 2.6l-1.2 1.5-3.3 3.9q-.9 1.1-1.3 2.4a7 7 0 0 1-2.5 2.9q-.7 0-.7-.6 0-.8.2-1.3.4-1 1.2-1.8 2-1.6 3.1-4 .7-1.2 1.7-2.3 2.5-2.7 4.3-5.7.7-1.2 1.7-2l.5-.5 4-5.2 5-6.3q2.1-2.2 3.6-4.6.3-.5.7-.7 1-.9 1.6-2l.8-1q2-2.2 3.7-4.5 1-1 1.8-2.1.1-.3.4-.4l.7-.2q1 .7.5 1.5 0 .3-.3.5c-1.2 1-1.8 2.2-2.8 3.2l-.3.3a42 42 0 0 1-5.6 6.8l-1 1.4q-.7 1.4-1.8 2.5l-3.6 4.4q-1 1.4-2.5 2.6m158.3-7.7q-.1-.9.6-1.2 1.1.4 2 1.5l3 4q1.5 2.2 2.8 4.5l3.3 4.8 1.1 1.8a62 62 0 0 0 3.8 6.1q1.5 2 2.6 4.2l.5.8q1.3 1.6 2.2 3.4.6 1.2 1.5 2.3 1.4 1.5 2.1 3.4l.8 1.2 2.6 3.8 2.5 3q.8.6.6 1.6c-1 .7-1.6 0-2.2-.4l-1.9-3.6-2.5-3.5-2.3-3.2q-.7-1.3-1.9-2.4l-.7-1c-.9-2-2.4-3.5-3.5-5.4l-1.1-1.8-.6-1q-1.7-1.9-2.9-4.2l-2.2-3.4q-1.1-1.5-2-3.3l-.5-.9-2.5-3.5q-.5-1-1.5-2v-.2c-1-2-2.8-3.3-3.7-5.5M28.4 140l-1.4-1c-2-.2-4-.2-5.4-1.8q.2-.7.8-.7c.7-.2 1.3.4 2 .3q1.2 0 2.3.4l2 .6 8.2 3.5 1.6.5 4.2 1.5c2.2.7 4 2 6.3 2.3l1 .4q2.2 1 4.4 1.7 2.5.6 5 1.7l1.9.8 2 .2 1.7 1c.7.4 1.4 1 2.3.9h.2c1.1.9 2.6 1 3.8 1.3l1.5.7q1.2.7 2.4.7l4.1 2.2c1.3.7 2.8 1 4.3 1.8q-.6.4-.8.3L77 158q-.4-.1-.7-.4a21 21 0 0 0-5.1-1.8q-.6-.1-1.1-.4l-3.3-1.4-.9-.4q-2-.5-4-1.4l-4.3-1.8-.7-.4q-2.8-.4-5.1-1.8l-.6-.2c-2-.4-3.7-1.5-5.7-2s-3.8-1.7-5.9-2l-1-.4q-3-1.5-6-2.4-2-.8-4.2-1.1M236.2 57l-.6 1.2v.4q.5 1.1 0 2.3c-.5 1.5-.4 3-.8 4.6q-.4 1.5-.5 3l-.1 1c-1.2 3-1.3 6.4-2.1 9.5.1 1.8-.5 3.4-.8 5.1l-1.6 8.7-.4 3.4-.6 2.7q0 .5-.6.7-.7-.3-.5-1c.6-1.5.4-3.2.8-4.8l.4-3.4.4-2.3q.5-1.5.5-3l.1-.9q.6-1.8.8-3.8l.8-4.2.2-1.3c0-2.3.8-4.4 1-6.6.3-2.4 1-4.7 1-7.1q0-.7.3-1.3 1-3.6 1.2-7.3 0-1 .4-2.1.4-1.5.4-3l.1-1.6c.9-2.3.6-4.8 1.5-7v-1l-1.1-1 .1-1.2h1l1-2.8q1 .6 1.3 1.8l-.8 3q-.3.8-.3 1.8l-.4 3.5-1 4.8-.3 2.9q0 1-.4 1.9a7 7 0 0 0-.4 4.4m122.1 33.3 1.1.7v.4q-1.4 1.4-3.1 2.5c-.5.4-.6.3-1 1.2l.6.6v1.5l-1.1 1.4-1.5.8-.2 1.5q-1 1.4-2.5 2.2-2.6 1.4-5 3.3l-.9.3-1.3 1.5q-.8.9-2 .9l-1-.3q0-.7.3-1 1-1 2.2-1.6l1-.8q1.5-1.4 3.4-2a5 5 0 0 0 2.8-2.3q.4-.6 1-1.1c0-1 0-1-.4-1.8a3 3 0 0 0-2.6 2.5q-.4 0-.8.3-1.3.4-2.3 1.4l-5.4 4-2.5 1.8q-1.7 1.7-3.7 3c-1.2.6-2.2 1.7-3.7 2l-.8.6a5 5 0 0 1-2.5 1.2q-.7-.8 0-1.3l2-1.2q.8-.4 1.4-1l.6-.4a9 9 0 0 0 3-2.2l.3-.2c2.6-1.3 4.6-3.4 7-5q2-1.2 3.8-2.7l4.9-3.6.8-.5 1-.6q1.5-1.4 3-2.4 1-.7 1.6-1.6.8-1.3 2.5-2m-236.5 7.6q-.7.4-1.2 0l-.8-.8c-.8-1.2-2-2-2.4-3.4q-.2-.4-.8-.8l-2.1-2.8-1.7-2.2c-2.5-2.8-4.4-6.1-6.8-9q-1.4-1.6-2.4-3.5-.3-.7-1-1.3-.2-.1-.3-.4c-.7-1.7-2.1-2.8-3.1-4.3l-3.4-4.5-.8-1.1-1.1-1.6-3.9-4.1-1.5-2 .2-.7q.4-.3 1.7-.1 1.6 1 2.6 3c1.5 1.6 2.6 3.7 4.2 5.3q1.5 1.4 2.2 3.3 1.2.6 1.8 2c.5 1.2 1.6 2.1 2.3 3.3l.8 1.3q.7 1 1.5 1.8 1 1 1.8 2.3 1 1.8 2.5 3.5.8.8 1.2 2 .3 1 1.2 1.7.4.3.6.7c.8 1.5 2.2 2.6 3.1 4l1.8 2.8.7.9 2.3 2.1q1.2 1.1.8 2.5m.6-33.9c-.3-1.3-1-2.7-.8-4.2q.7 0 1.2.3.8 1 1.3 2.1l3.1 5.6 1.4 2.6q.7 1.5 1.7 3l.5 1a8 8 0 0 0 2 3.4l.7 1.1q1.6 3.9 4 7l.2 1.3q1.4 1 1.9 2.6a17 17 0 0 0 2.4 4q1.4 1.8 2.1 4 .5 1.1 1.2 2.1 1 1.4 1.7 2.8l1.2 2 1.2 2q1 1.6 1.8 3.3v.2c1.5 1 1.7 2.9 2.7 4.2l.3.7q.4 2 2.2 3.4.6.3.3 1-.7.3-1-.2-.8-.7-1.2-1.5-.5-1.1-1.3-2-1-1.3-1.7-2.8T150 110l-3.4-5.7-2.2-3.9q-1.7-2.6-3.3-5.5c-1-2-2.4-3.8-3-6a3 3 0 0 0-1-1.3q-.7-.7-1.1-1.5l-3.2-5.4-3-5-3.7-6.4-2.2-3.7c-.3-.7-.9-1-1.4-1.7M95.4 317.2l1.1-.4 5.8-6 .8-.7 2.8-3 1.4-1.3a4 4 0 0 0 1.6-1.4v-.2l5.8-5.6q1.3-1.1 3-1.9.4-.3.9.2 0 1-.8 1.6-.8.8-2 1.6-.8.5-1.4 1.2l-3.2 3.2-3.1 3.2c-2 1.7-3.4 3.9-5.4 5.6q-.7.5-1.2 1.3c-.7.6-1.1 1.5-2 2s-1.3 1.7-2 2.4q-1.6 1.3-2.8 2.7l-1.7 2-1.3 1.3q-1.1.8-1.8 1.8-1.7 2.1-3.6 4.1-.8.8-2.3 1.2-.9-.4-.4-1c.8-1.2 1.3-2.6 2.6-3.5l.6-.4c1.6-2.2 3.7-4 5.5-6l1.8-2.3zM80 224.3l1.4-.5 4.2.2.4.6q0 .4-.2.4a3 3 0 0 1-2 .8c-1.3-.1-2.5.4-3.8.6l-1.7.2q-1.5 0-3.1.3h-.4l-4.8.5q-3 .3-5.6 1h-1.2l-2.5.2q-3.2.6-6.5.8-1.2 0-2.3.4c-1.3.4-2.7.3-4 .6l-1.6.1q-3 .6-5.8.7-1.4.1-2.6.7l-1.7.2q-.8 0-1.3-.7v-1l.5-.3 1.2-.3c1-.2 2-.1 3-.6q.5-.2 1.1-.2 3.3-.1 6.5-.5l3.6-.4q1.8-.4 3.7-.6c2 0 3.8-.7 5.8-.4 1 0 1.8-.5 2.7-.3l6.8-.9 7.2-1.3q1.5-.4 3-.3m279.6 47.4 1 1.2c1 .7 2.3.7 3 1.7-.1.7-.7.6-1 .9q-2.4-.5-4.2-1.7-1.7-1.2-3.8-1.9-.5 0-.9-.4a70 70 0 0 0-8.6-4.6q-.9-.6-2-.9l-1.2-.5q-1.4-1.1-3.3-1.6-.5 0-.9-.4a8 8 0 0 0-2.7-1.4q-1.6-.6-2.7-1.6l-1.4.2-.8-1-6.3-3.2-5.6-2.9q-.8-.3-1.2-1.3l.5-.5q1.6 0 3.2.8l4.6 2.6q2.4 1.5 5.3 2.3.6 0 1 .4l4.8 2.8q.7.5 1.7.9l5 2.2q1.6 1.4 3.9 2l2.6 1.3 6.2 3.4c.8.5 2.5 1 3.8 1.2M88.1 59.2l.5 1.3.7 1.2.8.9.7 1.2 1.3.7 1.5 2.4 1.2.6.7 1.9a3 3 0 0 1 1.6 1.5q.3.7 1 1.3l.9 1.4q.1.5.5.8l2 2.5 2.4 2.8.8 1q.5 1 1.4 1.6.4.2.6.6l2.5 3q1.4 1.3 2.6 2.9l.9 1.2q.6 1.3 2 1.9l.9 2.2h-.6q-1.1-1.1-2.7-1.5-.7-.2-1-1.1-1.4-2.3-3-4-1.4-1.5-2.3-3-1.3-2.1-3-3.9l-4.1-5q-1.2-1.9-2.6-3.5l-4-4.7q-1.9-1.7-3.4-3.8l-1.2-1.3a8 8 0 0 1-2-2.7 9 9 0 0 1-2.2-2 8 8 0 0 0-4.4-3.1l-.6-1-.1-.2-.2-2.5q.4-.5 1-.2a10 10 0 0 1 4.7 4q1.6 2.7 4.2 4.6m17.1 154.3q-1 .7-2.2.6h-5.5l-3.3.4q-1.6-.2-3 0c-1.5.4-3 .1-4.3.3h-10l-2.5.1-2 .2q-1.4.4-2.8.3c-1.8-.1-3.5.4-5.3.3H59l-4-.1q-.9 0-1.6-.4l-.6-.8q.4-1 1-1l2-.2q2 0 4.3.4h4l2.4-.4q2.1-.2 4.2 0h2q4.6 0 9.4-.3h14.2l1.6-.2c2-.4 4.1 0 6.2-.1q.9 0 1 .9m-28.4 15 .3.6-.2.4-1.3.7q-1 .6-2.3.5-2.2 0-4.6.4l-1.7.2q-1.7 0-3.2.6-1.3.5-2.7.5-1.1 0-2.3.3l-3.6.6c-2.2.5-4.4.5-6.5 1-2.7.1-5.1 1-7.7 1.3q-1 .1-2 .5-5.2 1.3-10.6 2.2l-2.4.8q-1.5.1-3.2 0-.2-.6.3-.9a6 6 0 0 1 4.1-1.8q1.4 0 2.7-.4l5.6-1.1h.6q2.1 0 4.2-.7a6 6 0 0 1 2.4-.5q1.5 0 3-.4 2.6-.6 5.3-.8 1.4-.1 2.6-.6 2.2-.3 4.2-1h1q2.1-.1 4.2-.6a21 21 0 0 0 5.7-1.3q4-.4 8.1-.5M352 277.6l-1 .8-.8-.4c-2.9-1.7-6-3-9-4.7l-2.1-1.2-5.4-2.8h-.8l-1.6-1.5q-2-1.5-4.3-2.4l-2-1c-.8-.7-2-.8-2.8-1.6q-1.4-1-2.9-1.7l-6.9-4q-3-1.5-5.7-3.2l-1.6-.8q-.8-.3-1.5-1-.4-.4 0-1.1l1.3-.2 4.3 2 .8.6 1.5 1 2 1.1q1.4 1 3 1.6 1.9 1 3.8 2.3l1.7 1a6 6 0 0 1 2.4 1.6l.3.2c2.3 1.1 4.1 3 6.6 3.7q.6.2 1 .6l1.3.8q3 2 6.2 3.4l3 1.7 5.3 3 2.3 1q.8.2 1.5 1.2M109.4 157.7l-.3.8-2.7-.5-2.3-1.7c-1.7-.2-3.3-1.4-5-2.2l-8.3-4q-2.6-1-5.2-2.3l-6.6-3.2q-3-1.4-6-2.5l-3.3-1.5-1.3-.5-.9-.4q-2.4-1.2-5-2.1l-2.8-1-.5-.1-3.1-2.3-.1-.6q2.2-.7 4.1.4l3.9 1.8 3.8 2 3 1.4q3 1.1 5.8 2.8.8.6 2 .8.5 0 1 .4 3.1 1.9 6.5 3l.6.3c1.8 1.2 3.9 1.8 5.8 2.7l.5.2q3.5 2 7.2 3.6l8.2 4zm142.1-78.2c-.8-.1-.8-.7-1-1.2q.6-3 1.7-5.8c.5-1.7 1.4-3.3 1.5-5.2l.2-1 2.1-6 .3-1 2.2-6.6q.8-2.2 1.3-4.5l.5-2q.9-2.7 1.5-5.5l.5-1.9q.5-3 1.8-5.9l1.5-1.3.5.5-.1.8q-.7 1-.9 2.2l-.5 1.9q-.4 1.2-.5 2.4 0 1.4-.4 2.5-.5 1.4-.7 2.8c-.1 1-.7 1.8-.9 2.8q-.2 2-1 3.7c-.5 2.1-1.5 4-2 6.2l-1 3.1-1.5 4.6-.7 2.4q-.6 2-1.4 3.7l-1.6 4q-.9 1.6-1 3.5 0 .4-.4.8m92.6 152.2q-3-.2-6-1-1.5-.4-2.9-.5-1.6-.1-3.2-.7l-3.8-1q-2-.6-4.1-1l-4.8-.8q-2-.4-4-.5-.9-.5-1.2-1.3c.2-.8 1-.8 1.5-1l3.8.8q.9.1 1.8.7h2.4l1 .2 5.8 1.4c1.4.3 3 .3 4.3 1l1.2.1 2.4.5q1 .3 2.1.4.7.1 1.5.5 1 .5 2.2.6 1.5 0 2.7.5l.7.2q2.4.2 4.6 1l.2.1c2.8.3 5.4 1.5 8.1 2q1.9.4 3.4 1.3l.2.3q0 .5-.5.5l-1.7-.2-5-1.2h-.1c-1.6 0-3-.7-4.6-1l-4-.7q-2-.2-4-1.2M172.8 14.8q-.2 2.6 1 4.7-.5 1.5.1 2.9l-.6 1.9c.1 1.5 1.1 2.4 1.2 3.7 0 1.6.6 3.1.1 4.5q1 4.7 1.7 9.2.8 4.3 1.2 8.6.4 3.2 1.2 6.6l-.5 1.3q-1-1-1-2.4l-.4-2.7q-.3-2.1-.2-4l-.8-3.8-.3-.9q-.4-.7-.4-1.7-.1-2-.5-3.8-.8-3.7-1.4-7.5l-.4-2.3q-.8-2.5-.7-5.1l-.5-1.1q-.8-1.2-.7-2.6v-1.8a3 3 0 0 0-.7-1.8q-1-1.4-.9-3V11l.7-1.5-.2-.6-1-1.2q-.7-.8-.7-1.7.5-1 1.4-1.3l1.1.2 1-.2.5 1-.7 1.6c.2 2.5 0 5.1 1.4 7.5M347.6 241c.5.6 1.2.3 1.8.7q.8.6 1.8.7a8 8 0 0 1 2.6 1.3q2.7.4 5 1.4 3.2 1.3 6.3 2.1l4.6 1.3 3 .4h1.2q2.2 1.4 4.9 1l1.7 1.3c.6.2 1.5 0 2 .8l-.3.4-1.3-.2-1 .2c-1-.4-2.2-.3-3.1-1q-2.2-.6-4.4-.8-1.5 0-3-.6l-4.6-1.1-2-.7q-3.7-1.4-7.7-2.3l-4.5-1-2.4-.8q-2.3-.5-4.3-1.2-3-1-6.1-1.5-1.2-1-2.8-1.1l-1.8-1.4.2-.5q1.1.5 2.3.7 1 .3 2 .2l3.2.2q1.9.1 3.6.8 1.4.7 3.2.8M265.4 55.3l1-1.3 1-4q.6-2 1.6-4t1.5-4.1q1.1-3.6 2.4-7c.6-1.9 1.6-3.6 1.9-5.5v-.2c1-1.5 1.1-3.3 1.8-5q.4-.8.5-1.8.4-2 1.6-3.5l.5-.4q.8.1.6.8.1 1.4-.5 2.7a7 7 0 0 0-.6 3.6l-.8 1.4-.1 1.3q-.2 1-.6 1.8c-1 1.4-1.2 3-1.7 4.6l-.2.8a7 7 0 0 0-1.5 4q0 .9-.5 1.6l-1.7 3.3v1.1l-1 2.1q-.2 1-1.1 1.7-.5.4-.5.9-.1 2-1.5 3.7l-.1.3c0 1.4-.8 2.6-1.3 4l-2.6 7-.7 2.2q-.6.3-.7-.5l.3-.8.5-1.8q.3-2.7 1.4-5.1 1-1.8 1.1-4m38.1 244.4-2-2.8-2.1-1.9q-1.7-1.6-2.3-3.9.5-.5 1-.1 1.5.9 2.6 2.5c1.4 1.1 2.3 2.6 3.8 3.7q1.8 1.3 3 3.1l.6.6 4.7 4.4q2.3 1.9 4.2 4 1 1 2.3 1.7l1 1.3.8 1 2.1 2q1.6 1.8 3.5 3.3l1.6.6c.7 1 1.8 2 1.7 3.5q-.5.7-1 .3-1-.4-1.5-1-1.6-2.2-3.8-3.9l-4.5-3.8q-1.9-1.8-4-3.4l-1.4-1.5-2-1.7q-1.4-1.1-2.5-2.6-1-1.6-2.5-2.5l-.6-.5zm23.8-38.1q-1.5-.1-2.9-1l-4.4-2.4-4.2-2.5q-2.2-1.2-4.5-2.2-.7-.6-.9-1.6l1.3-.5q.5 0 .8.3c2.3 1.6 4.9 2.6 7.3 4q3.5 2.2 7.1 4l5.6 3q.4 0 .6.3c.7.8 1.8 1 2.8 1.6l2.8 1.3q2.5.7 4.2 2.4l3 1.8 3.5 1.7 2.9 1.6q1.4.9 3.3 1.2l1 1.4q-.6.5-1.3.7h-.4c-2.3-1.8-5-2.7-7.5-4.1q-1.3-.5-2.2-1.2-.8-.5-1.8-.8c-1.4-.6-2.8-1-3.9-2.1l-.3-.2c-2.4-.7-4.2-2.4-6.3-3.4l-4.4-2.2zM172.5 370q0-1.4.3-2.5l.7-3.6q.1-1 .6-1.9l.2-.5c0-1.6.8-2.9 1.2-4.3v-.6q-.5-2 .4-4 .7-1.5 1-3.1.2-1.8.8-3.4.8-2.3 1.2-4.5 0-.6.3-1.1c.2-1 .7-2 .7-3 0-1.1.8-2 .6-3.1.7-1.6.6-3.3 1-5l.7-3.8q0-1 .8-1.4.9.1.8 1l-.2 3.6-1.4 7.3-.4 1-.3 1.6q0 1-.6 2l-.1.6c-.1 2-1 3.9-1.3 5.9q-.9 1.9-1 4l-.7 2.5-.5 1.2c-.1.4.2.8 0 1.4q-.6 2-.6 4 0 1-.4 2.1-.4 1.4-.4 2.7.1 1.8-.5 3.7l-1.7 1.6zm164.2-114-.5-.6q-1.4-.6-2.4-1.7-1.5 0-2.6-1v-.5q1-.3 2 0 2.9 1 5.8 2.3.8.3 2 .4 1.1 1.4 3.1 2 1.6 1 3.6 1.3l.4.2c1 1 2.5 1.2 3.7 2l2.7 1.2q2.3.8 4.5 2.1l.7.4c2.6.7 4.8 2 7.2 3q2.6 1.1 5.1 2.4l2.6 1q1.3.1 2.2 1.1l.3.7q-.6 1-2 .8l-2.3-1.2q-1.4-1.2-3.3-1.6l-.5-.2q-3.7-2-7.7-3.4l-6.4-3-2.6-1q-.9-1-2.7-1.2c-1-.2-1.9-1.1-3.2-.8l-.8-1-1.2-.5a10 10 0 0 1-3.8-1.8h-.2l-.8-.5c-1.1 0-1.9-1-3-1M77.2 308l1.1-2.3q1.6-1.4 3.4-2.4 1.8-1.1 3.2-2.5l1.9-1.7q.3-.4.8-.6 2.4-1.4 4.6-3.3l5-3.9 2.1-1.2q2-2 4.8-4l1-.7q2.7-2.4 5.7-4.5 2.2-1.6 4.2-3.5 1.2-1 2.5-1.4h.6l.2.5a3 3 0 0 1-1.2 1.7l-3.5 2.8-4.9 3.5q-1.3 1.4-2.8 2.3l-6.2 4.5-.6.5-3.8 3.3-1.8 1.5-2 1.6-1.4 1-2.4 2q-1.5.9-2.8 2.1-2.4 1.8-4.6 3.9l-1.8 1.2q-.7.5-1.3-.4m317-48.4-1 .3-1.3-.4q-2.6-.9-5.3-.9-2.1 0-4.2-.9-1.7-.7-3.5-1-2-.3-3.7-1.2-1.4-.7-3-.7-1.5 0-3-.9l-.9-.3q-1.4-.1-2.6-1-2-.1-3.8-1l-2.8-.8q-1.2-.2-2.4-.8-2.2-.9-4.7-1.4-2.6-.4-5-1.5-1-.5-2-.5a5 5 0 0 1-3.1-1.5q.1-.6.5-.5l2.1.4q3.1.8 6.4.8l.5.1q1.3 1.1 3.4 1.6c2.3.7 4.8 1.1 7 2.2l1 .2q1.3-.1 2.5.7.7.3 1.8.4.8.7 2.2 1l8.6 2.5q3.6 1.1 7.3 1.8 2.6.4 4.8 1.6 1.5.8 3 1.1zm3.1-90.8.8.5-.1.5q-1.5 1.3-3.6 1.3t-4.2.6l-2.7.7q-.7.3-1.7.2a4 4 0 0 0-3 .8c-1.7-.3-3.1.4-4.6.6-.9 0-1.7.5-2.6.5q-2.3.2-4.5.6c-1.7.1-3.4.8-5.1.8l-.8.2-1.9.4q-2.8.1-5.5 1a9 9 0 0 1-3.3.3h-1.1c-1.2.3-2.2 0-3.5-.1q3.8-2.8 8.1-2.9 2-.1 4-.5l4.3-.5 1-.2 1-.3q4.9-.3 9.5-1l3.6-.9 3.7-.5 4.8-.7 5.6-.8zM340.7 124l-3.2 2.2q-1.4 1.1-2.7 2.5h-1.7q-3.9 2-7.5 4.3l-2.6 1.4-2.5 1.4q-3 1.4-5.7 3-3 1.6-5.8 3.6-1.6 1.2-3.7 1.7l-1.3.4q-1.2 1.7-3 2.7l-.8-.5v-.5a8 8 0 0 1 3.2-2.7l2.6-1.4q2.2-.8 4.1-2.1.5-.4 1-.5 2.9-1.4 5.3-3l3.8-2.4 10.2-5.4 1-.8 4.1-2.3c1.5-.6 2.7-1.7 4.2-2.2l.4-.3 5.9-3.6c1.5-1 3.2-1.5 4.8-2.5a3 3 0 0 1 2-.4q.6.8-.2 1.4l-.6.2q-1.6 0-2.6 1.2l-.7.6q-1 .3-1.7 1a5 5 0 0 1-2.7 1.2l-.8 1.4-1.5.9zm-60.1-77c-1.2 1.2-1.6 2.6-2.3 3.8l-.1.6q-1 1.6-1.6 3.5l-1.6 4q-1.1 3.2-3 6.3l-.4.8-.5 1.3-1 1.4a5 5 0 0 1-.9 2.4l-.4.8-1.4 2.6-.5 1a8 8 0 0 1-2.1 3.5l-.5.7q-.9.2-.9-.5v-1l1-1.7q.4-1.5 1.4-3 1.4-2.7 2.6-5.6.4-1 .9-1.7c1-1.3 1.3-2.8 2-4.2 1-2.4 1.7-5 3.1-7.1l.1-.2c.4-1.9 1.7-3.3 2.3-5.1q.7-2 1.8-3.7l.9-2.1q.4-1.2 1-2.2l.8-2.1q.3-1.2 1.1-2 .8 0 .8.5c-.1.8.2 1.5-.2 2.2l-1 2.6-.3.9q-1.1 1.4-1 3.3M169 375.9l-.7.3-.5-.2q-.9-.5-.8-1.6v-2.3q0-.6-.3-1.1.4-1.9 1.4-3.3 0-1.4.6-2.6l.3-1.1 1.5-5.3.2-.7q.3-2.3 1.2-4.3.5-1.2.6-2.5c.2-1.4.8-2.9.8-4.4v-.2c.9-1.6.8-3.5 1.5-5.2l.2-.7q.2-2 1.1-4 .4-.7 1.2-1.4.6 0 .6.6.2 1.5-.1 2.9l-.7 3.2q-.2 1.4-1.1 2.4.1 2.3-1 4.2-.2 0-.2.3-.6 1.2-.7 2.5c0 .8-.6 1.4-.7 2.2l-.2 2.5-.2.9q-.8 2.4-1 5l-.3.9a16 16 0 0 0-1.3 5l-.3 3.3q-.1 2.3-1 4.7m39.4-332.6q.9 1.8.8 3.5v3.7c-.6 2-.3 4-.3 6.2v4.5q.4 2 0 4l-.2 3.9q.1 1.6-.2 3.3c.3 2.2-.2 4.5-.1 6.7v15.3c-.6 1.5.2 3 0 4.6q-.2 2.3.3 4.4-.2.9-1.2.6l-.6-1-.1-1.8q0-2-.3-4.3-.1-1 .1-2.3l.3-3.3q-.2-6 0-11.9l.1-2.1v-1.4q-.2-.7 0-1.3c.4-2.3 0-4.6.3-6.8l.1-2 .1-1.3q-.1-1.5.1-3l.1-3.6-.1-6.8-.1-5.3q-.2-1.2 1-2.5m132.4 139c2.1-1.6 4.7-1.5 7-2.6q1.5.2 3 0l4.4-.9c1.3-.4 2.7-.2 4-.6q.7-.2 1.9.1 3.2-.8 7-1.2 1.4-.2 3.3-.8 1.4.3 3.3-.1 1.6-.3 3.4-.4l3.1-.4h1q1.4 0 2.7-.3l1-.1 1.9-.3q.8-.3 1.8-.2l.4.6q-.7 1-1.8 1l-7.7 1-1.2.2c-2 .6-4 .6-6 1l-4.4.6-3 .3q-1.7 0-3.2.7-1.4.6-2.7.5-1.2-.1-2.3.2c-1.6.2-3.2.7-4.8.6q-1.2 0-2.3.4l-2.3.4-1.4.2-1.7.2q-.8 0-1.3.2a5 5 0 0 1-2.7 0zM165.4 302.2l1.5-.8.8.6q0 2-1.2 3.8l-1.4 2.5q-.8 1-1 2.3 0 .3-.3.5c-1 1.7-1.3 3.7-2.4 5.3-.4 1.7-1.4 3-2.1 4.6q-.8 1.5-1.2 3l-.9 2-1.6 3.6-.4.9q-2.1 3.9-3.6 8.2l-.3.7q-1.9 3.5-3.6 7.1l-1.9 5q-.3 1-1.3 1.8-.6 0-.7-.7-.2-1.3.6-2.4.8-1.5 1.4-3.2l1.3-2.3q1-1.5 1.4-3 1.3-3.4 2.8-6.7l2-4q.8-2.4 2-4.6.5-1 .9-2.4l.7-.7q.4-2 1.5-3.8l.9-1.7q.2-1 .8-1.7.3-.2.3-.5 1.4-3 2.3-6.2.3-1.7 1.3-3.2l.2-.6zm-79.6-66.1q-.8 1-1 1c-2.5.7-5 1.8-7.5 2.3l-1.2.1q-.7 0-1.7.4-2.4.8-5 1.3c-3 .5-5.8 1.5-8.8 2q-2 .6-4 .9-1.2.2-2.3.8-1 .5-2.1.5l-1 .2c-1.3.6-2.7.6-4.1 1l-.4.1-6.7 2q-2.4.8-5 .8-.6-.3-.5-1 .3-.6 1-.7l6.6-1.8q2.5-.7 5-1 1.5-.3 3.2-1 2.2-.7 4.7-1.1c.9-.2 2 0 2.7-.9 1.2-.1 2.2-.7 3.4-.7h.4c1-.6 2.1-.4 3.2-.6q2.3-.4 4.4-1l3.3-1 3.4-.8 2.7-.8 1.5-.3 4.2-.7zm-45-10.8q.7-1 1.5-1.4 1.5-.2 3 .3l3.4-.8q2.6.2 5.6-.3 1.2-.3 2.7-.2 1.7 0 3.4-.4 3-.6 5.8-.6 2.4 0 4.7-.6t4.8-.7l5.8-.3c2.3-.6 4.6-.2 6.8-.4l1.6-.2 2-.1q.7-.1 1 .7 0 .5-.6.7-.7.5-1.6.5h-1.4q-2.2 0-4.3.3a22 22 0 0 1-4.2.5q-2.8 0-5.5.6l-2 .2q-3 0-6.1.5l-2 .2q-2 0-4.3.3l-3 .2-6.5.4-1.3.3q-3 .8-6.2 0c-1 .1-1.9.7-3 .3&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M336.6 256q.4.7 1.1 1l1.4 1 4.8 2.2.7.4c1.6.3 2.9 1.4 4.3 2.2q1.8 1.4 4 2l.8.5q.7.6 1.7.8t2 .9q1.2.8 2.5 1.3l1.4.7 3 1.5q.5 0 .7.3 1.4 1.3 3.1 1.3c.6.5 1.2.7 1.4 1.4q-.4.8-1.2.8l-1.2-.5-6-3.3-5.2-2.2-4.5-2.3q-1-.8-2.2-1.1l-1.8-.8-2.4-.8c-1-.5-1.6-1.6-2.8-1.4a16 16 0 0 0-5.5-3q-2.2-.6-4.3-1.8-2.4-1.3-4.9-2.4-2-1-3.4-2.5.1-.7.7-.6.8 0 1.3.3 1 .4 1.7.9l1 .4q.8 0 1.5.6l1.5.6 1.5.5 2 1.3q.9.2 1.4-.2m72.1-95.6.9.8-.3 1c-1.1.8-2.3.6-3.6.6a4 4 0 0 1-3.1 1.2q-.7 0-1.5.3c-1.3.5-2.7.5-4 .8l-1.4.1q-1.7 0-3.2.7a6 6 0 0 1-2.6.7q-1.6-.1-2.6 1H386c-1.5-.4-3 .3-4.4.4-1.7 1-3.7.7-5.5 1.3q-1.5.4-2.9 1-1.6 0-3.3.3a13 13 0 0 1-3.5.4q-1.2.1-2.4.5l-4.4 1q-1 .5-2.3.3-.8 0-1.5.3-1.3.7-2.7 1l-3 .8-.6-.5.3-.4q1.4-.8 3.3-1 1.5-.2 3.2-.8 3-1.3 6-1.6h.4c1.3-.8 2.7-.8 4.1-1l5-1 7-1.3q2-.6 4-.6.6 0 1-.3l2-.5q.5 0 .8-.2 2-.9 4.1-1l4.2-1q1.2-.5 2.3-.2h.6q1.2-.6 2.4-.7l2.5-.5q.7-.1 1.7-.7c1.5.3 2.8-.6 4.3-1.2m-29.3 20.8q-.2.8-.9.8c-2-.2-4 .5-6 .3q-1.2 0-2.3.3l-2.4.2q-1.3 0-2.6.4-2 .6-4 .7l-7 .7c-2 .1-4.1.8-6.2.5-1.8.3-3.6.2-5.3 1l-2.3.3q-1.2.3-2.3 0l-2.5.6-1.7-.5q0-.5.3-.7c1.2-.8 2.4-1.6 4-1.5.9.1 1.7-.4 2.6-.2q1-.3 2.1-.2h1.2c1.6-.6 3.2-.6 4.8-.9l4-.3q1.8 0 3.5-.5 2.4-.5 4.9-.5l3.3-.1h.6c1.3-.7 2.8-.5 4.2-.5q1.4.1 2.7-.5 1.5-.7 3.2-.3 1.2.2 2.5.2 1-.2 1.6.7m-156.5 184h-.9l-.5-1.2q.6-1 .2-2.2v-2.1c-.5-1.8-.2-3.6-.3-5.4l-.2-2-.1-1.3-.2-1.8a8 8 0 0 1 0-3.6v-.6q-.5-2.1-.3-4.3l-.2-2.1-.1-2.8q0-2.8-.3-5.8l-.1-1.3q0-1.2-.2-2.2-.5-2.2 0-4.6l-.3-1.2v-8.1q0-1 .3-1.8.7-.4 1.1.2l.2.5c0 2.6.5 5.2.3 7.8q-.1 2.2.1 4.4v.8q0 3 .3 5.8.3 2.4.2 4.7l.1 2.5.1.6c-.5 2 .3 3.8.1 5.6.5 2 .2 4 .4 6v5.7l.6 7.2c0 .8.3 1.7-.3 2.6M86.6 168.6q0 1.3-1.4 1.6-2.5-1-5.1-1.6c-1-.2-1.7-.8-2.6-.8q-1.9-.2-3.6-.8l-3.5-1-6.6-1.6-3.8-.9-.6-.1q-2.6-1-5.2-1.3l-5.4-1a9 9 0 0 1-5.2-2.7q.1-.5.6-.5 2.3-.3 4.4.5 1.7.8 3.5 1 .8 0 1.8.6 2.4-.1 4.8 1l3 .6h.6l5.2 1.7 4.9 1.4 2.6.5.8.2q.9.6 2.1.8l2.3.6zm-13.9 66.3 1.6.4q.2.7-.3.9l-1.1.4-7.8 2-3.2.8-2.3.4-6.9 1.4-4.3 1q-1.6.4-3.3.6l-5 1.3-5.3 1.5q-2.1.3-4 1.3c-1.9 0-3.4 1-5.7 1q-1.4-.1-2.4-1 .8-1 1.8-1.4h1.2q2 0 3.8-.5l6-1.3q3.6-.7 7.3-1.8a39 39 0 0 1 5.7-1.3q1.5-.1 2.9-.5 1-.2 2-.7 1.8-.8 3.9-1l7.6-1.5zm275 6.2a4 4 0 0 0-1.8-1q-2.3-.9-4.6-1.5l-3.8-1-1-.1q-2.2-1-4.4-.8l-4-1.3-.9-1.3q.3-.4.5-.4h1l1.8.4 1.2-.3h1.5l5.3 2 1 .3c1.7.5 3.5 1.3 5.3 1.5l2.4.8q3.4 1.2 7 2l.6.4 1.5.1q1.7.7 3.5 1l2.2.7q2.1.7 4.2 1l1.5.5 4.2.5q1.2.2 2.3 1 1.4.8 2.9 1.2.6.1 1.4.7a1 1 0 0 1-1.3.2c-1.4-.7-3-.7-4.4-.8q-.8 0-1.3-.2-1.7-.9-3.8-1.5l-1.4.5-1.2-1q-.6 0-1.1-.2-2.7-1-5.5-1.4l-2.8-.8-5.3-1.5zM302 110l-.5.9q-1.9 1.6-3.2 3-1.1 1.4-2.4 2.3t-1.8 2.3a9 9 0 0 0-2.6 2.6q-.8 1.2-2 2.1l-1 1q-1.3 2-3.2 3.5-.8 0-.7-.7v-.2l3.7-4.8 1.7-1.5.9-.8q1.6-2.2 3.7-4l2-2q3.1-3.5 6.2-6.6.9-1.2 2-2.2l3.3-3.5 1.7-1.9 2-2q2.3-1.8 3.8-4.3 1.5-2.6 4-3.9l.6.3q.3 2.2-1.3 3.3-1.8 1.5-3.3 3.3-1.4 1.6-3 3l-2.7 3-2.2 2.3-.6.5q-1.4 1.7-3 3.3l-2 1.6zM47 252.4l-1.1-.6c-.1-.8.4-1 .7-1.4l5.6-1.7.4-.1q2.5-.3 4.7-1.3l1.3-.3 3.8-1 2.2-.8 7.5-2.1 1.9-.4 5.6-1.6 3.2-.9 1-.2q2.3-1.2 4.9-1.6l.4-.1q1.6-.7 3-1h2.4q.4.1.7.4 0 .8-.6 1-2.9 1.3-5.9 1.6-1.2.1-2.2.5l-4.9 1.5-3 1-.9.1-1 .2q-2.2.7-4.5 1l-5 1.6c-1.6.5-3.3.7-4.9 1.4q-.6.2-1.3.2-1.8.5-3.5 1.2l-1.5.5c-1.7.3-3.3 1.2-5 1.4q-.4 0-.8.4l-1.1.6q-.9.4-2.1.5m258.2 43.4-3-2.8-2.6-2.3q-1.9-1.4-3.5-3.4l-2.2-2.2-.5-.8v-.4l.4-.4q1.3.2 2.4.8l.7 1.6.4.2q.7-.1 1.2.4 1.4.9 2.3 2 1.3 1.8 2.8 3c1.6 1.5 2.9 3.3 4.6 4.5q2 2.2 4.3 4l.6.8q2.2 2.6 4.9 4.7l.6.5q.8 1.5 2.3 2.3.7.6 1 1.3l2 1.6 1.7 1.7q1 .8 1.6 1.6.2.8-.2 1h-.5l-.8-.6a8 8 0 0 0-3-2.5 30 30 0 0 0-5.3-4.8l-1.5-1.3q-1.5-1.8-3.4-3.1l-2.2-2q-1.2-1.5-2.9-2.5a5 5 0 0 1-2.2-2.9M318.4 171c-1.2 0-2.2.4-3.3-.2l.3-.4 1.6-.9c1.7-.1 3.5-1 5.3-1.6 1.8-.4 3.4-1.3 5.4-1.2l2.3-1.5q2-.1 4-1l5-1.4 4.5-1.5 1.7-.5h.4c1.6-1 3.5-1.1 5.2-1.7l5.5-2 6.1-1.9q1.5-.3 2.8-1c.7 0 1.4-.2 1.9.6l-.8 1.5c-1 .5-2 0-3.1 0l-1.4.6-.3.1q-1.9 0-3.3 1a10 10 0 0 1-3.5 1.8l-3.2.7q-1.5.3-3.1 1l-1.9.5q-1 0-1.8.6l-.4.2q-2.7.6-5.4 1.6h-.1c-2.7.4-5 1.7-7.4 2.5-.7.2-1.4.1-2 .7l-1.7 1-2.7.3a8 8 0 0 0-3.2.8l-.5.1q-1.6 0-3 1.2m87.4 97.7q-1.4.5-2.5.2l-2.7-1q-2.4-1.2-5.1-1.8-.7 0-1.3-.4l-2.2-1c-.6-.3-1.6 0-2.1-.7l-2.3-.5-3-1-4.2-1.2-6.7-2-2.6-1q-1.9-.6-3.9-1l-3.9-1.3-3.8-1.4-1.9-.6-.7-.3-4-2.6q0-.9 1-.7a5 5 0 0 0 2.3 1q.8.2 1.4.6 1.5.7 3 1l.7.2q2.4 1.2 5 1.7l.5.2q1.9 1 4 1.7l4 1.2q.6 0 1.1.4l2.8 1 4 1.3q1.6.6 3.2.8 1 .1 2 .6l.8.3 5.4 1.6c1.5 0 2.8.7 4.2 1q.8 0 1.4.4 2.3 1 4.8 1.7 1.2.2 1.3 1.6m-18.1-105.3-4.1.6q-4.5.9-8.7 2.2c-1.4 0-2.6.7-4 1l-3.7.9-2.2.3q-1.8.4-3.5 1c-1.7 0-3.2.8-4.8 1q-1.2 0-2.3.4-3.8.7-7.6 1.7l-.9-.5c.4-1 1.3-.6 2-.9l2.1-.7 1.3-.9q.7-.4 1.6-.5l4-.7 2.9-.6 4-1q2.3-.6 4.5-.8 1.2 0 2.2-.3 2-.4 3.9-1l.6-.2c1.9 0 3.6-1 5.5-1.2l1.3-.4 2.3-.5q1.3 0 2.5-.8l.4-.2q3.3-1 6.8-1.6 1.3-.3 2.3.5 0 .6-.6.8l-1 .2c-2-.2-4 1-5.9 1.6zm-211.7-59h-.8q-1.1-2-1-3.7l-1.4-3q-1.1-2.6-2-5.6l-.8-1.6q-.8-1.6-1.3-3.4-.7-2.5-1.7-4.8l-.6-1.6q-.2-1.5-1-2.6l-.5-1.2q-.9-2.8-2-5.5-.9-2.9-2.2-5.6c-.3-2-1.5-3.7-1.8-5.7q-.4-1.4-1.4-3c.1-1.4-1-2.8-1.6-4.4l-.8-2.4.6-.3q1 1 1.4 2.1l1 2.5.2.6c.2 1.5 1.2 2.6 2 3.5l1.2 3.7 1 3 .4 2q.8 1 1.3 2.4l1.9 6c.5 1.5 1.3 3 1.6 4.6q.9 1.2 1.4 2.5l.4.9q.2 1.6 1 3.1l.7 2q.9 3.2 2.1 6.3l1 3.2q.1.7.5 1.6.5 1.3 1.2 2.5.3.7 0 2m157.7 226.3v1.3q-.2 0-.5.3-.7 0-1.2-.5l-1.9-2.1q-1.5-.7-2.7-2l-1.4-1.4q-.7-.5-1-1.1-1.4-2-3-3.6-1-1.2-2.2-2.2-.8-.5-1.3-1.2a10 10 0 0 0-2-2l-1-1.2-4.3-4.1-2.8-3q-.5-.6-1.2-1-1.7-1.1-3-2.7l-3.4-4-.5-.9.3-.6h.5q2 .7 3 2.5 2.2 2.6 5 4.9l.3.2 3.9 4 1.8 2.3.9.8.9.7q.5.9 1.4 1.6l6 5.8 1.5 1.6q.8 1 1.8 1.7l1.5 1.5q1.1 1.3 2.5 2.2a7 7 0 0 1 2 2.2m-268-75.2-1.6 1q-.9.5-1.8-.4l.8-1.2.5-.2q1.5 0 2.7-.8 1-.8 2.2-.8.4 0 .9-.4l1-.3q.8-.1 1.3-.4l3.3-1.2c2-.9 4.2-1.4 6.2-2.5l.7-.3c1.5 0 2.8-1 4.3-1.3q2.1-.5 4.1-1.5 1.4-.7 2.8-1a125 125 0 0 1 13.7-4.2l1.7-.7q2.4-1.2 5-1.3.5 0 .8.6l-.4.4q-.8.5-1.7.7c-1.5.2-2.8 1-4.2 1.4l-4.3 1.4-7.2 2.4q-1.2.5-2.6.8l-5.5 2-7 2.5-6.8 2.3q-3 1-5.6 2.2-1.4.8-3.3.8M346.7 95.5l1.4-3.1 1.7-.2q1-.7 1.4-1.7.2-1.7 1.8-2.1l1-.5 1-1.2a10 10 0 0 0 4.5-3q.6-.8 1.6-1.4l4.4-3.9 1.5-2.8q1.2-1 2.3-.9l.2.3v.4l-.1.3q-1.2.8-2 2l-1.7 2-.6 1.6-1.7 1.7q-.7.4-1.3 1-1.7 2-4 3.2l-.9.8c-1 1.2-2.2 2-3.2 3.3q-.7.7-1.5 1.2-2 1.6-4.3 2.7-1.5.7-2.3 2.2l-.2.1q-1.6 1-2.7 2c-.9 1-2.3 1.4-2.9 2.8-1.4.9-3.1 1.5-4.1 3.2-1.4.1-2.4 1-3.3 1.8l-1.7 1.4a5 5 0 0 1-2.5 1.3q-.6-.1-.6-.7l.2-.4 5-3.3q1.2-.6 2.3-1.4l2.6-2 4.3-3.4q.3 0 .5-.3 1.7-1.7 4-3m-98-43-1.3-.2.1-.3 1.8-.8c.6-.8 1-2 2.3-2.5q.4.2.3.6-.1 2.2-1 4.2-1 2.5-1.4 5.2v.2c-1.2 1.8-1.1 4-1.8 6s-1 4-1.9 6l-.4 1.4q-.2 1.4-.9 2.6-.4.9-.4 1.9 0 2-1.2 3.9a6 6 0 0 1-.5 2.8 8 8 0 0 0-.7 2.8c0 1-.5 1.9-.7 2.8l-.8 3-.2 1.8-1.3 1.1c-.7-.3-.6-.9-.7-1.4q.8-1 .6-2.3l.1-1.2 1.4-4.4q.9-2.2 1.3-4.3l1-4 .7-2.4q1-4.7 2.4-9.5.9-2.7 1.5-5.6l.3-.7q.6-1.5.8-3 0-.7.3-1.3.5-1 .3-2.4m-21.6 313.9-1-1v-2c.2-2.1-.3-4.3 0-6.7q-.5-.8-.4-2l-.4-3.7v-2.7q-.6-1.7-.4-3.5l-.2-2q0-2.4-.7-4.7v-.2q0-2.6-.2-5l-.5-5-.2-3.8q0-1-.4-2.3c.5-1.8-.3-3.8.3-5.8l.8-.1.8 1.2.2.5q-.1 2.3.3 4.4-.2 1.5 0 3l.7 6.3v2q.3 2.7.2 5.4l.2 2.3q.3 2.1.2 4.1l.4 3.9v5.4A48 48 0 0 0 228 365q.4.9-.8 1.5M106.4 151.9l-.5.6h-.4l-4-1.5-3.1-1.5q-1.8-1-3.8-1.6l-1.6-.7-6.7-3.6-3.8-2-.5-.2c-1.1-.1-1.9-.9-2.5-1.4l-2.8-1.3q-1.4-.9-2.9-1.3-.3 0-.6-.4l-4-2.2-.9-.2a4 4 0 0 1-2.3-1.7l-.2-.8 1-.5 1.8 1q3 1.8 6.3 3.3l3.7 1.8 6 2.8 4.6 2q2.3 1 4.4 2.4 2.8 1.6 5.7 3a37 37 0 0 1 7 4m275.1 116.9c1.3.3 2.8.2 3.6 2l-.8.4q-1 .3-1.7 0l-1.6-.9q-.8-.5-1.8-.7l-.7-.3-7.4-3.1c-1.9-1-4-1.5-6-2.4l-1.3-.7-.7-.3c-1.5 0-2.5-1-3.7-1.6l-1.4-.6q-1-.2-2-.8l-1-.3q-.6-.1-1.4-.5c-1.4-.9-3-1.1-4.5-1.8l-4.6-1.7q-1.9-.7-3.6-1.6-.4-.7.3-1c2.2.5 4.5.5 6.7 1.5l4.6 2q1.8.9 3.6 1.5l1 .3 2.2 1.5 2.6.8q3.4 1.2 6.4 2.8l1.1.5 6 2.3q2 .6 4 1.6zM348.6 88.3l.4-1q.4 0 1-.4l.6-1.2.8-1.1.7-.3a7 7 0 0 0 3.3-2.5 7 7 0 0 0 2.5-2q.7-.8 1.9-1.4.6-.2 1-.6 1.4-.9 3-1.5l.2.2q0 .3-.2.4-1.4.8-2.4 1.9l-3.6 2.7a6 6 0 0 1-2.3 2.8l-.8.8-1.7 1.4-2.5 2-1.6 2.1-4.8 3.5-4 3.4-2 1.8-3.9 3q-1 .7-1.6 1.6l-1 1-1.6 1q-1.6 1-2.9 2.4-.3.4-.7.6-1.4.5-2 1.7-1 .2-1.4-.5 0-.3.2-.5 1.7-2 3.7-3.4 1.7-.8 3-2.3l.5-.5q3.1-2.3 6-4.7l1.5-1.3 1-.9q2.5-1.7 4.6-3.9l3.3-3q.8-.8 1.8-1.4m21.1 152.6-.5.7-.8-.2q-4.2-1.6-8.7-2.2l-1.5-.5q-1.5-.5-3-.7h-.6c-1.3-.8-2.7-.7-4.1-1s-2.7-1-4.2-1h-.6l-7.4-1.7-1.9-.2q-.9-.6-2.2-.7l-1.2-.2c-1.8-.8-3.7-1-5.6-1.4l-4.2-.8q-1.6-.4-2.6-1.6l.5-.6c.8.2 1.6 0 2.4.4q.4.2 1 .2l2.3.3.5.1q2 0 3.7.6l.3.1q2 .2 4 .8l2.2.8 3.2.6 5.9 1.5c4.2 1.1 8.3 2.6 12.6 3.4l2 .4 3 .9 4.7 1.5q.4.1.8.5m-203 105.7q1 .1 1.3 1 0 1-.5 2.1l-1 2.5c-1 2.6-1.4 5.3-2.3 7.8l-1 3-.3 1-1.2 4.4-1.4 4.7-1.2 4.1.2 1.8-.8.6c-.7 2.1-1.5 4.4-1.4 6.7-1.3 2.4-1.3 2.4-2.5 2.4q-.3-1 .5-2.7c-.3-1.4.3-2.8.9-4.3q-.3-1.7.8-3.2 1-1.8 1-3.7.3-2.4 1.3-4.3l1.1-3.1q.2-.7.1-1.6c0-1 0-1.7.8-2.5q1-1.2 1.1-2.8l1.3-5.8a9 9 0 0 0 2.3-5.2q0-1.5.9-3m67.9-244.8q-.6-.2-.6-.8c0-1.1 0-2.2 1-3l-.3-1.4.1-1.2c.4-1.2.2-2.6 1-3.7V91q.7-3.7 1.6-7.2l.4-2.5q.5-3.2 1.4-6.3l.3-1.5q0-.8.2-1.3.6-1.3.6-2.7.1-2 .8-4c.5-2 1.2-4 1-6q1-2 1.2-4.1 0-1 .7-1.8.6-.4 1 0l.2.4q0 1.5-.5 3-.7 1.5-.4 3l-.8 1.3q0 2.8-.9 5.5c0 2.1-.9 4-1.2 6.1l-.2 2-.6 1.5q-.4 1-.3 2 0 .7-.2 1.3l-.9 2.6c-.2.8 0 1.6-.4 2.5q-.9 2-1 4.3 0 1-.3 2l-.7 3-.2.9q-1 2-1.2 4.3l-.4 1.7q-.1.3-.4.5m99.9 86.5 1.6.2 1.8-.6h1.2q1.5.3 2.8-.2l2.5-.3c2 .2 3.9-.4 5.8-.4a20 20 0 0 0 4.5-.4c1.3.3 2.6-.2 3.9 0h.3c2-.6 4.2-.3 6.2-.7h1.4q2.5 0 5-.4l2.4-.1.6.2q.1.5-.2.8-1 .6-2.2.7l-2.4.1a6 6 0 0 0-3.7 1.3h-11.6q-1 0-1.7.2-1.2.3-2.3.1l-3.3.1-3.4.2-5 .5-1.5.1-2.4.3q-3.2.6-6.5.5l-.5-.2q-.2-.4.1-.7l.7-.3c1.4.2 2.7-.5 4.1-.3q1 0 1.8-.7M109.6 92.8q-.5.9-1.1.6l-2.9-3.1q-2.5-3.2-5.2-6.3-2-2.7-4.2-5.1l-1.7-2.4q-1-1.2-2.1-2.2-1-1.2-2.2-2.2l-.4-.4q-2.4-2.9-5-5.2l-.9-1q-.1-1.1-.5-2.4l-1-2.9v-.5q.8-.1.9.5.7 1.4 1.9 2.2l.7.9q.6.8 1.4 1.4l.8.8q1 1.5 2.4 2.8l.6.7q2 2.7 3.7 5.5 0 .3.3.5 1.5 2 3.2 3.9 1.6 1.6 3 3.3c1.4 1.4 2.3 3.3 3.8 4.6l3.4 4zm70.9 270.8-.9.3c-1-1-.3-2.2-.6-3l1.4-3.3c-.5-1.4.1-2.7.3-4q.8-3 .8-6 .1-1.1.5-2.3.4-1.6.6-3.4l.6-3.5.2-1.7.2-1q.8-2 .9-4.1.2-1.8.7-3.5.7-2.4.9-5l.6-4q.2-1.3 1.3-2 .3 0 .4.3.3.7.1 1.3c-.3 1.1 0 2.2-.3 3.3l-.6 3q-.6 2.3-.7 4.5v.2l-1.3 6a15 15 0 0 0-.6 3.7q-.2 2-.8 4l-.7 4.2q-.1 1.2-.7 2v.6q-.2 3.6-1.3 7-.4 2-.5 4l-.1 1.1zM256.3 43q1.1-1.3 2.2-2.2.5 1 .1 1.8-1.1 3.2-2 6.5-.5 1.1-.6 2.4c0 .8-.7 1.5-.5 2.3v.4c-1 1-.8 2.3-1.4 3.4l-.5.8-.1 2.2c-.7 1.7-1.7 3.3-2 5.2l-1.5 7q-1.6 3.5-2.5 7.4c-.5 2-1.4 3.9-1.8 6q-.2.9-1.2 1.3c-.8-1.2 0-2.2.3-3.6l-.1-1q0-.6.4-1.4.9-1.5 1-3.5l.3-.5c.7-1.2.8-2.6 1.3-3.9.3-1 .2-2 .6-2.8l1.2-2.7 1-3.8q.3-2.2 1.3-4.2.4-.8.6-1.7.6-3.1 1.6-6.2.6-1.5.7-3t.8-3c.4-1 1-2.2.8-3.3m27 15.5h.6q.5 1 0 1.9l-1.6 2.5q-1 1.3-1.4 3l-.2.5q-.8 1-1 2.2 0 .8-.6 1.2l-1.4 1.6c0 1.5-1.2 2.7-1.5 4.2q0 .3-.2.4c-1.2 1.2-1.7 3-3 4.1a17 17 0 0 1-2.1 4q-1.6 2.2-2.5 4.6l-1.2 2.7-.3 1.3-1.3 1.7-1 1.3-.5 1-1 1.1-.7 1.5-.8.5-.5-.7q.2-1.5 1-2.8l1-2q.6-1.8 1.9-3.2c1-1.5 2.2-3 2.7-5q0-.3.4-.6c1.6-2 2.6-4.5 4-6.7l.5-1q.3-.8.9-1.5l.5-.8q1-2.3 2.2-4.3l.8-1.8.4-.7q.9-.9 1.3-2.1l1.6-3.1.7-1.4q.8-2 2.3-3.6m7.2 219q0-.3.4-.6 1.3 0 2.3.7a18 18 0 0 0 3.7 3.7q1.2.9 2 2.1 1.4.5 2.2 1.5l.9.8q.9.6 1.5 1.5l.8.8 5 4.5c1 1 2 2 3.2 2.8l.4.4c1.3 1.7 3 2.8 4.6 4.2l2.5 2.4 1.1 1 4.9 5 .7 1q-.3.7-.8.3l-4-2.8a19 19 0 0 0-4.6-4.5q-1.2-.9-2.1-2-1.1-1.4-2.7-2.5-.6-.4-1-1a9 9 0 0 0-2-2.1q-1.1-1.2-2.7-2.1-.7-.4-1.2-1l-2.1-1.8-3.6-3.3-.5-.6a6 6 0 0 0-2.4-2q-1.6-1.4-2.8-2.8a9 9 0 0 0-2.3-1.8q-1-.6-1.4-1.8M30.8 147q-1.2-.7-1.9-1.8 0-.9.7-1h.4q2.5.5 4.8 1.5c1.5.7 3.3.8 4.5 1.7q1.4 0 2.3.3 1 .1 2 .8 1.2.9 2.7 1l1.7.5 1.2.5 4.9 1.4q2.2.6 4.3 1.7 1.6.9 3.4 1l1 .2q2.4 1 5 1.8.6 0 1 .3 2.4 1.4 5 1.1h1l1.4.9.2.9q-.7.5-1.4.3l-3-.9-3.5-1.2-4.3-1.3-4.4-1q-1.9-.4-3.7-1.2-1.6-.7-3.3-1l-1.3-.4q-1.9-1-3.9-1.3l-1.6-.7-3.3-1.1-2.6-.8q-.9-.5-1.9-.5l-.7-.2a14 14 0 0 0-4.4-1q-1-.1-2.3-.5m62 182-.6-.7q.6-1.5 1.8-2.6 1.7-1.5 3-3.5.5-.6 1.2-1a9 9 0 0 0 2.4-2.8q1-1.4 2.3-2.6l2.4-2.6q.6-.6 1.3-1.8.7-.3 1.4-1.4c2-1.7 3.3-3.9 5.3-5.4q.6-.5 1-1.2l2.3-2.4q1-.7 1.7-1.9 1.5-2 3.7-3.7l1.3-1h.4l.3.3v.4l-.8 1.1-3.5 3.9q-3.1 3-6 6.2l-3.5 3.9-.8 1.1q-.4 1-1.2 1.5-1.3 1.1-2.4 2.5l-3 3.2-2 2.5-2.6 3-2.5 3.2q-1 1.5-2.9 1.9m12.7-91.1c-1.2 1.2-2.5 1.5-3.8 2-1.2.3-2.3 1-3.6.7q-3 1.8-6.1 2.3-.8 0-1.5.6l-.9.3q-2.6.3-5 1.4l-1.5.4-5.3 1.6q-2.4.7-4.9 1.8-1.2.5-2.6.8-1.2 0-2.3.4l-2 .8q-3.2 1-6.4 2.4-2 1-4.5.3l.4-.6q1.5-1 3.1-1.2h1c2.4-1 4.9-1.4 7.2-2.4q2-1 4-1.5.8-.1 1.5-.5l3-1q1.2-.2 2.2-.8l1-.5 4.1-1.1q2.7-.7 5.3-1.6 1.7-.8 3.6-1.3 1.5-.3 2.8-1c1.4-.6 2.8-1.4 4.4-1.3l1.5-.5q2.3-1 5.3-.4M272.2 24.3l1-1.4q.3-.4 1 0c.4 1.2-.4 2.1-1 3.2q0 1.3-.6 2.5-1 2-1.3 4.3l-.3 1.3-.5 1.5v1.1l-1.7 3.5c-.6 1.1-.2 2.3-.5 3.5l-.4.6a6 6 0 0 0-1.7 3.5q0 .6-.4 1.3-.4.6-.4 1.5l-.3.9q-1.1 2.3-1.5 4.8-.3 1.5-1.2 2.8c0 1.6-.9 2.9-1.3 4.3l-.5 1.9q-.2 1.1-.8 2.2-.2.7-1 .3l-.2-.6q0-1.5.6-2.9 1-2.7 1.8-5.5l1.8-6c.6-1.9 1.5-3.6 1.8-5.6l.8-2.1q1.2-2.6 1.8-5.1 0-.5.2-.8 1-1.8 1.2-3.9.6-2.9 1.8-5.5.8-1.2.9-2.6 0-.5.3-1.1l.6-1.6zm96.8 166q0 .3-.2.5-2.3 1.1-5 1l-1.2.1q-.9.4-1.9.3-1.6-.2-3 .3l-6.3.1h-.7q-1 .6-2.1.2-1.7-.3-3.3-.1h-3.7q-2-.2-3.9.1h-1.5q-3.2 0-6.3.4l-1 .1h-6l-1 .2-.5-.4.2-.4q.6-.5 1.4-.4 1 .2 2-.3l2.4-.3 2-.2 6-.6 1.7.2c1.4.3 2.7 0 4 0q1.2-.2 2.2 0h.7q3.6 0 7-.2 2 .2 3.7-.3h.4q2.3 0 4.3-.2t4.1-.2l2-.2c1.2-.4 2.3 0 3.5.3M54.6 171l-.4-.6.2-.5.3-.3q1.1-.4 2 0l6.6 1.3h1l1.6.4 2 .6 3.3.7.4.1c1.8-.4 3.3.6 4.9.9h.2c2 0 4 1 6 1l1.5.3q2.3.5 4.8.8l4 1 6.5 1.7h.6q1.5.2 3 1v.7l-.4.3q-1 0-1.9-.2l-3.6-.8c-2.4-.3-4.8-1.2-7.2-1.5l-4.2-.8-5.5-1-2.3-.6q-2.7-1-5.5-1.4c-2.3-.6-4.7-.8-7-1.4l-6-1.2zm63-63.7q-.8.7-1.3.1l-2-1.4-.9-1.6-3.9-5q-2.4-2.9-5-5.5l-1.4-1.4q-.6-.9-1.5-1.5t-1.1-1.3q-.5-1-1.4-1.7l-.8-.8A61 61 0 0 0 93 82l-2-2-.8-1-1.6-1c-.6-1.5-2.4-2.2-2.8-4.1l.4-1h.5c1 .6 1 .6 1.7 1.8l2.6 2q.7.5 1 1.1 1.5 2.1 3.6 3.5l1.4 2.2c.4.8 1.2 1.2 1.5 2q0 .3.4.5 1.7 1 2.7 2.7.4.8 1.2 1.3a6 6 0 0 1 2 1.8l.7.9c.7 1.6 2 2.6 3 3.8l.6.5c1 1.7 2.6 3 3.9 4.6l3 3q1.2 1.1 1.5 2.7M77.8 170q1.5.7 2.9 1 1 .1 2 .5l4.8 1h.8q2.4.9 4.9 1.2 1.2.2 2.1.9l.2.3q-.6.4-1.5.6l-1.2-.2c-2.3-.7-4.8-.8-7.1-1.8q-1-.4-2.3-.5-2.8-.4-5.5-1.2l-3.4-.7-2.7-.6q-1.4-.5-2.8-.6h-.6c-2.4-1-5-1-7.4-1.7l-3.4-.9h-1.7c-1.3-.6-3-.6-4.5-1.6q.4-.5.7-.6 2.4-.8 4.6 0 1.3.7 2.7.4 1.2.9 2.7 1l1.5.2q2 .6 4.3.7 1.2.1 2.4.7 1.7.7 3.5 1l2.4.8q.7.4 1.6 0zm304-11.3 1.6-.7 1.4-.5q.5 0 .5.8c-1.1.5-2.2 1.3-3.5 1.3l-1.1.4q-3.2 1.4-6.6 2.4l-3.2.8c-1.5.4-3 .6-4.3 1.5h-2q-1.5 1-3.4 1-1.6 0-2.8.6-1.5.6-3.2.9l-1.2.3-2.8.6-.8.2q-3.4 1.2-7 1.8-1.4.3-2.7.8l-.9-.2q-2.3 1-5 1-.2 0-.5-.3.3-.8 1-.9l2.8-.7a52 52 0 0 0 6.9-1.6l5.8-1.6 6.8-1.5q.5 0 .8-.2 1-.5 2-.6l1.9-.6 2.6-.5 1.3-.3 5.1-1.4.7-.3c2.2-.3 4.2-1.3 6.4-1.7zm-288-64-1.2-.1c-1.2-.8-1.3-2.5-2.4-3.3l-.3-1.5.6-.3q.3.2.5.6c.9 1.4 2.3 2.4 3.3 3.7.4.5 1 .5 1.4 1l1.6 1.7q3.9 3.4 7.5 7 1.6 1.6 3 2.5l2.4 2.7 4.8 4.3.8.8q.7 1 1.6 1.7l1.8 1.6q1.5.7 2.9 2.4t3 3.1c.8.9 1.7 1.8 1.8 3.2h-.5l-3.3-3.3q-1.2-1.7-2.9-2.4-.4-.8-1-1.2l-4-3.7-3.5-3-3-3c-1.3-.7-2-2.1-3.1-3l-3.4-2.6q-.9-.7-1.5-1.5a29 29 0 0 0-5-5L94.3 96zm8.4 231.3q-.5-.4-.3-.7 1.3-2.2 3-4 2.2-1.9 3.7-4.1.8-1.3 2-2.3 1.7-1.9 3-3.9.5-.9 1.4-1.6.4-.3.5-.8l.6-.8q1-.8 1.8-2l2.3-2.6q.8-.8 1.4-1.8.7-1.2 1.8-2 1.5-1.5 2.5-3l.6-1 2.6-3c1-1.3 2-1.9 3.9-2.8l.4.1q.1.6-.3 1l-2.2 3a49 49 0 0 1-5.1 5.4l-.6.5q-1.6 2.3-3.5 4.2l-3.4 4-3 3.5-1.9 2.3q-1 1.1-1.7 2.3l-.5.6c-1.2.7-1.9 2-2.7 3q-.7 1.2-1.8 2-.8.8-1.3 1.8c-.7 1.4-2 2-3.3 2.7m71.6-269.6L173 51l-.7-2.4-1.5-8.6-.7-1.6q-.5-.7-.7-1.6c-.2-2.9-1.4-5.5-2.1-8.5 0-.6-.2-1.6.5-2.4l.5-.2a15 15 0 0 1 1.5 4.5l1.1 1.5-.3 1.8c0 1 1.1 1.8.4 3l.7 1v2.2c.9 1.2.7 2.7 1 4l.5 1.7q.5 1.1.5 2.3 0 1 .5 1.9.6 1 .5 2.2.1 2.3.7 4.6l.8 3.4q.4 1.6.5 3.4c.4 2 .5 4.2 1.2 6.2q.3 1 0 2-.5.3-.8 0l-.7-1-.1-1.7-.6-.9-.4-3c0-1.8-.6-3.4-.8-5.2q-.2-1.4-.8-3.2m57.8 49.4-.9 2q-.5.2-.5-.3l.5-3.5.2-1.3q0-1.2.3-2.3.2-.5.1-1 0-1.8.4-3.6.6-2.5.9-5.2.1-1.3.5-2.7.6-1.7.8-3.6c.1-1.3.7-2.6.6-4v-.4c1-2.6 1.1-5.5 1.6-8.2l.2-1c.2-.8.7-1.7.7-2.6q0-1.4.4-2.6l.6-2.7c0-1.1.5-2.2.2-3.3q0-.7.2-1.3.8-1.5.8-3.2v-.4q.8-2.3 1.3-4.5.3-1.2.3-2.5 0-1.5 1-3l.5.4v1q-1 4.3-1.6 8.6 0 .7-.2 1.1-.8 1.3-.5 2.6V60l-.7 1-.1.6q0 2-.3 3.7l-.7 2q-.5 1-.6 2.3a72 72 0 0 1-1.4 8.2l-.3 2.6-1 2a4 4 0 0 1 0 2.8l-.7 3.8-.6 4q-.1 1.2-.5 2.3l-1.1 4.5-.2.8q.1 2.1-.3 4.2zm-40.6 204.7c.4-.8.5-1.8 1.4-2q.7.2.6.8c-.2 1.6 0 3.2-.4 4.8l-.8 5.8c-.4 1.8-.5 3.7-1.2 5.5q-.3.6-.3 1.3c0 1.8-.6 3.6-.8 5.4-.1 2.7-1 5.4-1 8v.3c-.7 2.2-.8 4.6-1.2 6.9l-.6 2.8q-.3 3.4-1 6.7l-.5 4.8-.8.4-.8-.8v-.5c1.1-3.5 1.3-7.1 2.2-10.6-.1-1.9.7-3.6.4-5.5v-.5l1-4 .2-1.5.1-1.8v-1.7c.8-.9.6-2.2 1-3.4q.4-1.2.3-2.6-.2-1 .2-2.1c.5-2.2.4-4.4 1-6.5q.3-.7.2-1.6 0-1.5.3-2.9.5-1.8.5-3.6zM114.6 83.7q-.4-1.4-1.3-2.4-2.3-2.9-4.1-6l-3.4-5c-1.2-1.5-2.7-3-3.2-4.7l-1.8-2.2-.8-.8-1.3-1 .3-1.2q.8-.5 1.3 0l1.1 1.4q.7 1.4 1.5 2.5l1.5 2.2 1.8 2.6 4.6 6.6q1.4 1.9 2.9 3l1.9 3.5 2.2 3.2 1 2q1.3.8 1.9 2l.6 1.3q.7 1.3 2.1 2.2.5.3 1 1.1.6 1.6 1.8 3.3l2.4 3.8q.6.6 0 1.3-1.5-.3-2.2-1.6-1-2-2.6-3.7l-2.1-3.2-1.2-2a42 42 0 0 0-4.4-6.3q-.4-1.1-1.5-1.9m214.2 2.7c-.2.9-.9 1.5-1.2 2.3l-1.3.9q-1.4 2.4-3.5 4.2-2 1.8-3.7 3.7c-.4 1.1-1.4 1.8-2.1 2.5l-1.2 1-.9.8q-2.7 3-5.8 6-1 1.4-2 2.3-1.4 1-2.4 2l-2.7 3-.8 1-3 2.9-.9.5q-1.4 2.4-3.8 3.9-.6.4-1.3.2-.2-.7.4-1.2l4.2-4q2.2-1.7 4-4.1 1.6-2 3.6-3.7l3-3 2.7-2.6 2-2.2.6-.7 4-3.8q3-3 5.6-6.2 1.1-1.3 2.5-2.4.9-.8 1.3-2 .6-1.5 2.4-1.6zm-164-48.2.7-2.3.6.2.3.4 1.4 4.6 1 4q.1.6.5 1.4.3.7.4 1.5 0 1.5.5 2.6l1.4 6q0 .6.3 1 1 2.5 1.7 5.2l.4 1 .3.8c-.1 1.2.5 2.1.7 3.2l.2 1.9.8 1.2.1 2q.3 1.3.2 2.2L178 80l-.6.9-.5-.1a4 4 0 0 1-1.2-2.6q-.2-2-.8-3.6l-.3-1.4-1-4.1a50 50 0 0 1-2-8.2q-1-3.3-1.5-6.8l-.2-.7q-.7-2.8-1.9-5.4l-.2-1q0-1.2-.6-2.4zm213.4 117.6-.7.6q-.7-.1-1.5.2c-1.4 1-3 1.4-4.6 2.1l-4 1.7h-2l-2.2.9-1.3.4-6.7 1.6-4.7 1.2-1 .2q-1.5 0-3 .9c-.6.3-1.5-.1-2.1.6l-2.3.5-1.7.5q-1.3.7-2.8.8-1.1.2-2 1-1.2.2-2.2-.1l-2.5.9-2.3 1q-1.3.6-2.6.6-.5-.5 0-.8.3-.3.8-.4c1.2 0 2.2-.7 3.3-1l1.8-.6q1.6-.2 2.8-.9l.7-.3q1.4-.1 2.7-.7l2-.5q1.3-.1 2.5-.7 3.3-.9 6.7-2.3l1.3.3q2.4-1 4.9-1.8 1-.5 2.1-.8 1.2-.2 2.2-.6h.2c1.7 0 3.1-1 4.7-1.3l3.6-1.2 3.3-.9q1.9-.3 3.8-1 1.1-.3 2.8-.1M300 120.3q-.4-.2-.4-.5 1.5-2.4 4-4.3.9-.5 1.4-1.2 1-1.2 2.3-2.3 1.6-1 2.8-2.4l.6-.6c2.8-2 5-4.7 7.5-7l1.7-1.6 1-1 3.4-3.7 1-1q2.3-1.2 3.7-3.6l1-1.2 1.9-2.1q1.1-1.3 2.4-2.3l.8-.3v.6l-1.5 2.8-.2 1.3c-1.4.5-2.3 1.8-3.6 2.4l-.5 1.4-1.8 1-.3.4-3 3q-1.4 1.6-3.4 2.8l-.3.3-5.3 5.3q-1.5 1.6-2.7 3.4c-1.4 1-3 1.6-3.8 3.2q-1.6.8-2.6 2.3-.2.5-.5.6-1.6 1-2.9 2.3-1.2 1-2.8 2m6.6 17.7q2.3-1.5 4.9-2.8 3.4-1.6 6.5-4l2.2-1.1 4.9-2.9.8-.5q1.6-1.4 3.9-2.2.7-.2 1.2-.6c1.9-1.5 4.3-2.2 6.1-3.8 1.3-.6 2.3-1.7 3.7-2.1.7-.2 1.3-.9 2-1.3q.5-.2.9.5-1.1 1.3-2.5 2.3-2.1 1.3-4.3 2.4l-4.6 2.9-.3.2c-2 .8-3.5 2.3-5.4 3.2-2.4 1.2-4.5 3-7 4.1l-1 .7q-1.6 1.4-3.6 2.2a43 43 0 0 0-6.9 4q-1.2 1-2.6 1.2l-.4-.1 1.5-2.4M177 26.2q-1.3-2.4-1.3-4.8.1-2-.4-3.9-.7-2.3-.6-4.8l.2-1.4.8.2c.3 1.5.8 5.5.9 6.8q0 1 .3 2 .9 2 1 4 0 .9.3 1.6t.2 1.6c-.2 1.3.2 2.5.3 3.8v.6q.7 1.5.9 3.2l.2 1.7.1 1q.5 1.7.4 3.5 0 2 .3 4v.8q0 2 .6 3.3.8 5 1.3 10 0 .7-.9 1.2l-.5-.3q-.8-1.1-.7-2.5l-.1-4.1q-.2-2.3-.6-4.4l-.2-1.4q.2-2.7-.6-5.4l-.2-.7q-.1-3.8-.7-7.4v-1.1q0-1-.3-2.2-.2-.7-.2-1.5l-.1-1q-.5-1.2-.3-2.3m87 73.6.1-1 1.5-3.6a8 8 0 0 1 1.6-2.4q1.7-1.8 2.8-4l2.9-4.6 4-6.5 2.1-3.2q.6-.8 1.3-1.4h.4c.4.4.4.4.6 1.5l-3 4.4-.3 1q-1.5 1.2-2 3l-.4.7q-1.2 1.5-2.3 3.3l-2.7 4-.6 1q-.1 1-1 1.8l-.5 1a12 12 0 0 1-2.2 3.6l-.6 1-.9 1.2v.8a8 8 0 0 1-3.3 3.3c-.3-.7-.3-.7-.2-1.6l.9-1.3c.7-1.3.7-1.3 1.8-2m-78.7-73 .6.5.4.7q-.2 1.4 0 2.7.3 1.6.2 3.3v3.1l.6 1.8.5.8v2.8q0 2 .3 3.9c.2 1.2 0 2.5.5 3.7v1l.3 4.8q.3 1.8.2 3.6l.1 1q.4 2 .5 3.9l.7 8-.1.8v1c-1-1.1-1.3-1.5-1.5-2.4q-.7-2.6-.6-5 0-4.4-.7-8.6l-.1-3-.2-2.8-.2-2.8q0-2-.3-4-.6-2.3-.6-4.5l-.2-2.1-.4-3q-.4-1.5-.5-3.1v-1.6q.3-1.5-.2-2.8v-1.1q.2-.4.7-.6m-52.9 107.4c-1.4 0-2.4-.9-3.3-1.7l-2.7-2.5-1-1a6 6 0 0 0-1.5-1.6q-2-2-4.4-3.6-.4-.1-.7-.6c-.8-1.2-2.1-2-3-3q-1-.9-2.3-1.6-.6-.3-1-.8-1.3-1.7-3-2.7t-2.5-2.5c-2.1-1.2-3.8-3-5.6-4.5q-.3-.4-.8-.6l-4.4-3.5-1.5-1.5c-1.1-1.2-2.7-1.8-4-2.8l-.8-1q.2-.9 1-1h.3q2 .9 3.3 2.4l3.4 3 3 2.7q2.4 2.1 5 4.1l.6.8q0 .3.3.4c1.2.7 2 1.9 3 2.8s2.2 1.5 2.9 2.6c1.1.6 2 1.7 3 2.5l3 2.5 1.5 1.5q.8 1.1 2 1.9 1.3 1 2.5 2.3 1.2 1.4 2.6 2.3l4.5 3.8zM365 149.4l.3.6q-.4 1-1.2 1-2.2.5-4.2 1.6c-.8.5-1.8.3-2.6.8q-.3 0-.7.3c-1.2 1.3-3 1.4-4.5 2.1l-.4.2c-2.5.3-4.8 1.4-7.2 2.1l-2 .7-1.8.1-4.5 2q-.4 0-.7.2c-1.7 1-3.6 1.2-5.4 1.7l-.8.2c-2 1-4.2 1.3-6.2 2.2l-.7.2-2.5.5q-.2.1-1-.1l2.3-1 5.7-2.3 2-.6q.4 0 .8-.3c1.8-.9 3.7-1.2 5.5-2l3-1 1-.4q2-.4 4-1.3 2.5-1 5.3-1.7 1.2-.2 2.2-.8 1-.5 2.2-.7 1.4-.4 2.7-1l1.3-.5 4.7-1.8q1.6-.6 3.4-1m6.5 113.1-2.3-1.3-1 .1q-2.4-1.4-5.7-2.5-1.3 0-2.8-.7l-5.5-2.4c-.8-.3-1.7-.5-2.1-1.5q.9-.3 1.7 0 2.6.4 5.1 1.7l1 .4q1.7.3 2.8 1.2 1.7.7 2.9 1l1.4.6 1.1.4q1.4.9 3 1.2l.6.2c1.8 1.3 3.9 1.5 5.8 2.2l3.5 1.3q1.7.7 3.6 1l.4.1q2.7 1 5.6 1.7c1.5.4 2.7 1.5 4 2.2q0 .7-.4.7-.8 0-1.5.2l-1.1-.6q-.5-.3-1.1-.4c-1.2 0-2.3-.7-3.4-1q-.9 0-1.6-.7-2.3-1.3-4.9-1.9l-2.7-1q-1.2-.7-2.8-1h-.3c-1-1-2.1-1-3.3-1.1M88.9 84l-.2-1h.7q1.3.8 2.4 2.2l.6.5q1.8 1.2 3 3 .6.7 1.1 1a25 25 0 0 1 5.2 5.3q1.6 1.8 3.4 3.2.7.4 1.2 1 3.4 3.7 7 7l2.7 2.6 1.8 2.8q2 .9 3.1 3.3l-.2.1h-.3q-1.9-1.6-3.4-3.5-1.8-1.8-3.8-3.3l-.7-.5c-1-1.6-2.6-2.6-4-3.9l-2-2.3q-1.2-.8-2.2-2l-2.5-2.4q-1.1-1.6-2.8-2.7l-.8-.8q-2-2.7-5-4.4L92 88zm259 25-.6 1.2-.6.5-4.7 3.1-3.6 2.3q-1.4 1-3 1.8l-1.4 1-2.2 1.3-6.2 4-1.3 1-3.4 2.1-2 1.2a11 11 0 0 0-4 2.6q-.1.3-.5.5l-1.8.3q-.4-.5 0-.8l.7-.7 9.2-6.1 4.2-2.6 1.3-.9q3.6-2.9 7.6-5l4.6-2.6 4.8-3.2 1.9-1.1q.4-.3 1 .1M190.6 51l.2-1.4-.6-4.1.1-.6q.4-1.3.2-2.7l-.1-1.8-.5-1.6.2-.4q.8 0 1.2.8-.1 1.6.8 3.2a9 9 0 0 0 .6 6.4l-.5 5.7v.4c.5.9.2 1.9.3 2.8l.3 6.5q.1 3.4.7 7l.1.9q.9 2.9.1 5.8l-.1 1.3-.3.6a3 3 0 0 1-1.3-2.2v-1.3q.2-2.1-.3-4.1-.2-1 0-2l-.1-3.8-.3-3-.1-4.2c0-2.1-.5-4.1-.3-6.2q0-1-.3-2m-47 52.8 1.8 3.2c.1.3.4 1-.1 1.7q-.9-.3-1.3-1l-2.7-4.8-1-1.6-4-6-.2-.4-3-5.7q-.1-.4-.4-.6c-1.3-1-1.8-2.6-2.6-4l-1.7-3-2.8-4.6-2-3.1a4 4 0 0 1-1-1.9q.6-.7 1.1-.4t1 1c1 2.1 2.6 4.1 3.8 6.2q1.8 2.6 3.2 5.4c1.4 1.8 2 4 3.3 5.8q1.4 2 2.5 4.4 1.2 2.3 2.6 4.5l1.6 2.4zm59.7-17.6q-.5-1.5 0-3.2.2-1.5-.1-2.9l-.1-.7a8 8 0 0 0 0-2.7V71l-.1-10.5v-6.4q-.1-1 .6-1.6c.7 0 .7.7 1 1q-.7 4-.2 7.9l.1.7c-.3 1.1 0 2.2 0 3.3v2.3q-.4 1.2-.2 2.3.4 2.7.3 5.5v6.4q-.4 2.8 0 5.6l-.2 7.6-.3 1.2-.6-.3q-.6-.7-.5-1.6V91q-.6-2.2.2-4.3zm-38.6-36.7c.8.4.6 1.2.9 2l1 1q0 1 .5 1.9.3.2.2.7 0 1.5.8 3 1.4 3 2 6l.2.8q.4.4.4.9c.6 2.5 1.7 4.8 2.3 7.2l1 5.4q.2 1.7 1.2 3.2l.7 1.2 1 3q.2.9-.2 1.8c-1.3-1-1.7-1.5-2-2.6q0-1.2-.6-2.2-.6-1.2-.8-2.6l-1.8-6-2.2-7-1.6-4.6-.3-1.3-.2-1.1q-.9-1.7-.9-3.6l-.3-.9q-1.6-2.9-1.3-6.2m-58 16.2-.4-2q.4-.5.7-.2l1.7 1.4q1 2.6 2.9 5l.4.6q1.5 2.5 3.2 4.9l1.4 1.9 1.5 2.5 1.4 2.3q.5 1 1.2 1.8 2 2.5 3.3 5.2 1 1.9 2.3 3.6l2.3 3.4.5.9q.6 1.5 1.9 2.6.5.5.7 1.2.5 1.2 1.4 2l1.6 2.5v.6h-.5q-1.2-.4-1.8-1.6l-2.1-3.6q-1.4-2.5-3-4.8-2.3-3-4-6.4l-1.3-1.7c-1-1.3-2.3-2.4-2.7-4a5 5 0 0 0-1-1.9c-1-1-1.5-2.5-2.5-3.5l-.2-.3c-.4-1.6-1.6-2.7-2.6-3.8l-.7-1.2q-.5-1-1.3-2zM172 83.4q.9 1.3 1.2 3.2.3 1.5 1 2.7.4.7.5 1.3c0 1.2.6 2.2 1 3.3q.4.8.3 1.7l-.2.5q-.7-.1-1.2-.8-.3-.7-.4-1.6l-.8-2.4q-.8-2.3-1.4-4.7-.8-2.1-1.3-4.4l-.1-.2c-1-1.6-1.3-3.4-1.7-5.1l-1.3-4-.3-1.3-1-2.5a5 5 0 0 1-1-2.5 8 8 0 0 0-1.5-3.8q0-1.6-.8-3-.8-1.6-1-3.5l.5-.5q1.1.4 1.3 1.6.2 1 .7 1.8l.5 1.3.1 1 1.2 3.6L168 70l.4 1.1q1 1.6 1.2 3.3.5 2.6 1.3 5.1zm9.3-53.2h.8c.6 2 1.4 3.8 1.1 5.9l.1.5.8 5.6.1 1.2q0 1.1.3 2.3.4 1.6.3 3.3 0 1.4.4 3l-.1 2.3.4 4.7v.3c.7 1.6.6 3.2 1 4.8l-.4 1.8q-.6.4-1-.2l-.3-1.1-.3-4.5a39 39 0 0 1-.4-5.8c-1-2.9-1-5.9-1.4-8.9l-.8-5.5v-1.6q0-1.5-.5-3-.7-2.5-.1-5.1M75.9 162.3v.7q-1.4.5-2.6 0-3.8-.8-7.4-2.3l-1-.3-6.7-1.7-5.3-1.4-2.4-.8c-2-.6-4-.7-6-1.1-1.2-.3-2.6-.3-4-.8l-1.9-1q-.7-.2-.7-1 .4-.9 1.2-.7l3 .8 1.9.6 2.2.7 4.2 1.6 2 .4 5 1.1q2.8.6 5.2 1.6.6.3 1.3.4 2 .3 4 .9l1 .2q1.3.7 2.7.9 2 .4 4.3 1.2M279.6 58.2c-.3 1.3-.3 2.7-1.5 3.5-.6 1.2-.4 2.6-.7 3.9l-1.2.8-1.1 2.1-.3.7c-.3 1.6-1.3 2.8-2 4.2l-1 .9q-1 .3-1.3-.7l4-8.7q0-1.6 1.3-3c1-1.1 1.4-2.4 2-3.6q.8-1.9 1.9-3.6l2-3.5 1-1.8q1-.5 1.4.3v.4q-1.7 2.6-2.6 5.3-.6 1.6-2 2.8m-80.1-9.4q1 .9.6 3l.5 2.7c-.1 2-.8 3.9-.3 5.8q.2 1.6.2 3.3.2 1 0 1.9l.1 1.9v2q.2.4 0 .9-.4 1.5 0 3a11 11 0 0 1 0 3.4v2.5q-.2 1.5 0 2.9l.2 3.6v3.4q.1.4-.5.9c-.8-.2-.7-1-1-1.4v-.9q.6-4.4 0-8.7l-.1-.6-.1-5q-.2-1 0-2V71c-.4-1-.1-2 0-2.9v-2c-.3-.9.2-1.9-.2-2.8.5-1.6.2-3.2.3-4.9q0-1.8-.3-3.8-.2-2.1-.2-4.3-.1-.8.8-1.4m134.9 156.9q0 1-.7 1.2h-.4q-2.7-.4-5.4-.4l-1.4-.2h-1.5c-1.3.5-2.6.1-3.8 0l-1.4-.1h-6.6q-1.3 0-2.5-.3h-1l-3.9-.4q-2.2-.4-4.4.2-.3.2-.6.1-1.8 0-3.6-.3 0-.5.3-.6l1.3-.8q1.4-.7 2.8-.3 2 .4 3.9.3 2.6-.1 5 .4 1.8.2 3.5 0h4.7q2 .4 4 .4h4.2l1.7.3 1.1.1c1.1-.3 2.2 0 3.3-.2.5 0 .5 0 1.4.6M194.4 44.7q.9-.4 1.5.5V47c-.2 2.2.3 4.4 0 6.6l.1.2c.6 2.2.3 4.5.4 6.8l.2 5.6.1.8c-.5 1.6 0 3.1 0 4.6l.1 4.5.4 5.7-.2 3.3-.1.1q-1 0-.8-.5c.1-.8-.6-1.3-.6-2v-2.1l-.3-5.8.2-3.7-.2-4 .2-4.6v-1.1q-.3-2-.3-3.9c0-1-.4-2-.3-3 .3-1.5-.1-2.8 0-4.2l-.1-4q0-.8-.3-1.6M100 310q.3 1-.2 1.2l-1.6 1.5-1.7 2a6 6 0 0 0-1.8 1.8q-1.6 1.2-2.8 2.6-2.2 2-4.1 4.2l-1.9 2q-2.4 2.1-4.3 4.7l-2.9 3.2q-.6.7-1.4 1H76l-.5-.3.7-2.1 1.1-1 .8-.9q.7-1.4 1.9-1.7l2.3-2L84 325l3-2.7 1.3-1.2q.9-1 2.1-1.8.3 0 .5-.3 2.2-2.5 4.7-4.7 1.6-1.8 3.4-3.4zm58.7 2.3.6.1v.4q-1 3.2-2.8 6v.2q-.7 1.8-1.8 3.2l-1.5 3.2-1.5 2.7-3 5.9c-.8 1.3-1.2 2.7-2 4q-.4.4-.6 1-1 2.4-2.3 4.7l-.5 1-1.4 2.8q-.4.8-1.2.9l-.8-.2q0-.6.3-1.1l1.6-2.5 1-1.8 1.5-2.8 2.2-4 .3-1q.2-.7.6-1.2 1.3-2 2.3-4.1.5-1.4 1.4-2.6l.2-.5q1.6-3.9 3.8-7.5l2.2-4.3zM52.6 219.4q.7-.8 1.7-.5c1.3.4 2.4-.3 3.7-.3l1.9-.2q1.8 0 3.7-.3 1.6-.2 3.5-.2l1.7-.2h.4c2 0 4-.6 6-.5l3-.2q.7-.2 1.5-.1l1.5-.1q2-.3 3.9-.1l4.2-.2h1.5q.5.1.8.4 0 .6-.5.6-2.6.5-5.4.6l-2.1.2-2.2.1h-4.8q-1.3 0-2.6.3h-1.5q-2.2 0-4.5.3t-4.5.2q-1.2 0-2.3.2-1.4.2-2.9.1l-3 .3-2.2.2q-.5 0-.5-.6m111.9 152.3-.7-1.5.7-2 .9-4q.2-1.7 1.1-3.1 0-1.6.4-3.3.3-1.5.3-2.9l.2-1q1.6-4.6 4.2-8.7l.3-.2q.8.4.5 1.3l-.9 2.6-.6 1.8q-.2.9-.6 1.6-.7 1.5-1 3 0 1-.4 1.9t-.4 1.9q0 .5-.4 1-.4 1-.5 2l-.3 1.2q-1.4 3-1.8 6.4-.1.8-1 2m83.2-14.3q-1-2-.5-3 .6-.1.7.4.6 2.8 1.7 5.2v1q.4 3.5 1.2 6.9v.2c.8 2 1 4.3 1.6 6.4l.6 2 .2 1.2q0 .6-.5 1t-1.4 0q-.6-1.5-1-3.3c-.1-1.1 0-2.3-.7-3.4q-.2-.3-.1-1c.2-1.4-.3-2.8-.2-4.2q0-1.2-.4-2.5l-1-3.3a6 6 0 0 1-.2-3.6m55-204.7-.5-.3.2-.6q2.1-1 4.3-2.3c2-1.2 4.3-2 6.1-3.8q1.1-.2 2.1-.8 2.2-1.4 4.6-2.2l.8-.5a32 32 0 0 1 5.6-2.8l2-1c1.2-.6 1.8-.8 3.7-.9l-3.5 2.3c-1.7 1-3.7 1.6-5.3 2.9l-1.6.7q-1.6.6-3 1.7l-.7.4q-2.7 1-5.1 2.4l-3.4 1.5-4.5 2.3zm18.8-32q.9-.2 1.2-.5l2.9-2 2.8-2.1q1.9-1.7 4.2-2.4a15 15 0 0 1 5.9-4h.2l.6.2v1.2q-2.6 1.6-5.1 2.8-1.1.6-2 1.7-.4.8-1.3 1.3-2.2 1.2-4 2.6l-1.3 1q-1.4 1-3.2 1.7-1.1.4-2.1 1l-1 .4-.2-.1c.3-1.4 2-1.5 2.4-2.8M129 90q-1.8-1.3-2.4-2.8l-.7-1.1-2.4-3.8-.3-.9a5 5 0 0 1-1.6-2l-1.2-2-1.4-2q0-.4-.3-.6-1.3-1-1.9-2.7-.4-.7-1-1.3-.8-.7-1.2-1.8l.3-1h1.2l.5.4.5.8q1 2.2 2.4 4.2l1.3 2.1.5.9q1.8 2.5 3.4 5.2l1.6 2.4 1 1.5 1.6 3.5zm181.8-38.2q-1 .8-2.1 1.3l-.2.4-.4 1.7-.1.8c-1 .9-.9 2.3-1.6 3.2q-1.7.8-2.6.3.3-1.4 1.2-2.4 1.1-1.2 1.8-2.7c1-2.5 2.8-4.4 4-6.7q.6-1.2 2-1.9h.5l.2.5-.3 1.5q-.2 1-.9 1.6-1 1-1.5 2.4m20.4 296.8c1.4 1 2.8 1.8 3.4 3.3l2.3 2.3 1.5 1.8q.6 1.2 1.7 2.1 1.5 1.6 2.8 3.4a3 3 0 0 1-1 1.3 3 3 0 0 1-2.7-2.5l-3.3-3.8-.5-.8q-1.2-2.3-2.5-4.3l-1.6-2.3zM262.3 90.2q0-.5.2-.8c.6-1.6 1-3.3 2-4.6q.5-.4.7-1c1-2.6 2.6-4.8 3.7-7.3l1.2-1.7q.6.3 1 1l-1 3.3q-.6.3-1.1 1-.4.6-.6 1.4-1.1 3.1-3.1 5.8-1.1 1.1-2 2.6-.1.5-1 .3M375 113.7l-.6.5c-1.4.7-2.5 1.8-4 2.3l-1.2.7q-.9.7-1.8 1l-2.5 1.3q-2.6 1.3-5 2.9c-1.7.5-3.1 1.6-4.6 2.4l-1.9.8q.5-1.3 1.4-1.8l4.3-2.2 1-.3q2-1.5 4.4-2.8 2.8-1.5 5.5-3.3 1-.8 2.3-1l1.4-.6q.6-.3 1.2 0M129.4 91l.3-.2q.3 0 .5.3 2.4 3 4.3 6.4l1.4 2.4 2.4 3.5.6 1q.4 1.3 1.2 2.2 1.1 1.5 1.6 3.1-.3.4-.7 0a5 5 0 0 1-1.6-2q-.6-1.6-1.7-3-1.1-1.5-2.2-3.4l-.5-.7a8 8 0 0 1-1.8-2.8l-.5-1c-.9-1-1.2-2.2-2-3.1q-.8-1.3-1.3-2.6m-2.4 51.3c1.1.1 2 .9 3 1.4l1.4 1q1.7 1.6 3.7 2.8l.5.4q2.1 1 3.6 2.8.5.6 1.1.8 1.4.8 2.5 1.9 1 .6 1.2 1.7l-.6.3-.5-.2-6.5-5.3-1-1.1q-.8-.3-1.3-.8-2-1.6-4.2-3l-1.7-1.2q-.8-.5-1.2-1.5m153.6-70.5.7-1.2.8-1.3q.2-.9.8-1.5l.4-.5 1-1.7q.5-.8 1.3-1.4.7-.4 1.4 0c.6 1.9.2 2.6-2.1 4.4q-.2 1-.7 1.8-.7 1.3-1.9 2.2-1 .4-1.7-.8m-141.3 86.6q-1.6-.3-2.8-1.5l-1.6-1.3-2.8-1.8q-1-.3-1.7-.8-2.7-1.8-5.4-4l.2-.8 1 .6q.6 0 1.3.3.6 1.2 2 1.6l.3.2q2.3 1.4 4.5 3.3 1.5 1.2 3.2 1.8l1.3.4q.9.5.8 1.5zm29.9-41.4q-1.6-1.3-2.2-3.4l-2.2-4.7a2 2 0 0 1-.2-1.5h.4c.9 1.5 2 2.8 2.4 4.5q0 .5.5.8 1.2 1.6 1.6 3.5l.3.8q1 1 1.8 2.4t1.2 2.8q.1.5-.4 1l-.6-.5q-1-1.1-1.4-2.5l-1-1.8zM228 101q.5 1.2.2 2.4l-.2.8c.3 1.7-.2 3.3-.2 5l.1.6c-.5 1.5-.5 3.2-1.1 4.6q-.7.3-.9-.3v-1.5l.1-1.6.5-1q0-1.2.3-2.5.2-1 .1-2v-3l.5-1.3zm-108.9 31.3c1.2.1 2.1 1 3 1.6l2.8 2.2 5.3 3.7 1.3 1.1q.2.3.3 1h-.9q-.5 0-.8-.3c-1-1-2.2-1.5-2.9-2.6l-.3-.3c-1.4-.7-2.4-2-3.7-2.7q-2.1-1.4-4-3.2zm28.7 156.2q.5-2.2 2-4l3.7-5 1.7-1.3.2.4q-1.8 4-4.6 7.1l-1.8 2.1q-.4.8-1.3.6m152-135.1.5.4-.4.5-4 2.3q-2.4 1.4-4.6 3.3l-.6.6q-.8-.1-1-1l.6-1.2.5-.4q1.4-.8 3.2-1.4 1-.1 1.7-.8c1.2-1 2.7-1.4 4-2.3m-192.6-.6q.6-.4 1.2 0l9.3 5 .1.5q-.7.6-1.4.2l-2.8-1.4-2.4-1.3q-2-1.2-3.8-2.6zm4.3-13.4h.6q2.8 1.5 5.3 3.5l2.5 1.6q1.1.5 1.9 1.6.3.4.9.7l1.7.9-.1.6h-.4q-2.2-1.2-4.2-2.8l-.9-.4-.5-.3c-2-2-4.6-3.1-6.6-5zm50 242.3-.2-.5c.4-1.3 0-2.7.3-4l.2-.4q.8-1.5 1.2-3.1 1-.5 1.3.6l-1 1.8-.1 4.6q-.6 1-1.7 1M347 128.8q-.6 1.4-2.1 2-2.6.8-5 2.6l-1.4.9q-1.3.5-2.2 1.5l-1.1-.2.1-.5q3.7-2.4 7.5-4.3 1.6-.7 3.1-1.6zM181.6 27.2h-.5c-.5-.7-.6-1.7-1.1-2.3q-.2-1.9.4-3.5-.7-1.3-.2-2.7l.5.3q.6 1 .5 2.2 0 1 .6 2.4l-.3 1.1c0 .7.5 1.6 0 2.5m-81 282.2 1-1.4q1.3-1 2.2-2.2l2-2q1-1.2 2.3-1.4l.2.4-2.1 2.4-1.2 1q-1.5 1-2.3 2.3-.5.6-1.1 1-.5.4-1-.1m141.9 84-.7-.6c-.7-1-.5-2.2-.4-3.2q.1-1.5-.4-2.8t.4-2.5l.5.6.4 3q0 1.5.5 2.5.5 1.3.3 2.5 0 .5-.6.5m58.2-226.9q-.5 1.4-1.8 1.6-2.1.6-4.1 1.7l-1.3.4-.4-.6.6-.5q.9-.4 1.6-1l.5-.3q2.5-.7 4-1.7h.4zM42.3 297.8q1-.2 1.5.7t-.3 1.4c-1 .7-2.4.6-3.6 1l-.5-.3-.2-.4.1-.3.9-.8zM315 167.4q-.6.9-1.6 1.2l-4.6 1.9q-.7.3-1.5-.1 0-.6.3-.7l.5-.3 5.8-2.2q.4-.3 1.2.2m-169.6-58.2q1-.2 1.4.5.8 1.5 2 2.6 1.1 1 .7 2.2-.7.4-1 0c-1.1-1.7-2.6-3.1-3-5.3m123 23 .6.3-1.6 2-1.7 2c-.4.6-.6.6-1.6.8q-.5-1 .3-1.7 1.6-2 4-3.4m-128.7 23.2a5 5 0 0 1-3-1.3q-1.7-1.6-3.8-3l-.6-.7c1.3 0 2.1.9 3.2 1.1q1 1 2 1.7 1.6.7 2.2 2.1M98 216l.6.8-.2.4q-.8.5-1.7.4H93q-.5 0-.7-.6.5-.6 1.3-.6 1.8 0 3.5-.4zm155.2-5.4h1.7l1.4-.1c.3 0 .6-.4 1-.3v.4l-2 .8q-1.3.7-2.8.6l-3 .1q.3-.6 1-1.2l1.3.4q.8-.2 1.4-.8m12.2 153.1c-1.1-.3-1.6-1.4-2.3-2 0-1.6 0-1.7 1.2-1.8q1.2.9 1.5 2.4c0 .5.2 1-.4 1.4M396.3 110v-.7l.9-.7 1-.7h2l.2.3-.7 1.3-2 .9c-.6-.1-.9-.7-1.5-.5M127 142.4q-.6.1-1.1-.2l-5-4-.2-.5.9.4 4.6 3q.8.5.8 1.3m139.3-24.6.5.2q0 .4-.2.6c-1.2 1.2-1.6 3-2.8 4q-.7 0-.6-.6t.3-1c1-1 1.6-2.3 2.8-3.2m-106.8 193 1.8-2.9c.4-.8.5-1.8 1.3-2.6.6.5.4 1.1.3 1.8-1.2 1-1.4 2.8-2.7 4zm14.1-182.4q0-1.5-.6-2.9-.2-.4.3-1 1 .3 1.4 1.1.4 2.2 0 3c-.5.2-.7-.3-1.1-.3m-56.1 7a10 10 0 0 1-3.4-1.8c-.7-.8-2-1-2.3-2.2q.7-.3 1 .3c1.6 1.2 3.5 2 4.7 3.7M239 215l.4-.5h.6q2.3.3 4.3 1.7c-1 .4-1.9 0-2.7-.2q-1.3-.3-2.6-1m31.9-103.5.3.3v.5a8 8 0 0 1-2.6 3h-.4v-.3q0-.9.9-1.6zm-96.8 2.8c1.5 1 1.5 2.7 2.2 4.2l-.4.4q-1-.7-1.1-1.7c-.3-1-.8-1.8-.7-3m-38.2 30.4-.6.2a8 8 0 0 1-3.1-2.2v-.7c1.3.9 2.8 1.3 3.7 2.7M118 131.4q-1.3-.2-2.3-.8l-1.3-1.9h.4l3 2.1zM365.6 146l-1-.5c.9-1.3 2.2-1 3.7-1.3-1 1-2 1.2-2.7 1.7M167.7 297.6q-.4.7-1.2 1.4c-.4-.6 0-1.2 0-1.7q.1-.8.7-1.4.5.6.5 1.7m-2.3 4.5-1.4 1.3c-.2-.8-.2-.8.1-1.4.4-.8.4-.8 1.1-1.2.5.4.2.9.2 1.4M137.3 241q.4.9-.4 1.2l-1-.2c-.3-.2-.7.4-1-.2q.9-.9 2.4-.9M245 53h-.3l-.6-.5.2-1.2h.7q.6.8 0 1.7m-51.2 87.6c1-.7 2-.4 3 0l-.1.3h-2.9zm42.8 73.4 1-.6q.9.2 1 1.1l-.5.3q-.7 0-1.5-.8M51 220.4l-.9-.6q0-.6 1.3-1 .1.3.7.5zm63.4-91.7q-1.7.1-2.3-1.6c1.3.2 1.5.4 2.3 1.6&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M120.7 137.7q-.7.2-1.3-.3t-1-1.3c1.3.3 1.6.5 2.3 1.7m63.3 6.4c1-.4 1.8-.8 2.7-.4q0 .5-.4.6-1.2.2-2.2-.2M120 67.9l.5-.6.8 1.4-.3.7h-.3q-.6-.7-.7-1.5m69.2 243.2-1.8.7-.6-.3v-.4q.9-.8 2.4 0M62.7 337.8q-.6.8-1.4 1.2l-.4-.3q0-.8.8-1zm60.7-207.1q1.4.5 2.3 1.7c-1.3 0-1.4-.2-2.2-1.7m60.1 237.5c-.8-1.3-.8-1.4.1-1.8.8.7.8 1 0 1.8m199.6-115.9c.9-.4 1-.4 1.4.6q-1.3.7-1.4-.6M104 302.8c-.4-.6 0-1 .3-1.3q.4-.4 1 0c-.3.6-.4 1.3-1.3 1.4m7.3-163.6q-1.3 0-2-1.2l.4-.2 1.4 1q.2.1.2.4M190 379.4q.5.7 0 1.7c-.7-.5-.8-.6-.7-1.2q0-.5.6-.5m70.6-253.1-.3-.5q.4-.8 1.1-1l.3.3q-.2.8-1.1 1.2M130 148.7c1.3.3 1.3.3 2 1l-.4.4c-.8-.1-1-.7-1.7-1.4m174.4 157.6q.4.3 0 .8t-.7 0q-.2-1 .7-.8M264.5 159l.2-.8 1.3.7q-.7.3-1.5 0m-26.2 58.5c-.8.4-1.2 0-1.6-.4q.2-.7.7-.4zM109.7 130q1.1-.3 1.5.7-.7 0-1.5-.8M251 213.8q0 .6-.6.6-.4.1-.6-.4.5-.5 1.2-.2m-110.2-56.4q.7.3.5.9-.5.5-1-.1zm119.7-5.8.5-.5 1 .6-.5.6zm-44.2-23.9h.7q.3 0 .6.4-.8.3-1.3-.4m188.4 80.7q-.4.4-1-.1.7-.9 1 0M134.9 140l-1-.5v-.4h.3l1 .7zm261.3-30-.3.5q-1 .3-1-.4c.4-.5.9-.1 1.4-.1m-183.8 22.8q.6-.5 1 0 .1.6-.4.6t-.6-.6m-86.9 18.9q1-.2 1 .7-.7.1-1-.7m116.1 66.1q.6-.2.8.2l-.1.3-.7-.2zm151.6-107.3q0-.6.8-.5l.1.5q-.4.5-1 0M59 286.7l-.4.4h-.4l-.2-.3q.4-.6 1 0m18.2-.7q.7.4.1 1.1l-.4-.2zm169.7 66.6.3.3-.2.3q-.4.2-.4-.3zM118 131.5q.9 0 1.1.8-1 0-1.1-.9m10.6 16.1q-.8.2-1.2-.6.6 0 1.1.6M397.4 203l-.3.4-.4-.2.2-.3zm-95.8-50.2q-.2.7-.8.5.2-.6.8-.5m-85.9-19q-.2 0-.5-.3l.2-.5.6.3zm-98.9 12.5q-.6.2-.8-.5h.5zM22 299.1l.5-.5.1.6q-.2.4-.6 0M271.2 79.1l-.5.3-.2-.5.3-.2zm-3.6 37.7-.4.5q-.5-.3-.1-.6zm-140.9 17-.3-.4.1-.3h.2q.4.3 0 .7m241.6 79.9q-.4-.3 0-.7zm-52.4-46.8.6-.5v.6q-.2.2-.6-.1M140 155.3l.9.2-.6.5q-.6-.3-.4-.7m79.1 39-.7.6.2-.7zm-75.2 103.1-.4.4-.2-.2.1-.4zm263.6-88.9h-.5v-.2h.5zm-160.6 7.9-.1.2h-.1l.1-.4zM74.2 179.8v-.4l.2.1zm244-13.5-.3.1v-.3h.2zM64.4 289.4v-.3q.3 0 0 .3m73.9-142.9h-.2v-.3zM200 138l-.8-.1h.2zm21.6 61.9h-.2q-.3 0 0-.2h.2zM140.3 148l.2.1-.3.2-.2-.2z&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;m128.5 147.5.3.2q-.2.2-.2-.2m71.9-9.7v.2h-.1zm-70.5-1.6h.3-.2m0-.1h-.3c.3-.3.2 0 .3.1m109.4 207.1-.3-.2q.3-.2.2.2M109.3 129.5l.4.4zm153.3-5.9-.2.2v-.1zm0 .1.1-.3.2.1zm-88.8 120.4q.1-.9.8-1.3l.8-.2q.3 0 .5.2l.4.5c-.1.9-.8 1-1.5 1.3zm1.4-35.1v.6c-1 .3-1.8-.3-2.7-.6.7-1 1-1 2.7 0m-12.9 12.6c-1 1.1-2.1 1.1-3.1 1.5l-.4-.2q1-1 2.1-1.3zm7.4-14.6 1 .5v.6c-1.2-.4-1.2-.4-1-1m-5.5 28q.4-.8 1-.4 0 .8-.8.9zm21.8 3.4q-.5.6-1 0 .5-1.1 1 0m-23-9.3q-.4.8-1 .2 0-.7 1-.2m25.9-13.6-.2-.1.2-.1h.2zm4.8 57q.6.4.6 1-.8.5-1.1-.3 0-.5.5-.7m47.9-10.9-.4-.4q.3-.8.8-.4.2.5-.4.8m-71.6-68 .5.7-.7 1-.5-.5q.1-1 .8-1.2m86.9 6.6q.9 1 .2 1.4l-.7.3q-.5 0-.9.3-1.1.8-2.4 1.4l-.7-.3v-.4l.9-.8 1.4-.3zm-7.5-14q-.9.1-1.2-.6.8-.6 1.4.2zm.5-2.3-.3.2-.2-.1.1-.1z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/div&gt;
        &lt;div class=&quot;hero__corner&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 469 678&quot; id=&quot;nouveau-corner&quot;&gt;
  &lt;path d=&quot;M431.6 48.3c-4.4-1.2-5 6.3-4.2 9 .6 2.4 1.7-2.9 2.5-3.3 4.7-2.3 7 6.1 7.2 9.3.5 7.8-3 19.3-4.1 27.3-2.8 20.5 4 40.8 3.2 61.8a91 91 0 0 1-13.2 45.2c-16 25.7-49.8 33.2-63 61.6-10.6 23.1-5.2 46.6 2 69.6 9 28.4 20.7 56 30.3 84.1 6.2 18 11.4 36 16.5 54.3.8 2.5 2.4 5.3 2.2 8-.9-1.8-2-4.2-2.5-6-3.7-11.2-6.2-23-9.8-34.3-12.2-38.4-29-75.3-40.6-114a96 96 0 0 1-4.8-43.4c3.3-26.9 21.3-41.2 40.1-57.8 6.6-5.7 16.4-11.7 15.3-21.8 2.7-1 3.6 2.1 5.3.4.9-1 2.9-6.9 3-8.3.4-2.4.5-6.7-1.5-8.4-1.4-1-3.6.6-3.3-2.8.3-3.5 3.3-3.2 5.8-2.5-.4-3.5-3.7-6-7.2-4.9l-.4 1.7c-2.8 1.2-1.3-4.2-3.4-4.7-5.7-1.4-9 9.2-1.3 8.8v-1.7l1.3.2c1 .7-.3 2.7-1.3 3-11.5-.7-6-18 3.4-16.8l-.4-1.5c.4-1.5 4.2-.1 5.2.3 2.2.8 4 2.4 5.8 3.7l-.4-4c2.1-2.3 5.2 2.8 6 4.6a30 30 0 0 1 1.6 9.2c1.4.2 1.5-2.2 1.5-3.3a57 57 0 0 0-6.4-29.3c-.4-.8-3.1-3-3.1-3.2.8-1.6 4 .2 4.6-.2q-.7-1.8-.8-3.6c0-2.8 2-4 1.2-7.2-.3-1-2-2.2-.8-3 2-1.5 5.6 3 6 4.8 2 0 .6-1.9.4-3.2-.3-2.6-1.4-10.6-1-12.6.2-.4 1.1-.1 1-.9-.2-1-1-1.2-1-3 .6-12.7 10-37.9 7-48.4-.4-1.6-1.6-4.1-3.5-4l-2.1 4.1c-1.4.7-3.1-2.5-3.3-3.5-.8-3.7-.2-11.2 5-10.7zm-4.7 84.8c-1.3-.4-.9 1-.7 1.8.5 2.8 2.1 6.4 2.8 9.4 3 13.7 2 26-2.3 39.2-.9 2.5-2.3 5.7-4 7.7-.2-2.9 1.5-5.2 1.4-8.2 0-2.7-1.4-9-2.8-11.5-2.5-4.7-11.2-9.6-16.4-6.4 9.1-.2 14 3 16 12 4.6 21.4-15.4 33.8-28.6 45.8-.4.4-1.2.4-1 1.3.6.6 11.4-8 12.5-8.9 18.7-15.2 29.4-33.1 29.3-58.1 0-8.4-3.5-16.3-6.2-24z&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M354.3 192.8a18 18 0 0 1-6.4-3.4c-1.9-2.2-3.5-7.9-.3-9.6 1.4-.8 3.6-.5 4.5.8 1.9 2.5-1.9 4.6-2.6 2.2-.3-.9.4-3-.7-2.7-4.3 2.7-1.3 8.8 3 9.7 5.2 1 11.5-2.9 16.9-3.3 15.3-1.4 23.2 12.1 19.1 26-.5 1.7-2.3 4.4-2.4 6q-.1.8.6.6c6.1-7.1 7.4-16 4-24.7-1.7-4-2.6-4.7-6.7-6.4 0-1 5.7-.8 4.7-2.4q-5.5-3.1-9.1-8.5c-.8-1-.6-2.4-2.4-3.1.7-1.1 1.7-.3 2.8-.2 2.3.2.3-1.3-.2-2-2.6-4.6-1.9-5.8-2.6-10.5-.2-1.4-1.6-2.5-1.2-4l2.3-.4c1.3-8.5 7.2-17.4 16.8-16 5 .7 7.3 7.1 4.4 10.8-2.7 3.4-9.4-2-3.6-3.3 1 4.2 4.3 1.6 3.8-1.9-.8-5.5-9.4-5-12.7-2.1-2.4 2-4.4 8-4.2 11 0 .7-.2 1.4.6 1.9.4 0 3.7-1.8 3.6-.3 0 .6-2 .8-2.3 1.6-1.1 2.7 1.8 10 4.4 10.8 2 .6 3.4-5.3 5.7-3.7 1 1.6-2 2.1-1.9 4.4.2 3.4 5 10.1 6.4 13.4 2.2-1 5.2-1.7 6.3 1.1.1 1-1.5.5-2.3 1-.6.4-1 4-1.1 5-.2 2.5.3 6 0 8.8-2.1 16.2-22.2 26.3-32 37.5-20.5 23.6-22.5 48-15.2 77.6.7 2.8 1.9 5.6 2.5 8.5.2.6.7 1.4-.4 1.3-4-9.8-6.8-20.2-7.4-30.8a78 78 0 0 1 19-57.6c7.4-9 19.6-17.1 18.2-30-.4-4.2-4-8.5-8-9.4-2.7-.7-6.2.7-7.3 3.3-.5 1.2 1.1 1 1 2.4-2.8.3-4-3.1-3-5.4 0-.3 2-3.2 2.2-3.4.9-.6 2.9-.7 4-1.4.7-.5-1.8-1-2.2-1-4.2-.2-9.7 8.6-14.6 4.2l2.6-2.3c-2-.3-4.7.3-6.6 0m39.5 17.4c1-3.3 2.6-7 3-10.4 1.4-14.3-11.2-24.3-15.1-37l-1.2-9a12 12 0 0 0-1 7.8c1.9 14.4 16.8 23 16 38.2-.3 3.1-1.3 5.8-1.9 8.7 0 .4-.5 1.9.2 1.7&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M419.7 266.6c-2 .2-2.7 1.2-4.3 1.8q-7.6 2.7-14.7-.8c-3.1-1.5-6.4-6-3.9-9.3l3-.2c.6 2-1 2.2-1.2 2.6-.5.9 1 3.2 1.6 4 4.2 5 12.4 2.6 16.9-1 1.5-1 7.3-7.6 6.8-9.2-.4-1.3-2.8.3-3.6-1-1.2-4.8 2.9-7.8 4.5-11.2.5-1 1.9-5.5 2-6.5.2-1.5 0-11-.8-11.6-1.7 0-.9.7-.9 1v7.3c0 2.1-4.7 8.8-6.8 10.1-1.4 1-3.4 1.2-4.8 2.3-.6.5-.6 2-1.5 1.1.3-4.4-1-3.5-3.8-4.7-2.8-1.1-3.2-2-6.4-.6-.6-1.8 3.3-2.8 3-4-4.3-2-8.3-4.5-12.7-1.3-1.7 1.3-2.7 2.7-2 5 .6 2 4.3 3.2 3.7-.1 1.6-.3 2 .8 1.7 2.2-3.8 3.2-6.5-.5-6.3-4.5.3-6.5 6.8-10.2 12.7-10 0-1.5.4-6.4 2.3-6.4l1 .6-.7 2c4.8 4.1 10.2-2.5 9.2-7.4-.5-2.2-4.1-5.2 1.3-5.3 6 7.4 5.2 19-5.8 20.6h-4.1c-.6.2-1.2.3-.7 1l3.7.7 3.6-.1c10.2-1.4 11.4-11.7 7.2-19.6-.7-1.3-2.8-3.7-2.5-4.9.5-2 2.2-3.1 4.1-3.3 0-.5-1.2-1.9-.4-2.3 2-.3 3.6-.2 5.1-1.7.8-.8 1.2-2.4 2.3-3.2 1.5-1 4.4-1.1 5.5-2a8 8 0 0 0 2-8h-3.4c.3-4.5 3.3-2.7 4.3.5a13 13 0 0 1-1.8 11.5c-.8 1-2.4 1.1-2 2.7q3.5.3 2.9 3.8h-2.7c-1 2.1-1.8 3-4 3.7-1 .3-2.7-.3-2.7.8 0 1 3.2 5 4 6.2 8 14.4 7 34-6 45-1.7 1.4-3.6 1.2-3.9 3.7.2 0 2.5 0 2.6.2 2.2 6.7 0 17.5-6.7 21-2.7 1.2-5 .9-7.6 1.7-.6.1-.7-.3-.6.8 11.9 3.2 18.8-9.5 17.8-19.7-.2-2.1-1.3-3.9-.8-6.1 1.2-1.3 3 4.1 3.2 5 1.5 5.1 1.7 9.6 2.2 14.7.1 1 .8 1.7.9 2.5 0 1.9-1.5 4.7-1.9 6.6-1.2 5.3-1.7 9.6-3.8 14.8-1 2.4-3.5 5-3.4 8a53 53 0 0 0 7.2-49c-.6-1.5-1.8-2.5-2-4.1.9-1.2 1.4 0 1.9.8 8.3 13.1 5.8 33.3 2.6 47.7-2.1 10-9.8 31.5-5 40.6 2.5 4.6 3-1 4.2-2.4 1.5-2.1 4-1.6 4.4 1 .5 3.3-1.4 6.6-1.7 9.8-.6 7.1 3.5 15.1.1 22-.8 1.6-1.8 3.1-3.7 2l-.2-1.4c4 1.7 3.6-6.8 2.4-6.7l-1.3.8c-1.7-.2-.5-1.9-.6-3.2-.5-9.7.5-8.4 3.2-16.6.5-1.5 2-7.6 0-7.8-3.2-.2-2.4 5.3-5.2 5.6-1.3.1-3.7-3.5-4.2-4.7a36 36 0 0 1-1.9-18.8c.5-4.1 2-8 2.5-12.2q-.8-.1-1.5.4c-2.1 1.4-5 5-7 6.8a28 28 0 0 1 2.2-12.2c-.3-.4-6.2 2.7-3.9-1.1 1.7-2.8 2.1-4.5 3.5-7.1 2.4-4.4 6.8-8.1 8.8-12.5q2-4 1.7-8.6c-1.7 1.1-1.8 3.4-2.8 5.4-1.6 2.8-4.7 7.5-8.2 7.7-.2-1.6.6-2.8 1.3-4.2-4.6.6-10 3.5-14.2 0-.3-1.7 3.3-.8 2.8-2-1-1.3-2.8-1.4-4-2.2-4-2.7-6.7-10-3.4-14 2.2-2.7 6.9-3.2 6.5 1.2-1.2.2-1-1.2-2-1.5-3.8-.7-4.6 6-2.7 8.6 2 2.6 9 2.1 11 0 1.5-1.5-.7-2-1.4-2.8a5 5 0 0 1-.6-4.7c1.4-.4 1 .9 2 1.1 4.3 1.1 6.6-2.2 7.2-6 .2-1.8-.1-3.6 0-5.3m1.7-59.4c2.3 1.4 7.7-1.4 7.2-4-.4-1.7-3.2 1.6-3.7 1.8-.5.3-4.4 1.3-3.5 2.2m4.2 45.8a45 45 0 0 0 5.6-18c.1-3.5-.7-8.3-2.2-11.5-.4-1-6.3-10.4-7.6-9 2.7 5.7 7 11 7.6 17.5.2 2 .3 5.7 0 7.6-.5 4-3.3 8.8-4.1 12.8zm33.6 336.6c1.7 6.2 3.1 12 2.5 18.5-2 22.6-21 41.8-44.5 37-3.3-.7-11.4-3.3-7.8-7.6 1.2-.1.2 1.4.6 2.4 1.1 2.6 10 1.4 11 .2 1.3-1.2-3-1-3.3-2s2.3-1.5 2.9-1.7c9-2.6 16.5 2.4 25.5-4.2.6-.5 2.5-2 1.9-2.7-6.1 2.4-13.2 4.9-19.5 1.2-2.1-1.2-6-6.3-1.9-6.7 0 1.3-.4 2.7.9 3.5 1 .7 6 2.1 5.9-.2l-1.7-.4c0-3.4 5.2-1.7 7.4-1.6 3.3 0 11-2.6 13.6-4.7a23 23 0 0 0 7.3-14.4c0-.6.4-1-.6-.9-.8.4-2 4.6-2.6 5.8-4.8 7.9-11.5 12.4-20.9 9.7-1.3-.4-3-1.6-3.8-1.8s-2.4 1.6-2.1 0c.3-2.2 2.9-2.4 3-3a10 10 0 0 1-1.7-4.6c-.1-1.6.3-5.8 2.5-4.9q-.4 2.9 1.7 4.4c4.2 2.6 1.8-2.5 4.5-4 1.5-.3 1.4 2 3 2.2 4 .5 8.5-4.6 9-8.3.2-1.4-.4-5.7 1.5-6.1 2-.4 1.6 5.6 1.5 6.5-1 6.5-5.8 12.8-12.4 14.4-1.8.4-5-1.2-3.8 1.1 3.8.8 6.4.2 9.7-1.6 5.1-2.8 9-9.7 9-15.6 0-1.6-1.4-6.2-1.1-7 .1-.6 2-3.7 2.9-3zm-90.8-173.1c2.2 1.6 5.1 5.9 6.7 8.3 5.6 8.7 9.1 18.3 12.7 28l.6.4.9-5.1c.6-.7 1.5 4.4 1.6 5 1 6.9.7 13.9 1.3 20.8l2.2-1.7c-.2.9.3 1.7.4 2.4 0 15.8-2.1 33.8-5 49.3-1 5.8-2.1 13.9-4.3 19.4-.2.5-.5 1.6-1.1 1.8-3.4-.4-2-1.4-1.6-3.2a162 162 0 0 0 4.4-44.9c-.3-5 .2-10.3-1.4-15.1-.4-1.1-3-5.7-2.9-6 .3-1.3 3 .1 3.4-.2a62 62 0 0 0-5-18.6c-.6-1.4-2.3-3.4-2.6-4.6q-.3-.8.7-.6c1.1.2 2.3 2.2 3.3 3l1-.7q-.5-3.2-1.5-6.4l-3.2-9.2c-1.9-5-8.8-19.6-13.4-21.7-.5-.2-1.7.4-2-.9-1-3.2 3.8-.2 4.8.5m18.4 40.5-.5-1.7h-.4l-.4 1.7zM358.4 220c-4.5 5.2-11.7 15.4-12.4 22.2 0 .4-.3 1.6.4 1.5q.4-2.2 1.2-4.1a62 62 0 0 1 20.5-25.3q3.4-2.4 7.6-2.8l-1.3 2.5c2.4.7 5.8.2 5.9 3.6-.4 1.4-3.6-.1-4.8-.2-10.7-.8-22.3 13.3-26.2 22.2-9.8 22.1-6.5 47.4-.1 69.8 14.9 52.3 40 100.8 55.5 153 1.7 5.9 4.5 14.5 5.6 20.3l.1 2.2c-1.5-1.9-2.4-5-3.2-7.2-2.5-7.9-4.2-16.2-6.8-24.2-12.9-41-31.1-79.2-45-119.7-9.8-28.2-18.4-56.4-12-86.5 3.7-17.4 16-36.6 32.8-43.5l4.4-1.5c2.3-.3 3.6 2.6 1.8 3.5-.8.4-2.4.4-3.5.7-8.8 3-14.3 6.8-20.5 13.6M374 601c.4.4-5.8 5.6-6.3 6.2q-1 .4-1 1.4c.6.5 8.4-6.6 9.4-7 1.6-.6 2 .5 1 1.5a261 261 0 0 1-27.4 18.3q-6 3.1-12.1 6c-.3 1 1.5 5 2 6 1.8 3 7.4 9 11.2 8.2 1-.2 1.6-1.5 2.6-.4 2.3 2.3-2.1 6.3-5.3 4.9-.8-.4-5.3-6-6-5.3l3 5.3q-1.4 1.6-3.2.5c-3.1-5.9-4.6-12-6-18.4-.2-1 .3-3.6-1.4-2.9 1 1.6.3 3.3.5 4.7a52 52 0 0 0 4 15.1c.2.7 1.5 3 1.9 3.4 1 1.2 6.1.2 7.8-.1a81 81 0 0 0 45.2-26.5l1.9-2.7c1-2.5-5.6-3.4-7.1-2.9-1.2.4-1.3 2.3-3 1.1-1.5-1-1.2-3-1.1-4.5l1.2-.3c.9-2.6-3.3-1.1-4.4-.6-.7.5-2.7 2.6-3 3.4-.1.5-.6 3.5-.5 4 .2 1.1 2.4 2.1 2 3.6-5.7 1.4-8.2-3-6.2-8.1 1-2.6 6.3-5.5 9-5.8 14-1.9 23.4 12.3 24.3 24.8.2 3-1.5 9.2-3 12-1.7.3.2-2.2.5-3.2 1-4.4.5-11.7-1.6-15.7-1-1.8-2.6-3.3-3.3-5.2q-.5-.7-1.3-.8c-.8 0-7.4 7.2-8.9 8.4a116 116 0 0 1-27.6 17.6l-17.5 6q.1.7.6 1.2a35.4 35.4 0 0 0 52.3 1.6c1-1.1 2-2.9 3-3.9 1.4-1.5 1.6 0 .9 1.4a38 38 0 0 1-19.9 14c-20.6 4.7-38.6-7.6-45.1-27-2.2-6.4-2.2-12.7-3.7-19-.4-1.5-1.9-3.2-.1-3.4l1.5 1.7V618c.8-1.1 2.6 7.5 2.8 8q.3 1 1.4 1c0-2.6 3-2.9 4.8-4q11.7-7.1 22.3-15.4c1-.8 8.2-7.2 9-6.5zm-20.8 47.5-10 1.7c-1 2.3 2.2 1.3 3.6 1 2-.4 5.3-1.2 6.4-2.7m68.6-88.6c1.4.2.3-1 1.9-.9 2.4.2 6.5 3.2 8.3 5 5 4.9 8.6 10.8 8.5 18.1 0 1.4-1.1 3 .2 4 1-.6 1-1.5 1.2-2.6 1.5-10.6-5.4-19.8-14.7-24.1-1.4-.7-3.8-.4-4.1-3 2.1-1.7 17.7 9.6 20 11.5 1.8 1.4 9 8 9.2 9.6.2 1-1.9 6.6-2.5 6.1q-.6-3.1-2.2-5.6c-.6-1-1-2.3-2.5-2 .3 3.5 1.1 6.2.3 9.8-.2 1.1-2 5.6-2.8 6-.5.4-1.3-.2-2.1 0-1.4.4-3 2.8-5 1.5-.6-2.1 1.7-3.2 1.1-5.5-6.1 0-2.7-1.7-1.3-4 2-3.5 1.3-13.2-2.3-15.9-1.4 2.4.5 5.8-2.5 7.6-1.1 0-.2-5.7-1.3-7.1-1.4-1.7-1.5 2.5-3.2 2 .4-3.3-1.6-6.3-4-8.4-1 1-.5 2.6-.7 4a122 122 0 0 1-12 38q-2.8 5-6.3 9.7l-1.9-1.9c1-1.8 2.5-3 3.6-4.9 7.2-12.2 11.3-34.4 12.3-48.6.4-5.7-.2-11.6.1-17.3l.5-2.8c2 0 .8 1.6.8 2.8a168 168 0 0 1-4 41.9c-1.3 5.6-3.7 11.1-4.9 16.8 1-.7 1.6-2.2 2.1-3.2 2.7-5.7 5.2-13.6 6.6-19.8 3-13.5 2.6-27.2 3.7-41 2.6.4.9 3.6.8 5.3-.3 6.3-.1 12.6-.8 18.8m-13.1 42.8.8-2.6c-.7 0-2 2.3-.8 2.6&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M441.9 595.6a36 36 0 0 1-12.4 5.6 46 46 0 0 1-17 1.9c-.6-3.7 2.9-2.8 5.3-3.8 2.3-.9 5.4-3.7 4.9-6.4 2.4-1 3 2.3 4 2.5.5.1 1.6-.7 2.5-.8 2-.2 4.1.3 5 2.3 0 1.2-2.2.6-2.6 1.1-.2.4-.3 1.3.6 1.3 1 0 5.4-2.2 6.6-2.8 8-4.2 18.6-15.6 16.8-25.3-.3-1.4-2-4-.2-4 1.3-.1 2.2 1.2 2.5 2.4 2.5-.3.7-5.8 0-7.4a10 10 0 0 0-8.4-5.7c-2 0-3 1-4.8 1.3 1.7-5-5.1-1.6-7.2-5 2-1 4.9-.9 6.4-2.9-1.6-.3-3.9-1.4-1.7-3 2.3-1.5 10.8-1 13.1 1.1-1.2-4.4-6.3-5.8-10.4-5.5-4 .3-6.1 3.9-10.7 3-.3-.7.6-3.2-.7-3l-3.9 3.2 1.2 3.2c-4.1 0-1.3-6 .1-7.7 6-6.7 18.8-3 24.4 2.8 11.7 12 6.7 34.2-4.3 45-2.9 2.8-5.9 4.5-9 6.5m17.2-38.3a12 12 0 0 0-11.9-7.2c-.2 1.3.4.7 1 1q1.8.3 3.5 1.2z&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;m465.8 455.3-.3 8.8 1.2.2-2.8 5.7c-1.8.6-2.8-2-3.1-3.4-1.4-1-3.8 5.1-3.8 6.1l2.7 1.5c1 1.4-2.2 4.5-2.4 6.1-3 3.7-7.6 10.8-8.4 15.4-.1.6-.3 1.2.6 1 1.3-.9 2.3-3.5 3.8-3.8 1.6-.3-.2 2.5.2 3q1.4 0 2.6-.2c1.9-.6 2.5-3.2 4.2-3.7-.9 4-4.1 6.7-5.8 10-.1 1.7 3.8.1 2.6 3-.3.9-1.9 1.1-2.7 1.7-3.7 2.7-8.3 4.7-11 8.4-.5.6-3.7 6-3.8 6.4-.6 1.9 3.1-1.4 3.4-1.6 2.7-1.4 8.5-2.5 11-.5-2.4 3 1.2 3 2.7 4.6 1.5 1.4 3.4 5.8 1.7 7.4-1.1-.6-1-2.6-1.6-3.3-.6-.5-4.7-2.4-5.4-1.8l1.1 2.8-1 1c-3.2-3.4-11.6-3.6-15.5-1.6-4.3 2.2-8 12.5-11 16.5-1-.7-.6-.7-.2-1.4 1.7-3.4 4-6.5 5.9-9.8a239 239 0 0 0 16.7-39.3c2.5-7.4 4-15.5 7.3-22.7 1.6-3.6 4.3-10.5 9-6.5q1.5-5.4 0-10.6l2 .5m-9.2 20.7-2.2-.5v1.3c.9-.6 2.5.6 2.2-.8m-1.3 4.2-.7-1.7q-2 1.7.7 1.7m-6.8 42c-2.2-.3-4-.4-6 .6-.6.3-1 0-.8 1 .3.3 4.3-1 5.1-1 1.1-.3 2 .8 1.7-.7M371 484l.9-.2c.2-.9.5-2 1.6-1.9.6 1.8-.2 3.5 0 5.3.5 3 1.9 7 2.4 10.3q.6 3.8 1 7.7c2 .4.4-3.3 2.1-3 1.4 14-.2 28.7-3.1 42.4a46 46 0 0 1-5 14q-1.6 1-2.8-.3a96 96 0 0 0 4-44.7c-.3-1.6-2.8-7-2.8-7.4.2-1.2 2.3.6 3 .2.3-.3-.9-5-1.1-5.8-.7-2.4-2.4-7.2-3.5-9.3-.6-1.3-2.5-2.3-3-3.4-1-2.7 3.6 1.4 3.8 1.2a43 43 0 0 0-6.6-17c-.7.4-.5.9-.6 1.5-1 5.8.4 17.3 4.5 21.8 1.2 1.3 3.8 1.7 3 4.3-7.8-5.2-9.7-17.5-9.2-26.1 0-1.3 1-3 .8-3.7-.1-.6-2.2-3-2.7-3.3-1.3-.8-3.4.2-3.2-1.9.1-1.3 1.2-1.2 2.2-.9 1.4.5 5.6 5 6.6 6.5 3 4 6 9.2 7.7 13.7m27.5-104.3c.6 0 1-1.2 1-1.7.4-1-.2-2.4 1.1-2l3.4 22 1.3-2.1c1-.4 1.1.8 1.1 1.5 0 13.7 3.8 28 2.7 42 0 .7.1 1.3-.6 1.8l-5.1-13.6c-.8-3.8-.8-7.7-1.7-11.4-1.3-5.6-4.2-11-5.3-16.6l2.1.9c1-1-6.7-17.1-8.8-19l.1-1.8 3.6 2.1c1.2-1.3-6.4-19.8-7.6-22.6-1.4-3-3.7-5.7-4.2-9h1.3a137 137 0 0 1 15.6 29.5M127.7 609.6a190 190 0 0 0 34.8 20.5c3.3 1.5 8.3 2.6 11.4 4.3.8.4.6.4.6 1.3q-18.5-6.5-35.1-16.8a120 120 0 0 1-25.3-19.6c-1-1.3-1.5-4.1-4.2-3.7s-2.1 6.7-2 9c1.2 14 8.2 26.4 7.7 41.1l-.5 2.3 3.2-.4c10.8.3 23.9 5.7 35.2 5.1 1.6.2 3.5.8 5 .9 6.1.4 26 1.3 30.1-3 .5-.5.7-2.5 1.3-2.5 1 0 .1 2.7-.2 3.2-1.3 2-3.7 2-5.6 2.4-16.8 4.3-38.5 0-55.6-2.7-4.4-.7-8.7-1.9-13.2-2l-.6.2c-.8 1-2.4 3.2-3.4 3.7-1.2.6-3.3.6-4.8 1.2-4.3 1.9-2.6 9 2.2 5.9 1.3 7.1-5.6 5.5-6-.7 0-1.6 1.2-6.4 2.2-7.6 2.4-2.6 6.5-4.1 8.1-8.4.5-1.2 1-4.6-.9-4.5-.4 1.4-.8 5-2.5 5.3q-.7-.2-1.8-.2c-.6.2-.9 1-1.6.8-1-3.2-.9-5.4 0-8.6.4-1 2.5-4.9 2.5-5.2 0-1.3-2.3.9-3 .2.2-1.6 1.2-3 1.5-4.6 2.2-9-2.7-20.7-.4-29.7 1-3.6 5-3.4 7-.6 1.4 2.3 1.3 3 3.6 5.3 3 2.9 6.8 5.7 10.2 8.2&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M370.1 312.4c1-.2 1.6.8 1.7 1.7l1.1-.4c.7-1.1-2.3-6.2-2.4-8.3 0-2.4 1.8-5.4 2-7.4 0-1.1-1.3-3 .4-3 1 0 2.5 2.3 2.8 3.4 2 0 1.3-3.2 1-4.6-1.1-4.3-4-4.8-2.7-10.8 1-4.2 5 0 3.3 1.6-.7.8-2.5-.3-2.5 1.3 0 2.7 3.3 2.7 4.6 4.8 4.5 7.7-3.5 20.7-4.6 29.1-2.2 16 4 35.8 8.6 51.2 7.6 25.2 16.8 50 23.8 75.3 1.6 5.8 2.5 12.6 4.3 18.2.5 1.6 3.1 4 1.2 6q-.7-.6-.8-1.7c-5.7-16.2-9.7-34.4-14.8-51-7.8-25.4-16.7-50.2-23-76.1-1.6-6.4-4-12-4-18.9 0-3.6 1-6.8 0-10.4m-2.9 237.3-.4 1.5a91 91 0 0 0-19.2 7.5 163 163 0 0 0-41.2 33q-3.3 3.5-7 6.6c0 1.4 1.6 0 2.2-.5 1.5-1.2 3.3-3.5 4.8-4.8 17.5-15.7 35.5-32.2 58.7-38.9 1.2-.3 2 1 1.1 1.9-.5.4-7.4 2-9 2.6-32.7 11.6-52.3 43.4-82.5 59.8a132 132 0 0 1-89.3 13.4c-1-.2-2.3-1.6-3.2-.6-.7.7-.5 2.8-1.8 3.3-.4-3.4 3.9-7.4 6.8-8.3 2.6-.8 6.4-.3 9 .7.9.4 7 3.3 5.8 4.6-2.5 1-2.9-1-4.8-2.2-4.1-2.6-10.6-3.4-13.8 1q7.8 1.6 15.8 2.5a128 128 0 0 0 62.8-10.1c33.7-14.9 54.5-50 87.3-66.1 3.8-1.8 12-5.7 15.8-6.7q1-.3 2.1-.2&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M396 545q0-1 .3-2c1.6-4 4.8-8.4 6.7-12.4 27.1-58.7 26.7-125.4 9.3-187C404 315 393.3 287 383 259c-.7-2 1.4-4.5 2.6-1.7 15.3 45.8 33.2 92 38.3 140.5 5 46.9-.9 97.6-23 139.7-1.4 2.5-3 5.7-5 7.6M107.9 646c.2.3.2 1.6-.2 1.6-4.4-.1-8.7-1.2-13-1.7-26.7-2.9-61.3-5.8-87 1.6-2.8.8-7.8 2.9-6 6.3 3.4 2.5 5.5-.6 8.3-1 3-.5 3.4 2.8 1.6 4.5-1.2.6-.4-2 .1-2.3-2.3-2.6-4.6 1.2-8 .6-5.8-.9-3.8-7-.5-9.7 2.2-1.8 7.6-2.4 8.9-4.2.8-1.3-1.7-.9-1.1-2.6 4.6-.7 8.2-1.2 12.9-.8 12 1 24 .7 36 1.7 14.8 1.2 29.4 3.9 44.1 5.5.9 0 3.3-.6 4 .5z&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;m417 252.7 2.3 3.9q.3.9-.7.7c-1.8-.1-2-1.8-3.1-2.8a40 40 0 0 0-8.3-4.5q-2.3-.9-4.9-.8l10.6 5.3c1.5 1.5 3.7 3 3.9 5.3a28 28 0 0 0-15.2-8.8c-15.4-3.4-31 7.6-35.9 22-10.1 29.8 5.3 64.5 12.8 93.1.2.6.5 1.6-.5 1.4a19 19 0 0 1-2.1-4.3c-8-21-16.2-52.3-15-74.8 1.3-27.3 21-50.6 50-39a32 32 0 0 1 6.1 3.4&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M374 264.4q1.9 6.4 4.6 12.6c8.4 19.6 17.6 38.6 24.6 58.9a310 310 0 0 1 18.2 95.3c.6 32.4-5.5 66-18.4 95.6-.6-.3 0-1.1.1-1.6.7-2.3 2-4.6 2.7-7a251 251 0 0 0 13.5-106.4c-4.4-45.3-19.4-82.2-37.6-123-2.4-5.4-6-11-8-16.2-.5-1-2-5-1.9-5.8 0-1.1 1-2.8 2.2-2.4m-91.1 406.1-5.2-3.5c-8.4-3.5-15-9.2-22.8-14.1l-.8-2c2-.2 3.3.3 5 1.3 1.4.8 2.4 2.4 3.5 3.2 4.7 3.3 13 7.4 18.8 7.9 2.6.2 4.9-.5 7.4-.5a6 6 0 0 1-3.5 4.2c-.6.1-.3.6-.1 1 1 1.2 10.8 4.3 12.7 4.5 4.3.5 15.2-1 16.3-6.2.2-1.4-1-2.2-.9-3.2 0-.4 1.4 0 1-1.1l-3.9.8v-1.4l4.6-1c6 6.1-3.5 12.2-8.8 13.7-9.2 2.5-17 .9-25.7-2l-.5 1c.8 1-.5 4.6-2 4.1-1-.3-.6-2.5-.8-3.4-.7-2.3-8.5-5.9-10.8-7.4a134 134 0 0 1-16-13.3c-.5-.8-.8-1.1-.6-2.1 1-.2 1.8.5 2.5 1 2.5 1.8 4.8 4.4 7.3 6.3a71 71 0 0 0 18.9 11.2zm161.4-312.8c-.3 2.7-1.5 5-1.7 7.8s-.3 9.2 3.6 9.2c4.3 0 2.3-6.4 5.7-8.7 2.5-1.8 7.7 1 8.7 3.5l1 4.1c0 .5-1.7 4.5-2 5-.8.9-2.5 1.2-2.5 3.1 0 .6 1.8 3.4 2.2 4.4 2 5 .2 14.5-6.5 14.4-1.2-2.7 1-6.9-2.8-7.6-.8-.2-3.4 0-4 .5l-.5 1.3c-11.4 13.3-3.3 31.2-1.3 46.3 2.6 19.7 2.5 41.9-3.5 60.9-.1.5-.5 2-1 2 .5-3.8 1.7-7.5 2.3-11.3 2-11.8 2.2-24.5 1-36.4-1.6-15.6-11.2-49.9 1-62q3.3-3.4 7.6-1.6c3 1.3.5 4.2 1.6 6.6 4.5.1 5.5-8.6 5-12-.2-1.3-1.3-2.7-1.5-4-1-5 2.2-5.8 2.4-10 .1-2-.8-5.8-3.2-6.2-6-.9-5.1 6.8-7.8 9.5s-5.1-.7-5.8-3.5a28 28 0 0 1 1-14.4c.3-.7-.2-1.1 1-1zM385.8 651l2.1-.4c-.3 3.5-3.7 5.4-5.9 7.6 5.7 0 9.7-6 12.1-10.6 4.2 1 2.6 3.3.6 5.7-9.6 12.3-29.5 13.2-41.9 4.7-.9-.6-5.6-4-4-4.9 2.8-1.2 2.9.6 4.5 1.4 1.7.9 8.3 1.6 10.3 1.7 4.8 0 12.1-5.2 13.8-9.8h1.2l.9 1.9 1 .1 3.9-4.1c3.5 1.5 1.6 3.9 1.4 6.7m-2.5-.4c-.7-.6-1.1.3-1.4.5-2.4 2-4.8 4.1-7.6 5.5-4.4 2.2-7 2-11.5 2.5-.7 0-1.3.2-.7.8 3.8 1 11.2.4 14.4-1.9q.7-.7 1-1.3c.6-.5 6.8-5.2 5.8-6zm31.7-95c0 1.7.3 3.4-.3 5-.3.9-1.4 1.5-2 2.3-3.2 4.8-7.5 12.9-13.2 14.7q-1.2.2-2.3 0l1 2.6c1.2.3 1.4-3 2.8-1l-2.5 2.6.9 3.7c.1 2 .2 8-2.6 7.9 1-2.6 1.2-4.4 0-7.1-.6-1.7-2.5-2.7-3.8-4.1-.6-.7-1.4-3.5-2.2-1.8-.3.5-1.6 3.1-1.6 3.5-.4 1.8 2.5-1.6 2.1.6-2.4.3-3 3.6-5 4.7.4-2.2 4-3.2.3-4.5 0-.6 1.1-1.3 1.2-2.1.6-5-7.4-10.5-11.1-13-.4-3.2 1.7-4 4.6-2.8.9.3 7.5 4.7 8.5 5.5.8.6 1.7 3.2 2.8 1.8a40 40 0 0 0-6.2-6.1c-1.4-1-5.8-3.2-6.5-4q-.7-1.1-.4-2.4c6.4.1 11.6 4 15.9 8.5 1.8 1.9 2.6 4.6 5.8 5 .8-1.3 2.2-1.5 3-2.4 1.6-1.7 5.7-8.3 7-10.5 1-1.9 1.6-4.3 2.9-6 .2-.3 0-.7 1-.5M32.6 636.6c-.4-1.7 4.5-2.9 3.4-4.2-.8-1-11.4-.9-13.2 0-1.5-1.4 5.6-3 6.2-3 4.2-.5 9.2.2 13.5.8l.6-.6-.2-1.9 1.7-.7c1.8 1.8 5.1 2.6 7.7 3.2 14.3 3.7 29 6.2 43.5 9.5 1.5.4 4.3 1 5.7 1.5 3.7 1.3-.7 2-2.5 1.7-7.2-1-14.7-3.1-22-4.3-13.9-2-27-3-40.9-2.4-1.2 0-2.3.6-3.5.4&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M392.6 543.3q5-12.2 9.4-24.6 3.6-9.7 6.6-19.8c16.8-61.4 4.3-125.1-24.7-180.6-1.5-3-4.5-5.8-4-9.4l1.9.5c2.5 6 6.2 11.5 8.9 17.3 21.7 47.2 33 105.2 22.6 156.6-3.3 15.8-11.4 45.3-19.4 59-.3.6-.3 1.3-1.3 1m-136.8 79.3v1.3l-1.8-.1c-1.5-.4-5.9-3.1-8-4q-10.6-4.4-22-5.2c1 1.9 3.7 1.4 5.5 2 4.9 1.5 15.3 5 19 8.3.1.1 1 1.4-.1 1.1a91 91 0 0 0-31-11.3c-.6-.1-9.1-1.1-7 .7a78 78 0 0 1 32 11.2c.3.5.6 1-.4.7-.6-.2-2.4-1.6-3.4-2-10.3-5.1-26.1-10.9-37.6-9.4-2.2.3-5.7.9-7 3q2.6-.9 5.3-1.3c9.9-1.2 18.8 1 27.8 5.1 2.2 1 7.6 3.7 9.4 5 .7.6.8.8.7 1.7-.6.6-9.5-5.1-11-5.8-13.3-6.3-28.6-8.2-41.3.8-5 3.7-9.2 11.8-4.2 17.3 2.7 3 5 1.4 7.7 2.4.7.3 2.7 2 1.1 2.7-.1 0-.7-1.7-1.7-2-3-1-4.2 1-7.5-1.9-5-4.3-4.1-8.7-1.4-14 6.8-12.8 22.3-15.5 35.6-16a86 86 0 0 1 41.3 9.8m-39.2 40.8c.3.2 1 2 1 .4-.7-2.5-2-4.8-2.8-7.3-.6-2-3.3-9.6 1.1-7 2 1 2 3.6 3 5.5s2.4 4.4 3.6 6.1c.8 1 3.7 3.7 3.8 4.2.5 1.2-1.4 1.8-2.3 1.7q-.2.9.4 1.5c.7 1 5 4.7 6.1 5.3 2.2 1.2 4.7.6 6.9-.4q.4-.6 0-1.3c-.6-1-2.7-1-2.4-1.9 3.5-3.2 5.6.8 3.3 4.1-2.3 3.4-8.2 1.4-11.4.2-2.5-.9-4.2-2.3-6.5-3.3l-1.9 2.4c-2.2.4-1.4-2.4-2-3.6-.4-1.1-2.5-2.1-3.3-3-.8-1-3.3-6-3.7-7.3a45 45 0 0 1-1.6-11l2.6.2c1.6 5.1 2.3 10.5 6.2 14.4m227.6-525.2V176l.4 2.3c4-1 5.6 3.2 3 5.8-1 1-2.6-.3-3 2.5-.8 6 .1 15.6 0 22-.3 39.7-1.8 79.9-1.4 119.6 0 5.7-.7 11.6.2 17.3.3 2 2.3 3.4.2 5.3-.6.5-1.9.8-2 1.1-.2.8 1.7 1 2.3 2 .3.5 1.2 3.2.5 3.3l-2.3-3.5c-.5-.7-1.3-.4-1.3-1.8 0-1.9 1.5-1.2 2-1.9 1-1.4-.6-3.1-.7-4.4-.5-3.3 0-8.3 0-11.9-1.2-36.1.5-72.4 1.3-108.5.2-12.6-.6-26.7.4-39 .3-4.4 1.5-2.4 3-3.4.6-.4.4-2.3.3-3.1l-3.3-.1-.5-1.9.2-39zM351 568c-.7.8 2.6 1.6 3 1.9.6.3 2.8 2.4 2.1 3.1-2.3-.7-4.7-2-7.2-1.3l.5 3.4c-3.2-1.5-5-1.2-8.3-.4-11.5 3-21.1 13-30.7 19.5-.6-.6 4-3.8 4.5-4.4 12.4-12 28.6-24.3 45.8-28.1 1.9-.4 10.8-2.3 11.8-1 .6 1.3-1.3 5.3-2.4 5.7-.6.3-3.3-.6-4.4-.6-5-.2-10 0-14.6 2.1&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;m390.4 543.2-2 .6v-1.5c.9-5.7 4-13.7 5.6-19.8 2.7-11.2 5.1-23.1 6.6-34.5.6-4.9.4-10.6 1.3-15.2.2-.8.3-2 1.3-2.4l3 10.5c-3.6 21-8.4 42.2-15.9 62.3M75 623.9c.2-.3-2.7-3.5-.7-3 1.5.4 4 2.4 5.6 3.3l8.7 4q7.6 3.5 15.5 6l.3.5c-.3.6-.1 1.8-.5 2.3-.6 1-6.2-.6-7.5-1-10.9-2.8-22.3-7.8-33.6-8.7-1.1 0-2.6 1.1-3.1-.5q2.4-.8 4.9-1.2c1.2 0 3.8 1.4 4-.9-5.4-1-10.8-4.2-16.1-1.7-.3-1.2.8-2.2 2-2.4 6.5-1.5 14.1 1.9 20.4 3.3m167.3 37.7c1.4-1.6-7.5-9.2-8-10.8q-.3-.9.6-.6c5.7.3 8.4 7 12.7 9.7q2.4 1.5 5.3 1.7c-1 2-2.7 1.5-4.4 1.7-1.4.2.1 2 .6 2.8 3 4 9.6 9.9 14.6 10.4l4.4-.3c2.2-1 .6-2 .5-3.6 1-1.3 6.5 2.6 1.8 4.6-7.1 3-16.5-2.7-22.1-7-2.5-1.8-4.8-4.3-7-6.5l-1 .7c0 .2 1 3.4-.3 2.7-1-2.8-3.4-3.1-5.2-4.9-2.8-2.6-4.7-8.2-6.9-11.4l.7-1c.8.4 1.7.3 2.6.8 2 1.2 7 8 9.7 10.2.4.4.7 1 1.5.8M357 593c-3.7-.3-8-1.6-11.6-1.8a61 61 0 0 0-26.5 5.3q-1.4.7-2.5 1.7c3.6.3 7.1-.5 10.7-.2 7.5.6 16 4.7 22.3 8.7.5.4 7 4.3 6 5.3l-14.8-8.8a42 42 0 0 0-13.9-4c-4.5-.4-10.9-.6-14.6 2.4 0 .9 5.3.6 6.4.8 3.2.6 9.4 5.3 11 8.1 1 2 .1 3.9-1.4 1.8-2.3-3.3-3.8-6.5-8.1-8-5.5-1.8-15.2-.7-15.1 6.6 0 1.2 1.8 2.6 2.8 2.6 1.1 0 4.5-3.2 5.2-.4.3 1.2-4.3 5-5.4 5.8a55 55 0 0 1-17.7 7.4c-3.8.2-8.4-4-3-5.4 0 1.8-.6 4.2 1.8 4.3a37 37 0 0 0 13.2-4.2 46 46 0 0 0 7-4.6q.6-.6.4-1.4c-6 0-6-5.1-3.8-9.5 6.4-12.7 36-17.5 48.8-14.6 1 .2 3 .7 2.8 2m-227 39.5-.4-2.8c1.8-.6 2.6 2.7 4.3 4.2 8.1 7.5 29 13.5 40 14.6 1.3.2 2.9-.1 4.2 0 .6.1 1.3.4.6.9-5.8.5-11.3-.3-17-1.4-8.7-1.7-18.1-4.5-26.5-7.4-6-2-12.2-5.8-18.7-6-1.6-1.3 5.5-1.7 5.9-2-1.5-2.9-8.3-1.9-6.8-5.3zM462 585c.7.4 2.8 6.4 3.7 7.4 10.6 40.6-25.9 73-65.2 56a74 74 0 0 1-17.7-10.7c2-.4 3.9 2.1 5.4 3a57 57 0 0 0 45.1 9 44.8 44.8 0 0 0 27.5-64.6z&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M182 640.4c2.4.3 5 1.5 7.2 2 46.2 9.7 95.2 8.4 138.5-12l2.2.5c.1.6-.7 1-1.2 1.4-2 1.1-8.6 3.3-11.3 4.3a225 225 0 0 1-124 7.5c-2.5-.6-6.4-1.3-8.9-2.1-.8-.3-2-.7-2.4-1.6m277.7-100.3c11.5 13.7 7.8 36.1-3.5 49a48 48 0 0 1-26.6 15.8c-3.1.7-16.8 2.7-19 1.4q-.5-.4-.4-1c2-.7 4 .2 5.7.2 26.6-.5 55.1-21 49-50.4-3.4-15.5-13.2-21.5-27.8-24-.7-.2-1.6.4-1.4-.7 1.6-1.2 4.9-.4 6.8 0a29 29 0 0 1 17.1 9.7m-35.3-6.1c-.6-.6 3.5-9.2 4-10.6 6.4-18.6 11.2-45.8-.5-63.1-1.5-2.2-3.3-1.9-2.3-5.4.1-.6-.3-1.2.7-1 3.9 4.2 7 9.3 8.4 14.9a88 88 0 0 1-6 57.5c-.8 1.7-2.2 5.4-3 6.8q-.3 1-1.3 1&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M429.9 528.5c-.8.1-.4-.9-.2-1.3l4.3-11.3c8.4-26.5 8.3-50-6.1-74.2-.3-.5-1-.6-1.1-1-.4-1-.7-3 .3-3.7 1.2 0 4.7 5.6 5.5 6.8 14.8 25.2 8.3 59.3-2.7 84.7M364 327c.1.3.8 0 .6.4l-1.2.6c-.2-1.7-1.4-3.1-2-4.6-8.8-25.6-9-62.6 15.4-79.6 1.6-1.2 8.4-5.6 9.7-3 1 1.8-3.5 2.2-5.2 2.8-22.2 9-26 41-22.8 61.6.6 3.4 3.9 19.7 5.4 21.9&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M463.3 438.2c-.4 1.5-2.2 2.3-3 3.5-5.3 7.2-8.5 30.6-11 40.3q-4.8 17.4-11.3 34l-7.3 14.2c2-6.2 5.5-11.8 7.8-17.8 3.5-8.8 6.4-19.1 8.6-28.3 3-12.8 5-32 12.2-42.9.8-1.1 2.5-3.3 4-3M253.2 641.7l-1.6 1.7c1.7.2 4.3-1.4 5.9-.2.1.9-2.2 1-2.8 1-19.8 2-44.3 1-63.8-3.5-2-.4-7-1.6-8.6-2.4q-1.1-.1-1-1.3c23.4 6 48 9 72 4.7m157.5-88.6-4.7-.4c-.4 1.5 2.4 1 2.6 1.2l-.2 1.3-.9.5c-3.6-.2-7.5-1.8-11-2.2a136 136 0 0 0-11.8-.4c-2 0-5.4 1-7.2.8-1.6 0-1.8-1.6-.3-2.4.9-.4 4.5-.8 5.8-1q13.4-1.3 26.7 1.4 1.2 0 1 1.2m-7.6-.4c-.4-1.1-1.6-.9-2.6-.9.3 1.1 1.6.9 2.6.9m-35.6 40.7c-.1-.8 1-.5 1.4-.4 2 .2 3.9 1.1 5.7 1.5 6 1.2 19.5 3.8 24.8 1.7 1.2-.5 2.6-3.6 3.9-.7.7 1.6-.3 3-1.5 4 1 1.2 3.3 0 3 2.1-.4 1.3-5 .3-6 .2-7.7-1.3-18-4.1-25.5-6.4-1.8-.6-3.7-1.9-5.8-2M343 171.6a41 41 0 0 0-.5 22.8c2 8.6 6.8 16.2 9.2 24.3.4 1 1 2.7.4 3.8l-1.2.8c-1 .2-.6-.3-.8-1-1.6-4.3-3.6-8.5-5-13-2.9-9-7-28.1-3.4-36.6q.3-1.2 1.3-1m20 218.7c-2.5 2.6 2.2 9.3 4.1 11.2 3.8 3.5 15.4 7.1 17 9.7q.6.7.4 1.5-1.5 0-3-.6a78 78 0 0 1-16-9.8 28 28 0 0 1-4.5-7.8c-.7-3.5 1.5-10 6-6.8 3 2.1.5 6.7-1.4 2.2zm7 185.4c-3.5 4-6.7 9.5-10.4 13.1-1 1-1.6 1.9-2.1 0q10.5-12 18-26.5c1.2-2.4 1.4-6.4 4.6-6.8l.6 1zm-32.9 77.3v1.3c-1.4-.3-2.7.3-4 .4a165 165 0 0 1-43-1.8 56 56 0 0 1-12.7-3.5c0-.8 1.2-.4 1.6-.3 8 1.2 16.1 4.5 24.5 4.8l4-.4c-6.4-1.5-12.9-2.4-19-4.5-.5-.1-3.9-1.1-3-1.9q3 1.1 6.2 2c11.2 2.9 21.7 5.5 33.3 4.8 4-.3 8-1 12.1-.9m22.3-130.3c6.7 5.6 5.6 17 5.6 25l-1.4 1.5c.4-7.7 1.3-21.7-6-26.6-3.8-2.6-12.2-2.8-12.3 3.1 0 4.5 8.6 5.8 6.3-.3 3.9.3 1.9 5-1.2 5.5-5.8.8-8-5.5-4.3-9.4 3.6-4 9.7-2 13.3 1.2m99.7 120.6c4.1-.9 7.8-.8 8.4 4.2l.5-1.5.8-.2c.7 2.3-.6 2.4-1.1 3.1-.6 1-.2 3.6-2.7 3.3-.3-.3 2.8-4.6-1-4.3-2 .2-2 1.6-4.8.1-6-3.2 2-12.2 3.7-16l3-7.4c-.3 2.7-1.6 6-2.8 8.5-1.5 3.2-4.8 6.3-4 10.2m-59.9-13.9c.5.6 1.7 4.8 1.8 5.7.4 3 .4 11-4.4 7.8-.6-1 .1-3.4-.3-4.8s-3.9-2.4-.5-3.7l3.6.2c-1-1.9-3-4.8-5.5-3.6-.7-4.2 3.3-4.1 5.3-1.6m-237.9 19.8c-.7 1.4-3.6.2-5 0-9.4-.9-19.6-2.9-29-5.2-3-.8-10.3-1.6-9.2-5.8 14 5.2 28.4 9.7 43.2 11m183.4-42c.5.6-1.4 1.6-1.7 1.9l-5.3 3.6c-13 8.3-27.7 15.5-42 20.8-.3-1.2.3-.7.8-1 13.5-6.5 26.5-11.7 39.2-20.1 1.7-1.2 5.4-4.8 7-5.4.9-.3 1.3.1 2 .3&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M186.7 648.9c1 .9-3.5 3-4.2 3.2-9.3 2.5-33-.9-43.3-2.5-4.6-.7-15.7-2.2-19.6-3.7-.7-.2-1.2-.3-1-1.2 6.8.6 13.4 3 20.1 4.1 6.8 1.2 15 2 22 2.5 5.7.5 17.6 1.5 23-.6 1.2-.5 1.8-1.6 3-1.8m-62.8-46c2.1 1.4 6.5 4 8.1 5.4.4.3.3 1.4 1.2 2 1.3.8 5 2.6 6.7 3.5q13.3 7.3 27.4 12.4c2.2.8 5.4 1.3 7.4 2.3.6.3 1.2.4 1 1.3a147 147 0 0 1-30.4-12.1q-6.3-3.4-12.7-6.4c-.8-.4-1.3-1.8-2.2-2.5-2.6-2.3-6-3.7-8-6.5q.9-.1 1.5.5m239.9-416.3q-1.9.1-2.1-1.5a127 127 0 0 1-1.3-44.3c.7 0 .5 1.5.4 2-.7 11.4-1 22.3.9 33.7.6 3.4 2 6.6 2 10m-25.3 32.7c-3.8-1.5-4.8 1.8-5.1 4.9-1 9.3 4.9 14.3 7.9 22.1.6 1.7 1.4 5.3-.9 2.6-2.6-3-7.8-16.1-8.2-20.1-.3-3 .4-8 2.3-10.3 1.4-1.8 4.4-2.2 4 .8m105.9-81.4c-.9-.2-.8-2.4-.9-3.1-.3-14 .3-28.2.5-42 0-5.8-.5-12.2 0-17.8 0-.5.2-2.4.6-2.3zm-64.4 307.7a36 36 0 0 0-12 9 35 35 0 0 0-6.4 11.4c-1.4-1.1-.4-2.9 0-4.1 2-5 8.3-13.3 12.6-16.2 1.6-1.1 5.4-3.1 5.8 0m38.9 51.2c.7 6.3 2.3 12.6 3 18.9.4 3.6.8 8.3.9 11.8 0 1 .2 2.1-.7 2.8-1 .2-.6-.8-.6-1.5-.4-9.7-3.1-18.8-3.8-28-.1-1.2-.5-4 1.2-4M443.2 27s.6.2.8.6c1.2 3.2-1.2 4-1 5.2 0 .2 2.9 1.4 2.3 4-.8 3.3-3.4.7-5 1.8-2.8 2 2.2 5.1 2.8 6.4a70 70 0 0 1 1.8 18c0 2-.1 4.8-.3 6.9 0 .6.3 1.2-.5 1.7-.4-6 .1-12-.2-18-.2-2.2-.6-5.5-1.5-7.4-1.1-2.2-5.4-5.4-2.8-8.3 1.3-1.4 4.6 1 4.7-1.2 0-2.2-1.8-2.4-2.2-3.4-.9-2.2 1.4-2.9 1.3-3.8-.1-.7-2.7-4.5-3.2-6.2q-.3-1.3-.2-2.5zm-40 578.2-1.8.4c-7.7-.7-20.5-5-28.2-7.5a63 63 0 0 1-10.7-3.7q.9-1 2.2-.5c5.2 1 11.2 4 16.4 5.7 6.7 2 13.5 3.1 20.3 4.7.7.2 1.8-.7 1.8 1m-197.6 16a60 60 0 0 1 20.6 8.3c.3 1.2-1 1.5-2 1.5-.8-.1-7.2-4.3-9-5q-6.9-2.9-14.4-4.2l-4.8-.6c3 .3 6.6-.3 9.6 0M454.4 573l-4.6-4c-4.5-4.7-11-9.6-16.9-12.4-2.4-1.2-6.2-1.9-8.3-3-.6-.4-1.3-.4-1-1.4.4-.3 6.5 1.7 7.4 2 4.6 2 21.3 12.7 23.1 16.8q.4 1 .3 2m-88.1-4.2c.2.2.5 1.6.2 2-3.6 4.7-6.5 10.6-10.3 15.2-.7.8-1.9 2.2-3 2.3-1-1.2 5.3-9 6.3-10.5 1.2-1.9 3.7-8.3 5.1-8.8.4-.2 1.4-.4 1.7-.2m9.7-96.2c-2.7 1-6.2-2.6-6.7-5A16 16 0 0 1 376 451c.8-.5 4-2.7 4.6-2.6.5 0 .7.6.3 1-1.3 1.4-4.7 2.9-6.4 4.7-3.4 3.7-5.2 8.9-3 13.7 1.8 4.2 5 .2 4.7 4.8m.8 101.7c.2.3-1 2.2-1.4 2.6a145 145 0 0 1-24.3 25.4c-.7.5-1.5 1.2-2.3 1.2-1-.8 4.6-4.4 5-4.8q11.8-11 21.3-23.7c.5-.8.7-.9 1.6-.7m8.4-27.9a114 114 0 0 1 26.1 1.2c1.6.3 1.4 1.7-.3 1.6-1.8 0-4.1-1-6-1.2q-12-1.3-23.7 0c-1.4.3-2.8 1.4-4 .7v-.9c2.5-1 5.1-1.1 7.9-1.3M291 641.3q-1.1 0-2.1-.3c-4-1.2-24.1-10.6-26.7-13.1-.5-.5-1.1-.6-.9-1.5zm-115.7-2.2c-.8.8-19.2-7.6-21.4-8.8a93 93 0 0 1-15.9-9.8l16 8.8q8.2 3.4 16.2 7c.5.2 6.2 1.8 5.1 2.8m13.6-14.8c-.4-1 .9-1 1.6-1.1 5.1-.8 13.6 1.5 18.1 4 1 .5 7.6 4.3 3.4 4.3-2 0-5.7-3.4-7.9-4.5-4.6-2.3-10-3.8-15.2-2.7m137.6-11c.9.8-3.7 3.7-4.5 4.1a188 188 0 0 1-35.3 16.8q-2.1.8-4.2.7l16-6.3c9.5-3 17.8-10.8 26.2-14.8q.8-.6 1.8-.5m-42.8 28.8-.6 1.3-4.3-1.6a257 257 0 0 1-21-10.5c-.3-.2-4-2.1-3.3-2.8zm51.7 7.6-.2 1.3a96 96 0 0 1-35-5.3c-.6-.3-2-.4-1.6-1.5a95 95 0 0 0 36.8 5.5M365.3 281l1.2.4c.7 2.6 5.4 7.7 5.4 10q.1.8-.7 1.5c-.8.1-1-.2-1.5-.7-.4-.3-5-6.7-5.2-7.1-.5-1.3-.2-3 .7-4.1M243 641.7c-1.2.5-2.5-.8-3.5-.8l-2.1.4c-.8 0-5.5-3.7-6.2-4.5q-.6-.6-.4-1.4c1 .2 2-.4 2.8-.4a60 60 0 0 1 8.2 4.8c.6.5 1.4 1 1.3 2zm116.1-398c-.6-4.4-6-9-1.5-12.7l3.6 9.1c.4 1.6-.3 3.4-2 3.6m-83.1 401c-5.8-1.7-11.6-4.7-17-7.4-2.2-1.2-9-4.4-10.4-5.6-.6-.6-.7-.4-.5-1.4l13.1 6.5c4 2 8.1 4.4 12.3 6.3.9.5 2.6 0 2.5 1.6m176.6 7.6-5.2 1.2c-3-4.7 3.7-8 6.5-11l-3.2 7.2c1 .7 2.2 1 2 2.6M418 532.7c-1 .3-1-.7-1.2-1.5-.5-2.7-.6-6-1-8.8-.5-3.6-2-9-2-12.3q-.1-1.1.6-2c2.6 7.9 3 16.5 3.6 24.7M267.2 645.5q-9.5-3.5-18.5-8.4l-4.3-2.4c-.7-.5-2.2-1.4-2.2-2.3zm98.7 8c-.6.9-9.7.3-10.6-1.4 0-1.5 11.6-3.7 10.6 1.4&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;m330.7 652.3-3.1.6a102 102 0 0 1-34.5-5.6c-.6-.3-1.1.2-1-1l20.3 5q9.1 1.1 18.3 1m-105.8-11-6-.7c0-1.3-3.3-3.3-3-4.2.5-1 3-.7 3.8-.4 1 .3 6.3 4 5.2 5.3m153.3-7.7c-.3.3-1.5-.7-1.8-.9-4.4-3.3-8.4-8-12.3-11.8-.5-.4-4.8-3.5-4.1-4.2 1 .1 2 1 2.7 1.7a127 127 0 0 1 14.6 13.7c.4.5 1 .7.9 1.5m-12.9-437c2-.4 2 7.3 3.8 8.5.1.9-1.9 2.5-2.6 1.3-.6-1.6-3.7-9.2-1.2-9.8M207 635.8c1 2 3.7 2.6 3.9 5-4.2.1-6.3-.5-7.7-4.6zm143.6-372.7q-.6.3-1.1 0c-.3-.1-2.4-3.6-2.6-4q-.9-2.1.6-4c.8-.2 5.9 6.4 3.1 8m60.6 281.1c-1.4-5.6 6.2-9.8 10.4-11.8l.4 1.2c-3 1.2-8.2 4.6-9.3 7.6-.4 1.1.3 3-1.5 3m-18 41.8c0 .2.7.2.7.4 0 1.1-7 8-9 7.8l2.9-4.2c2.4-1 3.5-3.2 4.8-5.3.7-.7.2.8.6 1.3m40.5-325.4c2.4.2 2.3 3.7 1 5-1.8.6-4.8-4-5.7-5.2 2-1.1 3.9 3.5 4.7.2M393.9 442l-7.2 1.3c-2.4-3.7 7.6-5 7.2-1.3m21.6 106.4c.5 3.3-2 5-3.6 7.3-1 1.3-1.5 3.9-3.6 4.2 2-3.4 3.5-7.3 5.8-10.5.4-.5.5-1.1 1.4-1m-44.1-328.8c4-1.8 5.3 4.9 2.3 6.7zM410.2 443c2.5-.7 3.7 3 4 4.7.2.5.7.5-.2 1.1l-4.7-3c-.5-.7 0-2.6 1-2.8m3.9-13.7c-1.3.1-2.6-.7-3-1.8-.4-.6-1-5-.2-5 3.1 1.1 3 4 3.2 6.8M363.4 133c-1 0-.3-1.5-.1-2 .7-1.8 3.8-6.2 5.4-7.2.9-.5 4.4-2.2 4-.3-1 1-2.2.7-3.4 1.3-2 1.1-5 6-6 8.2M445.1 5.5c-.4-.4 2.4-2.7-.3-4.2-1-.8-2.5.4-3.3 1.2l-1.9 4.3c.3-2.3 1.3-5.9 3.8-6.5.5-.2 2.6-.4 3-.3 2.8.8 0 6.8-1.3 5.5m-91.5 588.3c.3.3 0 1.4-.4 1.9-.3.4-5.1 4.8-5.5 5q-1 .8-2.1.7c-.2-.8.4-1 .9-1.4 1.9-1.7 3.7-3.8 5.6-5.4.3-.2 1.1-1.2 1.5-.8m41.5-150.1v2.2l-7.6.4c-.2-1.1.2-.8.8-1 1-.5 6.3-2 6.8-1.6m-9.7 54.3s.5 2 .4 2.3c0 2.4-2 3.3-4 3.6l-.6-1c0-.5 2.5-.9 2.9-2.2 0-.4-.8-4 1.3-2.7m-36 95.4-3.6 4.5-3.2 1.8c-.2-.8.4-1 .8-1.5.6-.7 5.2-5.5 6-4.8m57.1-392.5v1.6c-.4.7-4.4.2-4.6-.6l.7-1.5zM338 604.4c.1.8-.2 1-.7 1.7s-5.3 4.2-5.7 3.8c-.2-.8.4-1 .8-1.5.6-.5 5.1-4.4 5.5-4m63.6-398.1c-1.5-2.2 3.2-2.8 3.8-1 .6 2.1-3.4 1.5-3.8 1M385 556l-1.4 3.8h-2c.8-1.7 1-4 3.4-3.7m-280 68.2c0 .8.2.9-.6.9l-6-.9c-.7-.1-.7.2-.6-.8q3.7-.5 7.2.8m247.8-44.1c.2.3-3 5.7-3.7 6.3-.4.5-.6 1.1-1.4 1-.3-.4 3.6-6 4-6.5s0-1 1.1-.8m-8.9 13.2-3.6 4.6c-.9-.6-.6-.6-.2-1.4.4-.6 3-4 3.8-3.2m15.6-260.7-2.6-6-.3-2c1.5 1.9 2.8 5.5 3 8m-20 274.3-6.7 5c-.3-.9.4-1 1-1.4 1.5-1.3 3.7-3.2 5.7-3.7m50.4-51.3c.4.4-2 5.3-3.3 4.3.1-.6 2.6-5 3.4-4.3m-14.9 17-2.9 4.5-1.3 1c-.2-.2 2.4-4.2 2.8-4.6q.5-.9 1.4-.9m25-.8a9 9 0 0 1 3.4-5.1l-2.2 4zm-44.9 4.2c.1 1.3-1.2 2.6-2.1 3.4.3-.9.8-3.5 2.1-3.4m53-15.7-3.9 5.1c.3-1.3 1.6-3.1 2.5-4.1.4-.5.5-1.2 1.3-1m-50.3 10.2q-.4-1.7 1.2-2.6.4 1.9-1.2 2.6m-67.4 64.8c-.5 1-2.4 1.4-3.4 1.3.5-1 2.5-1.1 3.4-1.3m137.2-101.7c-1-.3.2-3.2.9-3.4zm-133 100c-.4 1.1-1.8 1.4-3 1.3.4-.8 2.3-1 3-1.3m129.7-91.9 2.5-4.3a6 6 0 0 1-2.5 4.3m-40.1 49.7c-.7.7-1 2-2.3 2 1-1 2-3.2 3.4-3.2.1.8-.8.8-1.1 1.2M439.6 8c-.7.8 0 2.6-.8 3 .2-.8-.8-3.3.8-3m-77.1 128h-.8l.4-1.7h.4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/div&gt;
        &lt;svg class=&quot;paths&quot; fill=&quot;none&quot; stroke=&quot;none&quot;&gt;&lt;path id=&quot;moon-path&quot;&gt;&lt;/path&gt;&lt;path id=&quot;sun-path&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
      &lt;/div&gt;
    &lt;/header&gt;
    &lt;div class=&quot;clock&quot;&gt;00:00:00:00&lt;/div&gt;
    &lt;article class=&quot;article-content rendered&quot;&gt;
      &lt;section class=&quot;section&quot;&gt;
        &lt;p data-show-clock=&quot;&quot; data-set-scene=&quot;light&quot;&gt;I found myself on the eve of the new year lying restlessly on the floor of my apartment &lt;em&gt;(on &lt;a href=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/&quot; class=&quot;hover&quot; data-target=&quot;rug&quot;&gt;this great Mashhad rug&lt;/a&gt; from like 1937 which is ornate and beautiful, and for which I negotiated a blood-curdlingly screaming deal on a few years back, but which of course has nothing to do with this story)&lt;/em&gt;. Most of my friends were taking the year off hosting; I didn’t want to go out for the evening and sit in cold traffic around Denver to cheers with strangers, and I would be damned if I’d start my grand adventurous year with a story of staying home.&lt;/p&gt;
&lt;p&gt;So I grabbed the keys.&lt;/p&gt;

      &lt;/section&gt;
      &lt;section class=&quot;section&quot;&gt;
        &lt;p data-set-scene=&quot;lateNight&quot;&gt;A quick maps search showed if I left my house at 10pm, I could arrive at the foot of the Rocky Mountain Grand Tetons range, at an old beautiful building called Moulton Barn, exactly at sunrise. I’d spend the dawn of the year on an adventure, watching the furious red of the first sun of 2025 summit the peaks, while I drank hot coffee and The Rest Of My Life began.&lt;/p&gt;
&lt;p&gt;I put on a hoodie and a light leather jacket &lt;em&gt;(Vegan, thanks for asking, and yes I am thanks for asking)&lt;/em&gt;, somehow completely certain that the weather — at the beginning of January in rural Wyoming — would be warm enough for such an outfit, and I hopped in the car at 10pm. The moment I was free of the tangled interstate interchanges of Denver, the roads were completely clear, just me and the ever-present solemn semi-trucks. I could not believe my luck, and did not for a single moment consider that perhaps there was some great and obvious reason why no one else had decided to drive to the Western wilderness at 10pm on New Year’s Eve. I crossed the border out of Colorado at about 11:30 with a face so smug it would’ve gotten me convicted of crimes I was completely innocent of.&lt;/p&gt;
&lt;p data-set-scene=&quot;midnight&quot;&gt;Google Maps had offered a scenic route, which when plotting my adventure at 3pm I included without a second thought — &lt;em&gt;Well, let’s see about it&lt;/em&gt;, I mused. &lt;em&gt;What wonders will I be privy to on the road less traveled? Surely this will make all the difference.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;I had my second thought now, 30 miles into a wily and curving B-road, that perhaps sunlight would’ve improved the actual &lt;em&gt;scenic&lt;/em&gt; qualities of the route some. I drove through countless towns in the pitch dark, towns with charming names like Virginia Dale and Tie Siding. I did not see a single one of them.&lt;/p&gt;
&lt;p&gt;My first gas stop was at a truck station shortly after the Wyoming border, somewhere near Laramie. I picked up a little snack and an energy drink — I had never had a Red Bull before but I’ve seen what it does to some of you freaks, and that suited me fine for an overnight drive in freezing dark. I fueled the car while regarding the row of 30 semi cabs, which shivered from their idling engines and squinted suspiciously at me with glaring headlights from across the parking lot. I doffed my hat politely at the assembly and resumed.&lt;/p&gt;

      &lt;/section&gt;
      &lt;section class=&quot;section&quot; data-set-scene=&quot;pitchBlack&quot;&gt;
        &lt;p&gt;At around 2:30 in the morning, after many hours of wide-eyed abyssal staring along Highway 287 and then I-80, and then 287 again, and after many hours of an audiobook recording of Wuthering Heights narrated by someone who had only had a Northern accent ever loosely described to them, I hit a wall. I felt like my neck would fall off my shoulders at the sheer weight of my gigantic head, which I had somehow only now become aware of. I parked the car to nap — I did plan for this eventuality, and did quite sensibly have a paper-thin blanket folded at-the-ready in the passenger seat.&lt;/p&gt;
&lt;p&gt;It is here I should mention my car is a 30-year-old rear-wheel-drive German car, and the part that is important is that it is 30 years old. I woke with a phone alarm to a very, very cold car, which I had parked with the engine off on the side of a highway in 0ºF weather &lt;em&gt;(or -18ºC, had this story taken place outside of the United States)&lt;/em&gt;, to let cool for half an hour. I restarted the engine to get back on the road, and a while after pulling back off the shoulder, I realized, with my honed shrewdness and near superhuman situational awareness, that it wasn’t getting any warmer. Bleary-eyed and with hands gone completely white from the cold, I turned to the fourth wall with an infuriating “it’s a living” sort of expression. I donned gloves and wrapped the blanket tightly around my waist and legs, and &lt;del&gt;quite idiotically&lt;/del&gt; &lt;ins class=&quot;down&quot;&gt;quite bravely&lt;/ins&gt; persisted.&lt;/p&gt;
&lt;p&gt;It is here I should mention again that my car is a 30-year-old rear-wheel-drive German car, and the part that is important &lt;em&gt;here&lt;/em&gt; is that it is rear-wheel-drive. And before you start looking at me like my mom looks at me when she’s reminded of that: People overreact to road conditions and overestimate the utility of all-wheel drive. Tires are more important for traction in inclement weather than drive ever will be, and besides, all-wheel drive does nothing for you when you’re trying to stop. With proper tires, my rear-wheel-drive and a single ounce of common sense has gotten me through frankly &lt;em&gt;surprisingly&lt;/em&gt; dramatic weather conditions many a time.&lt;/p&gt;
&lt;p&gt;Or at least, that was my &lt;del&gt;heavy cope&lt;/del&gt; &lt;ins class=&quot;up&quot;&gt;solemn mantra&lt;/ins&gt; as the elevation increased towards the continental divide. The mantra, I must admit, grew quite insistent, as the clear but cold roads became lightly-snowpacked roads, and then became heavily-snowpacked roads, and then become a 3&amp;quot; snow track. At exactly the peak of the ascent, the snow on the roads grew to closer to 5 or 6 inches &lt;em&gt;(or 15cm, had the snow fallen on roads outside of the United States)&lt;/em&gt;, me and the car decided to completely renegotiate our relationship. Until now, I had been confidently commanding it a few degrees left, a few degrees right — whatever the road-going voyage asked of us. But now, a few hours before dawn, we decided together to explore the idea that perhaps the steering wheel was, perhaps, more for suggestions than outright demands. For instance, in this new arrangement, I would not be turning left so much as &lt;em&gt;suggesting&lt;/em&gt; we go left, and then when my &lt;em&gt;suggestions&lt;/em&gt; were rebutted, I would be slowing the car to 15mph &lt;em&gt;(24km/h, had the slowing etc etc)&lt;/em&gt;, and then 10mph, and often even 5mph, until my suggestion was taken a bit more seriously.&lt;/p&gt;
&lt;p&gt;The two of us went on like this for the next many miles, from Dubois down into the approach to the Grand Teton gates. As the elevation decreased, the snow subsided, and the car let me take over most of the steering again. Rather inequitably, the car did not use its newfound free time and focus to go about fixing the heater issue.&lt;/p&gt;

      &lt;/section&gt;
      &lt;section class=&quot;section&quot;&gt;
        &lt;p data-set-scene=&quot;nearDawn&quot;&gt;It was still very dark, but the growing blue saturation of the sky told me dawn was approaching (the LCD clock on the dashboard also told me, but mostly the blue told me. I am by nature very in tune with the different levels of blue in the sky at different times of night and that should be noted). I entered the park, turned down the road to get to Moulton, and the smug expression came back with a vengeance. I had done it! Oh, what &lt;em&gt;fools&lt;/em&gt; all my peers back in their comfy homes must feel — I was a great champion, of the road, and of the elements. I was starting the New Year on a &lt;em&gt;proper&lt;/em&gt; adventure, facing down countless odds to watch the sun rise against one of the American West’s greatest views. I became so engrossed with regaling myself, preening over my own glorious victory, that I almost did not react in time for the road abruptly ending.&lt;/p&gt;

      &lt;/section&gt;
      &lt;section class=&quot;section&quot;&gt;
        &lt;p&gt;As it turns out, most of Grand Teton National Park shuts down between November and April. As it further turns out, that includes the discontinuation of maintenance for many of the roads. So here, 2.5 miles from my destination, instead of a red carpet and crowd of wild animals assembled to cheer my arrival, I faced an 8ft snowbank, which completely blocked the path to the barn.&lt;/p&gt;
&lt;p&gt;I blinked dumbly at the wall before me for at least 11 minutes, before furrowing my brow and stepping out of the car. I entertained very briefly the idea of scrambling over the snowbank and hiking the remaining miles to the barn, but that idea was extinguished when my first step onto the snowbank became my first step &lt;em&gt;in&lt;/em&gt; to the snowbank, and I realized I’d have to try something else.&lt;/p&gt;
&lt;p&gt;I elected to drive over to Jenny Lake, a popular destination that I expected would still be plowed. It would be much closer to the mountains, but in my current circumstances I was happy to see what there was to see.&lt;/p&gt;
&lt;p data-set-scene=&quot;dawn&quot;&gt;Back in the car and heading back down Gros Ventre Road the way I came, it started to become clear that “what there was to see” was also a rapidly-narrowing margin. It was now 7:30 in the morning, and the sun was just starting to illuminate the landscape, though it remained beyond the horizon. As if in a silly tablecloth magic trick, the dawn of January 1st, after a perfectly clear night, exchanged the impenetrable cover of darkness for an even more impenetrable cover of blizzard.&lt;/p&gt;
&lt;p&gt;I had driven 9 and a half hours into the wilderness of Wyoming to look at a snow fog so thick I couldn’t see the shoulder on the other side of the road.&lt;/p&gt;

      &lt;/section&gt;
      &lt;section class=&quot;section&quot;&gt;
        &lt;p&gt;I went back to blinking dumbly, this time for a longer increment, to really savor the dumbness of the blinks, the sheer idiotic heft of the eyelids, the stupid clapping noise they made. Once I had blinked to my satisfaction, I started up the car, again, and pointed it dejectedly in the direction of the nearest town, Jackson, where I parked at one of the many visitor centers, and fell instantly to sleep.&lt;/p&gt;
&lt;p&gt;Ninety minutes’ rest hardly refreshed my weary and frozen bones. I got up to go snag a parks sticker from inside the center, to find by rattling helplessly on its front doors, that it was one of the many visitors centers that closes in that six month window from November into Spring. I went and sat fully on my ass in the snowy parking lot, and blinked some more.&lt;/p&gt;
&lt;p&gt;There’s a delightful little bakery &amp;amp; restaurant in Jackson called The Bunnery, where they’ll serve you oatmeal with berries, and a cup of coffee so bad you’ll worry you offended someone on the way in. I know this because I went there and I had both of these things, and I tipped very well as a profuse apology for however I had scorned the waiter.&lt;/p&gt;
&lt;p&gt;Back in the car, I reviewed my options. Park: closed, trails: unmaintained, snowshoes: not owned, sunrise: unwitnessed. As the LCD screen ticked up to 10 am, I turned the ignition for the last time, and started driving home.&lt;/p&gt;

      &lt;/section&gt;
      &lt;section class=&quot;section&quot; data-hide-clock=&quot;&quot;&gt;
        &lt;div class=&quot;two-col&quot;&gt;
            &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0157_ipbjz8-400w.webp 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0157_ipbjz8-800w.webp 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0157_ipbjz8-1184w.webp 1184w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;A frigid Wyoming two-lane mountain road, as seen through the windshield of the author&#39;s car. White snowy Voronoi patterns snake across the asphalt.&quot; src=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0157_ipbjz8-400w.jpeg&quot; width=&quot;1184&quot; height=&quot;1776&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0157_ipbjz8-400w.jpeg 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0157_ipbjz8-800w.jpeg 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0157_ipbjz8-1184w.jpeg 1184w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
            &lt;video autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot; src=&quot;https://res.cloudinary.com/henry-codes/video/upload/v1770925002/IMG_8505_ickr3b.mp4&quot;&gt;
        &lt;/video&gt;&lt;/div&gt;
      &lt;/section&gt;
      &lt;section class=&quot;section&quot;&gt;
        &lt;p data-set-scene=&quot;final&quot;&gt;The daylight drive of return was beautiful. A couple of stressful moments where the blizzard raged its hardest, but mostly it was peace. Snaking patterns of drift over the asphalt, volumetric beams intermittently reaching the road like the sideways glances of god, an ice-covered river caught halfway between polar blue and seafoam green in the rare bright light that filtered down through the storm. Once I was out of the Rockies again and onto the plains, the storm cleared, and in that great, yawning, too-big Wyoming sky I saw the first morning of the year. I kept the stereo silent, and I drove with a steady foot. I felt my manic energy of the night before &lt;em&gt;(and if I may be candid with you, now that I consider us old friends, from the &lt;em&gt;months&lt;/em&gt; before)&lt;/em&gt; — melt away from me as the snow slipped off the roof and hood of the car. &lt;/p&gt;

      &lt;/section&gt;
      &lt;div class=&quot;flow&quot; style=&quot;--standard-column: 3 / span 8&quot;&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-400w.webp 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-800w.webp 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-1400w.webp 1400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-1776w.webp 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;An immense winter sky in Wyoming, landscape seen from the seat of the author&#39;s car, blurry and temporal.&quot; src=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-400w.jpeg&quot; width=&quot;1776&quot; height=&quot;1184&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-400w.jpeg 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-800w.jpeg 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-1400w.jpeg 1400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0164_a3jg73-1776w.jpeg 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
      &lt;/div&gt;
      &lt;section class=&quot;section section--final&quot;&gt;
        &lt;p&gt;By the time I got back to Colorado, the sun had crested its wintertime noon and was starting to set once more. I called an old friend on the phone and we talked about love and our awful taste in men and the way friendships change with distance and our grand plans for 2025.&lt;/p&gt;
&lt;p&gt;I pulled into my garage. I sat there in the salt-blasted, filthy and weary car, and as I lazily shook loose half-daze from 16 hours of tense driving since the night before, the dashboard vents started blasting hot air.&lt;/p&gt;
&lt;p class=&quot;text-center&quot;&gt;❦&lt;/p&gt;
&lt;p class=&quot;text-center&quot;&gt;&lt;em&gt;Thanks for reading. Drive safe. &lt;a href=&quot;https://henry.codes/writing&quot;&gt;Click here to go back to the blog.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

      &lt;/section&gt;
      &lt;div class=&quot;flow&quot; style=&quot;--standard-column: 3 / span 8&quot;&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-400w.webp 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-800w.webp 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-1400w.webp 1400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-1776w.webp 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;A black coupe covered in snow, parked aside a national parks sign for Grand Teton National Park. The fore and background are both completely snowy and white.&quot; src=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-400w.jpeg&quot; width=&quot;1776&quot; height=&quot;1184&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-400w.jpeg 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-800w.jpeg 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-1400w.jpeg 1400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/DSCF0153_1_zskdo0-1776w.jpeg 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
      &lt;/div&gt;
    &lt;/article&gt;
    &lt;div class=&quot;hover-images&quot;&gt;
      &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-400w.webp 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-800w.webp 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-1400w.webp 1400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-1975w.webp 1975w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;hover-image&quot; id=&quot;rug&quot; src=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-400w.jpeg&quot; alt=&quot;&quot; width=&quot;1975&quot; height=&quot;1411&quot; srcset=&quot;https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-400w.jpeg 400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-800w.jpeg 800w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-1400w.jpeg 1400w, https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/mashad_ifumme-1975w.jpeg 1975w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
    &lt;/div&gt;
    &lt;script data-taxi-reload=&quot;&quot; src=&quot;https://henry.codes/js/the-first-thing-i-did-was-run/index.js&quot;&gt;&lt;/script&gt;
  &lt;/main&gt;
    &lt;script data-taxi-reload=&quot;&quot; src=&quot;https://cdn.usefathom.com/script.js&quot; data-site=&quot;ADEBIAUD&quot; defer=&quot;&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</description>
    <pubDate>Wed, 07 Jan 2026 09:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/the-first-thing-i-did-last-year-was-run/</guid>
</item>
<item>
    <title>Things I did in 2025 that have nothing to do with the internet</title>
    <link>https://henry.codes/writing/2025/</link>
    <description>&lt;h2 id=&quot;what-i-did&quot; tabindex=&quot;-1&quot;&gt;What I did&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Did not buy any new clothing, save for DIY band merch. (I love fashion, and I did shop! I just only shopped vintage. It made it a really fun adventure, it turned every desire from a whim into a quest.)&lt;/li&gt;
&lt;li&gt;Switched off Spotify to Tidal.&lt;/li&gt;
&lt;li&gt;Started an earnest movement towards a diet of physical media only.&lt;/li&gt;
&lt;li&gt;Stayed vegan for my 8th year, for the animals and for the Earth.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;january&quot; tabindex=&quot;-1&quot;&gt;January&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Drove to the wilderness of Wyoming on a whim on New Year’s Eve.&lt;/li&gt;
&lt;li&gt;Put my car onto Öhlins Road &amp;amp; Track coils and a sport exhaust, holy smokes what a perfect car.&lt;/li&gt;
&lt;li&gt;Rode my motorcycle in below-freezing weather for the first time.&lt;/li&gt;
&lt;li&gt;Went to London on a whim (~24 hours from decision made to flight touch down) with &lt;a href=&quot;https://bryn.codes/&quot;&gt;my best friend&lt;/a&gt;, just to eat good, see some wonderful theater, and meet &lt;a href=&quot;https://ahumanfuture.co/&quot;&gt;another strange website person&lt;/a&gt;, who would rapidly &lt;em&gt;also&lt;/em&gt; become one of my best friends in the world. Saw some great designer motorcycles, saw some art galleries, saw Starlight Express and The Tempest.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF0153_fv2d86-400w.webp 400w, https://henry.codes/writing/2025/DSCF0153_fv2d86-800w.webp 800w, https://henry.codes/writing/2025/DSCF0153_fv2d86-1400w.webp 1400w, https://henry.codes/writing/2025/DSCF0153_fv2d86-1776w.webp 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/DSCF0153_fv2d86-400w.jpeg&quot; alt=&quot;A black coupe covered in snow, parked aside a national parks sign for Grand Teton National Park. The fore and background are both completely snowy and white.&quot; width=&quot;1776&quot; height=&quot;1184&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF0153_fv2d86-400w.jpeg 400w, https://henry.codes/writing/2025/DSCF0153_fv2d86-800w.jpeg 800w, https://henry.codes/writing/2025/DSCF0153_fv2d86-1400w.jpeg 1400w, https://henry.codes/writing/2025/DSCF0153_fv2d86-1776w.jpeg 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;february&quot; tabindex=&quot;-1&quot;&gt;February&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Rewired my 1975 BMW R90/6, a 50-year-old motorcycle, completely from scratch, with the help of the incredible vintage BMW motorcycle community in Denver.&lt;/li&gt;
&lt;li&gt;Watched Pride &amp;amp; Prejudice twice on Valentine’s Day.&lt;/li&gt;
&lt;li&gt;Went to a few fantastic runway shows for Denver Fashion Week, and some really painfully middling ones.&lt;/li&gt;
&lt;li&gt;Went to Chicago &lt;em&gt;&lt;s&gt;(for work)&lt;/s&gt;&lt;/em&gt;, to New York City &lt;em&gt;(for a deep love of the city)&lt;/em&gt;, to San Francisco &lt;em&gt;&lt;s&gt;(for work)&lt;/s&gt;&lt;/em&gt;, to New York City &lt;em&gt;(see previous New York City trip rationale)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- &lt;video src=&quot;https://res.cloudinary.com/henry-codes/video/upload/v1767480179/moto-vid_lziy3b.mp4&quot; muted controls&gt;&lt;/video&gt; --&gt;
&lt;h3 id=&quot;march&quot; tabindex=&quot;-1&quot;&gt;March&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fucked up a simple oil change on my BMW motorcycle so bad that my mechanic for an unrelated issue threatened me with a gun.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;editors-note&quot;&gt;The mechanic didn’t do that btw, he just sent a “who did the last oil change on this” text. That’s a bit of “lying” for you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apparently this is fr all I did this month. Rode motorcycles a lot, drove cars a lot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_0979_d2tkcn-400w.webp 400w, https://henry.codes/writing/2025/IMG_0979_d2tkcn-800w.webp 800w, https://henry.codes/writing/2025/IMG_0979_d2tkcn-1400w.webp 1400w, https://henry.codes/writing/2025/IMG_0979_d2tkcn-3000w.webp 3000w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/IMG_0979_d2tkcn-400w.jpeg&quot; alt=&quot;The author, a white man with light hair, wearing a hoodie, sunglasses, and white sneakers, sitting atop a black 1970s BMW motorcycle, smiling off-camera.&quot; width=&quot;3000&quot; height=&quot;1996&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_0979_d2tkcn-400w.jpeg 400w, https://henry.codes/writing/2025/IMG_0979_d2tkcn-800w.jpeg 800w, https://henry.codes/writing/2025/IMG_0979_d2tkcn-1400w.jpeg 1400w, https://henry.codes/writing/2025/IMG_0979_d2tkcn-3000w.jpeg 3000w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;april&quot; tabindex=&quot;-1&quot;&gt;April&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Turned 30. It was fine, most folks are just weirdly scared of their own mortality. Not me. I’m normal about it.&lt;/li&gt;
&lt;li&gt;Went to Portland to see about the city and try out &lt;a href=&quot;https://www.youtube.com/watch?v=3xG2y7Bs0ws&quot;&gt;the Web Dev Challenge&lt;/a&gt; with &lt;a href=&quot;https://jzhao.xyz/&quot;&gt;my friend Jacky&lt;/a&gt;. Got to meet &lt;a href=&quot;https://jason.energy/&quot;&gt;a bunch&lt;/a&gt; &lt;a href=&quot;https://roe.dev/&quot;&gt;of internet&lt;/a&gt; &lt;a href=&quot;https://whitep4nth3r.com/&quot;&gt;friends&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Back to New York baby New York City babey it’s all about the Mets.&lt;/li&gt;
&lt;li&gt;Had a little local reunion show with &lt;a href=&quot;https://contender-co.bandcamp.com&quot;&gt;my old emo band&lt;/a&gt;. Someone showed us the tattoo they got from our music.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF0378_gcojri-400w.webp 400w, https://henry.codes/writing/2025/DSCF0378_gcojri-800w.webp 800w, https://henry.codes/writing/2025/DSCF0378_gcojri-1400w.webp 1400w, https://henry.codes/writing/2025/DSCF0378_gcojri-2048w.webp 2048w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/DSCF0378_gcojri-400w.jpeg&quot; alt=&quot;Two Triumph motorcycles, one polished aluminum, and one black, sit atop a mountain. In the hazy background, rolling hills and forests can be seen.&quot; width=&quot;2048&quot; height=&quot;1152&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF0378_gcojri-400w.jpeg 400w, https://henry.codes/writing/2025/DSCF0378_gcojri-800w.jpeg 800w, https://henry.codes/writing/2025/DSCF0378_gcojri-1400w.jpeg 1400w, https://henry.codes/writing/2025/DSCF0378_gcojri-2048w.jpeg 2048w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
  &lt;figcaption&gt;Boy I really only took pictures of motor vehicles this year, huh.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;may&quot; tabindex=&quot;-1&quot;&gt;May&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Went to Leeds with bestie again, this time for &lt;a href=&quot;https://heypresents.com/conferences/2025&quot;&gt;All Day Hey&lt;/a&gt;, and to see my friends — some of whom would even be speaking. Went to London after, to hit Ronnie Scott’s with some devious co-conspirators and see what Soho has to offer.&lt;/li&gt;
&lt;li&gt;Went over Echo Lake (elev. 11,000 ft above sea level) on my motorcycle for the first time. Got pizza on the way back to town.&lt;/li&gt;
&lt;li&gt;Tried to start a bedroom Goth rock band. Was awful, learned a lot, didn’t stick the landing. Maybe this year!&lt;/li&gt;
&lt;li&gt;Found out Olive Garden will sell you literally 100 breadsticks if you want. They give them to you in a big box which will &lt;em&gt;not&lt;/em&gt; fit in the luggage of your motorcycle, so you &lt;em&gt;will&lt;/em&gt; have to prop them between your knees while riding across town to the movie party you got them for. It will be hysterical and very dangerous for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- ![The author and two co-conspirators. Tough characters all, looking unspeakably hard.](https://res.cloudinary.com/henry-codes/image/upload/v1767481430/32245A1B-98BB-49F3-A52C-1360D3250FF0_lyrmih.jpg) --&gt;
&lt;h3 id=&quot;june&quot; tabindex=&quot;-1&quot;&gt;June&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Read Rimbaud for the first time.&lt;/li&gt;
&lt;li&gt;BACK to New York City babey!!! This time I saw Turnstile and Boy Harsher under a bridge in Brooklyn, ate immensely good food everywhere in town, and got rained out so hard in Central Park that my phone broke and my paperback book literally disintegrated.&lt;/li&gt;
&lt;li&gt;Went to Utah to get lost, skydive, shoot guns, drift ATVs, make music, read book after book in the sun, and make &amp;amp; tell stories with beloved friends. Wore a cowboy hat and rode on the outside the Jeep more often than I sat inside the Jeep. Fell out of a plane at 13,000 ft in altitude again, but this time I did a flip or ten.&lt;/li&gt;
&lt;li&gt;Did the brakes on my car and shot myself in the eye with one of the pad retaining springs so solidly that it welted.&lt;/li&gt;
&lt;li&gt;Celebrated queer pride by reading only queer poets and seeing queer movies, doing queer-only motorcycle rides, and parading in the street.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF0706_j9huay-400w.webp 400w, https://henry.codes/writing/2025/DSCF0706_j9huay-800w.webp 800w, https://henry.codes/writing/2025/DSCF0706_j9huay-1400w.webp 1400w, https://henry.codes/writing/2025/DSCF0706_j9huay-6240w.webp 6240w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/DSCF0706_j9huay-400w.jpeg&quot; alt=&quot;Two men in cowboy hats, pictured seated and from behind, having a conversation while the sun sets vibrantly in the far distance. Canyons and clifs fill with lavender haze.&quot; width=&quot;6240&quot; height=&quot;3512&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF0706_j9huay-400w.jpeg 400w, https://henry.codes/writing/2025/DSCF0706_j9huay-800w.jpeg 800w, https://henry.codes/writing/2025/DSCF0706_j9huay-1400w.jpeg 1400w, https://henry.codes/writing/2025/DSCF0706_j9huay-6240w.jpeg 6240w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;july&quot; tabindex=&quot;-1&quot;&gt;July&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Learned how to roller-skate. Will &lt;em&gt;not&lt;/em&gt; be doing that again.&lt;/li&gt;
&lt;li&gt;Joined the vintage BMW &amp;amp; Norton ride, just tons and tons of beautiful ancient motorcycles rolling over the foothills of the Colorado Rockies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;august&quot; tabindex=&quot;-1&quot;&gt;August&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Did not go to Ren Faire. I know this isn’t like. Groundbreaking for anyone else but the last two years I went literally every weekend it was open during the Summer lol.&lt;/li&gt;
&lt;li&gt;Started learning some Irish folk songs, jigs and reels and such, on the guitar!&lt;/li&gt;
&lt;li&gt;Helped the BMW Bike Night boys build a 1968 R69US from the frame up&lt;/li&gt;
&lt;li&gt;Had my first white Monster. Gotta say, fellas. Mid, very mid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_3419_npvfqh-400w.webp 400w, https://henry.codes/writing/2025/IMG_3419_npvfqh-800w.webp 800w, https://henry.codes/writing/2025/IMG_3419_npvfqh-1400w.webp 1400w, https://henry.codes/writing/2025/IMG_3419_npvfqh-3024w.webp 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/IMG_3419_npvfqh-400w.jpeg&quot; alt=&quot;A hand holding a white monster can up against an incredible sunset. It is a thing to behold.&quot; width=&quot;3024&quot; height=&quot;2492&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_3419_npvfqh-400w.jpeg 400w, https://henry.codes/writing/2025/IMG_3419_npvfqh-800w.jpeg 800w, https://henry.codes/writing/2025/IMG_3419_npvfqh-1400w.jpeg 1400w, https://henry.codes/writing/2025/IMG_3419_npvfqh-3024w.jpeg 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;september&quot; tabindex=&quot;-1&quot;&gt;September&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Took my Triumph cafe racer way, way into the mountains, even found some dirt roads I definitely shouldn’t have been on, but it turns out every bike is an adventure bike if you’re not a scaredy-cat.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;subgrid flow&quot; style=&quot;--standard-column: 2 / span 5;&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_3659_nmbatz-400w.webp 400w, https://henry.codes/writing/2025/IMG_3659_nmbatz-800w.webp 800w, https://henry.codes/writing/2025/IMG_3659_nmbatz-1400w.webp 1400w, https://henry.codes/writing/2025/IMG_3659_nmbatz-3024w.webp 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;A chrome Triumph motorcycle idling along a dirt road in the mountains. A dense forest to the background, and a dramatic overcast sky overhead.&quot; src=&quot;https://henry.codes/writing/2025/IMG_3659_nmbatz-400w.jpeg&quot; width=&quot;3024&quot; height=&quot;4032&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_3659_nmbatz-400w.jpeg 400w, https://henry.codes/writing/2025/IMG_3659_nmbatz-800w.jpeg 800w, https://henry.codes/writing/2025/IMG_3659_nmbatz-1400w.jpeg 1400w, https://henry.codes/writing/2025/IMG_3659_nmbatz-3024w.jpeg 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;div class=&quot;subgrid flow&quot; style=&quot;--standard-column: auto / span 5&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_3661_c25qlg-400w.webp 400w, https://henry.codes/writing/2025/IMG_3661_c25qlg-800w.webp 800w, https://henry.codes/writing/2025/IMG_3661_c25qlg-1400w.webp 1400w, https://henry.codes/writing/2025/IMG_3661_c25qlg-3024w.webp 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;Another angle of the Triumph motorcycle, this time showing the valley stretching out far into rocky mountain distances.&quot; src=&quot;https://henry.codes/writing/2025/IMG_3661_c25qlg-400w.jpeg&quot; width=&quot;3024&quot; height=&quot;4032&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_3661_c25qlg-400w.jpeg 400w, https://henry.codes/writing/2025/IMG_3661_c25qlg-800w.jpeg 800w, https://henry.codes/writing/2025/IMG_3661_c25qlg-1400w.jpeg 1400w, https://henry.codes/writing/2025/IMG_3661_c25qlg-3024w.jpeg 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;With the help of a local friend who is also a furniture freak, found a vintage Eames lounge chair in awful condition, and restored and reupholstered it. It’s been a dream for a long time and I managed to sort the whole thing for less than a thousand bucks.&lt;/li&gt;
&lt;li&gt;Blew the clutch in my car to pieces. The technician that worked on it texted me to let me know he’d never seen one so torched — he even kept it so we could laugh about it when I picked up the car after replacing it.&lt;/li&gt;
&lt;li&gt;Went over Guanella Pass on my BMW airhead to look at Autumn leaves. Every time that bike does any decent mileage or questing, it feels like an achievement for both of us. I’ve brought some immense life back to this bike since getting it, just going through the whole thing and sorting it out. It’s a real source of pride. And to think of the life it has had, from a factory in Germany a literal half-century ago, to nearly 12,000ft above sea level in the Colorado Rockies in 2025.&lt;/li&gt;
&lt;li&gt;Made the most of the foliage. I’ve got a few friends who also love more &lt;em&gt;spirited&lt;/em&gt; sports driving, and we sought out basically every great curvy road on the Eastern slope in order to see the aspen groves turn to gold.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF1100_djbbmj-400w.webp 400w, https://henry.codes/writing/2025/DSCF1100_djbbmj-800w.webp 800w, https://henry.codes/writing/2025/DSCF1100_djbbmj-1400w.webp 1400w, https://henry.codes/writing/2025/DSCF1100_djbbmj-2048w.webp 2048w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/DSCF1100_djbbmj-400w.jpeg&quot; alt=&quot;Two black motorcycles, one featuring the author perched atop, in front of a jagged Rocky Mountain vista.&quot; width=&quot;2048&quot; height=&quot;1152&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF1100_djbbmj-400w.jpeg 400w, https://henry.codes/writing/2025/DSCF1100_djbbmj-800w.jpeg 800w, https://henry.codes/writing/2025/DSCF1100_djbbmj-1400w.jpeg 1400w, https://henry.codes/writing/2025/DSCF1100_djbbmj-2048w.jpeg 2048w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;october&quot; tabindex=&quot;-1&quot;&gt;October&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Off to the UK again, this time to Bristol to see my beloved friends and speak about personal websites at &lt;a href=&quot;https://webdevconf.com/&quot;&gt;Web Dev Conf&lt;/a&gt;, which was an immense opportunity I am very grateful for.&lt;/li&gt;
&lt;li&gt;And &lt;em&gt;back&lt;/em&gt; to New! York! City! Literal one night trip to make the most of a layover back from England.&lt;/li&gt;
&lt;li&gt;Ate at Eleven Madison Park, holy smokes one of the most incredible culinary experiences of my life.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;YOU GUESSED IT NEW YORK CITY AGAIN!&lt;/em&gt; Lola texted me a few months prior about going in Autumn (why does it seem so inviting), so we did. Met Cloisters, dumplings, rain and shine, live jazz, bought some art. Celebrated Halloween in arguably one of the greatest cities in the world to people-watch in. Highly recommend.&lt;/li&gt;
&lt;li&gt;While I was in New York I walked for a few hours on the phone with the gal I had been seeing, and the phone call made me smile so hard I realized I wanted nothing more than to make her as happy as she made me. I basically sprinted home to ask her to be my girlfriend.&lt;/li&gt;
&lt;li&gt;Ate at Brutø with now-gf. What an unreal restaurant, and what a miraculous tribute to Coloradan agriculture.&lt;/li&gt;
&lt;li&gt;Carved pumpkins. Do you like him. Do you think he’s nice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-400w.webp 400w, https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-800w.webp 800w, https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-1400w.webp 1400w, https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-2304w.webp 2304w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-400w.jpeg&quot; alt=&quot;A pumpkin carved to have a horrified facial expression, and adorned with two pumpkin arms, which it uses to feed itself a much smaller pumpkin.&quot; width=&quot;2304&quot; height=&quot;2847&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-400w.jpeg 400w, https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-800w.jpeg 800w, https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-1400w.jpeg 1400w, https://henry.codes/writing/2025/IMG_20251019_012722483_tj8b0x-2304w.jpeg 2304w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;november&quot; tabindex=&quot;-1&quot;&gt;November&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hit 50,000 miles on the BMW in its 50th year of life at 12,000ft. Hit ice and snow patches on the way back that were so serious I had my feet down just sliding down the road. What is life if not near-death!&lt;/li&gt;
&lt;li&gt;Got into archery. Turns out those elves were on to something in that one movie.&lt;/li&gt;
&lt;li&gt;Entered my cafe racer into its first motorcycle show, won best bike in show and even won the rev competition (&lt;em&gt;the Triumph shoots flames when you rev it so it was hardly a competition 😉&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Started building a bike from 1974 with the Bike Night boys for the Bike Relief Project, which donates motorcycles to vets to help with PTSD.&lt;/li&gt;
&lt;li&gt;Got a tape deck solely off the dream of &lt;a href=&quot;https://www.youtube.com/watch?v=1Sc8SyL47ao&quot;&gt;putting this song&lt;/a&gt; on a mixtape I’d make for the girl I was seeing. I got her a restored vintage &#39;80s Walkman to listen to it on. Typed up a love note for the liner on a Hermes Baby typewriter from like 1941.&lt;/li&gt;
&lt;li&gt;Celebrated Thanksgiving down South with my parents and grandparents.&lt;/li&gt;
&lt;li&gt;Flew straight from there to Dublin to celebrate a dear friend’s Big 30th Birthday.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- ![A Sony Walkman sitting atop some typewritten paper and a Persian rug. A Maxell tape is visible.](https://res.cloudinary.com/henry-codes/image/upload/v1767482846/DSCF1223_gq5el7.jpg) --&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-400w.webp 400w, https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-800w.webp 800w, https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-1400w.webp 1400w, https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-3024w.webp 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-400w.jpeg&quot; alt=&quot;The author, a white man with white hair, wearing all black and drawing a recurve bow in an archery range.&quot; width=&quot;3024&quot; height=&quot;2877&quot; srcset=&quot;https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-400w.jpeg 400w, https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-800w.jpeg 800w, https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-1400w.jpeg 1400w, https://henry.codes/writing/2025/IMG_20251124_000708_soa4md-3024w.jpeg 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;december&quot; tabindex=&quot;-1&quot;&gt;December&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;More time in Ireland. Beautiful country. Ate spice bag for nearly every meal.&lt;/li&gt;
&lt;li&gt;Managed to see Deafheaven in Dublin after a tip-off from a beloved friend who had seen them in England days prior. The show was sold out but the band graciously left a handful of tickets at the door. Portrayal of Guilt opened. It was unreal.&lt;/li&gt;
&lt;li&gt;Hibernated most of the month. Spent New Years Eve in the arms of a beautiful woman. What more could any of us hope of December?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF1308_zz0pal-400w.webp 400w, https://henry.codes/writing/2025/DSCF1308_zz0pal-800w.webp 800w, https://henry.codes/writing/2025/DSCF1308_zz0pal-1152w.webp 1152w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2025/DSCF1308_zz0pal-400w.jpeg&quot; alt=&quot;The author, a white man with white hair, dressed all in black, pictured in Ireland, looking smugly over his shades at the photographer.&quot; width=&quot;1152&quot; height=&quot;2048&quot; srcset=&quot;https://henry.codes/writing/2025/DSCF1308_zz0pal-400w.jpeg 400w, https://henry.codes/writing/2025/DSCF1308_zz0pal-800w.jpeg 800w, https://henry.codes/writing/2025/DSCF1308_zz0pal-1152w.jpeg 1152w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-i-ll-do-now&quot; tabindex=&quot;-1&quot;&gt;What I’ll do now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Stop shopping online.&lt;/li&gt;
&lt;li&gt;Rebuild the &#39;74 BMW airhead I’ve been neglecting for a few years.&lt;/li&gt;
&lt;li&gt;Continue splitting my time between Colorado and New York.&lt;/li&gt;
&lt;li&gt;Deadlift 300lbs.&lt;/li&gt;
&lt;li&gt;Road trip on a motorcycle to more National Parks, certainly Glacier and Yellowstone.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peaks.henry.codes/&quot;&gt;Climb three 14ers.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Turn my elementary proficiency in Italian into working proficiency.&lt;/li&gt;
&lt;li&gt;Stay vegan for my 9th year, for the animals, and for the earth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading.&lt;/p&gt;
</description>
    <pubDate>Sat, 03 Jan 2026 15:03:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/2025/</guid>
</item>
<item>
    <title>A Website To Destroy All Websites</title>
    <link>https://henry.codes/writing/a-website-to-destroy-all-websites/</link>
    <description>

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot; class=&quot;no-js&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;A Website To End All Websites | Henry From Online&lt;/title&gt;
    &lt;meta name=&quot;description&quot; content=&quot;How to win the war for the soul of the internet, and build the Web We Want.&quot;&gt;



    &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;180x180&quot; href=&quot;https://henry.codes/meta/apple-touch-icon.png&quot;&gt;
    &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;32x32&quot; href=&quot;https://henry.codes/meta/favicon-32x32.png&quot;&gt;
    &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;16x16&quot; href=&quot;https://henry.codes/meta/favicon-16x16.png&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;https://front-end.social/@henry&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;https://github.com/xdesro&quot;&gt;
    &lt;link rel=&quot;me&quot; href=&quot;mailto:yo@henry.codes&quot;&gt;
    &lt;link rel=&quot;manifest&quot; href=&quot;https://henry.codes/meta/site.webmanifest&quot;&gt;
    &lt;link rel=&quot;mask-icon&quot; href=&quot;https://henry.codes/meta/safari-pinned-tab.svg&quot; color=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;msapplication-TileColor&quot; content=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;theme-color&quot; content=&quot;#2a2722&quot;&gt;
    &lt;meta name=&quot;generator&quot; content=&quot;eleventy&quot;&gt;

    &lt;meta property=&quot;og:url&quot; content=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/&quot;&gt;
    &lt;meta property=&quot;og:image&quot; content=&quot;https://henry.codes/img/og/og-a-website-to-destroy-all-websites.png&quot;&gt;
    &lt;meta property=&quot;og:type&quot; content=&quot;website&quot;&gt;
    &lt;meta property=&quot;og:description&quot; content=&quot;How to win the war for the soul of the internet, and build the Web We Want.&quot;&gt;

    &lt;!-- Webmentions --&gt;
    &lt;link rel=&quot;webmention&quot; href=&quot;https://webmention.io/henry.codes/webmention&quot;&gt;
    &lt;link rel=&quot;pingback&quot; href=&quot;https://webmention.io/henry.codes/xmlrpc&quot;&gt;

    &lt;!-- AT Proto --&gt;
    &lt;link rel=&quot;site.standard.document&quot; href=&quot;at://did:plc:pbr2nzfsr6bcqjeqlvohmh5y/site.standard.document/3mn3zccyhec2y&quot;&gt;

    &lt;link rel=&quot;preload&quot; href=&quot;https://henry.codes/fonts/TRJNDaVinci-Regular.woff&quot; as=&quot;font&quot; type=&quot;font/woff&quot; crossorigin=&quot;&quot;&gt;
    &lt;link rel=&quot;preload&quot; href=&quot;https://henry.codes/fonts/TRJNDaVinci-Italic.woff&quot; as=&quot;font&quot; type=&quot;font/woff&quot; crossorigin=&quot;&quot;&gt;
    &lt;link rel=&quot;preload&quot; href=&quot;https://henry.codes/fonts/subset-Louize.woff2&quot; as=&quot;font&quot; type=&quot;font/woff2&quot; crossorigin=&quot;&quot;&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://henry.codes/css/fonts.css&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://henry.codes/css/custom/a-website-to-destroy-all-websites/index.css&quot;&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;main&gt;
        &lt;section class=&quot;intro&quot;&gt;
            &lt;h1 class=&quot;intro__title&quot;&gt;A &lt;span&gt;website&lt;/span&gt; to &lt;em&gt;destroy&lt;/em&gt; all &lt;span&gt;websites.&lt;/span&gt;&lt;/h1&gt;
            &lt;div class=&quot;intro__subtitle&quot;&gt;
                &lt;span&gt;How to win the war for the soul of the internet&lt;/span&gt;
                &lt;span&gt;and build the &lt;em&gt;Web We Want&lt;/em&gt;.&lt;/span&gt;
            &lt;/div&gt;
            &lt;figure class=&quot;intro__card&quot;&gt;
                &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/odilon-redon_captive-pegasus-700w.webp 700w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;eager&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/odilon-redon_captive-pegasus-700w.jpeg&quot; alt=&quot;&quot; width=&quot;700&quot; fetchpriority=&quot;high&quot; height=&quot;949&quot;&gt;&lt;/picture&gt;
                &lt;figcaption&gt;&lt;a href=&quot;https://www.artic.edu/artworks/79492/captive-pegasus&quot;&gt;Captive Pegasus, &lt;cite&gt;Odilon Redon&lt;/cite&gt; (1889)&lt;/a&gt;&lt;/figcaption&gt;
            &lt;/figure&gt; 
            &lt;a class=&quot;intro__label intro__label--author&quot; href=&quot;https://henry.codes/&quot;&gt;A tiny website by Henry (from Online)&lt;/a&gt;
            &lt;span class=&quot;intro__label intro__label--word-count&quot;&gt;~3100 words; about a 15 minute read
        &lt;/span&gt;&lt;/section&gt;
        &lt;section class=&quot;toc&quot;&gt;
            &lt;h2 class=&quot;toc__title&quot;&gt;table of contents, of course&lt;/h2&gt;
            &lt;ol class=&quot;toc__list&quot; role=&quot;list&quot;&gt;
                &lt;li&gt;&lt;a href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#internet-bad&quot;&gt;The internet is bad&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#invention-of-the-automobile&quot;&gt;The invention of the automobile&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#tools-for-conviviality&quot;&gt;&lt;em&gt;Tools for Conviviality&lt;/em&gt; &amp; the industrialization of the Web&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#the-web-we-want&quot;&gt;The Web we want&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#where-do-we-go-from-here&quot;&gt;So where do we go from here?&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#denouement&quot;&gt;Denouement&lt;/a&gt;&lt;/li&gt;
            &lt;/ol&gt;
        &lt;/section&gt;
        &lt;hr class=&quot;divider&quot;&gt;
        &lt;section class=&quot;chapter-one&quot; id=&quot;internet-bad&quot;&gt;
            &lt;header class=&quot;chapter-one-hero&quot;&gt;
                &lt;div class=&quot;chapter-counter&quot;&gt;part one.&lt;/div&gt;
                &lt;div class=&quot;chapter-one-hero__inner&quot;&gt;
                    &lt;h2 class=&quot;chapter-one-hero__title&quot;&gt;&lt;span&gt;The&lt;/span&gt; &lt;span&gt;internet&lt;/span&gt; &lt;span&gt;is bad.&lt;/span&gt;&lt;/h2&gt;
                    &lt;figure class=&quot;chapter-one-hero__frame&quot;&gt;
                        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/bosch-follower_christs-descent-into-hell-400w.webp 400w, https://henry.codes/img/bosch-follower_christs-descent-into-hell-800w.webp 800w, https://henry.codes/img/bosch-follower_christs-descent-into-hell-1400w.webp 1400w, https://henry.codes/img/bosch-follower_christs-descent-into-hell-4000w.webp 4000w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/bosch-follower_christs-descent-into-hell-400w.jpeg&quot; alt=&quot;&quot; width=&quot;4000&quot; height=&quot;1983&quot; srcset=&quot;https://henry.codes/img/bosch-follower_christs-descent-into-hell-400w.jpeg 400w, https://henry.codes/img/bosch-follower_christs-descent-into-hell-800w.jpeg 800w, https://henry.codes/img/bosch-follower_christs-descent-into-hell-1400w.jpeg 1400w, https://henry.codes/img/bosch-follower_christs-descent-into-hell-4000w.jpeg 4000w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
                        &lt;figcaption&gt;&lt;a href=&quot;https://www.metmuseum.org/art/collection/search/435725&quot;&gt;Christ’s Descent Into Hell, &lt;cite&gt;Follower of Hieronymus Bosch&lt;/cite&gt; (~1625)&lt;/a&gt;&lt;/figcaption&gt;
                    &lt;/figure&gt;
                &lt;/div&gt;
            &lt;/header&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;Well, the Internet mostly feels bad these days.&lt;/p&gt;
&lt;p&gt;We were given this vast, holy realm of self-discovery and joy and philosophy and community; a thousand thousand acres of digital landscape, on which to grow our forests and grasslands of imagination, plant our gardens of learning, explore the caves of our making. We were given the chance to know anything about anything, to be our own Prometheus, to make wishes and to grant them.&lt;/p&gt;
&lt;p&gt;But that’s not what we use the Internet for anymore. These days, instead of using it to make ourselves, most of us are using it to waste ourselves: we’re doom-scrolling brain-rot on the attention-farm, we’re getting slop from the feed.&lt;/p&gt;
&lt;p&gt;Instead of turning freely in the HTTP meadows we grow for each other, we go to work: we break our backs at the foundry of algorithmic content as this earnest, naïve, human endeavoring to connect our lives with others is corrupted. Our powerful drive to learn about ourselves, each other, and our world, is broken into scant remnants — hollow, clutching phantasms of Content Creation, speed-cut vertical video, listicle thought-leadership, ragebait and the thread emoji.&lt;/p&gt;

            &lt;/div&gt;
            &lt;div class=&quot;pastoral-aside&quot;&gt;
                &lt;h3 class=&quot;pastoral-aside__title&quot;&gt;it wasn’t &lt;span&gt;always&lt;/span&gt; like this.&lt;/h3&gt;
                &lt;figure&gt;
                    &lt;div class=&quot;drift&quot;&gt;
                        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/george-innes_pastoral-scene-400w.webp 400w, https://henry.codes/img/george-innes_pastoral-scene-800w.webp 800w, https://henry.codes/img/george-innes_pastoral-scene-1400w.webp 1400w, https://henry.codes/img/george-innes_pastoral-scene-2048w.webp 2048w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/george-innes_pastoral-scene-400w.jpeg&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;1574&quot; srcset=&quot;https://henry.codes/img/george-innes_pastoral-scene-400w.jpeg 400w, https://henry.codes/img/george-innes_pastoral-scene-800w.jpeg 800w, https://henry.codes/img/george-innes_pastoral-scene-1400w.jpeg 1400w, https://henry.codes/img/george-innes_pastoral-scene-2048w.jpeg 2048w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
                    &lt;/div&gt;
                    &lt;figcaption&gt;&lt;a href=&quot;https://artmuseum.princeton.edu/art/collections/objects/23254&quot;&gt;Pastoral Scene, &lt;cite&gt;George Innes&lt;/cite&gt; (1857)&lt;/a&gt;&lt;/figcaption&gt;
                &lt;/figure&gt;
            &lt;/div&gt;
            &lt;div class=&quot;rendered three-up&quot;&gt;
                &lt;p&gt;It used to feel way better to Go Online, and some of us will remember.&lt;/p&gt;
&lt;p&gt;We used to be able to learn about our hobbies and interests from hundreds of experts on a wealth of websites whose only shared motivation was their passion. Some of those venerable old educational blogs, forums, and wikis still stand, though most have been bulldozed.&lt;/p&gt;
&lt;p&gt;Now, Learning On The Internet often means fighting ads and endless assaults on one’s attention — it means watching part-1-part-2-part-3 short-form video clips, taped together by action movie psychology hacks, narrated gracelessly by TTS AI voices. We’re down from a thousand and one websites to three, and each of those remaining monolith websites is just a soullessly-regurgitated, compression-down-scaled, AI-up-scaled version of the next.&lt;/p&gt;
&lt;p class=&quot;xl-mk&quot;&gt;¶&lt;/p&gt;
&lt;p&gt;We used to make lasting friendships with folks all over the world on shared interest and good humor.&lt;/p&gt;
&lt;p&gt;But now those social networks, once hand-built and hand-tended, vibrant and organic, are unceremoniously swallowed by social &lt;em&gt;media&lt;/em&gt; networks, pens built for trapping us and our little piggy attentions, turning us all into clout-chasers &amp;amp; content-creators, and removing us from what meaningful intimacy &amp;amp; community felt like.&lt;/p&gt;
&lt;p class=&quot;xl-mk&quot;&gt;¶&lt;/p&gt;
&lt;p&gt;Even coding for the web used to be different: One could Learn To Code™ to express oneself creatively, imbue one’s online presence with passion and meaning, and for some of us, build a real career.&lt;/p&gt;
&lt;p&gt;These days, however, we write increasing amounts of complicated, unsecure code to express less and less meaning, in order to infinitely generate shareholder value. We don’t think about the art of our craft and the discipline of its application, we think about throughput and scale.&lt;/p&gt;

            &lt;/div&gt;
            &lt;aside class=&quot;disclaimer&quot;&gt;
                &lt;p class=&quot;disclaimer__text&quot;&gt;you are not immune to &lt;span&gt;nostalgia&lt;/span&gt;.&lt;/p&gt;
                &lt;span class=&quot;disclaimer__label&quot;&gt;a tiny disclaimer by Henry (from Online)&lt;/span&gt;
            &lt;/aside&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;To be very clear: I’m not trying to &lt;em&gt;Good Old Days&lt;/em&gt; the internet. None of this is meant to make you feel nostalgic — the Internet used to be slow and less populated and less diverse, and its access was limited to those of a certain class. The Web For All is a marked improvement, widespread global internet access is a marked improvement, and what I’m asking you to consider is what it used to feel like to use these tools, and what we’ve lost in the Big Tech, Web 2.0 and web3 devouring of the ’Net.&lt;/p&gt;

            &lt;/div&gt;
        &lt;/section&gt;
        &lt;hr class=&quot;divider&quot;&gt;
        &lt;section class=&quot;chapter-two&quot; id=&quot;invention-of-the-automobile&quot;&gt;
            &lt;header class=&quot;chapter-two-hero&quot;&gt;
                &lt;div class=&quot;chapter-counter&quot;&gt;part two.&lt;/div&gt;
                &lt;div class=&quot;chapter-two-hero__inner&quot;&gt;
                    &lt;h2 class=&quot;chapter-two-hero__title&quot;&gt;&lt;span&gt;&lt;span&gt;The invention&lt;/span&gt; &lt;span&gt;of the&lt;/span&gt;&lt;/span&gt; &lt;span&gt;automobile&lt;/span&gt;&lt;/h2&gt;
                    &lt;figure class=&quot;chapter-two-hero__frame&quot;&gt;
                        &lt;div class=&quot;drift&quot;&gt;
                            &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/tamara-de-lempicka_autoportrait-400w.webp 400w, https://henry.codes/img/tamara-de-lempicka_autoportrait-800w.webp 800w, https://henry.codes/img/tamara-de-lempicka_autoportrait-807w.webp 807w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/tamara-de-lempicka_autoportrait-400w.jpeg&quot; alt=&quot;&quot; width=&quot;807&quot; height=&quot;1058&quot; srcset=&quot;https://henry.codes/img/tamara-de-lempicka_autoportrait-400w.jpeg 400w, https://henry.codes/img/tamara-de-lempicka_autoportrait-800w.jpeg 800w, https://henry.codes/img/tamara-de-lempicka_autoportrait-807w.jpeg 807w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
                        &lt;/div&gt;
                        &lt;figcaption&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Autoportrait_(Tamara_in_a_Green_Bugatti)&quot;&gt;Autoportrait, &lt;cite&gt;Tamara de Lempicka&lt;/cite&gt; (1929)&lt;/a&gt;&lt;/figcaption&gt;
                    &lt;/figure&gt;
                &lt;/div&gt;
            &lt;/header&gt;
       
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;The onset of the automobile was a revelation for access and personal liberty. With the advent of cars, members of society could travel farther, get more done in their day, and bend their limited time more to their creative will!&lt;/p&gt;
&lt;p&gt;But as time wore on and the industrialization &amp;amp; proliferation of the automobile progressed, its marginal utility diminished —  the industry started to offer society fewer &amp;amp; fewer benefits, and take more &amp;amp; more in exchange&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-1&quot;&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In American cities, for example: though at first the automobile enabled humans to travel further distances, it now &lt;em&gt;demanded&lt;/em&gt; that humans travel those distances, and &lt;em&gt;demanded&lt;/em&gt; infrastructure be created &amp;amp; maintained to enable it.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-2&quot;&gt;2&lt;/a&gt; Many now &lt;em&gt;must&lt;/em&gt; use an automobile to get everything done in their town in a day, and must pay &amp;amp; take time for that automobile’s fueling &amp;amp; maintenance.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-3&quot;&gt;3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Further than that, the automobile asks all of us to chip in tax revenue to protect its infrastructure, but only certain classes can afford an automobile with which to use that infrastructure, and those classes who can’t afford to do so are relegated to underfunded public transit systems.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-4&quot;&gt;4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No longer a tool to serve our societies, our societies now serve the automobile.&lt;/p&gt;

            &lt;/div&gt;
            &lt;aside class=&quot;no-longer-aside&quot;&gt;
                &lt;figure&gt;
                    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/salvador-dali_car-clothing-1-400w.webp 400w, https://henry.codes/img/salvador-dali_car-clothing-1-800w.webp 800w, https://henry.codes/img/salvador-dali_car-clothing-1-1213w.webp 1213w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/salvador-dali_car-clothing-1-400w.jpeg&quot; alt=&quot;&quot; width=&quot;1213&quot; height=&quot;713&quot; srcset=&quot;https://henry.codes/img/salvador-dali_car-clothing-1-400w.jpeg 400w, https://henry.codes/img/salvador-dali_car-clothing-1-800w.jpeg 800w, https://henry.codes/img/salvador-dali_car-clothing-1-1213w.jpeg 1213w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
                &lt;/figure&gt;
                &lt;p class=&quot;no-longer-aside__text&quot;&gt;
                    &lt;span&gt;no longer a tool to serve &lt;em&gt;our societies,&lt;/em&gt;&lt;/span&gt;
                    &lt;span&gt;our societies now serve &lt;em&gt;the automobile.&lt;/em&gt;&lt;/span&gt;
                &lt;/p&gt;
                &lt;figure&gt;
                    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/salvador-dali_car-clothing-2-400w.webp 400w, https://henry.codes/img/salvador-dali_car-clothing-2-800w.webp 800w, https://henry.codes/img/salvador-dali_car-clothing-2-1213w.webp 1213w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/salvador-dali_car-clothing-2-400w.jpeg&quot; alt=&quot;&quot; width=&quot;1213&quot; height=&quot;838&quot; srcset=&quot;https://henry.codes/img/salvador-dali_car-clothing-2-400w.jpeg 400w, https://henry.codes/img/salvador-dali_car-clothing-2-800w.jpeg 800w, https://henry.codes/img/salvador-dali_car-clothing-2-1213w.jpeg 1213w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
                    &lt;figcaption&gt;&lt;a href=&quot;https://www.salvador-dali.org/en/artwork/ced/download-documents/the-importance-of-the-car-in-the-work-of-salvador-dali-the-dressed-car/&quot;&gt;Car Clothing, &lt;cite&gt;Salvador Dalí&lt;/cite&gt; (1941)&lt;/a&gt;&lt;/figcaption&gt;
                &lt;/figure&gt;
            &lt;/aside&gt;
        &lt;/section&gt;
        &lt;hr class=&quot;divider&quot;&gt;
        &lt;section class=&quot;chapter-three&quot; id=&quot;tools-for-conviviality&quot;&gt;
            &lt;header class=&quot;chapter-three-hero&quot;&gt;
                &lt;div class=&quot;chapter-counter&quot;&gt;part three.&lt;/div&gt;
                &lt;h2 class=&quot;chapter-three-hero__title&quot;&gt;&lt;em&gt;Tools for Conviviality,&lt;/em&gt; &lt;span&gt;&amp;&lt;/span&gt; the industrialization of the Web.&lt;/h2&gt;
            &lt;/header&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/book-tools-for-conviviality-400w.webp 400w, https://henry.codes/img/book-tools-for-conviviality-800w.webp 800w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/book-tools-for-conviviality-400w.jpeg&quot; alt=&quot;&quot; class=&quot;book book--tools&quot; width=&quot;800&quot; height=&quot;1314&quot; srcset=&quot;https://henry.codes/img/book-tools-for-conviviality-400w.jpeg 400w, https://henry.codes/img/book-tools-for-conviviality-800w.jpeg 800w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
In his book &lt;em&gt;Tools For Conviviality&lt;/em&gt;, technology philosopher and social critic Ivan Illich identifies these two critical moments, the optimistic arrival &amp;amp; the deadening industrialization, as watersheds of technological advent. Tools are first created to enhance our capacities to spend our energy more freely and in turn spend our days more freely, but as their industrialization increases, their manipulation &amp;amp; usurpation of society increases in tow&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-5&quot;&gt;5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Illich also describes the concept of &lt;em&gt;radical monopoly&lt;/em&gt;, which is that point where a technological tool is so dominant that people are excluded from society unless they become its users. We saw this with the automobile, we saw it with the internet, and we even see it with social media.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;No longer a tool to serve our societies, our societies now serve the automobile.&lt;/del&gt; &lt;ins&gt;Instead of designing and using tools to build a society, our society changes to adapt to the demands of our tools.&lt;/ins&gt;&lt;/p&gt;
&lt;p class=&quot;xl-mk&quot;&gt;¶&lt;/p&gt;
&lt;p&gt;Illich’s thesis allows us to reframe our adoption and use of the technologies in our life. We can map fairly directly most technological developments in the last 100 (or even 200) years to this framework: a net lift, followed by a push to extract value and subsequent insistence upon the technology’s ubiquity:&lt;/p&gt;

            &lt;/div&gt;
            &lt;section class=&quot;tech-lockup&quot;&gt;
                &lt;div&gt;
                    &lt;h3 id=&quot;the-textile-revolution&quot; tabindex=&quot;-1&quot;&gt;the textile revolution&lt;/h3&gt;
&lt;p&gt;The preferred imagery used to mythologize the Industrial Revolution is the woodetchings of textile manufacturers, transformed in the early 19th century by the arrival of automated fabric machinery. Its proponents laud the shift of an agricultural society to a technological one, creating new sectors for labor, and raising up the middle class (we will say nothing of this period’s &lt;em&gt;new&lt;/em&gt; punishing conditions for labor in this essay&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-6&quot;&gt;6&lt;/a&gt;). But the ultimate ecological and human costs engendered by the increasing availability of cheap fabric production are well-documented: In 2022, the fashion and textile industries employed around 60 million factory workers worldwide&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-7&quot;&gt;7&lt;/a&gt;, and less than 2% of those workers earn a living wage. Those workers also endure the full suite of labor exploitation practices, including gender-based harassment, wage theft, and unsafe conditions. On the material side, the induced consumption resulting from ever-cheaper products means the world consumed 400% more textile products globally as 20 years ago&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-8&quot;&gt;8&lt;/a&gt;, and bins most of it (the average American generates 82 pounds of textile waste each year).&lt;/p&gt;

                &lt;/div&gt;
                &lt;div&gt;
                    &lt;h3 id=&quot;antibiotic-technology&quot; tabindex=&quot;-1&quot;&gt;antibiotic technology&lt;/h3&gt;
&lt;p&gt;The arrival of antibiotics in 1928&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-9&quot;&gt;9&lt;/a&gt; allowed for revolutionary leaps in fighting bacterial infections like strep throat, pneumonia, and meningitis, but an over-dependence and over-prescription of penicillin and its siblings through the 1950s-70s resulted in the proliferation of antibiotic resistance, which subsequently led to longer hospital stays, higher medical costs, and increased mortality.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-10&quot;&gt;10&lt;/a&gt;&lt;/p&gt;

                &lt;/div&gt;
                &lt;div&gt;
                    &lt;h3 id=&quot;space-exploration&quot; tabindex=&quot;-1&quot;&gt;space exploration&lt;/h3&gt;
&lt;p&gt;Since the beginning of the space exploration era in the late 1950s, humanity has made leaps and bounds in learning about our own world and its physical systems, telecommunications, imaging, etc. The increasing frequency of commercialization missions in space for satellite systems (and lately tourism) has resulted in immense amounts of space debris being generated — both from active satellites and from jettisoned/destroyed components of previous missions, the debris threatens future missions and has even been destructive to the field of astronomy, making it impossible to use earth-based sensors and photography devices to learn about space.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-11&quot;&gt;11&lt;/a&gt; So desperate to extract Shareholder Value from the starry sky, we’re blinding our own ability to look at it.&lt;/p&gt;

                &lt;/div&gt;
            &lt;/section&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;The web is no exception to this pattern. A vision of interoperability, accessibility, and usability, the World Wide Web was first conceived in 1989 as a way to universally link documents and other media content in a flexibly-organized system that could make information easily accessed at CERN, and be easily shared with collaborators beyond.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-12&quot;&gt;12&lt;/a&gt; But the proliferation of access and ultimate social requirement of access has spawned countless troubles for human society, including cyberstalking and bullying, the instantaneous circulation of CSAM, violent images, and misinformation, identity theft, addiction, etcetera.&lt;/p&gt;
&lt;p&gt;The rampant industrialization and commercialization of the Web predictably develops flashy, insidious patterns of extracting capital from its users: new surfaces for information means new surfaces for advertisement, and new formats of media beget new mechanisms for divorcing you from their ownership.&lt;/p&gt;

            &lt;/div&gt;
            &lt;div class=&quot;rendered convivial-life&quot;&gt;
                &lt;h3 id=&quot;convivial-life-and-convivial-tooling&quot; tabindex=&quot;-1&quot;&gt;convivial life &amp;amp; convivial tooling&lt;/h3&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/book-small-is-beautiful-400w.webp 400w, https://henry.codes/img/book-small-is-beautiful-800w.webp 800w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/book-small-is-beautiful-400w.jpeg&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;1207&quot; srcset=&quot;https://henry.codes/img/book-small-is-beautiful-400w.jpeg 400w, https://henry.codes/img/book-small-is-beautiful-800w.jpeg 800w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
Illich poses &lt;em&gt;convivial&lt;/em&gt; tools as directly opposed to this industrialized, radically-monopolized set of social systems. Similar to E.F. Schumacher’s concept of “intermediate technology” introduced in his 1973 book &lt;em&gt;Small Is Beautiful: A Study of Economics As If People Mattered&lt;/em&gt;, convivial tools are sustainable, energy-efficient (though often labor intensive), local-first, and designed primarily to enhance the autonomy and creativity of their users.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-13&quot;&gt;13&lt;/a&gt; Illich cites specifically hand tools, bicycles, and telephones as examples, but with its enormous capacity for interoperability and extensibility, the Internet is the perfect workshed in which to design our own Tools For Conviviality.&lt;/p&gt;

            &lt;/div&gt;
        &lt;/section&gt;
        &lt;section class=&quot;chapter-four&quot; id=&quot;the-web-we-want&quot;&gt;
             &lt;header class=&quot;chapter-four-hero&quot;&gt;
                &lt;div class=&quot;chapter-four-hero__inner&quot;&gt;
                &lt;div class=&quot;chapter-counter&quot;&gt;part four.&lt;/div&gt;
                &lt;h2 class=&quot;chapter-four-hero__title&quot;&gt;the Web we want&lt;/h2&gt;
                &lt;/div&gt;
                &lt;figure&gt;
                    &lt;div class=&quot;drift&quot;&gt;
                        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/john-martin_the-plains-of-heaven-1500w.webp 1500w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/john-martin_the-plains-of-heaven-1500w.jpeg&quot; alt=&quot;&quot; width=&quot;1500&quot; height=&quot;960&quot;&gt;&lt;/picture&gt;
                    &lt;/div&gt;
                    &lt;figcaption&gt;&lt;a href=&quot;https://www.tate.org.uk/art/artworks/martin-the-plains-of-heaven-t01928&quot;&gt;The Plains of Heaven, &lt;cite&gt;John Martin&lt;/cite&gt; (1851-3)&lt;/a&gt;&lt;/figcaption&gt;
                &lt;/figure&gt;
            &lt;/header&gt;
            &lt;div class=&quot;consider&quot;&gt;
                &lt;p class=&quot;consider__title&quot;&gt;let’s reconsider&lt;/p&gt;
                &lt;p class=&quot;consider__text&quot;&gt;the markers of a decaying &#39;Net I mentioned before, with convivial tooling in mind:&lt;/p&gt;
            &lt;/div&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;h3&gt;Teaching &amp; learning on the Web&lt;/h3&gt;
                &lt;div class=&quot;cols teaching&quot;&gt;
                &lt;p&gt;Monolithic platforms like YouTube, TikTok, Medium, and Substack draw a ton of creators and educators because of the promise of monetization and large audiences, but they’ve shown time and time again how the lack of ownership creates a problem. When those platforms fail, when they change their rules, when they demand creators move or create a particular way to maintain their access to those audiences, they pit creators or their audiences against the loss of the other. Without adhering to the algorithm’s requirements, writers may not write an impactful document, and without bypassing a paywall, readers can’t read it.&lt;/p&gt;
&lt;p class=&quot;lg-mk&quot;&gt;¶&lt;/p&gt;
&lt;p&gt;When those promises of exorbitant wealth and a life of decadence through per-click monetization ultimately dry up (or come with a steep moral or creative cost), creators and learners must look for new solutions for how educational content is shared on the Internet. The most self-evident, &lt;em&gt;convivial&lt;/em&gt; answer is an old one: blogs. HTML is free to access by default, &lt;a href=&quot;https://indieweb.org/RSS&quot;&gt;RSS&lt;/a&gt; has worked for about 130 years&lt;sup&gt;[citation needed]&lt;/sup&gt;, and combined with &lt;a href=&quot;https://indieweb.org/Webmention&quot;&gt;webmentions&lt;/a&gt;, it’s never been easier to read new ideas, experiment with ideas, and build upon &amp;amp; grow those ideas with other strong thinkers on the web, &lt;em&gt;owning&lt;/em&gt; that content all along.&lt;a class=&quot;footnote-inline&quot; href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/#footnote-14&quot;&gt;14&lt;/a&gt;&lt;/p&gt;

                &lt;/div&gt;
            &lt;/div&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;h3&gt;Connecting with friends on the Web&lt;/h3&gt;
                &lt;div class=&quot;cols connecting&quot;&gt;
                &lt;p&gt;Social media apps have imprisoned us all in this weird content prison — in order to connect with friends we’re sort of forced to create or be vanished by capricious black box algorithms, and all that we &lt;em&gt;do&lt;/em&gt; create is, as we’ve already alluded to, subsequently owned by whatever platform we’ve created it on. If Instagram goes away overnight, or decides to pivot catastrophically, your stories and your network of friends goes with it.&lt;/p&gt;
&lt;p class=&quot;lg-mk&quot;&gt;¶&lt;/p&gt;
&lt;p&gt;The advent and development of tools &amp;amp; methodologies like &lt;a href=&quot;https://indieweb.org/POSSE&quot;&gt;POSSE&lt;/a&gt; (&lt;em&gt;Publish On your Own Site, Syndicate Elsewhere&lt;/em&gt;), &lt;a href=&quot;https://en.wikipedia.org/wiki/ActivityPub&quot;&gt;ActivityPub&lt;/a&gt;, &lt;a href=&quot;https://microformats.org/wiki/microformats2&quot;&gt;microformats&lt;/a&gt;, and &lt;a href=&quot;https://atproto.com/&quot;&gt;ATProto&lt;/a&gt;, it’s becoming quite achievable to generate your own social network, interoperable with other networks like Bluesky or Mastodon. That network, designed for ownership and decentralization, is durable, designed around storytelling instead of engagement, and free of the whims of weird tech billionaires.&lt;/p&gt;
&lt;p&gt;With some basic HTML knowledge and getting-stuff-online knowledge, a handful of scrappy protocols, and a free afternoon or two, one can build their own home to post bangers for the tight homies, make friends, and snipe those new friends with those hits of dopamine they so fiendishly rely on.&lt;/p&gt;

                &lt;/div&gt;
            &lt;/div&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;h3&gt;Coding for the web&lt;/h3&gt;
                &lt;div class=&quot;cols coding&quot;&gt;
                &lt;p&gt;Lastly, consider the discipline of web engineering:&lt;/p&gt;
&lt;p&gt;We have been asked to build the same B2B SaaS website with the same featureset n^∞ times, and our answers for the optimal way to do that are increasingly limited. We’ve penned all of our markup into JavaScript templates just in case a product manager needs the wrapper component to post JSON somewhere down the line, and we’ve whittled away at style code until it’s just a mechanism for deploying one of two border-radius-drop-shadow combos to divs. It’s an industrial, production-minded way of approaching a discipline that has all the hallmarks of being a great craft, and that’s understandably uninspiring to many of us.&lt;/p&gt;
&lt;p class=&quot;lg-mk&quot;&gt;¶&lt;/p&gt;
&lt;p&gt;Yet our young React shepherds have no need to fear: there are countless more colors than blurple out there, and countless more fonts than Inter. HTML and CSS are better and more generative technologies than they’ve ever been: Thanks to the tireless work of the CSS working groups and browser implementers, etc, there is an unbelievable amount of creative expression possible with basic web tools in a text editor. Even JavaScript is more progressively-enhanceable than ever, and enables interfacing with a rapidly-growing number of exciting browser APIs &lt;em&gt;(still &lt;a href=&quot;https://www.thepinknews.com/2012/04/04/javascript-inventor-gave-1000-to-support-californias-gay-marriage-ban/&quot;&gt;fuck Brendan Eich&lt;/a&gt; though)&lt;/em&gt;. &lt;a href=&quot;https://henry.codes/writing/i-know-about-the-date-in-the-footer/&quot;&gt;&lt;code&gt;${new Date.getCurrentYear()}&lt;/code&gt;&lt;/a&gt; is a veritable renaissance of web code, and it asks of authors only curiosity and a drive to experiment.&lt;/p&gt;

                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/section&gt;
        &lt;hr class=&quot;divider&quot;&gt;
        &lt;section class=&quot;chapter-five&quot; id=&quot;where-do-we-go-from-here&quot;&gt;
            &lt;div class=&quot;chapter-five-hero&quot;&gt;
                &lt;div class=&quot;chapter-five-hero__inner&quot;&gt;
                    &lt;div class=&quot;chapter-counter&quot;&gt;part five.&lt;/div&gt;
                    &lt;h2 class=&quot;chapter-five-hero__title&quot;&gt;so &lt;em&gt;where&lt;/em&gt; do we go from &lt;em&gt;here?&lt;/em&gt;&lt;/h2&gt;
                &lt;/div&gt;
                &lt;figure&gt;
                    &lt;div class=&quot;drift&quot;&gt;
                    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/caspar-david-friedrich_abbey-among-oak-trees-1500w.webp 1500w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/caspar-david-friedrich_abbey-among-oak-trees-1500w.jpeg&quot; alt=&quot;&quot; width=&quot;1500&quot; height=&quot;961&quot;&gt;&lt;/picture&gt;
                    &lt;/div&gt;
                    &lt;figcaption&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/The_Abbey_in_the_Oakwood&quot;&gt;The Abbey in the Oakwood, &lt;cite&gt;Caspar David Friedrich&lt;/cite&gt; (1810)&lt;/a&gt;&lt;/figcaption&gt;
                &lt;/figure&gt;
            &lt;/div&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;Illich’s thesis is that technology and its derived tools should serve people in a way that enhances their freedom, creativity, independence, and will.&lt;/p&gt;
&lt;p&gt;The distillation of those principles on the web through manual code, hand-built social networks, and blogs, points luminously to one answer to the question of how the Internet can best serve humans:&lt;/p&gt;

            &lt;/div&gt;
            &lt;h3 class=&quot;websites-callout&quot;&gt;it’s personal websites.&lt;/h3&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;Hand-coded, syndicated, and above all &lt;em&gt;personal&lt;/em&gt; websites are exemplary: They let users of the internet to be autonomous, experiment, have ownership, learn, share, find god, find love, find purpose. Bespoke, endlessly tweaked, eternally redesigned, built-in-public, surprising UI and delightful UX. The personal website is a staunch undying answer to everything the corporate and industrial web has taken from us.&lt;/p&gt;

            &lt;/div&gt;
            &lt;div class=&quot;rendered and-how&quot;&gt;
                &lt;p&gt;And how might one claim this ultimate toolchain of conviviality, and build a place on the web that enhances their autonomy and creativity?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How might one build a personal website?&lt;/em&gt;&lt;/p&gt;

            &lt;/div&gt;
            &lt;ol class=&quot;steps-list&quot;&gt;
                &lt;li class=&quot;steps-list-item&quot;&gt;
                    &lt;h3 id=&quot;start-small&quot; tabindex=&quot;-1&quot;&gt;Start small&lt;/h3&gt;
&lt;p&gt;Let yourself start small, have fun trying shit that doesn’t work, document your growth, publish failed ideas &amp;amp; successful ones. Some of the best websites in the world are just HTML, and they belong to their authors. Make friends, let yourself be inspired by others, send friendly emails asking to learn new things, and do not demand of yourself masterpieces.&lt;/p&gt;

                &lt;/li&gt;
                &lt;li class=&quot;steps-list-item&quot;&gt;
                &lt;h3 id=&quot;reduce-friction-to-publishing&quot; tabindex=&quot;-1&quot;&gt;Reduce friction to publishing&lt;/h3&gt;
&lt;p&gt;Get the resistance to ship out of your way. Don’t get caught up in tooling and frameworks, just write HTML and get something online. If you’re an engineer, delight that you’re not beholden to the same standards of quality and rigorous testing that you are at work — draft some ideas, hit the &lt;code&gt;h1&lt;/code&gt; to &lt;code&gt;p&lt;/code&gt; tag combo, and publish. Update and update again; let your ideas grow like gardens, the way they do in your mind. The mutability of the web, often its great weakness, is also one of its great strengths.&lt;/p&gt;

                &lt;/li&gt;
                &lt;li class=&quot;steps-list-item&quot;&gt;
                    &lt;h3 id=&quot;don-t-worry-about-design-unless-you-want-to&quot; tabindex=&quot;-1&quot;&gt;Don’t worry about design &lt;em&gt;(unless you want to)&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Don’t worry about design unless that’s the part that brings you joy. Make friends with designers and trade your work for theirs, or trade tips, trade advice. Get comfortable with being joyfully bad at something — from that soil of humility grows a million questions for those who have learned and are excited to share. Iterate until you’ve something you’re proud of, or iterate so much you’ve ruined it and have to go back to bald.&lt;/p&gt;

                &lt;/li&gt;
                &lt;li class=&quot;steps-list-item&quot;&gt;
                    &lt;h3 id=&quot;use-the-indie-web&quot; tabindex=&quot;-1&quot;&gt;Use the IndieWeb&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://indieweb.org/&quot;&gt;Leverage the IndieWeb&lt;/a&gt; and its wonderfully thought-out protocols, tools like &lt;a href=&quot;https://brid.gy/&quot;&gt;brid.gy&lt;/a&gt; to syndicate your ideas out to the wider web, and then use Webmentions to bring the ensuing conversations back where the content is. That way, you can publish work where you prefer to, folks on Bluesky can enjoy and discuss it, in the same stroke as folks on Mastodon may, or folks directly on the canonical URL.&lt;/p&gt;

                &lt;/li&gt;
                &lt;li class=&quot;steps-list-item&quot;&gt;
                    &lt;h3 id=&quot;join-us-in-sharing-what-you-ve-made&quot; tabindex=&quot;-1&quot;&gt;Join us in sharing what you’ve made&lt;/h3&gt;
&lt;p&gt;I encourage you to join us in our auspicious website adventure, and if you do, I hope you’ll further join us on &lt;a href=&quot;https://personalsit.es&quot;&gt;personalsit.es&lt;/a&gt;, our happy little home for everyone building something humble or thrilling or joyful or deeply accursed, but personal.&lt;/p&gt;

                &lt;/li&gt;
            &lt;/ol&gt;
        &lt;/section&gt;
        &lt;section class=&quot;chapter-six&quot; id=&quot;denouement&quot;&gt;
                &lt;header class=&quot;chapter-six-hero&quot;&gt;
                &lt;div class=&quot;chapter-six-hero__inner&quot;&gt;
                    &lt;div class=&quot;chapter-counter&quot;&gt;part six.&lt;/div&gt;
                    &lt;h2 class=&quot;chapter-six-hero__title&quot;&gt;(denouement)&lt;/h2&gt;
                &lt;/div&gt;
                &lt;figure&gt;
                    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-400w.webp 400w, https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-800w.webp 800w, https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-1400w.webp 1400w, https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-2721w.webp 2721w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-400w.jpeg&quot; alt=&quot;&quot; width=&quot;2721&quot; height=&quot;3722&quot; srcset=&quot;https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-400w.jpeg 400w, https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-800w.jpeg 800w, https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-1400w.jpeg 1400w, https://henry.codes/img/albert-bierstadt_sunrise-on-the-matterhorn-2721w.jpeg 2721w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
                    &lt;figcaption&gt;&lt;a href=&quot;https://www.metmuseum.org/art/collection/search/10158&quot;&gt;Sunrise on the Matterhorn, &lt;cite&gt;Albert Bierstadt&lt;/cite&gt; (after 1875)&lt;/a&gt;&lt;/figcaption&gt;
                &lt;/figure&gt;
            &lt;/header&gt;
            &lt;div class=&quot;rendered&quot;&gt;
                &lt;p&gt;You’re not crazy. The internet &lt;em&gt;does&lt;/em&gt; feel genuinely so awful right now, and for about a thousand and one reasons. But the path back to feeling like you have some control is to un-spin yourself from the Five Apps of the Apocalypse and reclaim the Internet as a set of tools you use to build something you can own &amp;amp; be proud of — or in most of our cases, be deeply ashamed of. &lt;em&gt;Godspeed and good luck&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;❦&lt;/p&gt;
&lt;p&gt;That’s all for me. If you find any issues with this post, please reach out to me &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;by email&lt;/a&gt;. Thanks eternally for your time and patience, and thanks for reading. Find me here online at one of my personal websites like &lt;a href=&quot;https://henry.codes&quot;&gt;henry.codes&lt;/a&gt; or &lt;a href=&quot;https://strange.website&quot;&gt;strange.website&lt;/a&gt; or &lt;a href=&quot;https://stillness.digital&quot;&gt;stillness.digital&lt;/a&gt; or &lt;a href=&quot;https://strangersbyspring.com&quot;&gt;strangersbyspring.com&lt;/a&gt;, or sometimes &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;on Bluesky&lt;/a&gt; and &lt;a href=&quot;https://front-end.social/@henry&quot;&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As ever, unionize, free Palestine, trans rights are human rights, fix your heart or die.&lt;/p&gt;
&lt;p class=&quot;fin&quot;&gt;&lt;em&gt;fin.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://henry.codes/&quot; class=&quot;go-home&quot;&gt;go home&lt;/a&gt;&lt;/p&gt;

            &lt;/div&gt;
        &lt;/section&gt;
        &lt;hr class=&quot;divider&quot;&gt;
        &lt;footer class=&quot;works-cited&quot;&gt;
            &lt;h3 class=&quot;works-cited__title&quot;&gt;Works Cited&lt;/h3&gt;
            &lt;ol class=&quot;works-cited-list&quot;&gt;
&lt;li id=&quot;footnote-1&quot;&gt;Duany, Andres, et al. &lt;em&gt;Suburban Nation: The Rise of Sprawl and the Decline of the American Dream.&lt;/em&gt; North Point Press, 2001.&lt;/li&gt;
&lt;li id=&quot;footnote-2&quot;&gt;Shoup, Donald C. &lt;em&gt;The High Cost of Free Parking.&lt;/em&gt; Routledge, 2017.&lt;/li&gt;
&lt;li id=&quot;footnote-3&quot;&gt;Kunstler, James Howard. &lt;em&gt;The Geography of Nowhere: The Rise and Decline of America’s Man-Made Landscape.&lt;/em&gt; Simon &amp;amp; Schuster, 1995.&lt;/li&gt;
&lt;li id=&quot;footnote-4&quot;&gt;Cervero, Robert. &lt;em&gt;The Transport Metropolis: A Global Enquiry.&lt;/em&gt; Island ; Kogan Page, 1999.&lt;/li&gt;
&lt;li id=&quot;footnote-5&quot;&gt;Illich, Ivan. &lt;em&gt;Tools for Conviviality.&lt;/em&gt; Harper &amp;amp; Row, 1973.&lt;/li&gt;
&lt;li id=&quot;footnote-9&quot;&gt;“The Struggles of Labor.” &lt;em&gt;United States History, U.S. Department of State,&lt;/em&gt; countrystudies.us/united-states/history-82.htm.&lt;/li&gt;
&lt;li id=&quot;footnote-10&quot;&gt;“Global Fashion Industry Statistics.” &lt;em&gt;FashionUnited,&lt;/em&gt; fashionunited.com/statistics/global-fashion-industry-statistics.&lt;/li&gt;
&lt;li id=&quot;footnote-11&quot;&gt;“The True Cost.” CMV Laservision, 2016.&lt;/li&gt;
&lt;li id=&quot;footnote-6&quot;&gt;“What Is Penicillin?” &lt;em&gt;Cleveland Clinic Health Library,&lt;/em&gt; 17 Oct. 2025, my.clevelandclinic.org/health/treatments/penicillin.&lt;/li&gt;
&lt;li id=&quot;footnote-7&quot;&gt;&lt;em&gt;Antimicrobial Resistance: Global Report on Surveillance.&lt;/em&gt; World Health Organization, 2014.&lt;/li&gt;
&lt;li id=&quot;footnote-8&quot;&gt;Borlaff, A.S., Marcum, P.M. &amp;amp; Howell, S.B. Satellite megaconstellations will threaten space-based astronomy. &lt;em&gt;Nature&lt;/em&gt; &lt;strong&gt;648&lt;/strong&gt;, 51–57 (2025). https://doi.org/10.1038/s41586-025-09759-5&lt;/li&gt;
&lt;li id=&quot;footnote-12&quot;&gt;Berners-Lee, Tim. “Information Management: A Proposal.” &lt;em&gt;The Original Proposal of the WWW, HTMLized,&lt;/em&gt; Mar. 1989, www.w3.org/History/1989/proposal.html.&lt;/li&gt;
&lt;li id=&quot;footnote-13&quot;&gt;Schumacher, Ernst Friedrich. &lt;em&gt;Small Is Beautiful: Economics as If People Mattered.&lt;/em&gt; Harper Perennial, 1973.&lt;/li&gt;
&lt;li id=&quot;footnote-14&quot;&gt;“Webmention.” &lt;em&gt;IndieWeb,&lt;/em&gt; indieweb.org/Webmention.&lt;/li&gt;
&lt;/ol&gt;

        &lt;/footer&gt;
    &lt;/main&gt;
    &lt;script&gt;document.documentElement.classList.remove(&#39;no-js&#39;)&lt;/script&gt;
    &lt;script src=&quot;https://henry.codes/js/a-website-to-destroy/index.js&quot; type=&quot;module&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://cdn.usefathom.com/script.js&quot; data-site=&quot;ADEBIAUD&quot; defer=&quot;&quot;&gt;&lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;
</description>
    <pubDate>Thu, 01 Jan 2026 12:15:01 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/a-website-to-destroy-all-websites/</guid>
</item>
<item>
    <title>Economics &amp; labor rights in AI skepticism</title>
    <link>https://henry.codes/writing/economics-and-labor-rights-in-ai-skepticism/</link>
    <description>&lt;p&gt;There’s a growing attitude in the technology industry that LLM technology is, or will be, the next great innovation to our work. Business owners and workers alike seem to be in unlikely agreement: owners are thrilled at the prospect of making their businesses more efficient and productive, and workers are thrilled at the prospect of simplifying their workstreams or making their jobs easier. It’s a surprising alliance in the prevailing economic system.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;This is a post about the economic implications of adopting AI in your work, not about whether or not they actually improve your productivity. For the sake of argument, this will assume there is some productivity added. There is plenty of criticism of countless aspects of AI/LLMs/et al technologies online, but this post engages primarily with the concerns of labor.&lt;/p&gt;
&lt;h2 id=&quot;some-context-on-capitalism&quot; tabindex=&quot;-1&quot;&gt;Some context on capitalism&lt;/h2&gt;
&lt;p&gt;From Andrew S. Zimbalist’s &lt;em&gt;&lt;a href=&quot;https://archive.org/details/comparingeconomi0000zimb_q8i6/page/6/mode/2up&quot;&gt;Comparing economic systems: a political-economic approach&lt;/a&gt;&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Capitalism&lt;/em&gt; is an economic system based on the private ownership of the means of production and their use for the purpose of obtaining profit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That obtained profit &lt;em&gt;can&lt;/em&gt; come from many places: production facilities expansion, resource availability, or technological advances make production cheaper, macroeconomic forces increase demand for a product, allowing its price to be increased, etc.&lt;/p&gt;
&lt;p&gt;However, in the recent past, that profit has been disproportionately extracted from the labor force. &lt;a href=&quot;https://www.epi.org/publication/charting-wage-stagnation/&quot;&gt;The Economic Policy Institute analyzed productivity and wage data&lt;/a&gt; from Bureau of Labor Statistics and Bureau of Economic Analysis from the 1940s until early 2010s, and found that while productivity increased hand-in-hand with hourly labor compensation from 1948 to 1973, the next 40 years showed an increasing and immense gap: while productivity went up nearly 75%, hourly compensation only increased 10%.&lt;/p&gt;
&lt;p&gt;This can be attributed to the mechanics of the system. In a capitalist framework, businesses &lt;em&gt;must&lt;/em&gt; create profit to be considered successful, and extracting more and more of that profit from labor is practically codified in the economic playbook of capital: stagnating wages, off-shoring work to laborers with lower standards of living, even &lt;a href=&quot;https://www.nelp.org/prop-22-unconstitutional/&quot;&gt;leveraging legal systems to allow for fewer labor affordances&lt;/a&gt;. Capital will always choose the interests of capital over the interests of labor — it must do this to survive.&lt;/p&gt;
&lt;h2 id=&quot;where-llms-come-in&quot; tabindex=&quot;-1&quot;&gt;Where LLMs come in&lt;/h2&gt;
&lt;p&gt;Capitalism as it stands, in America and beyond, only functions if it continually finds new ways to extract value from labor: so while the upsides of adopting LLM technology to you as a worker might seem marginally useful now, that adoption directly contributes to that extraction, ultimately devaluing labor.&lt;/p&gt;
&lt;p&gt;If we take the lofty claims of LLM marketers to be true, that by adopting LLM workflows, you may do the work of your team, say 25% faster, what are the implications of this to the managerial/supervisory class? Consider a scenario:&lt;/p&gt;
&lt;p&gt;Let’s say your team is expected to create 1 widget per period, and your team has 5 people on it. By the time your entire team is 25% more efficient, you have gone from individually creating .2 widgets to creating .25 widgets with the help of LLMs, which means your team creates 1.25 widgets per period.&lt;/p&gt;
&lt;p&gt;Applying the systematic behaviors of capitalism, one may envision two possible outcomes from this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first likelihood is that you now are paid the same wages and expected to create more widgets, which means your labor has necessarily gotten less valuable. If you got hired at $100 per period to create .2 widgets, and now get paid $100 to create .25, you functionally get paid less ($20 less per period in this case, but it’s academic).&lt;/li&gt;
&lt;li&gt;The second likelihood, and the more insidious one, is that the increase in efficiency justifies downsizing. If your team is expected to create 1 widget, and now creates 1.25, the bottom line to the company is that if it lets you or one of your teammates go, it can create 1 widget for 25% cheaper. That’s free profit to the company, and sacrificed employment to one of you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While to an individual that loss of employment might be devastating, to the company a reduction in workforce is a line-item; as mentioned before, capitalism will always choose its own interests. It’s not a personal decision, it’s not a specific person that can save you or betray you: &lt;a href=&quot;https://en.wikipedia.org/wiki/The_purpose_of_a_system_is_what_it_does&quot;&gt;capitalism, as a system, was designed to work this way&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is a farther-reaching consequence to this, which is that: the more roles that companies eliminate under this increase in efficiency, the higher the supply of the labor market, which as market economics 101 will tell you means that the price for labor will go down, worsening the crisis of stagnate wages.&lt;/p&gt;
&lt;h2 id=&quot;what-is-there-to-do&quot; tabindex=&quot;-1&quot;&gt;What is there to do?&lt;/h2&gt;
&lt;p&gt;As technologists, we are workers first. We cannot individually stop the machine of capitalism from exploiting our labor, and, while this tide will shift, many of us are too romanced by the technofuturist dream of LLMs — despite widespread, multidisciplinary criticism of the technology and disastrous consequences in its application so far — to easily reconsider our adoption of it.&lt;/p&gt;
&lt;p&gt;The solution to the oncoming waves of LLM-related labor devaluation has at least two solutions, which should be applied in tandem:&lt;/p&gt;
&lt;p&gt;As individuals, we must reject the indiscriminate proliferation of LLM technology in our work. As many have written, there &lt;em&gt;may actually&lt;/em&gt; be actually valid applications of this technology, but any that weaken your role as a laborer should be viewed with intense scrutiny. The immediate convenience of writing fewer TypeScript interfaces will be followed swiftly by the economic ramifications of cheapened labor — no matter how much you like your boss, it is a systematic certainty in a capitalist market.&lt;/p&gt;
&lt;p&gt;Collectively, we must organize as a labor force. Countless examples through the history of capital show that production owners/business people have no qualms about organizing against us — from the Pullman Strikes, to the Ludlow Massacre, to the Mohawk Valley Formula, the class of means has no incentive not to collude, organize, and act against the interests of labor. Labor must consequently organize and act in its defense.&lt;/p&gt;
&lt;p&gt;There is great precedent and inertia for labor organization in the technology industry — I recommend Ethan Marcotte’s book &lt;em&gt;&lt;a href=&quot;https://ethanmarcotte.com/books/you-deserve-a-tech-union/&quot;&gt;You Deserve a Tech Union&lt;/a&gt;&lt;/em&gt; as further reading.&lt;/p&gt;
&lt;p&gt;Thanks for taking the time :) I’d really like this to be a strong if succinct advocation, so feel free to &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;email me&lt;/a&gt; if you have any questions or concerns.&lt;/p&gt;
</description>
    <pubDate>Tue, 03 Jun 2025 18:30:55 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/economics-and-labor-rights-in-ai-skepticism/</guid>
</item>
<item>
    <title>How to collect Webmentions for your site</title>
    <link>https://henry.codes/writing/collecting-webmentions/</link>
    <description>&lt;p class=&quot;editors-note&quot;&gt;Quick disclaimer before we start. This is well-trod ground. Nothing here is new or revolutionary, nothing about this implementation hasn’t already been done by &lt;a href=&quot;https://henry.codes/writing/collecting-webmentions/#further-reading&quot;&gt;smarter folks than I&lt;/a&gt; :) This is just my blog post about it.&lt;/p&gt;
&lt;p&gt;We’ll use &lt;a href=&quot;https://webmention.io&quot;&gt;webmention.io&lt;/a&gt; for this. &lt;em&gt;webmention.io&lt;/em&gt; is a hosted service for receiving Webmentions. There are &lt;a href=&quot;https://webmention.net/implementations/&quot;&gt;many other implementations of the Webmention spec&lt;/a&gt;, but this is the easiest one to get cooking with in my experience! All we have to do to get started is to authenticate ourselves using &lt;a href=&quot;https://indieauth.net/&quot;&gt;IndieAuth&lt;/a&gt;, and then connect our &lt;em&gt;webmention.io&lt;/em&gt; endpoint.&lt;/p&gt;
&lt;h2 id=&quot;authenticating-with-indie-auth-via-indie-auth-com&quot; tabindex=&quot;-1&quot;&gt;Authenticating with IndieAuth via &lt;em&gt;IndieAuth.com&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;One thing I’ll say is that while “the hardest part of computer science is naming things” is contentious, &amp;quot;the hardest part of “interfacing with IndieWeb tools is the names of things” is inarguable: &lt;em&gt;IndieAuth.com&lt;/em&gt; is a hosted implementation of the IndieAuth specification, and it’s what &lt;em&gt;webmention.io&lt;/em&gt;, which is a hosted implementation of the Webmention specification, uses to handle authentication.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;It’s devious work, I agree, but thankfully your old friend Mr. Websites has already handled the mess of this naming convention.&lt;/p&gt;
&lt;h3 id=&quot;identity-verification&quot; tabindex=&quot;-1&quot;&gt;Identity Verification&lt;/h3&gt;
&lt;p&gt;One of the major tenets of the IndieWeb is this concept that your personal domain, which you own, can be used to verify your identity across the web. A common mechanism for this identity verification is the use of &lt;code&gt;rel=&amp;quot;me&amp;quot;&lt;/code&gt; links.&lt;/p&gt;
&lt;p&gt;The way &lt;code&gt;rel=&amp;quot;me&amp;quot;&lt;/code&gt; works is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;On your website, you can add a link to another online profile or source of identity, such as GitHub, your email inbox, or Mastodon (for this tutorial we’ll use GitHub, as that’s one of the acceptable providers for IndieAuth), and add an attribute &lt;code&gt;rel=&amp;quot;me&amp;quot;&lt;/code&gt;, which “indicates that the current resource is represented by the linked party.” &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/me&quot;&gt;More on the rel=“me” configuration can be found on MDN&lt;/a&gt;. Here’s how it might look for me:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://github.com/xdesro/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;me&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;GitHub&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Bluesky &amp;amp; Mastodon links are good use cases for a rel=&quot;me&quot; link,
 but for IndieAuth to work in this demo, we&#39;ll need to use GitHub.
 You could also use your email or a PGP key! --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://bsky.app/profile/strange.website&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;me&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Bluesky&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://front-end.social/@henry&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;me&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Mastodon&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you prefer not to have visible links, you can use &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags in your document &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;me&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://github.com/xdesro&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On each linked profile, link back to your website. On GitHub, for example, if you link to your URL, they’ll automatically add the &lt;code&gt;rel=&amp;quot;me&amp;quot;&lt;/code&gt; attribute when rendering:
&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.04.48_2x_k0hlra-400w.webp 400w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.04.48_2x_k0hlra-800w.webp 800w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.04.48_2x_k0hlra-1036w.webp 1036w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.04.48_2x_k0hlra-400w.jpeg&quot; alt=&quot;Some fields from the GitHub profile editing user interface, namely the URL field.&quot; width=&quot;1036&quot; height=&quot;614&quot; srcset=&quot;https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.04.48_2x_k0hlra-400w.jpeg 400w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.04.48_2x_k0hlra-800w.jpeg 800w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.04.48_2x_k0hlra-1036w.jpeg 1036w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.05.15_2x_nruiny-400w.webp 400w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.05.15_2x_nruiny-800w.webp 800w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.05.15_2x_nruiny-1258w.webp 1258w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.05.15_2x_nruiny-400w.jpeg&quot; alt=&quot;The rendered output of the profile with custom url, showing the anchor tag with a rel=me attribute.&quot; width=&quot;1258&quot; height=&quot;156&quot; srcset=&quot;https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.05.15_2x_nruiny-400w.jpeg 400w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.05.15_2x_nruiny-800w.jpeg 800w, https://henry.codes/writing/collecting-webmentions/CleanShot_2025-05-23_at_12.05.15_2x_nruiny-1258w.jpeg 1258w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;That’s all you need to do for IndieAuth. The basic idea here is that only You can update your website to add a statement like “this link is &lt;em&gt;my&lt;/em&gt; GitHub account”, and furthermore only You can update your GitHub account to say “this link is &lt;em&gt;my&lt;/em&gt; personal website”, so it stands to reason that because they refer to each other, they’re both You.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We can move on to the next step now, but if you’d like to, you can &lt;a href=&quot;https://indielogin.com/&quot;&gt;test your IndieAuth configuration here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;actually-collecting-webmentions-using-webmention-io&quot; tabindex=&quot;-1&quot;&gt;Actually collecting Webmentions using &lt;em&gt;Webmention.io&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Now that we’ve set up IndieAuth, we can log in to &lt;em&gt;Webmention.io&lt;/em&gt;. It’ll prompt us to log in via whatever modes we’ve configured, and then we’ll verify our login. Next, add the &lt;code&gt;&amp;lt;link rel=&amp;quot;webmention&amp;quot;&amp;gt;&lt;/code&gt; tag that it gives you to the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of your HTML document.&lt;/p&gt;
&lt;p&gt;That should be all we need to start collecting Webmentions to our site! The &lt;a href=&quot;https://webmention.io/dashboard&quot;&gt;Webmention.io dashboard&lt;/a&gt; will show recent Webmentions, or I usually use the actual API view, which you can access from the &lt;a href=&quot;https://webmention.io/settings&quot;&gt;Webmention.io settings page&lt;/a&gt;, because it’s a bit cleaner.&lt;/p&gt;
&lt;p&gt;If you want to test that everything’s hooked up, I’ve found the &lt;a href=&quot;https://beatonma.org/webmentions_tester/&quot;&gt;beatonma.org Webmention testing tool&lt;/a&gt; works great; just paste in a URL on your site and refresh the Webmention.io dashboard to see it show up!&lt;/p&gt;
&lt;h2 id=&quot;next-steps-for-webmentions&quot; tabindex=&quot;-1&quot;&gt;Next steps for Webmentions&lt;/h2&gt;
&lt;p&gt;If you’d like, you can also request the &lt;code&gt;mentions.jf2&lt;/code&gt; endpoint from the &lt;em&gt;Webmention.io&lt;/em&gt; API:&lt;/p&gt;
&lt;pre class=&quot;language-md&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;https://webmention.io/api/mentions.jf2?token=${the token on the webmention.io settings page}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will give you a JSON readout you could use to render mentions on your site, but that’s another blog post — in fact I’d like to do a whole series on it but &lt;abbr title=&quot;in my opinion&quot;&gt;IMO&lt;/abbr&gt; this is a great start for getting involved with the IndieWeb and using your domain as an identity store. Fantastic work, your ancestors (the chill ones) are smiling upon thee on this day.&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further Reading&lt;/h3&gt;
&lt;p&gt;Here’s to all the killers that have covered this subject matter before, and some other really good resources for this sort of work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sia.codes/posts/webmentions-eleventy-in-depth/&quot;&gt;An In-Depth Tutorial of Webmentions + Eleventy&lt;/a&gt;, by Sia Karamalegos&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rknight.me/blog/adding-webmentions-to-your-site/&quot;&gt;Adding Webmentions to Your Site&lt;/a&gt;, by Robb Knight&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mxb.dev/blog/using-webmentions-on-static-sites/&quot;&gt;Using Webmentions in Eleventy&lt;/a&gt;, by Max Böck&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://janmonschke.com/adding-webmentions-to-your-static-blog/&quot;&gt;Adding webmentions to your static blog&lt;/a&gt;, by Jan Monschke&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/webmention/&quot;&gt;The W3C Webmention spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://indieauth.spec.indieweb.org/&quot;&gt;The IndieAuth spec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Fri, 23 May 2025 17:59:28 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/collecting-webmentions/</guid>
</item>
<item>
    <title>Well, what if I&#39;m wrong?</title>
    <link>https://henry.codes/writing/well-what-if-im-wrong/</link>
    <description>&lt;p&gt;Anyone online has seen over the past years how the frequency of Palestinian accounts on Bluesky and other platforms has increased, two- and four-fold, folks asking for help and linking to GoFundMes. They share their stories and plea for help, to flee Gaza, to buy price-gouged food for their children, to afford healthcare. I have made the choice to move from my values, namely that &lt;a href=&quot;https://henry.codes/writing/a-case-for-unconditional-giving/&quot;&gt;&lt;em&gt;no one asks for help that doesn’t need it&lt;/em&gt;&lt;/a&gt;: I make an effort to give aid to everyone who asks me to. But what if it’s a mistake to do so?&lt;/p&gt;
&lt;p&gt;I’ve noticed a strange contrary attitude or a strange silence from my peers in response to these requests for aid. There’s a reflex to keep staring straight ahead, or there’s a great, perfect-posture, chin-up reflex to Verify™. Because &lt;a href=&quot;https://en.wikipedia.org/wiki/Sock_puppet_account&quot;&gt;it’s easy to sock-puppet on the web&lt;/a&gt; these days, and at the end of the day, anonymity is baked into the fiber of the Internet, and you can’t possibly know if you’re donating to a real person or some deft scammer.&lt;/p&gt;
&lt;h2 id=&quot;you-can-t-possibly-know&quot; tabindex=&quot;-1&quot;&gt;You can’t possibly know&lt;/h2&gt;
&lt;p&gt;The folks who genuinely need help are likely indistinguishable from the malicious actors. With the advent of LLM tools, it’s probably more easy than it has ever been to create increasingly sophisticated bots that could collect donations. While there are some folks doing all the footwork to personally verify the personhood of different accounts asking for help, not every account of the hundreds, thousands, might be verified. All that labor to research signals of legitimacy and interview people — it’s certainly not negligible.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;&lt;a href=&quot;https://bsky.app/profile/thejohnnyhill.com/post/3lpk36kvfcs2y&quot;&gt;As Johnny Hill points out&lt;/a&gt;, there are a lot of prominent folks, like Molly Shah, like Alex Winter, like the &lt;a href=&quot;https://bsky.app/profile/fairshare.help&quot;&gt;fairshare bot&lt;/a&gt; doing this labor, meeting these people already. &lt;a href=&quot;https://bsky.app/profile/thejohnnyhill.com/post/3lpk36l4zhc2y&quot;&gt;As he further points out&lt;/a&gt;, if it’s really so important to you, you can &lt;em&gt;trust people already in community with Gazans&lt;/em&gt;, instead of withholding in favor of some different version of your life where you’re the world’s greatest online detective.&lt;/p&gt;
&lt;h2 id=&quot;besides-we-donate-to-legacy-aid-institutions&quot; tabindex=&quot;-1&quot;&gt;Besides, we donate to legacy aid institutions&lt;/h2&gt;
&lt;p&gt;I’ve written about this before, and donating to aid groups like Doctors Without Borders, UNRWA, the World Food Program, etc, is an honorable and necessary act. But in the case of Israel’s genocide of the Palestinian people, that critical aid is arriving in a &lt;a href=&quot;https://www.wfp.org/news/risk-famine-across-all-gaza-new-report-says&quot;&gt;disturbingly diminished capacity&lt;/a&gt;, and often &lt;a href=&quot;https://www.bbc.com/news/articles/c9q4w99je78o&quot;&gt;not arriving at all&lt;/a&gt;. That’s not to say that these institutions aren’t critical, that they don’t make a difference. But if your $50 donation is spread among the &lt;a href=&quot;https://www.thenewhumanitarian.org/opinion/2022/05/03/aid-to-palestinians-has-failed-heres-how-to-fix-it&quot;&gt;now millions of Gazans that need aid to get by&lt;/a&gt;, and arrives months from now if ever, it starts to impel questions of whether or not there are more effective ways to make a difference.&lt;/p&gt;
&lt;h2 id=&quot;so-what-if-i-m-wrong&quot; tabindex=&quot;-1&quot;&gt;So what if I’m wrong?&lt;/h2&gt;
&lt;p&gt;What if my GoFundMe donation actually ends up in the hands of a malicious actor? What if I can’t afford the time and energy to vet the legitimacy of everyone who asks for help? Won’t I be embarassed? Won’t I be a fool, won’t I have wasted money on something so foolish as hope, as prayer?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Yes.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;but-what-if-i-m-right&quot; tabindex=&quot;-1&quot;&gt;But what if I’m right?&lt;/h2&gt;
&lt;p&gt;Direct aid and grassroots networks move at a rate institutional aid groups functionally cannot. Quite obviously, getting immediate help in the hands of individual people helps those people immediately. Donating directly to these families eliminates the bottleneck of waiting in lines to receive slim humanitarian aid &lt;em&gt;when those lines are even available&lt;/em&gt; in an environment of constant human rights violations. Moreover, providing help beyond their immediate needs enables them to distribute that aid to their community, existing person-to-person networks spread aid among families and neighbors and god-willing eventually whole communities.&lt;/p&gt;
&lt;p&gt;And consider your own mental health for a moment — we look daily into the torment nexus to watch children blown apart and families starved and hospitals collapsed and journalists targeted and bastard &lt;abbr title=&quot;Israel Occupying Force&quot;&gt;IOF&lt;/abbr&gt; soldiers laughing at the results of their &lt;a href=&quot;https://en.wikipedia.org/wiki/Israeli_bombing_of_the_Gaza_Strip&quot;&gt;remote-controlled slaughter&lt;/a&gt;. It’s not right for it to happen and it’s not right for us to watch and do nothing. Forgive me the appeal to spirituality, but it’s not right for your soul to sit and view and do nothing. We can riot in the streets, and we &lt;em&gt;should&lt;/em&gt; riot, with hope and anger and persistence, but in the mean time, this is something we can do that materially changes the daily life of Palestinians.&lt;/p&gt;
&lt;p&gt;And for a minute, put all of this aside — fuck, man. Isn’t it worth the risk? If I donate $25, if I donate $100, if I donate my entire net worth, and 90% of it goes to scammers — but some portion of it is responsible for keeping a single Palestinian alive for one more day, isn’t that worth it? Why is this a calculus any of us are running — your pride, your resistance to being scammed by imagined masterminds is not worth anyone’s life.&lt;/p&gt;
&lt;p&gt;Please, please &lt;em&gt;let yourself off the hook&lt;/em&gt;. The next time someone asks you for help, it will heal some part of you to help them; without vetting and qualifying the act of helping. You can make a difference to someone right now.&lt;/p&gt;
</description>
    <pubDate>Mon, 19 May 2025 16:19:30 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/well-what-if-im-wrong/</guid>
</item>
<item>
    <title>A case for unconditional giving</title>
    <link>https://henry.codes/writing/a-case-for-unconditional-giving/</link>
    <description>&lt;p&gt;I’ll be honest — I am ashamed of how long it took me to get here. Too many half-hearted hypothetical protestations, hands sweatily-wrung. I read someone’s blog post about this a few years back &lt;em&gt;(I’ll link it when I find it)&lt;/em&gt; and it hit me square in the middle of the forehead with how obvious this all ought to be:&lt;/p&gt;
&lt;p&gt;We should give folks spare change when they ask for it.&lt;/p&gt;
&lt;p&gt;The lady on the corner by your office, the scratchy-voiced man on the subway, the folks pitching local newspapers outside your neighborhood bar — when they ask for help we should help them, unconditionally.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;I am uncomfortable with all forms of policing, including behavior scolding. If this post isn’t for you, I don’t take it personally, there’s a whole bunch of articles about HTML right around the corner from this URL.&lt;br&gt;&lt;br&gt;I get the feeling, however, that this post is actually for a lot of us, and we just need an excuse to let ourselves change our minds on this. Stick with me here.&lt;/p&gt;
&lt;h2 id=&quot;why-you-might-not&quot; tabindex=&quot;-1&quot;&gt;Why you might not&lt;/h2&gt;
&lt;p&gt;I’ve gone through literally every one of these little cognitive dissonances at one time or another — it’s just how we’ve been socialized, but I’m gonna face each one and by the end of this I hope you’ll shake them off and sit next to me.&lt;/p&gt;
&lt;h3 id=&quot;i-don-t-have-any-money-to-give&quot; tabindex=&quot;-1&quot;&gt;I don’t have any money to give&lt;/h3&gt;
&lt;p&gt;You’re off the hook. If we can’t afford to spare even a dollar a week from our costs-of-living, that’s real and it really is awful out there, and this post just isn’t for someone facing that.&lt;/p&gt;
&lt;p&gt;I reckon many of us &lt;em&gt;can&lt;/em&gt; spare it, though — even the smallest amount, and we know who we are. I’m building a habit of taking out a fluctuating amount a week, depending on how sore my wallet is, breaking it at a cafe or convenience store, and because Denver has a big population of folks who need help, I’m usually able shed it by the end of the week.&lt;/p&gt;
&lt;h3 id=&quot;what-if-they-use-it-for-drugs-cigarettes-alcohol-the-wrong-thing&quot; tabindex=&quot;-1&quot;&gt;What if they use it for drugs/cigarettes/alcohol/The Wrong Thing?&lt;/h3&gt;
&lt;p&gt;This is one of the really sticky things about this conversation — we need to actually believe that people are entitled to their own privacy and their own agency. Just as it’s none of our business what our housed neighbor or our best friend spends their money on, it is none of our business what the struggling person on the bus spends theirs on. It’s the hardest pivot to make from the socialization we’ve received that we have any stewardship over anyone else’s life just because they’re having a harder time than us, but it is imperative to make the mental shift.&lt;/p&gt;
&lt;p&gt;Anecdotally, most of the people I’ve known to experience homelessness or otherwise need to ask for help just have to meet obligations — overdue bills, medical care, eating a meal — but even if someone should decide to spend it on what you deem The Wrong Thing, they are owed their own agency to do so. It is not up to us to decide who gets to run their own lives.&lt;/p&gt;
&lt;p&gt;Furthermore, I’d love it if everyone got clean of their challenging drug or alcohol habit, but if a fix will get my neighbor through one more day and hopefully some steps closer to getting treatment, a day of self-medicated survival is always worth it over &lt;a href=&quot;https://www.psychologytoday.com/us/blog/all-about-addiction/201001/alcohol-benzos-and-opiates-withdrawal-that-might-kill-you&quot;&gt;a potentially deadly withdrawal&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;shouldn-t-i-give-them-this-toiletries-pb-and-j-care-package-i-keep-on-hand&quot; tabindex=&quot;-1&quot;&gt;Shouldn’t I give them this toiletries/PB&amp;amp;J/care package I keep on hand?&lt;/h3&gt;
&lt;p&gt;It doesn’t hurt to offer! Usually, people will be honest with you about what they need, though. This goes hand-in-hand with the previous point of affording folks their own agency. If someone asks for cash, and we give them one of the pre-made sandwiches we’ve had in your car for weeks or the toiletry kit that they might already have many of the items from instead, we’ll have gone through a lot of effort to not really help very much. In some cases, maybe the care package we designed is exactly what someone needs, but often folks are best served by being able to choose their own priorities and make their own purchases.&lt;/p&gt;
&lt;h3 id=&quot;what-about-the-guy-that-my-buddy-says-drives-a-mercedes-home-from-panhandling-every-day&quot; tabindex=&quot;-1&quot;&gt;What about the guy that my buddy says drives a Mercedes home from panhandling every day?&lt;/h3&gt;
&lt;p&gt;You don’t believe that guy exists, and neither do I, and we sound silly saying it — it’s a strange urban myth a lot of people hang onto because they’ve never interrogated it. To be extremely generous and afford this some credence, I’ll make the assumption that this is a warped perspective on there being different states of poverty. Plainly: Some people own homes and still need help. Some people own cars and still need help. Some people have disability statuses that mandate they cannot work without losing coverage. All of these countless states of Getting By are easier to understand if you believe that, almost always, when people ask for help, it’s because they need help.&lt;/p&gt;
&lt;h3 id=&quot;they-should-seek-help-from-government-programs-soup-kitchens&quot; tabindex=&quot;-1&quot;&gt;They should seek help from government programs/soup kitchens!&lt;/h3&gt;
&lt;p&gt;Many people do! And it is possible to hold true two things: the government programs, government workers, and volunteers all do great work, &lt;em&gt;and&lt;/em&gt; people still need help beyond that. If the government responded adequately to the needs of its citizens, we’d have a lot fewer problems in many more directions. Additionally, &lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S1353829223001296&quot;&gt;many shelters are unsafe for myriad reasons&lt;/a&gt;, and many programs simply can’t meet the demand, and must turn people away. It’s something but it just isn’t enough — our direct action we take when called upon is one more raindrop that raises the sea.&lt;/p&gt;
&lt;!-- There&#39;s sometimes this sentiment that &quot;well I pay taxes, I&#39;m helping enough,&quot; but when was the last time you saw your taxes do _enough_ for your neighborhood? You know what your taxes are used for, and it&#39;s the police.{.editors-note} --&gt;
&lt;h2 id=&quot;why-you-really-ought-to&quot; tabindex=&quot;-1&quot;&gt;Why you really ought to&lt;/h2&gt;
&lt;h3 id=&quot;for-your-peace&quot; tabindex=&quot;-1&quot;&gt;For your peace&lt;/h3&gt;
&lt;p&gt;This is a little hand-wavey, but stick with me. I know some of us feel uncomfortable with the interaction of being asked for money. It is incredibly distressing to practice ignoring someone asking for help on the subway, and it rots our hearts to do so. We become reflexive in how quickly we deploy “sorry, I don’t have cash”, “not today brother”, etc.&lt;/p&gt;
&lt;p&gt;A deliberate practice of carrying cash specifically to help our neighbors solves this: we are able to, in one stroke, meet the need of the person asking for help, acknowledge their humanity and show them kindness and respect, easily resolve a previously challenging human interaction by acting human, &lt;em&gt;and&lt;/em&gt; feel like we’ve done something material and active to make our neighborhood better.&lt;/p&gt;
&lt;p&gt;There’s no shame in helping because it makes us feel good to help. Our reasons for helping are immaterial to the result.&lt;/p&gt;
&lt;h3 id=&quot;for-your-soul-for-your-community&quot; tabindex=&quot;-1&quot;&gt;For your soul, for your community&lt;/h3&gt;
&lt;p&gt;We take care of us, we keep each other safe. There’s an uneasy silence among middle-class people in neoliberal cities like Denver, like San Francisco, like Seattle, etc, about the routine violence of our police against homeless or mentally ill people. We cannot rely on the government to solve problems; we must show each other love and care freely and openly and unconditionally.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;None of this is new or revolutionary — quite the opposite, I came way too late to this way of thinking &lt;em&gt;&lt;a href=&quot;https://e1.pxfuel.com/desktop-wallpaper/129/350/desktop-wallpaper-you-are-not-immune-to-propaganda-1920-%C3%97-1080.jpg&quot;&gt;(garfield-you-are-not-immune-to-propaganda.bmp)&lt;/a&gt;&lt;/em&gt;. But the second I switched over to this mindset it instantly became the easiest, most obvious, most soulful contribution I’m able to make to my neighborhood every single day. We’re late but we’re not too late. I hope you’ll join me.&lt;/p&gt;
&lt;p&gt;As always, &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;email me&lt;/a&gt; to talk more or challenge these ideas. Thanks for reading.&lt;/p&gt;
&lt;style&gt;
.further-reading {
    display: none; /* feels weird to have a READ MORE ABOUT CSS on an article this somber */
}
&lt;/style&gt;
</description>
    <pubDate>Thu, 06 Mar 2025 04:09:30 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/a-case-for-unconditional-giving/</guid>
</item>
<item>
    <title>Using Figma to design perfect gallery walls</title>
    <link>https://henry.codes/writing/using-figma-to-design-gallery-walls/</link>
    <description>&lt;p class=&quot;under-construction&quot;&gt;Quick heads up: Since writing this, I’ve found one or two fairly sizeable bugs in the Galleria plugin. I’ve published anyway cause the guide is not entirely dependent on Galleria, and Galleria is &lt;em&gt;mostly&lt;/em&gt; functional. You can still give it a shot, or alternately use Photoshop’s Perspective Warp tool, or come back soon and I should have it worked out :) &lt;em&gt;(cir. Feb 21 2025)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’m a twisted animal with a penchant for moving every two years, and the universal upside of moving every two years, as everyone will agree, is hanging new gallery walls. The rectangle enjoyer in me started using Figma to design them a few years ago; the upside is I can draft a bunch of ideas without taking up room on the living room floor, and can re-use the assets created year after year on new walls at new apartments. It even has the added bonus of becoming a little archive of past walls. It’s nice, and you can too.&lt;/p&gt;
&lt;div class=&quot;subgrid flow two-col&quot; style=&quot;--standard-column: 2 / span 10;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp_avfa88-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp_avfa88-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp_avfa88-1016w.webp 1016w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp_avfa88-400w.jpeg&quot; alt=&quot;A gallery wall designed in Figma, featuring framed images of different sizes aligned in an organic sort of mosaic configuration.&quot; width=&quot;1016&quot; height=&quot;876&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp_avfa88-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp_avfa88-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp_avfa88-1016w.jpeg 1016w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl_orgzf1-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl_orgzf1-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl_orgzf1-1016w.webp 1016w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl_orgzf1-400w.jpeg&quot; alt=&quot;The same gallery wall as in the previous image, this time implemented in a real-life wall over an acacia wood bedframe with olive and natural colored linen bedspread.&quot; width=&quot;1016&quot; height=&quot;876&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl_orgzf1-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl_orgzf1-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl_orgzf1-1016w.jpeg 1016w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;p&gt;The tools you’ll need for this are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A tape measure&lt;/li&gt;
&lt;li&gt;Phone or other camera&lt;/li&gt;
&lt;li&gt;Figma&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;editors-note&quot;&gt;Bro I realized about 4 seconds into writing this that &lt;abbr title=&quot;in real life&quot;&gt;IRL&lt;/abbr&gt; &lt;em&gt;frames&lt;/em&gt; and Figma &lt;em&gt;frames&lt;/em&gt; are really hard to refer to distinctly in writing — if any of this is confusing shoot me an email or &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;complain on Bluesky&lt;/a&gt; and I’ll get you sorted.&lt;/p&gt;
&lt;h2 id=&quot;gathering-and-treating-assets&quot; tabindex=&quot;-1&quot;&gt;Gathering and treating assets&lt;/h2&gt;
&lt;p&gt;The first thing that needs done is to photograph the pieces that’ll be going into the wall. I try to always shoot new additions in the same context and light. You want to avoid glare but most everything else can be fixed with a Figma plugin we’re gonna grab in the next step. It doesn’t even particularly matter how far or at what angle you take the photo, but in general:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Take a photo of the entire framed image.&lt;/em&gt; The frame is part of the visual effect of the gallery wall so it’s important to include it, not just the artwork it contains.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Leave a few inches around each frame&lt;/em&gt;, both to avoid lens distortion and so you have some room to crop in.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Try to shoot mostly straight on.&lt;/em&gt; Doesn’t need to be perfect by any means but a little effort to square things up a bit before we manually square them wouldn’t be a bad thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_10.40.25_2x_px0rfm-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_10.40.25_2x_px0rfm-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_10.40.25_2x_px0rfm-1148w.webp 1148w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_10.40.25_2x_px0rfm-400w.jpeg&quot; alt=&quot;A group of 5 photographs of framed art prints in a Finder window.&quot; width=&quot;1148&quot; height=&quot;420&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_10.40.25_2x_px0rfm-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_10.40.25_2x_px0rfm-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_10.40.25_2x_px0rfm-1148w.jpeg 1148w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;correcting-perspective-using-the-galleria-plugin&quot; tabindex=&quot;-1&quot;&gt;Correcting perspective using the &lt;em&gt;Galleria&lt;/em&gt; plugin&lt;/h3&gt;
&lt;p&gt;Next we’ll use a Figma plugin I made &lt;em&gt;(crowd slamming hands on tables, chanting “shill! shill! shill!”)&lt;/em&gt; to make sure the perspective of our images is perfectly square for planning and mockup purposes. You can install and run the plugin from Figma Community:&lt;/p&gt;
&lt;article class=&quot;article-block article-block--external themed dark&quot;&gt;
    &lt;h1 class=&quot;article-block__title&quot;&gt;Galleria - Perspective Warp Tool&lt;/h1&gt;
    &lt;div class=&quot;article-block__meta&quot;&gt;
        &lt;p class=&quot;article-block__meta-highlight&quot;&gt;by Henry (From Online)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;article-block__excerpt&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;A Figma plugin for correcting or warping the perspective of image fills in your Figma document.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;article-block__external-disclaimer&quot;&gt;
&lt;span&gt;this link goes some strange place beyond this website&lt;/span&gt;
&lt;span&gt;go with care&lt;/span&gt;
&lt;/div&gt;
&lt;a href=&quot;https://www.figma.com/community/plugin/1472344805958514303/galleria-perspective-warp-tool&quot; class=&quot;article-block__link with-arrow with-arrow--out&quot;&gt;Read more&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;/article&gt;
&lt;p&gt;I’ve already written a detailed guide on how to use the plugin elsewhere on my blog, so if the onboard UI isn’t clear, you can head over there to get situated!&lt;/p&gt;
&lt;article class=&quot;card article-block&quot;&gt;
    &lt;dl class=&quot;article-block__meta&quot;&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Category&lt;/dt&gt;
            &lt;dd&gt;resource&lt;/dd&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Tags&lt;/dt&gt;
            &lt;dd&gt;figma | figma plugins&lt;/dd&gt;
        &lt;/div&gt;
    &lt;/dl&gt;
    &lt;h1 class=&quot;article-block__title&quot;&gt;Correcting perspective in Figma images with the Galleria plugin&lt;/h1&gt;
    &lt;dl class=&quot;article-block__meta&quot;&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Reading Time&lt;/dt&gt;
            &lt;dd&gt;3 minute read&lt;/dd&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Last updated&lt;/dt&gt;
            &lt;dd&gt;
                &lt;time&gt;Last updated February 17, 2025&lt;/time&gt;
            &lt;/dd&gt;
        &lt;/div&gt;
    &lt;/dl&gt;
    &lt;a href=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/&quot; class=&quot;article-block__link with-arrow&quot;&gt;Read more&lt;/a&gt;
&lt;/article&gt;
&lt;p class=&quot;editors-note&quot;&gt;I based the functionality of this plugin off Photoshop’s Perspective Warp tool, so if you’ve got Photoshop and don’t wanna touch my garbage that’s a super strong alternative.&lt;/p&gt;
&lt;p&gt;I try to stick to an assembly-line style of work, taking all of the photos at once, adding them all to Figma at once, correcting all their perspectives in a batch, etc. For each framed image, we’ll import it to Figma and use &lt;em&gt;Galleria&lt;/em&gt; correct the perspective. Then we’ll crop the output to only the framed image, and paste it into the Figma canvas.&lt;/p&gt;
&lt;div class=&quot;column flow&quot; style=&quot;--standard-column: 3 / span 8;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-1400w.webp 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-2000w.webp 2000w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;with-transparent-bg&quot; alt=&quot;A set of five photographs of framed images first before any image treatment, and then again cropped and perspective-corrected.&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-400w.jpeg&quot; width=&quot;2000&quot; height=&quot;970&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-1400w.jpeg 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/figma-before-after-warp_m7b69r-2000w.jpeg 2000w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;h2 id=&quot;mapping-irl-measurements-into-figma&quot; tabindex=&quot;-1&quot;&gt;Mapping IRL measurements into Figma&lt;/h2&gt;
&lt;p&gt;Now we can collect the measurements of all of our frames and implement them in Figma. The way we’ll do this is by giving a real life unit a Figma canvas pixel equivalent. I typically map 1cm to 10px. Centimeters are more accurate than inches, and putting a 0 on the end of every number makes everything feel quite tidy.&lt;/p&gt;
&lt;p&gt;For each framed image, we’ll grab the width and height of the IRL frame in centimeters and set the corresponding Figma frame to that &lt;code&gt;cm&lt;/code&gt; measurement times ten. For example, if one of my posters is 54cm x 70cm, I’ll set its proxy in Figma to 540px x 700px. It’s important to work out an easy-to-remember measurement translation system so you can easily add new walls and new frames in the future.&lt;/p&gt;
&lt;div class=&quot;subgrid flow two-col&quot; style=&quot;--standard-column: 2 / span 10;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.59_nx9mvz-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.59_nx9mvz-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.59_nx9mvz-1000w.webp 1000w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.59_nx9mvz-400w.jpeg&quot; alt=&quot;A framed art print of Saint Sebastian being measured by the author with a tape measure. The overlaid text shows that the image is 29 by 37 centimeters.&quot; width=&quot;1000&quot; height=&quot;901&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.59_nx9mvz-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.59_nx9mvz-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.59_nx9mvz-1000w.jpeg 1000w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.11_2x_juy3fh-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.11_2x_juy3fh-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.11_2x_juy3fh-1288w.webp 1288w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.11_2x_juy3fh-400w.jpeg&quot; alt=&quot;The same image, now ported into Figma, showing its dimensions as 290 by 370 pixels, exactly 10 times the centimeter amount of the real-life unit.&quot; width=&quot;1288&quot; height=&quot;842&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.11_2x_juy3fh-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.11_2x_juy3fh-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.07.11_2x_juy3fh-1288w.jpeg 1288w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;h3 id=&quot;a-quick-note-about-figma-components&quot; tabindex=&quot;-1&quot;&gt;A quick note about Figma components&lt;/h3&gt;
&lt;p&gt;I recommend you use the Figma Create Component feature on each frame once you’ve got it warped, cropped, and resized. That way you can easily re-use it without worry of mutating the original.&lt;/p&gt;
&lt;h2 id=&quot;planning-out-walls&quot; tabindex=&quot;-1&quot;&gt;Planning out walls&lt;/h2&gt;
&lt;p&gt;Now that we have all of our frames imported, we can start trying out ideas. If I’ve got a wall space I’m designing for, I typically like to measure the entire wall and create it as a rectangle in Figma, even measuring out obstacles like doors or furniture so I can get an idea of the complete visual effect. Our translation system comes in handy again here: If my wall is 13ft long and 9ft high, I can convert that easily to 394cm x 274cm, and create a corresponding Figma “wall” rectangle of &lt;code&gt;3940px x 2740px&lt;/code&gt;. Now my framed &lt;em&gt;images&lt;/em&gt; will always by perfectly sized to the walls they’ll be mocking up.&lt;/p&gt;
&lt;h3 id=&quot;complex-wall-shapes&quot; tabindex=&quot;-1&quot;&gt;Complex wall shapes&lt;/h3&gt;
&lt;p&gt;If you want your mockup to respond to wall configurations more complicated than a perfectly-rectangular wall, you can make use of the Figma boolean operations. For example, if your wall is interrupted by a door, you can measure the size of the door and its distance from the closest wall, and then create a rectangle of the corresponding size and distance on top of the wall you’ve already created. Select both the door and the wall, and go to &lt;code&gt;Object → Boolean Groups → Subtract selection&lt;/code&gt;. Now your wall shape will be match the wall you have to work with in real life.&lt;/p&gt;
&lt;div class=&quot;column flow&quot; style=&quot;--standard-column: 2 / span 10;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-1400w.webp 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-2502w.webp 2502w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;A Figma diagram showing two superimposed rectangles, meant to indicate the size of the wall, and the position of a door on the wall. Next to the diagram is the same shape, re-created as one shape using Figma boolean composite operations.&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-400w.jpeg&quot; width=&quot;2502&quot; height=&quot;818&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-1400w.jpeg 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.16.38_2x_xo4yqr-2502w.jpeg 2502w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;h2 id=&quot;conclusion-and-potential-enhancements&quot; tabindex=&quot;-1&quot;&gt;Conclusion and potential enhancements&lt;/h2&gt;
&lt;p&gt;And that’s my system. It’s nice to be able to try out 30 versions of one layout before committing to putting nails in the wall. I’ve been using this method for years, refining my approach each time.&lt;/p&gt;
&lt;div class=&quot;subgrid flow two-col&quot; style=&quot;--standard-column: 2 / span 10;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-1400w.webp 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-1758w.webp 1758w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-400w.jpeg&quot; alt=&quot;A gallery wall designed in Figma, featuring framed images of different sizes aligned in an organic sort of mosaic configuration.&quot; width=&quot;1758&quot; height=&quot;1181&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-1400w.jpeg 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-comp-2_bmnpwn-1758w.jpeg 1758w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-1400w.webp 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-1758w.webp 1758w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-400w.jpeg&quot; alt=&quot;The same gallery wall as in the previous image, this time implemented in a real-life wall over a TV on tripod stand, with a sofa and a glass coffee table visible&quot; width=&quot;1758&quot; height=&quot;1181&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-1400w.jpeg 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/gallery-wall-complete-irl-2_f4msyo-1758w.jpeg 1758w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;p&gt;This is the most basic implementation, but there’s a ton you can do to enhance the simulation and implementation of the wall:&lt;/p&gt;
&lt;h3 id=&quot;mocking-up-the-actual-wall&quot; tabindex=&quot;-1&quot;&gt;Mocking up the actual wall&lt;/h3&gt;
&lt;p&gt;I usually take a picture of the wall I’m actually mocking up and perspective warp it the same way I do everything else, and then I can add it as a fill layer to the wall rectangle I’m laying out on. It adds just that much to the simulation to have actual wall texture or overlapping furniture visible.&lt;/p&gt;
&lt;div class=&quot;column flow&quot; style=&quot;--standard-column: 3 / span 8;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-400w.webp 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-800w.webp 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-1400w.webp 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-1902w.webp 1902w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;Two Figma comps of the same gallery wall design. In the first, the background is a plain white field. In the second, the author has included a real life photograph of the wall the frames will be hung on.&quot; src=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-400w.jpeg&quot; width=&quot;1902&quot; height=&quot;822&quot; srcset=&quot;https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-400w.jpeg 400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-800w.jpeg 800w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-1400w.jpeg 1400w, https://henry.codes/writing/using-figma-to-design-gallery-walls/CleanShot_2025-02-21_at_11.46.19_2x_i89hsk-1902w.jpeg 1902w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;h3 id=&quot;documenting-wall-mounting-points&quot; tabindex=&quot;-1&quot;&gt;Documenting wall mounting points&lt;/h3&gt;
&lt;p&gt;If you wanted to get really twisted with it, you could create diagrams of where you need to create mounting holes from this. I haven’t actually done this &lt;em&gt;yet&lt;/em&gt;, but the way I envision it would work is that you could create multi-layered components out of each frame. One layer would have the photograph of your image, and on a second layer you would create a diagram of where on the back of the frame the mounting hooks/rails/etc are.&lt;/p&gt;
&lt;p&gt;As always, if you’ve found any issues with any of this, the blog post or the process itself, feel free to &lt;a href=&quot;mailto:yo@henry.codes?subject=You%20Fool.%20You%20Absolute%20Goombus.%20What%20Were%20You%20Thinking.&quot;&gt;shoot me an email&lt;/a&gt; or &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;get at me on Bluesky&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Fri, 21 Feb 2025 18:50:52 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/using-figma-to-design-gallery-walls/</guid>
</item>
<item>
    <title>Correcting perspective in Figma images with the Galleria plugin</title>
    <link>https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/</link>
    <description>&lt;p&gt;Whether it’s a framed image that was taken at a slight angle, or a product photo that just doesn’t quite match the rest in the grid, I’ve frequently had the need to adjust the perspective of an image in my design work. In the past I’ve just used the Perspective Warp tool in Photoshop, but it felt silly to boot up a whole separate graphics program for a two-second adjustment, so I made &lt;em&gt;Galleria&lt;/em&gt;, a Figma plugin which lets you do exactly this.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-400w.webp 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-800w.webp 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-1400w.webp 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-2298w.webp 2298w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-400w.jpeg&quot; alt=&quot;A screenshot of the Figma Community page for the author’s &#39;Galleria&#39; plugin.&quot; width=&quot;2298&quot; height=&quot;1438&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-400w.jpeg 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-800w.jpeg 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-1400w.jpeg 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.52_2x_metbqv-2298w.jpeg 2298w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;installation&quot; tabindex=&quot;-1&quot;&gt;Installation&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Galleria&lt;/em&gt; is part of the Figma plugin community, so you can look it up in the app via &lt;code&gt;Plugins → Manage plugins&lt;/code&gt; and search “Galleria”, or just download it directly from the community:&lt;/p&gt;
&lt;article class=&quot;article-block article-block--external themed dark&quot;&gt;
    &lt;h1 class=&quot;article-block__title&quot;&gt;Galleria - Perspective Warp Tool&lt;/h1&gt;
    &lt;div class=&quot;article-block__meta&quot;&gt;
        &lt;p class=&quot;article-block__meta-highlight&quot;&gt;by Henry From Online&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;article-block__excerpt&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;A Figma plugin for correcting or warping the perspective of image fills in your Figma document.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;article-block__external-disclaimer&quot;&gt;
&lt;span&gt;this link goes some strange place beyond this website&lt;/span&gt;
&lt;span&gt;go with care&lt;/span&gt;
&lt;/div&gt;
&lt;a href=&quot;https://www.figma.com/community/plugin/1472344805958514303/galleria-perspective-warp-tool&quot; class=&quot;article-block__link with-arrow with-arrow--out&quot;&gt;Read more&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;/article&gt;
&lt;h2 id=&quot;a-new-perspective&quot; tabindex=&quot;-1&quot;&gt;A new perspective&lt;/h2&gt;
&lt;p&gt;To get started with &lt;em&gt;Galleria&lt;/em&gt;, you can select any frame or rectangle that has an image fill, and then run the plugin by right-clicking → plugins → &lt;em&gt;Galleria&lt;/em&gt;. A window will open with the image fill rendered twice, once as it currently is and also how it will be once you sort out the perspective.&lt;/p&gt;
&lt;div class=&quot;flow&quot; style=&quot;--standard-column: 3 / span 8&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-400w.webp 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-800w.webp 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-1400w.webp 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-2398w.webp 2398w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-400w.jpeg&quot; alt=&quot;The user interface, entitled Galleria as described above.&quot; width=&quot;2398&quot; height=&quot;1602&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-400w.jpeg 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-800w.jpeg 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-1400w.jpeg 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.12.45_2x_gss6da-2398w.jpeg 2398w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;!-- ![The user interface, entitled Galleria as described above.](https://res.cloudinary.com/henry-codes/image/upload/v1739895177/CleanShot_2025-02-18_at_09.12.45_2x_gss6da.png) --&gt;
&lt;/div&gt;
&lt;h3 id=&quot;selecting-a-perspective-plane&quot; tabindex=&quot;-1&quot;&gt;Selecting a perspective plane&lt;/h3&gt;
&lt;p&gt;You can drag the corners of the quadrilateral on the left image to select the corners of a plane in the image that is meant to be perfectly rectangular. As you adjust the plane selection, you’ll see the image get warped on the right side. Once you’ve matched up the points, the image on the right should have its perspective corrected.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;Sometimes, it doesn’t work perfectly lol. As far as I can tell it’s mostly when an image has excessive lens distortion in addition to angular distortion, but if you find additional bugs please &lt;a href=&quot;mailto:yo+figma@henry.codes?subject=Issues%20with%20Galleria&quot;&gt;don’t hesitate to let me know&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;flow&quot; style=&quot;--standard-column: 3 / span 8&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-400w.webp 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-800w.webp 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-1400w.webp 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-2000w.webp 2000w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;with-transparent-bg&quot; src=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-400w.jpeg&quot; alt=&quot;Three warped versions of the originally uploaded framed image of some snakes.&quot; width=&quot;2000&quot; height=&quot;857&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-400w.jpeg 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-800w.jpeg 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-1400w.jpeg 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/galleria-warped-frames_2_yoj2f5-2000w.jpeg 2000w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;h3 id=&quot;selecting-an-output-frame&quot; tabindex=&quot;-1&quot;&gt;Selecting an output frame&lt;/h3&gt;
&lt;p&gt;Now that the perspective is corrected, you can choose one of the export options, to put the entire result back into your Figma document, but since the result is a bizarre shape this probably isn’t what you want. If you want to crop the result, you can click-and-drag a shape in the second window to choose a preferred area.&lt;/p&gt;
&lt;div class=&quot;flow&quot; style=&quot;--standard-column: 3 / span 8&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-400w.webp 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-800w.webp 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-1400w.webp 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-1710w.webp 1710w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-400w.jpeg&quot; alt=&quot;The original image of a framed art print of some snakes, side-by-side on a Figma canvas with a cropped, perspective-corrected version of the same image.&quot; width=&quot;1710&quot; height=&quot;1196&quot; srcset=&quot;https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-400w.jpeg 400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-800w.jpeg 800w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-1400w.jpeg 1400w, https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/CleanShot_2025-02-18_at_09.25.36_2x_qt945c-1710w.jpeg 1710w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;h2 id=&quot;and-it-s-as-simple-as-that&quot; tabindex=&quot;-1&quot;&gt;And it’s as simple as that&lt;/h2&gt;
&lt;p&gt;And folks, it’s as simple as that. Like I mentioned before, if you find any images that fail, &lt;a href=&quot;mailto:yo+figma@henry.codes?subject=Issues%20with%20Galleria&quot;&gt;feel free to shoot me an email&lt;/a&gt; and I’ll do my best to get a fix in place. I use this tooling primarily to square up photographs of framed images in order to plan gallery walls in Figma, but if you have a unique use case, I’d love to hear about that too. Further questions comments concerns generational curses are welcome in my email inbox or you can yell at me &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;on Bluesky&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Mon, 17 Feb 2025 18:20:02 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/correcting-perspective-in-figma-images-with-the-galleria-plugin/</guid>
</item>
<item>
    <title>How I set up a new laptop</title>
    <link>https://henry.codes/writing/how-i-set-up-a-new-laptop/</link>
    <description>&lt;p&gt;Well it’s that time again, migrating for one reason or another listlessly between computers as priorities and jobs change. Here’s a middle-depth breakdown of how I speed-run getting a new machine off the ground.&lt;/p&gt;
&lt;p class=&quot;target-audience&quot;&gt;This post is for Mac computer users who might be interested in automating their setup workflow.&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;It’s like 85% Homebrew automation and about 5% dotfiles and about 3% curling tools that aren’t on Homebrew and 1% making sure Mac settings are correct. What you do with that remaining 6% is up to you, I’ve granted it to you as a gift — do not forget this kindness.&lt;/p&gt;
&lt;h2 id=&quot;preheat-the-oven-with-homebrew&quot; tabindex=&quot;-1&quot;&gt;Preheat the oven with Homebrew&lt;/h2&gt;
&lt;p&gt;Right off the bat I’ll kick open a Terminal window and install Homebrew, which is a package manager for OSX. This tool will handle almost all of my installs going forward — I’m personally quite allergic to the dance of downloading, installing, and subsequently deleting ten thousand &lt;code&gt;.pkg&lt;/code&gt; files from all corners of the &#39;Net, and besides, this is ✨ automated ✨.&lt;/p&gt;
&lt;p&gt;The install steps that Homebrew asks for change over time, so your best bet is to &lt;a href=&quot;https://brew.sh/&quot;&gt;visit the Homebrew website and follow their directions&lt;/a&gt;, but at the time of writing, the standard way of installing is a shell command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/bin/bash &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;It’s generally poor form to go pasting things from random strangers on the Internet into your Terminal. You can trust &lt;em&gt;me&lt;/em&gt; though, I’m like a &lt;em&gt;chill&lt;/em&gt; internet stranger.&lt;/p&gt;
&lt;h2 id=&quot;dotfiles-mise-en-place&quot; tabindex=&quot;-1&quot;&gt;Dotfiles Mise en Place&lt;/h2&gt;
&lt;p&gt;You’ve probably encountered dotfiles before, the janky extensionless files at your home directory that you sometimes have to edit to get certain shell commands to work, etc. Because they have so much potential for configuration, it’s super useful to store them online and reuse them, and that’ll power much of our setup. &lt;a href=&quot;https://dotfiles.github.io/tutorials/&quot;&gt;Plenty of folks&lt;/a&gt; have written at length about this pattern, so I won’t dive too deep here. Basically, we’re gonna create a GitHub repo at our home directory, &lt;code&gt;.gitignore&lt;/code&gt; everything (because we don’t want to just be adding everything all wilson-nilson), and force-add only the relevant files. That repo will then be a quickly-downloaded source of truth for our hard-fought finicky IDE/terminal/prompt config.&lt;/p&gt;
&lt;p&gt;I’ve currently got three configuration files in my dotfiles repo: a &lt;code&gt;.hyper.js&lt;/code&gt; JSON config for Hyper terminal, a &lt;code&gt;.zshrc&lt;/code&gt; for making my zsh + oh-my-zsh + &lt;a href=&quot;https://spaceship-prompt.sh/&quot;&gt;spaceship&lt;/a&gt; setup work well, and a Brewfile.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-git-and-dotfiles&quot; tabindex=&quot;-1&quot;&gt;Setting Up Git And Dotfiles&lt;/h2&gt;
&lt;p&gt;If I’ve got my dotfiles ready on an old laptop, I’ll need to clone them onto a new machine. The first step for that is making I can even access the repo to clone it. I use GitHub to store my git projects, so I can follow their directions for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent&quot;&gt;Generating a new SSH key and adding it to the ssh-agent&lt;/a&gt;, and&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account&quot;&gt;Adding that new SSH key to my GitHub account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Obviously you could just copy and paste from the browser but I use GitHub daily anyhow, may as well do this step now and never worry about it again!)&lt;/p&gt;
&lt;p&gt;Once that’s sorted, I can put dotfiles where they belong. Since the home directory already has stuff in it, it won’t be possible to just &lt;code&gt;git clone&lt;/code&gt;, so what we can do instead is:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; init
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; remote &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; origin DOTFILES_REPO_URL
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; reset origin/main &lt;span class=&quot;token comment&quot;&gt;# we have to do this in case any of the files in dotfiles already exist&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now our Brewfiles/&lt;code&gt;.zshrc&lt;/code&gt;/etc should have made it to where they belong! Next we can install all the apps that will adopt these configurations.&lt;/p&gt;
&lt;h2 id=&quot;installing-apps-with-brewfiles&quot; tabindex=&quot;-1&quot;&gt;Installing apps with Brewfiles&lt;/h2&gt;
&lt;p&gt;One of the cooler features of Homebrew is its ability to consume package files called Brewfiles &lt;em&gt;(similar to Gemfiles, if you’re into the Ruby ecosystem at all)&lt;/em&gt;, which can perform any number of sequenced actions. I’ve got most of my day-to-day apps and CLI tools sorted in the Brewfile I just pulled in the last step, and I can install them all at once. I’ve included a snippet of that Brewfile here, and you can &lt;a href=&quot;https://github.com/xdesro/dotfiles/blob/main/Brewfile&quot;&gt;view the whole thing over here&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-rb&quot;&gt;&lt;code class=&quot;language-rb&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Mac Apps with `--cask`&lt;/span&gt;
cask &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;alfred&quot;&lt;/span&gt;&lt;/span&gt;
cask &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;firefox&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# CLI tools with `brew install`&lt;/span&gt;
brew &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Even font files are fair game&lt;/span&gt;
tap &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;homebrew/cask-fonts&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# point Homebrew to where the font file lives&lt;/span&gt;
cask &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;font-inconsolata-nerd-font&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# install it&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once I’ve got my shopping list of apps set up, I can install all of them at once with a quick Homebrew command:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;brew bundle &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Homebrew automatically looks to install from &lt;code&gt;~/Brewfile&lt;/code&gt; if no other location is specified, so that Dotfiles import works seamlessly. Homebrew also has really straightforward logging — it’ll clearly indicate what it’s doing, and which of its actions were successful or not.&lt;/p&gt;
&lt;h2 id=&quot;installing-apps-without-brewfiles&quot; tabindex=&quot;-1&quot;&gt;Installing apps without Brewfiles&lt;/h2&gt;
&lt;p&gt;I use two tools that don’t jive well with Homebrew installation: &lt;code&gt;nvm&lt;/code&gt; and &lt;code&gt;oh-my-zsh&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;NVM is a version manager for Node, and they explicitly say &lt;a href=&quot;https://github.com/nvm-sh/nvm/blob/811c039e2b6fb305e6eb2269d7aa0d21eb067586/README.md?plain=1#L225&quot;&gt;on the repo install guide&lt;/a&gt; that Homebrew install isn’t supported. Theirs is—at the time of writing—just a &lt;code&gt;curl&lt;/code&gt; command to run their install script:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;Remember what I said about running random commands you find online? Doesn’t it seem like Apple should’ve made a secure, native package manager so installing stuff doesn’t feel so back alley?&lt;/p&gt;
&lt;p&gt;Oh My Zsh is a config manager for zsh — it enables plugins like the &lt;em&gt;extremely&lt;/em&gt; useful &lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git&quot;&gt;&lt;code&gt;git&lt;/code&gt; shortcuts and aliases&lt;/a&gt; plugin. It’s also a &lt;code&gt;curl&lt;/code&gt; command:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that ought to do it for installs for my default setup.&lt;/p&gt;
&lt;h2 id=&quot;last-steps&quot; tabindex=&quot;-1&quot;&gt;Last Steps&lt;/h2&gt;
&lt;p&gt;Believe it or not, that should be everything sorted. Homebrew does &lt;em&gt;so&lt;/em&gt; much of the heavy lifting, usually all that remains is to do some logins (easily done if one uses &lt;a href=&quot;https://1password.com/&quot;&gt;a password manager&lt;/a&gt; 👀) and configure final Mac settings. I personally set auto-keyboard intervention to off as a default (I can’t with the auto-capitalization and spellcheck), as well as turn on the battery percentage in the top bar.&lt;/p&gt;
&lt;p&gt;Thanks for reading! Hope it was useful, and I hope you find some meaningful, fitting way to get revenge on me for the time wasted if not. If you’re following this like it’s a tutorial and run into any issues, please &lt;a href=&quot;mailto:yo@henry.codes?subject=You%20dog%2C%20you%20rat%20bastard.%20Your%20tutorial%20has%20holes%20like%20the%20Titanic.&quot;&gt;definitely let me know&lt;/a&gt;!&lt;/p&gt;
</description>
    <pubDate>Sat, 23 Mar 2024 20:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-i-set-up-a-new-laptop/</guid>
</item>
<item>
    <title>How to map a number between two ranges</title>
    <link>https://henry.codes/writing/how-to-map-a-number-between-two-ranges/</link>
    <description>&lt;p&gt;Often in creative web projects, I find myself having to take a number, which exists in a specific range of numbers, and find the number that would be in the same position if the range were changed. Examples of this type of operation can vary anywhere from converting Fahrenheit to Celsius, to my recent use-case of creating an array of 500 “particles” with 3D coordinates and assigning each one a position between &lt;code&gt;{ z: -10 }&lt;/code&gt; and &lt;code&gt;{ z: 12 }&lt;/code&gt; relative to its position in the original array (i.e. &lt;code&gt;particles[0].z = -10&lt;/code&gt; and &lt;code&gt;particles[499].z = 12&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Here’s a basic tutorial on how to do that sort of thing, first as a mathematical rundown of the concept, and then a dirty JavaScript implementation.&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;In a rush? Don’t have time for a mere five minute tutorial blog post complete with handy diagrams &lt;em&gt;even though I made them just for you?&lt;/em&gt; No worries, here’s a quick JS one-liner for mapping a value from one range to another:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;mapRange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldMin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldMax&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newMin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newMax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; oldMin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;oldMax &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; oldMin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newMax &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; newMin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; newMin&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;the-math-part&quot; tabindex=&quot;-1&quot;&gt;The Math Part&lt;/h2&gt;
&lt;p&gt;What we’re doing here is a form of something called &lt;em&gt;linear transformation&lt;/em&gt;, or &lt;em&gt;linear mapping&lt;/em&gt;. Simply put, it’s just scaling any operation that happens on one side to the other. Take for instance that we have a line that goes between 0 and 2, and a value along that line of 1. Intuitively, we know that our value is halfway along the line, so if the line changes size (&lt;em&gt;maybe from 0 to 4)&lt;/em&gt;, our new value will still be halfway along the line.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;The actual concept of linear transformation gets way more complex than this, often involving matrices and vectors and extra dimensions and other words. Since as web developers, we’re merely lemon-muffin-brained baboons, we’ll keep to this shallower end of the pool for this blog post.&lt;/p&gt;
&lt;h3 id=&quot;breaking-it-down&quot; tabindex=&quot;-1&quot;&gt;Breaking It Down&lt;/h3&gt;
&lt;p&gt;To implement this concept more concretely, the first thing we’ll need to do is to find the relationship between our initial value and our initial range. We can do this by subtracting the minimum of the range from both our value and the maximum of the range, and then dividing the updated value from the updated maximum.&lt;/p&gt;
&lt;p&gt;In the following diagram, we’ll use &lt;code&gt;v&lt;/code&gt; to represent our input value and &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; to represent our input range’s minimum and maximum values.&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; font-size: 200%; position: relative;&quot; display=&quot;true&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -8.516ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16.391ex&quot; height=&quot;18.163ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -4264 7244.9 8028&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtable&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,3514)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(389,0)&quot;&gt;&lt;path data-c=&quot;1D463&quot; d=&quot;M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1096.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2096.4,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2846.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(3235.4,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3735.4,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4124.4,0)&quot;&gt;&lt;path data-c=&quot;1D435&quot; d=&quot;M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5105.7,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6105.9,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6855.9,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,2014)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(3622.4,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,514)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(372,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(389,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1111.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2111.4,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2611.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(3000.4,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3500.4,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(3889.4,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4611.7,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5611.9,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6111.9,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-986)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(3622.4,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-3078)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(3152.4,0)&quot;&gt;&lt;g data-mml-node=&quot;mfrac&quot;&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(220,676)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(220,-686)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;rect width=&quot;700&quot; height=&quot;60&quot; x=&quot;120&quot; y=&quot;220&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable rowspacing=&quot;.5em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;true&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;Just as we understood earlier, our value of 1 is 1/2 of distance between 0 and 2.&lt;/p&gt;
&lt;p&gt;Next, we’ll need to take this fraction multiply it by the actual size of the new range. We can find the actual size by subtracting the minimum of the new range from the maximum. We’ll add the minimum back at the very end.&lt;/p&gt;
&lt;p&gt;Here we’ll continue to use variables &lt;code&gt;v&lt;/code&gt;, &lt;code&gt;A&lt;/code&gt;, and &lt;code&gt;B&lt;/code&gt; as before, but with the addition of &lt;code&gt;x&lt;/code&gt; as our transformed value, &lt;code&gt;C&lt;/code&gt; as our output range minimum, and &lt;code&gt;D&lt;/code&gt; as our output range maximum.&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; font-size: 200%; position: relative;&quot; display=&quot;true&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -11.91ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;37.203ex&quot; height=&quot;24.95ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -5764 16443.8 11028&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtable&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,5014)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2294.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2683.6,0)&quot;&gt;&lt;path data-c=&quot;1D463&quot; d=&quot;M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3390.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4391,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5141,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(5530,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6030,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6419,0)&quot;&gt;&lt;path data-c=&quot;1D435&quot; d=&quot;M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7400.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(8400.4,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9150.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9539.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10150.7,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10872.9,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(11261.9,0)&quot;&gt;&lt;path data-c=&quot;1D437&quot; d=&quot;M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12312.1,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(13312.3,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(14072.3,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(14683.6,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(15683.8,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,3514)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(8221.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,2014)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(796,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2294.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2683.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3405.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4406,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4906,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(5295,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5795,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(6184,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6906.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(7906.4,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8406.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8795.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9406.7,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10128.9,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(10517.9,0)&quot;&gt;&lt;path data-c=&quot;34&quot; d=&quot;M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(11240.1,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(12240.3,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12740.3,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13351.6,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(14351.8,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,514)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(8221.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-1578)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(6076.9,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mfrac&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(220,676)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(220,-686)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;rect width=&quot;700&quot; height=&quot;60&quot; x=&quot;120&quot; y=&quot;220&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3067.8,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(3790,0)&quot;&gt;&lt;path data-c=&quot;34&quot; d=&quot;M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-3514)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(8221.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-5014)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(7019.1,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable rowspacing=&quot;.5em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;true&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;h3 id=&quot;applying-the-concept&quot; tabindex=&quot;-1&quot;&gt;Applying The Concept&lt;/h3&gt;
&lt;p&gt;Now that we understand what needs to happen mathematically, we can try it out with a more practical application. Let’s use the example of converting between Celsius and Fahrenheight we mentioned earlier.&lt;/p&gt;
&lt;p&gt;For choosing the ranges, we can use any set of numbers we want, but let’s go with the freezing and boiling points of water, since we know those values in both scales. We can use any temperature, but for this blog post let’s try 17ºC. Knowing our ranges and input value, we can set up our problem:&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; font-size: 200%; position: relative;&quot; display=&quot;true&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -9.05ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;32.892ex&quot; height=&quot;19.231ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -4500 14538.2 8500&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtable&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,3750)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(389,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(778,0)&quot;&gt;&lt;path data-c=&quot;1D463&quot; d=&quot;M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1485.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2485.4,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3235.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(3624.4,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4124.4,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4513.4,0)&quot;&gt;&lt;path data-c=&quot;1D435&quot; d=&quot;M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5494.7,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6494.9,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7244.9,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7633.9,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8245.1,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8967.3,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(9356.3,0)&quot;&gt;&lt;path data-c=&quot;1D437&quot; d=&quot;M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10406.6,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(11406.8,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12166.8,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12778,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(13778.2,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,2250)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(7269.1,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,750)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(5859.8,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D463&quot; d=&quot;M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(762.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1818.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;37&quot; d=&quot;M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-750)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(7269.1,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-2250)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(3847.2,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(278,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1028,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1472.7,0)&quot;&gt;&lt;path data-c=&quot;1D435&quot; d=&quot;M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2231.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2787.4,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3843.2,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4121.2,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4621.2,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5065.9,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6565.9,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-3750)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(3557.7,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(278,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1038,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1482.7,0)&quot;&gt;&lt;path data-c=&quot;1D437&quot; d=&quot;M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2310.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2866.4,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3922.2,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4200.2,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5200.2,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5644.9,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7144.9,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable rowspacing=&quot;.5em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;true&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;212&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;And all that’s left is to break out our variables and solve:&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; font-size: 200%; position: relative;&quot; display=&quot;true&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -8.552ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;41.52ex&quot; height=&quot;18.235ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -4280 18351.8 8060&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtable&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,3530)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2294.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2683.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;37&quot; d=&quot;M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3905.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4906,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5406,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(5795,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6295,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(6684,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8406.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(9406.4,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9906.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10295.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10906.7,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(11628.9,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(12017.9,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13740.1,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(14740.3,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(15740.3,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(16351.6,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(17351.8,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,2030)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(9175.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-72)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(4919.7,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mfrac&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(470,676)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;37&quot; d=&quot;M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(220,-686)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;rect width=&quot;1700&quot; height=&quot;60&quot; x=&quot;120&quot; y=&quot;220&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4067.8,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4790,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;38&quot; d=&quot;M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6512.2,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(7512.4,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-2030)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(9175.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-3530)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(7334.1,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;36&quot; d=&quot;M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;2E&quot; d=&quot;M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;36&quot; d=&quot;M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable rowspacing=&quot;.5em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;true&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;212&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mn&gt;180&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;62.6&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;Swell! So 17ºC in Fahrenheit is a lovely 62.6ºF Autumn day.&lt;/p&gt;
&lt;p&gt;For style points and to prove our salt, we can convert right back simply by swapping the positions of the ranges and solving.&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; font-size: 200%; position: relative;&quot; display=&quot;true&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -17.534ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;43.28ex&quot; height=&quot;36.199ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -8250 19129.8 16000&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtable&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,7500)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(1343,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2294.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2683.6,0)&quot;&gt;&lt;path data-c=&quot;1D463&quot; d=&quot;M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3390.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4391,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5141,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(5530,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6030,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6419,0)&quot;&gt;&lt;path data-c=&quot;1D435&quot; d=&quot;M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7400.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(8400.4,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9150.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9539.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10150.7,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10872.9,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(11261.9,0)&quot;&gt;&lt;path data-c=&quot;1D437&quot; d=&quot;M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12312.1,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(13312.3,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(14072.3,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(14683.6,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(15683.8,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,6000)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(9564.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,4500)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(7766.6,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D463&quot; d=&quot;M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(762.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1818.6,0)&quot;&gt;&lt;path data-c=&quot;36&quot; d=&quot;M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;2E&quot; d=&quot;M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;36&quot; d=&quot;M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,3000)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(5892.9,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(278,0)&quot;&gt;&lt;path data-c=&quot;1D434&quot; d=&quot;M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1028,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1472.7,0)&quot;&gt;&lt;path data-c=&quot;1D435&quot; d=&quot;M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2231.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2787.4,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3843.2,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4121.2,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5121.2,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5565.9,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7065.9,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,1500)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(6103.4,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(278,0)&quot;&gt;&lt;path data-c=&quot;1D436&quot; d=&quot;M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1038,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1482.7,0)&quot;&gt;&lt;path data-c=&quot;1D437&quot; d=&quot;M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2310.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2866.4,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3922.2,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4200.2,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4700.2,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5144.9,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6644.9,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(9564.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-1500)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2294.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2683.6,0)&quot;&gt;&lt;path data-c=&quot;36&quot; d=&quot;M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;2E&quot; d=&quot;M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;36&quot; d=&quot;M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4683.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5684,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6684,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(7073,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7573,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(7962,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9684.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(10684.4,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(11684.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12073.4,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12684.7,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13406.9,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(13795.9,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(15518.1,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(16518.3,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(17018.3,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(17629.6,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(18629.8,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-3000)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(9564.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-4500)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(5500.9,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;33&quot; d=&quot;M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;2E&quot; d=&quot;M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;36&quot; d=&quot;M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; data-mjx-texclass=&quot;ORD&quot; transform=&quot;translate(3683.6,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot;&gt;&lt;path data-c=&quot;2F&quot; d=&quot;M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4183.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;38&quot; d=&quot;M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5905.8,0)&quot;&gt;&lt;path data-c=&quot;2217&quot; d=&quot;M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(6628,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-6000)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(9564.9,0)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-7500)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(8112.1,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(849.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1905.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;37&quot; d=&quot;M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable rowspacing=&quot;.5em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;true&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;62.6&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;212&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;62.6&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;212&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;30.6&lt;/mn&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mn&gt;180&lt;/mn&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;Stupendous. Utterly stunning. We’ll make an insufferable mathematician out of you yet, old friend.&lt;/p&gt;
&lt;h2 id=&quot;the-code-part&quot; tabindex=&quot;-1&quot;&gt;The Code Part&lt;/h2&gt;
&lt;p&gt;With a mathematical function that does what we want, executing this operation in code is pretty straightforward, and we can even use more meaningful variables. We’ll take our input value, initial range minimum and maximum, and output range minimum and maximum as props, and build a useful JavaScript one-liner from there.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;mapRange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;v&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;D&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;D&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// or better yet&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;mapRange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; inputMin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; inputMax&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputMin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputMax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; inputMin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inputMax &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; inputMin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outputMax &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; outputMin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
    outputMin
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope this crash course on range mapping was useful to you. As a disclaimer, I’m not A Big Math Guy™, I just end up using a lot of these concepts when I’m making websites. If I got something wrong (&lt;em&gt;I’m specifically unsure about expressing this stuff correctly in the mathematical diagrams&lt;/em&gt;), or could explain some aspect more clearly, feel free to &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;reach out via email&lt;/a&gt;; I’m glad for the opportunity to improve these blog posts.&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Generative artist &lt;a href=&quot;https://www.mattdesl.com/&quot;&gt;Matt DesLauriers&lt;/a&gt; created a toolkit for common mathematical operations for creative coding, which includes a more well-featured &lt;code&gt;mapRange&lt;/code&gt; implementation, as well as a ton of other useful functions. I learned about this concept from him! You can &lt;a href=&quot;https://github.com/mattdesl/canvas-sketch-util/blob/master/math.js&quot;&gt;see the code for those utility functions here&lt;/a&gt; or &lt;a href=&quot;https://github.com/mattdesl/canvas-sketch-util/blob/master/docs/math.md&quot;&gt;read the docs for them here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Wed, 18 Oct 2023 21:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-to-map-a-number-between-two-ranges/</guid>
</item>
<item>
    <title>A one-liner for freeing ports on OS X</title>
    <link>https://henry.codes/writing/a-one-liner-for-freeing-ports-on-os-x/</link>
    <description>&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;One of my most-frequently searched dev tasks over the course of my career thus far has been the “how do I find what process is on a port” to “how do I kill a given process” wombo-combo — there’s always some memory-leaky service running that &lt;kbd&gt;ctrl&lt;/kbd&gt;+&lt;kbd&gt;c&lt;/kbd&gt; isn’t tough enough for. Figured it’d be good to write a quick shell function for doing just this. Before I get into the explainer, here’s the code:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;killport&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;🚨 Killing all processes at port&#39;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;lsof&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ti&lt;/span&gt; tcp:&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;kill&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This bad boy can also be found as a &lt;a href=&quot;https://gist.github.com/xdesro/e7bbec9b2a1c31f0c04a1e2d22597dd8&quot;&gt;script in Gist form on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;Sorry, this guide doesn’t currently solve for Windows &lt;s&gt;or Linux systems&lt;/s&gt; &lt;em&gt;(apparently &lt;a href=&quot;https://bsky.app/profile/vielle.dev/post/3mbrlvkvgmk2a&quot;&gt;it works on Linux&lt;/a&gt;)&lt;/em&gt;, as far as I know. If y’all have an analogous solution, I’d happily include it in this post :)&lt;/p&gt;
&lt;h2 id=&quot;finding-the-offending-process&quot; tabindex=&quot;-1&quot;&gt;Finding the offending process&lt;/h2&gt;
&lt;p&gt;After defining our function and adding some cute helper text, we can use &lt;code&gt;lsof&lt;/code&gt; (list open files) to find processes that match our criteria. The manual for the &lt;code&gt;lsof&lt;/code&gt; says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An open file may be…a stream or a network file (Internet socket, NFS file or UNIX domain socket.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds like exactly what we’re on the hunt for. We’ll pass a couple of options to make this work as a function:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt;: The lower-case version of the &lt;code&gt;-T&lt;/code&gt; flag sets some preferences for the output we get from running &lt;code&gt;lsof&lt;/code&gt;. Specifically, &lt;code&gt;-t&lt;/code&gt; returns only the PID, which is useful for piping this output to the &lt;code&gt;kill&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-i&lt;/code&gt;: This flag tells &lt;code&gt;lsof&lt;/code&gt; to specifically look for matching internet addresses. We can pass the port we’re looking for in the format &lt;code&gt;[protocol]:[port]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The protocol will be TCP, and then we can use a bash &lt;em&gt;positional parameter&lt;/em&gt; to accept the port number as an argument to our &lt;code&gt;killport&lt;/code&gt; function:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;lsof&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ti&lt;/span&gt; tcp:&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;killing-in-the-port-of&quot; tabindex=&quot;-1&quot;&gt;Killing in the port of&lt;/h2&gt;
&lt;p&gt;Now that we have the &lt;code&gt;PID&lt;/code&gt; of the process that is running on the port we want closed, we can send that over to the &lt;code&gt;kill&lt;/code&gt; command. We’ll use a bash pipe and the &lt;code&gt;xargs&lt;/code&gt; command to pass that information on.&lt;/p&gt;
&lt;p&gt;All the pipe is doing here is passing the output of &lt;code&gt;lsof&lt;/code&gt; to &lt;code&gt;xargs&lt;/code&gt;, and all &lt;code&gt;xargs&lt;/code&gt; is doing is taking some input and providing it as an argument to the &lt;code&gt;kill&lt;/code&gt; command. All-told, that comes out to:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;lsof&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ti&lt;/span&gt; tcp:&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;kill&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s digital plumbing babey; we’re doing steampunk in cyberspace — and they said it couldn’t be done.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Gosh, thanks for reading, and gosh I hope it was useful! I am very certain there are one thousand and one enhancements that could be made for this puppy, so if you’d like to hit me with the Um Actually To End All Um Actuallies, &lt;a href=&quot;mailto:yo@henry.codes?subject=You%20Fool.%20You%20Absolute%20Goombus.%20What%20Were%20You%20Thinking.&quot;&gt;shoot me an email&lt;/a&gt;. Like I mentioned earlier, I’d also love to make this article serve Windows and Linux users, so def get in touch about that too :D&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man8/lsof.8.html&quot;&gt;Manual page for &lt;code&gt;lsof&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man1/xargs.1.html&quot;&gt;Manual page for &lt;code&gt;xargs&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man2/kill.2.html&quot;&gt;Manual page for &lt;code&gt;kill&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And &lt;a href=&quot;https://gist.github.com/xdesro/e7bbec9b2a1c31f0c04a1e2d22597dd8&quot;&gt;here’s that Gist again&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Tue, 28 Feb 2023 19:07:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/a-one-liner-for-freeing-ports-on-os-x/</guid>
</item>
<item>
    <title>Using focal points, aspect ratio &amp; object-fit to crop images correctly</title>
    <link>https://henry.codes/writing/pure-css-focal-points/</link>
    <description>&lt;p&gt;Before I even get into the impetus for this blog post, if you came from a search engine and you just want the code, &lt;a href=&quot;https://codepen.io/xdesro/pen/bGxVorV&quot;&gt;here’s a demo&lt;/a&gt;. Pleasure doing business with you.&lt;/p&gt;
&lt;h3 id=&quot;introduction&quot; tabindex=&quot;-1&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;In a client’s project recently, I found that their Wordpress setup required content editors to upload four separate versions of a blog post’s featured image at varying dimensions to ensure a correct appearance in the many contexts that the post will be displayed in (i.e. homepage feature, blog list item, blog post page, social media sharing). Most of these images were getting created with the crop tool in GIMP or Photoshop, and not every content editor felt empowered to create all these images, so publishing timelines were getting pushed back waiting for the images to be generated. This is the sort of thing we can solve with modern CSS, so let’s do it! Don’t touch that dial!&lt;/p&gt;
&lt;h2 id=&quot;choosing-a-focal-point&quot; tabindex=&quot;-1&quot;&gt;Choosing a focal point&lt;/h2&gt;
&lt;p&gt;There are many solutions for implementing a focal point selector on images in Wordpress (other content management systems are available), but for the purposes of this tutorial, we’ll create an imitation focal point picker that uses client-side JavaScript to imitate what a back-end tool might do.&lt;/p&gt;
&lt;p&gt;Because this part isn’t useful beyond this tutorial, I’ll breeze through so we can get to the actual CSS Tricks (other web development blogs are available).&lt;/p&gt;
&lt;p&gt;&lt;abbr title=&quot;Too long, didn’t read&quot;&gt;TL;DR&lt;/abbr&gt;, we’ll display our image in HTML, listen for click events on that image, and use the position of each click to set a &lt;code&gt;--focus-x&lt;/code&gt; and &lt;code&gt;--focus-y&lt;/code&gt; CSS variable on the &lt;code&gt;:root&lt;/code&gt; of the page. In a product implementation of this, it’d be better to be more specific and set those CSS variables somewhere that “focus-x” makes more sense, but since we’re using the same image many times on this page, &lt;code&gt;document.documentElement&lt;/code&gt; is okay.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;source-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://images.unsplash.com/photo-1676486694880-230d58890871?ixlib=rb-4.0.3&amp;amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; sourceImage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.source-image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
sourceImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rect &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; xCoord &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clientX &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; yCoord &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clientY &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;top&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; xAsPercentage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xCoord &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; _ &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; yAsPercentage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;yCoord &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; _ &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;--focus-x&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;xAsPercentage&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;--focus-y&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;yAsPercentage&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, clicking the source image should give us some output like:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--focus-x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;64.2862%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;--focus-y&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;35.5263%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;using-aspect-ratio-to-size-images&quot; tabindex=&quot;-1&quot;&gt;Using Aspect-Ratio To Size Images&lt;/h2&gt;
&lt;p&gt;Now let’s create a few example images that can represent those use cases we described at the start. We’ll imagine we have three potential use cases for this image:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A wide landscape homepage hero, 16:9 dimensions in the design file we’ve been given&lt;/li&gt;
&lt;li&gt;A square thumbnail for a blog list item&lt;/li&gt;
&lt;li&gt;A 3:4 portrait view for each individual blog post page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ll write some HTML for these examples:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;homepage-hero&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;the same URL as the one before lol&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;blog-list-item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;blog-post&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, some accompanying CSS. We’ll first use a property called &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio&quot;&gt;&lt;code&gt;aspect-ratio&lt;/code&gt;&lt;/a&gt;, which takes an aspect-ratio expressed fraction or decimal.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;article &gt; img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--aspect-ratio&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.homepage-hero&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16 / 9&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.blog-list-item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1 / 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.blog-post&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3 / 4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-400w.webp 400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-800w.webp 800w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-1400w.webp 1400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-1686w.webp 1686w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-400w.jpeg&quot; alt=&quot;Three identical images side by side, rendered with varying aspect ratios. Each image is distorted in some way.&quot; width=&quot;1686&quot; height=&quot;1050&quot; srcset=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-400w.jpeg 400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-800w.jpeg 800w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-1400w.jpeg 1400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.31.19_2x_qy3ofl-1686w.jpeg 1686w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;This is doing &lt;em&gt;something&lt;/em&gt;, but our images are a little squished. That’s where &lt;code&gt;object-fit&lt;/code&gt; comes in. We can use &lt;code&gt;object-fit&lt;/code&gt; similarly to &lt;code&gt;background-position&lt;/code&gt;, setting it to &lt;code&gt;contain&lt;/code&gt; or &lt;code&gt;cover&lt;/code&gt; to keep it from stretching. The default value is &lt;code&gt;fill&lt;/code&gt;, which will always stretch an image in any direction it needs to in order to fit the rendered aspect ratio of the image. We’ll use &lt;code&gt;object-fit: cover;&lt;/code&gt; because we always want images to completely &lt;em&gt;cover&lt;/em&gt; their rendered aspect ratio, we just don’t want the deformation.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;article &gt; img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--aspect-ratio&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;object-fit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cover&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-400w.webp 400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-800w.webp 800w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-1400w.webp 1400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-1686w.webp 1686w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-400w.jpeg&quot; alt=&quot;Three identical images, as before with varying aspect ratios, but now each is sized correctly within its bounds. The flowers in each image are displayed at a different spot in the image though.&quot; width=&quot;1686&quot; height=&quot;1022&quot; srcset=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-400w.jpeg 400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-800w.jpeg 800w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-1400w.jpeg 1400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.36.26_2x_umalbs-1686w.jpeg 1686w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The images are looking a lot better now, but hark: in some of the images, the subject of the image is cropped out strangely. Let’s sort that.&lt;/p&gt;
&lt;h2 id=&quot;using-the-focal-point-in-image-positioning&quot; tabindex=&quot;-1&quot;&gt;Using the focal point in image positioning&lt;/h2&gt;
&lt;p&gt;Now we can use &lt;code&gt;object-position&lt;/code&gt; (similar to &lt;code&gt;background-position&lt;/code&gt;) to move the image until the thing we’ve decided is most important is in frame.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;article &gt; img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--aspect-ratio&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;object-fit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cover&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;object-position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--focus-x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--focus-y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-400w.webp 400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-800w.webp 800w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-1400w.webp 1400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-2556w.webp 2556w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-400w.jpeg&quot; alt=&quot;The three images now rendered perfectly, showing the subject matter flower bouquet centered in every arbitrary aspect ratio the image is displayed at.&quot; width=&quot;2556&quot; height=&quot;1144&quot; srcset=&quot;https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-400w.jpeg 400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-800w.jpeg 800w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-1400w.jpeg 1400w, https://henry.codes/writing/pure-css-focal-points/CleanShot_2023-02-18_at_22.45.48_2x_sm6pw8-2556w.jpeg 2556w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;That’s more like it. There’s a problem that used to take a couple minutes per post in an image editor, more-or-less solved with fifteen lines of CSS. Golly gosh is it a good day to be working on the web.&lt;/p&gt;
&lt;h3 id=&quot;possible-improvements&quot; tabindex=&quot;-1&quot;&gt;Possible improvements&lt;/h3&gt;
&lt;p&gt;You’ll find in some cases that setting a focal point in the corner or edge of an image doesn’t work perfectly — the selected point will always be in the image but it won’t always be centered in the image. I briefly tried to work out how this could be solved with exactly our markup and existing CSS, but I think there’s more to it. By my estimate, roughly what would need to happen is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wrap the image in a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with the same &lt;code&gt;aspect-ratio&lt;/code&gt; value as the image, and make sure its overflow is hidden.&lt;/li&gt;
&lt;li&gt;Figure out how far the focal point is from the center of the rendered image container.&lt;/li&gt;
&lt;li&gt;Translate the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; by that distance so that the focal point is in the center.&lt;/li&gt;
&lt;li&gt;Additionally, scale the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; by whatever factor is necessary fo ensure it still covers its parent. (I think the math would be something like: if you translate the image left 10%, you’ll need to scale the image to 120% in order to account for that movement.)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Anyway thanks for reading. As always, feel free to &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;shoot me an email&lt;/a&gt; if you have further questions, need to make a correction, or think my cool hat is stupid. I’m also &lt;a href=&quot;https://front-end.social/@henry&quot;&gt;on Mastodon&lt;/a&gt;. CSS is sick, skate fast, have a blast.&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio&quot;&gt;&lt;code&gt;aspect-ratio&lt;/code&gt; on MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit&quot;&gt;&lt;code&gt;object-fit&lt;/code&gt; on MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/object-position&quot;&gt;&lt;code&gt;object-position&lt;/code&gt; on MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And &lt;a href=&quot;https://codepen.io/xdesro/pen/bGxVorV&quot;&gt;here’s that CodePen demo&lt;/a&gt; one more time.&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Sun, 19 Feb 2023 03:27:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/pure-css-focal-points/</guid>
</item>
<item>
    <title>On leaving New York City</title>
    <link>https://henry.codes/writing/leaving-new-york/</link>
    <description>&lt;h2 id=&quot;this-is-that-dreaded-blog-post-that-was-foretold&quot; tabindex=&quot;-1&quot;&gt;This Is That Dreaded Blog Post That Was Foretold&lt;/h2&gt;
&lt;p&gt;Every blog poster fears that one day this post will be upon them — that painfully self-important and -unaware “Why I’m Leaving &lt;code&gt;${city}&lt;/code&gt;” post. I’m gonna &lt;em&gt;try&lt;/em&gt; to do this right; to make this one on the less-obstinate side to some of the other ones I’ve seen, but unfortunately I may make no promises, and you’re on &lt;em&gt;my&lt;/em&gt; blog.&lt;/p&gt;
&lt;p&gt;I’ve tried to write this post for a few weeks, and each time it just gets longer and more ambling and less clear, so I’ll keep this short for now and update periodically. The general rundown is: why did I move to New York, what did I find here, why am I moving back to Denver, and how will it all matter in the context of my life?&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;Real talk, this one is mad self-indulgent, and has almost nothing to do with websites. You’ve been warned.&lt;/p&gt;
&lt;h2 id=&quot;that-s-new-york-babey&quot; tabindex=&quot;-1&quot;&gt;That’s New York babey&lt;/h2&gt;
&lt;p&gt;I moved to New York City towards the start of the pandemic, after the Tiger King Era but before the Vaccine Era. Every movie I loved had a Central Park in Autumn scene, every post-punk revival band that got me through high school had some song about New York; there’s so much cinematic and cultural lore to the city, and I had known for a long time that I wanted to be part of it. New York is a town full of brave and confident main characters — when the isolation of the pandemic set in and I started to lose my senses of meaning and self, it felt like it’d be a good place to find them again.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;We’re getting to the overly philosophical part. Bear with me, keep your lantern on the path.&lt;/p&gt;
&lt;p&gt;But people are more than the place they live, and it turns out you cannot just update your home address as a proxy for a personality. I did not immediately find who I was meant to be the moment I drove into Manhattan, and that was challenging.&lt;/p&gt;
&lt;p&gt;I started experimenting with aspects of my life, an exercise I understand now was meant to test what parts of my Self are durable and valuable. Accidentally at first, then maybe &lt;em&gt;too&lt;/em&gt; intentionally, I began to ask myself a torrent of questions — what pieces of my personality am I proud of? What pieces may I leave behind? For example, is my sober lifestyle still important to me, or am I still glad to be a vegan? Do I like dancing? Am I a kind person? Will I look back at the way I’ve spent my time with pride, or with disappointment? Does a man decide he is a certain way, or is that decision made anew in his every act and action?&lt;/p&gt;
&lt;p&gt;A thousand years and two apartments and millions of everything bagels and one copy of Viktor Frankl’s “Man’s Search For Meaning” later, I still felt as listless and as confused as when I left Denver, and realizing that was clarifying. I’ve come to understand in the last six months two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If I am to be made, I must do it myself — &lt;code&gt;${city}&lt;/code&gt; cannot do it for me, and&lt;/li&gt;
&lt;li&gt;If I am to continue to make myself, I’d like to do it out West — it’s time to follow the sunsets back home.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;go-west-young-man&quot; tabindex=&quot;-1&quot;&gt;Go West, Young Man&lt;/h2&gt;
&lt;p&gt;Philosophically, I’m moving back to Denver because New York answered for me empirically that I will not find an end to the deep, gnawing sort of yearning for Something I’ve always wrestled with in a new map location. And more terrestrially, I’m moving because I miss the good weather and the mountains, I miss the tight homies, and I miss my folks.&lt;/p&gt;
&lt;p&gt;I’ve always been enamored with the staggering drama of the Rockies and Wild Western skies and I do think it was goofy to deny myself access to those things. There’s a great Cy Warman poem&lt;sup&gt;&lt;a href=&quot;https://henry.codes/writing/leaving-new-york/#footnote-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; where he identifies the unique feeling of being in the Rocky Mountains:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And when I walk where the flowers talk&lt;br&gt;
I just feel good all over.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I miss my friends, the DIY punk kids and queers and cyclists and car nerds and Arcteryx hiking fiends. New York has all types of people; in fact I’m sure there are these sorts of people here too, but they’re not &lt;em&gt;my&lt;/em&gt; people like these old Coloradan friends. You can’t replace your community.&lt;/p&gt;
&lt;p&gt;Finally, I’m honestly a huge mama’s boy, and it’s taxing to be so far away all the time. I love my parents. I’m proud of the life they’ve built for themselves, and I want them to witness enough of my life to be proud of me too. The monthly phone calls home ain’t cutting it.&lt;/p&gt;
&lt;h2 id=&quot;the-bittersweet-part&quot; tabindex=&quot;-1&quot;&gt;The Bittersweet Part&lt;/h2&gt;
&lt;p&gt;There’s something poignant about saying goodbye to a city like New York. It’s taken me months to shake loose the fear that I’m somehow giving up on a version of myself I fantasized about being for years. I’m still learning to part with all those imagined futures of SoHo loftdom and weekly West Village diner mornings and painfully-well-dressed see-and-be-seen Central Park walks.&lt;/p&gt;
&lt;p&gt;It’s the hidden cost of romanticizing and daydreaming about a million possible lives: you can live all of those lives a little bit if you want, but never at the same time. I think the growth I need to do here is getting comfortable with viewing my lifetime as a collage of lifetimes. It’s the end of this NYC chapter &lt;em&gt;for now&lt;/em&gt;, but not necessarily forever, and the tapestry becomes more thoroughly woven with each life I weave into it.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;I think I can say this in a more resonant way if I think more carefully about it. Line?&lt;/p&gt;
&lt;h2 id=&quot;the-actually-constructive-part&quot; tabindex=&quot;-1&quot;&gt;The Actually Constructive Part&lt;/h2&gt;
&lt;p&gt;At the end of the day, it’s not that useful to spend my entire life yearning, and it makes me feel threadbare. I don’t regret moving to New York even the tiniest bit — I’m grateful for all the soul-searching and adventures and friendships I can’t wait to make last a lifetime.&lt;/p&gt;
&lt;p&gt;There are things about New York I adore and will miss dearly, and I’m sure there are things about living in Chicago or London or Mexico City that I’d adore too, but I don’t want to spend the rest of my twenties driving Uhauls and checking the greenness of the grass. It is in my control to actualize the life I want. So here’s the plan:&lt;/p&gt;
&lt;h3 id=&quot;wrapping-up-this-chapter-right&quot; tabindex=&quot;-1&quot;&gt;Wrapping Up This Chapter Right&lt;/h3&gt;
&lt;p&gt;I dread the thought of returning to Denver and realizing all the things I ought to have done while I was still in NYC, so I’m minmaxing NYC in the weeks I have left. I’ve made a &lt;a href=&quot;https://nyc.henry.codes&quot;&gt;New York City Bucket List&lt;/a&gt; that I’ll keep updated even after I’ve moved away. This city is an infinite playground of new experiences to have — in a dozen lifetimes I will not know all the wonder NYC has to share, but I’m gonna do my best. I want to meet everyone here I haven’t yet (&lt;a href=&quot;mailto:yo@henry.codes?subject=Let%E2%80%99s%20Hang%20Out%20Bestie&quot;&gt;get at me lol&lt;/a&gt;), and otherwise spend as much time as possible on an adventure.&lt;/p&gt;
&lt;h3 id=&quot;urbanism-and-civil-engagement&quot; tabindex=&quot;-1&quot;&gt;Urbanism and Civil Engagement&lt;/h3&gt;
&lt;p&gt;The thing a lot of these Why I’m Leaving City posts get wrong is that the way to live in a city is to invest personally in its development. It is each of our responsibilities to engage with your community and help make it safe and wonderful and accessible for everyone. The things about the &lt;em&gt;city&lt;/em&gt; of New York that still excite me most are the trains and the diversity of experience:&lt;/p&gt;
&lt;p&gt;You can take a $2 train 30 minutes from my Upper East Side (&lt;em&gt;xoxo&lt;/em&gt;) apartment and make it most of the way to any neighborhood in the city, and that’s almost more liberating than owning a car and having access to the entire American interstate system. Denver is a great city and they’ve made leaps with their transit system over the last 10 years, but there’s plenty more progress to be made. I’m resolving to spend my first year back getting involved in the Coloradan public transit infrastructure community, and working to get more accessible, comprehensive, and publicly-funded transit built.&lt;/p&gt;
&lt;p&gt;Secondly, you can meet so many thousands of types of people in New York — every time I leave my house I discover a new sort of wonderful and spectral person, and I want to find that sort of diversity and community in Denver too. This is a much more complex pool to wade into as an individual than the aforementioned “lol just build more trains forehead”, but I think I can focus my efforts firstly in the scope of my new neighborhood; as Pratt Institute professor Courtney Knapp writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a unit of planning, the neighborhood is the most important in terms of promoting social diversity and increasing social capital. It is conceptually broad enough to get individuals to think beyond themselves and their streets, but of a small enough scale to still support the notion of “neighborliness” and encourage collaboration between community planners and stakeholders.&lt;sup&gt;&lt;a href=&quot;https://henry.codes/writing/leaving-new-york/#footnote-2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Specifically, I think my background in web design and development can be useful for event programming and outreach — there are always better email newsletters to program and event websites to be built.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Anyway, thanks for reading, I think that’s all I’ve got in this particular gasping breath of a blog post. If you’d like to chat about this one, or make a friend in New York or in Denver, feel free to &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;shoot me an email&lt;/a&gt;. If you’ve got recommendations for Things I Absolutely Must Do Before Leaving NYC, I’d love to hear about those too, either via email or via the form on &lt;a href=&quot;https://nyc.henry.codes&quot;&gt;nyc.henry.codes&lt;/a&gt;. I’ll keep a running changelog as I inevitably decide to do more rolling down this hill and subsequently update the post.&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;sup id=&quot;footnote-1&quot;&gt;1&lt;/sup&gt; &lt;a href=&quot;https://www.google.com/books/edition/_/btEgAAAAMAAJ?hl=en&amp;amp;gbpv=1&amp;amp;pg=PA7&quot;&gt;“Mountain Melodies”, Cy Warman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;sup id=&quot;footnote-2&quot;&gt;2&lt;/sup&gt; &lt;a href=&quot;https://www.pps.org/article/diversityinpublicspaces&quot;&gt;8 Lessons to Promote Diversity in Public Places&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I also keep a separate blog about philosophy and personal discovery and the intersections between digital esoterica, western fantasy, and romanticism. If you found this^ catastrophic tumble down the stairs resonant, you might like &lt;a href=&quot;https://stillness.digital/&quot;&gt;stillness.digital&lt;/a&gt; too.&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Sun, 12 Feb 2023 17:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/leaving-new-york/</guid>
</item>
<item>
    <title>Can you be a designer if you have no training?</title>
    <link>https://henry.codes/writing/can-you-be-a-designer-if-you-have-no-training/</link>
    <description>&lt;p&gt;I recently saw an online acquaintance of mine share a Controversial Opinion™ that I found challenging:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you do not have formal training in design you are not a designer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Right off the bat — L take, and I’m trying not to say that just because I am a designer with no training (lol). I think there’s more ways to be critical here than just being like “haha ok then how me doing design rn”, though. I’d like to interact with this fairly and in good faith, so for the purposes of this blog post, I’ll assume best intentions by the author of the opinion.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;I didn’t link the post here because I don’t have any interest in either A. oxygenating platforms I don’t believe in, nor B. dunking on folks who I think just missed the mark.&lt;/p&gt;
&lt;h2 id=&quot;design-isn-t-a-thing&quot; tabindex=&quot;-1&quot;&gt;Design isn’t a thing&lt;/h2&gt;
&lt;p&gt;Modern design—especially on the web—is just problem-solving. It’s the act of thinking carefully about the way systems and products will work, discovering potential or empirical failures in those systems, and proposing functional solutions. A lot of folks (me) get hung up on the fonts part of Being A Designer, but in earnest, the visual aspects of design e.g. color and type and rhythm and layout just serve to &lt;em&gt;solve a problem&lt;/em&gt;, which is that communicating information clearly and memorably is hard.&lt;/p&gt;
&lt;p&gt;If this is our framework for understanding design, then design happens in a thousand little ways every day by &lt;em&gt;non-designers&lt;/em&gt;. When folks choose the order of items on their restaurant menu, or make the newsletter for their community theater, or rearrange their living room to flow more naturally, they’re thinking about a system and enacting improvements to it. These are just people, though — they’re not necessarily academics nor are they necessarily not, but despite the lack of training in or even awareness of design thinking and discipline, they’re doing design.&lt;/p&gt;
&lt;h2 id=&quot;designers-aren-t-a-thing&quot; tabindex=&quot;-1&quot;&gt;Designers aren’t a thing&lt;/h2&gt;
&lt;p&gt;The threshold for design is care and consideration for problem solving, not formal steeping in impermanent design tools, not a slick &lt;abbr title=&quot;Bachelor of Fine Arts&quot;&gt;BFA&lt;/abbr&gt; from &lt;abbr title=&quot;Rhode Island School of Design&quot;&gt;RISD&lt;/abbr&gt;. “Being A Designer” is a mechanism we use to allow people who enjoy the exercise of that considerate problem-solving to do it for a living, but that’s the extent of its utility as a title.&lt;/p&gt;
&lt;p&gt;The societal value of someone who spends a lot of time doing design is that they’re practiced in applying frameworks of analysis to problem areas. For example: one turns to a financial advisor because the advisor is practiced in translating financial goals and concerns into investment and wealth management strategies; one turns to a web designer because the web designer is practiced in translating business goals and concerns into web-based solutions.&lt;/p&gt;
&lt;p&gt;A really good designer is good because of their aptitude and willingness firstly to discover and constrain the shapes of problems, and then creatively apply different approaches until an amicable solution is found. A really good designer is not good because they know the most about Figma or the best type foundries, but because they’re dedicated to being curious and good at listening.&lt;/p&gt;
&lt;h2 id=&quot;controversial-opinions-aren-t-a-thing&quot; tabindex=&quot;-1&quot;&gt;Controversial opinions aren’t a thing&lt;/h2&gt;
&lt;p class=&quot;editors-note&quot;&gt;This is the least fair and least relevant and least-principled part of this analysis, so feel free to skip to the end bit.&lt;/p&gt;
&lt;p&gt;Earnestly, I’m a bit allergic to Controversial Opinions online. In real life, when you form an opinion, you tack it together from inputs you value — a recent article from an expert or a conversation with a close friend — and then you try it out in limited social circles. You ask your friends or colleagues what they think about the new opinion you’ve made, and you reshape it based on the feedback you get.&lt;/p&gt;
&lt;p&gt;Being Online shortens and malforms that process, however. For example, when a friend responds poorly to an idea you have that they disagree with, they are likely do so in a kind way. Or when a subject matter expert responds poorly to the idea, they might do so critically and with discipline, and those two safety measures allow you to safely haul your opinion back to the shed for some reworking, or maybe out to the junkyard if you find it to have no durable substance.&lt;/p&gt;
&lt;p&gt;But posting online removes those safeguards, and the shape of discourse on Twitter means you don’t get to carefully or with nuance respond to criticisms. In the land of quote retweet dunks, “controversial” opinions can just be wrong ones. Be careful.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Anyone can be a designer, and anyone can engage with design thinking (academic purists &lt;em&gt;HATE&lt;/em&gt; him). Tooling is irrelevant, and training has value only to the extent that it makes you a more flexible and curious problem solver, or more fluent at knowing when to reuse tried solutions. “Designer” the resume title is a mechanism for collecting a paycheck, but you don’t need the title to delight in &lt;em&gt;designing&lt;/em&gt; caring and considered solutions for your day-to-day work.&lt;/p&gt;
&lt;p&gt;Anyway, thanks for reading. If you hate this counter-take, feel free to dunk on me online (as long as it’s funny), or (preferred) if you have ideas of how I can improve it &lt;a href=&quot;mailto:yo@henry.codes?subject=YOU%E2%80%99RE+WRONG+ONLINE+AGAIN&quot;&gt;shoot me an email&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Thu, 09 Feb 2023 18:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/can-you-be-a-designer-if-you-have-no-training/</guid>
</item>
<item>
    <title>How To Make a Website</title>
    <link>https://henry.codes/writing/how-to-make-a-website/</link>
    <description>&lt;p&gt;I got an email recently from a kind online friend who said they thought my work was swell, and that they’d like to ask about my process or what makes a good website. Aside from that being a really nice email to receive, it’s also good impetus for me to be a little more candid and critical about my practice. Here’s my breakdown on how to make a Good Website.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;It’s fine if you disagree with me on these things — let me know by email what great sins I have committed against thee and I shall dearly repent :)&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Write meaningful HTML that communicates the structure of your document before any style or additional interactivity has loaded. Write CSS carefully, reason your methodology and stick to it, and feel empowered to skip frameworks. When it comes time to write JavaScript, write not too much, make sure you know what it all does, and above all, make sure the website works without it.&lt;/p&gt;
&lt;h2 id=&quot;a-brave-new-index-html-file&quot; tabindex=&quot;-1&quot;&gt;A Brave New index.html File&lt;/h2&gt;
&lt;p&gt;HTML is meant to communicate document structure and information, and it does a really good job of doing that if you let it. Before starting the styling steps of any project, I write all of my pages out from a content document or design file completely in HTML. I find this reveals a lot about interactions that need to be considered and information architecture that isn’t quite ready for prime time. Even if I’m using some SPA framework, I’ll still start by communicating the entire document with HTML alone, because I’ve found it’s that much clearer when it’s time to break the markup into whatever the component style &lt;em&gt;du jour&lt;/em&gt; happens to be.&lt;/p&gt;
&lt;p&gt;Get creative with tagging. There’s a world beyond &lt;code&gt;&amp;lt;div‍&amp;gt;&lt;/code&gt;s and &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;s (&lt;em&gt;though sometimes these are exactly what you need&lt;/em&gt;) — don’t forget about the &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;s and &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;s and &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;s for laying out content, and the &lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt;s or &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt;s or &lt;code&gt;&amp;lt;dl&amp;gt;&lt;/code&gt;s for communicating more complex data. Spend some time reading about elements in MDN, or even the HTML spec. Let yourself discover the breadth of the language. Every week you’ll discover something new you could’ve been using this whole time.&lt;/p&gt;
&lt;p&gt;Don’t worry about class attributes just yet, but do worry about semantic attributes like those needed to make a &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; work properly. We’ll hydrate our markup with CSS as needed; now’s a good time to be certain our website is bulletproof from a semantics perspective.&lt;/p&gt;
&lt;p&gt;If, in this process, you discover your document is confusing or ordered incorrectly, this is the perfect time to address that. CSS has a lot of superpowers when it comes to layout these days, so consider whether it’s possible to write the HTML in the correct flow and solve for unique challenges with style code down the line. If it’s &lt;em&gt;not&lt;/em&gt; possible, that might be a good sign to talk with your designers about their intention. Often you’ll find that something that doesn’t make sense from an HTML perspective was an afterthought, or might be better served somewhere else!&lt;/p&gt;
&lt;h3 id=&quot;a-note-on-accessibility&quot; tabindex=&quot;-1&quot;&gt;A Note On Accessibility&lt;/h3&gt;
&lt;p&gt;You’ll find that spending more time getting HTML right reveals or even anticipates and evades accessibility issues. It’s just easier to write accessible code if it’s got semantic foundations.&lt;/p&gt;
&lt;p&gt;You’ll further find that once you’ve gotten used to spec-diving, the WCAG can be a really fun way to give yourself and your users wins. The more time you spend looking for and fixing accessibility issues, the more clever you’ll feel when you start to preempt them on your next project.&lt;/p&gt;
&lt;p&gt;It’s important to note that making sure users of all stripes (&lt;em&gt;not solely the ones your product manager has deemed important enough&lt;/em&gt;) can be successful using the things you create is literally, like, the job. Designers will do their best to discover issues beforehand, testing and interviews can solve issues later in the process, but at the end of the day, your hand is the one that brings The Thing into being. Bringing accessibility expertise into your stables will make you an extremely formidable developer, it’s a consistent value-add to any project, and it further makes you a far better citizen of the internet.&lt;/p&gt;
&lt;h3 id=&quot;a-note-on-communication&quot; tabindex=&quot;-1&quot;&gt;A Note On Communication&lt;/h3&gt;
&lt;p&gt;This isn’t HTML-specific, but this advice has taken me further than any blog tutorial ever has:&lt;/p&gt;
&lt;p&gt;Be kind and curious and humble when you’re working with folks, and be extra forgiving of their mistakes, so when the time inevitably comes that you make your own, there’s perhaps some goodwill in the vault for you. This might not seem like a consideration for “How To Make A Website”, but making things for the internet takes a village, and you’ll be astounded how much you naturally become a better developer if you default to listening and checking your ego. That’s been a hard lesson to learn, especially the more I feel confident in my ability as a web developer, but it’s certainly been one of the more valuable ones.&lt;/p&gt;
&lt;h3 id=&quot;personal-tooling&quot; tabindex=&quot;-1&quot;&gt;Personal Tooling&lt;/h3&gt;
&lt;p&gt;These days (late 2022, early 2023) I primarily use 11ty to build websites, because it has a very low level of opinion and abstraction — it provides lift where I need it without deciding HOW it ought to provide lift. Its primary use in my development process is merging content with templates. I can use flat files like markdown, query content APIs like Wordpress or Contentful at build time, etc, and serve static HTML to users with no client-side JavaScript payload.&lt;/p&gt;
&lt;p&gt;I usually use either Nunjucks or Vue for template logic as they’re both extremely similar to HTML (abstraction is the devil). I default to the former for simpler projects with less data massaging or for projects with collaboration with non-Vue developers. 11ty makes Vue feel great — I can write filters and computed data and interpolations without serving any client-side Javascript to users.&lt;/p&gt;
&lt;p&gt;Nunjucks is a first-class citizen in 11ty, but I’ve also written a (possibly slightly out-of-date) guide on using Vue templates in 11ty:.&lt;/p&gt;
&lt;article class=&quot;card article-block&quot;&gt;
    &lt;dl class=&quot;article-block__meta&quot;&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Category&lt;/dt&gt;
            &lt;dd&gt;tutorial&lt;/dd&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Tags&lt;/dt&gt;
            &lt;dd&gt;vue | eleventy | static site generation&lt;/dd&gt;
        &lt;/div&gt;
    &lt;/dl&gt;
    &lt;h1 class=&quot;article-block__title&quot;&gt;How to use Vue to template your Eleventy projects&lt;/h1&gt;
    &lt;dl class=&quot;article-block__meta&quot;&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Reading Time&lt;/dt&gt;
            &lt;dd&gt;4 minute read&lt;/dd&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;dt class=&quot;visually-hidden&quot;&gt;Last updated&lt;/dt&gt;
            &lt;dd&gt;
                &lt;time&gt;Last updated December 17, 2021&lt;/time&gt;
            &lt;/dd&gt;
        &lt;/div&gt;
    &lt;/dl&gt;
    &lt;a href=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/&quot; class=&quot;article-block__link with-arrow&quot;&gt;Read more&lt;/a&gt;
&lt;/article&gt;
&lt;h2 id=&quot;style-code-or-how-i-learned-to-stop-worrying-and-love-the-cascade&quot; tabindex=&quot;-1&quot;&gt;Style Code (or How I Learned To Stop Worrying and Love The Cascade)&lt;/h2&gt;
&lt;p&gt;There’s no need to fear CSS. It’s not the language it was in 2012, rife with vendor prefixes and secret hacks to trick it into solving your layout problems. Between the CSS grid API and container queries and custom properties/variables and scroll timelines and filters and layers and math functions, there’s hardly a thing one needs Javascript for these days.&lt;/p&gt;
&lt;h3 id=&quot;a-quick-thing-about-preprocessors&quot; tabindex=&quot;-1&quot;&gt;A Quick Thing About Preprocessors&lt;/h3&gt;
&lt;p&gt;I still use Sass for most projects! It’s still really good! Leveraging the file structure, nesting architecture, and &lt;code&gt;$&lt;/code&gt; tokens maintains its place as a super high value member to any CSS tooling.&lt;/p&gt;
&lt;p&gt;Be wary of over-nesting and getting clever with Sass features — as with all aspects of code, it’s better to be readable and clear than it is to be smart.&lt;/p&gt;
&lt;h3 id=&quot;methodology&quot; tabindex=&quot;-1&quot;&gt;Methodology&lt;/h3&gt;
&lt;p&gt;When you’re getting into to writing CSS, my advice is to avoid frameworks but embrace method. In my experience, you will almost always spend more time overriding frameworks or compromising your design to fit the opinions of a framework. If you need to get a simple documentation project out the door yesterday, you may find a framework can be a great tool, but without exception I find frameworks hinder learning and discovery in CSS. IMHO, you’re better off learning what pieces or patterns you’re not confident implementing quickly. You may be surprised how little the frameworks are actually giving you.&lt;/p&gt;
&lt;p&gt;As far as methodology goes, I dare not tread too deeply in these contentious waters — really, whether you elect for BEM or CUBE or OOCSS or Tailwind or SMACSS or whatever, the important thing is that you think carefully about that choice before making it. If some aspect of a methodology feels confusing, make sure you’re prepared to explain that aspect with patience and empathy to any collaborators. Try to weigh methodology by its level of abstraction, the learning curve for implementation, and the additional tooling it requires.&lt;/p&gt;
&lt;p&gt;I personally use BEM for almost all projects, for a couple of reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The overhead for learning BEM is knowing that &lt;code&gt;__&lt;/code&gt; means a child of a block, &lt;code&gt;--&lt;/code&gt; means a modifier of a block, and if you have more than one of each delimiter in a selector, it’s time to start a new block. That’s usually pretty straightforward to communicate as quickly as I just did.&lt;/li&gt;
&lt;li&gt;It’s clear from looking at a well-named BEM block in CSS what its HTML counterpart is meant to communicate. For example, selectors for &lt;code&gt;.card&lt;/code&gt; and &lt;code&gt;.card__title&lt;/code&gt; and &lt;code&gt;.card__thumbnail&lt;/code&gt; and &lt;code&gt;.card__thumbnail—-small&lt;/code&gt; probably represent some sort of card, the card’s title, and two possible states for a card image.&lt;/li&gt;
&lt;li&gt;At the same time as the structure is visible by the class naming, BEM CSS also doesn’t care what tags are actually in use in the HTML. (&lt;em&gt;See my note about the cascade below.&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;It plays extremely well with the &lt;code&gt;&amp;amp;&lt;/code&gt; operator in SCSS. Note that we get the visual organization of nesting without the steep specificity increase.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.card &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__title &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// .card__title&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__thumbnail &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// .card__thumbnail&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;--small &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// .card__image--small&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;The inherently low specificity means its easy to override, which is good for cases where you don’t have complete control over markup. For instance, I often have to render some markdown as HTML inside a container. To style that new HTML, all I need to do is style the cascade one level of specificity higher:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.blog-article &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__title &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__content &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;p &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;blockquote &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;a-note-on-the-cascade&quot; tabindex=&quot;-1&quot;&gt;A Note On The Cascade&lt;/h3&gt;
&lt;p&gt;Candidly, I’m still navigating my relationship with the cascade. I first enjoyed BEM because it fully sidesteps the cascade and that feels simple to me. However, a lot of smart people that I know laud the benefits and misunderstood nature of the cascade; that makes me think I might be wrong about my election to minimize cascades in my CSS. If you’re a few steps ahead of me and ready to love the cascade once more, I highly recommend Andy Bell’s writing on &lt;a href=&quot;https://cube.fyi/&quot;&gt;CUBE CSS&lt;/a&gt;, a methodology that balances the best of all worlds between cascade inheritance, block-scoped styling, and utility CSS.&lt;/p&gt;
&lt;h3 id=&quot;mobile-first-style&quot; tabindex=&quot;-1&quot;&gt;Mobile-first style&lt;/h3&gt;
&lt;p&gt;This is one that I think gets talked about a lot but that I rarely see folks implement devoutly, and I promise it will make your life easier for writing style code: Always style from the absolute smallest screen your content will be rendered on first, and use &lt;code&gt;@media (min-width)&lt;/code&gt; queries to break to layouts that allow for more real estate as it becomes available. Bugs are fewer and further between, and debugging them feels much simpler to me since adopting this approach a few years ago.&lt;/p&gt;
&lt;p&gt;If your design doesn’t account for mobile, that’s alright — this is a great opportunity to be creative and think about how different aspects can work on mobile. Do you absolutely need a toggleable navigation bar? Can our three column layout fit meaningfully in two columns, or one?&lt;/p&gt;
&lt;h3 id=&quot;stateful-css&quot; tabindex=&quot;-1&quot;&gt;Stateful CSS&lt;/h3&gt;
&lt;p&gt;Now’s also the time when you can start prebuilding some of the interactivity that will come with Javascript. Think about all the states that a given interactive element will occupy, and how much of that dynamism can be offloaded from Javascript. Can you implement all states by simply changing the class on an element? Can you manually choreograph your animations with &lt;code&gt;@keyframes&lt;/code&gt;, or will you need JS to calculate FLIPs, etc? This consideration will make debugging your JS much easier when we get there.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;I’m not 100% certain that I’ve said my piece about CSS as comprehensively or as clearly as I’d like to. Stay tuned, this post may evolve, or yet sequels may utter from these delving mines of content management.&lt;/p&gt;
&lt;h2 id=&quot;interactivity-and-complex-animation-with-java-script&quot; tabindex=&quot;-1&quot;&gt;Interactivity and Complex Animation with JavaScript&lt;/h2&gt;
&lt;p&gt;By this point, our website ought to be lookin’ pretty good, pretty durable, pretty handsome in a dangerous sort of way. As the fashion of the web stands, the things that make websites &lt;em&gt;feel&lt;/em&gt; really cool beyond clever screen design and good fonts tend to be in the realm of JavaScript interactivity. Tread lightly as we make our way into these woods. A little JS goes a long way and too much will ruin your project, for your users and for your own enjoyment of managing the code!&lt;/p&gt;
&lt;p&gt;Before getting involved in earnest with JS, it’s important to know the facts; &lt;em&gt;great power, great responsibility&lt;/em&gt; and all that. I highly recommend you read &lt;a href=&quot;https://jlwagner.net/&quot;&gt;@malchata&lt;/a&gt;’s &lt;em&gt;Responsible JavasScript&lt;/em&gt;, which gives a very human-friendly and thorough framework for understanding performance and browser rendering, how you can help JavaScript do its job better, and how you can improve your users’ experience with your site.&lt;/p&gt;
&lt;h3 id=&quot;a-note-on-progressive-enhancement&quot; tabindex=&quot;-1&quot;&gt;A Note On Progressive Enhancement&lt;/h3&gt;
&lt;p&gt;I try to apply an attitude of progressive enhancement to all aspects of my work — make your project work on the most inconsistent connection, on the smallest screen, for the least able user, and build gracefully upon that foundation. That applies to your HTML, it applies to your bleeding-edge CSS, it applies now to your JavaScript.&lt;/p&gt;
&lt;p&gt;This might make me some enemies but my enemies are dorks, so: If your site doesn’t work without JavaScript, your site doesn’t work. It’s not hard to be careful and resourceful in your application (lol) of JavaScript, and constraint makes creativity bloom.&lt;/p&gt;
&lt;p&gt;How can you ship fewer bytes? How can you defer some interactivity? How can you let a server handle some computation instead of making a browser do it? These are fun problems to solve, and I found the glee I got from It Just Works-style automagic heavy-duty JS libraries and frameworks, i.e. JS-first development, I started to get threefold from instead shipping projects that I knew loaded fast, and loaded on any device or connection imaginable. It’s just an attitude thing IMO.&lt;/p&gt;
&lt;h3 id=&quot;animation&quot; tabindex=&quot;-1&quot;&gt;Animation&lt;/h3&gt;
&lt;p&gt;There are a lot of animations that are too complex or unable to be triggered with CSS alone. For those complex animations, I recommend getting your hands dirty with GSAP. The version 3 API is super streamlined and feels very accessible to new and seasoned creative developers, and that support community is one of the kindest you’ll discover online.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;Be kind in return! Those that manage the GSAP Forums will be sainted before the decade is through!&lt;/p&gt;
&lt;p&gt;With GSAP, I typically organize my code in separate files and just bundle using Rollup or similar. I’ll use a file structure something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.
├── index.html
├── css/
└── js/
    ├── main.js
    ├── animations/
    │   ├── cardReveal.animation.js
    │   └── homepageScroll.animation.js
    └── transitions/
        ├── home.transition.js
        ├── blog.transition.js
        └── default.transition.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then if I want to do something like use an &lt;code&gt;IntersectionObserver&lt;/code&gt; to reveal the cards when they arrive on the page, it’s easy to do something like this:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// main.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CardRevealAnimation &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./animations/cardReveal.animation&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;revealHandler&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entries&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; observer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  entries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; animation &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;CardRevealAnimation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    animation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;play&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    animation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;onComplete&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; animation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;kill&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; revealObserver &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IntersectionObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;revealHandler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;[reveal]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  revealObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;el&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;transitions&quot; tabindex=&quot;-1&quot;&gt;Transitions&lt;/h3&gt;
&lt;p&gt;The thing about single-page apps that seems like a killer feature for a lot of JS-first devs is page transitions. Almost nothing* makes a site feel cooler than doing a really slick hide timeline, updating the URL, and subsequently doing a really slick reveal animation of the next page.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;*Shaders.&lt;/p&gt;
&lt;p&gt;But hark — we’re in dangerous territory again. Always progressively enhance your apps, especially when you’re fucking with something as browser-critical as page routing. You know as well as I do how miserable it is to be hung up between pages because the JS-powered router failed. Be very careful.&lt;/p&gt;
&lt;p&gt;There are a lot of ways to do the partial AJAX SPA-style of routing we’re talking about, but my preferred way &lt;em&gt;lately&lt;/em&gt; is &lt;a href=&quot;https://taxi.js.org/&quot;&gt;Taxi.js&lt;/a&gt;, and I just mount GSAP timelines between pages. GSAP tends to be very powerful for this style of animation, cause oftentimes you’re looking to bring an element &lt;em&gt;from&lt;/em&gt; somewhere but you don’t necessarily know where, and GSAP has both &lt;code&gt;.from&lt;/code&gt; or &lt;code&gt;.to&lt;/code&gt; methods for seamlessly switching back and forth between known positioning and unknown positioning.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I’d like to make this rant into a resource, more robust guidelines, etc. If there’s something I didn’t cover that you’d like to learn about, something I &lt;em&gt;did&lt;/em&gt; cover that I didn’t cover well enough, or if you just think I’m wrong and stupid, please don’t hesitate to hit me up &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;via email&lt;/a&gt; or &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;on Bluesky&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Candidly, I hope this hasn’t felt too pedantic or peremptory. Websites are fun, the internet is a gift. It’s important to remember the experience of your users is ten thousand times more important than your developer experience. Have fun, be safe, protect each other, and don’t talk to cops.&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://faculty.com/standards/best-practices&quot;&gt;Faculty Standards&lt;/a&gt; — a great set of guardrails for being safe and considerate in your web development practice. I wrote some of these, full disclosure, but most of the heavy lifting was the fantastic writing team at &lt;a href=&quot;https://henry.codes/writing/how-to-make-a-website/faculty.com&quot;&gt;Faculty&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://html.spec.whatwg.org/&quot;&gt;HTML Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://www.w3.org/TR/WCAG20/&quot;&gt;WCAG Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://abookapart.com/products/responsible-javascript&quot;&gt;Responsible Javascript&lt;/a&gt;, by Jeremy Wagner&lt;/li&gt;
&lt;li&gt;Andy Bell’s &lt;a href=&quot;https://buildexcellentwebsit.es/&quot;&gt;Be The Browser’s Mentor, Not Its Micromanager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Tue, 17 Jan 2023 03:31:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-to-make-a-website/</guid>
</item>
<item>
    <title>How to distort text with SVG filters</title>
    <link>https://henry.codes/writing/how-to-distort-text-with-svg/</link>
    <description>&lt;p&gt;A lot of the SVG filter primitive content out there is some really rad, deep-dive type content &lt;em&gt;(I’ll link some of these at the end!)&lt;/em&gt;, so I reckoned it might be nice to do a quick write-up on some effects I use pretty commonly. These are more-or-less plug-and-play; simple filters for making your friends go “ooh how did u do that lmao”.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_2_hbu8gt-400w.webp 400w, https://henry.codes/writing/how-to-distort-text-with-svg/image_2_hbu8gt-800w.webp 800w, https://henry.codes/writing/how-to-distort-text-with-svg/image_2_hbu8gt-1312w.webp 1312w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_2_hbu8gt-400w.jpeg&quot; alt=&quot;A retro computer advertisement rendered in HTML featuring SVG-distorted text&quot; width=&quot;1312&quot; height=&quot;1531&quot; srcset=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_2_hbu8gt-400w.jpeg 400w, https://henry.codes/writing/how-to-distort-text-with-svg/image_2_hbu8gt-800w.jpeg 800w, https://henry.codes/writing/how-to-distort-text-with-svg/image_2_hbu8gt-1312w.jpeg 1312w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;setup&quot; tabindex=&quot;-1&quot;&gt;Setup&lt;/h2&gt;
&lt;p&gt;To kick this off, all we need is a super simple HTML file with a place for our CSS. We’ll create some placeholder text and an empty SVG tag.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Ratione cum
    inventore ea quaerat, maxime at! Debitis consequuntur reiciendis vero
    dolores, rem asperiores ut quo provident saepe ex ipsam sed culpa.
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- ... --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We’ll write a little CSS for now just to move our SVG out of our layout — we don’t actually need the SVG to render anything to the page, we just need it to do its magic filter math. Watch out, though: &lt;code&gt;display: none;&lt;/code&gt; will hide the effects of the filter too.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
  &lt;span class=&quot;token selector&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;creating-the-filter&quot; tabindex=&quot;-1&quot;&gt;Creating the filter&lt;/h2&gt;
&lt;p&gt;Next we can add to the SVG to start our filter composition. We’ll add a &lt;code&gt;&amp;lt;defs&amp;gt;&lt;/code&gt; tag and a &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; tag — the &lt;code&gt;&amp;lt;defs&amp;gt;&lt;/code&gt; actually isn’t necessary here since a &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; won’t render anything on its own, but it’s a good indicator to future developers that “hey, this won’t be directly rendered anywhere,” or “hey, this will be used later”. We’ll give the &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; an ID so we can call it in our CSS later.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;filter&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;distort&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To create the actual distortion effect is twofold — we need to first generate some random noise, then take that noise and move around pixels based on its output. If you’re new to composing SVG filters, I like to use the guitar pedalboard metaphor: you have a bunch of different effects available to you (in the form of “filter primitives”), each unique and configurable, and you pass a signal through them in any order to update that signal along the way. Hopefully the output is sick :)&lt;/p&gt;
&lt;h3 id=&quot;generating-noise&quot; tabindex=&quot;-1&quot;&gt;Generating noise&lt;/h3&gt;
&lt;p&gt;For this example, we’ll use the &lt;code&gt;&amp;lt;feTurbulence&amp;gt;&lt;/code&gt; primitive to generate noise. You can &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feTurbulence&quot;&gt;read more about that bad boy here&lt;/a&gt;. We’ll give it a tiny &lt;code&gt;baseFrequency&lt;/code&gt; for both x and y axes — you can play around with these values to get different effects once we’ve activated the filter. Higher values will make more thoroughly grainy noise! We’ll set &lt;code&gt;numOctaves&lt;/code&gt; to 1 for now, though increasing the number of octaves will smooth the noise output. For this example I want it to look kinda janky. The last attribute we’ll add is &lt;code&gt;result&lt;/code&gt;, which is an identifier so the next filter primitive can use the output of the turbulence. You can call it whatever!&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;filter&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;distortion-filter&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;feTurbulence&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;baseFrequency&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0.01 0.01&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;numOctaves&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;noise&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;using-a-displacement-map&quot; tabindex=&quot;-1&quot;&gt;Using a displacement map&lt;/h3&gt;
&lt;p&gt;Now we’ll use an &lt;code&gt;&amp;lt;feDisplacementMap&amp;gt;&lt;/code&gt; primitive to move around the actual pixels of the text. This takes a few input attributes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;in&lt;/code&gt; is your primary image input. We can use the keyword &lt;code&gt;SourceGraphic&lt;/code&gt; — this means it will displace whatever you apply the filter to, whether that’s some text, an image in your HTML, or some other SVG element.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;in2&lt;/code&gt; is the pixel data to displace the image we just added. We’ll take &lt;code&gt;noise&lt;/code&gt; as our input 2, as that’s the &lt;code&gt;result&lt;/code&gt; of the first primitive we created.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scale&lt;/code&gt; is pretty straightforward; you can use any number. I usually tweak this logarithmically to find the effect I want (&lt;em&gt;does 1 work? how about 2? how about 10? 50? 200, etc&lt;/em&gt;). We’ll use 10 here.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xChannelSelector&lt;/code&gt; and &lt;code&gt;yChannelSelector&lt;/code&gt; tell the displacement map to grab the pixel values from one specific RGBA channel to displace. Since our pattern is totally random, we can use the same channel for both, but if you’re using normal maps or more complex displacement, you might need different values!&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;filter&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;distort&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;feTurbulence&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;baseFrequency&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0.01 0.01&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;numOctaves&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;noise&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;feDisplacementMap&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;SourceGraphic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;in2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;noise&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;10&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;xChannelSelector&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;R&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;yChannelSelector&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;R&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s actually all we need for the filter! The more time you spend with filter primitives, the more easy it gets (&lt;em&gt;usually&lt;/em&gt;) to read at-a-glance what a given filter is doing. Some people write some insane filter shit tho — the difference between “I completely understand this” and “I am a baby-brained fool” can be pretty narrow in my experience. The sky is really the limit with this stuff.&lt;/p&gt;
&lt;h2 id=&quot;applying-the-filter&quot; tabindex=&quot;-1&quot;&gt;Applying the filter&lt;/h2&gt;
&lt;p&gt;Now we can go into our CSS and apply the filter using that ID we created in the first step!&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* ... */&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#distort&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_hfsafg-400w.webp 400w, https://henry.codes/writing/how-to-distort-text-with-svg/image_hfsafg-800w.webp 800w, https://henry.codes/writing/how-to-distort-text-with-svg/image_hfsafg-1260w.webp 1260w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_hfsafg-400w.jpeg&quot; alt=&quot;Text sample distorted using SVG displacement maps and turbulence.&quot; width=&quot;1260&quot; height=&quot;1256&quot; srcset=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_hfsafg-400w.jpeg 400w, https://henry.codes/writing/how-to-distort-text-with-svg/image_hfsafg-800w.jpeg 800w, https://henry.codes/writing/how-to-distort-text-with-svg/image_hfsafg-1260w.jpeg 1260w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Hell yea. So sick. The text is even still cursor-selectable. Feel empowered to tweak values and add primitives. There’s a whole world of wonder and image processing to be discovered.&lt;/p&gt;
&lt;h2 id=&quot;bonus-motion-blur-with-filters&quot; tabindex=&quot;-1&quot;&gt;Bonus: Motion blur with filters&lt;/h2&gt;
&lt;p&gt;Since we’re feeling so capable and technologically-enabled, let’s run another one. This one’s even simpler from an SVG standpoint. We’ll create another HTML snippet, just like the first one, but with some added CSS to do some clever text overlapping:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
  &lt;span class=&quot;token selector&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;h1:before&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data-text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#motion-blur&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* not necessary, just nice to soften the effect :) */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;filter&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;motion-blur&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-text&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;This is a title&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;This is a title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;adding-the-blur&quot; tabindex=&quot;-1&quot;&gt;Adding the blur&lt;/h3&gt;
&lt;p&gt;Next, we can add our primitive to blur the text. For now we’ll blur horizontally cause that’s fairly simple to accomplish.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;To blur at an angle, one might need to do a little Involved Mathematics to rotate/skew/counter-rotate the SourceGraphic, and it’s out of scope for this particular post :)&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;filter&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;motion-blur&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;feGaussianBlur&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;SourceGraphic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;stdDeviation&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;10,0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_3_srz2no-400w.webp 400w, https://henry.codes/writing/how-to-distort-text-with-svg/image_3_srz2no-800w.webp 800w, https://henry.codes/writing/how-to-distort-text-with-svg/image_3_srz2no-980w.webp 980w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_3_srz2no-400w.jpeg&quot; alt=&quot;Motion blurred h1 using SVG filter primitives&quot; width=&quot;980&quot; height=&quot;616&quot; srcset=&quot;https://henry.codes/writing/how-to-distort-text-with-svg/image_3_srz2no-400w.jpeg 400w, https://henry.codes/writing/how-to-distort-text-with-svg/image_3_srz2no-800w.jpeg 800w, https://henry.codes/writing/how-to-distort-text-with-svg/image_3_srz2no-980w.jpeg 980w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;There’s a great post by &lt;a href=&quot;http://lbebber.github.io/public/&quot;&gt;Lucas Bebber&lt;/a&gt; on how to bind this effect to actual animation, if you’re interested in taking it a step further! I’ve linked that post in the last section.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Anyway thanks for checkin’ out the post. If you have any questions or you found a typo that you absolutely will die if I don’t correct, hit me &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;via email&lt;/a&gt; or &lt;a href=&quot;https://front-end.social/@henry&quot;&gt;on Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Codrops’ &lt;a href=&quot;https://tympanus.net/codrops/2019/02/19/svg-filter-effects-creating-texture-with-feturbulence/&quot;&gt;SVG Filter Effects: Creating Texture with feTurbulence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sara Soueidan’s &lt;a href=&quot;https://www.sarasoueidan.com/blog/svg-filters/&quot;&gt;SVG Filters: The Crash Course&lt;/a&gt; talk&lt;/li&gt;
&lt;li&gt;Dirk Weber’s &lt;a href=&quot;https://www.smashingmagazine.com/2021/09/deep-dive-wonderful-world-svg-displacement-filtering/&quot;&gt;A Deep Dive Into The Wonderful World Of SVG Displacement Filtering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Codrops’ &lt;a href=&quot;https://tympanus.net/codrops/2015/04/08/motion-blur-effect-svg/&quot;&gt;Motion Blur Effect with SVG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Fri, 23 Dec 2022 00:33:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-to-distort-text-with-svg/</guid>
</item>
<item>
    <title>How to use Contentful with Eleventy</title>
    <link>https://henry.codes/writing/how-to-use-contentful-with-eleventy/</link>
    <description>&lt;p&gt;Contentful is an immensely well-featured headless content management system, but the density of its featureset can be daunting to integrate with static site generators. The great news is, Eleventy is so well-designed and modular — it doesn’t have to be nearly so challenging.&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Contentful has a &lt;abbr title=&quot;Representational State Transfer&quot;&gt;REST&lt;/abbr&gt; content delivery &lt;abbr title=&quot;application programming interface&quot;&gt;API&lt;/abbr&gt; and a GraphQL API. This post covers using the REST API to query blog posts from Contentful and render the returned data in an Eleventy project, as well as create multiple pages from that data.&lt;/p&gt;
&lt;h3 id=&quot;what-about-graph-ql&quot; tabindex=&quot;-1&quot;&gt;What about GraphQL?&lt;/h3&gt;
&lt;p class=&quot;editors-note&quot;&gt;Okay, I meant for this to be one paragraph about why I’m just covering REST but it ended up being kind of a lot, feel free to &lt;a href=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/#creating-a-contentful-content-type&quot;&gt;skip this section&lt;/a&gt; lol.&lt;/p&gt;
&lt;p&gt;I know a lot of folks find GraphQL quite useful! That’s very nice, but for now I’ve only elected to use a RESTful integration of Contentful, for a few reasons.&lt;/p&gt;
&lt;p&gt;My understanding is that GraphQL excels when dealing with multiple data sources, or when trying to be thrifty with bandwidth on the client-side. It provides these optimizations at the cost of additional infrastructure and complexity.&lt;/p&gt;
&lt;p&gt;As far as reducing bandwidth goes, it’s a non-issue here — since Eleventy makes its data requests server-side, it’s not critical for us to be so frugal with limiting requests because the user will be served flat files and no client-side JavaScript payload nor client-side requests after the fact.&lt;/p&gt;
&lt;p&gt;Lastly, in terms of proliferation, nearly 82% of API practitioners and consumers use a REST style, according to SmartBear’s 2020 &lt;a href=&quot;https://smartbear.com/resources/ebooks/the-state-of-api-2020-report/&quot;&gt;State of API report&lt;/a&gt;, whereas only 19% use GraphQL. That’s still a sizeable chunk to be sure, but it’s at least self-evident that the likelihood you’ll be integrating a GQL API with Eleventy any time is smaller than a RESTful one.&lt;/p&gt;
&lt;h2 id=&quot;creating-a-contentful-content-type&quot; tabindex=&quot;-1&quot;&gt;Creating a Contentful content type&lt;/h2&gt;
&lt;p&gt;This post assumes you’ve already created a Contentful Space — if you haven’t, I recommend you head over to &lt;a href=&quot;https://www.contentful.com/help/contentful-101/&quot;&gt;read about how to get started with Contentful&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let’s begin by creating a content model — in this tutorial, we’ll create a simple blog-style article. When logged in to our Contentful space, click “content model” and then “Add content type”. You can call this a “Blog Post”, and just use &lt;code&gt;post&lt;/code&gt; as the API identifier. Feel free to use whatever you want as a description, or skip it entirely.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;If you’ll have content editors in the dashboard that aren’t you, it’s good manners to leave a meaningful description of what this content model will represent, not matter how obvious it might be to you.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-400w.webp 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-800w.webp 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-1400w.webp 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-1442w.webp 1442w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-400w.jpeg&quot; alt=&quot;A user interface showing the creation of a new content type in Contentful&quot; width=&quot;1442&quot; height=&quot;1078&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-400w.jpeg 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-800w.jpeg 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-1400w.jpeg 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.14.44_2x_npdzjq-1442w.jpeg 1442w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Now we can add some fields. For this example, let’s add some Text, Date, Media, and Rich Text fields, in the form of a blog title, publish date, featured image, and body.&lt;/p&gt;
&lt;h3 id=&quot;some-things-to-note-as-you-add-fields&quot; tabindex=&quot;-1&quot;&gt;Some things to note as you add fields&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Make sure the Title is designated as the Entry title in Contentful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.37.46_2x_xurrvl-400w.webp 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.37.46_2x_xurrvl-800w.webp 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.37.46_2x_xurrvl-1010w.webp 1010w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.37.46_2x_xurrvl-400w.jpeg&quot; alt=&quot;The user interface for creating a short text field in Contentful. A checkbox labeled &amp;quot;This field represents the entry title&amp;quot; is highlighted.&quot; width=&quot;1010&quot; height=&quot;866&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.37.46_2x_xurrvl-400w.jpeg 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.37.46_2x_xurrvl-800w.jpeg 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.37.46_2x_xurrvl-1010w.jpeg 1010w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When adding the rich text &lt;code&gt;body&lt;/code&gt; block, I’m disallowing hyperlinks to other entries, links to other assets, or embedded entries/assets, inline or otherwise. There are some aspects of this sort of extension of Contentful that are extremely powerful but require some additional setup to render.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-400w.webp 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-800w.webp 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-1400w.webp 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-1680w.webp 1680w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-400w.jpeg&quot; alt=&quot;The user interface for creating a new RichText field in Contentful. The options for linking to another entry or asset, and embedding other content types are disabled.&quot; width=&quot;1680&quot; height=&quot;1014&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-400w.jpeg 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-800w.jpeg 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-1400w.jpeg 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.41.59_2x_gdubkx-1680w.jpeg 1680w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Once you’ve added each of these fields, you’ll have something like this.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.43.18_2x_z5zcex-400w.webp 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.43.18_2x_z5zcex-800w.webp 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.43.18_2x_z5zcex-1282w.webp 1282w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.43.18_2x_z5zcex-400w.jpeg&quot; alt=&quot;A Contentful dashboard view showing a content model with the four described fields.&quot; width=&quot;1282&quot; height=&quot;692&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.43.18_2x_z5zcex-400w.jpeg 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.43.18_2x_z5zcex-800w.jpeg 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.43.18_2x_z5zcex-1282w.jpeg 1282w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Now let’s create a blog post using this content model and populate it with some placeholder content that we can query and render on the Eleventy side.&lt;/p&gt;
&lt;p&gt;Switch to the Content tab and click “Add entry”. When prompted, select the Blog Post content model type. You can fill all of these fields with &lt;a href=&quot;https://loremipsum.io/&quot;&gt;lorem ipsum&lt;/a&gt;, or use an actual blog post if you want! (&lt;em&gt;I’m intentionally using different text formatting options in the body so I can take full advantage of the HTML renderer we’ll be leveraging later.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.52.16_2x_ciuq8n-400w.webp 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.52.16_2x_ciuq8n-800w.webp 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.52.16_2x_ciuq8n-1328w.webp 1328w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.52.16_2x_ciuq8n-400w.jpeg&quot; alt=&quot;A rich text, WYSIWYG editor with many types of content formatting on some lorem ipsum placeholder text.&quot; width=&quot;1328&quot; height=&quot;1074&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.52.16_2x_ciuq8n-400w.jpeg 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.52.16_2x_ciuq8n-800w.jpeg 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-22_at_23.52.16_2x_ciuq8n-1328w.jpeg 1328w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;That’s all we’ll need from the Contentful side until we get our Eleventy site going, at which point we’ll need to come back to this dashboard to get some API credentials!&lt;/p&gt;
&lt;h2 id=&quot;creating-an-eleventy-project&quot; tabindex=&quot;-1&quot;&gt;Creating an Eleventy project&lt;/h2&gt;
&lt;p&gt;You can start from scratch or if you’re an old Eleventy pro, you can skip down to where I write about &lt;a href=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/#requesting-data-from-contentful&quot;&gt;requesting data from Contentful&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;initial-setup&quot; tabindex=&quot;-1&quot;&gt;Initial setup&lt;/h3&gt;
&lt;p&gt;First, you’ll create a new directory for the project to live in, initialize it as a Node project, and install some dependencies. In your terminal, run the following:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; eleventy-contentful-tutorial &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; eleventy-contentful-tutorial
&lt;span class=&quot;token comment&quot;&gt;# fun fact, if you&#39;re on a Mac you can just do `take eleventy-contentful-tutorial` to create and immediately navigate into a directory.&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init &lt;span class=&quot;token comment&quot;&gt;# you can use the -y flag to skip the init setup&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --save-dev @11ty/eleventy contentful @contentful/rich-text-html-renderer dotenv
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;Since all these dependencies are used to build the site, and not served in production (&lt;em&gt;11ty: It’s Just HTML™&lt;/em&gt;), we can &lt;code&gt;npm install -D&lt;/code&gt; to install these packages as development dependencies.&lt;/p&gt;
&lt;p&gt;Let’s quickly create some standard files and directories for an Eleventy instance. Run these commands in your terminal as well:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; _data _includes &lt;span class=&quot;token comment&quot;&gt;# create two directories&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; index.njk _includes/layout.html &lt;span class=&quot;token comment&quot;&gt;# create two files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In our base &lt;code&gt;_includes/layout.html&lt;/code&gt; template, add the bare minimum HTML required to make this example work:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;How to use Contentful with Eleventy&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We’ll be using Nunjucks for this tutorial because it’s the most plug-and-play templating syntax and it’s fairly standard throughout the Eleventy docs. You can use all sorts of templating languages with Eleventy, &lt;a href=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/&quot;&gt;including Vue&lt;/a&gt;, if you’re a bit of a whacko.&lt;/p&gt;
&lt;p&gt;In our &lt;code&gt;index.njk&lt;/code&gt;, we’ll add some basic Nunjucks code to specify that we want to use the &lt;code&gt;layout.html&lt;/code&gt; file, and then render some text.&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;---
layout: layout.html
---
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;A brave new world, indeed.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, you can run &lt;code&gt;npx @11ty/eleventy --serve&lt;/code&gt; to start hot-reloading this Eleventy project at &lt;code&gt;localhost:8080&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;requesting-data-from-contentful&quot; tabindex=&quot;-1&quot;&gt;Requesting data from Contentful&lt;/h2&gt;
&lt;p&gt;With Eleventy, you can use JavaScript files to make requests to data sources at build time. We’ll create our first file to request all of our posts (&lt;em&gt;or, just the one, I guess&lt;/em&gt;) from Contentful.&lt;/p&gt;
&lt;p&gt;First we need to get some API credentials from Contentful and put those in a new &lt;code&gt;.env&lt;/code&gt; file. In your Contentful dashboard, navigate to “Settings” and then “API keys”, then click “Add API key”. For the name, I usually use the URL of the site, but it just needs to be meaningful to you.&lt;/p&gt;
&lt;p&gt;Once you’ve saved this, you’ll be given a Space ID and Content Delivery API - access token. Copy those down into a file &lt;code&gt;.env&lt;/code&gt; at the root of your Eleventy project:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;CTF_SPACE_ID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;fnmde2k23&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token assign-left variable&quot;&gt;CTF_CDA_ACCESS_TOKEN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;HuKYnGA87XYI0cNM&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Don’t ever publish your &lt;code&gt;.env&lt;/code&gt; file.&lt;/strong&gt; ⚠️ It contains secrets. Don’t commit it to git, don’t text its contents to your tight homies.&lt;/p&gt;
&lt;h3 id=&quot;creating-a-contentful-client&quot; tabindex=&quot;-1&quot;&gt;Creating a Contentful client&lt;/h3&gt;
&lt;p&gt;We now need a Contentful client with which to ask the content API for posts. Let’s create a file &lt;code&gt;utils.js&lt;/code&gt; in the root of our directory and create our client in there, using the &lt;code&gt;dotenv&lt;/code&gt; package we installed earlier to reference our local &lt;code&gt;.env&lt;/code&gt; variables.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dotenv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; contentful &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;contentful&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; contentfulClient &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; contentful&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;accessToken&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CTF_CDA_ACCESS_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;space&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CTF_SPACE_ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

exports&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contentfulClient &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; contentfulClient&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;When I have multiple content types, I prefer to create the client once and import it in each Eleventy &lt;code&gt;_data&lt;/code&gt; file that needs it. If you prefer to re-initialize the client in each file, that’s your prerogative. I’m proud of you for knowing what you believe in.&lt;/p&gt;
&lt;h3 id=&quot;creating-our-request&quot; tabindex=&quot;-1&quot;&gt;Creating our request&lt;/h3&gt;
&lt;p&gt;Now we can create a JavaScript file in the &lt;code&gt;_data&lt;/code&gt; directory that will grab all our posts when we run Eleventy. You can call it &lt;code&gt;_data/posts.js&lt;/code&gt; so you’ll be able to reference the data it returns as &lt;code&gt;posts&lt;/code&gt; in your templates.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// import the client we just created&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;../utils&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contentfulClient&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// create a request for all entries that match our post type.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// we can use the `order` property to sort them reverse-chronologically by their published date.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; posts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEntries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;content_type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;post&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;-fields.publishDate&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; posts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That oughta be working! (You may need to restart your Eleventy script in the terminal.) Now we can render the data in our templates.&lt;/p&gt;
&lt;h2 id=&quot;using-data&quot; tabindex=&quot;-1&quot;&gt;Using data&lt;/h2&gt;
&lt;p&gt;In our &lt;code&gt;index.njk&lt;/code&gt; file, let’s add a Nunjucks tag to dump all the data we just requested to the template.&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;A brave new world, indeed.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &#92;{&#92;{ posts | dump }}
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;The &lt;code&gt;dump&lt;/code&gt; filter saves us from just getting [object Object] rendered to the template, and instead shows us everything in the JSON object. Think &lt;code&gt;JSON.stringify()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-400w.webp 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-800w.webp 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-1400w.webp 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-2110w.webp 2110w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-400w.jpeg&quot; alt=&quot;A browser showing a website populated with a headline and some JSON code.&quot; width=&quot;2110&quot; height=&quot;1362&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-400w.jpeg 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-800w.jpeg 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-1400w.jpeg 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_00.42.01_2x_1_favfcg-2110w.jpeg 2110w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Well, that’s a lot, and mostly unuseful. Contentful offers a JSON view of your content models in the dashboard to make this a little simpler to parse, but I’ll simplify the haystack-digging for the purposes of this tutorial.&lt;/p&gt;
&lt;p&gt;You can use Nunjucks to iterate over every blog post (&lt;em&gt;which, for now is only one&lt;/em&gt;) in the template:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s probably looking much cleaner already. One thing you might notice is that I created a link to a page that doesn’t exist yet, using the title of this post and the built-in Eleventy &lt;code&gt;slug&lt;/code&gt; filter. We’ll handle that next.&lt;/p&gt;
&lt;h2 id=&quot;creating-post-pages-from-data&quot; tabindex=&quot;-1&quot;&gt;Creating post pages from data&lt;/h2&gt;
&lt;p&gt;In this section, we’ll cover the creation of a post template that will autogenerate every individual post page.&lt;/p&gt;
&lt;p&gt;Start by creating a file &lt;code&gt;_post.njk&lt;/code&gt; at the root of your project and populating it with the following frontmatter:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;---
layout: layout.html
pagination:
    data: posts
    size: 1
    alias: post
permalink:  &quot;posts/undefined/index.html&quot;
eleventyComputed:
    title: &quot;&quot;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Line by line, what we’ve written accomplishes these things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;layout.html&lt;/code&gt; file in our &lt;code&gt;_includes&lt;/code&gt; directory as our layout.&lt;/li&gt;
&lt;li&gt;Create some pagination for every entry in posts. We use a size of &lt;code&gt;1&lt;/code&gt; because we only want one post per page. We use the alias &lt;code&gt;post&lt;/code&gt; to conveniently refer to our post within the template.&lt;/li&gt;
&lt;li&gt;Tell Eleventy to put this page at &lt;code&gt;/posts/slugified-title&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Compute the page title from the data and set the title of the page to this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next, add some basic HTML to render the data on the page.&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;---

---
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Published on: &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;?w=400&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{&#92;{ post.fields.body | dump }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are some quirks to note here as well.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firstly, it takes some serious drilling to actually access the URL of an image asset from Contentful. There are a few ways around this, such as separate requests, modification of asset objects on request time, or even an Eleventy filter to avoid all this dot notation.&lt;/li&gt;
&lt;li&gt;Second, I’ve added a &lt;code&gt;?w=400&lt;/code&gt; parameter to the image URL to make sure we’re not grabbing a huge image every time. Contentful provides a number of image transformations by URL, you can &lt;a href=&quot;https://www.contentful.com/developers/docs/references/images-api/&quot;&gt;read more about URL image transformation methods here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Lastly, looks like that Rich Text &lt;code&gt;body&lt;/code&gt; field renders some wild JSON. We’ll fix that next.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rendering-contentful-rich-text&quot; tabindex=&quot;-1&quot;&gt;Rendering Contentful rich text&lt;/h2&gt;
&lt;p&gt;The “Rich Text” concept in Contentful is extremely powerful, as it allows you to generate your own renderer and custom overrides for how your content is displayed. For this tutorial we’ll use the stock renderer, and won’t extend it for any special embeds.&lt;/p&gt;
&lt;p&gt;We’ll install the Contentful renderer as an Eleventy filter. Create a file &lt;code&gt;.eleventy.js&lt;/code&gt; at the root of the project, and add the following:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; documentToHtmlString &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;@contentful/rich-text-html-renderer&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;renderRichTextAsHtml&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;documentToHtmlString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(&lt;em&gt;You can &lt;a href=&quot;https://github.com/contentful/rich-text/tree/master/packages/rich-text-html-renderer&quot;&gt;learn more about the Contentful HTML renderer here&lt;/a&gt;.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;All we’re doing here is adding a global filter that uses the Contentful renderer!&lt;/p&gt;
&lt;p&gt;Now in our &lt;code&gt;_post.njk&lt;/code&gt; template, you can use the filter right away:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{&#92;{ post.fields.body | renderRichTextAsHtml | safe }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here I’m referencing the body field, passing that to the render filter we just created, and then using the built-in &lt;code&gt;safe&lt;/code&gt; filter to tell the template not to escape the rendered HTML.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-400w.webp 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-800w.webp 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-1400w.webp 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-2129w.webp 2129w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-400w.jpeg&quot; alt=&quot;The website all-told, rendering a headline, date, header image, and some rich text content with multiple formatting types.&quot; width=&quot;2129&quot; height=&quot;1889&quot; srcset=&quot;https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-400w.jpeg 400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-800w.jpeg 800w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-1400w.jpeg 1400w, https://henry.codes/writing/how-to-use-contentful-with-eleventy/CleanShot_2021-12-23_at_01.14.19_2x_tkgilg-2129w.jpeg 2129w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Looking genuinely exceptional, I’d say. You’re great at the work you do. You’re a champion. I love you. We all do.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Feel free to &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;reach out and touch faith&lt;/a&gt; on Bluesky if you’ve got questions about this article. It would be great to expand this article upon finding new challenges folks face with this integration. I reckon this could also cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using the GraphQL API (&lt;em&gt;as mentioned, I’m not particularly an advocate of this approach, but I know some folks like it and want to use it.&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Extending the Contentful Rich Text engine to render references (it really is incredibly powerful for content creation).&lt;/li&gt;
&lt;li&gt;Previewing content using the Eleventy Serverless plugin and the Contentful preview API.&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Thu, 23 Dec 2021 07:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-to-use-contentful-with-eleventy/</guid>
</item>
<item>
    <title>How to use Vue to template your Eleventy projects</title>
    <link>https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/</link>
    <description>&lt;p&gt;Okay quick disclaimer before I kick this off — this post does not cover how to use interactive Vue components in an Eleventy project. This post covers using Vue entirely server-side! The client will not receive any Vue code.&lt;/p&gt;
&lt;p&gt;All of the code for this project can be found &lt;a href=&quot;https://github.com/xdesro/eleventy-vue-tutorial&quot;&gt;in this repo&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;If you’re using Eleventy because it’s lovely, but like using Vue syntax to handle single-file components, template merging, interpolation, etc, I’ve got your back. This post teaches how to start a new project in Eleventy, integrate &lt;code&gt;eleventy-plugin-vue&lt;/code&gt;, and deal with any arising quirks or idiosyncrasies.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot; tabindex=&quot;-1&quot;&gt;Getting started&lt;/h2&gt;
&lt;p&gt;This tutorial assumes you have Node and NPM installed. If you don’t yet, you can head &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;over here&lt;/a&gt; to get that running on your machine. Once that’s in place, we can create a new directory, initialize it as a Node project, and install the two dependencies we need to get cookin’.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; eleventy-vue-tutorial &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; eleventy-vue-tutorial

&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init &lt;span class=&quot;token comment&quot;&gt;# you can use the -y flag to skip the init setup&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; @11ty/eleventy@beta @11ty/eleventy-plugin-vue
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let’s also create some standard directories for an Eleventy project. I personally prefer to keep my app code in a &lt;code&gt;src&lt;/code&gt; directory, and reserve the base for configuration and meta files (like &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;.eleventy.js&lt;/code&gt;, &lt;code&gt;.prettierrc&lt;/code&gt;, etc.) but for this tutorial we’ll do as little opinionated configuration as possible!&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; _data _includes
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;creating-the-eleventy-configuration-and-scripts&quot; tabindex=&quot;-1&quot;&gt;Creating the Eleventy configuration and scripts&lt;/h3&gt;
&lt;p&gt;To get any of this working, we’ll need to add our configuration file to use the Vue plugin in our app. First, we’ll create our &lt;code&gt;.eleventy.js&lt;/code&gt; file in the base directory of the project and populate it!&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; eleventyVue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;@11ty/eleventy-plugin-vue&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// import the plugin&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addPlugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;eleventyVue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// tell Eleventy about the plugin&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;eleventy-experimental-features&quot; tabindex=&quot;-1&quot;&gt;Eleventy experimental features&lt;/h3&gt;
&lt;p&gt;Here’s the first quirk of this process. At the time of writing, the default installations for &lt;code&gt;eleventy&lt;/code&gt; and &lt;code&gt;eleventy-plugin-vue&lt;/code&gt; rely on an experimental feature of Eleventy for Custom File Extensions. I’ve gotten around this requirement by installing the &lt;code&gt;@11ty/eleventy@beta&lt;/code&gt; package, which implements custom file extensions as a feature.&lt;/p&gt;
&lt;p&gt;To add the necessary scripts, we’ll go to our &lt;code&gt;package.json&lt;/code&gt; file, and add the following:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npx @11ty/eleventy --serve&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npx @11ty/eleventy&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;If for some reason you can’t use Eleventy 1.0.0, that’s actually fine, you’ll just edit your scripts to activate the experimental features flag:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ELEVENTY_EXPERIMENTAL=true npx @11ty/eleventy --serve&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ELEVENTY_EXPERIMENTAL=true npx @11ty/eleventy&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;layouts-data-files-and-vue-templates&quot; tabindex=&quot;-1&quot;&gt;Layouts, data files, and Vue templates&lt;/h2&gt;
&lt;p&gt;In this section, you’ll create a layout, specify it as the default layout, and create your first Vue page template.&lt;/p&gt;
&lt;h3 id=&quot;creating-a-layout&quot; tabindex=&quot;-1&quot;&gt;Creating a layout&lt;/h3&gt;
&lt;p&gt;As &lt;a href=&quot;https://github.com/11ty/eleventy-plugin-vue/#not-yet-available&quot;&gt;reported in the &lt;code&gt;eleventy-plugin-vue&lt;/code&gt; README.md&lt;/a&gt;, you can’t use &lt;code&gt;.vue&lt;/code&gt; files as base layouts, so what we’ll do instead is create a &lt;code&gt;layout.html&lt;/code&gt; and specify it as the global layout template. This file will use some Nunjucks templating, so, sorry, you can’t escape it entirely &lt;em&gt;(yet)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;First, create a file &lt;code&gt;_includes/layout.html&lt;/code&gt;, and populate it with the absolute bare minimum code to make this tutorial work!&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;http-equiv&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;X-UA-Compatible&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;IE=edge&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ title }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    {{ content }}
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note those &lt;code&gt;{{ title }}&lt;/code&gt; and &lt;code&gt;{{ content }}&lt;/code&gt; tags. These will use the Eleventy data engine to inject our page’s HTML from our Vue templates. You can read more about how that works &lt;a href=&quot;https://www.11ty.dev/docs/layouts/&quot;&gt;in the Eleventy documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next, we’ll need to tell Eleventy to use that file as the default layout. This is as simple as creating a &lt;code&gt;layout.js&lt;/code&gt; in our &lt;code&gt;_data&lt;/code&gt; directory and inputting the following JavaScript:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;layout.html&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;adding-our-first-vue-template&quot; tabindex=&quot;-1&quot;&gt;Adding our first &lt;code&gt;.vue&lt;/code&gt; template&lt;/h3&gt;
&lt;p&gt;Now we can get into the actual Vue side of things. Let’s create our first page template, which, for now, will just have some content and set the page title.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;I’m using Vue 2 for this tutorial, but Vue 3 is supported! I haven’t gone through all of these steps with Vue 3 syntax to find the challenges the new API presents.&lt;/p&gt;
&lt;p&gt;We’ll create a file &lt;code&gt;index.vue&lt;/code&gt; at the base of our app.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;This is a test&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(listItem, index) in listItems&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;:key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        {{ listItem }}
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Wow I&#39;m So Excited To Use Vue In My Templates!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;listItems&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&#39;This is the first item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&#39;This is the second&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&#39;This is perhaps the third, though who could truly say.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The way the &lt;code&gt;eleventy-plugin-vue&lt;/code&gt; works is by simply rendering the &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt; tag and making that the &lt;code&gt;content&lt;/code&gt; data property in the Eleventy cascade, and in the same stroke using the Vue &lt;code&gt;data&lt;/code&gt; object as additional page data. Your page should look something like this:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-400w.webp 400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-800w.webp 800w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-1400w.webp 1400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-1518w.webp 1518w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-400w.jpeg&quot; alt=&quot;A screenshot of the website being coded so far, featuring a headline, active title tag, and some list items.&quot; width=&quot;1518&quot; height=&quot;998&quot; srcset=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-400w.jpeg 400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-800w.jpeg 800w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-1400w.jpeg 1400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-16_at_16.34.32_2x_qcryye-1518w.jpeg 1518w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Here, we used Vue iteration to turn an array of strings into an unordered list. You’ll even notice that the &lt;code&gt;layout.html&lt;/code&gt; file automatically used the &lt;code&gt;title&lt;/code&gt; data property as the title of the page. Nice work on this one, really just top notch work.&lt;/p&gt;
&lt;h2 id=&quot;rendering-content-and-pagination&quot; tabindex=&quot;-1&quot;&gt;Rendering content and pagination&lt;/h2&gt;
&lt;p&gt;Rendering content from either an API like Contentful introduces some challenges. Let’s create a fake Markdown blog post API response and a post template.&lt;/p&gt;
&lt;p&gt;In our &lt;code&gt;_data&lt;/code&gt; directory, we can create a &lt;code&gt;posts.js&lt;/code&gt; file that just exports a JSON array of posts, like what we might expect from a headless CMS API response.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;This is a test blog post&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;this-is-a-test-blog-post&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;## Subtitle&#92;nLorem ipsum dolor sit amet consectetur adipisicing elit. Repellendus, vero, odit animi praesentium obcaecati autem velit, labore voluptates itaque consequuntur ea reprehenderit quod eveniet nobis perspiciatis neque quas cum voluptatum.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;This is another blog post&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;another-blog-post&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;Lorem ipsum dolor sit amet consectetur adipisicing elit. Repellendus, vero, odit animi praesentium obcaecati autem velit, labore voluptates itaque consequuntur ea reprehenderit quod eveniet nobis perspiciatis neque quas cum voluptatum.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, create a file &lt;code&gt;posts/_slug.vue&lt;/code&gt; which will be the template for our rendered blog posts.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ post.title }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;v-html&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;post.content&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;posts&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;post&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function-variable function&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;posts/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slug&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/index.html&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There’s a couple of things to note in that &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;data&lt;/code&gt; object, we’re returning a &lt;code&gt;pagination&lt;/code&gt; entry — this is straight from the Eleventy docs, just converted to fit the Vue format!&lt;/li&gt;
&lt;li&gt;Our &lt;code&gt;permalink&lt;/code&gt; entry is a function that takes data from the paginator and returns the URL we want to render the page at.&lt;/li&gt;
&lt;li&gt;This last one is tricky, and I’ve wrestled with it a couple of ways, but what I found was that to dynamically get information from &lt;code&gt;data&lt;/code&gt; frontmatter, that is, to make available elsewhere in the data cascade, we can use &lt;code&gt;eleventyComputed&lt;/code&gt; (&lt;em&gt;not to be confused with Vue computed data&lt;/em&gt;) to return the &lt;code&gt;title&lt;/code&gt; from the paginated data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, we can visit one of our blog posts at http://localhost:8080/posts/this-is-a-test-blog-post/ and see it rendering out for the most part. The next thing we’ll have to reckon with is that our Markdown isn’t being interpreted as Markdown, but that’s easily resolved using actual Vue computed data!&lt;/p&gt;
&lt;p&gt;Let’s change this template around to use &lt;code&gt;markdown-it&lt;/code&gt; to render our content.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;&lt;code&gt;markdown-it&lt;/code&gt; comes as a dependency of Eleventy, but we can manually install it as well so our &lt;code&gt;package.json&lt;/code&gt; is a more accurate representation of the project’s dependencies.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; i &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; markdown-it
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ post.title }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;v-html&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token comment&quot;&gt;// import and initialize our markdown renderer from markdown-it&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; markdownRenderer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;markdown-it&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;computed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; markdownRenderer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We’ve added that &lt;code&gt;computed&lt;/code&gt; property which has one &lt;code&gt;body()&lt;/code&gt; function, which just takes the content from the paginated post and passes it through the markdown renderer. Things ought to be looking much better now.&lt;/p&gt;
&lt;h3 id=&quot;takeaways&quot; tabindex=&quot;-1&quot;&gt;Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You can use the Eleventy &lt;code&gt;pagination&lt;/code&gt; object to create multiple pages from a single Vue template.&lt;/li&gt;
&lt;li&gt;If you need to make data from a paginated page available higher in the data cascade (e.g. the page &lt;code&gt;title&lt;/code&gt; in this case), use &lt;code&gt;eleventyComputed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you need to transform data within a Vue template, you can use the Vue &lt;code&gt;computed&lt;/code&gt; or &lt;code&gt;filter&lt;/code&gt; properties, just like in a Vue single-page application.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;using-vue-components&quot; tabindex=&quot;-1&quot;&gt;Using Vue components&lt;/h2&gt;
&lt;p&gt;Of course, a lot of the reason for using Vue templates is the single-file component architecture pattern. That works just fine in Eleventy as well! Let’s create a &lt;code&gt;&amp;lt;Navigation /&amp;gt;&lt;/code&gt; component for use in our home page.&lt;/p&gt;
&lt;p&gt;First, we’ll create the file &lt;code&gt;_includes/Navigation.vue&lt;/code&gt;,&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Home&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;post in posts&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;:href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;`/posts/${post.slug}/`&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ post.title }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;posts&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then in our &lt;code&gt;index.vue&lt;/code&gt; template, we can import and reference the component.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;Navigation&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;:posts&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;posts&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- ... --&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Navigation &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./_includes/Navigation.vue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  	&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  		&lt;span class=&quot;token comment&quot;&gt;//...&lt;/span&gt;
  	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  	&lt;span class=&quot;token literal-property property&quot;&gt;components&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  		Navigation&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a pretty rudimentary example, but some things to note, again:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There’s no automatic aliasing or resolution as there is in other static Vue implementations, like Nuxt, so you have to reference your components by a full path to the file.&lt;/li&gt;
&lt;li&gt;Components will have access to the Eleventy-supplied &lt;code&gt;page&lt;/code&gt; object, but not necessarily data from the &lt;code&gt;_data&lt;/code&gt; directory. If I need to reference data from the &lt;code&gt;_data&lt;/code&gt; directory, I just pass it as a prop from the page template to a child component!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything else is more or less the same!&lt;/p&gt;
&lt;h2 id=&quot;using-single-file-component-css&quot; tabindex=&quot;-1&quot;&gt;Using single-file component CSS&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;eleventy-plugin-vue&lt;/code&gt; does have support for using single-file &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags, there’s just a little additional setup. In our &lt;code&gt;index.vue&lt;/code&gt; template, we can add a style tag with some arbitrary styles:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- ... --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #efefef&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we’ll need to collect the CSS from each relevant file component and output it in the page — there’s a convenient filter for that, which we’ll add to our &lt;code&gt;_includes/layout.html&lt;/code&gt; like so:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- ... --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
      &lt;span class=&quot;token selector&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token selector&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; page.url | getVueComponentCssForPage &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- ... --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can also, should we so desire, add the &lt;code&gt;scoped&lt;/code&gt; attribute to our style tag to leverage Vue’s &lt;a href=&quot;https://vue-loader.vuejs.org/guide/scoped-css.html&quot;&gt;scoped CSS features&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;I avoid doing so because it’s a bunch of extra specificity and for what?&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-400w.webp 400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-800w.webp 800w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-1400w.webp 1400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-2404w.webp 2404w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-400w.jpeg&quot; alt=&quot;A screenshot of the website being coded, and it is clear that the CSS written in the previous step is actually being rendered in the site.&quot; width=&quot;2404&quot; height=&quot;1372&quot; srcset=&quot;https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-400w.jpeg 400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-800w.jpeg 800w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-1400w.jpeg 1400w, https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/CleanShot_2021-12-17_at_17.18.30_2x_rdgen8-2404w.jpeg 2404w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Everything ought to be workin’ just fine now. Nice work there, my friend, really just tremendous.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;There are more idiosyncrasies to this implementation, and in a lot of cases you may decide it’s easier to use Nunjucks or a more standard Eleventy template language! That’s fine, I certainly don’t take it personally. I like Vue for the single-file architecture, the ability to do in-file data transformations, and the clean interpolation/iteration/templating syntax!&lt;/p&gt;
&lt;p&gt;I’ll update this post as I learn how to do more things, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use Vue 3 lol&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to my king &lt;a href=&quot;https://www.zachleat.com/&quot;&gt;Zach Leatherman&lt;/a&gt; for pointing out the spots in this blog where I was being a doofus, and &lt;a href=&quot;https://robbowen.digital/&quot;&gt;Robb Owen&lt;/a&gt; for proof-reading me to safety while I was recovering from vaccine brain.&lt;/p&gt;
&lt;h3 id=&quot;further-reading&quot; tabindex=&quot;-1&quot;&gt;Further reading:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/docs/&quot;&gt;The Official Eleventy documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/11ty/eleventy-plugin-vue/&quot;&gt;&lt;code&gt;eleventy-plugin-vue&lt;/code&gt; documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.netlify.com/blog/2020/09/18/eleventy-and-vue-a-match-made-to-power-netlify.com/&quot;&gt;The article Zach L. wrote about implementing this plugin for the new Netlify site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Fri, 17 Dec 2021 05:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-to-use-vue-to-template-your-eleventy-projects/</guid>
</item>
<item>
    <title>What to say when you don&#39;t know what to say</title>
    <link>https://henry.codes/writing/what-to-say/</link>
    <description>&lt;p&gt;I have this weird relationship with Incredible Amounts Of Grief where, like, I’ve literally been there — I know there’s nothing to say, and nothing will heal but time. When The Bad Thing™ happened, I felt angry so often with people wasting both my time and theirs trying to string together something moralizing and impactful, either to Make It Better, or to make themselves feel like they tried. When The Bad Thing™ happened, the only thing that would’ve made it better in any capacity, in any universe, was The Thing un-happening, or (the more common path) simply many years of hurt, of crying in the middle of the day for seemingly no reason, until the sun started to rise on my world each morning again.&lt;/p&gt;
&lt;p&gt;Despite this, I know what it is to watch someone grieve and feel desperately that I would do anything I could, in any capacity, in any universe, to take away some of the tidal waves of pain that person was experiencing. I’ve caught myself in the same stuttering moments of palaver, uttering everything in hopes that my meaning somehow makes it across — “&lt;em&gt;I love you, and I hope someday you don’t feel this hurt anymore, and I hope that day is soon&lt;/em&gt;”.&lt;/p&gt;
&lt;p&gt;I’ve have tried to be critical of myself, thinking about how to improve my own response, given my particular expertise in this scenario. I thought back to when The Bad Thing happened to me, and how I would have changed their reactions. Most of the things people said fell into a few categories:&lt;/p&gt;
&lt;h2 id=&quot;what-not-to-say&quot; tabindex=&quot;-1&quot;&gt;What not to say&lt;/h2&gt;
&lt;h3 id=&quot;i-know-what-you-re-going-through&quot; tabindex=&quot;-1&quot;&gt;I know what you’re going through.&lt;/h3&gt;
&lt;p&gt;Don’t care, and no you don’t, &lt;em&gt;and even if you did!&lt;/em&gt; Even if truly you do know what someone is going through, that’s not what they want to hear. Imagine you experienced the worst thing you’ve ever experienced, a kaleidoscope of skyscrapers falling into your mouth from a thundering sky, disintegrating every bone in your body. Imagine &lt;em&gt;that sinking feeling&lt;/em&gt; you get sometimes, except it sinks one hundred times faster and harder and it never stops — and then further imagine somebody told you that this exquisite, technicolor masterwork of suffering wasn’t something completely unique, in fact everyone probably has to deal with the kaleidoscope sooner or later. You knew this to be true, but being reminded to think of others’ experiences when you’re being eaten alive by the thoughts of your own experience isn’t helpful.&lt;/p&gt;
&lt;h3 id=&quot;they-re-in-a-better-place-now&quot; tabindex=&quot;-1&quot;&gt;They’re in a better place now.&lt;/h3&gt;
&lt;p&gt;I remember well the flash of anger I felt when someone had the audacity to bring me their religion and their stale platitudes when all I wanted was my little brother back. How those words about an imagined afterlife held a magnifying glass to the raging sunlight of my grief and burned deep lines down my skin — he lived a life of exploration and adventure and troublemaking, and now he’s in a box in my room; that’s hardly a “better place”.&lt;/p&gt;
&lt;p&gt;Secularity aside (and “aside” is doing some incredibly heavy lifting here), it’s still an irrelevant thing to share: Even if I believed they were in a better place, they’re not &lt;em&gt;with me&lt;/em&gt;, now, and like I mentioned before, that is the only thing that would fix this moment.&lt;/p&gt;
&lt;h3 id=&quot;keep-your-head-up&quot; tabindex=&quot;-1&quot;&gt;Keep your head up.&lt;/h3&gt;
&lt;p&gt;Honestly, what part of “kaleidoscope of pain” makes you think someone’s grieving head is gonna be anywhere but plunged into an ocean of agony for the next decade?&lt;/p&gt;
&lt;h3 id=&quot;it-gets-easier-with-time&quot; tabindex=&quot;-1&quot;&gt;It gets easier with time.&lt;/h3&gt;
&lt;p&gt;I know that, I’ve seen the movies about people experiencing grief and healing from it, but grief has this special, incisive way of annihilating any sense of temporality one might have — one finds themselves trapped in a singular plane of cyclical thought and emotion. Unless you have those &lt;em&gt;years&lt;/em&gt; of healing ready to inject intravenously, don’t bring the promise of those years.&lt;/p&gt;
&lt;h2 id=&quot;what-to-say&quot; tabindex=&quot;-1&quot;&gt;What to say&lt;/h2&gt;
&lt;p&gt;Just say &lt;em&gt;“I’m sorry for your loss”.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s not overdone! Rather, it carries the tradition of sorrow of millions of sorries-for-your-loss past. It’s succinct and respectful of the grieving and their time. Listen, if they have something to share, and know unequivocally in this moment there is nothing else you can say.&lt;/p&gt;
</description>
    <pubDate>Sun, 07 Mar 2021 00:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/what-to-say/</guid>
</item>
<item>
    <title>How to use the Spotify API and Netlify Functions to build a “Now Playing” widget</title>
    <link>https://henry.codes/writing/spotify-now-playing/</link>
    <description>&lt;p&gt;I recently* built this really cool feature for my personal website that allows me to use Netlify Functions to show my most-recently-listened-to tracks from Spotify.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/Henry_Desroches___Creative_Developer___UX_Engineer_yvgmyh-400w.webp 400w, https://henry.codes/writing/spotify-now-playing/Henry_Desroches___Creative_Developer___UX_Engineer_yvgmyh-788w.webp 788w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/spotify-now-playing/Henry_Desroches___Creative_Developer___UX_Engineer_yvgmyh-400w.jpeg&quot; alt=&quot;Spotify Widget live on my current site&quot; width=&quot;788&quot; height=&quot;330&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/Henry_Desroches___Creative_Developer___UX_Engineer_yvgmyh-400w.jpeg 400w, https://henry.codes/writing/spotify-now-playing/Henry_Desroches___Creative_Developer___UX_Engineer_yvgmyh-788w.jpeg 788w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;*It wasn’t recently, it was in July 2020, please don’t look behind the curtain.&lt;/p&gt;
&lt;p&gt;It’s an easy way to show some personality, and mostly just an excuse to get friendly with Netlify Functions. While the authorization flow for Spotify’s API initially threw me for a bit of a loop, this became a really fun way to spend an hour or two.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check out the code for this at &lt;a href=&quot;https://github.com/xdesro/spotify-widget&quot;&gt;the GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Or check out &lt;a href=&quot;https://spotify-widget-netlify-functions.netlify.app&quot;&gt;the deployed version of this site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Here’s a basic outline of what we’re going to do to get this working today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setting up a basic application to display our track info.&lt;/li&gt;
&lt;li&gt;Writing a basic callback function for Spotify authentication&lt;/li&gt;
&lt;li&gt;Setting up an app in Spotify For Developers&lt;/li&gt;
&lt;li&gt;Authenticating that app using Postman and Netlify Dev&lt;/li&gt;
&lt;li&gt;Writing a Netlify Function to request data from the Spotify API&lt;/li&gt;
&lt;li&gt;Rendering the response in HTML&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;editors-note&quot;&gt;This article won’t cover a fully-featured loop for managing authentication, refresh tokens, refresh timeout, etc. That would probably require a database and other infrastructure, and we don’t need that noise to make this work. ⚠️ &lt;strong&gt;This is probably not the way to make a very very secure serverless auth loop!&lt;/strong&gt; ⚠️ It’s just a fun tech demo. Be safe.&lt;/p&gt;
&lt;h2 id=&quot;initial-setup-and-prerequisites&quot; tabindex=&quot;-1&quot;&gt;Initial Setup &amp;amp; Prerequisites&lt;/h2&gt;
&lt;p&gt;It’s dangerous to go alone. You’ll need these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js and NPM&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.postman.com/&quot;&gt;Postman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cli.netlify.com&quot;&gt;Netlify CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Node/NPM will let us set up the Netlify CLI tool that makes using Netlify functions Really Quite Convenient, and we’ll use Postman as an interstitial step during authentication.&lt;/p&gt;
&lt;p&gt;To install Netlify CLI globally on our machine, we’ll run the following in our terminal:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; netlify-cli &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then we can use the CLI to log in to our Netlify Account:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;netlify login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s all we need for initial project set up.&lt;/p&gt;
&lt;h3 id=&quot;file-structure&quot; tabindex=&quot;-1&quot;&gt;File Structure&lt;/h3&gt;
&lt;p&gt;We’ll create a new directory for this project, and in it we’ll create two directories, &lt;code&gt;src&lt;/code&gt; and &lt;code&gt;functions&lt;/code&gt;, as well as a &lt;code&gt;netlify.toml&lt;/code&gt; file, which will contain our Netlify Functions configuration.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;src&lt;/code&gt; directory, we’ll create an &lt;code&gt;index.html&lt;/code&gt;, and in &lt;code&gt;functions&lt;/code&gt; we’ll make a file &lt;code&gt;callback.js&lt;/code&gt;. This is the function that will capture our initial authentication information from Spotify.&lt;/p&gt;
&lt;p&gt;We’ll also initialize an npm project so we can run the development functions.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(The &lt;code&gt;-y&lt;/code&gt; flag on &lt;code&gt;npm init&lt;/code&gt; just accepts the default options so we can breeze through this.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Once we’ve gone through these steps, our project directory ought to look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;functions/
└─ callback.js
src/
└─ index.html
netlify.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We’ll put some very basic HTML in our &lt;code&gt;index.html&lt;/code&gt; file for now, just to make sure everything’s working.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Document&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello world!&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our last setup step is to configure our &lt;code&gt;netlify.toml&lt;/code&gt; so Netlify knows where to look for our site files and Lambda function files:&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token key property&quot;&gt;publish&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;src&#39;&lt;/span&gt;
    &lt;span class=&quot;token key property&quot;&gt;functions&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;functions&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And it’s as simple as that, folks. Moving right along.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-the-callback&quot; tabindex=&quot;-1&quot;&gt;Setting Up The Callback&lt;/h2&gt;
&lt;p&gt;Our callback function doesn’t need to do much; just receive an authentication code from Spotify when we initially connect to the API. I made mine very simple — literally all the function does is return a stringified version of the query string it receives and a 200 response code.&lt;/p&gt;
&lt;p&gt;For a Netlify Function, we just need to export a method called handler that takes some information and returns a basic response. Here’s the code I wrote for &lt;code&gt;functions/callback.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;exports&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; callback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;statusCode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;queryStringParameters&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To test that this is working, we can start our Netlify CLI dev server by running the following in our Terminal:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;netlify dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once it gives us that blessed “Server now ready on…” message, we can go to the URL and see our HTML file. We can also test out our callback function by visiting its url with any test query string, perhaps something like &lt;a href=&quot;http://localhost:8888/.netlify/functions/callback?follow%20me%20on%25bluesky=@strange.website&quot;&gt;this&lt;/a&gt;? If everything’s set up correctly, it ought to display some JSON.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-a-spotify-app&quot; tabindex=&quot;-1&quot;&gt;Setting Up A Spotify App&lt;/h2&gt;
&lt;p&gt;Next, we’ll need to set up a Spotify app with the correct permissions so Spotify can share our listening information.&lt;/p&gt;
&lt;p&gt;We’ll head over to the Spotify For Developers dashboard &lt;a href=&quot;https://developer.spotify.com/dashboard/&quot;&gt;right here&lt;/a&gt;, log in with our Spotify account, and click “Create An App”. We can call it whatever we want, and give whatever description.&lt;/p&gt;
&lt;p&gt;Let’s first make sure to copy down the Client ID and Client Secret from the dashboard. We’ll need these in just a moment.&lt;/p&gt;
&lt;p&gt;Once the app is created, we’ll go to “Edit Settings”. This is where we’ll fill in our Redirect URI, which is the path to our local callback function: &lt;code&gt;http://localhost:8888/.netlify/functions/callback&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That’s all for this step, GG EZ.&lt;/p&gt;
&lt;h2 id=&quot;authenticating-the-app-using-postman-and-netlify-dev&quot; tabindex=&quot;-1&quot;&gt;Authenticating The App Using Postman and Netlify Dev&lt;/h2&gt;
&lt;p&gt;Now we’ll need to get some API client credentials, and authenticate for the first time. The goal here is to get a refresh token from the Spotify API, which we can use to repeatedly authenticate our API requests.&lt;/p&gt;
&lt;p&gt;For this step, make sure your local Netlify Dev server is still running. Then we can open Postman and create a new request with the following details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set the method to GET.&lt;/li&gt;
&lt;li&gt;Set the URL to &lt;code&gt;https://accounts.spotify.com/authorize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;In the params tab, we’ll add four parameters:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client_id&lt;/code&gt;: We’ll set this to the Client ID we copied down earlier.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response_type&lt;/code&gt;: “code”&lt;/li&gt;
&lt;li&gt;&lt;code&gt;redirect_uri&lt;/code&gt;: Set this to exactly the URL we specified in the app setup. &lt;code&gt;http://localhost:8888/.netlify/functions/callback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next, you’ll need to acquire some API client credentials and authenticate for a first time. Open Postman and create a new request. Set the method to GET and the URL to &lt;code&gt;http://localhost:8888/.netlify/functions/callback&lt;/code&gt;. In the params tab, you’ll add four parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client_id&lt;/code&gt;: Set this to the client ID you copied down earlier.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response_type&lt;/code&gt;: Just set this to &lt;code&gt;code&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;redirect_uri&lt;/code&gt;: Set this to &lt;code&gt;http://localhost:8888/.netlify/functions/callback&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;editors-note&quot;&gt;I found out while doing this the first time that a difference in trailing slashes will actually make this not work, so be very certain you’ve copied the URL exactly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scope&lt;/code&gt;: This determines what Spotify endpoints your authentication code will have access to. In the feature for my site, I only needed to use the &lt;code&gt;user-read-recently-played&lt;/code&gt; scope. You can totally mix this up, just take a look at the documentation &lt;a href=&quot;https://developer.spotify.com/documentation/general/guides/scopes/&quot;&gt;here&lt;/a&gt; to figure out which you’ll need.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Copy the URL Postman assembles for you out of the URL field and paste it into your browser. You’ll be prompted to sign into Spotify and accept the permissions you designated in the &lt;code&gt;scope&lt;/code&gt; parameter, and then redirected back to your callback endpoint — which should give you something like this!&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;code&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AQBOoEdTAXroVVK1uI5Ym49LQI2T8Nz7WT2PIlqlfo4iHZ7bPY6msLnmOMnxlRNqAWfQmi3FZFkfHQJW8A3x1RK1QOr8UsfeSDnik_dfnrErFnQM&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We’ll copy down the &lt;code&gt;code&lt;/code&gt; to use very soon.&lt;/p&gt;
&lt;p&gt;We’ll start a new Postman request, this time with the POST method. We’ll set the URL of this request to &lt;code&gt;https://accounts.spotify.com/api/token&lt;/code&gt;, per the &lt;a href=&quot;https://developer.spotify.com/documentation/general/guides/authorization-guide/&quot;&gt;Spotify API Authorization guide&lt;/a&gt;. In the Headers tab, we’ll add two entries, the first of which is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Content-Type&lt;/code&gt;: &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second entry is a little more involved. The key should be &lt;code&gt;Authorization&lt;/code&gt;, and then we need to base64 encode our Spotify Client ID and Client Secret, in the following format:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;client_id:client_secret
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can do this with the browser &lt;code&gt;btoa()&lt;/code&gt; function or Node’s &lt;code&gt;Buffer.from().toString(‘base64&#39;)&lt;/code&gt; functionality, or you can just paste it into &lt;a href=&quot;https://codepen.io/xdesro/pen/QWyEWxB&quot;&gt;this convenient CodePen I made specifically for you&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The end result that you’ll plug into Postman will be something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;hyphens:auto;&quot;&gt;&lt;code&gt;Authorization&lt;/code&gt;: &lt;code&gt;Basic andThenTheLongbase64StringThatProbablyEndsWithAnEqualsSign=&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-400w.webp 400w, https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-800w.webp 800w, https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-1400w.webp 1400w, https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-1776w.webp 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-400w.jpeg&quot; alt=&quot;Postman Request 2&quot; width=&quot;1776&quot; height=&quot;610&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-400w.jpeg 400w, https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-800w.jpeg 800w, https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-1400w.jpeg 1400w, https://henry.codes/writing/spotify-now-playing/Postman_2_pvbbxy-1776w.jpeg 1776w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;If you’ve made it this far, I’m so unbelievably proud of you. This part felt really convoluted and confusing to me when I did it. You’re doing great. You’re 10x the developer I’ll ever be.&lt;/p&gt;
&lt;p&gt;Next, we can move on to the Body tab of the request, and enter the following parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grant_type&lt;/code&gt;: &lt;code&gt;authorization_code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code&lt;/code&gt;: We’ll set this one to the code we got back from the first request!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;redirect_uri&lt;/code&gt;: Same as last time, we’ll set this to the same local URL (&lt;code&gt;http://localhost:8888/.netlify/functions/callback&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-400w.webp 400w, https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-800w.webp 800w, https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-1400w.webp 1400w, https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-1766w.webp 1766w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-400w.jpeg&quot; alt=&quot;Postman Request 3&quot; width=&quot;1766&quot; height=&quot;772&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-400w.jpeg 400w, https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-800w.jpeg 800w, https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-1400w.jpeg 1400w, https://henry.codes/writing/spotify-now-playing/Postman_jp1qox-1766w.jpeg 1766w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Now, we can run the request. We’ll get back a block of JSON something like this:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;access_token&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;moreRandomCharacterStringsHuzzah&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;token_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bearer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;expires_in&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;refresh_token&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AQC2kGL-HJ6QgonZju7rDTikEU5_g_FG6y39izdPShgpQStzyYXtqQ3CkALS-YbnrnD6SImvISnmqkN2swXYGSAYdc0fmkeBcb3ZClYXVI9gETZ6HoP0NsKq1zUiWVJT4Q4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scope&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;Like I said before, a cleverer developer might work out a solution for storing &lt;code&gt;access_token&lt;/code&gt;s, checking if they’ve expired, and refreshing conditionally. For this tutorial, we can use the same &lt;code&gt;refresh_token&lt;/code&gt; repeatedly, and that allows us to circumvent using a database, etc., so that’s the approach I’m taking.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;refresh_token&lt;/code&gt; is exactly what we need to move on to setting up the actual Spotify request in a Netlify function.&lt;/p&gt;
&lt;h2 id=&quot;writing-the-spotify-x-netlify-function&quot; tabindex=&quot;-1&quot;&gt;Writing The Spotify x Netlify Function&lt;/h2&gt;
&lt;p&gt;This is where the magic happens. By the end of this step, we’ll have accomplished a whole bunch of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Managing credentials in a local environment.&lt;/li&gt;
&lt;li&gt;Creating a new Netlify Function to do all our Spotify request magic&lt;/li&gt;
&lt;li&gt;Asynchronously fetching authorization from the Spotify API, and then&lt;/li&gt;
&lt;li&gt;Fetching our most-recently-listened-to song from the API using that authorization.&lt;/li&gt;
&lt;li&gt;Cleaning up the data for when we need to access it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;managing-environment-access-credentials&quot; tabindex=&quot;-1&quot;&gt;Managing Environment Access Credentials&lt;/h3&gt;
&lt;p&gt;Since we’re tracking secret credentials in our environment that we’ll store in the Netlify dashboard, let’s install &lt;code&gt;dotenv&lt;/code&gt; so we can still do some local development. While we’re at it, we’ll also install &lt;code&gt;node-fetch&lt;/code&gt;, which we can use to make browser-style fetch requests from our function&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; dotenv node-fetch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We’ll create a file called &lt;code&gt;.env&lt;/code&gt; in the root directory of our project. Inside that file, we’ll add our requisite environment variables.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SPOTIFY_CLIENT_ID=e8d7bf1a8ada357a77e4ca85aa7d04c0
SPOTIFY_CLIENT_SECRET=8ae32502d01aa2b579045df049aeb669
SPOTIFY_REFRESH_TOKEN=AQC2kGL-HJ6QgonZju7rDTikEU5_g_F...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;⚠️ Don’t ever commit this file! It is now full of great and terrible secrets, and should be hidden from mortal eyes. ⚠️&lt;/p&gt;
&lt;p&gt;Instead, when you deploy your site to Netlify, you’ll add these variables to the Build &amp;amp; Deploy &amp;gt; Environment section in your Netlify dashboard:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-400w.webp 400w, https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-800w.webp 800w, https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-1400w.webp 1400w, https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-1610w.webp 1610w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-400w.jpeg&quot; alt=&quot;A screenshot of the Netlify dashboard, and specifically the environment variables section.&quot; width=&quot;1610&quot; height=&quot;928&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-400w.jpeg 400w, https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-800w.jpeg 800w, https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-1400w.jpeg 1400w, https://henry.codes/writing/spotify-now-playing/netlify-dashboard-environment_lbqom6-1610w.jpeg 1610w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;creating-another-netlify-function&quot; tabindex=&quot;-1&quot;&gt;Creating Another Netlify Function&lt;/h3&gt;
&lt;p&gt;Let’s create a new file in our &lt;code&gt;functions&lt;/code&gt; directory — I called mine &lt;code&gt;spotify.js&lt;/code&gt; but whatever works for you is gonna be perfect.&lt;/p&gt;
&lt;p&gt;At the top of the file, we’ll &lt;code&gt;require()&lt;/code&gt; the dependencies we need and initialize our &lt;code&gt;dotenv&lt;/code&gt; configuration so our function is aware of that &lt;code&gt;.env&lt;/code&gt; file. We’ll also add the basic async wrapper for a Netlify function:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;node-fetch&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dotenv &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dotenv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
dotenv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

exports&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// logic and ✨ magic ✨ will go here...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;fetching-authorization-from-the-spotify-api&quot; tabindex=&quot;-1&quot;&gt;Fetching Authorization From the Spotify API&lt;/h3&gt;
&lt;p&gt;Because we don’t have a system for managing authorization timeout and refresh tokens, we’ll need to get an access token from the API every time we request it.&lt;/p&gt;
&lt;p&gt;We can do that by setting up basically the same request we did in Postman, but in JavaScript — and this time, instead of an authorization code grant, it’s a refresh token grant. We’ll add this JS to our function:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;exports&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// Get the refresh token we stored as an environment variable&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; refreshToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SPOTIFY_REFRESH_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Do the base64 encoding we did earlier but with Node tools&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; auth &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SPOTIFY_CLIENT_ID&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SPOTIFY_CLIENT_SECRET&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;base64&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Store the Spotify API endpoint for readability&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; tokenEndpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://accounts.spotify.com/api/token&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Basic &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;auth&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;application/x-www-form-urlencoded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;grant_type=refresh_token&amp;amp;refresh_token=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;refreshToken&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;amp;redirect_uri=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encodeURI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/.netlify/functions/callback&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, we can asynchronously declare a variable &lt;code&gt;accessToken&lt;/code&gt; that, once we’ve received it, we’ll use to actually query the API. After the options object, we’ll add the actual request.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; accessToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tokenEndpoint&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;access_token&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information on the way fetch works, check out &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch&quot;&gt;the MDN article on this bad boy&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;fetching-the-most-recent-song&quot; tabindex=&quot;-1&quot;&gt;Fetching The Most Recent Song&lt;/h3&gt;
&lt;p&gt;Now we can make our actual request to the Spotify API. We’ll start by adding a variable to track the endpoint we have to hit (I grabbed this from &lt;a href=&quot;https://developer.spotify.com/documentation/web-api/reference/&quot;&gt;the Spotify API reference&lt;/a&gt;). I added this right after the &lt;code&gt;const tokenEndpoint&lt;/code&gt; we declared earlier:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; playerEndpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://api.spotify.com/v1/me/player/recently-played&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, we can return the results of a &lt;code&gt;fetch&lt;/code&gt; call to the API:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// That `?limit=1` part is because I only want the API to return a single song.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;playerEndpoint&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;?limit=1&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;GET&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Bearer &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;accessToken&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// transform the results here.&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is almost ready to test and adjust — but first, to make this a real Netlify function, we need to return an object that contains a &lt;code&gt;statusCode&lt;/code&gt; and &lt;code&gt;body&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// transform the results here&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;statusCode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hell yes, brother. Excellent work.&lt;/p&gt;
&lt;p&gt;As long as we didn’t stop our Netlify Dev server, we ought to be able to go to &lt;code&gt;http://localhost:8888/.netlify/functions/spotify&lt;/code&gt; in our browser and see a big dump of Spotify’s response to our request.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-400w.webp 400w, https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-800w.webp 800w, https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-1400w.webp 1400w, https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-2318w.webp 2318w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-400w.jpeg&quot; alt=&quot;A screenshot of the large JSON block that Spotify responds to our request with.&quot; width=&quot;2318&quot; height=&quot;816&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-400w.jpeg 400w, https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-800w.jpeg 800w, https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-1400w.jpeg 1400w, https://henry.codes/writing/spotify-now-playing/spotify-dump_h5zazv-2318w.jpeg 2318w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;data-cleanup&quot; tabindex=&quot;-1&quot;&gt;Data Cleanup&lt;/h3&gt;
&lt;p&gt;For my purposes, I needed the song URL, the artists, the song title, and maybe the album art, so I did a little data massaging:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Start by destructuring the items from the json response&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; items &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// Let&#39;s do a little more destructuring assignment to take only what we need from the response&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;artists&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; artistsArray&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;external_urls&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; urls&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    album&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;track&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// We want to keep the array of artists in case there&#39;s a track feature, etc.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; simplifiedArtists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; artistsArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;artist&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; artist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; artist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Lastly, make the url/artwork references more specific&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; trackUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; urls&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spotify&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; artworkUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; album&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;images&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// And then return a stringified object that contains all the data we want to render!&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;statusCode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;artists&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; simplifiedArtists&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      trackUrl&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      artworkUrl&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s all we need to do! Refreshing the localhost URL of the function should give us a JSON string that only contains the data we need. Depending on how you want to use this data, you can be done here, or keep reading to learn how to render this data to the browser.&lt;/p&gt;
&lt;h2 id=&quot;rendering-the-spotify-response-to-html&quot; tabindex=&quot;-1&quot;&gt;Rendering The Spotify Response to HTML&lt;/h2&gt;
&lt;p&gt;If we had some sort of server-side build task, we’d make a request to the function in that build, but in this case, we’re going to make the request client-side.&lt;/p&gt;
&lt;p&gt;In our &lt;code&gt;src&lt;/code&gt; directory, let’s make an &lt;code&gt;index.js&lt;/code&gt; file and link that file in our HTML. In this step, we’ll also add a template that we’ll render data to:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello world!&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;My most recent listening on Spotify:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;spotify&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, we’ll add some code in that &lt;code&gt;index.js&lt;/code&gt; file to hit the Netlify Function endpoint we created:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/.netlify/functions/spotify&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Accessing our project via the Netlify Dev localhost URL ought to show us the results of that in the console:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-400w.webp 400w, https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-800w.webp 800w, https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-1400w.webp 1400w, https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-1904w.webp 1904w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-400w.jpeg&quot; alt=&quot;A screenshot of the console.log&#39;d results of our Netlify Function query.&quot; width=&quot;1904&quot; height=&quot;162&quot; srcset=&quot;https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-400w.jpeg 400w, https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-800w.jpeg 800w, https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-1400w.jpeg 1400w, https://henry.codes/writing/spotify-now-playing/consolelog-results_jrrfam-1904w.jpeg 1904w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;EZ.&lt;/p&gt;
&lt;p&gt;All that remains is templating that data and injecting it into our HTML!&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;This, obviously doesn’t adhere to best practices of progressive enhancement. This page should work even if client-side JavaScript fails, but for the sake of this demo and tutorial, we’ll accept a half-finished solution.&lt;/p&gt;
&lt;p&gt;Here’s my final &lt;code&gt;index.js&lt;/code&gt; file, which uses some template literals and destructuring assignment to shape the data exactly how we want.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; spotifyWrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.spotify&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;artistTemplate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;artistObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;a href=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;artistObject&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;artistObject&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/.netlify/functions/spotify&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; trackUrl&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; artists&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; artworkUrl &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    spotifyWrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;div class=&quot;song&quot;&gt;
            &amp;lt;a href=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;trackUrl&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
            &amp;lt;/a&gt;
        &amp;lt;/div&gt;
        &amp;lt;div class=&quot;artists&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;artists
          &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;artist&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;artistTemplate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;artist&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;, &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/div&gt;
        &amp;lt;img class=&quot;artwork&quot; src=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;artworkUrl&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So thanks for reading, I hope this was super cute and fun and helpful. I love Netlify Functions, they make Lambda/serverless tasks really accessible — especially as I’m not personally much of a back-end developer. If you have any issues, questions, comments, concerns, or professions of love and/or eternal hatred, [get at me on Bluesky]({{ ‘bluesky’ | getSocialUrl(social) }}). I’m happy to update this post at any point to go into more detail about specific aspects, so please def reach out!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The code for this tutorial can be found &lt;a href=&quot;https://github.com/xdesro/spotify-widget&quot;&gt;here on my GitHub page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A live version of the site is deployed with Netlify &lt;a href=&quot;https://spotify-widget-netlify-functions.netlify.app&quot;&gt;right here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;colophon&quot; tabindex=&quot;-1&quot;&gt;Colophon&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Photo by &lt;a href=&quot;https://unsplash.com/@dylanleagh?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Dylan Leagh&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Sat, 12 Dec 2020 16:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/spotify-now-playing/</guid>
</item>
<item>
    <title>Naming variables in style code</title>
    <link>https://henry.codes/writing/naming-variables-in-style-code/</link>
    <description>&lt;p&gt;This morning, the atomic design &lt;abbr title=&quot;greatest of all time&quot;&gt;GOAT&lt;/abbr&gt; &lt;a href=&quot;https://bradfrost.com&quot;&gt;Brad Frost&lt;/a&gt; Tweeted a question about variable naming for colors:&lt;/p&gt;
&lt;embed-twitter author=&quot;Brad Frost (@brad_frost)&quot; permalink=&quot;https://twitter.com/brad_frost/status/1337078734411722759&quot; date=&quot;December 10, 2020&quot;&gt;
    Here’s a fun one: what variable name would you define for `rgba(0,0,0,0.9);`?
&lt;/embed-twitter&gt;
&lt;p&gt;I drafted up a Tweet to answer this, but it ended up being closer to five Tweets, so I figured it might just work better for me to do a tiny blog post instead of a big, noisy thread.&lt;/p&gt;
&lt;h2 id=&quot;strategy&quot; tabindex=&quot;-1&quot;&gt;Strategy&lt;/h2&gt;
&lt;p&gt;This might seem overwrought, but I actually like to name my variables twice: once to tokenize and once to contextualize. I’ll use Mr. Frost’s example of &lt;code&gt;rgba(0,0,0,0.9)&lt;/code&gt; to explain what I mean. Honestly, when he Tweeted about this, he was probably only looking for the first “tokenize” step, but I’ve already written most of this post, and it’s too late to turn back now.&lt;/p&gt;
&lt;h2 id=&quot;tokenize&quot; tabindex=&quot;-1&quot;&gt;Tokenize&lt;/h2&gt;
&lt;p&gt;First off, I want to prevent unnecessary variation of color implementation in my style code. Different developers might represent this color as an RGBA function, an 8-digit hex (#000000E6), an HSLA function (0, 0%, 0%, .9), etc. They might also eyedrop sample the color out of a design tool and come up with something just different enough to introduce inconsistencies (lookin’ at you, &lt;code&gt;rgba(0,0,0, .89)&lt;/code&gt;). Tokenization gives us a clarified and sanitized way to provide colors to developers implementing design.&lt;/p&gt;
&lt;p&gt;With monochrome colors, I try to stay away from descriptive color keywords—we’ve all seen some cursed variation on the &lt;code&gt;$lightishGrayButLighter&lt;/code&gt; naming scheme. I prefer instead to sort my mono palette by each shade’s lightness. This makes it easy to see at a glance that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A color is some form of gray, and&lt;/li&gt;
&lt;li&gt;It is very much lighter or darker than another form of gray.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I use an HSL-style representation of that lightness, purely because the mental model of “0 = black, 100 = white” is way more straightforward for me to parse at a glance than “0 = black, 255 = white.”&lt;/p&gt;
&lt;p&gt;The last consideration for tokenization is an alpha value—since both &lt;code&gt;rgba(0,0,0,0)&lt;/code&gt; and &lt;code&gt;rgba(0,0,0,.9)&lt;/code&gt; technically have the same lightness value, we need some distinction between them.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// designate a monochrome namespace with $mono, then a lightness value, then an alpha value.&lt;/span&gt;

&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$mono--0-90&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.9&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;editors-note&quot;&gt;The pseudo-almost-kindasorta-BEM-like namespacing technique is something I learned from &lt;a href=&quot;https://twitter.com/StuRobson&quot;&gt;Stuart Robson&lt;/a&gt;, who’s solved &lt;a href=&quot;https://twitter.com/StuRobson/status/1051451912707563525&quot;&gt;this specific design systems problem&lt;/a&gt; a thousand times and whose writing on design systems is incredibly valuable. Depending on your preference, you might also namespace color variables with something like &lt;code&gt;$color__mono--0-90&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If we have many of these in our system, it’ll start to look like we’ve got ourselves a stew going.&lt;/p&gt;
&lt;h4 id=&quot;aside&quot; tabindex=&quot;-1&quot;&gt;Aside&lt;/h4&gt;
&lt;p&gt;The cool part of the mono palette concept is that it can be used even your grays aren’t pure &lt;code&gt;rgba(x, x, x, alpha)&lt;/code&gt; shades. Here’s an example where the colors aren’t literally monochrome, but still represent a monochromatic palette:&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--mono-14&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;32&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 37&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 39&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--mono-35&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;93&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 88&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 86&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--mono-49&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;129&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 123&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 121&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--mono-66&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;172&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 167&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 165&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--mono-86&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;223&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 218&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 216&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--mono-90&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;230&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 230&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 230&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-400w.webp 400w, https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-800w.webp 800w, https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-1400w.webp 1400w, https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-1708w.webp 1708w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-400w.jpeg&quot; alt=&quot;A palette of six swatches, which are not purely gray but appear monochrome side-by-side.&quot; width=&quot;1708&quot; height=&quot;322&quot; srcset=&quot;https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-400w.jpeg 400w, https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-800w.jpeg 800w, https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-1400w.jpeg 1400w, https://henry.codes/writing/naming-variables-in-style-code/monochrome-palette_si1lb3-1708w.jpeg 1708w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;contextualize&quot; tabindex=&quot;-1&quot;&gt;Contextualize&lt;/h2&gt;
&lt;p&gt;Now that we’ve tokenized our colors to protect them from accidental variation and allow for easy reuse within the app, we’ll contextualize our variables for global or component use. We don’t use the pure &lt;code&gt;$mono--0-90&lt;/code&gt; variable in a CSS declaration, because if the design calls for a change to border colors, for example, you’d have to change that instance in every location, which in my opinion defeats the purpose.&lt;/p&gt;
&lt;p&gt;Instead, we’ll come up with a purpose for the color in the context of the app or website. What function does the color actually serve? A semi-opaque off-black color could be a lot of things, maybe a &lt;code&gt;$theme-color--text&lt;/code&gt; or &lt;code&gt;$theme-color--border&lt;/code&gt;. This is a really important consideration, because it makes your color system palette-agnostic. That is, no matter what the colors change to over the life of the system, an element that has &lt;code&gt;color: $theme-color--text;&lt;/code&gt; will never need to change. I love hydrating themes with palettes in this way; it feels really systematic and logical. Decoupling. Unbundling. Synergizing.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Anyway, thanks for reading. I know this is a short one but I figured better this than 30 Tweets. I would love to hear what you think about this strategy, why your approach is better, why I’ll never amount to half the developer that you are, etc.—get at me on Bluesky &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;@strange.website&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;colophon&quot; tabindex=&quot;-1&quot;&gt;Colophon&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Graciously edited by &lt;em&gt;the&lt;/em&gt; &lt;a href=&quot;https://shiflett.org/&quot;&gt;Chris Shiflett&lt;/a&gt;, and written according to the &lt;a href=&quot;https://faculty.com/standards/style-guide&quot;&gt;Faculty Style Guide&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Thu, 10 Dec 2020 20:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/naming-variables-in-style-code/</guid>
</item>
<item>
    <title>Headless CMS solutions that aren’t Statamic (lol)</title>
    <link>https://henry.codes/writing/headless-cms-solutions-that-arent-statamic-lol/</link>
    <description>&lt;aside class=&quot;editors-note&quot;&gt;
  Inspiration and research assistance for this article was extremely graciously provided by &lt;a href=&quot;https://david.darn.es/&quot;&gt;David Darnes&lt;/a&gt;, &lt;a href=&quot;https://robbowen.digital/&quot;&gt;Robb Owen&lt;/a&gt;, and &lt;a href=&quot;https://hankchizljaw.com/&quot;&gt;Andy Bell&lt;/a&gt;. They&amp;#39;re good, grounded folks who care about the right things.
&lt;/aside&gt;
&lt;p&gt;So as it turns out, the guy who made Statamic has decided to publicize his extremely unfortunate views that controlling womens’ bodies is the most important thing to him in this election, over keeping families together, over immigrant lives, over Black lives, over queer lives.&lt;/p&gt;
&lt;p&gt;He’s written—and I’m not linking the post here because I believe in deoxygenating these sort of views when possible—that he fears being &lt;em&gt;canceled&lt;/em&gt; or losing support for his business Statamic over expressing his bigoted and narrow-minded views. Oh gosh, oh no. I don’t necessarily believe in “canceling” so much as I believe in folks’ ability to hold others accountable for the stupid shit they blog, with their money or any other resources — If that’s canceling, let’s rumble.&lt;/p&gt;
&lt;p&gt;TL;DR? Statamic is run by a jerk and I’d love to recommend y’all some alternatives in case you’re using it or considering it and want to course-correct.&lt;/p&gt;
&lt;h2 id=&quot;path-of-least-resistance&quot; tabindex=&quot;-1&quot;&gt;Path of least resistance&lt;/h2&gt;
&lt;p&gt;If you’re looking for another PHP CMS with a configurable UI, your best bets are gonna be either Kirby or Craft:&lt;/p&gt;
&lt;h3 id=&quot;kirby-cms&quot; tabindex=&quot;-1&quot;&gt;Kirby CMS&lt;/h3&gt;
&lt;p&gt;Kirby is super well-featured and well-liked, but let me quickly list off its similarities to Statamic if you’re looking for feature parity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Powered by PHP&lt;/li&gt;
&lt;li&gt;✅ Works as both a full CMS or just a headless solution.&lt;/li&gt;
&lt;li&gt;✅ Self-hosting option&lt;/li&gt;
&lt;li&gt;✅ Configurable UI&lt;/li&gt;
&lt;li&gt;✅ Version controllable&lt;/li&gt;
&lt;li&gt;✅ Drafting and previews&lt;/li&gt;
&lt;li&gt;✅ Custom fields and content modeling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kirby also has a vibrant community, flat-file structure, a really sick customizable Vue UI kit, Markdown support, internationalization support, and it lets you integrate additional data sources.&lt;/p&gt;
&lt;p&gt;Additionally, Bastian Allgeier, the founder of Kirby, &lt;a href=&quot;https://bastianallgeier.com/notes/train-of-thought&quot;&gt;has written&lt;/a&gt; on &lt;a href=&quot;https://bastianallgeier.com/notes/denial&quot;&gt;more than one occasion&lt;/a&gt; about the climate crisis and his personal efforts to fight it, which I mention because Statamic Guy has decided climate change is not of interest to him when compared to controlling women.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://getkirby.com&quot;&gt;Check out Kirby&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;craft-cms&quot; tabindex=&quot;-1&quot;&gt;Craft CMS&lt;/h3&gt;
&lt;p&gt;Craft is a hugely popular tool, and loved by all kinds of agencies, small businesses, and professionals. Same deal here, let’s talk about some similarities to Statamic and some differences.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Powered by PHP&lt;/li&gt;
&lt;li&gt;✅ Works as both a full CMS or just a headless solution.&lt;/li&gt;
&lt;li&gt;✅ Tons of content types and custom field features&lt;/li&gt;
&lt;li&gt;✅ Configurable Dashboard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Craft also has localization support out of the box, some really good user management tools, and even a built-in image editor tool that allows you to set focal points and cropping, for better image rendering in different contexts. They also have an entire eCommerce solution that works side-by-side with their content manager so your online selling team only has to work with one platform.&lt;/p&gt;
&lt;p&gt;It’s worth also mentioning that the Craft team sponsors diversity scholarships and conferences — that prioritization of diverse communities is something missing from Statamic, whose founder believes Black lives and the lives of queer folks and non-men are worth less than his right to legislate women’s bodies.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://craftcms.com/&quot;&gt;Check out Craft CMS&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;additional-alternatives&quot; tabindex=&quot;-1&quot;&gt;Additional alternatives&lt;/h2&gt;
&lt;p&gt;I’ve had excellent experiences with a lot of these headless CMS tools. The Jamstack conf team has put together &lt;a href=&quot;https://jamstack.org/headless-cms/&quot;&gt;this very good list of headless CMS options&lt;/a&gt;, and I have my own personal recommendations:&lt;/p&gt;
&lt;h3 id=&quot;netlify-cms&quot; tabindex=&quot;-1&quot;&gt;Netlify CMS&lt;/h3&gt;
&lt;p&gt;It’s a single flat file you add to your site that manages flat files in Git with a configurable UI, it’s free, it’s open source, it’s powered by Netlify. Its power lies in its simplicity. I’ve used this tool for a couple different projects with small businesses and otherwise, and it really serves a surprising amount of needs. The community is great, too, and they’ve written guides for getting you started with most front-end solutions. It’s purely headless but a great solution for rapidly converting static projects to dynamic content.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.netlifycms.org/&quot;&gt;Check out Netlify CMS&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;contentful&quot; tabindex=&quot;-1&quot;&gt;Contentful&lt;/h3&gt;
&lt;p&gt;This blog post was written with Contentful — it’s one of my favorite headless CMS solutions. Contentful is language/framework agnostic, though they provide a bunch of tooling for common integrations. You edit content and content-modeling in your configurable dashboard and it is served through a very flexible RESTful API. They also do a bunch of behind-the-scenes asset/CDN/caching optimization. Big recommend for small teams.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.contentful.com&quot;&gt;Check out Contentful&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;questions-or-concerns&quot; tabindex=&quot;-1&quot;&gt;Questions or concerns?&lt;/h2&gt;
&lt;p&gt;If you’re a DJT supporter or you still think this is a matter of regular old red-v-blue politics, I would love to hear your opinion, feel free to email me at &lt;a href=&quot;mailto:xn--cz8h&quot;&gt;lmfao@henry.codes&lt;/a&gt;. If you have other corrections or questions for this post, &lt;a href=&quot;https://twitter.com/messages/compose?recipient_id=2509306208&quot;&gt;get at me on Twitter&lt;/a&gt;, I’m most responsive on there.&lt;/p&gt;
&lt;h3 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Craft CMS is based on Yii, not Laravel as previously mentioned. &lt;abbr title=&quot;hat tip&quot;&gt;H/T&lt;/abbr&gt; &lt;a href=&quot;https://twitter.com/iainmbean&quot;&gt;Iain Bean&lt;/a&gt; for the correction.&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Tue, 03 Nov 2020 22:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/headless-cms-solutions-that-arent-statamic-lol/</guid>
</item>
<item>
    <title>How to convert variable TTF font files to WOFF2</title>
    <link>https://henry.codes/writing/how-to-convert-variable-ttf-font-files-to-woff2/</link>
    <description>&lt;h2 id=&quot;impetus&quot; tabindex=&quot;-1&quot;&gt;Impetus&lt;/h2&gt;
&lt;p&gt;I’ve been working on a project lately that requires the loading of many, many webfonts. For the main UI font alone, we needed to download over 980&lt;abbr title=&quot;kilobytes&quot;&gt;kB&lt;/abbr&gt; of WOFF and WOFF2 files. As it happened, the client eventually developed a variable font version of the UI face, which was a much smaller 225kB file.&lt;/p&gt;
&lt;p&gt;However, when I received the variable font file, I realized it was a TTF, and not the WOFF2 that I would need to implement it in a &lt;code&gt;@font-face&lt;/code&gt; declaration for web. In previous experience, converting variable TTF to WOFF via online tools like convert.io or FontSquirrel would often break the axes needed to interpolate between font variation settings.&lt;/p&gt;
&lt;p&gt;A cursory search yielded Google’s &lt;a href=&quot;https://github.com/google/woff2&quot;&gt;woff2 library&lt;/a&gt;, a tool for compressing TTF to WOFF2 — it worked perfectly. Here’s how to do the thing.&lt;/p&gt;
&lt;h2 id=&quot;installing-the-library&quot; tabindex=&quot;-1&quot;&gt;Installing the library&lt;/h2&gt;
&lt;p&gt;This is covered in &lt;code&gt;woff2&lt;/code&gt;’s README file, but we’ll go over each step here in a little more depth, so it’s clear what’s going on.&lt;/p&gt;
&lt;h3 id=&quot;clone-woff2-locally&quot; tabindex=&quot;-1&quot;&gt;Clone woff2 locally&lt;/h3&gt;
&lt;p&gt;Open a terminal and &lt;code&gt;cd&lt;/code&gt; into whichever directory. This doesn’t need to be installed in a specific place, just remember where you’re putting it. For this tutorial, I’m going to clone it into my &lt;code&gt;~/Sites&lt;/code&gt; directory.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/Sites
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;--recursive&lt;/span&gt; https://github.com/google/woff2.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; woff2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, we entered the correct directory, cloned the repo recursively, and entered the cloned directory. &lt;code&gt;woff2&lt;/code&gt; uses the Brotli compression library as a dependency, so you need the &lt;code&gt;--recursive&lt;/code&gt; flag to clone everything inside this repo.&lt;/p&gt;
&lt;h3 id=&quot;build-woff2&quot; tabindex=&quot;-1&quot;&gt;Build woff2&lt;/h3&gt;
&lt;p&gt;Next, we’ll run a command to build the library and its dependencies, which will create the scripts we’ll need.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;woff2&lt;/code&gt; directory:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; clean all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If there were no errors, we should be good to go! (If there &lt;em&gt;were&lt;/em&gt; errors, get at me &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;via email&lt;/a&gt; or &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;on Bluesky&lt;/a&gt;) and we’ll debug through so it so I can update this blog post with troubleshooting steps.&lt;/p&gt;
&lt;h2 id=&quot;converting-the-ttf&quot; tabindex=&quot;-1&quot;&gt;Converting the &lt;code&gt;.TTF&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Now that we’ve created the binary scripts for compressing and decompressing TTF into WOFF, we can run them here. In this example, I’ve downloaded the variable TTF to my &lt;code&gt;~/Downloads&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;woff2&lt;/code&gt; directory:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;./woff2_compress ~/Downloads/variable-font.ttf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ll get some output like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Processing /Users/henry/Downloads/variable-font.ttf =&amp;gt; /Users/henry/Downloads/variable-font.woff2
Compressed 216568 to 94577.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And voilà, we’ve got a variable WOFF2 file, ready for use on the web.&lt;/p&gt;
&lt;p&gt;Thanks for taking the time to read this. If you’ve got any questions or concerns, please &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;reach out and touch faith&lt;/a&gt; and we’ll work through it together! Have a great day.&lt;/p&gt;
</description>
    <pubDate>Thu, 09 Jan 2020 19:30:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-to-convert-variable-ttf-font-files-to-woff2/</guid>
</item>
<item>
    <title>2019: Year in review</title>
    <link>https://henry.codes/writing/2019-year-in-review/</link>
    <description>&lt;h2 id=&quot;introduction&quot; tabindex=&quot;-1&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This time last year, I Tweeted out some goals for the New Year.&lt;/p&gt;
&lt;embed-twitter author=&quot;@404boyfriend&quot; permalink=&quot;https://twitter.com/404boyfriend/status/1079830658946555907&quot; date=&quot;December 31, 2018&quot;&gt;
    🗣️ Speak about CSS at a conference or school
&lt;p&gt;🎓 Take a class a month&lt;/p&gt;
&lt;p&gt;📚 Read a book a month&lt;/p&gt;
&lt;p&gt;✈️ Go back to SF, go back to Europe&lt;/p&gt;
&lt;p&gt;💵 Save enough to buy a house&lt;/p&gt;
&lt;p&gt;Bring it tf on, 2019.
&lt;/p&gt;&lt;/embed-twitter&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I was determined and inspired by a strong career year, financial independence earned by selling my car, and the sense of indomitability and self-confidence that comes with healing after a breakup.&lt;/p&gt;
&lt;p&gt;I set some goals that I felt were extremely achievable (like reading a book a month), and some that were much loftier (going to Europe, save enough to buy a house).&lt;/p&gt;
&lt;p&gt;I missed the mark on nearly all of them.&lt;/p&gt;
&lt;p&gt;Now, in the last few days of the year, I’d like to reflect on how and why I failed to meet these goals, and how I plan to estimate and execute better in 2020.&lt;/p&gt;
&lt;h3 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;Tl;dr&lt;/h3&gt;
&lt;p&gt;I slipped super hard on meeting my goals for last year, mostly because I wasn’t good at focusing and using my time usefully. I’m setting goals for 2020 that I feel are meaningful to me, achievable, and that I can be proud of by the end of the year.&lt;/p&gt;
&lt;h2 id=&quot;reflection&quot; tabindex=&quot;-1&quot;&gt;Reflection&lt;/h2&gt;
&lt;p&gt;I didn’t actually fumble 100% of my goals, so I’ll kick this off with a positive.&lt;/p&gt;
&lt;h3 id=&quot;return-to-san-francisco&quot; tabindex=&quot;-1&quot;&gt;🌉 Return to San Francisco ✅&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Smashed it&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I spent a week or so in May in hotels in Japantown and the Financial District. My former employer sent me to attend the &lt;a href=&quot;https://www.awwwards.com/conference-san-francisco-2019/&quot;&gt;AwwwardsConf&lt;/a&gt; in—yes, indeed—&lt;s&gt;sunny&lt;/s&gt; foggy San Francisco.&lt;/p&gt;
&lt;p&gt;At the time, I was up to my knees in the development of a design system and design operations processes for the team. Since most of the AwwwardsConference talks were about design systems,it was a fairly straightforward value prop, and let me knock one goal off the list.&lt;/p&gt;
&lt;p&gt;The first half of my trip was for AwwwardsConf , where I had the pleasure and privilege of listening to talks by &lt;a href=&quot;https://www.omayeli.com/&quot;&gt;Omayeli Arenyeka&lt;/a&gt;, &lt;a href=&quot;https://www.alexcornell.com/&quot;&gt;Alex Cornell&lt;/a&gt;, &lt;a href=&quot;https://guglieri.com/&quot;&gt;Claudio Guglieri&lt;/a&gt; and more. I made friends from Finland, DC and San Diego. I managed to get into an amazing workshop on machine learning led by &lt;a href=&quot;https://www.pedromarques.io/&quot;&gt;Pedro Marques&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/jvb_nl?lang=en&quot;&gt;Joël van Bodegraven&lt;/a&gt;. I could name drop all day (&lt;em&gt;I won’t&lt;/em&gt;) but it was a really fantastic trip for making friends and networking. I already can’t wait to go back (or at least make it to another AwwwardsConf).&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-400w.webp 400w, https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-800w.webp 800w, https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-1400w.webp 1400w, https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-3024w.webp 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-400w.jpeg&quot; alt=&quot;Me holding boba with the iconic Transamerica tower shown in the background.&quot; width=&quot;3024&quot; height=&quot;4032&quot; srcset=&quot;https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-400w.jpeg 400w, https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-800w.jpeg 800w, https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-1400w.jpeg 1400w, https://henry.codes/writing/2019-year-in-review/2019-05-11_12.32.58_1_csoxyz-3024w.jpeg 3024w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;speaking-at-a-conference-school&quot; tabindex=&quot;-1&quot;&gt;🗣️ Speaking at a conference/school ❌&lt;/h3&gt;
&lt;p&gt;If I’m being real, I just didn’t keep the fires stoked for this one.&lt;/p&gt;
&lt;p&gt;I sent a talk proposal on &lt;a href=&quot;https://codepen.io/xdesro/pen/MzKZrE&quot;&gt;making innovative CSS art using SVG filter primitives&lt;/a&gt; to CSSConf Budapest, but didn’t make the lineup, and didn’t really try after that. Speaking is a big time and labor investment upfront, and motivating myself to prioritize such an effort with potentially no payoff was a big challenge.&lt;/p&gt;
&lt;p&gt;I’m bringing this goal back in 2020. I’ve met some new connections that can help me engineer better talk proposals, and because my urge to teach and share has persisted, I feel confident I can get this one across the line in 2020.&lt;/p&gt;
&lt;h3 id=&quot;take-a-class-a-month-and-read-a-book-a-month&quot; tabindex=&quot;-1&quot;&gt;🎓 Take a class a month and 📚 Read a book a month ❌❌&lt;/h3&gt;
&lt;p&gt;Reading is super hard. I’m fully embarrassed to admit it, but I took the constant reading and analyzing cycle of academia for granted. It’s been a few years since I really invested in any long-form reading and I felt that in a big way. I was constantly distracted, usually by my phone, and often would realize I was just reading the words of the page individually instead of absorbing the information. It’s hard, and it’s hard to get better, and it’s hard to admit that I’m not really good at reading anymore.&lt;/p&gt;
&lt;p&gt;I will bring a desire to constantly learn and consume literature or other long-form reading into the new year, but I will leave the quantifiable “1 book a month”, “1 class a month” goal behind until reading feels more natural.&lt;/p&gt;
&lt;h3 id=&quot;go-back-to-europe&quot; tabindex=&quot;-1&quot;&gt;🛩 Go back to Europe ❌&lt;/h3&gt;
&lt;p&gt;I didn’t make it — I was mostly focused on saving for a house and eating out all the time. It wasn’t a huge priority and I don’t feel bad about slipping. Just didn’t shake out!&lt;/p&gt;
&lt;p&gt;I won’t add this one to the list again, mostly because it really just isn’t that meaningful to me that I make the trip, though if I did it’d be a free win: &lt;a href=&quot;https://faculty.com/&quot;&gt;The Faculty crew&lt;/a&gt; and I are headed to Nottingham, UK (&lt;em&gt;that’s still technically Europe these days, right?&lt;/em&gt;) in January 2020 for &lt;a href=&quot;https://newadventuresconf.com/2020/&quot;&gt;New Adventures conference&lt;/a&gt;. I’d love to make some friends while I’m out there, so &lt;a href=&quot;https://twitter.com/messages/2509306208-2509306208?recipient_id=2509306208&quot;&gt;reach out&lt;/a&gt; if I’ll see you there!&lt;/p&gt;
&lt;h3 id=&quot;save-enough-to-buy-a-house&quot; tabindex=&quot;-1&quot;&gt;💵 Save enough to buy a house 🆗&lt;/h3&gt;
&lt;p&gt;This was either a win or not, depending on how you look at it.&lt;/p&gt;
&lt;p&gt;In 2019, I got fully debt-free, cancelled the majority of my credit cards, shook myself loose of any loans I picked up erroneously in my slightly-earlier-twenties. That was a huge success. I still saved enough to buy a house, but probably not a house in Denver, where I’d like to be buying.&lt;/p&gt;
&lt;p&gt;I’ve been hemorrhaging money renting here, year after year, and it only gets worse as the months pass and Denver becomes a more popular destination. I could look at buying somewhere more affordable, but when I set this goal, I had Denver in mind, so that’s why I’m not calling this a win just yet.&lt;/p&gt;
&lt;h2 id=&quot;post-mortem&quot; tabindex=&quot;-1&quot;&gt;Post-mortem&lt;/h2&gt;
&lt;p&gt;Overwhelmingly, I feel like 2019 was largely unfocused and middling. I have always felt compelled to do all kinds of things, but the aimless splashing around in learning Cinema4D, WebGL, Italian, whatever, hasn’t made me feel like more of a Renaissance person. I feel like I know a little about a lot, and unfortunately, that “little” tends to translate to “slightly-less-than-enough to be dangerous”.
It’s not all bad. I definitely let myself down, but in doing so I’ve gained a more careful understanding of some tenets I need to be stronger — that’s &lt;strong&gt;focus&lt;/strong&gt;, &lt;strong&gt;deliberation&lt;/strong&gt;, and &lt;strong&gt;meaningful action&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-400w.webp 400w, https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-800w.webp 800w, https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-1400w.webp 1400w, https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-2991w.webp 2991w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-400w.jpeg&quot; alt=&quot;Focus, deliberation, meaningful action.&quot; width=&quot;2991&quot; height=&quot;4113&quot; srcset=&quot;https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-400w.jpeg 400w, https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-800w.jpeg 800w, https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-1400w.jpeg 1400w, https://henry.codes/writing/2019-year-in-review/keybase-case-01_u8dzea-2991w.jpeg 2991w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Scrolling through Twitter without purpose, shitposting in nigh-silent groupchats, watching mediocre content on Netflix — I’m doing a lot of things for no reason, and with no benefit to my sense of self.&lt;/p&gt;
&lt;p&gt;Additionally, with goals like “save enough to buy a house”, it’s a little too wide-open and not specific enough to know whether I actually hit the mark or not, and leaving it up to a subjective &lt;em&gt;do-I-feel-like-I-did-it&lt;/em&gt; means it becomes a matter of mood.&lt;/p&gt;
&lt;p&gt;I want to forgive myself for a slow and unintentional year and set useful, achievable yet challenging and quantifiable goals for 2020.&lt;/p&gt;
&lt;h2 id=&quot;goals-for-2020&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://henry.codes/writing/2019-year-in-review/#goals-for-2020&quot; class=&quot;header-anchor&quot; id=&quot;goals-for-2020&quot;&gt;&lt;/a&gt; Goals For 2020&lt;/h2&gt;
&lt;p&gt;Without further ado, here’s the plan for doing 2020 focused, deliberately, and mindfully:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗣️ Speak about creative web at a conference or school&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like I said, still on the list. I’ve got some ideas for talks but I will spend intentional time to craft at least two fully-fleshed-out proposals I can send off to as many CFPs as possible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;💵 Save $60,000 for a down payment on a home&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;“Save enough to buy a house” part two, electric boogaloo. This is a very strict success metric and I’ll either hit it or I won’t.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎓 &lt;strong&gt;Enroll in formal further education for computer science, mathematics, or creative computing.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When attempting to learn WebGL or invest more in creative technology, I find my lack of understanding of mathematical concepts as basic as geometry are a huge hindrance. I’ve tried to relearn these concepts (oh, if my high school self could see me now), but I feel that a formal re-education will be a lot more effective for my learning style, as well as providing professional development lift. Plus it’ll make my mom happy 😉.&lt;/p&gt;
&lt;h3 id=&quot;an-additional-goal&quot; tabindex=&quot;-1&quot;&gt;An additional goal&lt;/h3&gt;
&lt;p&gt;This one isn’t really quantifiable, it’s just an ethical tenet I’d like to take on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🥀 &lt;strong&gt;Minimize use of “gig economy”, hyper-convenience, and subscription services.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Companies like Lyft, Uber, Doordash, Instacart, etc, have all proven themselves uninterested in serving their labor force ethically, and there’s a full clip of additional reasons these companies don’t deserve my (your) patronage. Instead of rideshare, I’ll be riding my bike a lot more. I can get virtually everywhere and everything I could need within an hour ride of my apartment. Taking Lyfts and Doordashing are the result of a lack of intention, motivation, or preparation.&lt;/p&gt;
&lt;p&gt;Second, Amazon is like…inarguably evil, so I’ll be doing my best to patronize local booksellers, craft stores, and so on, instead of defaulting to the path of least resistance.&lt;/p&gt;
&lt;p&gt;Lastly, streaming video and other subscription services burn a hole in my pocket and encourage me to waste my time. As much as possible, I will choose buy-to-own products and non-subscription alternatives.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Thanks for taking the time to read. This was a slow year for me, but I still made some leaps and bounds and I’m eager to keep that momentum in 2020. I normally blog about creative web development, and share a lot of cool content &lt;a href=&quot;https://bsky.app/profile/strange.website&quot;&gt;on Bluesky&lt;/a&gt;. Say hi if you get the chance!&lt;/p&gt;
</description>
    <pubDate>Mon, 30 Dec 2019 17:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/2019-year-in-review/</guid>
</item>
<item>
    <title>Let’s talk about banning political ads on Twitter</title>
    <link>https://henry.codes/writing/lets-talk-about-banning-political-ads-on-twitter/</link>
    <description>&lt;p class=&quot;editors-note&quot;&gt;Before you get started, fair warning that this post has “takes”, some of which could be considered “hot”. This post is not about web development.&lt;/p&gt;
&lt;p&gt;So, Twitter recently stopped allowing political advertising.&lt;/p&gt;
&lt;embed-twitter author=&quot;jack 🌍🌏🌎 (@jack)&quot; url=&quot;https://twitter.com/jack/status/1189634360472829952&quot; date=&quot;October 30, 2019&quot;&gt;
&lt;div class=&quot;embed card embed--twitter&quot;&gt;
    &lt;div class=&quot;embed__header&quot;&gt;
        &lt;span class=&quot;embed__author&quot;&gt;jack 🌍🌏🌎 (@jack)&lt;/span&gt;
        &lt;time class=&quot;embed__date&quot;&gt;October 30, 2019&lt;/time&gt;
    &lt;/div&gt;
    &lt;blockquote&gt;
&lt;p&gt;We’ve made the decision to stop all political advertising on Twitter globally. We believe political message reach should be earned, not bought. Why? A few reasons…🧵&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;cite class=&quot;embed__footer&quot;&gt;
&lt;a href=&quot;https://twitter.com/jack/status/1189634360472829952&quot;&gt;Permalink&lt;/a&gt;
&lt;/cite&gt;&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/embed-twitter&gt;
&lt;p&gt;This, at first glance, sounds like a good thing — no more big money candidates paying big money for big money reach, no more “as president I promise to” in your TL. For a moment, I actually felt relieved by this announcement, but upon further inspection, I lost that faith. Stopping “all political advertising” is Bad, Actually™, and here are a few reasons why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the ban was explicitly imposed against &lt;em&gt;candidate ads&lt;/em&gt; alone (it’s not, and I’ll talk about that in a second), there’s a possibility it could be a good thing, for the above reasons. However, &lt;em&gt;the advertising budget for big money candidates still exists and will still be spent.&lt;/em&gt; Whether that’s on huge TV campaigns or billboards or subway signage, the advertising deluge will simply be redistributed, it won’t just go away. The big money messaging might even stay on Twitter, in the form of &lt;a href=&quot;https://www.adweek.com/digital/as-2020-election-nears-twitter-bots-have-only-gotten-better-at-seeming-human/&quot;&gt;fake accounts and bots&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Banning candidate ads is also bad for grassroots movements — plenty of small-budget candidates with really fantastic ideas have, in recent years, been enabled to run and build communities by affordable digital advertising on Twitter, &lt;em&gt;et al.&lt;/em&gt; &lt;em&gt;Grassroots candidates will no longer have access to the same reach&lt;/em&gt;, and by extension won’t be able to circulate their ideas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, candidates with lots of money, powered by corporate PACs, will continue to be very loud, and smaller-budget candidates will be forced to return to more traditional, outdated methods of community building.&lt;/p&gt;
&lt;p&gt;But there’s a more sinister side to this policy change, and that’s the really dangerous part of the whole thing: &lt;em&gt;The ban doesn’t just prohibit candidate ads.&lt;/em&gt;&lt;/p&gt;
&lt;embed-twitter author=&quot;jack 🌍🌏🌎 (@jack)&quot; url=&quot;https://twitter.com/jack/status/1189634372334280704&quot; date=&quot;October 30, 2019&quot;&gt;
&lt;div class=&quot;embed card embed--twitter&quot;&gt;
    &lt;div class=&quot;embed__header&quot;&gt;
        &lt;span class=&quot;embed__author&quot;&gt;jack 🌍🌏🌎 (@jack)&lt;/span&gt;
        &lt;time class=&quot;embed__date&quot;&gt;October 30, 2019&lt;/time&gt;
    &lt;/div&gt;
    &lt;blockquote&gt;
&lt;p&gt;We considered stopping only candidate ads, but issue ads present a way to circumvent. Additionally, it isn’t fair for everyone but candidates to buy ads for issues they want to push. So we’re stopping these too.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;cite class=&quot;embed__footer&quot;&gt;
&lt;a href=&quot;https://twitter.com/jack/status/1189634372334280704&quot;&gt;Permalink&lt;/a&gt;
&lt;/cite&gt;&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/embed-twitter&gt;
&lt;p&gt;&lt;em&gt;Here’s where this gets really dark.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This implies that &lt;em&gt;Twitter will now be deciding what defines a political issue.&lt;/em&gt; Based on Twitter’s stance on &lt;a href=&quot;https://www.vanityfair.com/news/2019/01/jack-dorsey-twitter-nazis-are-here-to-stay&quot;&gt;refusing to remove violent fascists from their platform&lt;/a&gt;, one could infer that “issues” like climate change, women’s safe access to healthcare, and other civil liberties will no longer be acceptable to advertise about.&lt;/p&gt;
&lt;p&gt;Further, marginalized groups that face unequaled oppression (on Twitter and every moment of every day IRL) like people of color and queer folks, are no longer able to advertise for their own safety, advocacy, and community-building. &lt;a href=&quot;https://www.hanawa.lt/&quot;&gt;John Hanawalt&lt;/a&gt; puts this exceptionally well:&lt;/p&gt;
&lt;embed-twitter author=&quot;J ☠️ H N (@H4N4W4LT))&quot; url=&quot;https://twitter.com/H4N4W4LT/status/1189712684075249664&quot; date=&quot;October 31, 2019&quot;&gt;
&lt;div class=&quot;embed card embed--twitter&quot;&gt;
    &lt;div class=&quot;embed__header&quot;&gt;
        &lt;span class=&quot;embed__author&quot;&gt;J ☠️ H N (@H4N4W4LT))&lt;/span&gt;
        &lt;time class=&quot;embed__date&quot;&gt;October 31, 2019&lt;/time&gt;
    &lt;/div&gt;
    &lt;blockquote&gt;
&lt;p&gt;Fair question a few things: blanket policies can only approach fairness when all else is equal. But all else isn’t equal. &lt;br&gt;&lt;br&gt;These communities will continue to face political attacks offline, and Twitter is limiting their ability to advocate for themselves by limiting paid reach.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;cite class=&quot;embed__footer&quot;&gt;
&lt;a href=&quot;https://twitter.com/H4N4W4LT/status/1189712684075249664&quot;&gt;Permalink&lt;/a&gt;
&lt;/cite&gt;&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/embed-twitter&gt;
&lt;p&gt;This is a classic pattern in “political” conversations — one side wants to take away the rights of a group of people, and litigate them out of validity and existence, and the other side just wants to exist, safely and equally. This is tagged as a partisan or political issue and the conversation gets elevated to mainstream discussion, instead of the correct outcome: The hate group is broken up and the marginalized community is granted the rights and protections they deserve as human beings.&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;It would be truly wonderful if good ol’ &lt;strong&gt;@jack&lt;/strong&gt; was actually acting in good faith (or even &lt;em&gt;informed&lt;/em&gt; faith) by banning political advertising. Unfortunately, this action on its own, without other motion to support and protect marginalized groups (literally just ban the TERFs and the nazis), is a violent action, masked as virtue signalling and progessive policy. Quieting all voices, when the humans behind those voices don’t have equal access to their own rights, isn’t equitable, it’s oppressive.&lt;/p&gt;
</description>
    <pubDate>Thu, 31 Oct 2019 18:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/lets-talk-about-banning-political-ads-on-twitter/</guid>
</item>
<item>
    <title>How to make an animated interactive vue.js slider</title>
    <link>https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/</link>
    <description>&lt;p&gt;So, I was looking for a fun example of UI interactivity to prototype on Codepen, and I stumbled upon &lt;a href=&quot;https://dribbble.com/shots/6566320-Kalli-Hero&quot;&gt;this really cool shot&lt;/a&gt; that &lt;a href=&quot;http://alexsanderbarhon.dribbble.com/&quot;&gt;Alexsander Barhon&lt;/a&gt; shared.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/dribbble-shot_1MB-400w.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;361&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/dribbble-shot_1MB-400w.webp 400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/dribbble-shot_1MB-600w.webp 600w&quot; sizes=&quot;100vw&quot;&gt;&lt;/p&gt;
&lt;p&gt;It’s a simple enough animation, with a really nice loading effect and staggered timeline that make it feel super fluid. I’ve been really into &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt; lately, and this seemed like a perfect opportunity to code out a little app. Live your life, but I’m gonna use SCSS for style here.&lt;/p&gt;
&lt;h3 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;Tl;dr&lt;/h3&gt;
&lt;p&gt;If you wanna skip the tutorial and get the source, scroll to the bottom of the post or just go check out the &lt;a href=&quot;https://codepen.io/xdesro/pen/dEwMOq&quot;&gt;finished pen&lt;/a&gt;. This post is gonna go pretty in-depth on everything it took to get this running, including the foundational CSS, etc. If you’re just looking for the &lt;a href=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/#interactivity&quot;&gt;Vue Interactivity&lt;/a&gt; or &lt;a href=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/#animation&quot;&gt;Vue transitions section&lt;/a&gt;, that’s cool too.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot; tabindex=&quot;-1&quot;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;When I’m building components like this, I always try to get markup and style in place before trying to futz with JavaScript. That way, I can focus on making things semantic and DRY without adding an additional layer of abstraction.&lt;/p&gt;
&lt;h3 id=&quot;basic-html-structure&quot; tabindex=&quot;-1&quot;&gt;Basic HTML structure&lt;/h3&gt;
&lt;p&gt;There’s a bunch of different ways you could break this app down, but based on the way it animates in the Dribbble shot, I see it in three major components, and then a few sub-pieces:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-400w.webp 400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-800w.webp 800w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-1400w.webp 1400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-1890w.webp 1890w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-400w.jpeg&quot; alt=&quot;&quot; width=&quot;1890&quot; height=&quot;1116&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-400w.jpeg 400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-800w.jpeg 800w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-1400w.jpeg 1400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/component-breakdown-1890w.jpeg 1890w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The reason I keep the top navigation separate from the slider or sidebar is because it all animates in together and seems to generally serve the same purpose. There’s definitely an argument to be made that the “kalli” logo is part of the slider and the “about” section is part of the sidebar, but for the sake of this demo, I’m gonna keep them separate.&lt;/p&gt;
&lt;p&gt;Let’s code it out:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav__brand&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Logo goes here. --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav__list&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Nav items go here. --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Slides will go here --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Headline here --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Play video &amp;amp; social links will go here. --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;aside&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Our buttons to navigate the slides will go in here. --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Slider numero dos. No prob. --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;progress-indicator&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- This is like that 01———03 thing in the bottom right. --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;aside&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So far so good. I’m using BEM-&lt;em&gt;ish&lt;/em&gt; classes for everything, because I like how easy it is to organize in your SCSS without increasing specificity. &lt;em&gt;(We typically want to avoid selectors like &lt;code&gt;.nav .list&lt;/code&gt; or whatever, and sometimes Sass’ nesting feature can make that an easy trap to fall into. &lt;code&gt;.nav__list&lt;/code&gt; is just as clear and much easier to override/much less specific.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You’ll also notice I’m assigning seemingly-duplicative classes like &lt;code&gt;.nav&lt;/code&gt; to the &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; element or &lt;code&gt;.aside&lt;/code&gt; to the &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;. I don’t usually use tag name selectors for structural elements because it makes the CSS more dependent on the HTML structure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don’t worry about style just yet.&lt;/strong&gt; If we make sure our HTML is meaningful and well-structured without style, it’ll be that much easier to write up the CSS.&lt;/p&gt;
&lt;h4 id=&quot;primary-nav&quot; tabindex=&quot;-1&quot;&gt;Primary nav&lt;/h4&gt;
&lt;p&gt;The navigation at the top has two distinct sections — the logo and the right-aligned nav items.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav__brand&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Logo&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav__list&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav__list-item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;About&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav__list-item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;More&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;main-section-and-slider&quot; tabindex=&quot;-1&quot;&gt;Main section &amp;amp; slider&lt;/h4&gt;
&lt;p&gt;I want to keep the slider slides and headline separate, because they animate in different ways, but close enough that they’re clearly related.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;slide1.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline-span&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Simplicity is the ultimate sophistication.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Play Video&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;social-links&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;social-links__item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://facebook.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Fb&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;social-links__item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://twitter.com/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Tw&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;social-links__item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.linkedin.com/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;In&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;aside-and-secondary-slider&quot; tabindex=&quot;-1&quot;&gt;Aside &amp;amp; secondary slider&lt;/h4&gt;
&lt;p&gt;I know we need two buttons that navigate forward and backward in the slider, a secondary container for the aside slider that we’ll mark up in a similar way to the first slider, and a progress indicator. I think I’m gonna use pseudo-elements for the counter on the progress indicator, so I’ll pass it the total number of slides via a &lt;code&gt;data-slides-count&lt;/code&gt; attribute.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;aside&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;←&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;→&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;slide2.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;progress-indicator&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-slides-count&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;03&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;progress-indicator__bar&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;aside&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that’s the markup done. I really love coding these puppies in layers like this because now that I know that my HTML is sound, I don’t have to worry about it again for a while.&lt;/p&gt;
&lt;h3 id=&quot;basic-style&quot; tabindex=&quot;-1&quot;&gt;Basic style&lt;/h3&gt;
&lt;p&gt;Let’s get Sassy with it. In my initial iteration of this idea, I used CSS variables and other weird stuff, so if you’re interested in that but have to support older browsers, it might be worth looking into a polyfill, or better yet, a &lt;em&gt;&lt;a href=&quot;https://jhildenbiddle.github.io/css-vars-ponyfill/#/&quot;&gt;ponyfill&lt;/a&gt;. 🦄&lt;/em&gt; This version of the tutorial doesn’t include any of that crazy bonkers stuff.&lt;/p&gt;
&lt;h4 id=&quot;responsive-css&quot; tabindex=&quot;-1&quot;&gt;“Responsive” CSS&lt;/h4&gt;
&lt;p&gt;I elected to use a pattern I lean on a lot for CodePens to make things “responsive”, where I set a font size for the app using viewport units and then measure everything based on that root font size using &lt;code&gt;rem&lt;/code&gt; units. It looks a little something like this &lt;em&gt;(note the &lt;code&gt;#{}&lt;/code&gt; syntax for interpolating SCSS variables):&lt;/em&gt;&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$app-width&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 95vmin&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;html &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;#{$app-width}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; 100&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.viewport &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$app-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;#{$app-width}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;9 &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; 16&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This block does a few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I’ve decided I want my app to be as large as possible without ever touching the edge of the screen, so I’ll use &lt;code&gt;95vmin&lt;/code&gt; to make sure it is always 95% of the width or the height of the screen (whichever is smaller).&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;html&lt;/code&gt; selector, I set the font size to be 1/100th of the width of the app — that way I know that &lt;code&gt;1rem&lt;/code&gt; will always be 1% of the width of the app. (This obviously isn’t required, I just like to have a very consistent and scalable unit to rely on when I’m making pens.)&lt;/li&gt;
&lt;li&gt;I measured the sides of the app in the video on Dribbble, and found that the app’s aspect ratio was 16/9. Thus, I’ve set the &lt;code&gt;.viewport&lt;/code&gt; (which is the class I’ll add to my app wrapper) width to &lt;code&gt;$app-width&lt;/code&gt; and then set its height to &lt;code&gt;$app-width * (9/16)&lt;/code&gt;, to ensure it is always the correct aspect ratio.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let’s keep trucking.&lt;/p&gt;
&lt;h4 id=&quot;layout-style&quot; tabindex=&quot;-1&quot;&gt;Layout style&lt;/h4&gt;
&lt;p&gt;We’re gonna default to using CSS Grid for most of our layout problems, with some absolute positioning.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;place-items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.viewport &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1fr 30rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// width, height...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’ll make the &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt; section 30% of the width of the app and the main slider will take up the rest of the available space. Let’s do the nav next.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-auto-flow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; column&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; space-between&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__list &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-auto-flow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; column&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; space-between&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Unset default ul padding. You could use a CSS reset too.&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So here we’ve decided the nav itself will be a grid, but by giving it &lt;code&gt;position: absolute;&lt;/code&gt; we’re taking it out of the parent grid. &lt;em&gt;(Z-index just makes sure it’s always the top-most element in the z-index stack.)&lt;/em&gt; Then we use the ampersand selector to style the right-aligned nav as grid as well. Let’s do the &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; section and its children.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.main &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-template-rows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2fr 1fr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-template-areas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;headline&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nav&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;align-items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slider &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 70rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;T
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__headline &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-area&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; headline
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__nav &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1fr auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-area&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nav&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 30rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3rem 5rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// I&#39;m using 3rem vertical instead of 5rem all around cause it just looks better 👀&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.social-links &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-auto-flow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; column&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-gap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.4rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;align-items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Movin’ right along. Let’s layout the &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt; element.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.aside &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// That DANG 5rem padding again....&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$button-size&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slider &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 25rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__button &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$button-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$button-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__nav &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -&lt;span class=&quot;token variable&quot;&gt;#{$button-size}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same padding as the top nav, etc. here &lt;em&gt;(if I was a clever person perhaps I’d make it a Sass variable like I did with the button sizing but I am&lt;/em&gt; &lt;strong&gt;not&lt;/strong&gt; &lt;em&gt;so here we&lt;/em&gt; &lt;strong&gt;go&lt;/strong&gt;, &lt;em&gt;baby).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Looking pretty slick so far. This looks about how we initially broke down the Dribbble screenshot.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;400&quot; data-theme-id=&quot;37307&quot; data-default-tab=&quot;result&quot; data-user=&quot;xdesro&quot; data-slug-hash=&quot;YbBogX&quot; style=&quot;height: 400px;&quot; data-pen-title=&quot;01 - Vue UI Slider [Layout &amp;amp;amp; Debug]&quot;&gt;
&lt;/p&gt;
&lt;p&gt;Next we’ll add some more visual style to the app.&lt;/p&gt;
&lt;h4 id=&quot;visual-spice&quot; tabindex=&quot;-1&quot;&gt;Visual spice&lt;/h4&gt;
&lt;p&gt;So the first thing I’m gonna mention is that I don’t actually know what font is in use here off-hand, so I’ll be using instead this really nice sans-serif font called &lt;a href=&quot;https://rsms.me/inter/&quot;&gt;Inter&lt;/a&gt;. Let’s go ahead and include it in our style sheet.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;https://rsms.me/inter/inter.css&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;html &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;#{$app-width}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; 100&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Inter&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@supports&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;font-variation-settings&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Inter var&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let’s style the pen a little bit so it’s not just a bunch of white rectangles. We’ll start with some variables and general app stuff.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--background&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hsl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  300&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  3%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  15%
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Note the $block--modifier syntax. This is just personal preference. Just be consistent!&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--primary&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hsl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// White color for most of the app.&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--secondary&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hsl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 90%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Off-white for the progress indicator&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color--neutral&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hsl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Nearly-black color for text.&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;body &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.viewport &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--primary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 1rem 2rem &lt;span class=&quot;token function&quot;&gt;hsla&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next we’ll do some placeholder images in this puppy and style up the slider.&lt;/p&gt;
&lt;p&gt;In the HTML, we can use &lt;a href=&quot;http://source.unsplash.com&quot;&gt;source.unsplash.com&lt;/a&gt; to get a random image that &lt;em&gt;generally&lt;/em&gt; fits the size we want.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://source.unsplash.com/random/1350x1080&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- ... --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://source.unsplash.com/random/1350x1080&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the SCSS, we’ll use the same code for the images twice, so let’s make it a &lt;code&gt;@mixin&lt;/code&gt;. We’ll include that for both slide images and use &lt;code&gt;overflow:hidden&lt;/code&gt; for the wrapping slider elements.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;slide-image &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;object-fit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cover&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.main &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slider &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//...&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slide-image &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; slide-image&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.aside &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//...&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slider &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//...&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slide-image &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; slide-image&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I think the last two kinda strange parts of this are the social links and the progress indicator. Let’s kick those off.&lt;/p&gt;
&lt;h4 id=&quot;progress-indicator&quot; tabindex=&quot;-1&quot;&gt;Progress indicator&lt;/h4&gt;
&lt;p&gt;In CSS grid, you can actually use pseudo elements as grid-level elements, and that works out great for this example, where the social links are divided by two dashes. We already set the social links up as a grid, but now lets place the pseudo-elements in that grid:&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.social-links &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:before,
  &lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:after &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.1rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--primary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:before &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:after &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That looks about right to me!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/social-links-144w.webp 144w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/social-links-144w.jpeg&quot; alt=&quot;&quot; width=&quot;144&quot; height=&quot;66&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Next let’s do the progress indicator. We’ll use pseudo elements for the numbers at the start and end, and use &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; elements in between to show which slide is currently active.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.progress-indicator &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:before,
  &lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:after &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--neutral&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:before &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;01&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:after &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data-slides-count&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__bar &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.2rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--secondary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;--active &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--neutral&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Remember when we used a data-attribute to set the slides count? Here’s where it comes in handy. We can make that dynamic in the Vue step but for now we just did it manually.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;progress-indicator&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-slides-count&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;03&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Real nice:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/progress-indicator-128w.webp 128w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/progress-indicator-128w.jpeg&quot; alt=&quot;&quot; width=&quot;128&quot; height=&quot;46&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I’ll breeze through the rest of the styles we’ll be adding. It’s mostly simple visual stuff like setting colors or font sizes — no more weird grid hackery. After all that, our slider’s about ready to become interactive!&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;400&quot; data-theme-id=&quot;37307&quot; data-default-tab=&quot;result&quot; data-user=&quot;xdesro&quot; data-slug-hash=&quot;YbBogX&quot; style=&quot;height: 400px;&quot; data-pen-title=&quot;02 - Vue UI Slider [Visual Style &amp; Debug]&quot;&gt;
&lt;/p&gt;
&lt;h2 id=&quot;interactivity-with-vue-js&quot; tabindex=&quot;-1&quot;&gt;Interactivity With Vue.js&lt;/h2&gt;
&lt;p&gt;The first thing we’ll do is get Vue included and turn our “app” into an App™.&lt;/p&gt;
&lt;p&gt;In CodePen, under the Javascript settings tab, you can add Vue as an external resource:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/vue-resource-400w.webp 400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/vue-resource-800w.webp 800w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/vue-resource-1044w.webp 1044w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/vue-resource-400w.jpeg&quot; alt=&quot;&quot; width=&quot;1044&quot; height=&quot;1160&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/vue-resource-400w.jpeg 400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/vue-resource-800w.jpeg 800w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/vue-resource-1044w.jpeg 1044w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Once we’ve got Vue included, let’s add an ID to the markup of the app and initialize a Vue instance.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;app&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;#app&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;adding-slides&quot; tabindex=&quot;-1&quot;&gt;Adding slides&lt;/h3&gt;
&lt;p&gt;In our Vue instance, let’s add some data for slides and a currently-active slide index, and then populate that data in the template markup.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;#app&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;currentActiveSlide&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;slides&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;headline&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Lorem ipsum dolor sit amet&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://source.unsplash.com/random/1350x1080&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;headline&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Consectetur adipiscing elit, sed do.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://source.unsplash.com/random/1350x1081&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;headline&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Eiusmod tempor incididunt ut labore.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://source.unsplash.com/random/1350x1082&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(slide, index) of slides&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index === currentActiveSlide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;slide.img&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(slide, index) of slides&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index === currentActiveSlide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline-span&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    {{ slide.headline }}
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ll notice we didn’t do anything for the slider in the &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt; section. That’s because I want the aside slider to always show the slide directly after the currently active one, or show the first slide if we’re at the end of the slides. I can do this with a Vue computed value we’ll call &lt;code&gt;nextActiveSlide&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;computed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;nextActiveSlide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentActiveSlide &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slides&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length
        &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentActiveSlide &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And once we’ve got that we can do this in the template:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(slide, index) of slides&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index === nextActiveSlide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;slide.img&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Last thing to do is the progress indicator. We can do this all in the template, by creating as many progress bars as there are slides, and then conditionally adding a class if it should be active.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;progress-indicator&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;:data-slides-count&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;0&#39; + slides.length&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(slide,index) of slides&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index === currentActiveSlide ? &#39;progress-indicator__bar  progress-indicator__bar--active&#39; : &#39;progress-indicator__bar&#39;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;navigating-between-slides&quot; tabindex=&quot;-1&quot;&gt;Navigating between slides&lt;/h3&gt;
&lt;p&gt;The actual slide navigation is pretty simple, thanks to Vue – it’ll listen to the &lt;code&gt;currentActiveSlide&lt;/code&gt; value and change everything we need based on that. We’ll add a method to handle slide changes. I’ve elected to be kinda wordy with this method for the sake of readability, but you could be much more concise!&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// We&#39;ll pass the function either 1 or -1 to indicate which direction we&#39;the slides will go&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;handleSlideChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; direction&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; calculatedNextSlide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentActiveSlide &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        direction &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;next&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        direction &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;previous&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;direction &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;next&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; calculatedNextSlide &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slides&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentActiveSlide &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;direction &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;next&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentActiveSlide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;direction &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;previous&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; calculatedNextSlide &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentActiveSlide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slides&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentActiveSlide &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then in our markup we’ll update those buttons in the &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt; section so when clicked, they call that &lt;code&gt;handleSlideChange()&lt;/code&gt; method.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;@click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;handleSlideChange(-1)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;←&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;aside__button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;@click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;handleSlideChange(1)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;→&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And just like that, we’re all hooked up to data, slidin’ around, and ready to animate.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;400&quot; data-theme-id=&quot;37307&quot; data-default-tab=&quot;result&quot; data-user=&quot;xdesro&quot; data-slug-hash=&quot;EzMMvE&quot; style=&quot;height: 400px;&quot; data-pen-title=&quot;03 - Vue UI Slider [Data With Vue]&quot;&gt;
&lt;/p&gt;
&lt;h2 id=&quot;animating-with-vue-js-transition-and-transition-group&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/#animation&quot; class=&quot;header-anchor&quot; id=&quot;animation&quot;&gt;&lt;/a&gt; Animating With Vue.js &amp;lt;transition&amp;gt; and &amp;lt;transition-group&amp;gt;&lt;/h2&gt;
&lt;p&gt;In Vue, you can use the &lt;code&gt;&amp;lt;transition&amp;gt;&lt;/code&gt; component to trigger animations in CSS or fire JavaScript methods on state changes. We’ll be handling all of our transitions with CSS this time around, but you can check &lt;a href=&quot;https://vuejs.org/v2/guide/transitions.html&quot;&gt;the exceptional Vue docs&lt;/a&gt; for more potential uses. The general flow is that&lt;/p&gt;
&lt;p&gt;Let’s start by transitioning the headline when you change slides with &lt;code&gt;&amp;lt;transition-group&amp;gt;&lt;/code&gt;, which is best for list transitions.&lt;/p&gt;
&lt;h3 id=&quot;transitioning-the-headline&quot; tabindex=&quot;-1&quot;&gt;Transitioning the headline&lt;/h3&gt;
&lt;p&gt;The first step is to convert the &lt;code&gt;.main__headline&lt;/code&gt; div into a &lt;code&gt;&amp;lt;transition-group&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;transition-group&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;tag&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;div&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline-span&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;out-in&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(slide, index) of slides&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index === currentActiveSlide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__headline-span&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    {{ slide.headline }}
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;transition-group&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are a few things going on here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We replaced the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; element with a &lt;code&gt;&amp;lt;transition-group tag=&amp;quot;div&amp;quot;&amp;gt;&lt;/code&gt; element. The group will render as a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We gave that transition group a name of &lt;code&gt;main__headline-span&lt;/code&gt; — what this means is that when a transition is occurring, it’ll apply the transition classes to its children with this prefix. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.main__headline-span-enter-active&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.main__headline-span-leave-to&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(This will come in handy when we’re writing our transition code in SCSS.)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We set the mode to “out-in” — this basically means the element that we’re transitioning out will be completely transitioned out before we start transitioning in the new element.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now we can write the CSS to make some magic happen.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.main &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__headline-span &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// This is just to make sure there&#39;s no jumping around as we transition elements out and in.&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 60rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// We have to add this because we&#39;re absolutely positioning the headline-span&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-enter,
    &lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-leave-to &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// This is an easy way for us to keep the animation code with the component code. This selector outputs `.main__headline-span-enter, .main__headline-span-leave-to {}`&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-enter-active,
    &lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-leave-active &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; all 300ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-enter-active &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;transition-delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 700ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// This makes the new headline take just a moment to come in.&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;transitioning-the-slides-using-clip-path&quot; tabindex=&quot;-1&quot;&gt;Transitioning the slides using &lt;code&gt;clip-path&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Let’s use &lt;code&gt;&amp;lt;transition-group&amp;gt;&lt;/code&gt; again to prepare the main and aside sliders to be animated.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- ... --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;transition-group&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;tag&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;div&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slider&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;out-in&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(slide, index) of slides&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;v-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;index === currentActiveSlide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main__slide-image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;:src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;slide.img&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;transition-group&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same as the previous example, we replace the slider wrapper &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with a &lt;code&gt;&amp;lt;transition-group&amp;gt;&lt;/code&gt; that gets the class of its children as a &lt;code&gt;name&lt;/code&gt; attribute. That’s all it takes. Let’s write some more CSS.&lt;/p&gt;
&lt;p&gt;I’d like to use the CSS &lt;code&gt;clip-path&lt;/code&gt; property to transition the slides — I think it’ll be the most visually-satisfying way to achieve that wipe that happens in the Dribbble shot. We’re going to transition a &lt;code&gt;clip-path: polygon()&lt;/code&gt; value. When a slide is active, the &lt;code&gt;clip-path&lt;/code&gt; won’t clip any of the image:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/clip-path-400w.webp 400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/clip-path-800w.webp 800w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/clip-path-880w.webp 880w&quot; sizes=&quot;100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/clip-path-400w.jpeg&quot; alt=&quot;&quot; width=&quot;880&quot; height=&quot;568&quot; srcset=&quot;https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/clip-path-400w.jpeg 400w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/clip-path-800w.jpeg 800w, https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/clip-path-880w.jpeg 880w&quot; sizes=&quot;100vw&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Since we want to wipe from left-to-right, we need two different clip paths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clipped to the left side (“enter” state): &lt;code&gt;polygon(0 0, 0 0, 0 100%, 0 100%)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Clipped to the right side (“leave-to” state): &lt;code&gt;polygon(100% 0, 100% 100%, 100% 100%, 100% 0)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s implement that in our SCSS. We’re reusing this animation for both sliders, so we’ll make it a mixin. &lt;em&gt;(I also want a subtle zoom effect on the image.)&lt;/em&gt;&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;clip-path-wipe &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;clip-path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;polygon&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    0 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    100% 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    100% 100%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    0 100%
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Specify the &quot;slide visible&quot; state&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-enter &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;clip-path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;polygon&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0 100%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0 100%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1.3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-leave-to &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;clip-path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;polygon&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;100% 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 100% 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 100% 100%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 100% 100%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1.3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-enter-active &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; all 700ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transition-delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 500ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-leave-active &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; all 700ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now let’s hook into this in the &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; slider.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.main &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slider &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--neutral&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// This makes it so the slider background isn&#39;t just white.&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 70rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Make sure the image doesn&#39;t overflow when it scales up&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slide-image &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; clip-path-wipe&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And again in the &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt; slider:&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.aside &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slider &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color--neutral&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;__slide-image &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; clip-path-wipe&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-leave-active &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;transition-delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Offset this animation slightly from the main slider&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;-enter-active &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;transition-delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 600ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// See above&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;400&quot; data-theme-id=&quot;37307&quot; data-default-tab=&quot;result&quot; data-user=&quot;xdesro&quot; data-slug-hash=&quot;joREmZ&quot; style=&quot;height: 400px;&quot; data-pen-title=&quot;04 - Vue UI Slider [Animation with Vue]&quot;&gt;
&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And just like that, we’re all ready to rumble. If you wanted to, there are a couple of enhancements you could include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write some CSS to transition the progress indicator a little more smoothly.&lt;/li&gt;
&lt;li&gt;Add a boolean &lt;code&gt;loaded&lt;/code&gt; state to the Vue &lt;code&gt;data()&lt;/code&gt;, and transition in the navigation and slider depending on whether &lt;code&gt;loaded === true&lt;/code&gt; or not.&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&quot;https://jariz.github.io/vibrant.js/&quot;&gt;Vibrant.js&lt;/a&gt; or similar to set the background of the slider to an accent color of the slider image!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you end up giving this a shot or customizing it in any way, let me know on Bluesky [@strange.website]({{ ‘bluesky’ | getSocialUrl(social) }})! I’d love to see it. Thanks for reading. As promised, &lt;a href=&quot;https://codepen.io/xdesro/pen/dEwMOq&quot;&gt;here’s the finished pen&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;400&quot; data-theme-id=&quot;37307&quot; data-default-tab=&quot;result&quot; data-user=&quot;xdesro&quot; data-slug-hash=&quot;dEwMOq&quot; style=&quot;height: 400px;&quot; data-pen-title=&quot;Vue Slider UI Interaction&quot;&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S. This is my first tutorial-style blog post — please let me know if you have any feedback or found any problems with the post! Thanks for reading.&lt;/em&gt;&lt;/p&gt;
</description>
    <pubDate>Wed, 05 Jun 2019 02:36:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/how-to-make-an-animated-interactive-vue-js-slider/</guid>
</item>
<item>
    <title>Uses</title>
    <link>https://henry.codes/writing/uses/</link>
    <description>&lt;p&gt;This is a non-exhaustive list of the tools I use in my day-to-day operation for design, development, and life as a human. If I’m missing something, &lt;a href=&quot;mailto:yo@henry.codes?subject=Request%20To%20Add%20To%20Uses%3A&quot;&gt;let me know&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&quot;hardware&quot; tabindex=&quot;-1&quot;&gt;Hardware&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Main Computer&lt;/strong&gt; — 2023 MacBook Pro, 14-inch, 16GB M2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webcam&lt;/strong&gt; — Onboard Mac laptop camera &lt;s&gt;Logitech C920 Pro HD&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microphone&lt;/strong&gt; — Blue Microphones &lt;a href=&quot;https://www.bluedesigns.com/products/yeti/&quot;&gt;Yeti Blackout&lt;/a&gt;. Got it for streaming, use it for everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keys&lt;/strong&gt; — GK64 custom build, with an acacia case, Elven keycaps, and Kailh box jade switches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phone&lt;/strong&gt; — iPhone 14 Pro 256GB. Wouldn’t recommend it. I don’t think Apple holds the future of phones anymore. Might try a &lt;a href=&quot;https://us.nothing.tech/&quot;&gt;Nothing phone&lt;/a&gt; next.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headphones&lt;/strong&gt; — &lt;a href=&quot;https://us.nothing.tech/products/ear-open&quot;&gt;Nothing ear(open)&lt;/a&gt; for being out and about, &lt;a href=&quot;https://us.nothing.tech/products/ear&quot;&gt;Nothing ear(2)&lt;/a&gt; for when I need noise canceling, and &lt;a href=&quot;https://en-us.sennheiser.com/high-quality-headphones-around-ear-audio-surround-hd-650&quot;&gt;Sennheiser HD 650&lt;/a&gt;at home. Love the wide sound stage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Luggage&lt;/strong&gt; — &lt;a href=&quot;https://www.chromeindustries.com/product/niko-pack-backpack/BG-153.html&quot;&gt;Chrome Niko Pack&lt;/a&gt; laptop &amp;amp; camera bag. It’s like bulletproof, effectively waterproof, and looks really tech-wear-y and rad.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;software&quot; tabindex=&quot;-1&quot;&gt;Software&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDE&lt;/strong&gt; — VS Code.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Theme&lt;/em&gt;: &lt;a href=&quot;https://www.nordtheme.com/ports/visual-studio-code&quot;&gt;Nord&lt;/a&gt; or &lt;a href=&quot;https://horizontheme.com/&quot;&gt;Horizon Light&lt;/a&gt; (&lt;em&gt;I know, *GASP*, a light theme&lt;/em&gt;) depending on the day (and the time of day).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Font&lt;/em&gt;: &lt;code&gt;Menlo, Monaco, &#39;Courier New&#39;, monospace;&lt;/code&gt; &lt;s&gt;SF Mono with a Fira Code fallback.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Must-Have Extensions&lt;/em&gt;: Prettier, &lt;s&gt;GitLens &amp;amp; Vetur.&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal&lt;/strong&gt; — I like &lt;a href=&quot;https://hyper.is/&quot;&gt;Hyper.js&lt;/a&gt; — recently switched from iTerm almost solely based on the visual customization and JSON-based (instead of GUI) config.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Theme&lt;/em&gt;: Nord, again.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Prompt&lt;/em&gt;: Used to be a die-hard &lt;code&gt;oh-my-zsh&lt;/code&gt; user, but it’s more than I need by a lot. Now I just use &lt;a href=&quot;https://denysdovhan.com/spaceship-prompt/&quot;&gt;Spaceship&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notes/Content&lt;/strong&gt; — &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian.md&lt;/a&gt; and flat files for almost everything. &lt;s&gt;&lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;. Notion holds my life together. This blog is published using &lt;a href=&quot;https://contentful.com&quot;&gt;Contentful&lt;/a&gt;.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Messaging&lt;/strong&gt; — I use &lt;a href=&quot;https://discord.com/app&quot;&gt;Discord&lt;/a&gt; and &lt;a href=&quot;https://telegram.org/&quot;&gt;Telegram&lt;/a&gt; to message most folks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI/Prototype Design&lt;/strong&gt; — &lt;em&gt;I use Figma pretty much exclusively now. It just came down to like one frustrating day of fighting with Framer’s layout tools.&lt;/em&gt; &lt;s&gt;&lt;a href=&quot;https://www.framer.com/&quot;&gt;Framer X&lt;/a&gt;! I recently made the switch from Sketch and have not looked back. The code extensibility makes it a must-have for devsigners 🦄. Figma is also good.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3D Design&lt;/strong&gt; — Gotta be Cinema 4D. I initially got hooked on it via Devon Ko’s &lt;em&gt;amazing&lt;/em&gt; &lt;a href=&quot;https://www.3dfordesigners.com/&quot;&gt;3D For Designers&lt;/a&gt; course and now I can’t stop making weird stuff with it. I use Octane Renderer for most things.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memes &amp;amp; One-Off Imagery&lt;/strong&gt; — Photoshop lol&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector Art &amp;amp; Iconography&lt;/strong&gt; — Usually the twin swords of Illustrator, and Figma get me sorted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Music&lt;/strong&gt; — Spotify for everything. Spotify *used to actually do a really good job of suggesting music I’ll like.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPN&lt;/strong&gt; — It’s &lt;code&gt;${new Date().getCurrentYear()}&lt;/code&gt; —  please, please, please use a VPN. I prefer &lt;a href=&quot;https://nordvpn.com/&quot;&gt;Nord&lt;/a&gt; &lt;em&gt;(lmao)&lt;/em&gt; but any one that you pay for is probably decent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password Management&lt;/strong&gt; — I use 1Password for login management these days!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Productivity&lt;/strong&gt;:
— &lt;a href=&quot;https://www.alfredapp.com/&quot;&gt;Alfred&lt;/a&gt; is a replacement for your Spotlight on Mac OS X that supercharges it with all kinds of useful featureset. It’s well worth paying for a license.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;deprecated&quot; tabindex=&quot;-1&quot;&gt;Deprecated&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;s&gt;&lt;strong&gt;Backup Computer&lt;/strong&gt; — 2015 MacBook Pro, 15&amp;quot; Retina, 2.2GHz Intel Core i7, 16GB RAM, Intel Iris Pro.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;strong&gt;Additional Monitors&lt;/strong&gt; — LG 4K for screen design and browsers/etc. and an LG Ultrawide riding shotgun, vertically-mounted for contextual peripherals (IRC, Telegram, Spotify, usually Hyper too!).&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;strong&gt;Tracking&lt;/strong&gt; — Apple Magic Trackpad in Space Grey&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Wed, 01 May 2019 06:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/uses/</guid>
</item>
<item>
    <title>Bad ux in everyday life: kitchen nightmares</title>
    <link>https://henry.codes/writing/bad-ux-in-everyday-life-kitchen-nightmares/</link>
    <description>&lt;p class=&quot;editors-note&quot;&gt;This article was originally posted on the &lt;a href=&quot;http://www.universalmind.com/blog/bad-ux-in-everyday-life-part-1-the-kitchen/&quot;&gt;Universal Mind blog&lt;/a&gt; in June 2016.&lt;/p&gt;
&lt;p&gt;It’s come to my attention lately that my kitchen is absolutely riddled with poor experiences. Most of the appliances and apparatus one uses on a day-to-day basis in the kitchen were invented or last revolutionized in the early part of the 20th century, and many of them have seen very little innovation, if any, since that time. In this UX- and CX-obsessed age, it seems totally unacceptable that we demand constant iteration and improvement of processes in our web applications, in our vehicles, and elsewhere, but settle for lackluster routines in the kitchen.&lt;/p&gt;
&lt;p&gt;In the following exposition, I will outline some of the major experience flaws in a couple places in the standard kitchen.&lt;/p&gt;
&lt;h2 id=&quot;the-toaster&quot; tabindex=&quot;-1&quot;&gt;The toaster&lt;/h2&gt;
&lt;p&gt;The conventional pop-up toaster you typically see in John Doe’s kitchen was invented in 1919 by Charles Strite, and looks about the same as it did when he initially received the patent for the device, save for a few standard additions like the toast-level knob and sometimes the bagel setting. This run-of-the-mill toaster is plagued with several major detriments, chiefly inconsistent functionality. I cycled through four toasters of varying major brands and continued to get bread that was grossly mistreated by the heating element, often leaving half unchanged while rendering the other half a tragically-charred wasteland.&lt;/p&gt;
&lt;p&gt;Through extensive research and great personal cost, I managed to find a unit with a consistent heating element, but this effort should have been managed by the toaster manufacturers in question. With little exception, all new, modern vehicles drive smoothly off the dealership lot, without random changes in speed or wheels that only work a fraction of the time — by the same token, all toasters should do their job without pause or error. Basic functionality shouldn’t be a luxury or difficult-to-find affordance.&lt;/p&gt;
&lt;p&gt;Toasters typically let users select a level of toast in an iconographically-vague or otherwise unclear manner, such as a numbered scale. At no point does a user decide they want “3” toast — the lack of clarity here forces one to employ guess-and-check methods and dejectedly munch their way through under-crusty or over-crispy slices. Some variants have attempted to combat this with hieroglyphics indicating differing degrees of toastiness, but the user’s perception of a certain amount of crosshatching on a rudimentary picture doesn’t necessarily coincide with their ideal char level on their bread.&lt;/p&gt;
&lt;p&gt;Not lastly of the toaster’s UX sins stems from its traditionally opaque walls. A lot of the schism encountered when trying to nail down an ideal toast level could be countered if you could just see how dark the darn bread was getting. Breville’s “Lift &amp;amp; Look”™ solution (which allows the user to check the toast level without canceling the heating cycle) is a step in the right direction, but could be improved. Morphy Richards’ glass-walled design is the closest to completely solving this problem, but while everyone deserves a seamless toast experience, not everyone can afford to spend $200+ on a toaster.&lt;/p&gt;
&lt;h2 id=&quot;rice-flour-and-sugar-packaging-oh-my&quot; tabindex=&quot;-1&quot;&gt;Rice, flour, and sugar packaging (oh my)&lt;/h2&gt;
&lt;p&gt;This is one that confounded me long before I had even heard the term “UX” — flour, most culinary sugars, and rice are usually found in stores in tightly-packed paper or plastic bags. This packaging makes it difficult if not impossible to reseal or contain them once opened, without third-party storage jars/boxes/bags. There are very few other food items that ship with this necessity. Crackers come in boxes, butter comes in a wrapper or a box — it seems almost a bizarre oversight that the powdery or granular food items would be assigned to the type of packaging that would be most logistically difficult for it to be retrieved from. The tight packaging is designed with shipping convenience in mind, not the consumer; the amount of flour exploding over unsuspecting users’ countertops at any given moment is unforgivable.&lt;/p&gt;
&lt;h2 id=&quot;disclaimer&quot; tabindex=&quot;-1&quot;&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;This is a list of poor user experiences I’ve had in my culinary ventures — many of these could arguably be attributed to “user error” or “expecting too much of a toaster”, but I believe that in 2016, I shouldn’t have to hunt excessively or pay premiums for a toaster that works, nor should I have to buy specialized containers for some food products, when most others leave the shelf of the grocery store in a package they’re fine occupying indefinitely. I’d love to hear your input — feel free to dispute my thoughts or (much more likely) to agree vehemently with me &lt;a href=&quot;mailto:yo@henry.codes&quot;&gt;via email&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Thu, 09 Jun 2016 06:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/bad-ux-in-everyday-life-kitchen-nightmares/</guid>
</item>
<item>
    <title>Agile for the rest of us</title>
    <link>https://henry.codes/writing/agile-for-the-rest-of-us/</link>
    <description>&lt;p class=&quot;editors-note&quot;&gt;This article was originally written for the &lt;a href=&quot;https://www.fusionbox.com/blog/detail/agile-for-the-rest-of-us/540/&quot;&gt;Fusionbox blog&lt;/a&gt; in January 2015.&lt;/p&gt;
&lt;p&gt;The Fusionbox process takes many pages from the Great Big Book of Agile Methodology to streamline and modernize the production of web content, etcetera, but for the folks at home, what &lt;em&gt;is&lt;/em&gt; agile development? Where did it come from? Who let it in? Should we feed it?&lt;/p&gt;
&lt;h2 id=&quot;waterfall&quot; tabindex=&quot;-1&quot;&gt;Waterfall&lt;/h2&gt;
&lt;p&gt;Software development used to be treated the same as the development of any other product. Guidelines would be set, features would be decided upon, and a timeline would be locked in place. This is because in the worlds of manufacturing and construction, after-the-fact changes to any design or aspect of a project are prohibitively costly, if not impossible, so it only makes sense when planning to “pick it and stick with it”. When software development was in its infancy, no formal alternative methodologies had been invented, so the manufacturing model was just adapted to fit the software industry. The idea is that requirements are established, and production ensues.&lt;/p&gt;
&lt;p&gt;This became known as the Waterfall Method, which until recently tended to be the standard for software dev. In its purest form, Waterfall designated this list of steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Product requirements specification&lt;/li&gt;
&lt;li&gt;Design&lt;/li&gt;
&lt;li&gt;Programming&lt;/li&gt;
&lt;li&gt;Testing and debugging&lt;/li&gt;
&lt;li&gt;Delivery of product&lt;/li&gt;
&lt;li&gt;Maintenance&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With these steps, it’s fairly easy to budget and set timetables, because it is already known on Day 1 of design what the finished product will be when on Day X when it is delivered. Also, if a developer can’t be involved in the project for one reason or another, the concrete plan makes it easy for another programmer to hop right into his or her spot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here’s the problem:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Waterfall method is typically incredibly rigid and inflexible. Altering the project design at any stage in the project is nearly impossible. What happens when down the road, someone decides they want some extra functionality for their website? Waterfall says no. When an apartment building is planned, no one decides they want an extra floor or balcony at some point during the middle — but when designing a website, it’s not uncommon in any capacity for requested changes to arise. “Let’s add an eCommerce section to our site”, “can we put the navigation bar on the side, rather than the top?”, “how do we add mobile functionality to our page?” Those suggestions and queries are very difficult to respond to in Waterfall.&lt;/p&gt;
&lt;p&gt;And what about debugging? The testing stage of Waterfall method is deferred until especially late in the project. To put this in perspective, remember that apartment building we were talking about earlier? Construction contractors won’t test if the building will stand on its own while they’re still pouring the foundations. Which works quite well for the apartment building. So much planning has gone into that high-rise since the start that the contractor pretty much knows without a doubt that his product is structurally sound. However, software programs or websites are not high-rises. It’s so often impossible to predict how the many MANY different pieces of a site will interact with each other, and this leads to problems in the debugging phase. All of the design steps and all of the programming steps will finally end up in the lap of a QA tester who has a week or sometimes as little as a day to solve every little problem and glitch in the product to deliver it on time.&lt;/p&gt;
&lt;p&gt;At the end of those months and months of painstaking planning and prediction, the “finished” product is buggy and might not meet all the needs it is supposed to fill because the requirements may have changed at some point during the process.&lt;/p&gt;
&lt;h2 id=&quot;agile&quot; tabindex=&quot;-1&quot;&gt;Agile&lt;/h2&gt;
&lt;p&gt;So by now it’s easy to see that building a website is a different task entirely from building an apartment tower. Why would the same development process be applied to both? Pioneers like E. A. Edmonds, Tom Gilb, and Dan Gielen all concurrently started publishing or applying different ideas about adaptive software development in the early- to mid-seventies, but it wasn’t till the mid-nineties that those methodologies started seeing widespread use. Initially, there were many different forms — Rational Unified Process, Scrum, Dynamic Systems Development Method, etc. — but these were for the most part collated under the term Agile Development after the “Agile Manifesto” was published in 2001. (For more information on the Manifesto, see here — it’s a quick read.)&lt;/p&gt;
&lt;p&gt;Agile focuses on team-based, adaptive development. Rather than setting all the requirements and solutions at the beginning of the process and not obliging any sort of change, requirements are allowed to vary and solutions evolve in real-time based on those changes. The Agile approach, in essence, works like this:&lt;/p&gt;
&lt;p&gt;The process is iterative — rather than the Waterfall style of an ordered list, it is based on the cyclical use of repeated steps. The requirements for a software product are gathered and organized by the team or by a team leader into “sprints” — short bursts of development activity resulting in large leaps forward in production. Frequently, the minimum requirements for an operable product are put into the first few sprints, which means rapid delivery of useful software is standard.&lt;/p&gt;
&lt;p&gt;The best analogy we’ve found to describe Agile sprints is this: With Waterfall method, first built are the wheels, and then the chassis, and then the engine, and eventually those leather seat covers are tossed on and that new “fresh-off-the-lot” smell is pumped in, and there is FINALLY a car that can be driven away. With Agile, rather than taking all that time to build a whole car (which we’ve established may or may not work as well as it should), the first “sprint” builds a skateboard. It’s not the aerodynamic supercar that is the end goal, but it’ll get someone down the street from their mom’s house to the grocery store, and it’ll be produced and deliverable in a fraction of the time.&lt;/p&gt;
&lt;p&gt;Through further sprints, which are usually a few days or a week long, the skateboard is built out more and more. Maybe a bicycle, second, and then halfway through go-cart stage, someone might decide they actually wanted a Mazerati, not a Ferrari. With Agile, that’s not a problem. One of the primary principles of Agile development is to welcome changing requirements, even late in development. With each sprint, or iteration, working software is delivered — visible proof of progress to put a client or customer’s mind at ease.&lt;/p&gt;
&lt;p&gt;“Well, that’s awesome, it’s so intuitive and fluid, why would anyone NOT use Agile?!” Agile isn’t a be-all, end-all solution to development. Agile is very flexible, but that means it operates without the structure of Waterfall method, and that CAN have some drawbacks. Agile projects are harder to predict — changing requirements also means changing budgets and timelines, and that’s not how most business works. Waterfall was so widely accepted because it makes sense outside the world of web development, but Agile is not the same. While it is more intuitive to design and development teams, it is truly a leap of faith for different departments in their organization, or for clients in an agency context. The price paid for more efficient and functional software is sometimes an extension on deadlines and budgets.&lt;/p&gt;
&lt;h2 id=&quot;so-what&quot; tabindex=&quot;-1&quot;&gt;So What?&lt;/h2&gt;
&lt;p&gt;Ultimately, neither methodology is “better” across the board. Waterfall is sometimes better for static projects, where the requirements are not expected to change at all, or for situations where a client can’t commit to a lot of communication, or the deadline or budget is adamant and inflexible. Here at Fusionbox, we love how collaborative and personal Agile development is. We think face-to-face conversation is the best form of communication, and we love giving the continuous attention to technical excellence and good design that is essential to the Agile process…&lt;/p&gt;
</description>
    <pubDate>Mon, 05 Jan 2015 06:00:00 GMT</pubDate>
    <dc:creator>Henry Desroches</dc:creator>
    <guid>https://henry.codes/writing/agile-for-the-rest-of-us/</guid>
</item>

</channel>
</rss>