<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ashwin's blog</title><link>https://www.ashwinmenon.com/</link><description>Recent content on Ashwin's blog</description><generator>Hugo</generator><language>en</language><copyright>Ashwin Menon</copyright><lastBuildDate>Sun, 26 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.ashwinmenon.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Stand-up comedy: Rung de</title><link>https://www.ashwinmenon.com/posts/activities/stand-up-comedy-rung-de/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/stand-up-comedy-rung-de/</guid><description>&lt;h2 id="laugh-tracks"&gt;Laugh tracks&lt;/h2&gt;
&lt;p&gt;So it&amp;rsquo;s been a little less than a year since I started trying to do comedy. And let me share what I think the milestones in a stand-up comic&amp;rsquo;s career look like.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s one track that goes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Your first open mic&lt;/li&gt;
&lt;li&gt;Your first 3-minute set&lt;/li&gt;
&lt;li&gt;Your first 5-minute set or your &amp;ldquo;tight five&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Your first 10-minute set&lt;/li&gt;
&lt;li&gt;Your first 20-minute set&lt;/li&gt;
&lt;li&gt;Your first 40-minute set&lt;/li&gt;
&lt;li&gt;Your first special/hour-long show.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And on a separate track you have:&lt;/p&gt;</description></item><item><title>Everything takes more time than expected</title><link>https://www.ashwinmenon.com/posts/technical/2026-02-26-every-thing-takes-more-time-than-expected/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2026-02-26-every-thing-takes-more-time-than-expected/</guid><description>&lt;p&gt;A friend suggested that I allow users to login to hunchle.com without a password. This seemed fairly simple to implement, so I thought I&amp;rsquo;d give it a shot. I was allowing users to login with emails and passwords already, so removing a password was all that might be needed, right? And I had AI to help! Turns out, wrong! First, I had to streamline the new experience so that it worked for both existing users (who had passwords set) and new ones (who might never have a password). Adding this in meant I&amp;rsquo;d need a streamlined experience, so then I had to spend a few minutes researching how other websites did it. AI takes care of the coding, but needs a big helping hand with all of this. Taste is what I provide.&lt;/p&gt;</description></item><item><title>Miles vs Cash-back Calculator</title><link>https://www.ashwinmenon.com/curiosities/cash_points/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/curiosities/cash_points/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Miles vs Cash-back Calculator&lt;/title&gt;
&lt;script src="https://cdn.plot.ly/plotly-2.35.2.min.js"&gt;&lt;/script&gt;
&lt;style&gt;
 * { box-sizing: border-box; margin: 0; padding: 0; }
 body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; padding: 24px; max-width: 960px; margin: 0 auto; }
 h1 { font-size: 1.4rem; margin-bottom: 20px; color: #e6edf3; }
 .inputs { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-bottom: 24px; }
 .inputs label { display: flex; flex-direction: column; gap: 4px; font-size: 0.82rem; color: #8b949e; }
 .inputs input { background: #161b22; border: 1px solid #30363d; border-radius: 6px; padding: 8px 10px; color: #e6edf3; font-size: 0.9rem; }
 .inputs input:focus { outline: none; border-color: #58a6ff; }
 .wide { grid-column: 1 / -1; }
 table { width: 100%; border-collapse: collapse; margin-bottom: 24px; font-size: 0.85rem; }
 th, td { padding: 8px 12px; text-align: right; border-bottom: 1px solid #21262d; }
 th { color: #8b949e; font-weight: 600; }
 td:first-child, th:first-child { text-align: left; }
 tr:hover td { background: #161b22; }
 #chart { width: 100%; height: 450px; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;Miles vs Cash-back Calculator&lt;/h1&gt;

&lt;div class="inputs"&gt;
 &lt;label&gt;Miles per dollar
 &lt;input type="number" id="milesPerDollar" value="3" step="0.5" min="0"&gt;
 &lt;/label&gt;
 &lt;label&gt;Cash-back rate (%)
 &lt;input type="number" id="cashbackRate" value="2" step="0.5" min="0"&gt;
 &lt;/label&gt;
 &lt;label&gt;Investment return (%)
 &lt;input type="number" id="investmentReturn" value="8" step="0.5" min="0"&gt;
 &lt;/label&gt;
 &lt;label&gt;Devaluation rate (%)
 &lt;input type="number" id="devaluation" value="0.01" step="0.01" min="0"&gt;
 &lt;/label&gt;
 &lt;label&gt;Years
 &lt;input type="number" id="years" value="10" step="1" min="1" max="50"&gt;
 &lt;/label&gt;
 &lt;label class="wide"&gt;Redemption rates — CPP (comma-separated)
 &lt;input type="text" id="cppValues" value="1, 1.5, 1.6, 1.7, 1.8, 2, 4, 8"&gt;
 &lt;/label&gt;
&lt;/div&gt;

&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;&lt;th&gt;CPP&lt;/th&gt;&lt;th&gt;Devaluation&lt;/th&gt;&lt;th&gt;Initial Miles Value&lt;/th&gt;&lt;th&gt;Breakeven Year&lt;/th&gt;&lt;th&gt;Miles @ End&lt;/th&gt;&lt;th&gt;Cash @ End&lt;/th&gt;&lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody id="tbody"&gt;&lt;/tbody&gt;
&lt;/table&gt;

&lt;div id="chart"&gt;&lt;/div&gt;

&lt;script&gt;
const $ = id =&gt; document.getElementById(id);

function recalc() {
 const milesPerDollar = parseFloat($('milesPerDollar').value) || 0;
 const cashbackRate = (parseFloat($('cashbackRate').value) || 0) / 100;
 const investReturn = (parseFloat($('investmentReturn').value) || 0) / 100;
 const dev = (parseFloat($('devaluation').value) || 0) / 100;
 const maxYears = parseInt($('years').value) || 10;
 const cppList = $('cppValues').value.split(',').map(s =&gt; parseFloat(s.trim()) / 100).filter(v =&gt; !isNaN(v) &amp;&amp; v &gt; 0);

 const years = Array.from({length: maxYears + 1}, (_, i) =&gt; i);
 const cashValues = years.map(y =&gt; cashbackRate * Math.pow(1 + investReturn, y));

 const traces = [{
 x: years, y: cashValues, name: `Cash (${(cashbackRate*100)}% @ ${(investReturn*100)}%)`,
 mode: 'lines', line: {width: 3, dash: 'dash', color: '#3fb950'}
 }];

 const rows = [];

 for (const cpp of cppList) {
 const initVal = milesPerDollar * cpp;
 const milesValues = years.map(y =&gt; initVal * Math.pow(1 - dev, y));

 let breakeven = null;
 for (let y = 0; y &lt; years.length; y++) {
 if (cashValues[y] &gt; milesValues[y]) { breakeven = y; break; }
 }

 rows.push({
 cpp: (cpp * 100).toFixed(2),
 dev: (dev * 100).toFixed(2) + '%',
 initVal: '$' + initVal.toFixed(4),
 breakeven: breakeven !== null ? breakeven : '&gt;' + maxYears,
 milesEnd: '$' + milesValues[maxYears].toFixed(4),
 cashEnd: '$' + cashValues[maxYears].toFixed(4),
 });

 traces.push({
 x: years, y: milesValues,
 name: `${(cpp*100).toFixed(1)}¢ CPP`,
 mode: 'lines+markers',
 marker: {size: 4}
 });
 }

 // Table
 $('tbody').innerHTML = rows.map(r =&gt;
 `&lt;tr&gt;&lt;td&gt;${r.cpp}¢&lt;/td&gt;&lt;td&gt;${r.dev}&lt;/td&gt;&lt;td&gt;${r.initVal}&lt;/td&gt;&lt;td&gt;${r.breakeven}&lt;/td&gt;&lt;td&gt;${r.milesEnd}&lt;/td&gt;&lt;td&gt;${r.cashEnd}&lt;/td&gt;&lt;/tr&gt;`
 ).join('');

 // Chart
 Plotly.newPlot('chart', traces, {
 title: 'Value per $1 Spent: Miles vs Cash-back Invested',
 paper_bgcolor: 'rgba(0,0,0,0)',
 plot_bgcolor: 'rgba(0,0,0,0)',
 font: {color: '#c9d1d9'},
 margin: {l: 50, r: 20, t: 40, b: 50},
 xaxis: {title: 'Years', gridcolor: '#21262d'},
 yaxis: {title: 'Value ($)', gridcolor: '#21262d'},
 legend: {orientation: 'h', y: -0.2},
 }, {responsive: true});
}

document.querySelectorAll('.inputs input').forEach(el =&gt; el.addEventListener('input', recalc));
recalc();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item><item><title>CAGR Calculator</title><link>https://www.ashwinmenon.com/finance/cagr/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/finance/cagr/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;CAGR Calculator&lt;/title&gt;

&lt;style&gt;
 :root {
 --bg: #faf7f2;
 --card: #ffffff;
 --border: #d5c7b8;
 --text: #2f2a26;
 --sub: #6a5f58;
 --accent: #5b8a72;
 --accent-light: #6fa88a;
 --radius: 10px;
 }

 body {
 font-family: system-ui, sans-serif;
 background: var(--bg);
 color: var(--text);
 max-width: 760px;
 margin: 40px auto;
 padding: 0 20px;
 line-height: 1.5;
 }

 h1 {
 margin-bottom: 8px;
 font-weight: 600;
 color: var(--accent);
 }

 .description {
 color: var(--sub);
 margin-bottom: 24px;
 }

 .section {
 background: var(--card);
 padding: 24px;
 border: 1px solid var(--border);
 border-radius: var(--radius);
 margin-bottom: 20px;
 }

 .input-group {
 margin-bottom: 16px;
 }

 label {
 display: block;
 margin-bottom: 6px;
 font-weight: 500;
 color: var(--text);
 }

 input {
 width: 100%;
 padding: 10px;
 border: 1px solid var(--border);
 border-radius: 6px;
 font-size: 16px;
 box-sizing: border-box;
 }

 input:focus {
 outline: none;
 border-color: var(--accent);
 }

 input.calculated {
 background: #f0f8f4;
 border-color: var(--accent-light);
 }

 button {
 background: var(--accent);
 color: white;
 border: none;
 padding: 12px 24px;
 border-radius: 6px;
 font-size: 16px;
 cursor: pointer;
 margin-right: 10px;
 }

 button:hover {
 background: var(--accent-light);
 }

 .note {
 margin-top: 20px;
 padding: 12px;
 background: #fef9f0;
 border-left: 3px solid var(--accent);
 color: var(--sub);
 font-size: 14px;
 }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;CAGR Calculator&lt;/h1&gt;
&lt;p class="description"&gt;
 Enter any 3 values to calculate the 4th. CAGR = Compound Annual Growth Rate.
&lt;/p&gt;</description></item><item><title>Vibes</title><link>https://www.ashwinmenon.com/vibes/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/vibes/</guid><description>&lt;p&gt;Tools and pages I&amp;rsquo;ve built when inspiration struck.&lt;/p&gt;
&lt;h2 id="one-offs"&gt;One-offs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/curiosities/cash_points.html"&gt;Cash vs Points&lt;/a&gt; - Miles vs cash-back calculator with breakeven analysis (11 Feb 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/lichess/"&gt;Lichess&lt;/a&gt; - Visualize rating progression over number of games played (07 Jan 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/clean_logs/"&gt;Clean Logs&lt;/a&gt; - Tool to remove file:line prefixes from log output (13 Nov 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/values/"&gt;Values&lt;/a&gt; - Personal values and life philosophy (05 Nov 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/lennon-or-mccartney/"&gt;Lennon or McCartney&lt;/a&gt; - Beatles preference analyzer based on composition (28 Apr 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/phones/"&gt;Phones&lt;/a&gt; - Device Speedometer benchmark scores comparison chart (03 Apr 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/yearly/"&gt;Yearly&lt;/a&gt; - Year planner with monthly tasks and progress tracking (09 Sep 2024; not updated)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ashwinmenon.com/benchmarks/"&gt;Benchmarks&lt;/a&gt; - Personal exercise/fitness benchmarks (03 Jul 2024; not updated)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Smorgasbord: &lt;a href="https://www.ashwinmenon.com/explainers.html"&gt;Explainers&lt;/a&gt;, &lt;a href="https://www.ashwinmenon.com/finance/"&gt;Finance&lt;/a&gt;, &lt;a href="https://www.ashwinmenon.com/curiosities/"&gt;Curiosities&lt;/a&gt;, &lt;a href="https://www.ashwinmenon.com/neuralnetcourse/"&gt;Neural Net Course (In Progress)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>An ode to my achamma: What does legacy mean?</title><link>https://www.ashwinmenon.com/posts/thoughts/2026-01-31-an-ode-to-my-achamma/</link><pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2026-01-31-an-ode-to-my-achamma/</guid><description>&lt;p&gt;I looked up what the latest AIs had said about &lt;a href="https://gemini.google.com/share/31ec129359d2"&gt;my father&lt;/a&gt;, my mother and the male ancestors on &lt;a href="https://gemini.google.com/share/67448aec5c26"&gt;her side of the family&lt;/a&gt;. It&amp;rsquo;s incredible how many things individual people can do. As a constant presence in &amp;ldquo;my&amp;rdquo; home for the first 18 years, whatever they did or achieved was just lost in the mundane swings of time that constitute daily life. It&amp;rsquo;s good to have a retrospective and reflect once in a while. As the Foo Fighters sang, &amp;ldquo;There goes my hero&amp;hellip; he&amp;rsquo;s ordinary.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Optimizing Tack On</title><link>https://www.ashwinmenon.com/posts/technical/2026-01-17-optimizing-tack-on/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2026-01-17-optimizing-tack-on/</guid><description>&lt;p&gt;With AI advancing rapidly, one of the most asked questions these days is, &amp;ldquo;Are software engineers still needed?&amp;rdquo;. I have some answers! I love optimizations and performance engineering, and decided to dig into my codebase (with Claude Code) to find possible improvements in this domain. If you&amp;rsquo;ve worked with these tools, then you know that for an inquizitive person, there is nothing better as with AI, you get to learn and improve at a rapid pace!&lt;/p&gt;</description></item><item><title>I need more context</title><link>https://www.ashwinmenon.com/posts/technical/2026-01-16-i-need-more-context/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2026-01-16-i-need-more-context/</guid><description>&lt;style&gt;
 /* Container for the buttons */
 .button-nav {
 display: flex;
 gap: 15px;
 border-bottom: 1px dashed #8c8c8c;
 padding-bottom: 1rem;
 }

 /* Matching your Cactus theme style */
 .btn-author {
 background: none;
 border: 1px solid #2bbc8a;
 color: #2bbc8a;
 font-family: "JetBrains Mono", monospace;
 font-size: 0.85rem;
 padding: 6px 15px;
 cursor: pointer;
 transition: all 0.2s ease-in-out;
 text-transform: lowercase; /* Keeps the minimalist look */
 }

 .btn-author:hover {
 background-color: #2bbc8a;
 color: #fff;
 }

 /* Style for when the button is "active" */
 .btn-author.active {
 background-color: #383838;
 border-color: #383838;
 color: #2bbc8a;
 }

 /* Content area transition */
 .author-content {
 animation: fadeIn 0.4s ease;
 padding: 1rem 0;
 }

 @keyframes fadeIn {
 from { opacity: 0; transform: translateY(5px); }
 to { opacity: 1; transform: translateY(0); }
 }

 /* Override h1 margins in content target */
 #author-content-target h1 {
 margin-top: 0;
 margin-block-start: 0;
 }
&lt;/style&gt;
&lt;p&gt;&lt;em&gt;Click the buttons to rewrite the article in the style of different authors&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Happy New Year: Friends Forever?</title><link>https://www.ashwinmenon.com/posts/thoughts/2025-12-31-happy-new-year/</link><pubDate>Wed, 31 Dec 2025 21:38:37 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2025-12-31-happy-new-year/</guid><description>&lt;p&gt;For as long as I can remember, I&amp;rsquo;ve found I&amp;rsquo;m happiest when surrounded by friends. From my early childhood, all the way to adulthood, I spent a lot of time with friends and placed a huge amount of importance on friendships. Throughout my school years, I mostly picked my subjects and activities based on what my friends did - whether it was quizzing, or choosing computer science as the added elective in the 11th-grade (or initially preferring &amp;ldquo;engineering drawing&amp;rdquo;) and of course, the sports I played (well, you do need friends to play with after all). This carried on to college, where, while everyone was worried about their grades and career, my plan - just like before - was simply to do what my friends were doing. People were aiming for jobs with top companies while I honestly was aiming to land in the same city as my friends (that didn&amp;rsquo;t happen, but I made some new ones). And then came independent adult life, where I decided to move out west partly because none of my friends were in the same city as I was anymore. Honestly, I hit &amp;ldquo;hard relate&amp;rdquo; when I saw this kid&amp;rsquo;s answer &lt;a href="https://youtu.be/vkGBT2jQHk4?t=2678"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>F1 AI benchmarks</title><link>https://www.ashwinmenon.com/posts/activities/2025-12-21-f1-ai-benchmarks/</link><pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-12-21-f1-ai-benchmarks/</guid><description>&lt;p&gt;Any researchers who want the prompts and/or links to the chats can contact me =)&lt;/p&gt;
&lt;p&gt;I went through the &lt;a href="https://www.youtube.com/watch?v=D-6b-vD6ZdA"&gt;Formula 1 EOY quiz&lt;/a&gt; on Mr V&amp;rsquo;s Garage&amp;rsquo;s YouTube channel and decided to put some AIs through the test as well. For the LLMs, I gave each of them just 1 shot at the questions. These all use the free versions of the LLMs. Here is how I fared, and how the AIs fared (x indicates incorrect, v indicates correct, p indicates partially correct):&lt;/p&gt;</description></item><item><title>Now</title><link>https://www.ashwinmenon.com/now/</link><pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/now/</guid><description>&lt;p&gt;This is my &lt;a href="https://nownownow.com/about"&gt;now page&lt;/a&gt;. It tells you what I&amp;rsquo;m currently focused on.&lt;/p&gt;
&lt;h2 id="what-im-working-on"&gt;What I&amp;rsquo;m working on&lt;/h2&gt;
&lt;p&gt;Improving &lt;a href="https://www.hunchle.com"&gt;Hunchle&lt;/a&gt;.&lt;br&gt;
In-progress: Writing explainer articles.&lt;br&gt;
On-and-off: Working on an AI course.&lt;br&gt;
Backlog: Working on a language-learning course.&lt;/p&gt;
&lt;h2 id="what-im-learning"&gt;What I&amp;rsquo;m learning&lt;/h2&gt;
&lt;p&gt;AI (LLMs from the ground up).&lt;/p&gt;
&lt;h2 id="what-im-reading"&gt;What I&amp;rsquo;m reading&lt;/h2&gt;
&lt;p&gt;Tracked on &lt;a href="https://app.thestorygraph.com/profile/chickenshawarma"&gt;StoryGraph&lt;/a&gt;. I prefer this to GoodReads as this is actively developed, and a small business. As a bonus, it&amp;rsquo;s woman-owned!&lt;/p&gt;
&lt;h2 id="where-i-am"&gt;Where I am&lt;/h2&gt;
&lt;p&gt;Western Hemisphere&lt;/p&gt;</description></item><item><title>Are we in a bubble?</title><link>https://www.ashwinmenon.com/posts/thoughts/2025-12-04-are-we-in-a-bubble/</link><pubDate>Thu, 04 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2025-12-04-are-we-in-a-bubble/</guid><description>&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Intro/Disclaimer: Trade at your own risk!&lt;/strong&gt;&lt;/summary&gt;
&lt;p&gt;Just like women think &amp;ldquo;I&amp;rsquo;m special&amp;rdquo; and &amp;ldquo;This time it&amp;rsquo;ll be different&amp;rdquo; when it comes to relationships, men think the same way when it comes to stock trading.&lt;/p&gt;
&lt;p&gt;Warren Buffett&amp;rsquo;s advice has remained the same for years: Most people should simply dump their money into an index fund that tracks the market and forget about it rather than actively trade and lose money. I too have recommended that same approach in one of my most-read &lt;a href="https://www.ashwinmenon.com/posts/activities/2017-01-30-a-guide-to-finances/"&gt;posts&lt;/a&gt;, but given my actions, I think I need to add another oft-repeated piece of advice: &amp;ldquo;do as I say and not as I do.&amp;rdquo;&lt;/p&gt;</description></item><item><title>YouTube videos</title><link>https://www.ashwinmenon.com/posts/reviews/2025-12-02-youtube-videos/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2025-12-02-youtube-videos/</guid><description>&lt;h2 id="12022025"&gt;12/02/2025&lt;/h2&gt;
&lt;p&gt;Jensen&amp;rsquo;s talk at the Stanford Graduate School of Business (&lt;a href="https://www.youtube.com/watch?v=lXLBTBBil2U"&gt;link&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="my-takeaways"&gt;My takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I find Jensen very interesting. He has SRK-like mannerisms, and probably a similar level of charisma (the latest silky, gray-haired Jensen, the Jensen from the mid-2000s, maybe not). He speaks very well, by which I mean he says mostly profound things with very little fluff and is able to talk and deliver his views without making anyone feeling worse. He gives off a huge &amp;ldquo;sweet talker&amp;rdquo; vibe (charisma), which is normally something I&amp;rsquo;ve not seen outside scammers, and to be clear I don&amp;rsquo;t think he&amp;rsquo;s anything close to being a scammer.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Do what you are uniquely positioned to do&amp;rdquo; (similar to thoughts I had, and also what Satoro Iwata had said). &amp;ldquo;The only question is, is this important work? And if we didn&amp;rsquo;t do it, would it have happened without us?&amp;rdquo; (23:38). &amp;ldquo;Your job is to make a unique contribution &amp;hellip; to do something that nobod else in the world would do or can do&amp;rdquo; (at 44:50).&lt;/li&gt;
&lt;li&gt;Organizations should be structured to enable everyone to do their best work (get out of the way, remove obstacles) &amp;ldquo;(My job is) to create the conditions by which you can do your life&amp;rsquo;s work&amp;rdquo; (twic, at 34:30 and AGAIN! at 43:33).&lt;/li&gt;
&lt;li&gt;The CEO (&amp;amp; leaders) should be visible (to employees). &amp;ldquo;Leaders have to be seen&amp;rdquo; (27:42). &amp;ldquo;(if the stock price has dropped by 80%) The most important thing I have to do as the CEO is this: to come and face you, explain it (even if you don&amp;rsquo;t have a great answer)&amp;rdquo; (28:35)&lt;/li&gt;
&lt;li&gt;The CEO should not rely on secrecy. Information should be shared publicly. &amp;ldquo;(sarcastically) The knowledge, the information of a CEO is supposedly so valuable, so secretive, you can only share it with two other people or three [&amp;hellip;] I don&amp;rsquo;t believe in a culture, an environment where the information you possess is the reason why you have power. I would like all of us to contribute to the company and our position in the company should have something to do with our ability to reason through complicated things, lead other people to achieve greatness, inspire, empower other people&amp;hellip;&amp;rdquo; (33:10)&lt;/li&gt;
&lt;li&gt;Regulations should be done by specialists in the field (53:05). Interesting thought. I agree and wonder why this level of nuance is not there in most governments (and for that matter most discussions) around the world. Why not have a young tech advisor or tech-enabler to allow governments to digitize and democratize access to information?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-notes"&gt;Other notes&lt;/h3&gt;
&lt;p&gt;He also looks back on life to decide what to do, which (to me) is similar to Bezos&amp;rsquo; regret minimization framework.
I didn&amp;rsquo;t understand his point about tokens floating in space (51:10).
Quotes indicate I paraphrased something in the talk. They aren&amp;rsquo;t exact quotations as you may expect, so I have this note here.&lt;/p&gt;</description></item><item><title>I want my Chicken Shawarma: How I cut booking costs by 10x</title><link>https://www.ashwinmenon.com/posts/activities/2025-11-20-free-bookings/</link><pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-11-20-free-bookings/</guid><description>&lt;p&gt;I like playing sports. I created an app to notify me when courts are available.&lt;/p&gt;
&lt;h2 id="general-design"&gt;General design&lt;/h2&gt;
&lt;p&gt;I had built this a few months ago and was able to get it running from my laptop. I don&amp;rsquo;t have my notes from back then.&lt;/p&gt;
&lt;h3 id="adding-notifications"&gt;Adding notifications&lt;/h3&gt;
&lt;p&gt;What I wanted now was to get it running on a remote server and also to give it the capability to provide notifications. For notifications, I settled on pushbullet though WhatsApp would have been ideal. Seems like more products may be needed in this space to make notifications easier to get. How hard is the WhatsApp API to integrate with? I don&amp;rsquo;t know, but maybe good to look at for a future project. Twilio is a big player in this space.&lt;/p&gt;</description></item><item><title>Models for thinking</title><link>https://www.ashwinmenon.com/posts/thoughts/2025-11-12-models-for-thinking/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2025-11-12-models-for-thinking/</guid><description>&lt;p&gt;None of these are particularly revolutionary, but it helps to have them listed so you can use them actively to your benefit (rather than hoping these tools fall into your hand).&lt;/p&gt;
&lt;h2 id="line-on-a-spectrum"&gt;Line on a spectrum&lt;/h2&gt;
&lt;p&gt;Many things that seem black-or-white are simply just different lines on a spectrum. Think of the spectrum as a horizontal line, and the &amp;ldquo;line&amp;rdquo; as a point (or a vertical line that you wouldn&amp;rsquo;t cross). For example, for some, any lie is too far. While others may be okay with white lies (&amp;ldquo;I&amp;rsquo;m busy today&amp;rdquo; when you aren&amp;rsquo;t) and others may be fine with outright lying too (&amp;ldquo;I know for a fact this product does not harm you&amp;rdquo; - even when you know it does).&lt;/p&gt;</description></item><item><title>A Mallu in America</title><link>https://www.ashwinmenon.com/posts/thoughts/2025-11-06-a-mallu-in-america/</link><pubDate>Thu, 06 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2025-11-06-a-mallu-in-america/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Disclaimer: There are some generalizations below, and so all the disclaimers for generalizations apply. Some of those being: these are inferences being made on a set of observations so the inferences may be completely wrong, and by definition a generalization means this does not apply to all individuals in that society.&lt;/p&gt;
&lt;p&gt;The irony of a Malayalee working in America may not be obvious to many. A Malayalee is someone who hails from the state of Kerala where the native tongue is Malayalam. Kerala is home to the world&amp;rsquo;s first democratically-elected communist government. America, of course, is a capitalistic society.&lt;/p&gt;</description></item><item><title>Pros(e) and concerts</title><link>https://www.ashwinmenon.com/posts/activities/pros-and-concerts/</link><pubDate>Tue, 28 Oct 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/pros-and-concerts/</guid><description>&lt;p&gt;I don&amp;rsquo;t think concerts are worth going to. Over the years I&amp;rsquo;ve attended concerts by Muse, Iron Maiden, John Mayer, and others. But, over the past few years, I&amp;rsquo;ve increasingly felt that the experience of attending a concert isn&amp;rsquo;t worth the price I&amp;rsquo;d pay. I&amp;rsquo;d rather spend time trying out escape rooms, joining sports leagues or if we want to stick to live performances, then watching theatre and stand-up comedy, where tickets are still reasonably priced.&lt;/p&gt;</description></item><item><title>What I've been up to</title><link>https://www.ashwinmenon.com/posts/activities/wibu/</link><pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/wibu/</guid><description>&lt;h2 id="a-laundry-list"&gt;A laundry list&lt;/h2&gt;
&lt;p&gt;Started doing stand-up comedy. You can read more &lt;a href="https://www.ashwinmenon.com/posts/activities/2025-07-14-chancing-my-arm/"&gt;here&lt;/a&gt;.&lt;br&gt;
The first two weeks after I quit, I did a lot of chores - both for the household and myself.&lt;br&gt;
Started reading about company and business valuations. Now I understand P/E ratios, the PEG model, how to use discounted cash flows to estimate a fair stock price &amp;amp; compare it with the implied P/E ratio and how to determine the health of a business by comparing debt to revenue. I&amp;rsquo;ve also talked with friends about looking into market cap as a multiple of revenue and using the price-to-sales ratio when a company is not profitable.&lt;br&gt;
Some weeks I did nothing except relax by playing video games or surfing and scrolling.&lt;/p&gt;</description></item><item><title>A Malayalee's guide to Kerala</title><link>https://www.ashwinmenon.com/posts/activities/2025-09-29-a-malayalees-guide-to-kerala/</link><pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-09-29-a-malayalees-guide-to-kerala/</guid><description>&lt;h2 id="kerala"&gt;Kerala&lt;/h2&gt;
&lt;p&gt;As an NRI, your dollar goes a lot farther in India. On trips back to India, my sister usually finds great resorts for us to enjoy. I&amp;rsquo;ve since realized many friends within India travel to Kerala as their go-to quick vacation destination, and so, I thought it&amp;rsquo;d be useful to provide a Malayalee&amp;rsquo;s guide to vacationing in Kerala. And if at least one person in your party speaks Malayalam, it makes things much easier (to communicate with the locals). If you don&amp;rsquo;t know Malayalam, English is your best bet (and then Hindi).&lt;/p&gt;</description></item><item><title>EB-2/EB-3 for Indians</title><link>https://www.ashwinmenon.com/posts/thoughts/2025-09-02-eb2-eb3-for-indians/</link><pubDate>Tue, 02 Sep 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2025-09-02-eb2-eb3-for-indians/</guid><description>&lt;h2 id="the-green-card-blues"&gt;The green card blues&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re an Indian in the US (or thinking about moving to the US), you likely know the problems with immigrating to the US. By virtue of being born in the most populous country on Earth, the employment-based green card route is effectively closed to Indians.&lt;/p&gt;
&lt;p&gt;However, there isn&amp;rsquo;t a clear way to know how long the wait may be. And if you don&amp;rsquo;t know how long, then you can&amp;rsquo;t easily plan what you&amp;rsquo;d like to do.
So, I wrote a script to estimate when your priority date may be current (i.e. when you are able to move forward in the green card process). Ping me directly if you want the predicted date for your priority date.&lt;/p&gt;</description></item><item><title>On Software Design</title><link>https://www.ashwinmenon.com/posts/technical/2025-09-01-on-software-design/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2025-09-01-on-software-design/</guid><description>&lt;p&gt;For a lot of my career, I never really understood software design. It was always presented as something more associated with SDE2s, or higher and not so much with SDE1s. I had no idea what to make of it or what to do with that information. The first few design documents I wrote seemed inane. There was something to be done, and we all knew what we wanted to do, but it looked like I had to formalize it in some way before I could move forward. The document always had a structure, always following a similar pattern, that made this exercise seem even more tedious. The structure usually went like this: Motivation, Problem, Requirements, Chosen proposal, Considered but declined proposal, Appendix. A glossary and &amp;ldquo;not in scope&amp;rdquo; section could also be excluded. For each proposal, we&amp;rsquo;d need to list out the pros and cons.&lt;/p&gt;</description></item><item><title>EB-5 for Indians</title><link>https://www.ashwinmenon.com/posts/thoughts/2025-08-06-eb5-for-indians/</link><pubDate>Wed, 06 Aug 2025 12:23:34 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2025-08-06-eb5-for-indians/</guid><description>&lt;p&gt;DISCLAIMER: None of the below is financial advice or recommendations for anyone beyond myself. Please do your due diligence (and don&amp;rsquo;t sue me, thanks!)!&lt;/p&gt;
&lt;h2 id="what"&gt;What&lt;/h2&gt;
&lt;p&gt;EB-5 is a program where you invest some money (800K$ minimum) and in exchange may be eligible for a green card.&lt;/p&gt;
&lt;p&gt;One of the key issues with the EB-5 visa program is that it is currently backlogged for Indian citizens. However, some specific investment categories (targeted employment areas or TEAs) are not affected by this backlog. It&amp;rsquo;s essential to ensure that any investments are directed into those categories to avoid delays.&lt;/p&gt;</description></item><item><title>Thoughts on superintelligence</title><link>https://www.ashwinmenon.com/posts/thoughts/2025-08-01-thoughts-on-superintelligence/</link><pubDate>Fri, 01 Aug 2025 14:35:22 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2025-08-01-thoughts-on-superintelligence/</guid><description>&lt;p&gt;Zuckerberg has written a post on &amp;ldquo;personal superintelligence&amp;rdquo; &lt;a href="https://www.meta.com/superintelligence/"&gt;here&lt;/a&gt;. Most of it is just fluff - for example, &amp;ldquo;superintelligence&amp;rdquo; is never defined*, so it looks more like a PR piece. However, there are a couple of lines worth commenting on.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If trends continue, then you&amp;rsquo;d expect people to spend less time in productivity software, and more time creating and connecting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not sure what &amp;ldquo;productivity software&amp;rdquo; refers to here, but as a business that relies on creators, it makes sense that Meta would want people spending more time creating and engaging with their software&amp;hellip; err.. I mean &amp;ldquo;connecting with others&amp;rdquo;. Sincerely, I do believe Meta&amp;rsquo;s products facilitate some connection, but my full thoughts on this are complex and better saved for a future post. This seems out of place with the rest of the article (which is about &amp;ldquo;empowering&amp;rdquo; people) but is in line with what makes sense for Meta as a business.&lt;/p&gt;</description></item><item><title>Chancing my arm at stand-up comedy</title><link>https://www.ashwinmenon.com/posts/activities/2025-07-14-chancing-my-arm/</link><pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-07-14-chancing-my-arm/</guid><description>&lt;h2 id="my-love-for-stand-up"&gt;My love for stand-up&lt;/h2&gt;
&lt;details&gt;
 &lt;summary&gt;Click to expand; feel free to skip&lt;/summary&gt;
&lt;p&gt;
I've often thought of myself as someone who loved making people laugh. I'd played that role at school, though I'm not sure others remember me that way.
In college too, I was delighted when others were laughing - whether with me or, occasionally, at me. 
&lt;p&gt;I&amp;rsquo;d been watching stand-up since around 2007, when Russell Peters was all the rage. An Indian-origin stand-up comic was unheard of, and he quickly built up a fanbase in Dubai. He seemed to put in front of people things that were uncomfortable to say, but fun to laugh at, and at the time, that was refreshing. It was also okay, as long as it was confined to the stand-up stage. Thanks to the internet, I quickly followed up with videos of George Carlin, Mitch Hedberg, Eddie Izzard, Louis CK, Jerry Seinfeld and many others.&lt;/p&gt;</description></item><item><title>Hunchle: Generating questions</title><link>https://www.ashwinmenon.com/posts/activities/2025-06-10-hunchle-generating-questions/</link><pubDate>Tue, 10 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-06-10-hunchle-generating-questions/</guid><description>&lt;p&gt;Time for a blog post detailing the difficulty with creating a fun-to-play trivia app (&lt;a href="https://www.hunchle.com"&gt;www.hunchle.com&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="generating-questions-is-hard"&gt;Generating questions is hard&lt;/h2&gt;
&lt;p&gt;A good quiz app needs good questions. That should be obvious, and your #1 priority, but when I initially built Hunchle, I decided to focus on other features (&lt;a href="https://www.ashwinmenon.com/posts/activities/2025-05-28-how-i-used-ai-in-hunchle/"&gt;adding AI hints&lt;/a&gt;, streaks, share results, and thinking of whether I should include ads: I didn&amp;rsquo;t). What makes a good question? As someone who has dabbled in quizzing through high school and college, I was told, &amp;ldquo;A good question is one that you can work out. Not one that you either know or you don&amp;rsquo;t&amp;rdquo;. For example, &amp;ldquo;What is the name of the elf in the Fellowship of the Ring?&amp;rdquo; is a horrible question. There is no way you can guess the answer if you don&amp;rsquo;t know it. A much better formulation of the same question would be, &amp;ldquo;Legolas is this type of being, which shares its name with the title of a movie starring Will Ferrell&amp;rdquo;. Here, even if you don&amp;rsquo;t know the word &amp;ldquo;Elf&amp;rdquo; from The Lord of the Rings context, you may be able to guess at it from the movie clue.&lt;/p&gt;</description></item><item><title>How I used AI in Hunchle</title><link>https://www.ashwinmenon.com/posts/activities/2025-05-28-how-i-used-ai-in-hunchle/</link><pubDate>Wed, 28 May 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-05-28-how-i-used-ai-in-hunchle/</guid><description>&lt;p&gt;I used AI in a big way to build &lt;a href="https://www.hunchle.com"&gt;Hunchle&lt;/a&gt;. I figured it would be useful to write this post to share my experience and to document what coding with AI looks like today.&lt;/p&gt;
&lt;p&gt;There were two major ways I used LLMs in Hunchle, a trivia app:&lt;/p&gt;
&lt;h2 id="1-generating-questions"&gt;1. Generating questions&lt;/h2&gt;
&lt;p&gt;In an ideal world, I&amp;rsquo;d generate 30,000 questions by myself, custom-crafted the way I like quiz questions. However, that was more of a time investment than I&amp;rsquo;d have liked. So, I decided to use AI (ChatGPT, Gemini, and Grok mostly) to generate some questions for me.&lt;/p&gt;</description></item><item><title>Democratizing AI</title><link>https://www.ashwinmenon.com/posts/activities/2025-04-25-democratizing-ai/</link><pubDate>Fri, 25 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-04-25-democratizing-ai/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been following along, I&amp;rsquo;ve been using LLMs for a while, as detailed &lt;a href="https://www.ashwinmenon.com/posts/technical/2024-09-10-how-i-use-ai/"&gt;here&lt;/a&gt; and &lt;a href="https://www.ashwinmenon.com/posts/technical/2024-11-11-how-i-use-ai-part-deux/"&gt;here&lt;/a&gt;. I learned a lot about the world of LLMs and I&amp;rsquo;ve tried to capture that here. Recently, motivated by Thorsten Ball&amp;rsquo;s excellent &lt;a href="https://ampcode.com/how-to-build-an-agent"&gt;&amp;ldquo;How to build an agent&amp;rdquo;&lt;/a&gt; guide, I decided to jump in and get my feet wet building AI agents with AI (LLMs).&lt;/p&gt;
&lt;h2 id="hello-nice-to-meet-you"&gt;Hello, nice to meet you!&lt;/h2&gt;
&lt;p&gt;Like any good beginning, I must include introductions.&lt;/p&gt;</description></item><item><title>Why LinkedIn is the best social network (for me)</title><link>https://www.ashwinmenon.com/posts/activities/2025-04-18-why-linked-in-is-the-best/</link><pubDate>Fri, 18 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2025-04-18-why-linked-in-is-the-best/</guid><description>&lt;p&gt;At the outset, this may seem an absurd conclusion. To make my point, I&amp;rsquo;ll need to go into a little bit about how social networks came to be. It won&amp;rsquo;t take long.&lt;/p&gt;
&lt;p&gt;Back in the mid-2000s, we had a bunch of social networks pop up. Hi5, Orkut, and of course, Facebook got a foothold on Dubai&amp;rsquo;s &amp;ldquo;interwebz&amp;rdquo;.
Possibly due to its simplicity or due to the exclusiveness stemming from its invite-only system, Facebook soon came to dominate. Importantly, at least in the beginning, Facebook had a simple guarantee: you post, and it would - with a 100% guarantee - land on your friends&amp;rsquo; walls (as feeds were called back then). This meant everything that I wanted to say would get blasted to my friends&amp;rsquo; screens and all the cool parties my friends were at would dangle irresistibly out of reach on my feed.&lt;/p&gt;</description></item><item><title>Marriage Penalty Calculator</title><link>https://www.ashwinmenon.com/curiosities/married_tax/</link><pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/curiosities/married_tax/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;title&gt;2025 Marriage Penalty / Bonus Heatmap&lt;/title&gt;
 &lt;script src="https://d3js.org/d3.v7.min.js"&gt;&lt;/script&gt;
 &lt;style&gt;
 body {
 font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
 margin: 20px;
 }
 .chart-container {
 max-width: 1000px;
 }
 .tooltip {
 position: absolute;
 pointer-events: none;
 background: rgba(0,0,0,0.85);
 color: #fff;
 padding: 8px 10px;
 border-radius: 4px;
 font-size: 12px;
 line-height: 1.4;
 z-index: 10;
 }
 .axis text {
 font-size: 11px;
 }
 .axis-label {
 font-size: 12px;
 font-weight: 600;
 }
 .title {
 font-size: 16px;
 font-weight: 600;
 margin-bottom: 4px;
 }
 .subtitle {
 font-size: 12px;
 color: #555;
 margin-bottom: 10px;
 max-width: 800px;
 }
 .legend text {
 font-size: 11px;
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="chart-container"&gt;
 &lt;div class="title"&gt;Approximate 2025 U.S. Federal Marriage Penalty / Bonus&lt;/div&gt;
 &lt;div class="subtitle"&gt;
 Simplified model: wages only, standard deduction, and a stylized childless EITC-like credit to produce penalties at low, equal incomes (for 2025 brackets). Positive values are penalties (more tax when married), negative values are bonuses. All numbers approximate, not tax advice. The 2017 Tax Cuts and Jobs Act (TCJA), now effectively locked in through 2025 by later legislation, made almost all the joint brackets exactly double the single brackets and doubled the standard deduction, sharply reducing bracket‑driven marriage penalties for middle and upper‑middle incomes.
 &lt;/div&gt;
 &lt;svg id="heatmap" width="1000" height="550"&gt;&lt;/svg&gt;
&lt;/div&gt;

&lt;div id="tooltip" class="tooltip" style="display:none;"&gt;&lt;/div&gt;

&lt;script&gt;
// -----------------------------
// 2025 tax parameters (approx.)
// -----------------------------
// Brackets for taxable income (after standard deduction). [web:6][web:7][web:10][web:13]
const BRACKETS_2025_SINGLE = [
 {lower: 0, upper: 11925, rate: 0.10},
 {lower: 11925, upper: 48475, rate: 0.12},
 {lower: 48475, upper: 103350, rate: 0.22},
 {lower: 103350, upper: 197300, rate: 0.24},
 {lower: 197300, upper: 250525, rate: 0.32},
 {lower: 250525, upper: 375800, rate: 0.35},
 {lower: 375800, upper: Infinity, rate: 0.37}
];

const BRACKETS_2025_MFJ = [
 {lower: 0, upper: 23850, rate: 0.10},
 {lower: 23850, upper: 96950, rate: 0.12},
 {lower: 96950, upper: 206700, rate: 0.22},
 {lower: 206700, upper: 394600, rate: 0.24},
 {lower: 394600, upper: 501050, rate: 0.32},
 {lower: 501050, upper: 751600, rate: 0.35},
 {lower: 751600, upper: Infinity, rate: 0.37}
];

// Standard deductions 2025 (approx). [web:20][web:26]
const STD_DED_SINGLE = 15750;
const STD_DED_MFJ = 31500;

// -----------------------------
// Simple EITC-like credit model
// -----------------------------
// NYT penalties at low equal incomes are driven largely by EITC and related credits. [web:1][web:31][web:33]
// This is a stylized, childless credit, not an exact reproduction of 2025 law.
function eitc_simplified_childless_2025(earnedIncome, filingStatus) {
 // Basic shape: credit rises with earnings to a max, then phases out. [web:31][web:33]
 // Parameters loosely chosen to produce penalties qualitatively similar to NYT.
 let phaseInRate, maxCredit, phaseInEnd, phaseOutStart, phaseOutEnd;

 if (filingStatus === "single") {
 phaseInRate = 0.15;
 maxCredit = 700; // approximate magnitude
 phaseInEnd = 7000;
 phaseOutStart = 9000;
 phaseOutEnd = 22000;
 } else if (filingStatus === "mfj") {
 // MFJ thresholds a bit higher, but not doubled, which can create penalties. [web:33]
 phaseInRate = 0.15;
 maxCredit = 700;
 phaseInEnd = 7000;
 phaseOutStart = 14000;
 phaseOutEnd = 27000;
 } else {
 return 0;
 }

 let credit = 0;
 if (earnedIncome &lt;= 0) {
 credit = 0;
 } else if (earnedIncome &lt;= phaseInEnd) {
 credit = phaseInRate * earnedIncome;
 } else if (earnedIncome &lt;= phaseOutStart) {
 credit = maxCredit;
 } else if (earnedIncome &lt;= phaseOutEnd) {
 const t = (phaseOutEnd - earnedIncome) / (phaseOutEnd - phaseOutStart);
 credit = Math.max(0, maxCredit * t);
 } else {
 credit = 0;
 }
 return credit;
}

// -----------------------------
// Core tax functions
// -----------------------------
function incomeTax2025(taxableIncome, brackets) {
 let tax = 0;
 let remaining = Math.max(0, taxableIncome);
 for (const b of brackets) {
 if (remaining &lt;= 0) break;
 const width = b.upper - b.lower;
 const amount = Math.max(0, Math.min(remaining, width));
 tax += amount * b.rate;
 remaining -= amount;
 }
 return tax;
}

function taxSingle2025(wages) {
 const taxable = Math.max(0, wages - STD_DED_SINGLE);
 const tax = incomeTax2025(taxable, BRACKETS_2025_SINGLE);
 const credit = eitc_simplified_childless_2025(wages, "single");
 return Math.max(0, tax - credit);
}

function taxMFJ2025(w1, w2) {
 const income = w1 + w2;
 const taxable = Math.max(0, income - STD_DED_MFJ);
 const tax = incomeTax2025(taxable, BRACKETS_2025_MFJ);
 const credit = eitc_simplified_childless_2025(income, "mfj");
 return Math.max(0, tax - credit);
}

// penalty (positive) / bonus (negative) in dollars and percent
function marriageEffect2025(w1, w2) {
 const income = w1 + w2;
 if (income &lt;= 0) return {delta: 0, pct: 0};

 const taxSingleTotal = taxSingle2025(w1) + taxSingle2025(w2);
 const taxMFJ = taxMFJ2025(w1, w2);
 const delta = taxMFJ - taxSingleTotal; // &gt;0 penalty, &lt;0 bonus
 const pct = delta / income;
 return {delta, pct};
}

// -----------------------------
// Build data grid
// -----------------------------
const totalIncomeMin = 40000;
const totalIncomeMax = 900000; // focusing on low/moderate incomes where credits matter most
const totalIncomeSteps = 80;

const splitSteps = 101; // 0%,1%,...,100%

const totalIncomes = d3.range(totalIncomeSteps).map(i =&gt;
 totalIncomeMin + (totalIncomeMax - totalIncomeMin) * i / (totalIncomeSteps - 1)
);
const splits = d3.range(splitSteps).map(i =&gt; i / (splitSteps - 1));

const grid = [];
totalIncomes.forEach((T, i) =&gt; {
 splits.forEach((s, j) =&gt; {
 const w1 = s * T;
 const w2 = (1 - s) * T;
 const eff = marriageEffect2025(w1, w2);
 grid.push({
 i, j,
 totalIncome: T,
 share1: s,
 w1,
 w2,
 delta: eff.delta,
 pct: eff.pct
 });
 });
});

// -----------------------------
// Draw heatmap with D3
// -----------------------------
const svg = d3.select("#heatmap");
const width = +svg.attr("width");
const height = +svg.attr("height");

const margin = {top: 40, right: 160, bottom: 60, left: 80};
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;

const g = svg.append("g")
 .attr("transform", `translate(${margin.left},${margin.top})`);

const xScale = d3.scaleLinear()
 .domain([0, 1])
 .range([0, innerWidth]);

const yScale = d3.scaleLinear()
 .domain([totalIncomeMin, totalIncomeMax])
 .range([innerHeight, 0]);

// Color scale in percentage points: -5% to +5%
const maxAbsPct = 0.05;
const colorScale = d3.scaleDiverging(d3.interpolateRdBu)
 .domain([maxAbsPct, 0, -maxAbsPct]); // red = penalty, blue = bonus

// Draw rectangles
const cellWidth = innerWidth / (splitSteps - 1);
const cellHeight = innerHeight / (totalIncomeSteps - 1);

g.selectAll("rect.cell")
 .data(grid)
 .enter()
 .append("rect")
 .attr("class", "cell")
 .attr("x", d =&gt; xScale(d.share1) - cellWidth / 2)
 .attr("y", d =&gt; yScale(d.totalIncome) - cellHeight / 2)
 .attr("width", cellWidth)
 .attr("height", cellHeight)
 .attr("fill", d =&gt; {
 const v = Math.max(-maxAbsPct, Math.min(maxAbsPct, d.pct));
 return colorScale(v);
 });

// Axes
const xAxis = d3.axisBottom(xScale)
 .tickValues([0, 0.25, 0.5, 0.75, 1.0])
 .tickFormat(d =&gt; `${Math.round(d * 100)}%`);

const yAxis = d3.axisLeft(yScale)
 .ticks(8)
 .tickFormat(d =&gt; `$${d3.format(",")(d)}`);

g.append("g")
 .attr("transform", `translate(0,${innerHeight})`)
 .attr("class", "axis")
 .call(xAxis);

g.append("g")
 .attr("class", "axis")
 .call(yAxis);

g.append("text")
 .attr("class", "axis-label")
 .attr("x", innerWidth / 2)
 .attr("y", innerHeight + 40)
 .attr("text-anchor", "middle")
 .text("Share of income earned by spouse 1");

g.append("text")
 .attr("class", "axis-label")
 .attr("transform", "rotate(-90)")
 .attr("x", -innerHeight / 2)
 .attr("y", -55)
 .attr("text-anchor", "middle")
 .text("Total household wage income (2025 $)");

// Color legend
const legendHeight = 200;
const legendWidth = 14;
const legendX = innerWidth + 40;
const legendY = (innerHeight - legendHeight) / 2;

const legend = g.append("g")
 .attr("class", "legend")
 .attr("transform", `translate(${legendX},${legendY})`);

const legendScale = d3.scaleLinear()
 .domain([-maxAbsPct, maxAbsPct])
 .range([legendHeight, 0]);

const legendAxis = d3.axisRight(legendScale)
 .ticks(5)
 .tickFormat(v =&gt; `${(v * 100).toFixed(1)}%`);

const legendData = d3.range(legendHeight).map(i =&gt; {
 const t = i / (legendHeight - 1);
 const v = maxAbsPct - 2 * maxAbsPct * (i / (legendHeight - 1));
 return {y: i, v};
});

legend.selectAll("rect")
 .data(legendData)
 .enter()
 .append("rect")
 .attr("x", 0)
 .attr("y", d =&gt; d.y)
 .attr("width", legendWidth)
 .attr("height", 1)
 .attr("fill", d =&gt; colorScale(d.v));

legend.append("g")
 .attr("transform", `translate(${legendWidth + 4},0)`)
 .call(legendAxis);

legend.append("text")
 .attr("x", legendWidth / 2)
 .attr("y", -10)
 .attr("text-anchor", "middle")
 .attr("class", "axis-label")
 .text("Penalty / bonus");

// -----------------------------
// Tooltip behavior
// -----------------------------
const tooltip = d3.select("#tooltip");

svg.on("mousemove", (event) =&gt; {
 const [mouseX, mouseY] = d3.pointer(event);

 // find nearest cell
 const xInChart = mouseX - margin.left;
 const yInChart = mouseY - margin.top;
 if (xInChart &lt; 0 || xInChart &gt; innerWidth || yInChart &lt; 0 || yInChart &gt; innerHeight) {
 tooltip.style("display", "none");
 return;
 }

 const s = xScale.invert(xInChart);
 const T = yScale.invert(yInChart);

 const i = Math.round((T - totalIncomeMin) / (totalIncomeMax - totalIncomeMin) * (totalIncomeSteps - 1));
 const j = Math.round(s * (splitSteps - 1));

 const clampedI = Math.max(0, Math.min(totalIncomeSteps - 1, i));
 const clampedJ = Math.max(0, Math.min(splitSteps - 1, j));

 const d = grid[clampedI * splitSteps + clampedJ];

 if (!d) {
 tooltip.style("display", "none");
 return;
 }

 const sign = d.delta &gt; 0 ? "penalty" : (d.delta &lt; 0 ? "bonus" : "neutral");
 const absDelta = Math.abs(d.delta);

 const container = document.querySelector(".chart-container");
 const rect = container.getBoundingClientRect();

 let left = rect.left + mouseX + 12;
 let top = rect.top + mouseY + 12;


 tooltip
 .style("display", "block")
 .style("left", left + "px")
 .style("top", top + "px")
 .html(`
 &lt;div&gt;&lt;strong&gt;Total income:&lt;/strong&gt; $${d3.format(",.0f")(d.totalIncome)}&lt;/div&gt;
 &lt;div&gt;&lt;strong&gt;Spouse 1:&lt;/strong&gt; $${d3.format(",.0f")(d.w1)} (${(d.share1 * 100).toFixed(0)}%)&lt;/div&gt;
 &lt;div&gt;&lt;strong&gt;Spouse 2:&lt;/strong&gt; $${d3.format(",.0f")(d.w2)} (${((1 - d.share1) * 100).toFixed(0)}%)&lt;/div&gt;
 &lt;div&gt;&lt;strong&gt;Marriage ${sign}:&lt;/strong&gt; $${d3.format(",.0f")(absDelta)} (${(d.pct * 100).toFixed(2)}%)&lt;/div&gt;
 &lt;div style="margin-top:4px;font-size:11px;opacity:0.8;"&gt;
 Positive = more tax if married; negative = less.
 &lt;/div&gt;
 `);
});

svg.on("mouseleave", () =&gt; {
 tooltip.style("display", "none");
});
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item><item><title>Sleep Activity Timeline</title><link>https://www.ashwinmenon.com/curiosities/sleep_cycle/timeline/</link><pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/curiosities/sleep_cycle/timeline/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;title&gt;Continuous Activity Actogram - Sleep Analysis&lt;/title&gt;
 &lt;script src="https://cdn.tailwindcss.com"&gt;&lt;/script&gt;
 &lt;style&gt;
 /* Custom styles for the continuous timeline */
 .timeline-container {
 position: relative;
 height: 40px;
 background-color: #e5eeec; /* Light gray-green background */
 border-radius: 8px;
 overflow: hidden; 
 margin-top: 2rem;
 cursor: crosshair; 
 }
 .activity-marker {
 position: absolute;
 top: 50%;
 transform: translate(-50%, -50%);
 width: 4px;
 height: 100%; 
 background-color: #3b82f6; /* Blue for activity */
 opacity: 0.8;
 pointer-events: none;
 z-index: 1;
 }
 /* Activity blocks (filled regions) */
 .activity-block {
 position: absolute;
 top: 0;
 height: 100%;
 background-color: #10b981; /* Green for activity */
 opacity: 0.6;
 pointer-events: none;
 border-radius: 4px;
 z-index: 1;
 }
 /* Gap regions (clickable areas between activity blocks) */
 .gap-region {
 position: absolute;
 top: 0;
 height: 100%;
 background-color: rgba(251, 191, 36, 0.15); /* Light yellow/amber */
 border-left: 2px dashed rgba(251, 191, 36, 0.6);
 border-right: 2px dashed rgba(251, 191, 36, 0.6);
 cursor: pointer;
 transition: all 0.2s ease;
 display: flex;
 align-items: center;
 justify-content: center;
 z-index: 0;
 }
 .gap-region:hover {
 background-color: rgba(251, 191, 36, 0.35);
 border-left-color: rgba(251, 191, 36, 0.9);
 border-right-color: rgba(251, 191, 36, 0.9);
 z-index: 1;
 }
 .gap-tag-btn {
 background-color: #f59e0b;
 color: white;
 padding: 4px 8px;
 border-radius: 4px;
 font-size: 0.7rem;
 font-weight: 600;
 opacity: 0;
 transition: opacity 0.2s ease;
 pointer-events: none;
 white-space: nowrap;
 text-shadow: 0 1px 2px rgba(0,0,0,0.3);
 cursor: pointer;
 }
 .gap-region:hover .gap-tag-btn {
 opacity: 1;
 pointer-events: auto;
 }
 .gap-region.small .gap-tag-btn {
 font-size: 0.6rem;
 padding: 2px 4px;
 }
 /* Day markers */
 .day-marker {
 position: absolute;
 top: 100%;
 width: 2px;
 height: 10px;
 background-color: #1f2937; 
 transform: translateX(-1px);
 }
 .day-label {
 position: absolute;
 top: calc(100% + 12px);
 transform: translateX(-50%);
 font-size: 0.75rem;
 color: #4b5563;
 }
 /* Selection Overlay (New) */
 #selection-overlay {
 position: absolute;
 top: 0;
 left: 0;
 height: 100%;
 background-color: rgba(239, 68, 68, 0.4); /* Light red semi-transparent for sleep */
 pointer-events: none;
 display: none;
 border-radius: 8px;
 z-index: 3;
 }
 /* Hover Time Display */
 #hover-time-display {
 min-height: 1.5rem; 
 }
 /* Persistent Sleep Period Display */
 .sleep-period-display {
 position: absolute;
 top: 0;
 height: 100%;
 background-color: rgba(239, 68, 68, 0.6); 
 pointer-events: none;
 border-radius: 8px;
 z-index: 2;
 }
 /* Persistent Awake Period Display */
 .awake-period-display {
 position: absolute;
 top: 0;
 height: 100%;
 background-color: #10b981; /* Green for awake (same as active) */
 opacity: 0.6;
 pointer-events: none;
 border-radius: 8px;
 z-index: 2;
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body class="bg-gray-50 p-4 sm:p-8 font-sans"&gt;

 &lt;div class="max-w-6xl mx-auto"&gt;
 &lt;header class="mb-8"&gt;
 &lt;h1 class="text-3xl font-extrabold text-gray-900"&gt;Continuous Activity Actogram&lt;/h1&gt;
 &lt;p class="text-lg text-gray-600 mt-2"&gt;
 Visualization of computer activity blocks over a continuous timeline. &lt;span class="text-sm"&gt;🟢 Green = Active/Awake, 🔴 Red = Sleep, 🟡 Yellow = Untagged gaps (click to tag)&lt;/span&gt;
 &lt;/p&gt;</description></item><item><title>Sleep Duration Analysis</title><link>https://www.ashwinmenon.com/curiosities/sleep_cycle/stats/</link><pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/curiosities/sleep_cycle/stats/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;title&gt;Sleep/Awake Duration Analysis&lt;/title&gt;
 &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"&gt;&lt;/script&gt;
 &lt;style&gt;
 body {
 font-family: Arial, sans-serif;
 max-width: 1200px;
 margin: 0 auto;
 padding: 20px;
 background-color: #f5f5f5;
 }
 h1 {
 color: #333;
 text-align: center;
 }
 .stats-container {
 display: flex;
 gap: 20px;
 margin-bottom: 30px;
 justify-content: center;
 }
 .stat-box {
 background: white;
 padding: 20px;
 border-radius: 8px;
 box-shadow: 0 2px 4px rgba(0,0,0,0.1);
 min-width: 200px;
 }
 .stat-box h3 {
 margin-top: 0;
 color: #555;
 }
 .stat-value {
 font-size: 24px;
 font-weight: bold;
 color: #2c3e50;
 }
 .charts-container {
 display: grid;
 grid-template-columns: 1fr 1fr;
 gap: 20px;
 }
 .chart-box {
 background: white;
 padding: 20px;
 border-radius: 8px;
 box-shadow: 0 2px 4px rgba(0,0,0,0.1);
 }
 @media (max-width: 768px) {
 .charts-container {
 grid-template-columns: 1fr;
 }
 .stats-container {
 flex-direction: column;
 }
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;h1&gt;Sleep/Awake Duration Analysis&lt;/h1&gt;
 
 &lt;div class="stats-container"&gt;
 &lt;div class="stat-box"&gt;
 &lt;h3&gt;Sleep Duration&lt;/h3&gt;
 &lt;div class="stat-value" id="sleepMean"&gt;&lt;/div&gt;
 &lt;div&gt;Mean&lt;/div&gt;
 &lt;div class="stat-value" id="sleepStd"&gt;&lt;/div&gt;
 &lt;div&gt;Std Dev&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="stat-box"&gt;
 &lt;h3&gt;Awake Duration&lt;/h3&gt;
 &lt;div class="stat-value" id="awakeMean"&gt;&lt;/div&gt;
 &lt;div&gt;Mean&lt;/div&gt;
 &lt;div class="stat-value" id="awakeStd"&gt;&lt;/div&gt;
 &lt;div&gt;Std Dev&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="charts-container"&gt;
 &lt;div class="chart-box"&gt;
 &lt;h3&gt;Sleep Duration Distribution&lt;/h3&gt;
 &lt;canvas id="sleepChart"&gt;&lt;/canvas&gt;
 &lt;/div&gt;
 &lt;div class="chart-box"&gt;
 &lt;h3&gt;Awake Duration Distribution&lt;/h3&gt;
 &lt;canvas id="awakeChart"&gt;&lt;/canvas&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;script&gt;
 const data = [
 { num: 1, start: "2024-11-29 12:00", end: "2024-11-29 17:19", type: "Sleep", duration: "5h 19m" },
 { num: 2, start: "2024-11-29 17:19", end: "2024-11-30 16:16", type: "Awake", duration: "22h 57m" },
 { num: 3, start: "2024-11-30 16:16", end: "2024-11-30 19:20", type: "Sleep", duration: "3h 04m" },
 { num: 4, start: "2024-11-30 19:20", end: "2024-12-01 13:09", type: "Awake", duration: "17h 49m" },
 { num: 5, start: "2024-12-01 13:09", end: "2024-12-01 16:51", type: "Sleep", duration: "3h 42m" },
 { num: 6, start: "2024-12-01 16:51", end: "2024-12-02 11:16", type: "Awake", duration: "18h 25m" },
 { num: 7, start: "2024-12-02 11:16", end: "2024-12-02 13:43", type: "Sleep", duration: "2h 27m" },
 { num: 8, start: "2024-12-02 13:43", end: "2024-12-02 14:40", type: "Awake", duration: "0h 57m" },
 { num: 9, start: "2024-12-02 14:40", end: "2024-12-02 16:13", type: "Sleep", duration: "1h 33m" },
 { num: 10, start: "2024-12-02 16:13", end: "2024-12-03 01:56", type: "Awake", duration: "9h 43m" },
 { num: 11, start: "2024-12-03 01:56", end: "2024-12-03 04:38", type: "Sleep", duration: "2h 42m" },
 { num: 12, start: "2024-12-03 04:38", end: "2024-12-03 16:39", type: "Awake", duration: "12h 01m" },
 { num: 13, start: "2024-12-03 16:39", end: "2024-12-03 19:51", type: "Sleep", duration: "3h 12m" },
 { num: 14, start: "2024-12-03 19:51", end: "2024-12-03 20:33", type: "Awake", duration: "0h 42m" },
 { num: 15, start: "2024-12-03 20:33", end: "2024-12-04 02:57", type: "Sleep", duration: "6h 24m" },
 { num: 16, start: "2024-12-04 02:57", end: "2024-12-05 01:51", type: "Awake", duration: "22h 54m" },
 { num: 17, start: "2024-12-05 01:51", end: "2024-12-05 09:02", type: "Sleep", duration: "7h 11m" },
 { num: 18, start: "2024-12-05 09:02", end: "2024-12-05 23:57", type: "Awake", duration: "14h 55m" },
 { num: 19, start: "2024-12-05 23:57", end: "2024-12-06 09:28", type: "Sleep", duration: "9h 31m" },
 { num: 20, start: "2025-12-08 04:19", end: "2025-12-08 20:57", type: "Awake", duration: "16h 38m" },
 { num: 21, start: "2025-12-08 20:57", end: "2025-12-09 01:50", type: "Sleep", duration: "4h 53m" },
 { num: 22, start: "2025-12-09 01:50", end: "2025-12-09 17:53", type: "Awake", duration: "16h 03m" },
 { num: 23, start: "2025-12-09 17:53", end: "2025-12-10 04:43", type: "Sleep", duration: "10h 50m" },
 { num: 24, start: "2025-12-10 04:43", end: "2025-12-10 21:54", type: "Awake", duration: "17h 11m" },
 { num: 25, start: "2025-12-10 21:54", end: "2025-12-11 07:03", type: "Sleep", duration: "9h 09m" },
 { num: 26, start: "2025-12-11 07:03", end: "2025-12-12 00:07", type: "Awake", duration: "17h 04m" },
 { num: 27, start: "2025-12-12 00:07", end: "2025-12-12 08:43", type: "Sleep", duration: "8h 36m" },
 { num: 28, start: "2025-12-12 08:43", end: "2025-12-13 01:01", type: "Awake", duration: "16h 18m" },
 { num: 29, start: "2025-12-13 01:01", end: "2025-12-13 09:10", type: "Sleep", duration: "8h 09m" },
 { num: 30, start: "2025-12-13 09:10", end: "2025-12-14 00:52", type: "Awake", duration: "15h 42m" },
 { num: 31, start: "2025-12-14 00:52", end: "2025-12-14 09:30", type: "Sleep", duration: "8h 38m" },
 { num: 32, start: "2025-12-14 09:30", end: "2025-12-15 03:16", type: "Awake", duration: "17h 46m" },
 { num: 33, start: "2025-12-15 03:16", end: "2025-12-15 10:48", type: "Sleep", duration: "7h 32m" },
 { num: 34, start: "2025-12-15 10:48", end: "2025-12-16 04:34", type: "Awake", duration: "17h 46m" },
 { num: 35, start: "2025-12-16 04:34", end: "2025-12-16 10:20", type: "Sleep", duration: "5h 46m" },
 { num: 36, start: "2025-12-16 10:20", end: "2025-12-16 15:47", type: "Awake", duration: "5h 27m" },
 { num: 37, start: "2025-12-16 15:47", end: "2025-12-16 17:14", type: "Sleep", duration: "1h 27m" },
 { num: 38, start: "2025-12-16 17:14", end: "2025-12-17 04:34", type: "Awake", duration: "11h 20m" },
 { num: 39, start: "2025-12-17 04:34", end: "2025-12-17 12:10", type: "Sleep", duration: "7h 36m" }
 ];

 function parseDuration(duration) {
 const match = duration.match(/(\d+)h\s*(\d+)m/);
 if (match) {
 return parseInt(match[1]) + parseInt(match[2]) / 60;
 }
 return 0;
 }

 function calculateStats(values) {
 const n = values.length;
 const mean = values.reduce((a, b) =&gt; a + b, 0) / n;
 const variance = values.reduce((a, b) =&gt; a + Math.pow(b - mean, 2), 0) / n;
 const std = Math.sqrt(variance);
 return { mean, std };
 }

 function formatHours(hours) {
 const h = Math.floor(hours);
 const m = Math.round((hours - h) * 60);
 return `${h}h ${m}m`;
 }

 const sleepData = data.filter(d =&gt; d.type === "Sleep").map(d =&gt; parseDuration(d.duration));
 const awakeData = data.filter(d =&gt; d.type === "Awake").map(d =&gt; parseDuration(d.duration));

 const sleepStats = calculateStats(sleepData);
 const awakeStats = calculateStats(awakeData);

 document.getElementById('sleepMean').textContent = formatHours(sleepStats.mean);
 document.getElementById('sleepStd').textContent = formatHours(sleepStats.std);
 document.getElementById('awakeMean').textContent = formatHours(awakeStats.mean);
 document.getElementById('awakeStd').textContent = formatHours(awakeStats.std);

 function createHistogram(data, elementId, label, color) {
 const bins = 8;
 const min = Math.min(...data);
 const max = Math.max(...data);
 const binSize = (max - min) / bins;
 
 const histogram = new Array(bins).fill(0);
 const binLabels = [];
 
 for (let i = 0; i &lt; bins; i++) {
 const binStart = min + i * binSize;
 const binEnd = min + (i + 1) * binSize;
 binLabels.push(`${binStart.toFixed(1)}-${binEnd.toFixed(1)}h`);
 
 data.forEach(value =&gt; {
 if (value &gt;= binStart &amp;&amp; (i === bins - 1 ? value &lt;= binEnd : value &lt; binEnd)) {
 histogram[i]++;
 }
 });
 }

 const ctx = document.getElementById(elementId).getContext('2d');
 new Chart(ctx, {
 type: 'bar',
 data: {
 labels: binLabels,
 datasets: [{
 label: label,
 data: histogram,
 backgroundColor: color,
 borderColor: color,
 borderWidth: 1
 }]
 },
 options: {
 responsive: true,
 plugins: {
 legend: {
 display: false
 }
 },
 scales: {
 y: {
 beginAtZero: true,
 ticks: {
 stepSize: 1
 },
 title: {
 display: true,
 text: 'Frequency'
 }
 },
 x: {
 title: {
 display: true,
 text: 'Duration (hours)'
 }
 }
 }
 }
 });
 }

 createHistogram(sleepData, 'sleepChart', 'Sleep Duration', 'rgba(54, 162, 235, 0.7)');
 createHistogram(awakeData, 'awakeChart', 'Awake Duration', 'rgba(255, 159, 64, 0.7)');
 &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item><item><title>A guide to finances: securing the foundation</title><link>https://www.ashwinmenon.com/posts/thoughts/2024-12-15-a-guide-to-finances-securing-the-foundation/</link><pubDate>Sun, 15 Dec 2024 14:30:14 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2024-12-15-a-guide-to-finances-securing-the-foundation/</guid><description>&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;
&lt;p&gt;Around 7 years ago I wrote &lt;a href="https://www.ashwinmenon.com/posts/activities/2017-01-30-a-guide-to-finances/"&gt;&amp;ldquo;A guide to finances&amp;rdquo;&lt;/a&gt; which some of my friends found helpful. Now, everyone is likely at a different point in their lives, so I thought I&amp;rsquo;d write the follow-up.&lt;/p&gt;
&lt;h1 id="general-overview"&gt;General overview&lt;/h1&gt;
&lt;p&gt;Write down what your ideal life looks like and calculate how much that would cost per year. Let&amp;rsquo;s call that THE_GOAL.&lt;br&gt;
Once you have THE_GOAL, divide that number by 0.04 to get how much you&amp;rsquo;d need to be completely financially independent. If you&amp;rsquo;re risk-averse, divide by smaller number (0.0375, 0.035 or 0.03) instead.&lt;br&gt;
Once you have that amount, invest it into the market with 80% of it going to stocks, and 20% going to bonds (you can use 85-15 as well).&lt;/p&gt;</description></item><item><title>Chat Statistics</title><link>https://www.ashwinmenon.com/curiosities/chat_stats/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/curiosities/chat_stats/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Chat Statistics&lt;/title&gt;
&lt;style&gt;
body {
 font-family: Arial, sans-serif;
 margin: 40px;
}
h1 {
 text-align: center;
}
img {
 width: 100%;
 max-width: 900px;
 display: block;
 margin: 30px auto;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;Chat Statistics (Anonymized)&lt;/h1&gt;

&lt;h2&gt;Messages per Hour&lt;/h2&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAH0CAYAAAAt0NQSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWQNJREFUeJzt3Qe4FNX9P/5DERAVsIOKomLDgi0ae0NQiSVq7IK9oVGsaCzYjV1jwV4SC2rUBEhQrLH3XkiMKHaMCogIiOz/+Zzff+/33kuXhTuX+3o9z3LZmdnZs7OzZd77OWcalUqlUgIAAACAgmpc1w0AAAAAgGkRYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAMBc5J577kkLLbRQGjNmTF03pXCeeOKJ1KhRo/x3Wvr27ZuX+9///pcamv322y916NChouv86aefUvv27dM111xT0fUC0LAIsADgF7j11lvzAW5cnn766cnml0qlfMAW83/zm9/YxvXM9AKMOMAv4vP6888/pzPOOCMdddRRaf75568xb9KkSen2229PW2+9dVpkkUXSPPPMkxZbbLHUtWvXdP3116fx48fXWbsbqvJzsv766+fQcYEFFkgrrrhi6tGjR3r++efT3CL2tWOPPTade+65ady4cXXdHADqKQEWAMyCFi1apDvvvHOy6U8++WT69NNPU/PmzW1f5pgBAwakoUOHpkMOOaTG9B9//DFtt912qWfPnmns2LHp+OOPz6HVSSedlPfhI444Il+Ys37/+9/n56Rdu3Y5NP3jH/+Ytt122xxeDR48eK56Ovbff/8cCE/p/RIAZkTTGVoKAJiiCAXuvffedOWVV6amTf/vYzUO0tZZZ50G2QWpvoggp2XLlqk++eGHH9J888031fm33HJL2mijjdKSSy5ZY3rv3r3TQw89lC6//PJ09NFH15h33HHHpf/85z9pyJAh07zviRMn5oqhZs2azeKjIHz11Ve5S93BBx+cw8Tq4nn6+uuv6/2GikrUqLiad955U5s2bXK1X1SvHnDAAXXdNADqIRVYADAL9txzz/TNN9/UOPifMGFCuu+++9Jee+01xdtECBAHqKuuumqufll88cXToYcemr777rsay7388supW7duubtXHAAuu+yykx343X333Tkoi65HrVq1Squvvnq64oorquZ/++23udompkeXslgmKjzeeOONydr18ccfpx122CEHJNG1rBx6TGnMoBdeeCFts802qXXr1jkE2myzzdIzzzxTY5nvv/8+HXPMMbm7XVSixTqj+9qrr746Q9333n///bTbbrvlNi+88MI5eJlS96O//OUveRvENopuWHvssUf65JNPaiyz+eabp9VWWy298soradNNN81tPuWUU1Klw6UIg6LraDzelVZaKV188cX5IL7so48+yo8tDuJri+nx2Gtvh3fffTfvSwsuuGDaeOONp3r/sW2iaqdLly41pse2uPHGG/PzVTu8KlthhRVqVGCV2xntj311+eWXz48p2hIee+yxtMkmm+R9JYKJHXfcMb333nszNJZS+XHVfuxHHnlkuuOOO/J2i9dFPKf/+te/Jrv9Z599ll8H8bqJNsXr6Oabb55suaiA3GmnnWrszzPbTTIC6Gntg7Hfd+7ceYq3jccRr9+pGTZsWN43InCsLbZHtLm6kSNH5tdTef/q2LFjrtiK95MpPW8RipWft1/96lfppZdemux+Hnzwwfy6iO0dfx944IFZes8qd62N94111103vyavu+66qvnx+o8u1/G+BAAzSwUWAMyCOGDbYIMN0l133ZWDofDPf/4zjRo1KgcpUZlVWxz4RYARXWqiC1EcyF511VXptddeyyFQjBczYsSIXK2w6KKLpj59+uSQIA5O77///qr1RGgWAdpWW22VD2RDhAixjnJQ8eGHH+aD1N/97nc5AIuqjzigjAPvCCOWWGKJqvBlyy23TF988UW+bdu2bXMV2eOPPz5Z+yO8iMcaAUOMt9S4ceNc+RO3f+qpp9J6662XlzvssMNykBfBRKdOnXLQFwev0ca11157uts2goPYvueff37uUhXbMg6YY8ygshhT57TTTsvLHnTQQblq5U9/+lMOqWJ7xnYri/uPdsfzss8+++SD8OmZ2oF29dAgRBAR4V9srwMPPDCtueaa+SD+hBNOyIHLZZddln6peO4iYDrvvPNqhGG1RTgX4WntbRv7Y4yNFY95ZsXzGoFNdEmMICQCwkceeSRvx+WWWy6HUdE9MbZ5BDERTv7SAcCj223//v3zayLuK6qTInR78cUXc7gSYv/99a9/XRV4xesjHl9s89GjR+eAJ0Sb4nUxfPjwvL7Yz//85z/nfXdmTG8f3HfffXMF1dtvv13VxhBh0b///e906qmnTnXdyyyzTP4bFZzxHE+rGjCqBeM1G/tSvH8svfTS6dlnn00nn3xyfs1GuFRdvHYjQI5lY1tdeOGFaeedd87vB/H+Eh5++OG0yy675NdmPL54fcR70lJLLfWL3rPKogtrvC/FbWLbRJBXFu8ZsQ9H24s4hhwABVcCAGbaLbfcEklC6aWXXipdddVVpQUWWKA0duzYPO93v/tdaYsttsj/X2aZZUrdu3evut1TTz2Vb3fHHXfUWN/gwYNrTH/ggQeq1j81Rx99dKlVq1aliRMnTnWZcePGlX7++eca04YNG1Zq3rx56ayzzqqadskll+T7e/DBB6um/fjjj6WVV145T3/88cfztEmTJpVWWGGFUrdu3fL/y+KxL7vssqWtt966alrr1q1LvXr1Ks2sM844I9/nDjvsUGP6EUcckae/8cYb+fpHH31UatKkSencc8+tsdxbb71Vatq0aY3pm222Wb5tv379ZqoN07pUf15ju8W0c845p8Z6dt1111KjRo1KH3zwQdW2j+Vi/6ktpsf91m7DnnvuOUNtvvHGG/Py8fir6927d57++uuv15g+fvz40tdff111+d///lc1r9zO2L9GjBhR43ZrrrlmabHFFit98803VdPiOWncuHGpR48eVdN69uyZ9//ayo+r9mOPy8svv1w17eOPPy61aNGi9Nvf/rZq2oEHHlhq165djbaGPfbYI+9v5dfg5Zdfntd3zz33VC3zww8/lDp27Fhjf57VfXDkyJG5jSeddFKN5X7/+9+X5ptvvtKYMWOmeT+xvWJ9Cy64YH6cF198cem9996bbLmzzz47r+/f//53jel9+vTJr4Hhw4fXeN4WXnjh0rffflu13N/+9rc8fcCAATWex9iW8RjKHn744bxc9edtRt+zQtwupsW8Kfn888/z/D/+8Y/T3C4AMCW6EALALIoqjaj4GDhwYK56iL9T6z4Y1RbR7S660kT3pPIlKhOii1+54qlcORTrilPQT0ksE5VT0xq7KCpZokIqRBVOVFnE/URVRPWufNH1LMZNiiqisugqFBUU1b3++ut5vKR4fLGucvujHVHxEl2+ytVJ0b7oavj555+nX6JXr141rseZ9cI//vGP/Deq0eK+YvtX35ZRPRYVS7Wrx2JbRAXJzPjrX/+at2/tS+3qrWhTkyZNcnVKddGlMPKZqBL6paKSbUbE8xGiq2F1UZkUap+VMNocFUzlS7kiqLqo0Il5ZVHtE/tAdA+MaqyyNdZYI+/T5efml4hKxngdlEWVUXRNjEq22HdjO8bzsf322+f/V3/Oo6teVD2W9+loRwyMvuuuu1atLyqcag9uP6v7YLyWo41RgVmujou2RiVZufvi9CrcopIpqiOj+150911llVXyaymqraq/b0SXzXhuqz/u6C4a91e7q+Xuu+9eYz+I24aowKr+PMYA8vEYyuI5jIqsX/KeVRaPZWpdJ8ttMjYgAL+ELoQAMIviAD8OJKPbTnT1iQPK6gfO1UX4Ewfatce3KYuugyG6C0V4cOaZZ+buZzGGUxwQR3BUPrNhjFl0zz335O5cET5Fl8MIc6LbVVkEPDEmVnTHim4/0bayGNOn+vhXMV5O7bGJYpyd2u0PceA7NfH44kA1ui3FcjFmTxzsxoD3PXr0yF3PZkSEUNVF+yKMi66U5bZEaFB7ubLq3ZpCbKOZHYA8uiLGGGS1RbhXXWy/6KYWY5FVF2FEef4vFYHAzKjdzbDcpjFjxtSYHl3+yuHnRRddNNkYZlO67/LjqN4trPpjjbBpegPNT82UnscVV1wxv6aia2g89zEOVIztVHvQ89qvn2hn7Lu19+cptXtW9sEQ+3QEVtF9NvaX6GIZXR2je+H0xLoiJItLBJDxHPTr1y8HntHVNdZZ3tfffPPNGmHilB539fBvSsFRecyq8vM4pW1eO9ye0fesGdlfy/tm7ecFAGaEAAsAKiCCpahW+vLLL3OgVH3speoiUIoDwRisekrKB6hxgBfjR8W4OwMGDMjBQAxcfckll+RpUfkQ64kqipgXB7xxiYqOOKC+7bbb8npi3KQYIypue/bZZ+eqmThojrGCao/jNCPKt4nAI8Z5mpJypU+EaVH5EZUlMd5O3CbG6orKqfJ4YTOj9kFvtCWmxeOO6qeptaMsBpSua1M7cK8eLNY2o+0uB5IRUlQfx2jllVfOf2OcpuoDjpeD1/JA+LNy35V6rDOy78VYXlMLUKMSbHaa0mOKaqOoyIttGAFW/I0qwNqD6c/I8xcVkHGJwDrGBIugKSrj4rFHBdSJJ544xdtG0FfdlF4PYVpjqE3NjL5nzcg+Uw7QphQKA8D0CLAAoAJ++9vf5kGLI1yKaoypiQqOqNCI6pcZCQdiwOq4xGDlUeG199575zMPxoDlISqKoktVXOJAM6qyYpD2CK2iAiVCsC222CLddNNNNdYblSzVDyLjIDkGdY8D3OoH6R988MFk7Q9xVrYZOUCPblzRprhEpUYMMB6PZUYCrKj8qF7NEW2Jx1geJDzaEu2NZWofwM9psf3ieY0upNWrsOJMiuX51SthYvtXNysVWrWDqqi0i7NOlsW2jkAjAojYf2ZF+XHEQN21xWONfapcfRWPtfbjnNZjLVf3VRcDoUfXv3JIEts2ArDp7XvRzgjsau/PU2r3rOyDIbZtBNgxyHkEtHHShAizpxYizYg4g18EWNHVLx5L7OtRQTezodj0nscpbfPa22hm37OmJfbN6pWJADAzjIEFABUQ1T7XXnttPitbhElTE1VJcQAe1VC1TZw4seqAPyoValdLlCuexo8fX2PMo7KorCpXoJSXiYPo2uuJMW2qj69TriKJaX//+9+rpsXZ52644YYay0VXwDigvfjiiyfrkhaiq1eIxxjdjqqLKo7oZldu2/RcffXVNa7Hme5COfyKs6rF44tulrUfY1yvvX1mp+geGY85xjOqLrp/RoBSbnMEfxHy1B6zKLp4zqp4biLQfPnllyfrThYVeFGpVrt9M1uZE4Fk7IdR4Vc9nIqwKKrsYjuUxX4S+0B0fSuLQCYq8qbkueeeq9F17ZNPPkl/+9vfctfYeJ7jEt1qYxysuL+p7Xsh2hFjr0WAWxZdEafW9fCX7oNl0V0wXrMRYsfrYkbO+BjVmhEa1xZnknz00Ufz67nchTfeN2L7RLVlbfE8xHvHzKj+PFZ/nUaX0tptmtH3rBkRZ8qM10OMdwYAM0sFFgBUyLTGhSqLsa3iIDdOWx/d/+LgPMZqikqICJZivKoYPysOLCPUiMquCAKisifCpAhAyiFBVGF9++23acstt8xdxqKyJQ6w48C0XOEQp6o/66yz8uDlG264YXrrrbdyJU7tcaiiTRFu7Lnnnunoo4/OB7ixXHmsp3IVSxxU33jjjfkAftVVV83rjbGlIvyKwZyjfdHlMdobbYrHEt3WIuCLKo6XXnopd4Oc0WqN6E4VY3rFwXt0zYpKl3I3uNgu55xzTjr55JPzmEQxRlhU6MTtIiSJAbtjUOw5IULLqHT7wx/+kNsSbYxAJwKY6K5ZrlwrP28XXHBB/huVNhFmRaXRrIrnKvan2M7xnFd3+eWX5+0Sg5BHBV+0NwLFGEw7xl2K52xGx4eKrqDx/EcIceCBB+YTGMR+FwN9R4BbFmM4nXTSSXkfjsHtI0CKkDeq5aoHVWWrrbZaDlJj2RjnrRzqRUBZFtst9rP1118/VznFgOPxGoj1xeOO/4eYF/tzdKeN0CT25z//+c+5mmtmTG8fLFtrrbVy++M1HK+9qDScnk8//TStt956+fUbg7ZHt8OoUowB4d94442835SrJE844YQcLsfrOQbQj7AyxhqL13OEdLHPzWy3vHgP6t69e9p4441zwBnbLp7HeF1XD6dn9D1rRkRAFpVc1cffA4AZNsVzEwIA03TLLbfk08G/9NJL01wuTivfvXv3yaZff/31pXXWWac077zzlhZYYIHS6quvXjrxxBPzaebDq6++Wtpzzz1LSy+9dKl58+alxRZbrPSb3/ym9PLLL1et47777it17do1z2vWrFle9tBDDy198cUXVcuMGzeudNxxx5XatWuX72ujjTYqPffcc6XNNtssX6r78MMPc1tjuUUXXTTf7q9//Wt+nM8//3yNZV977bXSzjvvXFp44YVz++Jx7rbbbqVHH300zx8/fnzphBNOKHXu3Dk/vvnmmy///5prrpnunnXGGWfk+3z33XdLu+66a779ggsuWDryyCNLP/7442TLRxs33njjfB9xWXnllUu9evUqDR06tGqZeKyrrrrqdO+7dhu+/vrrGX5ev//++1Lv3r1LSyyxRGmeeeYprbDCCqWLLrqoNGnSpBrLjR07tnTggQeWWrdunR9bbLcRI0bk+4v7ndE2TMn9999fatSoUWn48OGTzZs4cWLeb7fccsvSQgstVGratGlpkUUWKW211Valfv361di2w4YNy/cd7Z+SRx55JO9Lsa+0atWqtP322+fnq7aHH364tNpqq+X9c6WVVir95S9/qXpc1cX1eM5ifmy32KfWWmut0uOPPz7ZOr/66qu8bPv27fN2btu2bX4M8Zqq7uOPPy7tsMMOpZYtW+bHefTRR5cGDx6c72tK652VfTBceOGF+TbnnXdeaUaMHj26dMUVV5S6detWWmqppfJjifvZYIMNSjfccMNk+03sXyeffHKpY8eOeXvGY9pwww1LF198cWnChAnTfd5q71/l184qq6ySt3enTp3y/tOzZ8+8f8/se9a03u/CyJEjc7tvvPHGGdo+AFBbo/hnxuMuAKAhicqd3r1752qRqLSaE6KKJ6puokuYwZ5nTnT1iqqk6PY1pS5fRRUVfnEmvql1cawPohIpXitRDVX7LID8v/eSODPpf//730KcUAGA+scYWABAFl3BqosxsGJA+BVWWGGOhVfMmhgnKroPxthNUxqjjNkjfg+OEyVEdzvh1eR++umndOmll6ZTTz1VeAXAL2YMLACgalD0OPiOMbRiYOcY7yfOLBdjYVF/7L777vnC7BfjUMXYVDEuV4xHFWOeMbkYM2v48OE2DQCzRIAFAGQxgHYM0B6BVbkrWgz4LQyBKYturjGoe5s2bdIpp5ySB3wHAGYPY2ABAAAAUGjGwAIAAACg0ARYAAAAABSaMbBmwaRJk9Lnn3+eFlhggXz6ZwAAAACmfNbe77//Pi2xxBKpceOZr6cSYM2CCK/at28/K6sAAAAAaDA++eSTtNRSS8307QRYsyAqr8obv1WrVrOyKgAAAIC51ujRo3MRUDlLmVkCrFlQ7jYY4ZUACwAAAGDafukQTAZxBwAAAKDQBFgAAAAAFFrhAqzzzz8//epXv8p9IhdbbLG00047paFDh9ZYZvPNN88lZ9Uvhx12WI1lhg8fnrp3755atmyZ13PCCSekiRMn1ljmiSeeSGuvvXZq3rx56tixY7r11lvnyGMEAAAAoB6PgfXkk0+mXr165RArAqdTTjklde3aNb377rtpvvnmq1ru4IMPTmeddVbV9Qiqyn7++eccXrVt2zY9++yz6Ysvvkg9evRI88wzTzrvvPPyMsOGDcvLRPB1xx13pEcffTQddNBBqV27dqlbt25z+FEDAAAAdWHSpElpwoQJNv4sisylSZMmaXZpVCqVSqnAvv7661xBFcHWpptuWlWBteaaa6bLL798irf55z//mX7zm9+kzz//PC2++OJ5Wr9+/dJJJ52U19esWbP8/0GDBqW333676nZ77LFHGjlyZBo8ePAMj6DfunXrNGrUKIO4AwAAQD0TwVUUuESIxaxr06ZNLiaa0kDts5qhFK4Cq7Z4YGGhhRaqMT2qpv7yl7/kDbP99tun0047raoK67nnnkurr756VXgVoqrq8MMPT++8805aa6218jJdunSpsc5Y5phjjplqW8aPH58v1Tc+AAAAUP9EPU/02Iqqofbt26fGjQs3ylK92pZjx45NI0aMyNejd1ulFTrAigQ0AqWNNtoorbbaalXT99prr7TMMsukJZZYIr355pu5mirGybr//vvz/C+//LJGeBXK12PetJaJUOrHH39M88477xTH5zrzzDNny2MFAAAA5pwYtihCl8gWqg9LxC9TzlEixIqedJXuTljoACvGwooufk8//XSN6YccckjV/6PSKpK9rbbaKv33v/9Nyy+//Gxrz8knn5yOPfbYqusRdkVKCwAAANQvMX52iGGGqIxyEPjTTz9VPMAqbH3ckUcemQYOHJgef/zxtNRSS01z2fXXXz///eCDD/Lf6Fb41Vdf1VimfD3mTWuZ6Ic5peqrEGcrjPnVLwAAAED9NaXxmijetmxcxH6TEV498MAD6bHHHkvLLrvsdG/z+uuv1+hjucEGG6S33nqrqu9lGDJkSA6cOnXqVLVMnHmwulgmpgMAAABQHI2L2G0wBme/88470wILLJDHqopLjEsVopvg2WefnV555ZX00Ucfpb///e+pR48e+QyFa6yxRl6ma9euOajad9990xtvvJEeeuihdOqpp+Z1RxVVOOyww9KHH36YTjzxxPT++++na665Jt1zzz2pd+/edfr4AQAAAKipUSlKnupBudktt9yS9ttvv/TJJ5+kffbZJ4+N9cMPP+QxqH7729/mgKp6l76PP/44n3XwiSeeSPPNN1/q2bNnuuCCC1LTpv837FfMi8Dq3Xffzd0U40yGcR8zalZPAQkAAADUjXHjxqVhw4blnl8tWrSomt6hz6A52o6PLuj+i2733HPPpY033jhts802adCgOdvmmd2mlchQCjeI+/TytAisnnzyyemuJ85S+I9//GOay2y++ebptddem+k2AgAAANSlm266KR111FH57+eff57Ppjg3K1wXQgAAAACmbsyYMal///6551n37t3TrbfeWqO3WfRui3G/11133XxmwA033DANHTq0xjquvfbatPzyy+ezMK600krpz3/+c435sY4bb7wx93qLdaywwgp5GKe6IsACAAAAqEfuueeetPLKK+fgKYZZuvnmmyfr0faHP/whXXLJJenll1/OwykdcMABVfPixHlHH310Ou644/IQTYceemjaf//90+OPP15jHWeeeWbabbfd0ptvvpm22267tPfee6dvv/021QUBFgAAAEA9ctNNN+XgKsQYWDGuVO3hls4999y02Wab5ZPc9enTJz377LN5jKpw8cUX5zHAjzjiiLTiiiumY489Nu288855enWxzJ577pk6duyYzjvvvFz59eKLL6a6IMACAAAAqCeGDh2aQ6QIlkJUV+2+++451KpujTXWqPp/u3bt8t8RI0bkv++9917aaKONaiwf12P61NYRJ8iLwdfL65jTCjeIOwAAQFFV4uxkv/SMYwAhgqqJEyfWGLQ9ug82b948XXXVVVXT5plnnhrjWYVJkyalmVF9HeX1zOw6KkUFFgAAAEA9MHHixHT77bfnsa1ef/31qssbb7yRA6277rprhtazyiqrpGeeeabGtLge3Q2LSgUWAAAAQD0wcODA9N1336UDDzwwtW7dusa8XXbZJVdnXXTRRdNdzwknnJAHZ19rrbVSly5d0oABA9L999+fHnnkkVRUKrAAAAAA6oGbbropB061w6tygBVnHIwzBk7PTjvtlK644oo8aPuqq66arrvuunTLLbekzTffPBVVo1Lt8ywyw0aPHp13mhjtPwYyAwAA5m7GwIK5R5yRb9iwYWnZZZdNLVq0qOvmzPXbdPQsZigqsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACF1rSuGwAAAABQGH1bz+H7GzVTi++3337ptttuS4ceemjq169fjXm9evVK11xzTerZs2e69dZb09xEBRYAAABAPdK+fft09913px9//LFq2rhx49Kdd96Zll566TQ3EmABAAAA1CNrr712DrHuv//+qmnx/wiv1lprrappkyZNSueff35adtll07zzzps6d+6c7rvvvlQfCbAAAAAA6pkDDjgg3XLLLVXXb7755rT//vvXWCbCq9tvvz13NXznnXdS79690z777JOefPLJVN8YAwsAAACgntlnn33SySefnD7++ON8/ZlnnsndCp944ol8ffz48em8885LjzzySNpggw3ytOWWWy49/fTT6brrrkubbbZZqk8EWAAAAAD1zKKLLpq6d++eB2svlUr5/4ssskjV/A8++CCNHTs2bb311jVuN2HChBrdDOsLARYAAABAPe1GeOSRR+b/X3311TXmjRkzJv8dNGhQWnLJJWvMa968eapvBFgAAAAA9dA222yTK6oaNWqUunXrVmNep06dclA1fPjwetddcEoEWAAAAAD1UJMmTdJ7771X9f/qFlhggXT88cfngdvjbIQbb7xxGjVqVB4rq1WrVqlnz56pPhFgAQAAANRTrVq1muq8s88+O4+VFWcj/PDDD1ObNm3S2muvnU455ZRU3zQqxUhf/CKjR49OrVu3zgnmtHYYAABg7tChz6BZXsdHF3SvSFuAWTNu3Lg0bNiwtOyyy6YWLVrYnLN5m85qhtK4Eg0EAAAAgNlFgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAABAg1Uqleq6CXONSZMmzbZ1N51tawYAAAAoqHnmmSc1atQoff3112nRRRfN/+eXh4ATJkzI27Jx48apWbNmqdIEWAAAAECD06RJk7TUUkulTz/9NH300Ud13Zy5QsuWLdPSSy+dQ6xKE2ABAAAADdL888+fVlhhhfTTTz/VdVPmikCwadOms62STYAFAAAANOjgJS4Um0HcAQAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFFrhAqzzzz8//epXv0oLLLBAWmyxxdJOO+2Uhg4dWmOZcePGpV69eqWFF144zT///GmXXXZJX331VY1lhg8fnrp3755atmyZ13PCCSekiRMn1ljmiSeeSGuvvXZq3rx56tixY7r11lvnyGMEAAAAoB4HWE8++WQOp55//vk0ZMiQ9NNPP6WuXbumH374oWqZ3r17pwEDBqR77703L//555+nnXfeuWr+zz//nMOrCRMmpGeffTbddtttOZw6/fTTq5YZNmxYXmaLLbZIr7/+ejrmmGPSQQcdlB566KE5/pgBAAAAmLpGpVKplArs66+/zhVUEVRtuummadSoUWnRRRdNd955Z9p1113zMu+//35aZZVV0nPPPZd+/etfp3/+85/pN7/5TQ62Fl988bxMv3790kknnZTX16xZs/z/QYMGpbfffrvqvvbYY480cuTINHjw4Blq2+jRo1Pr1q1zm1q1ajWbtgAAAFAUHfoMmuV1fHRB94q0BaA+mdUMpXAVWLXFAwsLLbRQ/vvKK6/kqqwuXbpULbPyyiunpZdeOgdYIf6uvvrqVeFV6NatW95Y77zzTtUy1ddRXqa8DgAAAACKoWkqsEmTJuWufRtttFFabbXV8rQvv/wyV1C1adOmxrIRVsW88jLVw6vy/PK8aS0TIdePP/6Y5p133snaM378+Hwpi2UBAAAAmL0KXYEVY2FFF7+77747FWWA+Sh3K1/at29f100CAAAAmOsVNsA68sgj08CBA9Pjjz+ellpqqarpbdu2zYOzx1hV1cVZCGNeeZnaZyUsX5/eMtEPc0rVV+Hkk0/OXRrLl08++aRCjxYAAACAehNgxZjyEV498MAD6bHHHkvLLrtsjfnrrLNOmmeeedKjjz5aNW3o0KFp+PDhaYMNNsjX4+9bb72VRowYUbVMnNEwwqlOnTpVLVN9HeVlyuuYkubNm+d1VL8AAAAA0MDGwIpug3GGwb/97W9pgQUWqBqzKrrsRWVU/D3wwAPTsccemwd2jxDpqKOOysFTnIEwdO3aNQdV++67b7rwwgvzOk499dS87gihwmGHHZauuuqqdOKJJ6YDDjggh2X33HNPPjMhAAAAAMVRuAqsa6+9NnfP23zzzVO7du2qLv37969a5rLLLku/+c1v0i677JI23XTT3B3w/vvvr5rfpEmT3P0w/kawtc8++6QePXqks846q2qZqOyKsCqqrjp37pwuueSSdOONN+YzEQIAAABQHI1K0WePXyTOQhgVYRG46U4IAABzvw59Zr3HxkcXdK9IWwAaUoZSuAosAAAAAKhOgAUAAABAoRVuEHcAAABmja6OwNxGBRYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQmta1w0AAAAatg59Bs3yOj66oHtF2gJAManAAgAAAKDQBFgAAAAAFJouhAAADcCsdtHSPQsAqEsqsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChNa3rBgAAQFmHPoNmeWN8dEF3GxQA5jIqsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKLSmdd0AAACobzr0GTTL6/jogu4VaQsANAQqsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBohQuw/vWvf6Xtt98+LbHEEqlRo0bpwQcfrDF/v/32y9OrX7bZZpsay3z77bdp7733Tq1atUpt2rRJBx54YBozZkyNZd588820ySabpBYtWqT27dunCy+8cI48PgAAAADqeYD1ww8/pM6dO6err756qstEYPXFF19UXe66664a8yO8euedd9KQIUPSwIEDcyh2yCGHVM0fPXp06tq1a1pmmWXSK6+8ki666KLUt2/fdP3118/WxwYAAADAzGuaCmbbbbfNl2lp3rx5atu27RTnvffee2nw4MHppZdeSuuuu26e9qc//Sltt9126eKLL86VXXfccUeaMGFCuvnmm1OzZs3Sqquuml5//fV06aWX1gi6AAAAAKh7havAmhFPPPFEWmyxxdJKK62UDj/88PTNN99UzXvuuedyt8FyeBW6dOmSGjdunF544YWqZTbddNMcXpV169YtDR06NH333Xdz+NEAAAAAUK8qsKYnug/uvPPOadlll03//e9/0ymnnJIrtiKUatKkSfryyy9zuFVd06ZN00ILLZTnhfgbt69u8cUXr5q34IILTvG+x48fny/VuyICAEBRdegzaJbX8dEF3SvSFgBoUAHWHnvsUfX/1VdfPa2xxhpp+eWXz1VZW2211Wy97/PPPz+deeaZs/U+AAAAAJgLuhBWt9xyy6VFFlkkffDBB/l6jI01YsSIGstMnDgxn5mwPG5W/P3qq69qLFO+PrWxtcLJJ5+cRo0aVXX55JNPZsMjAgAAAGCuCrA+/fTTPAZWu3bt8vUNNtggjRw5Mp9dsOyxxx5LkyZNSuuvv37VMnFmwp9++qlqmThjYYypNbXug+XB41u1alXjAgAAAEADC7DGjBmTzwgYlzBs2LD8/+HDh+d5J5xwQnr++efTRx99lB599NG04447po4dO+ZB2MMqq6ySx8k6+OCD04svvpieeeaZdOSRR+auh3EGwrDXXnvlAdwPPPDA9M4776T+/funK664Ih177LF1+tgBAAAAmMMB1s8//5zDp5k5s9/LL7+c1lprrXwJESrF/08//fQ8SPubb76Zdthhh7TiiivmAGqdddZJTz31VK6OKrvjjjvSyiuvnMfE2m677dLGG2+crr/++qr5rVu3Tg8//HAOx+L2xx13XF7/IYccUuEtAAAAAEChBnE/5phj8sDqESxFeLXZZpulZ599NrVs2TINHDgwbb755tNdRyxTKpWmOv+hhx6a7jrijIN33nnnNJeJwd8j+AIAAACgAVVg3Xfffalz5875/wMGDMgVTu+//37q3bt3+sMf/lDJuwIAAACggahogPW///2v6ix+//jHP9Lvfve73NXvgAMOSG+99VYl7woAAACABqKiAdbiiy+e3n333dx9cPDgwWnrrbfO08eOHZvHrwIAAACAOh0Da//990+77bZbateuXWrUqFHq0qVLnv7CCy/kQdUBAAAAoE4DrL59+6bVVlstffLJJ7n7YPnMgFF91adPn0reFQAAAAANREUDrLDrrrvmv+PGjaua1rNnz0rfDQAAAAANREXHwIqxr84+++y05JJLpvnnnz99+OGHefppp52WbrrppkreFQAAAAANREUDrHPPPTfdeuut6cILL0zNmjWrmh7dCm+88cZK3hUAAAAADURFA6zbb789XX/99WnvvfeucdbBzp07p/fff7+SdwUAAABAA1HRAOuzzz5LHTt2nGz6pEmT0k8//VTJuwIAAACggahogNWpU6f01FNPTTb9vvvuS2uttVYl7woAAACABqKiZyE8/fTT8xkHoxIrqq7uv//+NHTo0Ny1cODAgZW8KwAAAAAaiIpWYO24445pwIAB6ZFHHknzzTdfDrTee++9PG3rrbeu5F0BAAAA0EBUtAIrbLLJJmnIkCGVXi0AAAAADVRFK7AAAAAAoNAVWAsuuGBq1KjRZNNjWosWLfIZCvfbb7+0//77V/JuAQAAAJiLVXwQ93PPPTdtu+22ab311svTXnzxxTR48ODUq1evNGzYsHT44YeniRMnpoMPPriSdw0AAADAXKqiAdbTTz+dzjnnnHTYYYfVmH7dddelhx9+OP31r39Na6yxRrryyisFWAAAQMPUt/Us3n5UpVoC0DDHwHrooYdSly5dJpu+1VZb5Xlhu+22Sx9++GEl7xYAAACAuVhFA6yFFlooDRgwYLLpMS3mhR9++CEtsMAClbxbAAAAAOZiFe1CeNppp+Uxrh5//PGqMbBeeuml9I9//CP169cvXx8yZEjabLPNKnm3AAAAAMzFKhpgxcDsnTp1SldddVW6//7787SVVlopPfnkk2nDDTfM14877rhK3iUAQJ3p0GfQLK/jowu6V6QtAABzs4oGWGGjjTbKFwAAAAAoZIBVNm7cuDRhwoQa01q1ajW77g4AAACAuVRFB3EfO3ZsOvLII9Niiy2W5ptvvrTgggvWuAAAAABAnQZYJ5xwQnrsscfStddem5o3b55uvPHGdOaZZ6Ylllgi3X777ZW8KwAAAAAaiIp2IRwwYEAOqjbffPO0//77p0022SR17NgxLbPMMumOO+5Ie++9dyXvDgAAAIAGoKIVWN9++21abrnlqsa7iuth4403Tv/6178qeVcAAAAANBAVDbAivBo2bFj+/8orr5zuueeeqsqsNm3aVPKuAAAAAGggKhpgRbfBN954I/+/T58+6eqrr04tWrRIvXv3zuNjAQAAAECdjoEVQVVZly5d0vvvv59eeeWVPA7WGmusUcm7AgAAAKCBqGiAVVsM3t66dWvdBwEAAAAoRhfCP/7xj6l///5V13fbbbe08MILpyWXXLKqayEAAAAA1FmA1a9fv9S+ffv8/yFDhuTLP//5z7TtttsaAwsAAACAuu9C+OWXX1YFWAMHDswVWF27dk0dOnRI66+/fiXvCgAAAIAGoqIVWAsuuGD65JNP8v8HDx6cB3IPpVIp/fzzz5W8KwAAAAAaiIpWYO28885pr732SiussEL65ptvctfB8Nprr+UzEQIAAABAnQZYl112We4uGFVYF154YZp//vnz9C+++CIdccQRlbwrAAAAZqe+rSuwjlGVaAlAZQOseeaZJx1//PGTTe/du7dNDQAAAEDdj4F12223pUGDBlVdP/HEE1ObNm3ShhtumD7++ONK3hUAAAAADURFA6zzzjsvzTvvvPn/zz33XLr66qtzV8JFFllEFRYAAAAAdd+FMMa+Kg/W/uCDD6ZddtklHXLIIWmjjTZKm2++eSXvCgAAAIAGoqIVWDFoe5x9MDz88MNp6623zv9v0aJF+vHHHyt5VwAAAAA0EBWtwIrA6qCDDkprrbVW+ve//5222267PP2dd97JZycEAAAAgDqtwIoxrzbYYIP09ddfp7/+9a9p4YUXztNfeeWVtOeee1byrgAAAABoICpagRVnHLzqqqsmm37mmWdW8m4AAABq6tt61rdI31G2KkBDqMAKTz31VNpnn33ShhtumD777LM87c9//nN6+umnK31XAAAAADQAFQ2wottgt27d0rzzzpteffXVNH78+Dx91KhR6bzzzqvkXQEAAADQQFS0C+E555yT+vXrl3r06JHuvvvuqukbbbRRngcA1K0OfQbN8jo+uqB7RdoCAAB1UoE1dOjQtOmmm042vXXr1mnkyJGVvCsAAAAAGoiKVmC1bds2ffDBB6lDhw41psf4V8stt1wl7woAgDnJANkAwNxSgXXwwQeno48+Or3wwgupUaNG6fPPP0933HFHOv7449Phhx9eybsCAAAAoIGoaAVWnz590qRJk9JWW22Vxo4dm7sTNm/ePAdYRx11VCXvCgAAAIAGoqIBVlRd/eEPf0gnnHBC7ko4ZsyY1KlTpzT//PNX8m4AAAAAaEAqEmAdcMABM7TczTffXIm7AwDmcs6WCABAxQOsW2+9NS2zzDJprbXWSqVSqRKrBAAAAIDKBVgxQPtdd92Vhg0blvbff/+0zz77pIUWWqgSqwYAAACggavIWQivvvrq9MUXX6QTTzwxDRgwILVv3z7ttttu6aGHHlKRBQAAAEDdB1ghzja45557piFDhqR33303rbrqqumII45IHTp0yIO5AwAAAECdBlg1Vtq4cT4jYYyH9fPPP8+OuwAAAACggahYgDV+/Pg8DtbWW2+dVlxxxfTWW2+lq666Kg0fPjzNP//8lbobAAAAABqYigziHl0F77777jz21QEHHJCDrEUWWaQSqwYAgJnTt/Wsb7G+o2x1AJjbAqx+/fqlpZdeOi233HLpySefzJcpuf/++ytxdwAAAAA0IBUJsHr06JHHvAIAAACAQgZYt956ayVWAwAAAABz5iyEAAAAAFCoCiwAAGAuZVB8AApABRYAAAAAhSbAAgAAAKDQCteF8F//+le66KKL0iuvvJK++OKL9MADD6Sddtqpan6pVEpnnHFGuuGGG9LIkSPTRhttlK699tq0wgorVC3z7bffpqOOOioNGDAgNW7cOO2yyy7piiuuSPPPP3/VMm+++Wbq1atXeumll9Kiiy6alz/xxBPn+OMFAKCB0jUPAOpvBdYPP/yQOnfunK6++uopzr/wwgvTlVdemfr165deeOGFNN9886Vu3bqlcePGVS2z9957p3feeScNGTIkDRw4MIdihxxySNX80aNHp65du6ZlllkmB2URmPXt2zddf/31c+QxAgAAAFCPK7C23XbbfJmSqL66/PLL06mnnpp23HHHPO32229Piy++eHrwwQfTHnvskd577700ePDgXFm17rrr5mX+9Kc/pe222y5dfPHFaYkllkh33HFHmjBhQrr55ptTs2bN0qqrrppef/31dOmll9YIugAAAACoe4WrwJqWYcOGpS+//DJ16dKlalrr1q3T+uuvn5577rl8Pf62adOmKrwKsXx0JYyKrfIym266aQ6vyqKKa+jQoem7776b6v2PHz8+V29VvwAAAAAwe9WrACvCqxAVV9XF9fK8+LvYYovVmN+0adO00EIL1VhmSuuofh9Tcv755+fArHxp3759hR4ZAAAAAHNFgFXXTj755DRq1KiqyyeffFLXTQIAAACY69WrAKtt27b571dffVVjelwvz4u/I0aMqDF/4sSJ+cyE1ZeZ0jqq38eUNG/ePLVq1arGBQAAAIDZq14FWMsuu2wOmB599NGqaTEOVYxttcEGG+Tr8XfkyJH57IJljz32WJo0aVIeK6u8TJyZ8KeffqpaJs5YuNJKK6UFF1xwjj4mAAAAAOpZgDVmzJh8RsC4lAduj/8PHz48NWrUKB1zzDHpnHPOSX//+9/TW2+9lXr06JHPLLjTTjvl5VdZZZW0zTbbpIMPPji9+OKL6ZlnnklHHnlkPkNhLBf22muvPID7gQcemN55553Uv3//dMUVV6Rjjz22Th87AAAAAJNrmgrm5ZdfTltssUXV9XKo1LNnz3TrrbemE088Mf3www/pkEMOyZVWG2+8cRo8eHBq0aJF1W3uuOOOHFpttdVW+eyDu+yyS7ryyiur5scA7A8//HDq1atXWmedddIiiyySTj/99LxOAAAAAIqlcAHW5ptvnkql0lTnRxXWWWedlS9TE2ccvPPOO6d5P2ussUZ66qmnZqmtAAAAADTALoQAAAAAUJ0ACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQmta1w0AAGjQ+rauwDpGVaIlAACFpQILAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhda0rhsAADBb9G1dgXWMqkRLAACYRSqwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGhN67oBAAAANEwd+gya5XV8dEH3irQFKDYVWAAAAAAUmgALAAAAgELThRAAKkAXCAAAmH1UYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0JrWdQMAgHqmb+sKrGNUJVoCAEADoQILAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCa1rXDQAAAIAi69Bn0Cyv46MLulekLdBQqcACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAotHoZYPXt2zc1atSoxmXllVeumj9u3LjUq1evtPDCC6f5558/7bLLLumrr76qsY7hw4en7t27p5YtW6bFFlssnXDCCWnixIl18GgAAAAAmJamqZ5addVV0yOPPFJ1vWnT/3sovXv3ToMGDUr33ntvat26dTryyCPTzjvvnJ555pk8/+eff87hVdu2bdOzzz6bvvjii9SjR480zzzzpPPOO69OHg8AAAAAc1mAFYFVBFC1jRo1Kt10003pzjvvTFtuuWWedsstt6RVVlklPf/88+nXv/51evjhh9O7776bA7DFF188rbnmmunss89OJ510Uq7uatasWR08IgAAAADmqgDrP//5T1piiSVSixYt0gYbbJDOP//8tPTSS6dXXnkl/fTTT6lLly5Vy0b3wpj33HPP5QAr/q6++uo5vCrr1q1bOvzww9M777yT1lprrSne5/jx4/OlbPTo0bP5UQIAADBNfVvP+gbqO8pGnsM69Bk0y+v46ILuFWkL9UO9DLDWX3/9dOutt6aVVlopd/8788wz0yabbJLefvvt9OWXX+YKqjZt2tS4TYRVMS/E3+rhVXl+ed7UREgW9wUAAABzYzAkFKKo6mWAte2221b9f4011siB1jLLLJPuueeeNO+88862+z355JPTscceW6MCq3379rPt/gAAAACopwFWbVFtteKKK6YPPvggbb311mnChAlp5MiRNaqw4iyE5TGz4u+LL75YYx3lsxROaVytsubNm+cLAAAAMPfT1bE4Gqe5wJgxY9J///vf1K5du7TOOuvkswk++uijVfOHDh2ahg8fnsfKCvH3rbfeSiNGjKhaZsiQIalVq1apU6dOdfIYAAAAAJiLKrCOP/74tP322+dug59//nk644wzUpMmTdKee+6ZWrdunQ488MDc1W+hhRbKodRRRx2VQ6sYwD107do1B1X77rtvuvDCC/O4V6eeemrq1auXCisAAACAgqmXAdann36aw6pvvvkmLbroomnjjTdOzz//fP5/uOyyy1Ljxo3TLrvsks8aGGcYvOaaa6puH2HXwIED81kHI9iab775Us+ePdNZZ51Vh48KAAAAgLkmwLr77runOb9Fixbp6quvzpepieqtf/zjH7OhdQAAAABU0lwxBhYAAAAAcy8BFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaE3rugEAAAAw1+vbugLrGFWJlkC9pAILAAAAgEITYAEAAABQaLoQAlBYHfoMmuV1fHRB94q0BQAAqDsqsAAAAAAoNBVYAAAAwP9jsHkKSgUWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChNa3rBlAMHfoMmuV1fHRB94q0BQAAAKarb+tZ30h9R9nQ9YQKLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoTeu6AcxF+rauwDpGVaIlAAAAwFxEBRYAAAAAhSbAAgAAAKDQdCEEAAAAmF0Mt1MRAiwAmFu+3BhHEACAuZQuhAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKE1resGADDndegzaJbX8dEF3SvSFgAAgOkRYFGvOOgGAACAhkeARcPTt3UF1jGqEi0BAAAAZoAxsAAAAAAoNAEWAAAAAIUmwAIAAACg0IyBBcDczbh3AABQ76nAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgGcYcGrkOfQbN0+48u6F6xtswNZnV7BtsUAACgJhVYAAAAABSaCiyYDVThAAAAQOUIsIB6oUGFgn1bV2AdoyrRkrmjnQAAQL0nwAJmjRADAACA2cwYWAAAAAAUmgosKCqVTQAAAJCpwAIAAACg0ARYAAAAABSaAAsAAACAQjMGFtBwGFcMAACgXmrwFVhXX3116tChQ2rRokVaf/3104svvljXzwkAAAAA1TToAKt///7p2GOPTWeccUZ69dVXU+fOnVO3bt3SiBEj6rppAAAAAPz/GnSAdemll6aDDz447b///qlTp06pX79+qWXLlunmm2+u66YBAAAA0NADrAkTJqRXXnkldenSpWpa48aN8/XnnnuuTtsGAAAAwP9psIO4/+9//0s///xzWnzxxWtMj+vvv//+FG8zfvz4fCkbNWpU/jt69OhU300aP3aW1zG6UWnWGzKdbamdld2eldimc+J5D577ym5T27Oy27Mw27S+tDOvxD46J7dn8H5f2W3qtdQwt2dh2lpf2jkXPff1pZ3B+33Dfe6LrpydlEq/bHs0Kv3SW9Zzn3/+eVpyySXTs88+mzbYYIOq6SeeeGJ68skn0wsvvDDZbfr27ZvOPPPMOdxSAAAAgLnDJ598kpZaaqmZvl2DrcBaZJFFUpMmTdJXX31VY3pcb9u27RRvc/LJJ+dB38smTZqUvv3227TwwgunRo0apblVpKTt27fPO1mrVq1SkdWXtmqn7Vnk/TPYR21P+6jXUhF5b7JNfcdrWK+l+tRW7bQ9i7x/FkXUT33//fdpiSWW+EW3b7ABVrNmzdI666yTHn300bTTTjtVBVJx/cgjj5zibZo3b54v1bVp0yY1FPGCrC8vyvrSVu20PYvOPmp7Fp191PYssvqyf9antmpnw9ye9amt2ml7Mm2tW7dOv1SDDbBCVFP17Nkzrbvuumm99dZLl19+efrhhx/yWQkBAAAAKIYGHWDtvvvu6euvv06nn356+vLLL9Oaa66ZBg8ePNnA7gAAAADUnQYdYIXoLji1LoP8P9Ft8owzzpis+2QR1Ze2aqftWXT2Uduz6OyjtmeR1Zf9sz61VTsb5vasT23VTtuT2a/BnoUQAAAAgPqhcV03AAAAAACmRYAFAAAAQKEJsAAAAAAoNAEW03X11VenDh06pBYtWqT1118/vfjii4Xbav/617/S9ttvn5ZYYonUqFGj9OCDD6aiOf/889OvfvWrtMACC6TFFlss7bTTTmno0KGpiK699tq0xhprpFatWuXLBhtskP75z3+morvgggvy83/MMcekIunbt29uV/XLyiuvnIros88+S/vss09aeOGF07zzzptWX3319PLLL6eiifek2ts0Lr169UpF8vPPP6fTTjstLbvssnl7Lr/88unss89ORRx+8vvvv8+vnWWWWSa3dcMNN0wvvfRSod/bYzvGmYTbtWuX29ylS5f0n//8p3DtvP/++1PXrl3z6yrmv/7663O8jTPS1p9++imddNJJ+XU/33zz5WV69OiRPv/880K1s/y+Gu+j0c4FF1wwP/cvvPBC4dpZ3WGHHZaXufzyy1PR2rnffvtN9n66zTbbzPF2zkhbw3vvvZd22GGH1Lp167wPxPer4cOHF6qdU/qMistFF11UqHaOGTMmn9BqqaWWyu+jnTp1Sv369ZujbZyRdn711Vd5P435LVu2zPtnXbzfz8j3+XHjxuXvI/GeP//886dddtklt79o7bz++uvT5ptvnr/rxzYfOXLkHG3jjLTz22+/TUcddVRaaaWV8v659NJLp9///vdp1KhRhWtrOPTQQ/N3vWjroosumnbcccf0/vvvz/G2zs0EWExT//7907HHHpvP/PHqq6+mzp07p27duqURI0YUasv98MMPuW0RthXVk08+mT/Mnn/++TRkyJB8oBAHNNH2ookvMREGvfLKKzm82HLLLfMb8DvvvJOKKg60r7vuuhy8FdGqq66avvjii6rL008/nYrmu+++SxtttFGaZ555cmD57rvvpksuuSQfHBbx+a6+PeM1FX73u9+lIvnjH/+YA+GrrroqH3DF9QsvvDD96U9/SkVz0EEH5e345z//Ob311lv5/SlCgQg1i/reHtvyyiuvzAdbEV7EgWx8RsXBQ5HaGfM33njj/PzXtWm1dezYsfmzPkLX+BvBW3w5j6CgSO0MK664Yn5dxb4a76cRasc++/XXXxeqnWUPPPBA/vyPg++6MCPtjECg+vvqXXfdlYrY1v/+97/59RQB5hNPPJHefPPNvM/GD61Famf1bRmXm2++OYcEEWYUqZ3xPX/w4MHpL3/5S/6cih8yItD6+9//Xph2xo8VERZ8+OGH6W9/+1t67bXX8o8t8Rk1p79Hz8j3+d69e6cBAwake++9Ny8fPwLsvPPOhWtnvOfH6/6UU06Zo22bmXbGtovLxRdfnN5+++1066235v31wAMPLFxbwzrrrJNuueWW/Fp66KGH8r4by8QPmlRInIUQpma99dYr9erVq+r6zz//XFpiiSVK559/fmE3WuzWDzzwQKnoRowYkdv65JNPluqDBRdcsHTjjTeWiuj7778vrbDCCqUhQ4aUNttss9LRRx9dKpIzzjij1Llz51LRnXTSSaWNN964VB/Fc7788suXJk2aVCqS7t27lw444IAa03beeefS3nvvXSqSsWPHlpo0aVIaOHBgjelrr7126Q9/+EOpiO/t8Vy3bdu2dNFFF1VNGzlyZKl58+alu+66q5CfQcOGDcvzX3vttVJ9+bx88cUX83Iff/xxqcjtHDVqVF7ukUceKRWtnZ9++mlpySWXLL399tulZZZZpnTZZZeV6tKU2tmzZ8/SjjvuWCqaKbV19913L+2zzz6lIpmRfTS275ZbblkqWjtXXXXV0llnnVWo9/7a7Rw6dGieFq+h6sckiy66aOmGG24oFen7fHwOzTPPPKV77723apn33nsvL/Pcc88Vpp3VPf7443ned999V6oPx0f33HNPqVmzZqWffvqpVPS2vvHGG3mZDz74YI62bW6mAoupmjBhQq7AiV83yho3bpyvP/fcc7bcLCqXvi600EKF3pbxi8Hdd9+df12IroRFFL+GdO/evca+WjRR5h6/vC+33HJp7733nuNdHWZE/Nq67rrr5iqmKI1ea6210g033JDqw3tV/HJ8wAEH5F+3iyS64T366KPp3//+d77+xhtv5GqRbbfdNhXJxIkT82u9dgVDlMAXsVowDBs2LH355Zc1XvfRnSi6uvuMquxnVbyu2rRpk4r8HhBdYeL5jwqOIpk0aVLad9990wknnJArcYssqpnivT+66hx++OHpm2++SUUT23PQoEG5Ai+qLaO98Zov4tAR1UX3sWh3XVSNzMjnVHz+R7VtZEePP/54/syKqpGiGD9+fP5b/TMqjkmaN29e559Rtb/Px7FTVOZU/2yKasHo+laXn0315bhjRtoZy0S3x6ZNm87Blk25HdNqaxw7RTVWDCPRvn37Ody6uZcAi6n63//+lw9oFl988RrT43ocNDBrX8CiRDu6a6222mqF3JTRLSP67ceXgxi3I7o/xLgIRRPhWnR1iX7pRRVfrsslz9GdLA68N9lkkzzmUJFEaX60b4UVVshlz3EAE+MM3HbbbanI4sAlxm2IsTGKpk+fPmmPPfbIX16ja2aEgvHajxCzSGI8hwioY3yuKNWP9/4IBePLdnR9KaLy55DPqNknumLGmFh77rlnPlgomoEDB+bPqTioveyyy3KXjkUWWSQVSXQbjYOseC8tsuhGdPvtt+fAPdocXWUiaC9at5cYwiLGbIphDqLNDz/8cPrtb3+bu2dFm4sqPkfjfXZOdyObEdGlPb7fxfARzZo1y9s1uvFtuummqSjKAdDJJ5+chzuI0Dr2008//bROP6Om9H0+PptiO9YO/evy+Kk+HHfMaDvj+DS+qxxyyCGpqG295ppr8mdTXGJIjvhsin2Cyqjb2BIaqKgYin7cdf2r0bTEL7Ax0HD8unDfffelnj175i+HRQqxPvnkk3T00UfnD4Y5PfbFzKhebRNjdEWgFWM33HPPPYX6NTY+jKMC67zzzsvXI2yJ/TTGF4rnv6huuummvI3ramyZaYnn+I477kh33nlnrr6I11R84Ym2Fm2bxthXUcW25JJLpiZNmqS11147BxfxazINT1QQ7LbbbrkiI4LtItpiiy3yayoOaKJaNNobY6FFVU4RxGvniiuuyD+yFK06tLYI2stiEP/4rIqBiKMqa6uttkpF+pwKMS5njDMU1lxzzfTss8/mz6rNNtssFVGMfxU/XBTxu0oEWDGmT1RhxXeTGEw9vqfG51RRKtvjB6AYky++M0W1S3xGRdvis78uT4pSH77Pz03tHD16dO5xEccicSKPorY1Xutbb711Dldj7K74bHrmmWcK+fqvj1RgMVXxK2Z8QNQ+a0Zcb9u2rS33C8XAmPGrcZRox69dRRW/FHTs2DEPRhjVTdEtI76IF0kcHMSvsXGgHb9wxyVCthjUOf5ftF+Oy+JXuej+8MEHH6QiiTO51Q4oV1lllUJ2dyz7+OOP0yOPPJIHIC+i6DZUrsKKg8LoShQHXUWsGIyD1Xj9RHVDhMNxxtkIMaLbaxGVP4d8Rs2+8CpeX/EDQRGrr0IM2h+fU7/+9a9zkB3v+/G3KJ566qn8GRWVI+XPqNimxx13XB50vsjidR/fA4v2ORVtiu1Ynz6rYj+IkyEU8XPqxx9/zAN4X3rppfkMgBFcxvfU3XffPR94F0l8H43AOiquIxiIqvbo5lpXn1FT+z4fn01RIVb7jH51dfxUX447ptfO6LUQ1YFRyRi9QiLULGpbozt79GaIKsYoAoizEEabqQwBFtMMMOLDIsrJq//yFdeLOhZSkcUvRPGGF29gjz32WO4PXZ/Ec18eg6Ao4lfh6OoYX2jKl6ggil8+4v8RwBZRBARxFqUIjIokyqBrnw44xsGIX2SLKsYWiGqL+EWuiOIMPzFOR3WxX5arCIoaCsS+Gd00oitpVDoUUbyHxsFA9c+o+HU2KnB8Rs16eBXj9kU4HKeBry+K9jkVgXWcIa/6Z1RUtUSwHa+tIouuWREOFO1zKr6bxmns69NnVYSq8X26aOOzlV/vcalPn1MRDiy66KL5PSrOlD2nP6Om930+nusIV6p/NsX+GgHrnPxsqi/HHTPSzvhsjzHZ4vUflYJ1Vcn0S7Zp3CYuRfpsqu90IWSa4tS60c0lQoH11lsvXX755XlAuv33379wgUD1XwljjKH4ohhlxvHLZxFEqWl0I4rT/8avB+V+8PFBHAMlF0mMMRBl2bHt4hePaHd0IyjaF+7YjrX7ncfBdxxwFamP//HHH59/2Ywv1zG+0BlnnJG/HEb3rCKJyqAYzDW6EMYBbFTgxMDIcSmi+HIdAVa8R9X1QJ5TE8/7ueeem19L0YUwTv0dv3RHV72iKZ/uOboPx/tpHGTHuCN1+X4/vff26I55zjnn5F8644vkaaedlgOCON16kdr57bff5oOXeP2H8sF3BHBz+hf5abU1wopdd901d3mLX5ejirX8WRXz5+QYHtNqZ7zHx+tqhx12yG2OLoQxZk8MQh0noSjSc187AIwD23jO43VWlHbG5cwzz0y77LJLblv8wHLiiSfm6rYYKH1Om942jfemqBCK6oboRhqVOAMGDMjfU4rUzvKB97333psuueSSOdq2mWlndLuMbRrfReN7SlTixnho8VlVpHbGdozgKv4fP17GEBLxXj+nB5uf3vf5+BtdHeMYKtoeFaxHHXVUDq+iWrQo7QwxLS7l7R7bNZaNbTynBnufXjvL4VX8IBhjc8b1uITYH+bkj9XTa2uMJdu/f//c3mhb/BAQ4/XFvO22226OtXOuV9enQaT4/vSnP5WWXnrpfLrS9dZbr/T888+XiqZ8+tfalzgtdFFMqX1xueWWW0pFc8ABB+RTfcdzHqco3mqrrUoPP/xwqT7YbLPNSkcffXSpSOKU3+3atcvbM06lHteLejrdAQMGlFZbbbVS8+bNSyuvvHLp+uuvLxXVQw89lF9DcXrtoho9enTeH+M9tEWLFqXlllsun5p8/PjxpaLp379/bl/sp23bti316tUrnw68yO/tkyZNKp122mmlxRdfPO+z8V5VF/vD9NoZ7/NTmn/GGWcUqq3Dhg2b6mdV3K4o7fzxxx9Lv/3tb0tLLLFE3l/j/XWHHXYovfjii3O0jdNr55TEZ+tll11WqHaOHTu21LVr1/x5P8888+Q2HnzwwaUvv/xyjrdzem0tu+mmm0odO3bM76udO3cuPfjgg4Vs53XXXVead9556/S9dHrt/OKLL0r77bdffj3F9lxppZVKl1xySX5/LVI7r7jiitJSSy2V99H4TD311FPr5LN0Rr7Px3vUEUccUVpwwQVLLVu2zO9XsZ2L1s74DKrrY5PptXNq+0Vc4jNrTppeWz/77LPStttuW1psscXyfhr761577VV6//3352g753aN4p+6DtEAAAAAYGqMgQUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFANCAXH/99al9+/apcePG6fLLL6/r5gAAzBABFgDATNpvv/3STjvtNNn0J554IjVq1CiNHDmykNt09OjR6cgjj0wnnXRS+uyzz9IhhxwyxeXiMZQv8803X1phhRXyY37llVfmeJsBAIIACwCgnvnpp59+0e2GDx+eb9u9e/fUrl271LJly6kue8stt6QvvvgivfPOO+nqq69OY8aMSeuvv366/fbbZ6HlAAC/jAALAGA2+utf/5pWXXXV1Lx589ShQ4d0ySWX1JgfVU4PPvhgjWlt2rRJt956a/7/Rx99lJfp379/2myzzVKLFi3SHXfcMdWAascdd0zzzz9/atWqVdptt93SV199lefF+lZfffX8/+WWWy6vM9Y9NdGGtm3b5jZ37do13XfffWnvvffOFVzfffddXuabb75Je+65Z1pyySVzGBbrv+uuu6rWEWHXwgsvnMaPH19j3VG9tu+++87klgQAGjIBFgDAbBJd7iJE2mOPPdJbb72V+vbtm0477bSqcGpm9OnTJx199NHpvffeS926dZts/qRJk3J49e2336Ynn3wyDRkyJH344Ydp9913z/Pj7yOPPJL//+KLL+bqqhgLa2b07t07ff/993ndYdy4cWmdddZJgwYNSm+//XbukhjBVKw//O53v0s///xz+vvf/161jhEjRuTlDzjggJneBgBAw9W0rhsAAFAfDRw4MFc6VRdhTXWXXnpp2mqrrXJoFVZcccX07rvvposuuiiPKTUzjjnmmLTzzjtPdf6jjz6aQ7Jhw4ZVBVNRARXVXy+99FL61a9+lauhwqKLLpqrq2bWyiuvnP+WK7ei8ur444+vmn/UUUelhx56KN1zzz1pvfXWS/POO2/aa6+9cnfECLPCX/7yl7T00kunzTfffKbvHwBouFRgAQD8AltssUV6/fXXa1xuvPHGGstEtdRGG21UY1pc/89//jNZ2DU966677jTnx31FcFW9qqpTp065K2DMq4RSqZT/RvfDEI/h7LPPzl0HF1pooRzoRYAVXRnLDj744PTwww/nQeNDVJ9FeFdeBwDAjFCBBQDwC8TZ+Tp27Fhj2qeffjrT64kgpxwMTWuQ9ri/ulYOwpZddtn8NyrJrrjiinT55ZfnECvaGJViEyZMqLrNWmutlTp37pyrwWIsrRgUProQAgDMDAEWAMBsssoqq6RnnnmmxrS4Hl0JmzRpUtWdL8ajKovqrLFjx/6i+/rkk0/ypVyFFd0VR44cmSuxKiGCqhgcvkuXLlWPJcbd2meffarG4fr3v/892f0ddNBB+bZRhRW3ndmxtwAAdCEEAJhNjjvuuDw2VXSzi2DntttuS1dddVWNcaO23HLLPO21115LL7/8cjrssMPSPPPMM9P3FcFQVEHFmQJfffXVPJB6jx498pkLp9f9cEoi+Pryyy/Txx9/nAdt33XXXdOdd96Zrr322twtMaywwgp53rPPPpursw499NCqsx5WF+NgRXXaDTfcYPB2AOAXEWABAMwma6+9dh7Q/O67706rrbZaOv3009NZZ51VYwD3Sy65JFckbbLJJjnoiXCrZcuWv6gr4t/+9re04IILpk033TQHWsstt1zq37//L2r7/vvvn9q1a5cHbj/88MPz+FYRikUby0499dT8GOOsiDEoewwMv9NOO022rtatW6dddtklr2NK8wEApqdRqfagCwAAUGFxNsY4I+KVV15p2wIAM02ABQDAbPPdd9+lJ554IndBjDG5VlppJVsbAJhpBnEHAGC2ibMQRoj1xz/+UXgFAPxiKrAAAAAAKDSDuAMAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAAAgFdn/Bxn9KnrWczcGAAAAAElFTkSuQmCC" /&gt;

&lt;h2&gt;Characters per Hour&lt;/h2&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAH0CAYAAAAt0NQSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYO5JREFUeJzt/QecVNX9P/4fkK6CXVRUMFZs2HtXUElsJDZU7CVoFBMVEwXUJLagWLArYqIR9aNGxWBvEey9RiOIHQvFBgjM//E+v//sd3fp7MLedZ/Px2NYZu6de8/cuVPua97n3EalUqmUAAAAAKCgGtd1AwAAAABgVgRYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAC0CjRo3S8ccfb1tTCBdccEFac80107Rp0+q6KYVz44035tfrqFGjZjnfoYcemhZZZJHUEG2//fb5Upu+/vrrtPDCC6f777+/VpcLwM+HAAsAauB///tfOuaYY9Iqq6ySWrRokVq3bp222mqrdMkll6Qff/yx3m/bTz/9NPXr1y+98sordd2UwpldgFHU0HLChAnp/PPPT6eddlpq3LjqV8FJkyalyy67LG299dZp8cUXT82aNUvLL7982mOPPdI///nPNHXq1Dprd0M1efLk/H6ywQYb5PeXxRZbLK299trp6KOPTu+88076uVhyySXTkUcemc4888y6bgoABdWkrhsAAPXV0KFD029+85vUvHnzdMghh6R11lknH2z+5z//Saecckp688030zXXXJPqe4B11llnpfbt26dOnTrVdXOoBTfccEOaMmVKOuCAA6rc/uWXX6bddtstvfjii6lLly7pjDPOSEsssUT6/PPP08MPP5wOPPDA9P777wsYFrBu3bqlf//73/n5Ouqoo9JPP/2Ug6v77rsvbbnllrmS7ufi2GOPTZdeeml69NFH04477ljXzQGgYARYADAPRo4cmfbff/+08sor54Ot5ZZbrmJaz54984F+BFwL0vfff5+74NQH9aGtpVIpTZw4MbVs2TLVJ7PbtoMGDcoVVVExWNnBBx+cXn755fR///d/aZ999qky7fTTT08vvPBCevfdd2e57theUbVVvbKLefP888/noOovf/lL+uMf/1hl2uWXX57GjRtX7zdtdGON4D/2x7XWWiv/EBDdOAVYAFTn2wUAzOMYQt999126/vrrq4RXZauuumo68cQTp7v97rvvzgdoUbUV3YCGDRtWZfqHH36Yfvvb36Y11lgjByfRrSaqvKqPx1Mep+eJJ57I8y+zzDKpXbt2c7WMEAfAvXr1yhVW0aZYRlSTffXVV+nxxx9Pm2yySZ7vsMMOy+uLS6y77Nlnn0277rpratOmTWrVqlXabrvt0tNPP11lHdEFMe731ltv5Sqe6JoWXdRCVPfEsmO9sf7Ylnvuueccjz/0wQcf5GqhCGyiq9vZZ5+dg6fqB8gDBgzI2zsOkpdddtnc7XPs2LFV5ott8Mtf/jI98MADaeONN87b7uqrr061acyYMemII47IbYi2rL/++mnw4MFV5ontHtsr/lYW26T69i9vh+jKuvvuu6dFF100de/efZbB62uvvZZ23nnnKrePGDEiP+7ollY9vCqLbVJ52eV23nrrrblaa4UVVsj7QHRRDLfffnvaaKON8nZcaqml0kEHHZQ++eSTORpLKR5XPB/VH/vf/va3dPHFF+fgOJYb+9sbb7wx3f2jQunXv/51riCL7Rxtv+eee6abL6okIyiJZcU++Oc//3muxwWb1T4Yf+NxxD49o7AvXjexL85MPK8huiVXt9BCC+XXdmWxfQ8//PC8f5XfY6LirrLy83bbbbflYCwed2yjnXbaKQfv1UUV6S9+8Yu8jTbddNP01FNPzbCt0f20b9+++b0v1r3iiiumU089Nd8+o661N998c25fzFv5fXCXXXZJ995773SvYwBQgQUA8yAOsGLcq+jCM6eia+Gdd96Zw6UIGqKrTHQPGj16dMWBaFRcDB8+PFd3xYFlHLhfeeWV+SA/AqAICCqLZS299NKpT58+ufJmbpYRAdw222yT3n777XzQu+GGG+bgKg70P/7441wNEQfjsewINmLeUH7MUXkWXc4ipIgD16i6ieqeCATiIDcOdiuLEG211VZLf/3rXysOTuPxR4hwwgkn5AP9CHgeeuihvE0qBxgzEuMxRXi2+eab50AxDoKjHdE9LtpdFgFBhD4RlP3ud7/LIU5Ur0S1UYRtTZs2rZg3Koyiq1bcJ7prRQg4O7HN5kSMiRbPQYQEcQDfoUOHHPJEWBNB4owCzzkRjzcClAgFI+Cpvo9UFvtFiOe6+v4cImSaW+ecc06uuvrDH/6Qw4r4f3l7RwB67rnnpi+++CKP4xTbO7Z7jOM0L2666ab07bff5irHCIBimbG/vf766zm0CbE/ReATgVrv3r1zsBRhzV577ZWry/bee++K8HSHHXbI2688X4Q1c1NxN7t9MMKa2KYx7ZtvvsmBWuVtHmHfrLZ5BHUhwp54TE2azPyre2zjaEc5IIr3heh6GIFprOekk06qMv95552XX7PxvI0fPz63MQLKCKXLIqCP10K85uP+EdZF9V48jgioyiL0i9vjPS7eK+K9I56TCBv/+9//5uC+snjviOck2hnhZuXXeryfxP3ieYywHwAqlACAuTJ+/PhIX0p77rnnHN8n5m/WrFnp/fffr7jt1VdfzbdfdtllFbf98MMP0913xIgReb6bbrqp4rZBgwbl27beeuvSlClTqsw/p8vo06dPvu3OO++cbv5p06blv88//3yeJ9ZXffpqq61W6tKlS8W85XV36NChtMsuu1Tc1rdv37yMAw44oMoyxo4dm2+/8MILS3OrR48e+b4nnHBClTZ17do1b+cvv/wy3/bUU0/l+W6++eYq9x82bNh0t6+88sr5tpg2N22Y1aVnz54V8w8YMCDf9o9//KPitsmTJ5e22GKL0iKLLFKaMGFCvu2xxx7L88XfykaOHDndc1FuQ+/eveeozWeccUae/9tvv61y+957751vHzduXJXbf/zxx7wty5d4zsrK7VxllVWq7HPxmJZZZpnSOuusk+9fdt999+X5Y78r22677fJlRts2no/qj71ly5aljz/+uOL2Z599Nt/eq1evitt22mmn0rrrrluaOHFilX1jyy23zPts2UknnZTvG8soGzNmTKlNmzb59lhnbeyD7777bp7vyiuvrHL/PfbYo9S+ffsqr5/qYlpsn7j/sssum19DAwcOLH344YfTzXvEEUeUlltuudJXX31V5fb9998/P6byc1R+3tZaa63SpEmTKua75JJL8u2vv/56leexU6dOVea75ppr8nyVn7e///3vpcaNG+fXW2VXXXVVnvfpp5+uuC2ux7xvvvnmDB/z8OHD8zxDhgyZ6XYBoGHShRAA5lK5i1RUUc2N6LYVXXHK1ltvvXxWsahqKKtc/RGDNcep5aNLTlSsvPTSS9MtM6qEoitRZXO6jKhGiS5s5YqUyqKKY1birITvvfde7hIYy48qpLhEFVh0RXryySen64oVAzRXb2dU60SXpurd+eZU5bP8lStPYjydGHQ8RIVTdNOKbknlNsYlqjyi691jjz1WZXlRFRXVTHMqul5FxdiMLtXdf//9qW3btlUGT4/qr6gKi2q46A46r4477rg5mi+eq6jiqX72xPI+Xf32q666KlfylC/lrp+V9ejRo8o+F2NlRSVdVAdWHmera9euecDxmowNF1VUUVlVFlV+m222Wd62Iaqcorpn3333zZVa5ec7Hnc8r7HPlrsxxn2iYqlypWA8xll1wZyXfXD11VfPbYwqqrJoZ1RHxbpm9VqLadG1M7o2RtfbOBNkVJ9FZdZ+++1XMQZW5ELxev7Vr36V/195X4/HHRVW1d8/okIuXn9l5QrL8vtR+XmM123l+aJiMF5TlcXrLKqu4vmtvO7yOFbVX2fR9bNjx44zfMzxOOemshGAhkMXQgCYSxE6hThAnhsrrbTSDA/WKoc30c0sulxFV7w40K48DkwchFYXgUt1c7qMGF8nuvDNiwgCyuHFzMS6ygejM2prjH1z/vnnp9///ve5+1eECTEGVYzBFUHP7ET3p+jGWVmEBaE8hla0M9oRY4TNSBygz257zkqEh9XHk5qZGJssulBWH+A8DvzL0+dFBFLl8c/mVTmMjSCtcjgR+0e5G1c8T9Flrrrq26z8OGbU/TICjuhmNq9i+1UXz3l0RwvRPTP29zPPPHOmZ0uM5zxCsGhnBEvVzUm30bnZB0Ps0xFsxTojfIrAJ8LlGDh/duJ18qc//SlfPvvssxx0RtfJeMwRgP7jH//IZ5CMMCu6QM7szKfV9/Xq70fl12r5/aj8PFbf5rHO6o85XmfRFTkCwJq+zsrvV7ML0QFoeARYADAPAVYM1jyjwaNnpXqlVFnlgCnGgorgKcab2WKLLXKYEAdyMZ7VjAaXntF4PXO7jHlRXs6FF16YOnXqNMN5qlfzzKit0caoGokxcqLSJEKHCN+iimaDDTaolXZGeFW5+qWy6gfcRTjj4MwO3GcUHpUDjjk961+MtRbjM0X4WrmCMIKlEPt05QHDY5yj8lhHEXDMqCqmJtssHuuMBuue2WOd0/0yxnWaWSVdVCMuaPHai5MlxH4YZxOM0CkGlp+bsCzESQ5iWREsxgDoEWLFeGPlxx3jac0sVI6Kz7l9P5pTsf511103XXTRRTOcXnm8rNntM+UALcbGAoDKBFgAMA+iUigqHeLsbRES1ZY77rgjH4D279+/4rYYrLrcVag2lxHdGWcXws0sTCl3hYwwb04rkGYmlhXVPXGJSo4IxKLtcZA/u4Pm6O5UrngJMWB0KA8KHcuOrlwRytR1OBWVN3EGwGh35cApzphXnl65Eqb68zWvFVqVlYOqGMi+cqAR+3MM6l0eLLwmyo8jBsQvdyEri9vK08uPtXIX2tk91nLlX2XxnJef73JlUFQJzW6/jHbMaHnRxjk1J/tgiEHPowtlbN/oNhiD2ceZMedVPL54/qL9ESpGEBuBZAR/NX09lpWfp1hH5ecxKsdi/4nux2XxOnv11Vdz9+GaVk7FsitXJgJAmTGwAGAexOnh46xlRx55ZD77V3XRPS+6+cytqIqoXgFx2WWXzVVFypwuI6o44qDzrrvumm4Z5fvHY5xRmBJjSMVBa5z1LrqdVRddmmbnhx9+yMFaZbHMOBCPs9nNiTibYOU2x/U4uI8D6RBjIcXjjjPlVReVSHMTDNbU7rvvns98N2TIkCptiOcmqtViXKBycBDPYYwjVtkVV1xR4zaUw9YY36iyCK1inLAIZf/1r3/VqDInKoui6i3Gz6r8PMaYT9HNLIKcys93BHiV95fYJyPgmZGo1CuPYRWee+65fNa8OBtmiPXGmR6vvvrq3N2uusrriefjmWeeycuoPH1m1Xrzug+WRXfBOAvoKaeckp/fqKSanQiP4oyc1cV+G+F5BIARXsXy4vUc42DNKJSek9fjjJ7HWHY8jzGmV1lUfFV/3cTrLJ6Xa6+9doZdmstnSJ0TL774Yq4ajQozAKhMBRYAzIM48L7lllvyQMpRKRBj3MRYQXGgN3z48DzGTQx2PLeiEubvf/97PoCLQY7jIDUqiKLrV20vIw6ko1rrN7/5TTr88MNzKBWDS99zzz35oDUqLOJxxuDvcT2CpQi0YtygGMPmuuuuy8FBHGjGgNAxrlAcxMaAzVGZde+9986ynVGpEgf5cfAb7YyxnCJMi0BwTg7uY4DwYcOG5WqzaFMEJDFAeHTRKncNjFDomGOOyd0SY+D5zp0753AhgoF4jiJk/PWvf50WhKOPPjoHK7FfxEF6VOjE9i9X45S79MXzFs9JBFtRzRLPwX333TfdOELzIiqUYj+N/SGe88qi4m3XXXfNA6XH8xqVPBGQROgW80egVg6KZiW2b4xtFvtEbP8YtD6e09jW8ZijK11ZtCG6nUV3vyOOOCI/xtjXYp8qDyxfvftfDCQfg9ZHOBbbLfbrCJTLBg4cmOeJLm1xkoN4zLH+eB18/PHHOSALcZ94ncRjPvHEE/O+HQFeuVJuTszJPlgWwV20Nfa72I4zG5etsmhrnCgh5o9B1qOSK15jgwcPTp9++ml+/OWugFFBF6+9aEc87nhNxes5Bm+P5y/+PzfieYzB4+P1ExVY8V4X1VHRPbn6GFgRzkV3xhjwPdoQgWgExxFOxu3RPTgCsTkRJ0CIbsXGwAJgOnV9GkQAqM/++9//lo466qhS+/btS82aNSstuuiipa222qp02WWXlSZOnFgxX3zk9uzZc7r7r7zyyqUePXpUXB87dmzpsMMOKy211FKlRRZZpNSlS5fSO++8M918gwYNyst8/vnnp1vmnC4jfP3116Xjjz++tMIKK+T2t2vXLs/z1VdfVczzr3/9q9SxY8dSkyZN8jpj3WUvv/xyaZ999iktueSSpebNm+d17LvvvqVHHnmkYp6+ffvm+3355ZdV1h3riG2y5pprlhZeeOFSmzZtSptttlnptttum+12jzbGff73v/+VOnfuXGrVqlVp2WWXzeuaOnXqdPNfc801pY022qjUsmXL/Bytu+66pVNPPbX06aefVnkuunbtOtt1V2/DzMzoOf/iiy8qnpvY3tGOytuzLLZVt27d8uNafPHFS8ccc0zpjTfemG77z64NM3LRRRfl/eKHH36YbtqPP/5YGjBgQGmLLbYotW7dOj/nbdu2Lf3yl78s3XzzzaUpU6ZUzPvYY4/l9tx+++0zXM+QIUNKG2ywQd4vllhiiVL37t1LH3/88XTz/eMf/yitssoqeXt06tSp9MADD+THFc9H2ciRI/O6LrzwwlL//v1LK664Yl7uNttsU3r11VenW2bsF4ccckhue9OmTfP+HY/hjjvuqDLfa6+9Vtpuu+1KLVq0yPOcc845peuvvz6vK9ZZm/tg+O1vf5uXfcstt5TmROwv5513Xm7jcsstl5+P2B923HHH6R5Lef7Y52L7xOOOx7/TTjvl/X92z1t5G1ffH6+44opShw4d8vbeeOONS08++WRuT1wqmzx5cun8888vrb322nneaGe85s4666zS+PHjZ/teGN5+++08/eGHH56j7QNAw9Io/pk+1gIAKK6oYorqpRl1X2TW4qyMUUFzwQUX5Kqn+iDO6BdVf3HSgBigvb6K6rPrr78+V7W1atWqrptTOHFSh6j0iwpFFVgAVGcMLACABiS6KEb3uQiDauuslMxejPcW3TRjrCrh1fS+/vrr3C05ui0KrwCYEWNgAQA0MKeddlq+MP/FuF4xBlVUDEZIE+NtMb0YH0xFJQCzIsACAID5JM482L179zxo+6WXXpo6depkWwPAPDAGFgAAAACFZgwsAAAAAApNgAUAAABAoRkDaz6Ls/t8+umnadFFF3VGFQAAAKBBKpVK6dtvv03LL798atx47uupBFjzWYRXK6644vxeDQAAAEDhffTRR6ldu3ZzfT8B1nwWlVflJ6h169bze3UAAAAAhTNhwoRc4FPOSeaWAGs+a9SoUf4b4ZUACwAAAGjIGv3/c5K5ZRB3AAAAAApNgAUAAABAoQmwAAAAACg0Y2ABAAAADda0adPS5MmT67oZ9V7Tpk3TQgst1LACrE8++SSddtpp6d///nf64Ycf0qqrrpoGDRqUNt544zy9VCqlvn37pmuvvTaNGzcubbXVVunKK69Mq622WsUyvvnmm3TCCSeke++9NzVu3Dh169YtXXLJJWmRRRapmOe1115LPXv2TM8//3xaeuml8/ynnnpqlbbcfvvt6cwzz0yjRo3Kyz///PPT7rvvvgC3BgAAADA/RHA1cuTIHGJRc4sttlhq27btPA/UXq8CrLFjx+ZAaocddsgBVgRL7733Xlp88cUr5rngggvSpZdemgYPHpw6dOiQA6YuXbqkt956K7Vo0SLP07179/TZZ5+lhx56KP3000/psMMOS0cffXS65ZZbKk7f2Llz57Tzzjunq666Kr3++uvp8MMPzxs75gvDhw9PBxxwQDr33HPTL3/5y3zfvfbaK7300ktpnXXWqaMtBAAAANRUFMdEbhBVQyuuuGIufmHet2UUII0ZMyZfX2655VJta1SKtRRI796909NPP52eeuqpGU6P5i6//PLp97//ffrDH/6Qbxs/fnxadtll04033pj233//9Pbbb6eOHTvmyqpy1dawYcNy5dTHH3+c7x8VW3/605/S559/npo1a1ax7rvvvju98847+fp+++2Xvv/++3TfffdVrH/zzTdPnTp1yqHXnIigrE2bNrmNrVu3rvH2AQAAAGouil3ef//9nBHEcTs19/XXX+cQa/XVV5+uO2FN85HCxYv33HNPDp1+85vfpGWWWSZtsMEGuatgWZT2RegUlVNlsQE222yzNGLEiHw9/kYlVTm8CjF/pKnPPvtsxTzbbrttRXgVoorr3XffzVVg5Xkqr6c8T3k9AAAAQP00derU/LdyLkDNtGrVqiIcrG2FC7A++OCDivGsHnjggXTcccel3/3ud7m7YIjwKkTFVWVxvTwt/kb4VVmTJk3SEkssUWWeGS2j8jpmNk95+oxMmjQpp4qVLwAAAEAxzY/xmhqqRvNxWxZuDKwYOC0qp/7617/m61GB9cYbb+Quez169EhFF+NlnXXWWXXdDAAAAICfjcJVYMVAXzF+VWVrrbVWGj16dP5/jGYfvvjiiyrzxPXytPhbHjisbMqUKfnMhJXnmdEyKq9jZvOUp8/I6aefnvtzli8fffTRXG4BAAAAAApdgRVnIIxxqCr773//m1ZeeeX8/zjrYARIjzzySB5MPUQ3vRjbKrobhi222CKNGzcuvfjii2mjjTbKtz366KO5uivGyirPE4O4R7/Mpk2b5tvijIVrrLFGxRkPY55Yz0knnVTRlpgnbp+Z5s2b5wsAAABQ/7TvPXSBrm/UeV3n6X4jRoxIW2+9ddp1113T0KELts11oXAVWL169UrPPPNM7kIYZwO45ZZb0jXXXJN69uxZ0Z8yAqU///nPecD3119/PR1yyCH5rAF77bVXRcVWPIFHHXVUeu655/JZDY8//vh8hsKYLxx44IF5oLYjjjgivfnmm2nIkCHpkksuSSeffHJFW0488cR89sL+/fvnMxP269cvvfDCC3lZAAAAAHXl+uuvTyeccEJ68skn06effvqzfyIKF2Btsskm6a677kr//Oc/0zrrrJPOOeecNGDAgNS9e/eKeU499dT8JB199NF5/u+++y4HTS1atKiY5+abb05rrrlm2mmnndLuu++eU8kIwiqfufDBBx/MZzWMKq3f//73qU+fPnmZZVtuuWVFgLb++uunO+64I9199925XQAAAAB14bvvvsuFONETrWvXrunGG2+smPb444/n4p/oURZjjMeZASPfqN7bLU6g94tf/CIX90RvtL///e9VpscyrrvuurT33nvnZcTJ9qKQqK40KpVKpTpbewMQ3RsjLIvxsFq3bl3XzQEAAABSShMnTsxFLTFUUeWCmPrQhfCGG27IAdTzzz+f7rvvvtxT7b333suhUwRYO+ywQx5C6fzzz09LL710OvbYY9PUqVNzD7UQhUP77bdfLhjaeeed8zKiWCiGTYr7hlhWu3bt0gUXXJCLhy677LK83g8//DAtscQSc7VNayMfKVwFFgAAAACz7j540EEH5f/HEEoRCj3xxBNV5vnLX/6Stttuu3yivN69e6fhw4fngCn87W9/S4ceemj67W9/m1ZfffU8nNI+++yTb68s5jnggAPSqquumod6isqvGKqpLgiwAAAAAOqJd999N4dIESyFJk2a5GqqCLUqW2+99Sr+v9xyy+W/Y8aMyX/ffvvtfBK9yuJ63D6zZSy88MK5cqq8jNTQz0IIAABQdLXRxWhezzwGNGzXX399mjJlSsVJ6kKMDtW8efN0+eWXV9zWtGnTiv9Hd8Awbdq0uVpX5WWUlzO3y6gtKrAAAAAA6oEpU6akm266KfXv3z+98sorFZdXX301B1pxQrw5sdZaa1WMh1UW16O7YVGpwAIAAACoB+677740duzYdMQRR+QB0Svr1q1brs668MILZ7ucU045Je27775pgw02yIO433vvvenOO+9MDz/8cCoqFVgAAAAA9cD111+fA6fq4VU5wHrhhRfSa6+9Ntvl7LXXXumSSy7Jg7avvfba6eqrr06DBg1K22+/fSqqRqXoKMl8U9PTRAIAAMVjDCyo/+KMfCNHjkwdOnRILVq0qOvm/Oy36YQa5iMqsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACF1qSuGwAAAABQGP3aLOD1jZ+r2Q899NA0ePDgdMwxx6SrrrqqyrSePXumK664IvXo0SPdeOON6edEBRYAAABAPbLiiiumW2+9Nf34448Vt02cODHdcsstaaWVVko/RwIsAAAAgHpkww03zCHWnXfeWXFb/D/Cqw022KDitmnTpqVzzz03dejQIbVs2TKtv/766Y477kj1kQALAAAAoJ45/PDD06BBgyqu33DDDemwww6rMk+EVzfddFPuavjmm2+mXr16pYMOOig98cQTqb4xBhYAAABAPXPQQQel008/PX344Yf5+tNPP527FT7++OP5+qRJk9Jf//rX9PDDD6ctttgi37bKKquk//znP+nqq69O2223XapPBFgAAAAA9czSSy+dunbtmgdrL5VK+f9LLbVUxfT3338//fDDD2mXXXapcr/JkydX6WZYXwiwAAAAAOppN8Ljjz8+/3/gwIFVpn333Xf579ChQ9MKK6xQZVrz5s1TfSPAAgAAAKiHdt1111xR1ahRo9SlS5cq0zp27JiDqtGjR9e77oIzIsACAAAAqIcWWmih9Pbbb1f8v7JFF100/eEPf8gDt8fZCLfeeus0fvz4PFZW69atU48ePVJ9IsACAAAAqKdat24902nnnHNOHisrzkb4wQcfpMUWWyxtuOGG6Y9//GOqbxqVYqQv5psJEyakNm3a5JRzVjsVAABQf7TvPbTGyxh1XtdaaQswbyZOnJhGjhyZOnTokFq0aGEzzudtWtN8pHFtNBAAAAAA5hcBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAAANVqlUqusm/GxMmzZtvi27yXxbMgAAAEBBNW3aNDVq1Ch9+eWXaemll87/Z95DwMmTJ+dt2bhx49SsWbNU2wRYAAAAQIOz0EILpXbt2qWPP/44jRo1qq6b87PQqlWrtNJKK+UQq7YJsAAAAIAGaZFFFkmrrbZa+umnn+q6KT+LQLBJkybzrZJNgAUAAAA06OAlLhSbQdwBAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAotMIFWP369UuNGjWqcllzzTUrpk+cODH17NkzLbnkkmmRRRZJ3bp1S1988UWVZYwePTp17do1tWrVKi2zzDLplFNOSVOmTKkyz+OPP5423HDD1Lx587TqqqumG2+8cbq2DBw4MLVv3z61aNEibbbZZum5556bj48cAAAAgHoRYIW11147ffbZZxWX//znPxXTevXqle699950++23pyeeeCJ9+umnaZ999qmYPnXq1BxeTZ48OQ0fPjwNHjw4h1N9+vSpmGfkyJF5nh122CG98sor6aSTTkpHHnlkeuCBByrmGTJkSDr55JNT375900svvZTWX3/91KVLlzRmzJgFuCUAAAAAaFQqlUpFq8C6++67c7BU3fjx49PSSy+dbrnllvTrX/863/bOO++ktdZaK40YMSJtvvnm6d///nf65S9/mYOtZZddNs9z1VVXpdNOOy19+eWXqVmzZvn/Q4cOTW+88UbFsvfff/80bty4NGzYsHw9Kq422WSTdPnll+fr06ZNSyuuuGI64YQTUu/evef48UyYMCG1adMmt71169Y13j4AAEDda997aI2XMeq8rrXSFoD6oKb5SCErsN577720/PLLp1VWWSV17949dwkML774Yvrpp5/SzjvvXDFvdC9caaWVcoAV4u+6665bEV6FqJyKDfXmm29WzFN5GeV5ysuI6q1YV+V5GjdunK+X55mZSZMm5XVVvgAAAAAw7woXYEXlU3T5i0qoK6+8Mnf322abbdK3336bPv/881xBtdhii1W5T4RVMS3E38rhVXl6edqs5omw6ccff0xfffVV7oo4o3nKy5iZc889NyeK5UtUbQEAAAAw75qkgtltt90q/r/eeuvlQGvllVdOt912W2rZsmUqutNPPz2PnVUWoZgQCwAAAOBnVIFVXVRbrb766un9999Pbdu2zd37YqyqyuIshDEtxN/qZyUsX5/dPNEHM0KypZZaKi200EIznKe8jJmJsxrGcipfAAAAAPgZB1jfffdd+t///peWW265tNFGG6WmTZumRx55pGL6u+++m8fI2mKLLfL1+Pv6669XOVvgQw89lIOkjh07VsxTeRnlecrLiG6Ksa7K88Qg7nG9PA8AAAAADTTA+sMf/pCeeOKJNGrUqDR8+PC0995752qoAw44II8pdcQRR+Queo899lgeaP2www7LoVKcgTB07tw5B1UHH3xwevXVV9MDDzyQzjjjjNSzZ89cHRWOPfbY9MEHH6RTTz01n8XwiiuuyF0Ue/XqVdGOWMe1116bBg8enN5+++103HHHpe+//z6vDwAAAIAGPAbWxx9/nMOqr7/+Oi299NJp6623Ts8880z+f7j44ovzGQG7deuWz/gXZw+MAKoswq777rsvB04RbC288MKpR48e6eyzz66Yp0OHDmno0KE5sLrkkktSu3bt0nXXXZeXVbbffvulL7/8MvXp0ycP3N6pU6c8sHz1gd0BAAAAmL8alUql0nxeR4MWg7hH5dj48eONhwUAAD8T7XsPrfEyRp3XtVbaAtAQ8pHCdSEEAAAAgMoEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUWpO6bgAAAADzR/veQ2u8jFHnda2VtgDUhAosAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhVb4AOu8885LjRo1SieddFLFbRMnTkw9e/ZMSy65ZFpkkUVSt27d0hdffFHlfqNHj05du3ZNrVq1Sssss0w65ZRT0pQpU6rM8/jjj6cNN9wwNW/ePK266qrpxhtvnG79AwcOTO3bt08tWrRIm222WXruuefm46MFAAAAoF4FWM8//3y6+uqr03rrrVfl9l69eqV777033X777emJJ55In376adpnn30qpk+dOjWHV5MnT07Dhw9PgwcPzuFUnz59KuYZOXJknmeHHXZIr7zySg7IjjzyyPTAAw9UzDNkyJB08sknp759+6aXXnoprb/++qlLly5pzJgxC2gLAAAAAFDYAOu7775L3bt3T9dee21afPHFK24fP358uv7669NFF12Udtxxx7TRRhulQYMG5aDqmWeeyfM8+OCD6a233kr/+Mc/UqdOndJuu+2WzjnnnFxNFaFWuOqqq1KHDh1S//7901prrZWOP/749Otf/zpdfPHFFeuKdRx11FHpsMMOSx07dsz3iYquG264oQ62CAAAAEDDVNgAK7oIRoXUzjvvXOX2F198Mf30009Vbl9zzTXTSiutlEaMGJGvx9911103LbvsshXzROXUhAkT0ptvvlkxT/VlxzzlZUTQFeuqPE/jxo3z9fI8MzJp0qS8nsoXAAAAAOZdk1RAt956a+6yF10Iq/v8889Ts2bN0mKLLVbl9girYlp5nsrhVXl6edqs5onA6ccff0xjx47NXRFnNM8777wz07afe+656ayzzprrxwwAAABAPanA+uijj9KJJ56Ybr755jxwen1z+umn526O5Us8HgAAAAB+RhVY0W0vBkmPswOWRSXUk08+mS6//PI8yHp07xs3blyVKqw4C2Hbtm3z/+Nv9bMFls9SWHme6mcujOutW7dOLVu2TAsttFC+zGie8jJmJM5oGBcAgCJr33tojZcx6ryutdIWAIB6V4G10047pddffz2fGbB82XjjjfOA7uX/N23aND3yyCMV93n33XfT6NGj0xZbbJGvx99YRuWzBT700EM5nIrB2MvzVF5GeZ7yMqKbYgwQX3meadOm5evleQAAAABogBVYiy66aFpnnXWq3LbwwgunJZdcsuL2I444Ip188slpiSWWyKHUCSeckEOlzTffPE/v3LlzDqoOPvjgdMEFF+Txrs4444w8MHy5OurYY4/NFV2nnnpqOvzww9Ojjz6abrvttjR06P/7NTLW0aNHjxyabbrppmnAgAHp+++/z2clBACAMhVtANDAAqw5cfHFF+czAnbr1i2f9S/OHnjFFVdUTI+uf/fdd1867rjjcrAVAVgEUWeffXbFPB06dMhhVa9evdIll1yS2rVrl6677rq8rLL99tsvffnll6lPnz45BOvUqVMaNmzYdAO7AwAAANDAA6zHH3+8yvUY3H3gwIH5MjMrr7xyuv/++2e53O233z69/PLLs5zn+OOPzxcAAAAA6kbhxsACAAAAgMoEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQmtR1AwAAYGba9x5a440z6ryuNjAA1HMCLAAA4GcVXAotAX5+dCEEAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAwwywJkyYkO6+++709ttvz69VAAAAANAA1FqAte+++6bLL788///HH39MG2+8cb5tvfXWS//3f/9XW6sBAAAAoIGptQDrySefTNtss03+/1133ZVKpVIaN25cuvTSS9Of//zn2loNAAAAAA1MrQVY48ePT0sssUT+/7Bhw1K3bt1Sq1atUteuXdN7771XW6sBAAAAoIGptQBrxRVXTCNGjEjff/99DrA6d+6cbx87dmxq0aJFba0GAAAAgAamSW0t6KSTTkrdu3dPiyyySFp55ZXT9ttvX9G1cN11162t1QAAAADQwNRagPXb3/42bbbZZmn06NFpl112SY0b/3/FXaussooxsAAAAACo2y6EP/30U/rFL36Rx7zae++9cxVWWYyBtdVWW9XGagAAAABogGolwGratGmaOHFibSwKAAAAAObPIO49e/ZM559/fpoyZUptLRIAAAAAam8MrOeffz498sgj6cEHH8yDti+88MJVpt955502NwAAAAB1F2AttthiqVu3brW1OAAAAACo3QBr0KBBtbUoAAAAAKj9MbBCjH/18MMPp6uvvjp9++23+bZPP/00fffdd7W5GgAAAAAakFqrwPrwww/TrrvumkaPHp0mTZqUdtlll7Tooovmgd3j+lVXXVVbqwIAAACgAam1CqwTTzwxbbzxxmns2LGpZcuWFbfvvffeeXB3AAAAAKjTCqynnnoqDR8+PDVr1qzK7e3bt0+ffPJJba0GAAAAgAam1gKsadOmpalTp053+8cff5y7EgIAAHWrfe+hNbr/qPO61lpbAKBOAqzOnTunAQMGpGuuuSZfb9SoUR68vW/fvmn33XevrdUAAPysA4IgJAAAmE8BVv/+/VOXLl1Sx44d08SJE9OBBx6Y3nvvvbTUUkulf/7zn7W1GgAAAAAamFoLsNq1a5deffXVNGTIkPw3qq+OOOKI1L179yqDugMAAABAnQRYTz75ZNpyyy1zYBWXsilTpuRp2267bW2tCgAAAIAGpHFtLWiHHXZI33zzzXS3jx8/Pk8DAAAAgDoNsEqlUh64vbqvv/46LbzwwrW1GgAAAAAamBp3Idxnn33y3wivDj300NS8efOKaVOnTk2vvfZa7loIAAAAAHUSYLVp06aiAmvRRRetMmB7s2bN0uabb56OOuqomq4GAAAAgAaqxgHWoEGD8t/27dunU045JbVq1ao22gUAAAAAtTsG1iGHHJI++eST6W5/77330qhRo2prNQAAAAA0MLUWYMX4V8OHD5/u9meffTZPAwAAAIA6DbBefvnltNVWW013e4yB9corr9TWagAAAABoYGotwIqzEH777bfT3T5+/Ph8NkIAAAAAqNMAa9ttt03nnntulbAq/h+3bb311rW1GgAAAAAamBqfhbDs/PPPzyHWGmuskbbZZpt821NPPZUmTJiQHn300dpaDQAAAAANTK1VYHXs2DG99tprad99901jxozJ3QnjzITvvPNOWmeddWprNQAAAAA0MLVWgRWWX3759Ne//rU2FwkAAPDz1K9NLSxjfG20BKBhBVjhhx9+SKNHj06TJ0+ucvt6661X26sCAAAAoAGotQDryy+/TIcddlj697//PcPpzkQIAAAAQJ2OgXXSSSelcePGpWeffTa1bNkyDRs2LA0ePDitttpq6Z577pnj5Vx55ZW5Wqt169b5ssUWW1QJxSZOnJh69uyZllxyybTIIoukbt26pS+++KLKMqICrGvXrqlVq1ZpmWWWSaecckqaMmVKlXkef/zxtOGGG6bmzZunVVddNd14443TtWXgwIGpffv2qUWLFmmzzTZLzz333DxtGwAAYAF3zavpBYCfZwVWnGnwX//6V9p4441T48aN08orr5x22WWXHEKde+65OVCaE+3atUvnnXdeDr5KpVIOwfbcc8/08ssvp7XXXjv16tUrDR06NN1+++2pTZs26fjjj0/77LNPevrppysqvWJdbdu2TcOHD0+fffZZHky+adOmFeNzjRw5Ms9z7LHHpptvvjk98sgj6cgjj0zLLbdc6tKlS55nyJAh6eSTT05XXXVVDq8GDBiQp7377rs5FAMAoJ6oaRhhjCEA+PkEWN9//31FsLP44ovnLoWrr756WnfdddNLL700x8v51a9+VeX6X/7yl1yV9cwzz+Rw6/rrr0+33HJL2nHHHfP0QYMGpbXWWitP33zzzdODDz6Y3nrrrfTwww+nZZddNnXq1Cmdc8456bTTTkv9+vVLzZo1y6FUhw4dUv/+/fMy4v7/+c9/0sUXX1wRYF100UXpqKOOyt0iQ9wngrMbbrgh9e7du7Y2GwDUufa9h9Z4GaPOm7MfqgAAoE67EK6xxhq5Oimsv/766eqrr06ffPJJDn6ismleRDXVrbfemsOx6Er44osvpp9++intvPPOFfOsueaaaaWVVkojRozI1+NvhGYRXpVFKDVhwoT05ptvVsxTeRnlecrLiAHoY12V54mqsrhengcAAACAelaBdeKJJ+bueqFv375p1113zd3zouJpRuNLzcrrr7+eA6sY7yrGubrrrrtSx44d0yuvvJKXt9hii1WZP8Kqzz//PP8//lYOr8rTy9NmNU+EXD/++GMaO3ZsDs9mNM8777wzy7ZPmjQpX8pimQAAAAAUIMA66KCDKv6/0UYbpQ8//DCHPVEdtdRSS811NVeEVePHj0933HFH6tGjR3riiSdSfRDjfZ111ll13QwAAACAn41a6UIY3fp+8YtfpLfffrvitjgDYJzlb27DqxBVVnFmwAjCIhCKLomXXHJJHpg9uvfF2Q4ri7MQxrQQf6uflbB8fXbzxIDzcQbFaPNCCy00w3nKy5iZ008/PQdv5ctHH300148fAAAAgFoOsOIMf9Hdb36ZNm1a7pYXgVasK84aWBbjbo0ePTp3OQzxN7ogjhkzpmKehx56KIdT0Q2xPE/lZZTnKS8jArRYV+V5og1xvTzPzDRv3jyvq/IFAAAAgAIM4t6zZ890/vnnpylTptRoOVHB9OSTT6ZRo0blICquP/7446l79+6pTZs26Ygjjkgnn3xyeuyxx/JA63GWwAiV4gyEoXPnzjmoOvjgg9Orr76aHnjggXTGGWfk9kW4FI499tj0wQcfpFNPPTV3c7ziiivSbbfdlnr16lXRjljHtddemwYPHpwry4477rg8mHz5rIQAAAAA1LMxsJ5//vlcofTggw/mswAuvPDCVabfeeedc7ScqJw65JBD8oDwEVitt956OYTaZZdd8vSLL744nxGwW7duuSorzh4YAVRZdP277777cuAUwVa0I8bQOvvssyvm6dChQxo6dGgOrKJrYrt27dJ1112Xl1W23377pS+//DL16dMnD/reqVOnNGzYsOkGdgcAAACgngRYcWbACJVq6vrrr5/l9BYtWqSBAwfmy8ysvPLK6f7775/lcrbffvv08ssvz3Ke448/Pl8AAJiBfm1qvln6jbdpAYAFF2ANGjSothYFAABAUQirgZ9TgAUAMD+17z20xssYdV7XWmkLAAD1OMC644478mDocVbAyZMnV5n20ksv1eaqAACABU0lDgD1/SyEl156aT5DXwxyHmNLbbrppmnJJZfMZ/vbbbfdams1AAAAADQwtRZgxZkAr7nmmnTZZZelZs2apVNPPTU99NBD6Xe/+10aP97gnAAAAADUcRfC6Da45ZZb5v+3bNkyffvtt/n/Bx98cNp8883T5ZdfXlurAgCAn5+ads9zRkcAfsZqrQKrbdu26Ztvvsn/X2mlldIzzzyT/z9y5MhUKpVqazUAAAAANDC1FmDtuOOO6Z577sn/j7GwevXqlXbZZZe03377pb333ru2VgMAAABAA1NrXQhj/Ktp06bl//fs2TMP4D58+PC0xx57pGOOOaa2VgMAAABAA1NrAVbjxo3zpWz//ffPFwAAAAAoRIAVxo0bl5577rk0ZsyYimqsskMOOaQ2VwUAAABAA1FrAda9996bunfvnr777rvUunXr1KhRo4pp8X8BFgAAAAB1Ooj773//+3T44YfnACsqscaOHVtxKZ+dEAAAAADqLMD65JNP0u9+97vUqlWr2lokAAAAANRegNWlS5f0wgsv2KQAAAAAFGcMrHvuuafi/127dk2nnHJKeuutt9K6666bmjZtWmXePfbYoyarAgAAAKCBqlGAtddee01329lnnz3dbTGI+9SpU2uyKgAAAAAaqBoFWNOmTau9lgAAAADA/BgD69FHH00dO3ZMEyZMmG7a+PHj09prr52eeuqpmq4GAAAAgAaqxgHWgAED0lFHHZVat2493bQ2bdqkY445Jl100UU1XQ0AAAAADVSNA6xXX3017brrrjOd3rlz5/Tiiy/WdDUAAAAANFA1DrC++OKL6c44WFmTJk3Sl19+WdPVAAAAANBA1TjAWmGFFdIbb7wx0+mvvfZaWm655Wq6GgAAAAAaqBoHWLvvvns688wz08SJE6eb9uOPP6a+ffumX/7ylzVdDQAAAAANVJOaLuCMM85Id955Z1p99dXT8ccfn9ZYY418+zvvvJMGDhyYpk6dmv70pz/VRlsBAAAAaIBqHGAtu+yyafjw4em4445Lp59+eiqVSvn2Ro0apS5duuQQK+YBAAAAgDoJsMLKK6+c7r///jR27Nj0/vvv5xBrtdVWS4svvnhtLB4AAACABqxWAqyyCKw22WST2lwkAAAAAA1cjQdxBwAAAID5SYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQmtS1w0AAKCafm1qvkn6jbdZAYCfDRVYAAAAABSaAAsAAACAQtOFEADmo/a9h9bo/qPO61prbQEAgPpKBRYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoTeq6AQAAC0y/NrWwjPG10RIAAOaCCiwAAAAACk2ABQAAAEChFS7AOvfcc9Mmm2ySFl100bTMMsukvfbaK7377rtV5pk4cWLq2bNnWnLJJdMiiyySunXrlr744osq84wePTp17do1tWrVKi/nlFNOSVOmTKkyz+OPP5423HDD1Lx587TqqqumG2+8cbr2DBw4MLVv3z61aNEibbbZZum5556bT48cAAAAgHoRYD3xxBM5nHrmmWfSQw89lH766afUuXPn9P3331fM06tXr3Tvvfem22+/Pc//6aefpn322adi+tSpU3N4NXny5DR8+PA0ePDgHE716dOnYp6RI0fmeXbYYYf0yiuvpJNOOikdeeSR6YEHHqiYZ8iQIenkk09Offv2TS+99FJaf/31U5cuXdKYMWMW4BYBAAAAaNgKN4j7sGHDqlyP4CkqqF588cW07bbbpvHjx6frr78+3XLLLWnHHXfM8wwaNCittdZaOfTafPPN04MPPpjeeuut9PDDD6dll102derUKZ1zzjnptNNOS/369UvNmjVLV111VerQoUPq379/Xkbc/z//+U+6+OKLc0gVLrroonTUUUelww47LF+P+wwdOjTdcMMNqXfv3gt82wAAAAA0RIWrwKouAquwxBJL5L8RZEVV1s4771wxz5prrplWWmmlNGLEiHw9/q677ro5vCqLUGrChAnpzTffrJin8jLK85SXEdVbsa7K8zRu3DhfL88zI5MmTcrrqXwBAAAA4GcaYE2bNi137dtqq63SOuusk2/7/PPPcwXVYostVmXeCKtiWnmeyuFVeXp52qzmicDpxx9/TF999VXuijijecrLmNkYXm3atKm4rLjiijXaBgAAAAANXaEDrBgL64033ki33nprqi9OP/30XDVWvnz00Ud13SQAAACAeq1wY2CVHX/88em+++5LTz75ZGrXrl3F7W3bts3d+8aNG1elCivOQhjTyvNUP1tg+SyFleepfubCuN66devUsmXLtNBCC+XLjOYpL2NG4oyGcQEAAADgZxpglUqldMIJJ6S77rorPf7443mg9co22mij1LRp0/TII4+kbt265dvefffdNHr06LTFFlvk6/H3L3/5Sz5bYAwAH+KMhhFOdezYsWKe+++/v8qyY57yMqKbYqwr1rPXXntVdGmM6xGuAQAAUDva9x5a42WMOq9rrbQFKKYmRew2GGcY/Ne//pUWXXTRivGmYjypqIyKv0cccUQ6+eST88DuEUpF4BXBU5yBMHTu3DkHVQcffHC64IIL8jLOOOOMvOxyddSxxx6bLr/88nTqqaemww8/PD366KPptttuy2cZLIt19OjRI2288cZp0003TQMGDEjff/99xVkJAQAAAGiAAdaVV16Z/26//fZVbh80aFA69NBD8/8vvvjifEbAqMCKs/7F2QOvuOKKinmj6190PzzuuONysLXwwgvnIOrss8+umCcquyKs6tWrV7rkkktyN8XrrrsuL6tsv/32S19++WXq06dPDsE6deqUhg0bNt3A7gAAAAA0sC6Es9OiRYs0cODAfJmZlVdeebougtVFSPbyyy/Pcp7oLqjLIAAAAEDdKfRZCAEAAABAgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKTYAFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABRak7puAAAAANQH7XsPrfEyRp3XtVbaAg2NAAsAqLl+bWphGeM9EwAAzJAuhAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACi0JnXdAAAAAICiat97aI3uP+q8rrXWloZMBRYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBCE2ABAAAAUGgCLAAAAAAKrUldNwAAAABoeNr3HlrjZYw6r2uttIXiU4EFAAAAQKEJsAAAAAAoNAEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoTWp6wYAAAAAtad976E1Xsao87rWSlugtqjAAgAAAKDQVGABAAAA9VO/NjW8//jaagnzmQALAACA+q+mQUZehjADikoXQgAAAAAKTYAFAAAAQKHpQggAAAALiq6OME8EWAA0yNNDOzU0AADUH4XsQvjkk0+mX/3qV2n55ZdPjRo1SnfffXeV6aVSKfXp0yctt9xyqWXLlmnnnXdO7733XpV5vvnmm9S9e/fUunXrtNhii6Ujjjgifffdd1Xmee2119I222yTWrRokVZcccV0wQUXTNeW22+/Pa255pp5nnXXXTfdf//98+lRAwAAAFBvKrC+//77tP7666fDDz887bPPPtNNj6Dp0ksvTYMHD04dOnRIZ555ZurSpUt66623ctAUIrz67LPP0kMPPZR++umndNhhh6Wjjz463XLLLXn6hAkTUufOnXP4ddVVV6XXX389ry/CrpgvDB8+PB1wwAHp3HPPTb/85S/zfffaa6/00ksvpXXWWWcBbxUAAACoJ10dndGRhhBg7bbbbvkyI1F9NWDAgHTGGWekPffcM9920003pWWXXTZXau2///7p7bffTsOGDUvPP/982njjjfM8l112Wdp9993T3/72t1zZdfPNN6fJkyenG264ITVr1iytvfba6ZVXXkkXXXRRRYB1ySWXpF133TWdcsop+fo555yTA7HLL788h14AAAAANNAuhLMycuTI9Pnnn+fKqbI2bdqkzTbbLI0YMSJfj79RSVUOr0LM37hx4/Tss89WzLPtttvm8KosqrjefffdNHbs2Ip5Kq+nPE95PTMyadKkXN1V+QIAAABAAwqwIrwKUXFVWVwvT4u/yyyzTJXpTZo0SUsssUSVeWa0jMrrmNk85ekzEt0NI1ArX2JsLQAAAAB+Zl0I67PTTz89nXzyyRXXowLr5xBi1fRsX2FUiwNr3hD9qAEAAKDBqXcVWG3bts1/v/jiiyq3x/XytPg7ZsyYKtOnTJmSz0xYeZ4ZLaPyOmY2T3n6jDRv3jyf+bDyBQAAAIAGFGDFWQcjQHrkkUeqVDnF2FZbbLFFvh5/x40bl1588cWKeR599NE0bdq0PFZWeZ4nn3wyn6GwLAZoX2ONNdLiiy9eMU/l9ZTnKa8HAAAAgAYaYH333Xf5jIBxKQ/cHv8fPXp0atSoUTrppJPSn//853TPPfek119/PR1yyCH5zIJ77bVXnn+ttdbKZw886qij0nPPPZeefvrpdPzxx+czFMZ84cADD8wDuB9xxBHpzTffTEOGDMlnHazc/e/EE0/MZzPs379/euedd1K/fv3SCy+8kJcFAAAAQAMeAytCoh122KHiejlU6tGjR7rxxhvTqaeemr7//vt09NFH50qrrbfeOgdNLVq0qLjPzTffnIOmnXbaKZ99sFu3bunSSy+tmB4DrD/44IOpZ8+eaaONNkpLLbVU6tOnT15m2ZZbbpluueWWdMYZZ6Q//vGPabXVVkt33313WmeddRbYtgAAAABo6AoZYG2//fapVCrNdHpUYZ199tn5MjNxxsEIn2ZlvfXWS0899dQs5/nNb36TLwAAAADUjUJ2IQQAAACAMgEWAAAAAIUmwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACq1JXTcAAAAA4GerX5taWMb41NCpwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChNanrBkDhOMUpAAAAFIoKLAAAAAAKTYAFAAAAQKHpQggARaZbMwAAqMACAAAAoNh0IQQAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACF1qSuGwC1qX3voTVexqgWtdIUAAAAoJaowAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKLQmdd0AAIqlfe+hNV7GqPO61kpbAAAAggosAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhWYQd4AFxODoAAAA80YFFgAAAACFpgILqPdUNjFP+rWp+YbrN97GBwCABUAFFgAAAACFpgIL6kB9qRiqL+0EAADg502ABfWV7k8AAAA0EAIsYP4StDVMNX3ejS0FAABUYgwsAAAAAApNgAUAAABAoelCCFCf6JoHAAA0QCqwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJpB3OfAwIED04UXXpg+//zztP7666fLLrssbbrppvP/2QEWHIOjAwAAFJYKrNkYMmRIOvnkk1Pfvn3TSy+9lAOsLl26pDFjxiyYZwgAAACggRNgzcZFF12UjjrqqHTYYYeljh07pquuuiq1atUq3XDDDQvmGQIAAABo4ARYszB58uT04osvpp133vn/bbDGjfP1ESNGLIjnBwAAAKDBMwbWLHz11Vdp6tSpadlll61ye1x/5513ZnifSZMm5UvZ+PHj898JEybU651t2qQfaryMCY1KNW/IbLajdtqedbZ/zsFrvBD7p3bW3rZcQNvTe2ftbUvbsyrbc252HO/xC/I1FLx31t729FqfS7bn/9sUvnfWq/ek+qCci5RK87Y9GpXm9Z4NwKeffppWWGGFNHz48LTFFltU3H7qqaemJ554Ij377LPT3adfv37prLPOWsAtBQAAACi+jz76KLVr126u76cCaxaWWmqptNBCC6Uvvviiyu1xvW3btjO8z+mnn54HfS+bNm1a+uabb9KSSy6ZGjVqlH6uIkldccUV847YunXrVFTaaVsWlX3T9vTe6XVUJN6TbE/vSV5HRVMf3pfqQxuDdjbM7VkEUT/17bffpuWXX36e7i/AmoVmzZqljTbaKD3yyCNpr732qgik4vrxxx8/w/s0b948XypbbLHFUkMRL9j68KLVTtuyqOybtmeR2T8b3vasD20M2ml7Fpn9s+Ftz/rQxqCdDXN71rU2bdrM830FWLMR1VQ9evRIG2+8cdp0003TgAED0vfff5/PSggAAADA/CfAmo399tsvffnll6lPnz7p888/T506dUrDhg2bbmB3AAAAAOYPAdYciO6CM+syyP8nuk327dt3uu6TRaOdtmVR2TdtzyKzfza87Vkf2hi00/YsMvtnw9ue9aGNQTsb5vb8OXAWQgAAAAAKrXFdNwAAAAAAZkWABQAAAEChCbAAAAAAKDQBFjU2cODA1L59+9SiRYu02Wabpeeee65wW/XJJ59Mv/rVr9Lyyy+fGjVqlO6+++5UNOeee27aZJNN0qKLLpqWWWaZtNdee6V33303Fc2VV16Z1ltvvdS6det82WKLLdK///3vVHTnnXdefu5POumkVCT9+vXL7ap8WXPNNVMRffLJJ+mggw5KSy65ZGrZsmVad9110wsvvJCKJN6Lqm/PuPTs2TMVxdSpU9OZZ56ZOnTokLfjL37xi3TOOeekUqmUiubbb7/Nr5mVV145t3XLLbdMzz//fKHfz2M7xpmDl1tuudzmnXfeOb333nuFa+edd96ZOnfunF9PMf2VV15Z4G2cXTt/+umndNppp+XX+sILL5znOeSQQ9Knn35aqHaW30vjvTPaufjii+fn/dlnny1cOys79thj8zwDBgxIRWvnoYceOt376K677lq4doa333477bHHHqlNmzb5+Y/vUqNHjy5UO2f0uRSXCy+8sDBt/O677/JJq9q1a5ffOzt27JiuuuqqBda+OW3nF198kffPmN6qVau8X9bFe/ycfG+fOHFi/v4R7/OLLLJI6tatW25/kdp4zTXXpO233z5/p4/tPW7cuAXWvjlt5zfffJNOOOGEtMYaa+R9c6WVVkq/+93v0vjx4wvVznDMMcfk73XRzqWXXjrtueee6Z133lmg7fy5E2BRI0OGDEknn3xyPuvCSy+9lNZff/3UpUuXNGbMmEJt2e+//z63LcK2onriiSfyh9wzzzyTHnrooXzgEAc30fYiiS82EQa9+OKLObzYcccd85vzm2++mYoqDrivvvrqHLwV0dprr50+++yzist//vOfVDRjx45NW221VWratGkOLN96663Uv3//fKBYtOe68raM11L4zW9+k4ri/PPPz0Hw5Zdfng+84voFF1yQLrvsslQ0Rx55ZN6Gf//739Prr7+e35MiGIgws6jv57EtL7300nzgFQFGHNDG51IcSBSpnTF96623zs9/XZpVO3/44Yf82R6Ba/yN0C2+rEdYUKR2htVXXz2/pmI/jffQCLNjf/3yyy8L1c6yu+66K3/ex0F4XZiTdkYwUPn99J///GcqWjv/97//5ddRhJePP/54eu211/L+Gj+qFqmdlbdjXG644YYcFkSgUZQ2xvf5YcOGpX/84x/5syl+vIhA65577llgbZxdO+MHiggNPvjgg/Svf/0rvfzyy/kHlvhcWtDfl+fke3uvXr3Svffem26//fY8f4T/++yzT6HaGO/z8Vr/4x//uMDaNbftjO0Wl7/97W/pjTfeSDfeeGPeV4844ohCtTNstNFGadCgQfk19MADD+R9NuaJHy+pJSWogU033bTUs2fPiutTp04tLb/88qVzzz23sNs1dvu77rqrVHRjxozJbX3iiSdKRbf44ouXrrvuulIRffvtt6XVVlut9NBDD5W222670oknnlgqkr59+5bWX3/9UtGddtpppa233rpU38Tz/Ytf/KI0bdq0UlF07dq1dPjhh1e5bZ999il17969VCQ//PBDaaGFFirdd999VW7fcMMNS3/6059KRXw/j+e5bdu2pQsvvLDitnHjxpWaN29e+uc//1nIz52RI0fm6S+//HKpPnw+Pvfcc3m+Dz/8sFTkdo4fPz7P9/DDD5eK1s6PP/64tMIKK5TeeOON0sorr1y6+OKLS3VpRu3s0aNHac899ywVyYzaud9++5UOOuigUpHMyf4Z23bHHXcsFamNa6+9dunss88u1Pt99Xa+++67+bZ47VQ+9lh66aVL1157balI39vjs6dp06al22+/vWKet99+O88zYsSIQrSxssceeyxPGzt2bKk+HAPddtttpWbNmpV++umnUpHb+eqrr+Z53n///QXatp8zFVjMs8mTJ+cqnPjVo6xx48b5+ogRI2zZGiqXxS6xxBKF3Zbxa8Ktt96af3mIroRFFL+UdO3atcp+WjRR+h6/wq+yyiqpe/fuC7zrw5yIX2A33njjXMkUZdMbbLBBuvbaa1PR36Pil+TDDz88/9JdFNEN75FHHkn//e9/8/VXX301V4zstttuqUimTJmSX+PVKxmiLL6IVYJh5MiR6fPPP6/yeo9uRdG93edS7X02xetpscUWS0V+7Ue3mHjuo5KjSKZNm5YOPvjgdMopp+Tq2yKLiqZ4v49uO8cdd1z6+uuvU9G25dChQ3P1XVRZRlvjtV7EYSIqiy5k0e4FXT0yJ59N8VkfFbaRHT322GP5cyqqR4pi0qRJ+W/lz6U49mjevHmdfy5V/94ex0hRoVP58ygqBaP7W119HtWHY4s5bWfME90emzRpsgBbNn0bZtXOOD6KaqwYMmLFFVdcwK37+RJgMc+++uqrfHCz7LLLVrk9rscBBDX7Uhal29Fla5111incpowuGtGXP74wxBge0RUixkoomgjXottL9FkvqviyXS6Fjm5lcQC+zTbb5LGHiiTK9aN9q622Wi6JjoOZGH9g8ODBqajiICbGcoixMoqkd+/eaf/9989fZKNLZoSB8XqP8LJIYoyHCKZjfK4o3Y/3+wgE44t3dIEpovJnj8+l+SO6YcaYWAcccEA+cCia++67L382xcHtxRdfnLt4LLXUUqlIostoHHDF+2eRRZeim266KYft0eboOhMhe5G6wcRwFTFuUwxrEO198MEH09577527aEV7iyo+N+P9dUF2JZsT0Y09vsvFUBHNmjXL2zS68W277bapKMoB0Omnn56HNoiwOvbPjz/+uE4/l2b0vT0+j2I7Vg/76+o4qejHFnPTzjgGje8mRx99dCpiO6+44or8WRSXGHYjPotiX6B21F1kCcyyaij6eNf1r0kzE7/GxoDD8cvDHXfckXr06JG/LBYpxProo4/SiSeemD80FvRYGHOjctVNjNEVgVaM53DbbbcV6tfZ+KCOCqy//vWv+XqELrGPxjhD8fwX0fXXX5+3b12NMTMz8dzefPPN6ZZbbskVGPFaii9B0c6ibcsY+yoq2FZYYYW00EILpQ033DCHF/HLMg1LVBLsu+++uTIjwuwi2mGHHfLrKQ5uokI02hvjoEVlThHE6+aSSy7JP6wUqSp0RiJkL4tB/OPzKQYmjqqsnXbaKRXlcynEOJwx1lDo1KlTGj58eP5s2m677VIRxfhX8YNF0b6bRIAVY/tEFVZ8D4nB1OP7aHw2FaWKPX70ibH44vtRVL3E51K0LT7r6/JEKEX/3l5f2jgn7ZwwYULuWRHHHHHyjiK2M17fu+yySw5VY9yu+Cx6+umnC/ear69UYDHP4lfN+OCofjaNuN62bVtbdh7FgJnxK3KUbsevYEUUvyKsuuqqeaDCqG6KLhrxpbxI4kAhfp2NA+74tTsuEbLF4M7x/yL9ilxZ/FIX3SHef//9VCRxRrfqAeVaa61VyO6O4cMPP0wPP/xwHoS8aKLrULkKKw4MoztRHHwVsVIwDljjdRNVDhEKx1lmI8iI7q5FVP7s8bk0f8KreF3FjwJFrL4KMWB/fDZtvvnmOcCO9/r4WxRPPfVU/lyKCpLy51Js09///vd50Pkii9d8fO8r0mdTtCe2YX36bIp9IE6EULTPph9//DEP4n3RRRflMwBGYBnfR/fbb798AF4k8d0zguqosI6AICrYo3trXX0uzex7e3weRYVY9bP61cVxUn04tpiTdkbvhKgMjArG6P0RgWYR2xnd16PHQlQvxg/9cRbCaC+1Q4BFjUKM+BCJ8vLKv4bF9aKOh1Rk8ctRvCHGG9yjjz6a+0vXF/G8l8clKIr4hTi6OsaXnPIlKojiV5H4f4SvRRRBQZxVKQKjIokS6eqnCo6xMeJX2iKKMQei6iJ+pSuaOONPjNlRWeyP5WqCogYDsU9Gl43oQhoVD0UU75txYFD5cyl+rY0qHJ9LNQuvYqy+CIXjdPD1RdE+myKsjrPkVf5ciuqWCLXjdVVk0UUrQoIifTbF99A4pX19+myKQDW+OxdtbLZ4ncelPn02RUiw9NJL5/emOCv2gv5cmt339nieI2Cp/HkU+2qEqwvq86i+HFvMSTvjszzGY4vXfVQJ1kU107xsz7hPXIr0WVTf6UJIjcQpd6PLSwQDm266aRowYEAesO6www4rXChQ+VfDGGcovjhG+XH8EloEUYoaXYritMDxy0K5f3x8QMegyUUR4w5EqXZst/glJNocXQqK9uU7tmH1PulxEB4HX0Xq+/+HP/wh/9oZX7ZjnKG+ffvmL4zRTatIokIoBniNLoRxMBuVODFIclyKJr5sR4AV7011ObjnzMTz/Ze//CW/hqILYZwGPH71jq56RVM+BXR0G4730DjQjjFI6vI9fnbv59Ed889//nP+9TO+XJ555pk5JIhTrxepnd98800+kInXfSgfhEcAtyB/nZ9VOyOs+PWvf527vMWvzVG5Wv5siukLckyPWbUz3tfjNbXHHnvkNkcXwhi7JwajjhNPFOl5rx4AxgFuPN/xGitKO+Ny1llnpW7duuW2xY8qp556aq5ui8HSi7Q94z0pqoSi0iG6kEY1zr333pu/lxSpneUD8Ntvvz31799/gbZtTtsYXS5je8Z3zvhOEtW3MQ5afD4VqZ2xDSO4iv/HD5UxXES8vy/oweZn9709/kZXxzhWirZH5eoJJ5yQw6uoEi1CG0PcFpfyNo9tGvPG9l1Qg73Prp3l8Cp+AIyxOON6XELsCwvqR+nZtTPGix0yZEhua7Qrgv8Yoy+m7b777gukjQ1CXZ8GkfrvsssuK6200kr5VKabbrpp6ZlnnikVTfnUsNUvcZroophR++IyaNCgUpEcfvjh+bTf8XzHaYt32mmn0oMPPliqD7bbbrvSiSeeWCqSOAX4csstl7dnnFY9rhf1VLv33ntvaZ111ik1b968tOaaa5auueaaUhE98MAD+bUTp9suogkTJuT9MN43W7RoUVpllVXyaconTZpUKpohQ4bk9sX+2bZt21LPnj3zqcGL/H4+bdq00plnnlladtll874a71F1sS/Mrp3x3j6j6X379i1MO0eOHDnTz6a4X1Ha+eOPP5b23nvv0vLLL5/31XhP3WOPPUrPPffcAm3j7No5I/F5evHFFxeqnT/88EOpc+fO+TO+adOmuY1HHXVU6fPPPy9UO8uuv/760qqrrprfT9dff/3S3XffXch2Xn311aWWLVvW2Xvo7Nr42WeflQ499ND8OoptucYaa5T69++f31OL1M5LLrmk1K5du7xvxufoGWecUSefn3PyvT3em37729+WFl988VKrVq3y+1Rs5yK1MT5z6vr4Y3btnNk+EZf4nCpKOz/55JPSbrvtVlpmmWXy/hn76YEHHlh65513FlgbG4JG8U9dh2gAAAAAMDPGwAIAAACg0ARYAAAAABSaAAsAAACAQhNgAQAAAFBoAiwAAAAACk2ABQAAAEChCbAAAAAAKDQBFgAAAACFJsACAGjArrnmmrTiiiumxo0bpwEDBtR1cwAAZkiABQBQQ4ceemjaa6+9prv98ccfT40aNUrjxo0r5DaeMGFCOv7449Npp52WPvnkk3T00UfPcL54DOXLwgsvnFZbbbX8mF988cUF3mYAoGESYAEA1HM//fTTPN1v9OjR+b5du3ZNyy23XGrVqtVM5x00aFD67LPP0ptvvpkGDhyYvvvuu7TZZpulm266qQYtBwCYMwIsAIAF6P/+7//S2muvnZo3b57at2+f+vfvX2V6VDndfffdVW5bbLHF0o033pj/P2rUqDzPkCFD0nbbbZdatGiRbr755pkGVHvuuWdaZJFFUuvWrdO+++6bvvjiizwtlrfuuuvm/6+yyip5mbHsmYk2tG3bNre5c+fO6Y477kjdu3fPFVxjx47N83z99dfpgAMOSCussEIOw2L5//znPyuWEWHXkksumSZNmlRl2VG9dvDBB8/llgQAGhIBFgDAAhJd7iJE2n///dPrr7+e+vXrl84888yKcGpu9O7dO5144onp7bffTl26dJlu+rRp03J49c0336QnnngiPfTQQ+mDDz5I++23X54efx9++OH8/+eeey5XV8VYWHOjV69e6dtvv83LDhMnTkwbbbRRGjp0aHrjjTdyl8QIpmL54Te/+U2aOnVquueeeyqWMWbMmDz/4YcfPtfbAABoOJrUdQMAAH4O7rvvvlzpVFmENZVddNFFaaeddsqhVVh99dXTW2+9lS688MI8ptTcOOmkk9I+++wz0+mPPPJIDslGjhxZEUxFBVRUfz3//PNpk002ydVQYemll87VVXNrzTXXzH/LlVtRefWHP/yhYvoJJ5yQHnjggXTbbbelTTfdNLVs2TIdeOCBuTtihFnhH//4R1pppZXS9ttvP9frBwAaDhVYAAC1YIcddkivvPJKlct1111XZZ6oltpqq62q3BbX33vvvenCrtnZeOONZzk91hXBVeWqqo4dO+augDGtNpRKpfw3uh+GeAznnHNO7jq4xBJL5EAvAqzoylh21FFHpQcffDAPGh+i+izCu/IyAABmRAUWAEAtiLPzrbrqqlVu+/jjj+d6ORHklIOhWQ3SHuura+UgrEOHDvlvVJJdcsklacCAATnEijZGpdjkyZMr7rPBBhuk9ddfP1eDxVhaMSh8dCEEAJgVARYAwAKy1lprpaeffrrKbXE9uhIutNBCFd35YjyqsqjO+uGHH+ZpXR999FG+lKuworviuHHjciVWbYigKgaH33nnnSseS4y7ddBBB1WMw/Xf//53uvUdeeSR+b5RhRX3nduxtwCAhkcXQgCABeT3v/99HpsqutlFsDN48OB0+eWXVxk3ascdd8y3vfzyy+mFF15Ixx57bGratOlcryuCoaiCijMFvvTSS3kg9UMOOSSfuXB23Q9nJIKvzz//PH344Yd50PZf//rX6ZZbbklXXnll7pYYVltttTxt+PDhuTrrmGOOqTjrYWUxDlZUp1177bUGbwcA5ogACwBgAdlwww3zgOa33nprWmeddVKfPn3S2WefXWUA9/79++eKpG222SYHPRFutWrVap66Iv7rX/9Kiy++eNp2221zoLXKKqukIUOGzFPbDzvssLTccsvlgduPO+64PL5VhGLRxrIzzjgjP8Y4K2IMyh4Dw++1117TLatNmzapW7dueRkzmg4AUF2jUvVBFgAAYD6LszHGGREvvfRS2xoAmC0BFgAAC8zYsWPT448/nrsgxphca6yxhq0PAMyWQdwBAFhg4iyEEWKdf/75wisAYI6pwAIAAACg0AziDgAAAEChCbAAAAAAKDQBFgAAAACFJsACAAAAoNAEWAAAAAAUmgALAAAAgEITYAEAAABQaAIsAAAAAApNgAUAAABAoQmwAAAAACg0ARYAAAAAhSbAAgAAAKDQBFgAAAAAFJoACwAAAIBUZP8/N7svWdhCNAIAAAAASUVORK5CYII=" /&gt;

&lt;/body&gt;
&lt;/html&gt;</description></item><item><title>NAND game</title><link>https://www.ashwinmenon.com/posts/reviews/2024-11-17-nand-game/</link><pubDate>Sun, 17 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2024-11-17-nand-game/</guid><description>&lt;h1 id="what-is-it"&gt;What is it&lt;/h1&gt;
&lt;p&gt;I just finished playing &lt;a href="www.nandgame.com"&gt;NAND game&lt;/a&gt; which gets you to build a computer starting from simple relay circuits. As you build components, you get to reuse them. Over time, this means you have an arsenal of components that let you eventually build a computer. I think this is similar to a course &lt;a href="https://www.nand2tetris.org/"&gt;Nand2Tetris&lt;/a&gt; that I&amp;rsquo;d started years ago but never finished. I skipped the software lessons, but completed all the hardware ones.&lt;/p&gt;</description></item><item><title>How I use AI (part deux)</title><link>https://www.ashwinmenon.com/posts/technical/2024-11-11-how-i-use-ai-part-deux/</link><pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2024-11-11-how-i-use-ai-part-deux/</guid><description>&lt;p&gt;Adding to my list of what I&amp;rsquo;ve used AI (read as &amp;ldquo;LLMs&amp;rdquo;) for. For my previous post, click &lt;a href="https://www.ashwinmenon.com/posts/technical/2024-09-10-how-i-use-ai/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="travel-related"&gt;Travel-related&lt;/h1&gt;
&lt;p&gt;ChatGPT was quite helpful answering questions about the areas I was visiting in Europe. For example, I was confused by all the buildings and names, and sought help in the form of the question: &amp;ldquo;What was the Domus Flavia part of?&amp;rdquo;. ChatGPT answered that it was Domitian&amp;rsquo;s palace, which among other things included a basilica. That confused me even more, as evident in my follow-up: &amp;ldquo;Is that the same basilica as the basilica of Constantine?&amp;rdquo;. The answer was no.&lt;/p&gt;</description></item><item><title>Cancun</title><link>https://www.ashwinmenon.com/posts/activities/2024-09-18-cancun/</link><pubDate>Wed, 18 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2024-09-18-cancun/</guid><description>&lt;p&gt;Our trip to Cancun&lt;/p&gt;
&lt;h1 id="day-1"&gt;Day 1&lt;/h1&gt;
&lt;p&gt;Landed on Friday afternoon. Took the ADO bus from the airport. It was like 8$ per person to get to the city. Withdrew ~2000$ in pesos from an ATM at the airport. Don&amp;rsquo;t choose to convert when the ATM asks. Check online for which ATMs are good to use (in terms of exchange rate).&lt;/p&gt;
&lt;p&gt;We stayed in the city, near where the ADO bus drops you off, near the intersection of Avenue Uxmal and Avenue Tulum. I&amp;rsquo;d recommend not staying in the hotel zone unless you are going there to get the all-inclusive experience and simply want to relax in a hotel all day. Staying in the city is better to explore the &amp;ldquo;real Mexico&amp;rdquo; (IMO). After settling in to the Airbnb, we walked to a small restaurant on Avenue Bonampak and grabbed a Michelada (highly recommend!). There were many restaurants here open late at night, like Botamero Tropical (now closed), where we got some free shots in exchange for writing a review online. There were many other restaurants on the street open late as well. The food was generally excellent at all places we tried.&lt;/p&gt;</description></item><item><title>How I use AI</title><link>https://www.ashwinmenon.com/posts/technical/2024-09-10-how-i-use-ai/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2024-09-10-how-i-use-ai/</guid><description>&lt;p&gt;Brief list of what I&amp;rsquo;ve used AI (read as &amp;ldquo;LLMs&amp;rdquo;) for.&lt;/p&gt;
&lt;h1 id="what-ive-used-ai-for"&gt;What I&amp;rsquo;ve used AI for&lt;/h1&gt;
&lt;h2 id="laziness"&gt;Laziness&lt;/h2&gt;
&lt;p&gt;I &lt;em&gt;could&lt;/em&gt; have googled things in this section and figured my way around it with a little effort.&lt;/p&gt;
&lt;h3 id="writing-code-to-use-features-that-i-know-exist-but-am-not-proficient-at"&gt;Writing code to use features that I know exist, but am not proficient at:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I asked it to mock static methods using Mockito. This was a feature introduced in the newer versions of Mockito, so I am not as familiar with mocking statics off the top of my head. The syntax is also somewhat weird, so asking the LLM to do it works well.&lt;/li&gt;
&lt;li&gt;I asked it to cherry pick a file from another commit.&lt;/li&gt;
&lt;li&gt;I asked it to show me a way to see files in a git stash.&lt;/li&gt;
&lt;li&gt;I asked it for a command to copy the last git message. Answer: &lt;code&gt;git log -1 --pretty=%B | pbcopy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Asked it to split a commit into 2 commits. See below.&lt;/li&gt;
&lt;li&gt;Asked it how to stash only unstaged changes. Answer: &lt;code&gt;git stash --keep-index&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="working-with-cumbersome-cli-commands"&gt;Working with cumbersome CLI commands&lt;/h3&gt;
&lt;p&gt;I asked it to write a &lt;code&gt;find&lt;/code&gt; command and pass in the arguments to &lt;code&gt;sed&lt;/code&gt; as the arguments to pass to &lt;code&gt;find&lt;/code&gt; are never obvious to me. Specifically, whether the path should come before the &lt;code&gt;--name&lt;/code&gt; option or not. I also find (heh) that sending output from &lt;code&gt;find&lt;/code&gt; to &lt;code&gt;sed&lt;/code&gt; is really hard to get right. Do I get it to work with &lt;code&gt;xargs&lt;/code&gt; or pipe the arguments to &lt;code&gt;sed&lt;/code&gt; or use the exec option within &lt;code&gt;find&lt;/code&gt;? Well, with the LLM I just had to ask what I wanted it to do and the command it gave me worked perfectly (specifying platform of course, because &lt;code&gt;sed&lt;/code&gt; behaves differently with in-place replace in files on the Mac v/s Linux).&lt;/p&gt;</description></item><item><title>Sex and gender</title><link>https://www.ashwinmenon.com/posts/thoughts/2024-08-01-sex-and-gender/</link><pubDate>Thu, 01 Aug 2024 20:40:41 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2024-08-01-sex-and-gender/</guid><description>&lt;p&gt;&lt;em&gt;Disclaimer 1: This is my understanding, if you spot something wrong, please assume best intentions and let me know, thanks!&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Disclaimer 2: All uses of the word male/men/female/women here are subject to the caveats I&amp;rsquo;ve tried to detail below.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I had to write this post as the topic of sex and gender (in sports) has popped up yet again this Olympics :)&lt;/p&gt;
&lt;p&gt;Firstly, sex and gender are not the same. A person&amp;rsquo;s sex can be male or female, and so can a person&amp;rsquo;s gender, and that is where the confusion may arise. Let&amp;rsquo;s dive in.&lt;/p&gt;</description></item><item><title>The art of watching sports</title><link>https://www.ashwinmenon.com/posts/thoughts/2024-06-26-the-art-of-watching-sports/</link><pubDate>Wed, 26 Jun 2024 01:50:42 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2024-06-26-the-art-of-watching-sports/</guid><description>&lt;p&gt;This is a post about watching sports, but it is written not only for those of you that watch sports or are sport-curious (those that &lt;em&gt;think&lt;/em&gt; that they may want to watch sports but aren&amp;rsquo;t sure). This is also a post for anyone who likes to watch movies, or shows, or read books. Lastly, this is also a post for those of you who hope that your spouse may share the couch as you plop down to watch the highlights for the most recent sporting spectacle you&amp;rsquo;ve gotten into.&lt;/p&gt;</description></item><item><title>Heroes</title><link>https://www.ashwinmenon.com/posts/thoughts/2024-06-18-heroes/</link><pubDate>Tue, 18 Jun 2024 23:35:17 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2024-06-18-heroes/</guid><description>&lt;p&gt;&amp;ldquo;Don&amp;rsquo;t meet your heroes,&amp;rdquo; I&amp;rsquo;ve heard. &amp;ldquo;People are imperfect&amp;rdquo; I counter.&lt;/p&gt;
&lt;p&gt;Here are a few people I look up to, with the reasons I look up to them stated. They may have flaws, but the flaws are not why I look up to them&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;. I admire them mainly for the good that they do, and for choosing – in what seems like a batshit crazy move to many - &lt;em&gt;not&lt;/em&gt; to prioritize profit&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description></item><item><title>Cluster headaches</title><link>https://www.ashwinmenon.com/posts/reviews/2024-02-13-cluster-headaches/</link><pubDate>Tue, 13 Feb 2024 19:13:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2024-02-13-cluster-headaches/</guid><description>&lt;h1 id="cluster-headaches"&gt;Cluster headaches&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;ve always thought it would be a better use of time to do research on conditions rather than simply pray. In one case, after doctors had near given up on figuring out what was causing a family friend&amp;rsquo;s son&amp;rsquo;s high fever, said family friend read up and suggested that his son may have dengue to the doctors. Turns out he did - doctors had not tested for dengue because it wasn&amp;rsquo;t dengue season.&lt;/p&gt;</description></item><item><title>2023 review</title><link>https://www.ashwinmenon.com/posts/activities/2023-12-31-2023-review/</link><pubDate>Sun, 31 Dec 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2023-12-31-2023-review/</guid><description>&lt;p&gt;Written after the fact, but here are a collection of my monthly reviews for 2023:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.ashwinmenon.com/posts/activities/2023-08-28-july-review/"&gt;July&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ashwinmenon.com/posts/activities/2023-06-30-june-review/"&gt;June&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ashwinmenon.com/posts/activities/2023-05-31-may-review/"&gt;May&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ashwinmenon.com/posts/activities/2023-04-30-april-review/"&gt;April&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ashwinmenon.com/posts/activities/2023-03-31-march-review/"&gt;March&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ashwinmenon.com/posts/activities/2023-02-28-february-review/"&gt;February&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ashwinmenon.com/posts/activities/2023-01-31-january-review/"&gt;January&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As evidenced by the short list, I couldn&amp;rsquo;t keep up after July&lt;/p&gt;</description></item><item><title>A covid chronicle</title><link>https://www.ashwinmenon.com/posts/activities/2023-08-06-a-covid-chronicle/</link><pubDate>Sun, 06 Aug 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2023-08-06-a-covid-chronicle/</guid><description>&lt;h2 id="the-initial-signs"&gt;The initial signs&lt;/h2&gt;
&lt;p&gt;Unfortunately, on the last day of a trip to Alaska, I started feeling a throat infection coming on. This was, however, not to be a simple throat infection.
A few hours after I&amp;rsquo;d gotten back home (a day later) a fever of 102.3 had built up.&lt;/p&gt;
&lt;h2 id="a-citizen-scientist"&gt;A citizen scientist&lt;/h2&gt;
&lt;p&gt;A day later, I decided this might be a good opportunity to chronicle the progression of the disease, and collect some actual data. I started recording my temperature, and the medicines I took. We&amp;rsquo;ve had a spike in citizen journalism with the advent of the internet, it would be nice to also have a spike in the number of citizen scientists! Here&amp;rsquo;s a quick graph of what the five days battling with the fever looked like. By day 6, I was fever-free.&lt;/p&gt;</description></item><item><title>Riding the STP</title><link>https://www.ashwinmenon.com/posts/activities/2023-07-20-riding-the-stp/</link><pubDate>Thu, 20 Jul 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2023-07-20-riding-the-stp/</guid><description>&lt;h2 id="the-s-t-p"&gt;The S T P&lt;/h2&gt;
&lt;p&gt;Back in June, I heard one of my friends talking about doing the STP with a friend. &amp;ldquo;Oh, can I join?&amp;rdquo; I asked. &amp;ldquo;Yeah, of course, man!&amp;rdquo; came the reply and in a second I had signed myself up for a 200+ mile bike ride with little idea of how hard 200+ miles would be. As I read up on the internet, I grew more and more terrified, sure none of this would go well for me. Online anonymous commenters were very pessimistic and asked me to be cautious. After a 40-mile ride, I thought they were pretty much right.&lt;/p&gt;</description></item><item><title>The sorry state of software UI/UX</title><link>https://www.ashwinmenon.com/posts/technical/2023-04-17-the-sorry-state-of-software-ui-ux/</link><pubDate>Mon, 17 Apr 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2023-04-17-the-sorry-state-of-software-ui-ux/</guid><description>&lt;h2 id="can-you-tell-the-time"&gt;Can you tell the time?&lt;/h2&gt;
&lt;figure&gt;&lt;img src="https://github.com/IngridMorstrad/IngridMorstrad.github.io/blob/mainline/static/assets/images/android%20alarm.png?raw=true" width="600px"&gt;&lt;figcaption&gt;
 &lt;h4&gt; Totally normal clock face&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Nope, you aren&amp;rsquo;t looking at a programmer&amp;rsquo;s &lt;a href="https://techcrunch.com/gallery/worst-volume-controls/"&gt;attempt at being funny&lt;/a&gt;. This was the &lt;strong&gt;official&lt;/strong&gt; clock app on Android.&lt;/p&gt;
&lt;p&gt;This was actually an attempt at improving an earlier iteration, which for some godforsaken reason stuffed the hours from 13 to 24 into the clock face displaying 1-12:&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://github.com/IngridMorstrad/IngridMorstrad.github.io/blob/mainline/static/assets/images/ClockApp.jpeg?raw=true" width="600px"&gt;&lt;figcaption&gt;
 &lt;h4&gt; Why settle for one clock face when you can have two?&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Inexplicably, 00 is included in the inner clock face, meaning the inner clock face actually goes 00 -&amp;gt; 13 -&amp;gt; 14 -&amp;gt; 15 (and so on)! I&amp;rsquo;m perplexed this was released to customers. And why would you even want to update a &amp;ldquo;clock&amp;rdquo; app? Surely, it can&amp;rsquo;t be improved anymore&amp;hellip; or can it?&lt;/p&gt;</description></item><item><title>The decentralized web</title><link>https://www.ashwinmenon.com/posts/reviews/2023-03-22-the-decentralized-web/</link><pubDate>Wed, 22 Mar 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2023-03-22-the-decentralized-web/</guid><description>&lt;p&gt;Over the last couple of years there has been a lot of talk about decentralization of the web. I seem to think we already had a decentralized web - back in the early 00s. Before the rise of centralization, everyone had their own little corner of the web. Blogs/spaces/forums were common and even if you didn&amp;rsquo;t own the domain name, no one was trying* to run a business off of content you provided (&lt;a href="https://en.wikipedia.org/wiki/Matmice"&gt;Matmice&lt;/a&gt;, anyone?). A &amp;ldquo;private&amp;rdquo; place on the web, that people owned, that allowed and encouraged everyone to put themselves out there and share their personalities online. This soon changed with the rise of social networks like Orkut, Hi5, MySpace and Facebook, which meant people no longer owned the spaces where they were sharing themselves, leading to eventual centralization and monopolies preventing competition**.&lt;/p&gt;</description></item><item><title>The case for the curmudgeon</title><link>https://www.ashwinmenon.com/posts/technical/2023-02-19-the-case-for-the-curmudgeon/</link><pubDate>Sun, 19 Feb 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2023-02-19-the-case-for-the-curmudgeon/</guid><description>&lt;h2 id="the-case-for-the-curmudgeon"&gt;The case for the curmudgeon&lt;/h2&gt;
&lt;p&gt;Ever notice that one guy on the team always complaining about stuff? That&amp;rsquo;s a curmudgeon!&lt;br&gt;
While today there are calls for more positivity in all spheres of life, I&amp;rsquo;m going to make a case for why having a curmudgeon on your team might actually be a &lt;em&gt;good&lt;/em&gt; thing.&lt;/p&gt;
&lt;p&gt;Firstly, a curmudgeon ends up creating a safe space for others on your team to raise concerns. If a curmudgeon&amp;rsquo;s constant complaining is tolerated, other employees may feel more comfortable sharing any concerns they have, bringing transparency and openness in communication to the workplace. Handled well, this can lend some hard evidence to support the oft-heard phrase &amp;ldquo;Bring your entire self to work&amp;rdquo; (with the unsaid second half: &amp;ldquo;without worrying about it&amp;rdquo;). Psychological safety &lt;a href="https://rework.withgoogle.com/guides/understanding-team-effectiveness/steps/identify-dynamics-of-effective-teams/"&gt;based on research by Google&lt;/a&gt; was shown to be the number one factor impacting the effectiveness of a team.&lt;/p&gt;</description></item><item><title>Software engineering blogs worth following</title><link>https://www.ashwinmenon.com/posts/technical/2023-01-18-software-engineering-blogs-worth-following/</link><pubDate>Wed, 18 Jan 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2023-01-18-software-engineering-blogs-worth-following/</guid><description>&lt;p&gt;Here&amp;rsquo;s a list of some cool blogs I think are worth a read:&lt;/p&gt;
&lt;h3 id="software-engineers"&gt;Software engineers&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Approximately in the order I&amp;rsquo;d recommend them in&lt;/em&gt;
&lt;a href="https://jvns.ca/"&gt;Julia Evans&lt;/a&gt;&lt;br&gt;
&lt;a href="https://brooker.co.za/"&gt;Marc Brooker&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;&lt;br&gt;
&lt;a href="https://steve-yegge.medium.com/"&gt;Steve Yegge&lt;/a&gt;&lt;br&gt;
&lt;a href="https://copyconstruct.medium.com/"&gt;Cindy Sridharan&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/vaidehijoshi/"&gt;Vaidehi Joshi&lt;/a&gt; - not really a blog, but the basecs and baseds series.&lt;br&gt;
&lt;a href="https://danluu.com/"&gt;Dan Luu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unranked (haven&amp;rsquo;t gotten to yet):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://carloarg02.medium.com/"&gt;Carlos Arguelles&lt;/a&gt; (haven&amp;rsquo;t gotten to it yet)&lt;br&gt;
&lt;a href="https://rhodesmill.org/brandon/"&gt;Brandon Rhodes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://explog.in/"&gt;explog.in&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.evalapply.org/"&gt;evalapply.org&lt;/a&gt;&lt;br&gt;
&lt;a href="https://the.scapegoat.dev/blog/"&gt;the.scapegoat.dev&lt;/a&gt;&lt;br&gt;
&lt;a href="https://publish.obsidian.md/manuel/Public/INDEX"&gt;Manuel&amp;rsquo;s Obsidian&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lilymara.xyz/talks/"&gt;Lily Mara&amp;rsquo;s talks&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lilymara.xyz/pages/blogroll/"&gt;Lily Mara&amp;rsquo;s blogroll&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.m-ou.se/"&gt;Mara&amp;rsquo;s blog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://near.blog/links/"&gt;near.blog links&lt;/a&gt;&lt;br&gt;
&lt;a href="https://architecturenotes.co/"&gt;Architecture Notes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mahdiyusuf.com/"&gt;Mahdi Yusuf&lt;/a&gt;&lt;br&gt;
&lt;a href="https://newsletter.francofernando.com/"&gt;Franco Fernando&amp;rsquo;s newsletter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://chrismunns.com/talks.html"&gt;Chris Munns talks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Will add more as I find more worth adding here.&lt;/p&gt;</description></item><item><title>Writing grips</title><link>https://www.ashwinmenon.com/posts/thoughts/2023-01-16-writing-grips/</link><pubDate>Mon, 16 Jan 2023 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2023-01-16-writing-grips/</guid><description>&lt;p&gt;I was unaware that the different writing grips were named and catalogued! I found a list &lt;a href="https://www.ot-mom-learning-activities.com/correct-pencil-grasp.html"&gt;here&lt;/a&gt;. When I was young, I believe I used the dynamic quadropod grip and then in the seventh grade noticed that almost everyone was using the dynamic tripod grip. So, I learned how to write with the tripod grip as well.&lt;/p&gt;
&lt;p&gt;Today, I use a mixture of both, with a bias towards the quadropod.&lt;/p&gt;</description></item><item><title>Hard work catalog</title><link>https://www.ashwinmenon.com/posts/thoughts/2022-12-24-hard-work-catalog/</link><pubDate>Sat, 24 Dec 2022 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2022-12-24-hard-work-catalog/</guid><description>&lt;h2 id="ongoing-list-of-people-talking"&gt;Ongoing list of people talking&lt;/h2&gt;
&lt;h3 id="about-hard-work-practice-and-preparation"&gt;about hard work, practice and preparation&lt;/h3&gt;
&lt;p&gt;Rahul Dravid&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;at ~1:30 &lt;a href="https://youtu.be/mN1M0zs3YAk?t=90"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Also at 3:30 about being prepared.&lt;/li&gt;
&lt;li&gt;At 5:02 about practising in the nets (email to Pietersen).&lt;/li&gt;
&lt;li&gt;At 7:43 &amp;ldquo;You can&amp;rsquo;t always control the results, but you can certainly control your preparation.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kapil Dev&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;at ~4:45 &lt;a href="https://youtu.be/9h-l_uBr7dE"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sunil Chhetri&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;at ~5:00 &lt;a href="https://youtu.be/sBj_JQWTqw8?t=300"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;At 7:47 as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conan O&amp;rsquo;Brien&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;at 4:04 &lt;a href="https://youtu.be/AcF1OoWqXBc?t=244"&gt;here&lt;/a&gt; &amp;ldquo;If you work really hard and you&amp;rsquo;re kind, amazing things will happen.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Novak Djokovic&lt;/p&gt;</description></item><item><title>Some predictions</title><link>https://www.ashwinmenon.com/posts/thoughts/2022-11-20-some-predictions/</link><pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2022-11-20-some-predictions/</guid><description>&lt;p&gt;Ongoing list of predictions&lt;/p&gt;
&lt;p&gt;Format: [Date], [chance of prediction coming true in my estimation]: [time period]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2022-11-20, 60%: Apple/Google will make a moderation decision on behalf of Twitter by banning it from the app/play store.&lt;/li&gt;
&lt;li&gt;2023-07-03, 80%: Twitter&amp;rsquo;s &amp;ldquo;rate limit&amp;rdquo; will be rolled back to allow more views to unverified accounts (currently at 1000) by the end of August.&lt;/li&gt;
&lt;li&gt;2023-07-03, 80%: Twitter&amp;rsquo;s &amp;ldquo;no access unless logged in&amp;rdquo; change will be rolled back by the end of August.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Some thoughts</title><link>https://www.ashwinmenon.com/posts/thoughts/2022-10-31-some-thoughts/</link><pubDate>Mon, 31 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2022-10-31-some-thoughts/</guid><description>&lt;p&gt;In a stark departure from my usual posts, here is some utterly unscientific nonsense that I mull over from time to time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can convince people to believe you are great, if others simply keep repeating that you are. What&amp;rsquo;s even more surprising, is that you can even do this without the help of others. Simply praise yourself all day, everyday, and take credit for accomplishments that have involved great help from others. It&amp;rsquo;s even possible if you had nothing to do with the thing in question, and only in some cases is this fraud. However, this is morally wrong, without question (in my book). Which brings me to my next point.&lt;/li&gt;
&lt;li&gt;If you wish to be moral, you will get beaten out by someone who doesn&amp;rsquo;t. Ideally, we would want to stick to our morals all the time. However, being moral is effectively placing a restriction on yourself (like a tax), and one which in most cases leaves little to no benefit other than the upholding of morality. The thin line between morality and legality - sometimes even wandering into legality - is where many &amp;ldquo;successful&amp;rdquo; (see previous point) people operate.&lt;/li&gt;
&lt;li&gt;If one wishes, they can easily manipulate others. In fact, this is essentially what Dale Carnegie&amp;rsquo;s book How to win friends &lt;em&gt;and influence people&lt;/em&gt; is about. What is more incredible, to me, is that you can even manipulate yourself! I once tried an experiment on myself, where I repeatedly told myself something I didn&amp;rsquo;t think to be true (that I thought had a &amp;lt; 5% chance of being true). After 2 weeks, I ended the experiment expecting to go back to normal. However, I couldn&amp;rsquo;t snap out of believing what I used to believe. Unrelated to my next point.&lt;/li&gt;
&lt;li&gt;I believe there are 10x engineers, or even 100x engineers. In other fields of individual pursuit - like sports - there are individuals who are clearly more skilled/capable/talented than others, and this is a non-controversial opinion. As of 2022, I do not see why this would not apply to engineering. Which brings me to:&lt;/li&gt;
&lt;li&gt;One person can - and has - changed the world. This has happened multiple times in history, and will continue to happen again. For examples, Newton, who revolutionized optics, calculus, physics and other fields, Galois who transformed mathematics before dying at 20 and Ramanujan, whose work I do not understand. Understanding? Ah,&lt;/li&gt;
&lt;li&gt;Assuming human intellect is likely on a bell curve (similar to genetic traits like height), it must be really frustrating for people much smarter than me to explain stuff to me. I can see this sometimes because so many concepts are so elementary to them that while their explanations flow, I flounder like a fish on land.&lt;/li&gt;
&lt;li&gt;Hard work can, and does, help. I assume &amp;ldquo;intellect&amp;rdquo; lies on a bell curve, but that only serves as a potential or some kind of &amp;ldquo;max limit&amp;rdquo; you could reach. This range lies much higher than where most people are, and that is because hard work determines how much of that potential you hit. Now, does the capacity for hard work lie on a bell curve?&lt;/li&gt;
&lt;li&gt;There is nothing wrong with saying &amp;ldquo;I don&amp;rsquo;t know&amp;rdquo; in response to a question, and that is the right answer for most people for most questions&lt;/li&gt;
&lt;li&gt;Social media optimizes for engagement, but when social media companies celebrate daily active users, it is a bit like celebrating giving sugar to a baby (or even an adult). Of course people will love never-ending short form video that supplies unlimited &lt;a href="https://www.ashwinmenon.com/posts/thoughts/2016-08-22-love-drugs-and-rock-n-roll/"&gt;dopamine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Empathy can go a long way. Would never have thought it ten years ago, but empathy can change a person&amp;rsquo;s mind more effectively than anything else.&lt;/li&gt;
&lt;li&gt;Many men are immature (or more comfortable being immature?) compared to women, and this might stem from the power disparity in society (which may stem from the power disparity in physical strength).&lt;/li&gt;
&lt;li&gt;Creating the best form of the argument you are responding to, before responding to it, is a great way to have a discussion rather than an argument.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Tech interviews: beating the game</title><link>https://www.ashwinmenon.com/posts/thoughts/2022-02-10-tech-interviews-beating-the-game/</link><pubDate>Thu, 10 Feb 2022 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2022-02-10-tech-interviews-beating-the-game/</guid><description>&lt;p&gt;&lt;em&gt;Disclaimer/Foreword: The aim of writing this series of posts is to allow our modern interview processes to be viewed through the lens of history (chronicling the process) and science (identifying problems and inferring improvements from process changes). This is part two in the series, which will focus on how to maximize your chances given the current state of the system. The rest of this post assumes you&amp;rsquo;ve read &lt;a href="https://www.ashwinmenon.com/posts/thoughts/2022-01-21-tech-interviews-an-origin-story/"&gt;part 1&lt;/a&gt;, and are interested in interviewing for tech/big tech companies.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Tech interviews: an origin story</title><link>https://www.ashwinmenon.com/posts/thoughts/2022-01-21-tech-interviews-an-origin-story/</link><pubDate>Fri, 21 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2022-01-21-tech-interviews-an-origin-story/</guid><description>&lt;p&gt;&lt;em&gt;Disclaimer/Foreword: The aim of writing this series of posts is to allow our modern interview processes to be viewed through the lens of history (chronicling the process) and science (identifying problems and inferring improvements from process changes).&lt;br&gt;
This series will contain 3 parts:&lt;br&gt;
the first one (this post) describes how interviews got to be the way they are today,&lt;br&gt;
the second (read &lt;a href="https://www.ashwinmenon.com/posts/thoughts/2022-02-10-tech-interviews-beating-the-game/"&gt;here&lt;/a&gt;) describes how you can maximize your chance of success at these interviews,&lt;br&gt;
and the third is about improving the process and fixing some of the issues plaguing tech interviews.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>100 days of chess</title><link>https://www.ashwinmenon.com/posts/activities/2021-10-12-100-days-of-chess/</link><pubDate>Tue, 12 Oct 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2021-10-12-100-days-of-chess/</guid><description>&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;The goal here is to try to do 100 days of chess study and see how that affects my games.&lt;/p&gt;
&lt;h2 id="plan"&gt;Plan&lt;/h2&gt;
&lt;p&gt;Will pull from a list of resources I have. Will add books below as I decide to start tasks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[book] Logical Chess: Move by Move by Irving Chernev.&lt;/li&gt;
&lt;li&gt;[book/video series] My 60 memorable games by Bobby Fischer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="www.moveguesser.com"&gt;MoveGuesser&lt;/a&gt; to &amp;ldquo;learn&amp;rdquo; the GM games.&lt;/p&gt;
&lt;h2 id="day-by-day-logs"&gt;Day-by-day logs&lt;/h2&gt;
&lt;p&gt;Day 1: 10/10 - First two games/chapters from Logical Chess Move by Move (by Irving Chernev). Both games were in the Giucco Piano.&lt;br&gt;
Day 2: 10/13 - IM Sowmya&amp;rsquo;s explanation of Fischer&amp;rsquo;s game against Sherwin &lt;a href="https://www.youtube.com/watch?v=x2QGuK2dLsA"&gt;https://www.youtube.com/watch?v=x2QGuK2dLsA&lt;/a&gt;. Featuring the Sicilian, with white playing d3.&lt;/p&gt;</description></item><item><title>Open AI Codex - coding with AI</title><link>https://www.ashwinmenon.com/posts/technical/2021-08-12-open-ai-codex/</link><pubDate>Thu, 12 Aug 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2021-08-12-open-ai-codex/</guid><description>&lt;p&gt;I got to use the Open AI Codex API today, as part of the Open AI codex challenge. The challenge consisted of 5 problems, meant to be solved as quickly as possible, with the Codex available for help.&lt;/p&gt;
&lt;p&gt;Clicking the &amp;ldquo;Codex it&amp;rdquo; button would get Codex to &amp;ldquo;parse&amp;rdquo; the problem statement, the comments in code and the method signature. Following that, it would write code that solved the problem. For the problems in the contest, the generated code either solved the problem completely or required only minor changes (&amp;lt;= 3 lines).&lt;/p&gt;</description></item><item><title>Reflections on my career</title><link>https://www.ashwinmenon.com/posts/thoughts/2021-05-27-reflections-on-my-career/</link><pubDate>Thu, 27 May 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2021-05-27-reflections-on-my-career/</guid><description>&lt;p&gt;Having worked for a little over six and a half years as a professional software engineer, now may be a good time to reflect on what I&amp;rsquo;ve learned and how I&amp;rsquo;ve grown.&lt;/p&gt;
&lt;h2 id="company-1"&gt;Company 1&lt;/h2&gt;
&lt;p&gt;In my first role, I primarily worked on implementing bug fixes and small features. While I feel bug fixes are not well considered by the industry, I really enjoyed working on them. They work as great on-boarding tools, allowing developers to come in and simply implement the fix or can also be great tools for learning the code-base. You can only fix a bug when you really understand what is causing it (if not, something will fail sooner or later).&lt;/p&gt;</description></item><item><title>April review</title><link>https://www.ashwinmenon.com/posts/activities/2021-04-30-april-review/</link><pubDate>Fri, 30 Apr 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2021-04-30-april-review/</guid><description>&lt;p&gt;After basically taking all of March &amp;ldquo;off&amp;rdquo; (only did Week 1, and lost my records for that week), hoping for a more productive April. Mostly porting March&amp;rsquo;s goals over.&lt;/p&gt;
&lt;h2 id="habit-goals"&gt;Habit goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;10 minutes of walking per day. [Same as Feb]. Third month in a row.&lt;/li&gt;
&lt;li&gt;2 times a week running (for varying times). [Slight change from Feb]. Tracking two 5Ks a week by week 3.&lt;/li&gt;
&lt;li&gt;[Paused] 3 chess puzzles in a row every day.&lt;/li&gt;
&lt;li&gt;[Paused start] 1 chess blitz game (3+2) per day. Play &amp;amp; analyze.&lt;/li&gt;
&lt;li&gt;3 sets of push-ups every other day. [Same as Feb] Weighted, 3x11 with 2:00 rest between sets. Starting out non-weighted, to ramp up.&lt;/li&gt;
&lt;li&gt;3 sets of squats every other day. [Same as Feb] Weighted, 3x15 with 2:00 rest between sets. Starting out non-weighted, to ramp up.&lt;/li&gt;
&lt;li&gt;[Secret goal]. [Continuing from Feb]. Targeting 1:1. Setting a low bar so it can be cleared.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="non-habit-targets"&gt;Non-habit targets&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Complete Designing Data-Intensive Applications (DDIA) by 03/10. Mid-chapter 7 as of 03/01. [To be updated]&lt;/li&gt;
&lt;li&gt;Complete Martin Kleppmann&amp;rsquo;s lecture studies.&lt;/li&gt;
&lt;li&gt;Complete FreeCodeCamp&amp;rsquo;s courses on APIs &amp;amp; microservices.&lt;/li&gt;
&lt;li&gt;Write 3 blog articles (can be private).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now,&lt;/p&gt;</description></item><item><title>Science content on YouTube</title><link>https://www.ashwinmenon.com/posts/reviews/2021-04-18-science-content-on-youtube/</link><pubDate>Sun, 18 Apr 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2021-04-18-science-content-on-youtube/</guid><description>&lt;p&gt;Some of my favourite science content on YouTube&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCzR-rom72PHN9Zg7RML9EbA"&gt;PBS Eons&lt;/a&gt;&lt;br&gt;
Covers life on earth, including some great videos about early humans.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/1veritasium"&gt;Veritasium&lt;/a&gt;&lt;br&gt;
Pretty cool science channel, where he explains different science phenomena. Based on his philosophy (from his PhD work) that showing people misconceptions and then correcting them is what gets them to learn. Showing the &amp;ldquo;truth&amp;rdquo; directly leaves them with the feeling that their preconceived (often incorrect) notions were right. He details this &lt;a href="https://www.youtube.com/watch?v=eVtCO84MDj8"&gt;in this video&lt;/a&gt;&lt;/p&gt;</description></item><item><title>A guide to code reviews - reviewed!</title><link>https://www.ashwinmenon.com/posts/technical/2021-03-24-a-guide-to-code-reviews-reviewed/</link><pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2021-03-24-a-guide-to-code-reviews-reviewed/</guid><description>&lt;p&gt;&lt;em&gt;Over my career as a software developer, I&amp;rsquo;ve changed how I approach code reviews. Simply put, I think of code in more practical terms and less as an &amp;ldquo;art&amp;rdquo;. Concepts of beauty, and perfection are best left to be incrementally achieved, and should always be considered with the end goal in mind (delivering value to the customer). Below, I&amp;rsquo;ve included my post from 3 years ago, with edits.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This here is a collection of things I&amp;rsquo;ve learned about reviewing code in the few years that I&amp;rsquo;ve worked as a software developer. &lt;del&gt;As these are my thoughts, you should take them with at least a pinch of salt instead of at face value, as with most subjective things in life.&lt;/del&gt; If you&amp;rsquo;re new to the role, you may find these helpful.&lt;/p&gt;</description></item><item><title>February review</title><link>https://www.ashwinmenon.com/posts/activities/2021-02-28-february-review/</link><pubDate>Sun, 28 Feb 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2021-02-28-february-review/</guid><description>&lt;p&gt;Started the February &amp;ldquo;review&amp;rdquo; a bit early this time, stated my goals, and tracked them more regularly (aiming for every week). I think this gives me a good chance to pivot on goals as necessary.&lt;/p&gt;
&lt;h2 id="habit-goals"&gt;Habit goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;22 minutes of reading every day. [Drop from Jan] Down from 30 minutes in January, which was a little too much for me. Again, counting only time spent reading books, not articles. Modified to read 1 chapter (of DDIA) per day on Feb 13. Modified to read 1 chapter every 2 days (on Feb 22).&lt;/li&gt;
&lt;li&gt;10 minutes of walking per day. Decided not to change this one; added a running goal instead.&lt;/li&gt;
&lt;li&gt;2 times a week running (for varying times). [New] Aim is to do 10 mins first week (continuing from January), 15 the second, 22 the third and 25 the fourth.&lt;/li&gt;
&lt;li&gt;5 chess puzzles in a row every day. [Same as Jan]. Dropped as a goal for the last week, can still do in free time (on Feb 22).&lt;/li&gt;
&lt;li&gt;3 sets of push-ups every other day. [Change from Jan] Weighted, 3x11 with 2:00 rest between sets.&lt;/li&gt;
&lt;li&gt;3 sets of squats every other day. [Change from Jan] Weighted, 3x15 with 2:00 rest between sets.&lt;/li&gt;
&lt;li&gt;[Secret goal]. Will be revealed later. Upped from 2:0 to 3:1 (on Feb 22).&lt;/li&gt;
&lt;li&gt;1 design article per day. [New] Added on Feb 10. Reduced to 2 per week (on Feb 22).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="non-habit-targets"&gt;Non-habit targets&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;500 correct chessCom puzzles for the month. Total of 2744. [SUCCEEDED]
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Week 1: At 2603&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Week 2: At 2770&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Week 3: At 2999&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[Added end of week 1] Finish reading &amp;amp; paste notes for Designing Data-Intensive Applications [FAILED]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now,&lt;/p&gt;</description></item><item><title>January review</title><link>https://www.ashwinmenon.com/posts/activities/2021-01-31-january-review/</link><pubDate>Sun, 31 Jan 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2021-01-31-january-review/</guid><description>&lt;p&gt;After seeing others (Susan Fowler, Julia Evans, etc.) write year-in-review posts, I thought I should give it a go too! However, I don&amp;rsquo;t trust my discipline to last all year. So, I&amp;rsquo;ve decided to post monthly reviews.&lt;/p&gt;
&lt;p&gt;For January, I set the following goals, all framed in a &amp;lsquo;habit&amp;rsquo; style.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;30 minutes of reading every day. Reading was a fond childhood habit, which I have replaced with oodles of pointless Redditing, YouTubing and Twittering. As a kid, I&amp;rsquo;d carry my books along on visits my family made (serving the purpose of a comfort blanket, while also engaging me I guess). Time to get that back on track. I forced myself to only count time spent reading books, not articles.&lt;/li&gt;
&lt;li&gt;10 minutes of walking per day. This is some indicator of how unfit I had become at the end of 2020, given that till 2019 I could easily run a 5k in under 28 minutes with little effort.&lt;/li&gt;
&lt;li&gt;5 chess puzzles in a row every day. Intended to improve my skills at chess. Based on something I read on KhanAcademy (I think) stating that streaks of correct answers indicate mastery better than %-based metrics.&lt;/li&gt;
&lt;li&gt;3 sets of push-ups every other day.&lt;/li&gt;
&lt;li&gt;3 sets of squats every other day. For both this and the push-up goal, I didn&amp;rsquo;t really set a fixed amount of reps per set. This may be something I change going forward.&lt;/li&gt;
&lt;li&gt;Watch 2 tech videos every week day. This goal was abandoned after 4 days. I need to fit &amp;rsquo;learning&amp;rsquo; into my schedule in a different way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now,&lt;/p&gt;</description></item><item><title>A little history of philosophy by Nigel Warburton</title><link>https://www.ashwinmenon.com/posts/reviews/2021-01-28-a-little-history-of-philosophy/</link><pubDate>Thu, 28 Jan 2021 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2021-01-28-a-little-history-of-philosophy/</guid><description>&lt;p&gt;Overall rating: 9/10
Recommended if: you want to start reading about philosophy
Level: Easy, intro-level.&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;In short (heh), a great introduction, covering a lot of philosophers. I liked it better than whatever I&amp;rsquo;ve read of The Story of Philosophy. Sometimes I wonder if Nigel accidentally misrepresented/misfocused what philosophers stood for to ensure transitions between chapters were smooth (for eg:- I&amp;rsquo;ve seen Locke contrasted with Hobbes in the past, but could draw no such contrast here). The transitions were really smooth though and I am glad I was exposed to many interesting (and some useless) ideas. Gives one a good base to start thinking from.&lt;/p&gt;</description></item><item><title>Same Interview</title><link>https://www.ashwinmenon.com/posts/activities/2020-11-29-same-interview/</link><pubDate>Sun, 29 Nov 2020 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2020-11-29-same-interview/</guid><description>&lt;p&gt;Fernet&lt;/p&gt;
&lt;p&gt;O4fJSlQDKUFguV0mksfMOIVOLD6j9SPc8Fck_SXxCV4=&lt;/p&gt;
&lt;p&gt;gAAAAABjhw0NmBgemUC-LjPhCneuiRP3T22ng_unjV1yF4aTsmA0RsgRVRy_FrhgeMDYhwZ7JN85BTErCgiCUa-U2PUPuVujtDy1kfNL7N00JpgSi2uJoPScgyx_msKdL4m_jrKWCgtxzhcFCftKUzApr5s1W4_AgT20TGoNB4W-ARte19EpScGhktRIDkrH-RByzqOIQnfPvp1tolW92ukYuMm7RURdq8FtwDbFv0PqN4UrZ-7qZVzwysR384GrZD2PC-_3UO2HMytXX7agGJCJ_1FeN_7rwb6mvZlNfwDJu7AU0Wy-VQOYcuAYn9ocSEg4GG2Q739Ha27h9U9t5DJPa-5byfWX9FGEIxOZ6dCOCgyf10LE03m3D4Harih4mATAp8V7ChxPwULu38qyFRiAeMdFbq4NqtmE6FMEmPCttxiU9hp8VnzvJ4sa87eetCJIJgHuZ-N_ynzaYsCg0VPX&amp;ndash;mmLhUKs3a7ZrdUxd4ga8h3N7VWXS7fPeC3L88zLftJ23rHG658-YoycnVncAGl7F9xB_NGiBuSn-fBB9YUcLxwdLmHWRnOyZH5nE0yjVO4GeoVCbAmVo-mOg5on1IJxacelhw_WYlKGJyBnqWM6FsOpG2RALCOTV7u1xQcwjP4cnGsAq5BrYq2NeHzG9uaYsPK89m0n4PhsRljQOa7XuYpq7Dcfsn5YwFqQk_UJu_rZAX-H_0U_4PToA6nuM8vrzNF-fZ2wTqr-iM4h46iuzTrgP2VBvFqBx4GeeL20Y_pUMUleBs6PggrrmxSYggOFSREXOc-S6q7lRCXeFFU9QJLsT-pKq4Hr7UtJTdLn45pWg8IM6oLlFZ4virMiP9Sl9otBsYefNNZvFqluyr1IufKQwOhfT_IkzsF-d43jx7EioqlpYQMrClInyO9DeB3a50W9hRJfhIa8yY2CM1GqF74OX2o8_Y6Otens5j0yeQzFXKd2WVpGvSDN4aZiTj0zLjZgGWlS7P74o3X3GmWgdNf1F24nz04rThmgKbza7zIwcW3EhYWjtYJoBDbFcG_ZBdT6WQmNEDj1l3EYsXw5SZrY886WFWxXJbjRvL20prokVCQcCatT-KyJJI8Qelh_e_NJeqUOoQw9zpSbaNeJodJAZBGtX1sTepcquk4hwQKlS5Erz3NdUZrS2B6aOJw9bPVJDMI_D5zvqxsaBsS_gZ7WfN0mq_kSEBTn5v4pcBULeti_tnKXcjqyb6_nXkY0cFWg-7hna_AmeHCeT3D_2GOdNgDhuZhToka09Qv17-fNCtRFmfhAaKIeasndk6AFPfdFx-nIXGzJsleS96ZCIjVkyWTxulRSCSTti2VHv2EOkxS5kYQJYEk2qZ_3sJFt_ge4wFkxd5uZpJucICJhBiMFTita4GtrQwSH3AzaJcXZ_WO8hIXDOKtfYQiegK3ifORwCIw2-1uhyUdNiICV7nC6rDzfVbvOlaWujCP2qf8u8WamSXKcJL6Z3TbH2MxjHNS36wuOinAFdnwq3tWXi0PrKN0Xdobj1TBeCT2mBQ84WKhxZQJzgOLeIZMWdMY5h_RoK1CfeF_TJZ8_CmC0ds8dfL9yC5jdicZqSkuSn28sIWxBM3dg_tcBMy0KbbdHxEIzSEDk3_yciztTKNhRzFJjy_t5pWI2zC3eB655RYf8GC8g5a700-tNLZlR3ZKV5EcdwWFuIo3kkU4cCJcsmJSf-eDS6dGy_Xo-hggIbFZuTRYQNjULeORyFYQfnxoOod7S8f2k2FhXB5dxdoMzUjM8HhP4pU41s3C0mf2ZM9qtrPOJbbz-HasaCHlbTHApRDfgnYs-qHDQEBVGq7Wl5bSEUFgW0Y33GUSdZTrcfRz4_psJ680IdhZh4yTUItkge-pGPpSLYwoXuSYgk-51LoCkKfRs5LSYYEMo1ujnzC3ST-9lN9m0w6dDRixw1g28Eq4ZXbZUGF9czFv2vDmYCnlZDH808czK3RcCLCh9e9Pabi_Ad6FAA0I08cwD_54IGpYQCfE7w==&lt;/p&gt;</description></item><item><title>Let's talk about: Health Costs</title><link>https://www.ashwinmenon.com/posts/thoughts/2019-10-21-lets-talk-about-health-costs/</link><pubDate>Mon, 21 Oct 2019 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2019-10-21-lets-talk-about-health-costs/</guid><description>&lt;p&gt;Drug prices are similar to the points in &amp;ldquo;Whose Line is it Anyway?&amp;rdquo; - they&amp;rsquo;re made up. The price that is shown in the infographic (250$) is purely artificial, considering the drug maker gives a $62.50 rebate, meaning the actual cost to the drug maker is only $187.5.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://khn.org/wp-content/uploads/sites/2/2016/10/drug-pipeline-final_1498.jpg?resize=1200,2346" alt="Image showing flow of money from producers to consumers in healthcare"&gt;&lt;/p&gt;
&lt;p&gt;Image from &lt;a href="https://khn.org/news/tracking-who-makes-money-on-a-brand-name-drug/"&gt;Kaiser Health News&lt;/a&gt; shared under a &lt;a href="https://creativecommons.org/licenses/by-nc-nd/4.0/"&gt;CC license&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="textual-description"&gt;Textual description&lt;/h2&gt;
&lt;p&gt;What happens is, the company that makes the drug sets a price, let&amp;rsquo;s say 250$ (this is a &amp;ldquo;fake&amp;rdquo; price as you will see). Now, the drug is sold to a wholesaler for a certain price (237.50$ in the figure). The wholesaler then sells it to pharmacies for a profit (240$). Notice how the price dropped from 250 to 237.5? It&amp;rsquo;s because the 250 price is a lie. The actual price was always 237.50$ and 250$ was chosen to inflate the price and make it seem like the buyer is getting a great &amp;ldquo;deal&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Let's talk about: Climate Change</title><link>https://www.ashwinmenon.com/drafts/feminism/</link><pubDate>Thu, 10 Oct 2019 21:08:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/feminism/</guid><description>&lt;p&gt;Talk by Chimamanda Ngozi Adichie &lt;a href="https://www.youtube..com/watch?v=hg3umXU"&gt;https://www.youtube..com/watch?v=hg3umXU&lt;/a&gt;_qWc&lt;/p&gt;</description></item><item><title>Let's talk about: Climate Change</title><link>https://www.ashwinmenon.com/posts/thoughts/2019-10-10-lets-talk-about-climate-change/</link><pubDate>Thu, 10 Oct 2019 21:08:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2019-10-10-lets-talk-about-climate-change/</guid><description>&lt;p&gt;With all the recent news and coverage that climate change is getting, it is easy for one to get a sense of ennui, to develop a numbness to each new report that paints a grimmer version of the future compared to the previous one. It is easy to feel helpless, as if relying on the ability of a captain on a sinking ship. This post is written as an attempt to try and get you to disavow that notion.&lt;/p&gt;</description></item><item><title>Of flights and men</title><link>https://www.ashwinmenon.com/posts/activities/2018-12-20-of-flights-and-men/</link><pubDate>Thu, 20 Dec 2018 23:22:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2018-12-20-of-flights-and-men/</guid><description>&lt;p&gt;&amp;ldquo;Woah!&amp;rdquo; he chortled.&lt;br&gt;
&amp;ldquo;I look different, I guess.&amp;rdquo;&lt;br&gt;
&amp;ldquo;You look like a writer.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I hadn&amp;rsquo;t seen Ashish for quite some time. We went to the same school, but only struck up a friendship towards the end of high school. We lived awfully close (less than a km away from each other), but it was only by the eleventh grade that my parents deemed I could walk a kilometer safely by myself. Not soon after, school ended, and we went our separate ways to college. Now, nine years on, a shaped beard hugged his formerly chubby face.&lt;/p&gt;</description></item><item><title>Let's talk about encryption - again!</title><link>https://www.ashwinmenon.com/posts/technical/security/2018-11-05-lets-talk-about-encryption-again/</link><pubDate>Tue, 20 Nov 2018 23:51:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/security/2018-11-05-lets-talk-about-encryption-again/</guid><description>&lt;p&gt;This post is part of a multi-part series.&lt;/p&gt;
&lt;p&gt;For part 1, click &lt;a href="../05/lets-talk-about-encryption.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="wolf-einstein"&gt;Wolf Einstein&lt;/h2&gt;
&lt;p&gt;The wolf has realized you&amp;rsquo;ve foiled his initial plans, and he&amp;rsquo;s decided to up his game. Now, he knows you encrypt your message with your private key. He decides he will decrypt the message with your public key, which will let him know exactly when you plan to visit. Then, he plans to intercept you on the way to your grandmother&amp;rsquo;s house - just like the fairytale foretold.&lt;/p&gt;</description></item><item><title>Let's talk about encryption</title><link>https://www.ashwinmenon.com/posts/technical/security/2018-11-05-lets-talk-about-encryption/</link><pubDate>Mon, 05 Nov 2018 23:51:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/security/2018-11-05-lets-talk-about-encryption/</guid><description>&lt;h2 id="the-better-to-write-you-with"&gt;The better to write you with&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say you are Red Riding Hood, and you want to write a letter to your grandmother telling her you will be visiting. However, the big bad wolf is aware of your plans, and he decides he will &lt;em&gt;also&lt;/em&gt; write a letter to your grandmother (pretending to be you) saying you won&amp;rsquo;t be visiting. If only there was a way you could let your grandmother know your letter was from you &lt;em&gt;and&lt;/em&gt; the wolf&amp;rsquo;s letter was a fake. What if I tell you, little Red Riding Hood, that there &lt;strong&gt;is&lt;/strong&gt; a way you can do this!&lt;/p&gt;</description></item><item><title>Let's talk about encryption - part 2</title><link>https://www.ashwinmenon.com/drafts/2018-11-05-lets-talk-about-certificates/</link><pubDate>Thu, 01 Nov 2018 23:51:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/2018-11-05-lets-talk-about-certificates/</guid><description>&lt;p&gt;This post is part of a series. For part 1, click &lt;a href="www.ashwinmenon.com/technical/security/2018/11/05/lets-talk-about-encryption.html"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;We have two computers (let&amp;rsquo;s call them the client and the server) that want to communicate securely with each other. This means they want to ensure that the messages go to who they want it to go to (the other computer &amp;amp; not some random imposter-computer) and that the messages do NOT go to anyone else (like some spy-computer trying to steal the message).&lt;/p&gt;</description></item><item><title>A guide to charity</title><link>https://www.ashwinmenon.com/posts/activities/2018-09-18-a-guide-to-charity/</link><pubDate>Tue, 18 Sep 2018 19:22:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2018-09-18-a-guide-to-charity/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve always had a few thoughts about charity floating around in my head. This post is a way for me to record some of those thoughts.&lt;/p&gt;
&lt;h2 id="deciding-where-to-give"&gt;Deciding where to give&lt;/h2&gt;
&lt;p&gt;For me, this has been the most important question when donating any money/time/effort. If you have X dollars to donate, where should you donate this money?&lt;/p&gt;
&lt;h4 id="goal-1-effective-allocation"&gt;Goal 1: Effective allocation&lt;/h4&gt;
&lt;p&gt;No one wants to see their money wasted. The primary concerns I had were that the money would not be used appropriately (either the charity is a front for a scam, or just inefficient in the way it utilizes funds). This is solved well enough for my needs by sites like &lt;a href="https://www.givewell.org/charities/top-charities"&gt;GiveWell&lt;/a&gt;, and &lt;a href="https://www.givingwhatwecan.org/giving-recommendations/"&gt;Giving What We Can&lt;/a&gt;. These sites rank charities and give you an easily accessible list of charities that have the highest impact.&lt;/p&gt;</description></item><item><title>Optimizing Outlook</title><link>https://www.ashwinmenon.com/posts/activities/2018-04-11-optimizing-outlook/</link><pubDate>Wed, 11 Apr 2018 19:29:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2018-04-11-optimizing-outlook/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;They say &amp;ldquo;necessity is the mother of invention&amp;rdquo;. It&amp;rsquo;s incredible the power programming gives you. Maybe if the power-hungry learned how to program they could be constructive rather than destructive. Then again, the recent Facebook scandal makes you wonder.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;Stepping down a few rungs and we&amp;rsquo;re back to the little world I live in. For the past few days/weeks, I had been frustrated by the lack of mailbox space at work. 2 GB. &amp;ldquo;But, mail providers give you 15 GB for personal email nowadays!&amp;rdquo; I hear you say.&lt;/p&gt;</description></item><item><title>A rating system for table tennis</title><link>https://www.ashwinmenon.com/posts/activities/2018-03-12-a-rating-system-for-table-tennis/</link><pubDate>Mon, 12 Mar 2018 17:29:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2018-03-12-a-rating-system-for-table-tennis/</guid><description>&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;At work, during breaks, most of my team plays table-tennis. This weekend, I decided to spend some time writing up a rating system that I could use to keep track of how good (or bad) I (and everyone else) was. This is a writeup of how that exercise went. I&amp;rsquo;ve hidden a few lines to act as spoiler (indicated by an arrowhead to the left of the line). If you wish to exercise your mathematical skills, try making a guess and then click the line to reveal how I solved the problem.&lt;/p&gt;</description></item><item><title>The quiz-biz</title><link>https://www.ashwinmenon.com/posts/activities/2018-02-07-quiz-biz/</link><pubDate>Wed, 07 Feb 2018 23:17:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2018-02-07-quiz-biz/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;For a large part of my life, from when I was about 10 years old till I left college, I used to take part in quizzing competitions. A couple of times, I&amp;rsquo;ve had people ask me how they could start quizzing, or what preparing for a quiz would entail. This is a question I have some difficulty answering, because I have never really prepared for a quiz. In fact, procrastinating while trying to prepare is pretty much how I learned some of the different tidbits that have helped me win different quizzing competitions. Looking back at quizzes I&amp;rsquo;ve participated in the US, India and the UAE, I notice that in a manner somewhat evocative of the plot of &amp;ldquo;Slumdog Millionaire&amp;rdquo;, most of what I know is just due to &amp;ldquo;life&amp;rdquo;. An open mind, an inkling of inquisitiveness and a few fortuitous forays into (frankly) frivolous fields would aid anyone on a quest in the quizzing world. Here, I recount three snippets from life that helped me on the journey.&lt;/p&gt;</description></item><item><title>A guide to code reviews</title><link>https://www.ashwinmenon.com/posts/technical/2018-01-29-a-guide-to-code-reviews/</link><pubDate>Mon, 29 Jan 2018 01:34:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/2018-01-29-a-guide-to-code-reviews/</guid><description>&lt;p&gt;This here is a collection of things I&amp;rsquo;ve learned about reviewing code in the few years that I&amp;rsquo;ve worked as a software developer. As these are my thoughts, you should take them with at least a pinch of salt instead of at face value, as with most subjective things in life.&lt;/p&gt;
&lt;p&gt;When I first started, I reviewed code very differently from how I review code now. Despite this being a very important skill, it is not taught in high school or even college. Like with most other engineering skills, you&amp;rsquo;re tossed into the deep end and left to learn how to swim by yourself.&lt;/p&gt;</description></item><item><title>My weird walk to work</title><link>https://www.ashwinmenon.com/posts/activities/2017-10-10-my-weird-walk-to-work/</link><pubDate>Tue, 10 Oct 2017 19:01:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2017-10-10-my-weird-walk-to-work/</guid><description>&lt;h2 id="the-walk"&gt;The walk&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://www.ashwinmenon.com/assets/images/walk.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m sure a few other people do, or try to do this, so I&amp;rsquo;m not sure how unusual it is, but I thought I&amp;rsquo;d post about it regardless. I walk to work. Almost everyday. And usually (like a good engineer ;) ), if I do something repeatedly, I try to optimize it. With code, with life. So, now that it&amp;rsquo;s been a few months of walking to work in Seattle, I think I can present my learnings.&lt;/p&gt;</description></item><item><title>H*cking around</title><link>https://www.ashwinmenon.com/posts/technical/security/2017-09-23-hacking-around/</link><pubDate>Sat, 23 Sep 2017 22:29:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/security/2017-09-23-hacking-around/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;People think hacking requires a great deal of skill (on the part of the attacker) and/or a great deal of skill (on the part of the defender). This is quite clearly false. There are many simple ways to exploit a system. In this post, I detail some of the times I got access to accounts I shouldn&amp;rsquo;t have been able to get access to. While these are not the specific ways that a system&amp;rsquo;s bugs are taken advantage of, in general the principles hold true.&lt;/p&gt;</description></item><item><title>2FA, phishing and U2F</title><link>https://www.ashwinmenon.com/posts/technical/security/2017-09-06-2fa-phishing-and-yubikey/</link><pubDate>Wed, 06 Sep 2017 23:50:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/technical/security/2017-09-06-2fa-phishing-and-yubikey/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;As part of efforts to improve security, my workplace has issued us Yubikeys. What is a Yubikey? It&amp;rsquo;s a device you plug into your computer&amp;rsquo;s USB port and when you touch it for a few seconds, it spits out a string. This string is used for authentication (to identify you). The device has a capacitive sensor to detect touch, just like most phones today (old phones that used a &amp;ldquo;stylus&amp;rdquo; use resistive-touch based on resistors). A month or so ago, I saw a video/article stating that 2FA (two-factor authentication) was susceptible to phishing, and there exists a new proposal U2F that could fix that issue. I knew that the Yubikey supports U2F, but I didn&amp;rsquo;t understand how it solved the problem.&lt;/p&gt;</description></item><item><title>A guide to finances</title><link>https://www.ashwinmenon.com/posts/activities/2017-01-30-a-guide-to-finances/</link><pubDate>Mon, 30 Jan 2017 19:22:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2017-01-30-a-guide-to-finances/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;I write this article to provide an easy way for people just entering the workforce (many of my friends) to manage their finances. I also think this article would also be a good reference for me, and may prove interesting (in hindsight) in a few years. If you want to spend as little time as possible, skip to &lt;a href="#end"&gt;the end&lt;/a&gt;. I would appreciate comments if you find this useful.&lt;br&gt;
&lt;em&gt;Note: this is not going to be rigorous, but it should make a fair bit of sense. Also, this article is pretty US-centric, so if you live outside the US, this may just be a &amp;ldquo;fun read&amp;rdquo; (if you find finance &amp;ldquo;fun&amp;rdquo;).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Ashwin helps an Olympic medalist</title><link>https://www.ashwinmenon.com/posts/thoughts/2016-11-02-ashwin-helps-an-olympic-medalist/</link><pubDate>Wed, 02 Nov 2016 00:21:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2016-11-02-ashwin-helps-an-olympic-medalist/</guid><description>&lt;h3 id="part-1"&gt;Part 1&lt;/h3&gt;
&lt;p&gt;As an Indian watching the Olympics, there is not much to look forward to. The best in our one billion-strong nation don&amp;rsquo;t make it past the qualification criteria for most sports. And, when they do, they are usually found at the bottom of the standings - forming a solid base from which, &lt;em&gt;every&lt;/em&gt; Olympics, we moan the dearth of infrastructure and the deluge of corruption in India.&lt;/p&gt;
&lt;p&gt;The list of &lt;a href="http://www.medalspercapita.com/"&gt;medals won per capita&lt;/a&gt; at the Summer Olympics has India finishing last in Total Medals per Capita, Gold Medals per Capita and second-to-last (woot! woot!) in Weighted Medals per Capita, finishing ahead of that great Olympic nation - Iraq, who were nice enough to only win one bronze medal ever.&lt;/p&gt;</description></item><item><title>Love, Drugs And Rock N' Roll</title><link>https://www.ashwinmenon.com/posts/thoughts/2016-08-22-love-drugs-and-rock-n-roll/</link><pubDate>Mon, 22 Aug 2016 23:41:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2016-08-22-love-drugs-and-rock-n-roll/</guid><description>&lt;p&gt;[Disclaimer: I have no degrees in Psychology, Biology or Anthropology. I would love to receive comments, clarifications or corrections.]&lt;/p&gt;
&lt;h2 id="love"&gt;Love&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;I was never insane except upon occasions when my heart was touched&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edgar Allan Poe&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Love - a feeling succinctly defined by the Oxford dictionary as &amp;ldquo;an intense liking for another person&amp;rdquo;. An emotion intense enough to form the backdrop of literary and cinematic tragedies - Romeo and Juliet, &lt;a href="http://www.imdb.com/title/tt0338013/"&gt;Joel and Clementine&lt;/a&gt; and my personal favourite, Eloisa to Abelard&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;. What motivated the extreme actions taken by these characters? What could cause this unbearable wanting to be with another?&lt;/p&gt;</description></item><item><title>Let's talk about: The Olympics (Match Sprint)</title><link>https://www.ashwinmenon.com/posts/thoughts/2016-03-29-lets-talk-about-the-olympics-match-sprint/</link><pubDate>Tue, 29 Mar 2016 08:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2016-03-29-lets-talk-about-the-olympics-match-sprint/</guid><description>&lt;p&gt;Sprint: To race or move at full speed (Dictionary.com)&lt;/p&gt;
&lt;p&gt;Given the above definition, it shouldn&amp;rsquo;t surprise you that the fastest cyclists in a match sprint reach speeds as high as 70 km/h. Watching the event may leave you confused - it looks like they are fighting to lose the race. The sprint shown below looks, at times, like a slow-cycling event:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/n-ghrByKIO8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;What&amp;rsquo;s happening here is that being in second-place, right behind the leader, reduces drag (friction with the air) by quite a large amount - &lt;a href="http://www.designnews.com/author.asp?doc_id=246831"&gt;around 30%&lt;/a&gt;. Less drag means you cannot just race at full speed from the start. If you did, the cyclist in second-place would need to use less energy and can pull ahead in the final stretch to clinch first place. This adds another element to the race - the element of surprise. The leader has to constantly look behind to spot exactly when the other cyclist is going to &amp;ldquo;make his move&amp;rdquo;. Miss that moment, and your race may be done, like Chris Hoy learned &lt;a href="https://youtu.be/oI3qWekkYtI?t=172"&gt;here&lt;/a&gt;. Theo Bos, the winning cyclist, &lt;a href="https://youtu.be/RQ1j8sXtMqI?t=84"&gt;tried that again&lt;/a&gt;, but it didn&amp;rsquo;t work as well.&lt;/p&gt;</description></item><item><title>Let's talk about: Dinosaurs</title><link>https://www.ashwinmenon.com/posts/thoughts/2016-03-10-lets-talk-about-dinosaurs/</link><pubDate>Thu, 10 Mar 2016 02:08:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2016-03-10-lets-talk-about-dinosaurs/</guid><description>&lt;p&gt;Dinosaurs.&lt;/p&gt;
&lt;h2 id="intro---archosaurs"&gt;Intro - Archosaurs&lt;/h2&gt;
&lt;p&gt;We begin the journey around 250 million years ago, at the end of the Permian era, marked by the largest mass extinction in Earth&amp;rsquo;s history. The Permian-Triassic extinction event was catastrophic, claiming around 90 percent of marine life and 70 percent of life on land. Synapsids, animals that dominated the Permian landscape, were all but wiped out. A few trickled through, biding their time to regain their kingdom in a later era, but for now what was important was that life had entered the Triassic era - albeit barely.&lt;/p&gt;</description></item><item><title>The joy of tennis</title><link>https://www.ashwinmenon.com/posts/thoughts/2015-10-02-the-joy-of-tennis/</link><pubDate>Thu, 01 Oct 2015 03:08:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2015-10-02-the-joy-of-tennis/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Sports - activities where people try to prove they are better than others at an activity they wouldn&amp;rsquo;t be caught dead doing otherwise. Outside the world of sports, it would be ludicrous to find 11 people running behind a ball, but say you can do it better than any other set of 11 people, and the world will throw millions at you. While they might seem stupid if you try thinking about the higher purpose in the purpose of sports, you would be hard pressed to find someone not tuning in for &lt;em&gt;the big final&lt;/em&gt;. Not sure why that is. Maybe it&amp;rsquo;s the privilege of getting to see two masters battle it out to prove themselves. Or maybe it&amp;rsquo;s the vicarious wave of victory that sweeps over you when the underdog comes out on top. Or maybe it is the mawkish mess you find yourself reduced to when your team or your player &lt;em&gt;finally&lt;/em&gt; wins that coveted trophy. Or maybe it&amp;rsquo;s something else all together.&lt;/p&gt;</description></item><item><title>Probability and tennis</title><link>https://www.ashwinmenon.com/posts/activities/2015-05-31-probability-and-tennis/</link><pubDate>Sun, 31 May 2015 18:09:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2015-05-31-probability-and-tennis/</guid><description>&lt;h2 id="the-idea"&gt;The idea&lt;/h2&gt;
&lt;p&gt;The other day, while surfing Reddit, I came across a few comments that said having a 55% chance of winning a point would give you a 99% chance of winning the game. I&amp;rsquo;d heard this before, but this time I thought, &amp;ldquo;Hey! I can simulate that and see if it makes sense.&amp;rdquo; Seemed a bit unrealistic to me, that 50% would mean dead-even whereas 55% would mean a blowout.&lt;/p&gt;</description></item><item><title>First race</title><link>https://www.ashwinmenon.com/posts/activities/2015-05-12-first-race/</link><pubDate>Tue, 12 May 2015 22:09:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/activities/2015-05-12-first-race/</guid><description>&lt;p&gt;Ran my first race on May 2nd. A 20 km run around Lake Monona.&lt;/p&gt;
&lt;p&gt;Started off too fast - too confident despite not having trained since the end of March. Soon, I was tired enough that I would end up walking not insignificant distances throughout the race. Even with all the walking and the pleasant weather, 20 km was really exhausting. Not sure if it&amp;rsquo;s a Wisconsin thing, but two pints of beer is what you get after you cross the finish line. Just what you need when you&amp;rsquo;re dehydrated and exhausted as hell (I&amp;rsquo;m kidding).&lt;/p&gt;</description></item><item><title>Linear circuits</title><link>https://www.ashwinmenon.com/posts/reviews/2015-04-05-linear-circuits/</link><pubDate>Sun, 05 Apr 2015 23:40:00 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2015-04-05-linear-circuits/</guid><description>&lt;p&gt;&lt;a href="https://www.coursera.org/course/circuits"&gt;Link to course&lt;/a&gt;&lt;br&gt;
University: Georgia Institute of Technology&lt;br&gt;
Overall rating: 4/5&lt;br&gt;
Recommended if: You want to know what would be taught in your first circuits course in college or are just interested in refreshing what you learned about circuits.&lt;br&gt;
Level: Intro&lt;br&gt;
Good: Covers and explains the basics in an easy to understand manner. Discussion forums were helpful. Lots of numerical problems to ensure you understand a decent amount.&lt;br&gt;
Bad: Some topics are glossed over - like transformers and the wheatstone bridge. The lab is weak and boring, when similar courses have much better labs. Proofs and derivations are sacrificed in lieu of just providing a formula, more so as the course progresses.&lt;br&gt;
Interaction with other students: (4/5) A lot of interaction on the piazza forum, mainly due to a few students who were very active answering questions. An instructor goes through the forum fairly frequently too.&lt;br&gt;
Work assigned: (4/5) A good amount of homework and a quiz for each lesson too. Some homework questions (the &amp;ldquo;select all that are right&amp;rdquo; type) seem a little confusing and unnecessary. Though, everything considered, doing the work will help you understand better.&lt;br&gt;
Lectures: (3/5) Slides with an instructor speaking over them. Nothing too fancy, but not too shabby either.&lt;br&gt;
My final score: 100%&lt;/p&gt;</description></item><item><title>Dino 101</title><link>https://www.ashwinmenon.com/posts/reviews/2015-03-16-dino-101/</link><pubDate>Mon, 16 Mar 2015 23:35:32 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2015-03-16-dino-101/</guid><description>&lt;p&gt;&lt;a href="https://www.coursera.org/course/dino101"&gt;Link to course&lt;/a&gt;&lt;br&gt;
University: University of Alberta&lt;br&gt;
Overall rating: 4/5&lt;br&gt;
Recommended if: You are mildly interested in dinosaurs, evolution or animals. Also, if you would like to know what paleontologists do.&lt;br&gt;
Level: Intro&lt;br&gt;
Good: A great intro to dinosaurs and paleontology. The instructors take feedback seriously and have changed the course since the first offering.&lt;br&gt;
Bad: Wish it went into more detail and was more challenging. It felt like a course without a lot of college level content. More like a fun documentary. Practical/lab work is limited - you may say understandably so.&lt;br&gt;
Interaction with other students: (3/5) Discussion forums are fairly active and there are some interesting discussions held. Instructor participation is minimal.&lt;br&gt;
Work assigned: (2/5) Very little. Should take you around 10 minutes to get a full score on all assignments. No lab work, no assignments other than a multiple-choice quiz for each lesson.&lt;br&gt;
Lectures: (4/5) Well produced and informative. The artwork during the lectures is great too. Some lectures may be a tad bit too long.&lt;br&gt;
My final score: 99%&lt;/p&gt;</description></item><item><title>Learning how to Learn</title><link>https://www.ashwinmenon.com/posts/reviews/2015-03-08-learning-how-to-learn/</link><pubDate>Sun, 08 Mar 2015 12:35:32 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/reviews/2015-03-08-learning-how-to-learn/</guid><description>&lt;p&gt;&lt;a href="https://www.coursera.org/learn/learning-how-to-learn"&gt;Link to course&lt;/a&gt; (Now self-paced)&lt;br&gt;
University: UCSD&lt;br&gt;
Overall rating: 2/5&lt;br&gt;
Recommended if: you like self-help.&lt;br&gt;
Level: Easier than an intro&lt;br&gt;
Good: Organized, has a structure.&lt;br&gt;
Bad: Nothing that can&amp;rsquo;t be learned by browsing the web while procrastinating.&lt;br&gt;
Interaction with other students: (3/5) Fair amount of discussion on the forums.&lt;br&gt;
Work assigned: (1/5) Just some written assignments. Don&amp;rsquo;t feel like it really helped you &lt;em&gt;learn&lt;/em&gt; the content (oddly enough).&lt;br&gt;
Lectures: (2/5) A bit like watching a documentary, except a little more academic. I&amp;rsquo;d rather get this info from a BBC documentary. The stuff that wasn&amp;rsquo;t tested (interviews and such) were more interesting.&lt;br&gt;
My final score: Dropped out. Not worth it.&lt;/p&gt;</description></item><item><title>First post</title><link>https://www.ashwinmenon.com/posts/thoughts/2015-03-05-first-post/</link><pubDate>Thu, 05 Mar 2015 19:35:32 +0000</pubDate><guid>https://www.ashwinmenon.com/posts/thoughts/2015-03-05-first-post/</guid><description>&lt;p&gt;Hi, and welcome to my blog.&lt;/p&gt;
&lt;p&gt;Here, I will keep you up to date on the things I am working on. Hope you enjoy your stay.&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/about/</guid><description>I write for people younger than me, in the hope they can gain from what I've learned through experience. I believe sharing knowledge is one of the greatest accelerants for societal progress. The printing press was revolutionary precisely because you didn't have to experience things to learn from them - you could simply read about others' experiences. Even works of fiction are great because they allow you to experience distant worlds - worlds that don't exist, worlds separated in time and location. I was not alive during the English Civil War, but thanks to the magic of books, I can place myself as a member of society experiencing that period of upheaval.

&lt;br/&gt;
&lt;br/&gt;

In recent times, the internet has supercharged this. There existed a balance: the young had the better capacity to learn, but the old had more material (years of experience) to learn from. The internet is the great equalizer in the battle between neural plasticity and experience. When a seventeen-year-old today can access the accumulated knowledge of centuries, the gap closes fast. As evidence, you can look up how much younger the top ten chess players of today are compared to fifty years ago.

&lt;br/&gt;
&lt;br/&gt;

Respect for elders across cultures is a reflection of the advantage that age once brought. In today's world, that advantage is greatly diminished, and society needs to shift respect away from experience and towards the pursuit of knowledge and the truth. This blog, at times, is my contribution to that grand process towards progress.</description></item><item><title/><link>https://www.ashwinmenon.com/benchmarks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/benchmarks/</guid><description>&lt;h2 id="benchmarks"&gt;Benchmarks&lt;/h2&gt;
&lt;p&gt;Freemotion bike, level 7, 5.78 miles, 20 mins, 78 rpm, 190 cal&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/clean_logs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/clean_logs/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;title&gt;Log Cleaner&lt;/title&gt;
 &lt;style&gt;
 body { font-family: sans-serif; padding: 20px; max-width: 900px; }
 textarea { width: 100%; height: 250px; margin-top: 10px; font-family: monospace; }
 button { padding: 10px 20px; margin-top: 20px; font-size: 16px; cursor: pointer; }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h2&gt;Paste Logs&lt;/h2&gt;
&lt;textarea id="inputLogs"&gt;&lt;/textarea&gt;

&lt;button id="cleanBtn"&gt;Clean Logs&lt;/button&gt;

&lt;h2&gt;Cleaned Output&lt;/h2&gt;
&lt;textarea id="outputLogs"&gt;&lt;/textarea&gt;

&lt;script&gt;
 function cleanLine(line) {
 // Remove "&lt;anything&gt;:&lt;number&gt; " at start of line
 return line.replace(/^[^\s:]+:\d+\s*/, "");
 }

 document.getElementById("cleanBtn").onclick = function () {
 const raw = document.getElementById("inputLogs").value;

 const cleaned = raw
 .split("\n")
 .map(cleanLine)
 .join("\n");

 document.getElementById("outputLogs").value = cleaned;
 };
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/bookmarks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/bookmarks/</guid><description>&lt;p&gt;The &amp;ldquo;old&amp;rdquo; internet: &lt;a href="https://projects.kwon.nyc/internet-is-fun/"&gt;https://projects.kwon.nyc/internet-is-fun/&lt;/a&gt;
Networking:
&lt;a href="https://twitter.com/iximiuz/status/1859339483390296354"&gt;https://twitter.com/iximiuz/status/1859339483390296354&lt;/a&gt;
&lt;a href="https://fabiensanglard.net/quake3/network.php"&gt;https://fabiensanglard.net/quake3/network.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;AI:
&lt;a href="https://www.cs.toronto.edu/~duvenaud/distill_bayes_net/public/"&gt;https://www.cs.toronto.edu/~duvenaud/distill_bayes_net/public/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;WebRTC: &lt;a href="https://twitter.com/arcinston/status/1858603234455126441"&gt;https://twitter.com/arcinston/status/1858603234455126441&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;DL:
&lt;a href="https://fleuret.org/francois/lbdl.html"&gt;https://fleuret.org/francois/lbdl.html&lt;/a&gt;
&lt;a href="https://fleuret.org/dlc/"&gt;https://fleuret.org/dlc/&lt;/a&gt;
&lt;a href="https://spinningup.openai.com/"&gt;https://spinningup.openai.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;s3
&lt;a href="https://simonwillison.net/2024/Nov/26/s3-conditional-writes/"&gt;https://simonwillison.net/2024/Nov/26/s3-conditional-writes/&lt;/a&gt;
&lt;a href="https://docs.google.com/document/d/1yzLXSOtzBXyaWHfeVsWsMu4xmOH8rV6QyM5ZAnJZjMQ/edit?tab=t.0#heading=h.yhvnt89pggpj"&gt;https://docs.google.com/document/d/1yzLXSOtzBXyaWHfeVsWsMu4xmOH8rV6QyM5ZAnJZjMQ/edit?tab=t.0#heading=h.yhvnt89pggpj&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;data structures
&lt;a href="https://x.com/debasishg/status/1858560338456952998"&gt;https://x.com/debasishg/status/1858560338456952998&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Observability
&lt;a href="https://news.ycombinator.com/item?id=39529775"&gt;https://news.ycombinator.com/item?id=39529775&lt;/a&gt;
&lt;a href="https://www.honeycomb.io/blog/how-are-structured-logs-different-from-events"&gt;https://www.honeycomb.io/blog/how-are-structured-logs-different-from-events&lt;/a&gt;
&lt;a href="https://x.com/mipsytipsy/status/1858341191932338354"&gt;https://x.com/mipsytipsy/status/1858341191932338354&lt;/a&gt;
&lt;a href="https://www.honeycomb.io/blog/get-infinite-custom-metrics-for-free"&gt;https://www.honeycomb.io/blog/get-infinite-custom-metrics-for-free&lt;/a&gt;
&lt;a href="https://x.com/mipsytipsy/status/1857626227634524541"&gt;https://x.com/mipsytipsy/status/1857626227634524541&lt;/a&gt;
&lt;a href="https://x.com/walktothesun/status/1837657459869339834"&gt;https://x.com/walktothesun/status/1837657459869339834&lt;/a&gt;
&lt;a href="https://x.com/mipsytipsy/status/1857599831470125461"&gt;https://x.com/mipsytipsy/status/1857599831470125461&lt;/a&gt;
&lt;a href="https://bsky.app/profile/mipsytipsy.bsky.social/post/3l77h7eyfwe2b"&gt;https://bsky.app/profile/mipsytipsy.bsky.social/post/3l77h7eyfwe2b&lt;/a&gt;
&lt;a href="https://jeremymorrell.dev/blog/a-practitioners-guide-to-wide-events/"&gt;https://jeremymorrell.dev/blog/a-practitioners-guide-to-wide-events/&lt;/a&gt;
&lt;a href="https://bsky.app/profile/jeremymorrell.dev/post/3lasvhflczb2u"&gt;https://bsky.app/profile/jeremymorrell.dev/post/3lasvhflczb2u&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bluesky
&lt;a href="https://x.com/Werner/status/1859611503537594880"&gt;https://x.com/Werner/status/1859611503537594880&lt;/a&gt;
&lt;a href="https://newsletter.pragmaticengineer.com/p/bluesky-engineering-culture"&gt;https://newsletter.pragmaticengineer.com/p/bluesky-engineering-culture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Access tokens
&lt;a href="https://twitter.com/gunnarmorling/status/1860961333409104353"&gt;https://twitter.com/gunnarmorling/status/1860961333409104353&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Caching
&lt;a href="https://x.com/hnasr/status/1861197188371751021"&gt;https://x.com/hnasr/status/1861197188371751021&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Design/architecture
&lt;a href="https://thefrugalarchitect.com/"&gt;https://thefrugalarchitect.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Testing
&lt;a href="https://til.simonwillison.net/pytest/pytest-recording-vcr"&gt;https://til.simonwillison.net/pytest/pytest-recording-vcr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LLM/genai
&lt;a href="https://elk.zone/techhub.social/@simon@simonwillison.net/113539371054898619"&gt;https://elk.zone/techhub.social/@simon@simonwillison.net/113539371054898619&lt;/a&gt;
&lt;a href="https://elk.zone/techhub.social/@simon@simonwillison.net/113541020246317028"&gt;https://elk.zone/techhub.social/@simon@simonwillison.net/113541020246317028&lt;/a&gt;
&lt;a href="https://blog.dottxt.co/coalescence.html"&gt;https://blog.dottxt.co/coalescence.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Databases
&lt;a href="https://www.scylladb.com/2024/11/25/database-internals-working-with-io/"&gt;https://www.scylladb.com/2024/11/25/database-internals-working-with-io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Formal methods
&lt;a href="https://cacm.acm.org/research/how-amazon-web-services-uses-formal-methods/"&gt;https://cacm.acm.org/research/how-amazon-web-services-uses-formal-methods/&lt;/a&gt;
&lt;a href="https://www.datadoghq.com/blog/engineering/formal-modeling-and-simulation/"&gt;https://www.datadoghq.com/blog/engineering/formal-modeling-and-simulation/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Deterministic simulation testing
&lt;a href="https://notes.eatonphil.com/2024-08-20-deterministic-simulation-testing.html"&gt;https://notes.eatonphil.com/2024-08-20-deterministic-simulation-testing.html&lt;/a&gt;
&lt;a href="https://www.warpstream.com/blog/deterministic-simulation-testing-for-our-entire-saas"&gt;https://www.warpstream.com/blog/deterministic-simulation-testing-for-our-entire-saas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Distributed counter
&lt;a href="https://netflixtechblog.com/netflixs-distributed-counter-abstraction-8d0c45eb66b2"&gt;https://netflixtechblog.com/netflixs-distributed-counter-abstraction-8d0c45eb66b2&lt;/a&gt;
&lt;a href="https://news.ycombinator.com/item?id=42129097"&gt;https://news.ycombinator.com/item?id=42129097&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Serverless
&lt;a href="https://developers.podcast.go-aws.com/web/podcasts/episode_137/index.html"&gt;https://developers.podcast.go-aws.com/web/podcasts/episode_137/index.html&lt;/a&gt;
&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/foundation-progmodel.html"&gt;https://docs.aws.amazon.com/lambda/latest/dg/foundation-progmodel.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Career framework
&lt;a href="https://dropbox.github.io/dbx-career-framework/"&gt;https://dropbox.github.io/dbx-career-framework/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Interactive
&lt;a href="https://www.boot.dev/tracks/backend"&gt;https://www.boot.dev/tracks/backend&lt;/a&gt;
cryptopals
codecrafters
&lt;a href="https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/18-blocks/lessons/51-new-lesson"&gt;https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/18-blocks/lessons/51-new-lesson&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://app.codecrafters.io/"&gt;https://app.codecrafters.io/&lt;/a&gt;
&lt;a href="https://www.deep-ml.com/"&gt;https://www.deep-ml.com/&lt;/a&gt;
&lt;a href="https://viewsourcecode.org/snaptoken/kilo/index.html"&gt;https://viewsourcecode.org/snaptoken/kilo/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;web
&lt;a href="https://elk.zone/techhub.social/@b0rk_reruns@jvns.ca/113544995299428026"&gt;https://elk.zone/techhub.social/@b0rk_reruns@jvns.ca/113544995299428026&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Leadership/non-technical
&lt;a href="https://x.com/scarletinked/status/1861053227472478317"&gt;https://x.com/scarletinked/status/1861053227472478317&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Papers
&lt;a href="https://ia802709.us.archive.org/12/items/polya-how-to-solve-it/Polya%20-%20How%20to%20solve%20it.pdf"&gt;https://ia802709.us.archive.org/12/items/polya-how-to-solve-it/Polya%20-%20How%20to%20solve%20it.pdf&lt;/a&gt;
On writing (low prio): &lt;a href="https://screencraft.org/wp-content/uploads/2018/03/David-Mamet-Memo.pdf"&gt;https://screencraft.org/wp-content/uploads/2018/03/David-Mamet-Memo.pdf&lt;/a&gt;
&lt;a href="https://arxiv.org/pdf/1409.0003"&gt;https://arxiv.org/pdf/1409.0003&lt;/a&gt;
&lt;a href="https://samoburja.com/gft/"&gt;https://samoburja.com/gft/&lt;/a&gt;
(low prio): &lt;a href="https://worrydream.com/refs/Nelson_T_1974_-_Computer_Lib,_Dream_Machines.pdf"&gt;https://worrydream.com/refs/Nelson_T_1974_-_Computer_Lib,_Dream_Machines.pdf&lt;/a&gt;
(low prio): &lt;a href="https://www.maths.ed.ac.uk/~v1ranick/papers/wigner.pdf"&gt;https://www.maths.ed.ac.uk/~v1ranick/papers/wigner.pdf&lt;/a&gt;
&lt;a href="https://archive.org/details/zero-to-one-book"&gt;https://archive.org/details/zero-to-one-book&lt;/a&gt;
&lt;a href="https://med.emory.edu/departments/neurology/_documents/cousteau_swimming_sharks.pdf"&gt;https://med.emory.edu/departments/neurology/_documents/cousteau_swimming_sharks.pdf&lt;/a&gt;&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/dravidian/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/dravidian/</guid><description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Ullatan_language"&gt;https://en.wikipedia.org/wiki/Ullatan_language&lt;/a&gt;
&lt;a href="https://en.wikipedia.org/wiki/Thachanadan_language"&gt;https://en.wikipedia.org/wiki/Thachanadan_language&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=kXPc4KogBtQ"&gt;https://www.youtube.com/watch?v=kXPc4KogBtQ&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=FEB9y7yqj9o"&gt;https://www.youtube.com/watch?v=FEB9y7yqj9o&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=Wai9EaylkRQ"&gt;https://www.youtube.com/watch?v=Wai9EaylkRQ&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=RhqGD362nso"&gt;https://www.youtube.com/watch?v=RhqGD362nso&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=xp06DP-LcN4"&gt;https://www.youtube.com/watch?v=xp06DP-LcN4&lt;/a&gt;
&lt;a href="https://en.wikipedia.org/wiki/Vishavan_language"&gt;https://en.wikipedia.org/wiki/Vishavan_language&lt;/a&gt;
&lt;a href="https://en.wikipedia.org/wiki/Wayanad_Chetti_language"&gt;https://en.wikipedia.org/wiki/Wayanad_Chetti_language&lt;/a&gt;&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/future-post-ideas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/future-post-ideas/</guid><description>&lt;p&gt;CoffeeStudy
PeanutExperiment
Ones Complement
JVM working
Sound digitization (Other senses)
What is a kernel (linux)?
collaborative book&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/indianenglish/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/indianenglish/</guid><description>&lt;p&gt;Loose motion
Bunk
Hill station
Dickey
Doubt
Ladies finger
Hostel
Footpath
Creche
Tiffin
Prepone
Banian
To check:
Brinjal
Garage
Garbage/Trash
Servant/maid
Cradle
Nipple (pacifier)
Increment
Bumper
Bogey
Running shoes&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/jpeg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/jpeg/</guid><description>&lt;p&gt;Understanding JPEG&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/DavidBuchanan314/c05a834c485af83f51c25c81c35974ce"&gt;https://gist.github.com/DavidBuchanan314/c05a834c485af83f51c25c81c35974ce&lt;/a&gt;
&lt;a href="https://bsky.app/profile/retr0.id/post/3lbscemto2c2h"&gt;https://bsky.app/profile/retr0.id/post/3lbscemto2c2h&lt;/a&gt;&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/quotes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/quotes/</guid><description>&lt;p&gt;&amp;ldquo;I feel really alone. Whether it was a democratic country or an authoritarian country, all of them acted the same when it came to us. I discovered that my humanity is a subject of discussion. Should I be killed in the street or not be killed? Based on the interests of the United States or Saudi Arabia or other countries. It&amp;rsquo;s the killing of a dream&amp;rdquo; - &lt;a href="https://youtu.be/xaTKDMYOBOU?list=PLJ8cMiYb3G5eqy5GUl0V3MFUSiMyPF8qp"&gt;https://youtu.be/xaTKDMYOBOU?list=PLJ8cMiYb3G5eqy5GUl0V3MFUSiMyPF8qp&lt;/a&gt;&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/songcategorization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/songcategorization/</guid><description>&lt;p&gt;Falling in love
You are the one that I want
Summer nights
Andar conmigo
Quelqu&amp;rsquo;un ma dit
Eres para mi
Mi tesoro
Head over feet
Que veux tu
Espacio sideral
Ojos as�
Rosas
Lento
Gotitas de amor
No soy una de esas
Me quiero enamorar
Something just like this&lt;/p&gt;
&lt;p&gt;In love
Limon y sal
Chocolate
A Dios le pido
Me llora el cielo
Fast car&lt;/p&gt;
&lt;p&gt;Break up songs:
Heading towards
Slow dancing in a burning room
Con qui�n se queda el perro&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/drafts/testsfor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/drafts/testsfor/</guid><description>&lt;p&gt;X &amp;amp; O&lt;/p&gt;
&lt;p&gt;fingers in hand&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/lennon-or-mccartney/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/lennon-or-mccartney/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;title&gt;Beatles Song Preference Analyzer&lt;/title&gt;
 &lt;style&gt;
 body {
 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
 max-width: 800px;
 margin: 0 auto;
 padding: 20px;
 background-color: #f5f5f5;
 color: #333;
 }
 h1 {
 color: #b22222;
 text-align: center;
 margin-bottom: 30px;
 }
 .tabs {
 display: flex;
 margin-bottom: 20px;
 border-bottom: 1px solid #ddd;
 }
 .tab {
 padding: 10px 20px;
 cursor: pointer;
 background-color: #e0e0e0;
 margin-right: 5px;
 border-radius: 5px 5px 0 0;
 }
 .tab.active {
 background-color: #b22222;
 color: white;
 }
 .tab-content {
 display: none;
 padding: 20px;
 background-color: white;
 border-radius: 0 0 5px 5px;
 box-shadow: 0 2px 5px rgba(0,0,0,0.1);
 }
 .tab-content.active {
 display: block;
 }
 .song-container {
 display: flex;
 justify-content: space-between;
 margin-top: 20px;
 }
 .song-card {
 width: 48%;
 padding: 20px;
 background-color: white;
 border-radius: 10px;
 box-shadow: 0 2px 8px rgba(0,0,0,0.1);
 text-align: center;
 cursor: pointer;
 transition: transform 0.2s;
 }
 .song-card:hover {
 transform: translateY(-5px);
 box-shadow: 0 5px 15px rgba(0,0,0,0.1);
 }
 .listen-link {
 margin-top: 15px;
 }
 .listen-link a {
 color: #b22222;
 text-decoration: none;
 font-size: 0.9em;
 }
 .listen-link a:hover {
 text-decoration: underline;
 }
 .song-title {
 font-weight: bold;
 font-size: 1.2em;
 margin-bottom: 10px;
 }
 .preference-display {
 margin: 20px 0;
 padding: 15px;
 background-color: white;
 border-radius: 10px;
 box-shadow: 0 2px 8px rgba(0,0,0,0.1);
 text-align: center;
 font-size: 1.2em;
 }
 table {
 width: 100%;
 border-collapse: collapse;
 }
 th, td {
 padding: 10px;
 text-align: left;
 border-bottom: 1px solid #ddd;
 }
 th {
 background-color: #f5f5f5;
 }
 .uncertain {
 font-style: italic;
 color: #777;
 }
 .toggle-container {
 margin: 20px 0;
 text-align: center;
 }
 .toggle-button {
 background-color: #b22222;
 color: white;
 border: none;
 padding: 10px 15px;
 border-radius: 5px;
 cursor: pointer;
 font-size: 0.9em;
 transition: background-color 0.2s;
 }
 .toggle-button:hover {
 background-color: #8b0000;
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;h1&gt;Beatles Song Preference Analyzer&lt;/h1&gt;

 &lt;div class="tabs"&gt;
 &lt;div class="tab active" data-tab="comparison"&gt;Song Comparison&lt;/div&gt;
 &lt;div class="tab" data-tab="history"&gt;Selection History&lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="tab-content active" id="comparison-tab"&gt;
 &lt;div class="preference-display" id="preference-display"&gt;
 Begin selecting songs to determine your preference
 &lt;/div&gt;

 &lt;div class="toggle-container"&gt;
 &lt;button hidden="true" class="toggle-button" id="toggle-algorithm"&gt;Switch to Alternate Algorithm&lt;/button&gt;
 &lt;/div&gt;

 &lt;div class="song-container" id="song-choices"&gt;
 &lt;div class="song-card" id="song-a"&gt;
 &lt;div class="song-title"&gt;Song A&lt;/div&gt;
 &lt;div class="listen-link"&gt;&lt;a href="#" target="_blank"&gt;Listen to the song&lt;/a&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="song-card" id="song-b"&gt;
 &lt;div class="song-title"&gt;Song B&lt;/div&gt;
 &lt;div class="listen-link"&gt;&lt;a href="#" target="_blank"&gt;Listen to the song&lt;/a&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="tab-content" id="history-tab"&gt;
 &lt;table id="history-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Round&lt;/th&gt;
 &lt;th&gt;Song A&lt;/th&gt;
 &lt;th&gt;Song B&lt;/th&gt;
 &lt;th&gt;Your Choice&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody id="history-body"&gt;
 &lt;!-- History entries will be added here --&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 // Beatles songs data with Lennon/McCartney contribution percentages
 const beatlesSongs = [
 {
 title: "A Day in the Life",
 lennon: 60,
 mccartney: 40,
 george: 0,
 uncertain: false
 },
 {
 title: "A Hard Day's Night",
 lennon: 80,
 mccartney: 20,
 george: 0,
 uncertain: false
 },
 {
 title: "Across the Universe",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "All My Loving",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "All You Need Is Love",
 lennon: 90,
 mccartney: 10,
 george: 0,
 uncertain: false
 },
 {
 title: "And I Love Her",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Back in the U.S.S.R.",
 lennon: 30,
 mccartney: 70,
 george: 0,
 uncertain: false
 },
 {
 title: "Blackbird",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Can't Buy Me Love",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Come Together",
 lennon: 90,
 mccartney: 10,
 george: 0,
 uncertain: false
 },
 {
 title: "Day Tripper",
 lennon: 60,
 mccartney: 40,
 george: 0,
 uncertain: false
 },
 {
 title: "Eleanor Rigby",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Eight Days a Week",
 lennon: 30,
 mccartney: 70,
 george: 0,
 uncertain: false
 },
 {
 title: "Getting Better",
 lennon: 30,
 mccartney: 70,
 george: 0,
 uncertain: false
 },
 {
 title: "Help!",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "Hello, Goodbye",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Hey Jude",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "I Am the Walrus",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "I Feel Fine",
 lennon: 80,
 mccartney: 20,
 george: 0,
 uncertain: false
 },
 {
 title: "I Want to Hold Your Hand",
 lennon: 50,
 mccartney: 50,
 george: 0,
 uncertain: false
 },
 {
 title: "I'm Looking Through You",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "In My Life",
 lennon: 80,
 mccartney: 20,
 george: 0,
 uncertain: true
 },
 {
 title: "Let It Be",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Lucy in the Sky with Diamonds",
 lennon: 90,
 mccartney: 10,
 george: 0,
 uncertain: false
 },
 {
 title: "Norwegian Wood",
 lennon: 90,
 mccartney: 10,
 george: 0,
 uncertain: false
 },
 {
 title: "Nowhere Man",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "Ob-La-Di, Ob-La-Da",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Paperback Writer",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Penny Lane",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Revolution",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "Sgt. Pepper's Lonely Hearts Club Band",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Strawberry Fields Forever",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "The Ballad of John and Yoko",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "The Long and Winding Road",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Tomorrow Never Knows",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "We Can Work It Out",
 lennon: 30,
 mccartney: 70,
 george: 0,
 uncertain: false
 },
 {
 title: "While My Guitar Gently Weeps",
 lennon: 0,
 mccartney: 0,
 george: 100,
 uncertain: false
 },
 {
 title: "Yellow Submarine",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Yesterday",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "Something",
 lennon: 0,
 mccartney: 0,
 george: 100,
 uncertain: false
 },
 {
 title: "Here Comes the Sun",
 lennon: 0,
 mccartney: 0,
 george: 100,
 uncertain: false
 },
 {
 title: "Taxman",
 lennon: 0,
 mccartney: 0,
 george: 100,
 uncertain: false
 },
 {
 title: "If I Needed Someone",
 lennon: 0,
 mccartney: 0,
 george: 100,
 uncertain: false
 },
 {
 title: "Hey Bulldog",
 lennon: 90,
 mccartney: 10,
 george: 0,
 uncertain: false
 },
 {
 title: "I'm So Tired",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 },
 {
 title: "Martha My Dear",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "For No One",
 lennon: 0,
 mccartney: 100,
 george: 0,
 uncertain: false
 },
 {
 title: "She's Leaving Home",
 lennon: 20,
 mccartney: 80,
 george: 0,
 uncertain: false
 },
 {
 title: "Drive My Car",
 lennon: 20,
 mccartney: 80,
 george: 0,
 uncertain: false
 },
 {
 title: "I'm Only Sleeping",
 lennon: 100,
 mccartney: 0,
 george: 0,
 uncertain: false
 }
 ];

 // Variables to track user preferences
 let round = 1;
 let history = [];
 let currentSongA = null;
 let currentSongB = null;

 // Flag to determine which algorithm to use
 let useAlternateAlgorithm = false;

 // Song data structure for preference calculation
 const songData = {};
 // Preferences storage for calculating score
 const userPreferences = [];
 // Comparisons for alternate algorithm
 const comparisons = [];

 // Function to get non-George songs
 function getNonGeorgeSongs() {
 return beatlesSongs.filter(song =&gt; song.george === 0);
 }

 // Function to get two random songs that are not by George
 function getTwoRandomSongs() {
 const nonGeorgeSongs = getNonGeorgeSongs();
 const randomIndices = getRandomIndices(nonGeorgeSongs.length, 2);
 return [nonGeorgeSongs[randomIndices[0]], nonGeorgeSongs[randomIndices[1]]];
 }

 // Function to get random indices
 function getRandomIndices(max, count) {
 const indices = [];
 while (indices.length &lt; count) {
 const randomIndex = Math.floor(Math.random() * max);
 if (!indices.includes(randomIndex)) {
 indices.push(randomIndex);
 }
 }
 return indices;
 }

 // Function to display songs
 function displaySongs() {
 const songs = getTwoRandomSongs();
 currentSongA = songs[0];
 currentSongB = songs[1];

 const songAElement = document.getElementById('song-a');
 const songBElement = document.getElementById('song-b');

 songAElement.querySelector('.song-title').textContent = currentSongA.title;
 songBElement.querySelector('.song-title').textContent = currentSongB.title;

 // Update YouTube links
 const youtubeSearchA = `https://www.youtube.com/results?search_query=${encodeURIComponent('The Beatles ' + currentSongA.title)}`;
 const youtubeSearchB = `https://www.youtube.com/results?search_query=${encodeURIComponent('The Beatles ' + currentSongB.title)}`;

 songAElement.querySelector('.listen-link a').href = youtubeSearchA;
 songBElement.querySelector('.listen-link a').href = youtubeSearchB;

 // Add click event listeners
 songAElement.onclick = () =&gt; selectSong('A');
 songBElement.onclick = () =&gt; selectSong('B');
 }

 // Function to update preferences
 function updatePreferences(selectedSong) {
 const otherSong = selectedSong === 'A' ? 'B' : 'A';
 const selectedData = selectedSong === 'A' ? currentSongA : currentSongB;
 const otherData = selectedSong === 'A' ? currentSongB : currentSongA;

 // Update song data for preference calculation
 if (!songData[selectedData.title]) {
 songData[selectedData.title] = {
 A: selectedData.mccartney, // McCartney as Person A
 B: selectedData.lennon // Lennon as Person B
 };
 }

 if (!songData[otherData.title]) {
 songData[otherData.title] = {
 A: otherData.mccartney, // McCartney as Person A
 B: otherData.lennon // Lennon as Person B
 };
 }

 // Store user preference pair for original algorithm
 userPreferences.push([selectedData.title, otherData.title]);

 // Store comparison for alternate algorithm
 comparisons.push({
 A_i: selectedData.mccartney,
 B_i: selectedData.lennon,
 A_j: otherData.mccartney,
 B_j: otherData.lennon,
 preferIOverJ: selectedSong === 'A'
 });

 // Update history
 history.push({
 round,
 songA: currentSongA.title,
 songB: currentSongB.title,
 lennon_A: currentSongA.lennon,
 mccartney_A: currentSongA.mccartney,
 lennon_B: currentSongB.lennon,
 mccartney_B: currentSongB.mccartney,
 choice: selectedSong
 });

 // Update history display
 updateHistoryDisplay();

 // Update preference display
 updatePreferenceDisplay();

 // Increment round
 round++;

 // Display new songs
 displaySongs();
 }

 // Function to select a song
 function selectSong(song) {
 updatePreferences(song);
 }

 /**
 * Given pairwise comparisons of songs (each with A and B scores),
 * infer how much you like B over A, then convert to a percentage.
 */
 function inferPreferencePercent(comparisons) {
 const lows = [];
 const highs = [];
 const deltas = [];

 comparisons.forEach(({ A_i, B_i, A_j, B_j, preferIOverJ }) =&gt; {
 const sign = preferIOverJ ? 1 : -1;
 const dA = (A_i - A_j) * sign;
 const dB = (B_i - B_j) * sign;
 deltas.push({ dA, dB });

 if (dB &gt; 0) {
 lows.push(-dA / dB);
 } else if (dB &lt; 0) {
 highs.push(-dA / dB);
 }
 });

 const L = lows.length ? Math.max(...lows) : -0.5;
 const U = highs.length ? Math.min(...highs) : 0.5;

 let w;
 if (L &lt; U) {
 // consistent: pick midpoint of feasible interval
 w = (L + U) / 2;
 } else {
 // inconsistent: least‐squares fallback
 const num = deltas.reduce((sum, { dA, dB }) =&gt; sum + dA * dB, 0);
 const den = deltas.reduce((sum, { dB }) =&gt; sum + dB * dB, 0);
 w = den === 0 ? 1 : -num / den;
 }
 console.log(lows);
 console.log(highs);

 // convert to percent difference
 const percent = w &gt;= 1 ? (w - 1) * 100 : -(1 - w) * 100;
 return { w, percent };
 }

 /**
 * Calculates a preference score for Person B (Lennon) over Person A (McCartney) based on song preferences.
 */
 function calculatePreferenceScore(songs, preferences) {
 // Step 2: Calculate Net Contribution Difference for Each Song
 const netContributions = {};
 for (const songName in songs) {
 if (Object.hasOwnProperty.call(songs, songName)) {
 const contributions = songs[songName];
 // Check if A and B contributions exist, default to 0 if not
 const contributionA = contributions.A || 0;
 const contributionB = contributions.B || 0;
 // Net B Contribution = B's contribution - A's contribution
 netContributions[songName] = contributionB - contributionA;
 }
 }

 // Step 3: Process Each Preference
 let totalPreferenceSignal = 0;
 let comparisonCount = 0;
 let totalWeight = 0.1;
 console.log(preferences);

 for (const preferencePair of preferences) {
 const preferredSong = preferencePair[0];
 const nonPreferredSong = preferencePair[1];

 // Ensure both songs exist in our calculated net contributions
 if (
 netContributions.hasOwnProperty(preferredSong) &amp;&amp;
 netContributions.hasOwnProperty(nonPreferredSong)
 ) {
 const netPreferred = netContributions[preferredSong];
 const netNonPreferred = netContributions[nonPreferredSong];

 // Calculate the signal for this preference pair
 // Signal = (Net Contribution of Preferred) - (Net Contribution of Non-Preferred)
 const signal = netPreferred - netNonPreferred;

 totalPreferenceSignal += signal;
 comparisonCount++;
 // weight by magnitude: bigger swings count more
 if (signal !== 0) {
 totalPreferenceSignal += signal;
 totalWeight += Math.abs(signal);
 } else {
 console.warn(
 `Skipping neutral comparison [${preferredSong}, ${nonPreferredSong}] — net=${netPreferred}.`
 );
 }
 } else {
 console.warn(
 `Skipping preference pair: [${preferredSong}, ${nonPreferredSong}] as one or both songs were not found in the songs list.`
 );
 }
 }

 // Step 4: Calculate Average Preference Score
 let averagePreferenceScore = 0;
 if (comparisonCount &gt; 0 &amp;&amp; totalWeight &gt; 0) {
 averagePreferenceScore = totalPreferenceSignal / totalWeight * 50;
 } else {
 console.log('No valid preferences provided or processed.');
 }

 return averagePreferenceScore;
 }

 // Function to update preference display
 function updatePreferenceDisplay() {
 const prefDisplay = document.getElementById('preference-display');

 if (userPreferences.length &lt; 7) {
 prefDisplay.textContent = "Make at least 7 choices to see who you prefer :)";
 return;
 }

 let preferencePercent;

 if (useAlternateAlgorithm) {
 // Calculate preference using alternate algorithm
 const result = inferPreferencePercent(comparisons);
 preferencePercent = result.percent;

 if (preferencePercent &gt; 0) {
 prefDisplay.textContent = `You prefer Lennon by ${Math.abs(preferencePercent).toFixed(1)}%`;
 } else if (preferencePercent &lt; 0) {
 prefDisplay.textContent = `You prefer McCartney by ${Math.abs(preferencePercent).toFixed(1)}%`;
 } else {
 prefDisplay.textContent = "Your preference is balanced between Lennon and McCartney";
 }
 } else {
 // Calculate preference using original algorithm
 preferencePercent = calculatePreferenceScore(songData, userPreferences);

 if (preferencePercent &gt; 0) {
 prefDisplay.textContent = `You prefer Lennon by ${Math.abs(preferencePercent).toFixed(1)}%`;
 } else if (preferencePercent &lt; 0) {
 prefDisplay.textContent = `You prefer McCartney by ${Math.abs(preferencePercent).toFixed(1)}%`;
 } else {
 prefDisplay.textContent = "Your preference is balanced between Lennon and McCartney";
 }
 }
 }

 // Function to update history display
 function updateHistoryDisplay() {
 const historyBody = document.getElementById('history-body');
 historyBody.innerHTML = '';

 history.forEach(entry =&gt; {
 const row = document.createElement('tr');

 const roundCell = document.createElement('td');
 roundCell.textContent = entry.round;

 const songACell = document.createElement('td');
 songACell.textContent = `${entry.songA} (Lennon: ${entry.lennon_A}%, McCartney: ${entry.mccartney_A}%)`;

 const songBCell = document.createElement('td');
 songBCell.textContent = `${entry.songB} (Lennon: ${entry.lennon_B}%, McCartney: ${entry.mccartney_B}%)`;

 const choiceCell = document.createElement('td');
 choiceCell.textContent = `Song ${entry.choice}`;

 row.appendChild(roundCell);
 row.appendChild(songACell);
 row.appendChild(songBCell);
 row.appendChild(choiceCell);

 historyBody.appendChild(row);
 });
 }

 // Tab switching functionality
 document.querySelectorAll('.tab').forEach(tab =&gt; {
 tab.addEventListener('click', () =&gt; {
 // Remove active class from all tabs
 document.querySelectorAll('.tab').forEach(t =&gt; {
 t.classList.remove('active');
 });

 // Add active class to clicked tab
 tab.classList.add('active');

 // Hide all tab contents
 document.querySelectorAll('.tab-content').forEach(content =&gt; {
 content.classList.remove('active');
 });

 // Show the corresponding tab content
 const tabId = tab.getAttribute('data-tab');
 document.getElementById(`${tabId}-tab`).classList.add('active');
 });
 });

 // Initialize the app
 document.addEventListener('DOMContentLoaded', () =&gt; {
 displaySongs();
 updatePreferenceDisplay();

 // Add toggle button event listener
 document.getElementById('toggle-algorithm').addEventListener('click', () =&gt; {
 useAlternateAlgorithm = !useAlternateAlgorithm;

 // Update button text
 const toggleButton = document.getElementById('toggle-algorithm');
 if (useAlternateAlgorithm) {
 toggleButton.textContent = "Switch to Original Algorithm";
 } else {
 toggleButton.textContent = "Switch to Alternate Algorithm";
 }

 // Update the preference display with new algorithm
 updatePreferenceDisplay();
 });
 });
 &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/lichess/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/lichess/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;title&gt;Lichess Rating Graph&lt;/title&gt;
 &lt;script src="https://cdn.jsdelivr.net/npm/chart.js"&gt;&lt;/script&gt;
 &lt;style&gt;
 * {
 box-sizing: border-box;
 margin: 0;
 padding: 0;
 }

 body {
 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
 background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
 min-height: 100vh;
 color: #e0e0e0;
 padding: 20px;
 }

 .container {
 max-width: 1200px;
 margin: 0 auto;
 }

 h1 {
 text-align: center;
 margin-bottom: 30px;
 color: #fff;
 font-size: 2.5rem;
 text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
 }

 .controls {
 display: flex;
 gap: 15px;
 justify-content: center;
 flex-wrap: wrap;
 margin-bottom: 30px;
 padding: 20px;
 background: rgba(255,255,255,0.05);
 border-radius: 12px;
 backdrop-filter: blur(10px);
 }

 .control-group {
 display: flex;
 flex-direction: column;
 gap: 5px;
 }

 label {
 font-size: 0.85rem;
 color: #aaa;
 text-transform: uppercase;
 letter-spacing: 0.5px;
 }

 input, select {
 padding: 12px 16px;
 border: 1px solid rgba(255,255,255,0.1);
 border-radius: 8px;
 background: rgba(255,255,255,0.08);
 color: #fff;
 font-size: 1rem;
 min-width: 150px;
 transition: all 0.2s;
 }

 input:focus, select:focus {
 outline: none;
 border-color: #4a90d9;
 background: rgba(255,255,255,0.12);
 }

 select option {
 background: #1a1a2e;
 color: #fff;
 }

 button {
 padding: 12px 24px;
 border: none;
 border-radius: 8px;
 font-size: 1rem;
 cursor: pointer;
 transition: all 0.2s;
 font-weight: 600;
 }

 .btn-primary {
 background: linear-gradient(135deg, #4a90d9 0%, #3672b9 100%);
 color: #fff;
 }

 .btn-primary:hover {
 transform: translateY(-2px);
 box-shadow: 0 4px 15px rgba(74,144,217,0.4);
 }

 .btn-primary:disabled {
 opacity: 0.6;
 cursor: not-allowed;
 transform: none;
 }

 .btn-secondary {
 background: rgba(255,255,255,0.1);
 color: #fff;
 border: 1px solid rgba(255,255,255,0.2);
 }

 .btn-secondary:hover {
 background: rgba(255,255,255,0.15);
 }

 .chart-container {
 background: #fff;
 border-radius: 12px;
 padding: 20px;
 box-shadow: 0 10px 40px rgba(0,0,0,0.3);
 position: relative;
 }

 #ratingChart {
 width: 100% !important;
 height: 500px !important;
 }

 .status {
 text-align: center;
 padding: 15px;
 margin-bottom: 20px;
 border-radius: 8px;
 display: none;
 }

 .status.loading {
 display: block;
 background: rgba(74,144,217,0.2);
 color: #4a90d9;
 }

 .status.error {
 display: block;
 background: rgba(217,74,74,0.2);
 color: #d94a4a;
 }

 .stats {
 display: grid;
 grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
 gap: 15px;
 margin-top: 20px;
 }

 .stat-card {
 background: rgba(255,255,255,0.05);
 padding: 15px;
 border-radius: 8px;
 text-align: center;
 }

 .stat-value {
 font-size: 1.8rem;
 font-weight: 700;
 color: #4a90d9;
 }

 .stat-label {
 font-size: 0.85rem;
 color: #888;
 margin-top: 5px;
 }

 .actions {
 display: flex;
 gap: 10px;
 justify-content: center;
 margin-top: 20px;
 }

 .hidden {
 display: none !important;
 }

 @media (max-width: 768px) {
 h1 {
 font-size: 1.8rem;
 }

 .controls {
 flex-direction: column;
 align-items: stretch;
 }

 input, select, button {
 width: 100%;
 }

 #ratingChart {
 height: 350px !important;
 }
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;div class="container"&gt;
 &lt;h1&gt;Lichess Rating Graph&lt;/h1&gt;

 &lt;div class="controls"&gt;
 &lt;div class="control-group"&gt;
 &lt;label for="username"&gt;Username&lt;/label&gt;
 &lt;input type="text" id="username" placeholder="Enter Lichess username" value=""&gt;
 &lt;/div&gt;
 &lt;div class="control-group"&gt;
 &lt;label for="gameMode"&gt;Game Mode&lt;/label&gt;
 &lt;select id="gameMode"&gt;
 &lt;option value="blitz"&gt;Blitz&lt;/option&gt;
 &lt;option value="bullet"&gt;Bullet&lt;/option&gt;
 &lt;option value="rapid"&gt;Rapid&lt;/option&gt;
 &lt;option value="classical"&gt;Classical&lt;/option&gt;
 &lt;option value="correspondence"&gt;Correspondence&lt;/option&gt;
 &lt;/select&gt;
 &lt;/div&gt;
 &lt;div class="control-group"&gt;
 &lt;label for="numGames"&gt;Max Games&lt;/label&gt;
 &lt;input type="number" id="numGames" placeholder="0 = all" value="0" min="0"&gt;
 &lt;/div&gt;
 &lt;div class="control-group"&gt;
 &lt;label&gt;&amp;nbsp;&lt;/label&gt;
 &lt;button class="btn-primary" id="loadBtn" onclick="loadData()"&gt;Load Data&lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="status" id="status"&gt;&lt;/div&gt;

 &lt;div class="chart-container"&gt;
 &lt;canvas id="ratingChart"&gt;&lt;/canvas&gt;
 &lt;/div&gt;

 &lt;div class="actions hidden" id="actions"&gt;
 &lt;button class="btn-secondary" onclick="downloadImage()"&gt;Download PNG&lt;/button&gt;
 &lt;/div&gt;

 &lt;div class="stats hidden" id="stats"&gt;
 &lt;div class="stat-card"&gt;
 &lt;div class="stat-value" id="totalGames"&gt;-&lt;/div&gt;
 &lt;div class="stat-label"&gt;Total Games&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="stat-card"&gt;
 &lt;div class="stat-value" id="currentRating"&gt;-&lt;/div&gt;
 &lt;div class="stat-label"&gt;Current Rating&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="stat-card"&gt;
 &lt;div class="stat-value" id="peakRating"&gt;-&lt;/div&gt;
 &lt;div class="stat-label"&gt;Peak Rating&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="stat-card"&gt;
 &lt;div class="stat-value" id="lowestRating"&gt;-&lt;/div&gt;
 &lt;div class="stat-label"&gt;Lowest Rating&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="stat-card"&gt;
 &lt;div class="stat-value" id="avgGamesPerDay"&gt;-&lt;/div&gt;
 &lt;div class="stat-label"&gt;Avg Games/Day&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;script&gt;
 let chart = null;
 let currentUsername = '';
 let currentGameMode = '';

 // Initialize empty chart
 const ctx = document.getElementById('ratingChart').getContext('2d');
 chart = new Chart(ctx, {
 type: 'line',
 data: {
 labels: [],
 datasets: []
 },
 options: getChartOptions('', '')
 });

 function getChartOptions(username, gameMode) {
 return {
 responsive: true,
 maintainAspectRatio: false,
 interaction: {
 mode: 'index',
 intersect: false,
 },
 plugins: {
 legend: {
 display: true,
 position: 'top',
 labels: {
 usePointStyle: true,
 padding: 20
 }
 },
 tooltip: {
 backgroundColor: 'rgba(0,0,0,0.8)',
 padding: 12,
 titleFont: { size: 14 },
 bodyFont: { size: 13 },
 callbacks: {
 title: function(items) {
 return `Game #${items[0].label}`;
 }
 }
 }
 },
 scales: {
 x: {
 title: {
 display: true,
 text: 'Number of Games',
 font: { size: 14, weight: 'bold' }
 },
 ticks: {
 maxTicksLimit: 20
 }
 },
 y: {
 type: 'linear',
 display: true,
 position: 'left',
 title: {
 display: true,
 text: username ? `${username}'s Lichess ${capitalize(gameMode)} Rating` : 'Rating',
 color: '#3F5D7D',
 font: { size: 14, weight: 'bold' }
 },
 ticks: {
 color: '#3F5D7D',
 stepSize: 50
 },
 grid: {
 color: 'rgba(0,0,0,0.1)'
 }
 },
 y1: {
 type: 'linear',
 display: true,
 position: 'right',
 title: {
 display: true,
 text: 'Games per Day',
 color: '#666',
 font: { size: 14, weight: 'bold' }
 },
 ticks: {
 color: '#666'
 },
 grid: {
 drawOnChartArea: false
 },
 min: 0
 }
 }
 };
 }

 function capitalize(str) {
 return str.charAt(0).toUpperCase() + str.slice(1);
 }

 function showStatus(message, type) {
 const status = document.getElementById('status');
 status.textContent = message;
 status.className = 'status ' + type;
 }

 function hideStatus() {
 document.getElementById('status').className = 'status';
 }

 async function loadData() {
 const username = document.getElementById('username').value.trim();
 const gameMode = document.getElementById('gameMode').value;
 const numGames = parseInt(document.getElementById('numGames').value) || 0;

 if (!username) {
 showStatus('Please enter a username', 'error');
 return;
 }

 currentUsername = username;
 currentGameMode = gameMode;

 const loadBtn = document.getElementById('loadBtn');
 loadBtn.disabled = true;
 loadBtn.textContent = 'Loading...';

 showStatus(`Fetching ${gameMode} games for ${username}...`, 'loading');

 try {
 const games = await fetchGames(username, gameMode, numGames);

 if (games.length === 0) {
 showStatus(`No ${gameMode} games found for ${username}`, 'error');
 loadBtn.disabled = false;
 loadBtn.textContent = 'Load Data';
 return;
 }

 showStatus(`Processing ${games.length} games...`, 'loading');
 const data = processGames(games, username);

 updateChart(data, username, gameMode);
 updateStats(data);

 document.getElementById('actions').classList.remove('hidden');
 document.getElementById('stats').classList.remove('hidden');

 hideStatus();
 } catch (error) {
 console.error(error);
 showStatus(`Error: ${error.message}`, 'error');
 }

 loadBtn.disabled = false;
 loadBtn.textContent = 'Load Data';
 }

 async function fetchGames(username, gameMode, maxGames) {
 let url = `https://lichess.org/api/games/user/${username}?rated=true&amp;perfType=${gameMode}&amp;sort=dateAsc`;
 if (maxGames &gt; 0) {
 url += `&amp;max=${maxGames}`;
 }

 const response = await fetch(url, {
 headers: {
 'Accept': 'application/x-ndjson'
 }
 });

 if (!response.ok) {
 if (response.status === 404) {
 throw new Error('User not found');
 }
 throw new Error(`HTTP error: ${response.status}`);
 }

 const text = await response.text();
 const lines = text.trim().split('\n').filter(line =&gt; line);
 return lines.map(line =&gt; JSON.parse(line));
 }

 function processGames(games, username) {
 const ratings = [];
 const dates = [];
 const dailyGamesMap = {};
 let skipped = 0;

 for (const game of games) {
 const color = getColor(game, username);
 if (!color) {
 skipped++;
 continue;
 }

 const playerData = game.players[color];
 const rating = playerData.rating;
 const ratingDiff = playerData.ratingDiff;

 if (ratingDiff === undefined) {
 skipped++;
 continue;
 }

 const oldRating = rating - ratingDiff;
 const gameDate = new Date(game.createdAt);
 const dateKey = gameDate.toISOString().split('T')[0];

 // Add both old and new rating for smoother visualization
 ratings.push(oldRating);
 ratings.push(rating);
 dates.push(dateKey);
 dates.push(dateKey);

 dailyGamesMap[dateKey] = (dailyGamesMap[dateKey] || 0) + 1;
 }

 // Map daily games to each rating point
 const dailyGames = dates.map(d =&gt; dailyGamesMap[d]);

 // Calculate 100-game moving average
 const movingAvg = [];
 for (let i = 0; i &lt; ratings.length; i++) {
 const start = Math.max(0, i - 99);
 const slice = ratings.slice(start, i + 1);
 const avg = slice.reduce((a, b) =&gt; a + b, 0) / slice.length;
 movingAvg.push(avg);
 }

 return { ratings, dailyGames, movingAvg, dates };
 }

 function getColor(game, username) {
 const usernameLower = username.toLowerCase();
 try {
 if (game.players.black.user.name.toLowerCase() === usernameLower) {
 return 'black';
 } else if (game.players.white.user.name.toLowerCase() === usernameLower) {
 return 'white';
 }
 } catch (e) {
 return null;
 }
 return null;
 }

 function updateChart(data, username, gameMode) {
 const labels = data.ratings.map((_, i) =&gt; i + 1);

 chart.data.labels = labels;
 chart.data.datasets = [
 {
 label: 'Rating',
 data: data.ratings,
 borderColor: '#3F5D7D',
 backgroundColor: 'rgba(63, 93, 125, 0.1)',
 borderWidth: 2,
 pointRadius: 0,
 fill: true,
 yAxisID: 'y',
 order: 1
 },
 {
 label: '100-Game Average',
 data: data.movingAvg,
 borderColor: '#FF9500',
 backgroundColor: 'transparent',
 borderWidth: 2,
 pointRadius: 0,
 fill: false,
 yAxisID: 'y',
 order: 2
 },
 {
 label: 'Games per Day',
 data: data.dailyGames,
 backgroundColor: 'rgba(0, 0, 0, 0.1)',
 borderColor: 'transparent',
 type: 'bar',
 yAxisID: 'y1',
 order: 3
 }
 ];

 chart.options = getChartOptions(username, gameMode);

 // Auto-scale y-axis
 const minRating = Math.min(...data.ratings);
 const maxRating = Math.max(...data.ratings);
 const padding = 50;
 chart.options.scales.y.min = Math.floor((minRating - padding) / 50) * 50;
 chart.options.scales.y.max = Math.ceil((maxRating + padding) / 50) * 50;

 chart.update();
 }

 function updateStats(data) {
 const totalGames = data.ratings.length / 2; // Each game adds 2 points
 const currentRating = data.ratings[data.ratings.length - 1];
 const peakRating = Math.max(...data.ratings);
 const lowestRating = Math.min(...data.ratings);

 // Calculate unique days
 const uniqueDays = new Set(data.dates).size;
 const avgGamesPerDay = (totalGames / uniqueDays).toFixed(1);

 document.getElementById('totalGames').textContent = Math.round(totalGames).toLocaleString();
 document.getElementById('currentRating').textContent = currentRating;
 document.getElementById('peakRating').textContent = peakRating;
 document.getElementById('lowestRating').textContent = lowestRating;
 document.getElementById('avgGamesPerDay').textContent = avgGamesPerDay;
 }

 function downloadImage() {
 const link = document.createElement('a');
 link.download = `ChessGraph_${currentUsername}_${currentGameMode}.png`;
 link.href = chart.toBase64Image('image/png', 1);
 link.click();
 }

 // Allow Enter key to submit
 document.getElementById('username').addEventListener('keypress', function(e) {
 if (e.key === 'Enter') {
 loadData();
 }
 });
 &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/phones/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/phones/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;title&gt;Device Speedometer scores&lt;/title&gt;
 &lt;style&gt;
 body {
 font-family: Arial, sans-serif;
 text-align: center;
 margin: 0;
 padding: 0;
 }
 #chart-container {
 display: flex;
 justify-content: center;
 align-items: flex-end;
 height: 300px;
 width: 90%;
 max-width: 800px;
 margin: 20px auto;
 border-bottom: 2px solid black;
 position: relative;
 }
 .bar-container {
 position: relative;
 margin: 0 5px;
 }
 .bar {
 width: 20px;
 background-color: steelblue;
 position: relative;
 z-index: 1;
 }
 .error-bar {
 position: absolute;
 width: 2px;
 background-color: red;
 left: 50%;
 transform: translateX(-50%);
 z-index: 2;
 }
 .label {
 position: absolute;
 top: -20px;
 right: 100%;
 margin-right: 5px;
 background: rgba(0, 0, 0, 0.7);
 color: white;
 padding: 3px 5px;
 border-radius: 3px;
 font-size: 12px;
 white-space: nowrap;
 visibility: hidden;
 }
 .bar-container:hover .label {
 visibility: visible;
 }

 /* Responsive Design */
 @media (max-width: 768px) {
 #chart-container {
 height: 250px;
 width: 95%;
 }
 .bar-container {
 margin: 0 2px;
 }
 .bar {
 width: 10px;
 }
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;h2&gt;Device Speedometer scores&lt;/h2&gt;
 &lt;div id="chart-container"&gt;&lt;/div&gt;

 &lt;script&gt;
 const predefinedData = [
 { model: "Redmi 9A", score: 0.685, date: "02/10/2025", stddev: 0.043 },
 { model: "Samsung M31S", score: 2.28, date: "02/10/25", stddev: 0.082 },
 { model: "Lenovo ThinkPad Yoga 14", score: 4.41, date: "12/28/24", stddev: 0.27 },
 { model: "OnePlus 7T", score: 5.3, date: "02/23/25", stddev: null },
 { model: "OnePlus 8T", score: 5.53, date: "12/22/24", stddev: 0.32 },
 { model: "Moto G84", score: 5.87, date: "02/08/25", stddev: 0.15 },
 { model: "Samsung S21 FE", score: 6.06, date: "12/22/24", stddev: 0.72 },
 { model: "Lenovo ThinkPad Yoga 14 on Thorium", score: 6.17, date: "12/28/24", stddev: 0.24 },
 { model: "Pixel 6A", score: 10.4, date: "02/23/25", stddev: 0.9 },
 { model: "HP EliteBook 840 G8", score: 10.9, date: "12/28/24", stddev: 1.2 },
 { model: "M1 Pro Sequoia 15.1.1 32GB RAM on Thorium", score: 11.5, date: "12/28/24", stddev: 0.84 },
 { model: "Pixel 9 Pro", score: 16, date: "", stddev: null },
 { model: "OnePlus 13 512 GB", score: 18.3, date: "", stddev: null },
 { model: "M1 Pro Sequoia 15.1.1 32GB RAM on Thorium", score: 19.7, date: "12/28/24", stddev: 0.94 },
 // { model: "M3 Pro 14\"", score: 570, date: "12/1/2023", stddev: 46 },
 // { model: "M3 Pro 14\"", score: 469, date: "12/1/2023", stddev: 26 },
 ];

 function renderChart() {
 let chart = document.getElementById("chart-container");
 chart.innerHTML = "";
 let maxScore = Math.max(...predefinedData.map(d =&gt; d.score));

 predefinedData.forEach(data =&gt; {
 let barContainer = document.createElement("div");
 barContainer.className = "bar-container";
 
 let label = document.createElement("div");
 label.className = "label";
 label.textContent = `${data.model}: ${data.score} ${data.stddev ? `± ${data.stddev}` : ""}`;
 
 let bar = document.createElement("div");
 bar.className = "bar";
 bar.style.height = (data.score / maxScore * 250) + "px";
 
 // Adding error bars
 if (data.stddev !== null) {
 let errorBar = document.createElement("div");
 errorBar.className = "error-bar";
 let errorHeight = (data.stddev / maxScore * 250); // error height scaled to chart height
 errorBar.style.height = errorHeight * 2 + "px"; // double error bar height for both directions
 errorBar.style.bottom = 0;
 errorBar.style.top = `-${errorHeight}px`;
 barContainer.appendChild(errorBar);
 }
 
 barContainer.appendChild(bar);
 barContainer.appendChild(label);
 chart.appendChild(barContainer);
 });
 }

 window.onload = renderChart;
 &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/values/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/values/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;title&gt;Values&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;p&gt; Feel free to fork and create your own set of values and/or suggest changes via a pull-request at &lt;a href="https://github.com/IngridMorstrad/IngridMorstrad.github.io/blob/mainline/content/values.html"&gt;this link&lt;/a&gt;.
 &lt;/p&gt;
 &lt;p&gt;
 Having clear values helps lead you to happiness. Without a clear set of values, which can help you with your priorities, you may be lost and engage in sub-par actions for both yourself &amp;amp; humanity.
 &lt;/p&gt;
 &lt;ol&gt;
 &lt;li&gt;
 Take care of yourself. This doesn't mean "spoil yourself". The line between the two forms a spectrum and you need to be clear where it crosses over into "spoiling yourself" territory.
 &lt;/li&gt;
 &lt;li&gt;
 Try not to harm. At a high level, try not to harm. I say try, because there could be cases where you undertake an action that has some downstream impacts causing harm (like working in tech could cause resources to be constrained in a particular geographic location). This has some interplay with the first point.
 &lt;/li&gt;
 &lt;li&gt;
 Spread the knowledge. If you know something useful (let's say you have understood how to start a business), share it. Don't gatekeep it for personal gain.
 &lt;/li&gt;
 &lt;li&gt;
 Reduce waste. From the "reuse, reduce, recycle" mantra. However, I'm not sure consumerism is all bad as it may lead to growth in the economy, benefiting all. However, holding this value means you'd rather reuse things before buying something new, even if the new thing is cheap.
 &lt;/li&gt;
 &lt;li&gt;
 Push for the truth. Whenever possible and wherever possible, push for the truth. People may make short-term sub-optimal decisions based on lies or what they believe is true due to a poor understanding of things. You should strive to seek the truth &amp;amp; share it. Engage to learn and find what may be true, not to prove a point.
 &lt;/li&gt;
 &lt;li&gt;
 Let live. From "live and let live" &amp;amp; stoicism. Focus on yourself. You can't really force others to do anything, so just do your best, do your part. Others may arrive at different conclusions, at which you can try to see where you differ and explain what drove your conclusions.
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;p&gt;Footnote: My list of &lt;a href="https://www.ashwinmenon.com/posts/thoughts/2024-06-18-heroes/"&gt;heroes&lt;/a&gt; may shed further light on my implicit values.&lt;/p&gt;</description></item><item><title/><link>https://www.ashwinmenon.com/yearly/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/yearly/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;title&gt;Planare - Yearly Planner&lt;/title&gt;
 &lt;style&gt;
 body {
 font-family: Arial, sans-serif;
 line-height: 1.6;
 margin: 0;
 padding: 20px;
 background-color: #f4f4f4;
 }
 .planare {
 display: flex;
 flex-wrap: wrap;
 gap: 20px;
 }
 .month {
 background-color: white;
 border-radius: 8px;
 padding: 15px;
 width: calc(33.33% - 20px);
 box-shadow: 0 2px 5px rgba(0,0,0,0.1);
 }
 .month.past {
 background-color: #e0e0e0;
 color: #888;
 }
 h2 {
 margin-top: 0;
 color: #333;
 }
 .task {
 margin-bottom: 10px;
 }
 .progress-bar {
 background-color: #e0e0e0;
 border-radius: 8px;
 height: 20px;
 overflow: hidden;
 }
 .progress {
 background-color: #4CAF50;
 height: 100%;
 width: 0;
 transition: width 0.3s ease;
 }
 .past .progress {
 background-color: #888;
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;h1&gt;Planare - Yearly Planner&lt;/h1&gt;
 &lt;div class="planare" id="planner"&gt;&lt;/div&gt;

 &lt;script&gt;
 // Embedded CSV data as a string
 const csvData = `
month,task,progress
September,Intro to French (LT),28/40
September,Intro to Italian (LT),45/45
September,Italian Foundation Course Lessons,78/78
September,Italian Advanced Course Discs,0/4
September,Italian Vocabulary Course Discs,0/5
September,Italian Language Builder,0/2
September,French Foundation Review Lessons,81/81
September,French Vocabulary,0/5
September,French Advanced Review Lessons,95/95
September,French Language Builder discs,0/11
October,TBD,0/3
November,Ruby Monk: 4 courses,1/4
November,Nand game,1/1
November,Removed jquery from blog,1/1
August,Placeholder,3/3
`;

 // Function to detect if a month is in the past
 function isMonthInPast(month) {
 const now = new Date();
 const monthNames = [
 "January", "February", "March", "April", "May", "June",
 "July", "August", "September", "October", "November", "December"
 ];
 const currentMonthIndex = now.getMonth(); // 0-indexed month
 const monthIndex = monthNames.indexOf(month);
 return monthIndex &lt; currentMonthIndex;
 }

 // Function to parse CSV data
 function parseCSV(data) {
 const rows = data.trim().split('\n').slice(1); // Skip header
 const parsedData = {};

 rows.forEach(row =&gt; {
 const [month, task, progress] = row.split(',');

 if (!parsedData[month]) {
 parsedData[month] = [];
 }

 parsedData[month].push({ task, progress });
 });

 return parsedData;
 }

 // Function to render the planner
 function loadPlannerData() {
 const data = parseCSV(csvData);

 const plannerContainer = document.getElementById('planner');

 Object.keys(data).forEach(month =&gt; {
 // Create month container
 const monthDiv = document.createElement('div');
 monthDiv.classList.add('month');

 if (isMonthInPast(month)) {
 monthDiv.classList.add('past');
 }

 // Create month title
 const monthTitle = document.createElement('h2');
 monthTitle.textContent = month;
 monthDiv.appendChild(monthTitle);

 // Create tasks
 data[month].forEach(taskData =&gt; {
 const taskDiv = document.createElement('div');
 taskDiv.classList.add('task');

 const taskProgress = taskData.progress.split('/');
 const progressPercentage = (taskProgress[0] / taskProgress[1]) * 100;

 taskDiv.innerHTML = `
 &lt;p&gt;${taskData.task} (${taskData.progress})&lt;/p&gt;</description></item><item><title>BNPL helper</title><link>https://www.ashwinmenon.com/finance/bnpl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/finance/bnpl/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;meta charset="UTF-8"&gt;
 &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;title&gt;Loan Interest Rate Calculator&lt;/title&gt;
 &lt;!-- Load Tailwind CSS for modern styling --&gt;
 &lt;script src="https://cdn.tailwindcss.com"&gt;&lt;/script&gt;
 &lt;style&gt;
 /* Custom font and base styles */
 body {
 font-family: 'Inter', sans-serif;
 background-color: #f7f9fb;
 }
 .card {
 box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 0 10px -5px rgba(0, 0, 0, 0.04);
 }
 .input-field {
 transition: border-color 0.3s, box-shadow 0.3s;
 }
 .input-field:focus {
 border-color: #4f46e5;
 box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.2);
 }
 &lt;/style&gt;
&lt;/head&gt;
&lt;body class="p-4 sm:p-8 flex items-center justify-center min-h-screen"&gt;

 &lt;div class="card bg-white p-6 sm:p-8 rounded-xl w-full max-w-lg"&gt;
 &lt;h1 class="text-3xl font-extrabold text-gray-900 mb-2"&gt;Loan Interest Rate Calculator&lt;/h1&gt;
 &lt;p class="text-gray-500 mb-6"&gt;Calculate the Effective Annual Rate (EAR) for an installment plan.&lt;/p&gt;</description></item><item><title>Lesson 1</title><link>https://www.ashwinmenon.com/neuralnetcourse/lesson1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/neuralnetcourse/lesson1/</guid><description>&lt;!DOCTYPE html&gt;

&lt;html lang="en"&gt;
&lt;head&gt;&lt;meta charset="utf-8"/&gt;
&lt;meta content="width=device-width, initial-scale=1.0" name="viewport"/&gt;
&lt;title&gt;Lesson 1 Gradient Descent&lt;/title&gt;&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"&gt;&lt;/script&gt;
&lt;style type="text/css"&gt;
 pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: var(--jp-cell-editor-active-background) }
.highlight { background: var(--jp-cell-editor-background); color: var(--jp-mirror-editor-variable-color) }
.highlight .c { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment */
.highlight .err { color: var(--jp-mirror-editor-error-color) } /* Error */
.highlight .k { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword */
.highlight .o { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator */
.highlight .p { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation */
.highlight .ch { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Multiline */
.highlight .cp { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Preproc */
.highlight .cpf { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Single */
.highlight .cs { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Special */
.highlight .kc { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Type */
.highlight .m { color: var(--jp-mirror-editor-number-color) } /* Literal.Number */
.highlight .s { color: var(--jp-mirror-editor-string-color) } /* Literal.String */
.highlight .ow { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator.Word */
.highlight .pm { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation.Marker */
.highlight .w { color: var(--jp-mirror-editor-variable-color) } /* Text.Whitespace */
.highlight .mb { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Bin */
.highlight .mf { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Float */
.highlight .mh { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Hex */
.highlight .mi { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer */
.highlight .mo { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Oct */
.highlight .sa { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Affix */
.highlight .sb { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Backtick */
.highlight .sc { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Char */
.highlight .dl { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Delimiter */
.highlight .sd { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Doc */
.highlight .s2 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Double */
.highlight .se { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Escape */
.highlight .sh { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Heredoc */
.highlight .si { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Interpol */
.highlight .sx { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Other */
.highlight .sr { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Regex */
.highlight .s1 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Single */
.highlight .ss { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Symbol */
.highlight .il { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer.Long */
 &lt;/style&gt;
&lt;style type="text/css"&gt;
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*
 * Mozilla scrollbar styling
 */

/* use standard opaque scrollbars for most nodes */
[data-jp-theme-scrollbars='true'] {
 scrollbar-color: rgb(var(--jp-scrollbar-thumb-color))
 var(--jp-scrollbar-background-color);
}

/* for code nodes, use a transparent style of scrollbar. These selectors
 * will match lower in the tree, and so will override the above */
[data-jp-theme-scrollbars='true'] .CodeMirror-hscrollbar,
[data-jp-theme-scrollbars='true'] .CodeMirror-vscrollbar {
 scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent;
}

/* tiny scrollbar */

.jp-scrollbar-tiny {
 scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent;
 scrollbar-width: thin;
}

/* tiny scrollbar */

.jp-scrollbar-tiny::-webkit-scrollbar,
.jp-scrollbar-tiny::-webkit-scrollbar-corner {
 background-color: transparent;
 height: 4px;
 width: 4px;
}

.jp-scrollbar-tiny::-webkit-scrollbar-thumb {
 background: rgba(var(--jp-scrollbar-thumb-color), 0.5);
}

.jp-scrollbar-tiny::-webkit-scrollbar-track:horizontal {
 border-left: 0 solid transparent;
 border-right: 0 solid transparent;
}

.jp-scrollbar-tiny::-webkit-scrollbar-track:vertical {
 border-top: 0 solid transparent;
 border-bottom: 0 solid transparent;
}

/*
 * Lumino
 */

.lm-ScrollBar[data-orientation='horizontal'] {
 min-height: 16px;
 max-height: 16px;
 min-width: 45px;
 border-top: 1px solid #a0a0a0;
}

.lm-ScrollBar[data-orientation='vertical'] {
 min-width: 16px;
 max-width: 16px;
 min-height: 45px;
 border-left: 1px solid #a0a0a0;
}

.lm-ScrollBar-button {
 background-color: #f0f0f0;
 background-position: center center;
 min-height: 15px;
 max-height: 15px;
 min-width: 15px;
 max-width: 15px;
}

.lm-ScrollBar-button:hover {
 background-color: #dadada;
}

.lm-ScrollBar-button.lm-mod-active {
 background-color: #cdcdcd;
}

.lm-ScrollBar-track {
 background: #f0f0f0;
}

.lm-ScrollBar-thumb {
 background: #cdcdcd;
}

.lm-ScrollBar-thumb:hover {
 background: #bababa;
}

.lm-ScrollBar-thumb.lm-mod-active {
 background: #a0a0a0;
}

.lm-ScrollBar[data-orientation='horizontal'] .lm-ScrollBar-thumb {
 height: 100%;
 min-width: 15px;
 border-left: 1px solid #a0a0a0;
 border-right: 1px solid #a0a0a0;
}

.lm-ScrollBar[data-orientation='vertical'] .lm-ScrollBar-thumb {
 width: 100%;
 min-height: 15px;
 border-top: 1px solid #a0a0a0;
 border-bottom: 1px solid #a0a0a0;
}

.lm-ScrollBar[data-orientation='horizontal']
 .lm-ScrollBar-button[data-action='decrement'] {
 background-image: var(--jp-icon-caret-left);
 background-size: 17px;
}

.lm-ScrollBar[data-orientation='horizontal']
 .lm-ScrollBar-button[data-action='increment'] {
 background-image: var(--jp-icon-caret-right);
 background-size: 17px;
}

.lm-ScrollBar[data-orientation='vertical']
 .lm-ScrollBar-button[data-action='decrement'] {
 background-image: var(--jp-icon-caret-up);
 background-size: 17px;
}

.lm-ScrollBar[data-orientation='vertical']
 .lm-ScrollBar-button[data-action='increment'] {
 background-image: var(--jp-icon-caret-down);
 background-size: 17px;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-Widget {
 box-sizing: border-box;
 position: relative;
 overflow: hidden;
}

.lm-Widget.lm-mod-hidden {
 display: none !important;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

.lm-AccordionPanel[data-orientation='horizontal'] &gt; .lm-AccordionPanel-title {
 /* Title is rotated for horizontal accordion panel using CSS */
 display: block;
 transform-origin: top left;
 transform: rotate(-90deg) translate(-100%);
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-CommandPalette {
 display: flex;
 flex-direction: column;
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.lm-CommandPalette-search {
 flex: 0 0 auto;
}

.lm-CommandPalette-content {
 flex: 1 1 auto;
 margin: 0;
 padding: 0;
 min-height: 0;
 overflow: auto;
 list-style-type: none;
}

.lm-CommandPalette-header {
 overflow: hidden;
 white-space: nowrap;
 text-overflow: ellipsis;
}

.lm-CommandPalette-item {
 display: flex;
 flex-direction: row;
}

.lm-CommandPalette-itemIcon {
 flex: 0 0 auto;
}

.lm-CommandPalette-itemContent {
 flex: 1 1 auto;
 overflow: hidden;
}

.lm-CommandPalette-itemShortcut {
 flex: 0 0 auto;
}

.lm-CommandPalette-itemLabel {
 overflow: hidden;
 white-space: nowrap;
 text-overflow: ellipsis;
}

.lm-close-icon {
 border: 1px solid transparent;
 background-color: transparent;
 position: absolute;
 z-index: 1;
 right: 3%;
 top: 0;
 bottom: 0;
 margin: auto;
 padding: 7px 0;
 display: none;
 vertical-align: middle;
 outline: 0;
 cursor: pointer;
}
.lm-close-icon:after {
 content: 'X';
 display: block;
 width: 15px;
 height: 15px;
 text-align: center;
 color: #000;
 font-weight: normal;
 font-size: 12px;
 cursor: pointer;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-DockPanel {
 z-index: 0;
}

.lm-DockPanel-widget {
 z-index: 0;
}

.lm-DockPanel-tabBar {
 z-index: 1;
}

.lm-DockPanel-handle {
 z-index: 2;
}

.lm-DockPanel-handle.lm-mod-hidden {
 display: none !important;
}

.lm-DockPanel-handle:after {
 position: absolute;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 content: '';
}

.lm-DockPanel-handle[data-orientation='horizontal'] {
 cursor: ew-resize;
}

.lm-DockPanel-handle[data-orientation='vertical'] {
 cursor: ns-resize;
}

.lm-DockPanel-handle[data-orientation='horizontal']:after {
 left: 50%;
 min-width: 8px;
 transform: translateX(-50%);
}

.lm-DockPanel-handle[data-orientation='vertical']:after {
 top: 50%;
 min-height: 8px;
 transform: translateY(-50%);
}

.lm-DockPanel-overlay {
 z-index: 3;
 box-sizing: border-box;
 pointer-events: none;
}

.lm-DockPanel-overlay.lm-mod-hidden {
 display: none !important;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-Menu {
 z-index: 10000;
 position: absolute;
 white-space: nowrap;
 overflow-x: hidden;
 overflow-y: auto;
 outline: none;
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.lm-Menu-content {
 margin: 0;
 padding: 0;
 display: table;
 list-style-type: none;
}

.lm-Menu-item {
 display: table-row;
}

.lm-Menu-item.lm-mod-hidden,
.lm-Menu-item.lm-mod-collapsed {
 display: none !important;
}

.lm-Menu-itemIcon,
.lm-Menu-itemSubmenuIcon {
 display: table-cell;
 text-align: center;
}

.lm-Menu-itemLabel {
 display: table-cell;
 text-align: left;
}

.lm-Menu-itemShortcut {
 display: table-cell;
 text-align: right;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-MenuBar {
 outline: none;
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.lm-MenuBar-content {
 margin: 0;
 padding: 0;
 display: flex;
 flex-direction: row;
 list-style-type: none;
}

.lm-MenuBar-item {
 box-sizing: border-box;
}

.lm-MenuBar-itemIcon,
.lm-MenuBar-itemLabel {
 display: inline-block;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-ScrollBar {
 display: flex;
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.lm-ScrollBar[data-orientation='horizontal'] {
 flex-direction: row;
}

.lm-ScrollBar[data-orientation='vertical'] {
 flex-direction: column;
}

.lm-ScrollBar-button {
 box-sizing: border-box;
 flex: 0 0 auto;
}

.lm-ScrollBar-track {
 box-sizing: border-box;
 position: relative;
 overflow: hidden;
 flex: 1 1 auto;
}

.lm-ScrollBar-thumb {
 box-sizing: border-box;
 position: absolute;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-SplitPanel-child {
 z-index: 0;
}

.lm-SplitPanel-handle {
 z-index: 1;
}

.lm-SplitPanel-handle.lm-mod-hidden {
 display: none !important;
}

.lm-SplitPanel-handle:after {
 position: absolute;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 content: '';
}

.lm-SplitPanel[data-orientation='horizontal'] &gt; .lm-SplitPanel-handle {
 cursor: ew-resize;
}

.lm-SplitPanel[data-orientation='vertical'] &gt; .lm-SplitPanel-handle {
 cursor: ns-resize;
}

.lm-SplitPanel[data-orientation='horizontal'] &gt; .lm-SplitPanel-handle:after {
 left: 50%;
 min-width: 8px;
 transform: translateX(-50%);
}

.lm-SplitPanel[data-orientation='vertical'] &gt; .lm-SplitPanel-handle:after {
 top: 50%;
 min-height: 8px;
 transform: translateY(-50%);
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-TabBar {
 display: flex;
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.lm-TabBar[data-orientation='horizontal'] {
 flex-direction: row;
 align-items: flex-end;
}

.lm-TabBar[data-orientation='vertical'] {
 flex-direction: column;
 align-items: flex-end;
}

.lm-TabBar-content {
 margin: 0;
 padding: 0;
 display: flex;
 flex: 1 1 auto;
 list-style-type: none;
}

.lm-TabBar[data-orientation='horizontal'] &gt; .lm-TabBar-content {
 flex-direction: row;
}

.lm-TabBar[data-orientation='vertical'] &gt; .lm-TabBar-content {
 flex-direction: column;
}

.lm-TabBar-tab {
 display: flex;
 flex-direction: row;
 box-sizing: border-box;
 overflow: hidden;
 touch-action: none; /* Disable native Drag/Drop */
}

.lm-TabBar-tabIcon,
.lm-TabBar-tabCloseIcon {
 flex: 0 0 auto;
}

.lm-TabBar-tabLabel {
 flex: 1 1 auto;
 overflow: hidden;
 white-space: nowrap;
}

.lm-TabBar-tabInput {
 user-select: all;
 width: 100%;
 box-sizing: border-box;
}

.lm-TabBar-tab.lm-mod-hidden {
 display: none !important;
}

.lm-TabBar-addButton.lm-mod-hidden {
 display: none !important;
}

.lm-TabBar.lm-mod-dragging .lm-TabBar-tab {
 position: relative;
}

.lm-TabBar.lm-mod-dragging[data-orientation='horizontal'] .lm-TabBar-tab {
 left: 0;
 transition: left 150ms ease;
}

.lm-TabBar.lm-mod-dragging[data-orientation='vertical'] .lm-TabBar-tab {
 top: 0;
 transition: top 150ms ease;
}

.lm-TabBar.lm-mod-dragging .lm-TabBar-tab.lm-mod-dragging {
 transition: none;
}

.lm-TabBar-tabLabel .lm-TabBar-tabInput {
 user-select: all;
 width: 100%;
 box-sizing: border-box;
 background: inherit;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-TabPanel-tabBar {
 z-index: 1;
}

.lm-TabPanel-stackedPanel {
 z-index: 0;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-Collapse {
 display: flex;
 flex-direction: column;
 align-items: stretch;
}

.jp-Collapse-header {
 padding: 1px 12px;
 background-color: var(--jp-layout-color1);
 border-bottom: solid var(--jp-border-width) var(--jp-border-color2);
 color: var(--jp-ui-font-color1);
 cursor: pointer;
 display: flex;
 align-items: center;
 font-size: var(--jp-ui-font-size0);
 font-weight: 600;
 text-transform: uppercase;
 user-select: none;
}

.jp-Collapser-icon {
 height: 16px;
}

.jp-Collapse-header-collapsed .jp-Collapser-icon {
 transform: rotate(-90deg);
 margin: auto 0;
}

.jp-Collapser-title {
 line-height: 25px;
}

.jp-Collapse-contents {
 padding: 0 12px;
 background-color: var(--jp-layout-color1);
 color: var(--jp-ui-font-color1);
 overflow: auto;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/* This file was auto-generated by ensureUiComponents() in @jupyterlab/buildutils */

/**
 * (DEPRECATED) Support for consuming icons as CSS background images
 */

/* Icons urls */

:root {
 --jp-icon-add-above: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5MikiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik00Ljc1IDQuOTMwNjZINi42MjVWNi44MDU2NkM2LjYyNSA3LjAxMTkxIDYuNzkzNzUgNy4xODA2NiA3IDcuMTgwNjZDNy4yMDYyNSA3LjE4MDY2IDcuMzc1IDcuMDExOTEgNy4zNzUgNi44MDU2NlY0LjkzMDY2SDkuMjVDOS40NTYyNSA0LjkzMDY2IDkuNjI1IDQuNzYxOTEgOS42MjUgNC41NTU2NkM5LjYyNSA0LjM0OTQxIDkuNDU2MjUgNC4xODA2NiA5LjI1IDQuMTgwNjZINy4zNzVWMi4zMDU2NkM3LjM3NSAyLjA5OTQxIDcuMjA2MjUgMS45MzA2NiA3IDEuOTMwNjZDNi43OTM3NSAxLjkzMDY2IDYuNjI1IDIuMDk5NDEgNi42MjUgMi4zMDU2NlY0LjE4MDY2SDQuNzVDNC41NDM3NSA0LjE4MDY2IDQuMzc1IDQuMzQ5NDEgNC4zNzUgNC41NTU2NkM0LjM3NSA0Ljc2MTkxIDQuNTQzNzUgNC45MzA2NiA0Ljc1IDQuOTMwNjZaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC43Ii8+CjwvZz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjUgOS41VjExLjVMMi41IDExLjVWOS41TDExLjUgOS41Wk0xMiA4QzEyLjU1MjMgOCAxMyA4LjQ0NzcyIDEzIDlWMTJDMTMgMTIuNTUyMyAxMi41NTIzIDEzIDEyIDEzTDIgMTNDMS40NDc3MiAxMyAxIDEyLjU1MjMgMSAxMlY5QzEgOC40NDc3MiAxLjQ0NzcxIDggMiA4TDEyIDhaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5MiI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDEwIDEuNTU1NjYpIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==);
 --jp-icon-add-below: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5OCkiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik05LjI1IDEwLjA2OTNMNy4zNzUgMTAuMDY5M0w3LjM3NSA4LjE5NDM0QzcuMzc1IDcuOTg4MDkgNy4yMDYyNSA3LjgxOTM0IDcgNy44MTkzNEM2Ljc5Mzc1IDcuODE5MzQgNi42MjUgNy45ODgwOSA2LjYyNSA4LjE5NDM0TDYuNjI1IDEwLjA2OTNMNC43NSAxMC4wNjkzQzQuNTQzNzUgMTAuMDY5MyA0LjM3NSAxMC4yMzgxIDQuMzc1IDEwLjQ0NDNDNC4zNzUgMTAuNjUwNiA0LjU0Mzc1IDEwLjgxOTMgNC43NSAxMC44MTkzTDYuNjI1IDEwLjgxOTNMNi42MjUgMTIuNjk0M0M2LjYyNSAxMi45MDA2IDYuNzkzNzUgMTMuMDY5MyA3IDEzLjA2OTNDNy4yMDYyNSAxMy4wNjkzIDcuMzc1IDEyLjkwMDYgNy4zNzUgMTIuNjk0M0w3LjM3NSAxMC44MTkzTDkuMjUgMTAuODE5M0M5LjQ1NjI1IDEwLjgxOTMgOS42MjUgMTAuNjUwNiA5LjYyNSAxMC40NDQzQzkuNjI1IDEwLjIzODEgOS40NTYyNSAxMC4wNjkzIDkuMjUgMTAuMDY5M1oiIGZpbGw9IiM2MTYxNjEiIHN0cm9rZT0iIzYxNjE2MSIgc3Ryb2tlLXdpZHRoPSIwLjciLz4KPC9nPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDUuNUwyLjUgMy41TDExLjUgMy41TDExLjUgNS41TDIuNSA1LjVaTTIgN0MxLjQ0NzcyIDcgMSA2LjU1MjI4IDEgNkwxIDNDMSAyLjQ0NzcyIDEuNDQ3NzIgMiAyIDJMMTIgMkMxMi41NTIzIDIgMTMgMi40NDc3MiAxMyAzTDEzIDZDMTMgNi41NTIyOSAxMi41NTIzIDcgMTIgN0wyIDdaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5OCI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KDEgMS43NDg0NmUtMDcgMS43NDg0NmUtMDcgLTEgNCAxMy40NDQzKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=);
 --jp-icon-add: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-bell: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiPgogICA8cGF0aCBjbGFzcz0ianAtaWNvbjIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzMzMzMzIgogICAgICBkPSJtOCAwLjI5Yy0xLjQgMC0yLjcgMC43My0zLjYgMS44LTEuMiAxLjUtMS40IDMuNC0xLjUgNS4yLTAuMTggMi4yLTAuNDQgNC0yLjMgNS4zbDAuMjggMS4zaDVjMC4wMjYgMC42NiAwLjMyIDEuMSAwLjcxIDEuNSAwLjg0IDAuNjEgMiAwLjYxIDIuOCAwIDAuNTItMC40IDAuNi0xIDAuNzEtMS41aDVsMC4yOC0xLjNjLTEuOS0wLjk3LTIuMi0zLjMtMi4zLTUuMy0wLjEzLTEuOC0wLjI2LTMuNy0xLjUtNS4yLTAuODUtMS0yLjItMS44LTMuNi0xLjh6bTAgMS40YzAuODggMCAxLjkgMC41NSAyLjUgMS4zIDAuODggMS4xIDEuMSAyLjcgMS4yIDQuNCAwLjEzIDEuNyAwLjIzIDMuNiAxLjMgNS4yaC0xMGMxLjEtMS42IDEuMi0zLjQgMS4zLTUuMiAwLjEzLTEuNyAwLjMtMy4zIDEuMi00LjQgMC41OS0wLjcyIDEuNi0xLjMgMi41LTEuM3ptLTAuNzQgMTJoMS41Yy0wLjAwMTUgMC4yOCAwLjAxNSAwLjc5LTAuNzQgMC43OS0wLjczIDAuMDAxNi0wLjcyLTAuNTMtMC43NC0wLjc5eiIgLz4KPC9zdmc+Cg==);
 --jp-icon-bug-dot: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiPgogICAgICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTcuMTkgOEgyMFYxMEgxNy45MUMxNy45NiAxMC4zMyAxOCAxMC42NiAxOCAxMVYxMkgyMFYxNEgxOC41SDE4VjE0LjAyNzVDMTUuNzUgMTQuMjc2MiAxNCAxNi4xODM3IDE0IDE4LjVDMTQgMTkuMjA4IDE0LjE2MzUgMTkuODc3OSAxNC40NTQ5IDIwLjQ3MzlDMTMuNzA2MyAyMC44MTE3IDEyLjg3NTcgMjEgMTIgMjFDOS43OCAyMSA3Ljg1IDE5Ljc5IDYuODEgMThINFYxNkg2LjA5QzYuMDQgMTUuNjcgNiAxNS4zNCA2IDE1VjE0SDRWMTJINlYxMUM2IDEwLjY2IDYuMDQgMTAuMzMgNi4wOSAxMEg0VjhINi44MUM3LjI2IDcuMjIgNy44OCA2LjU1IDguNjIgNi4wNEw3IDQuNDFMOC40MSAzTDEwLjU5IDUuMTdDMTEuMDQgNS4wNiAxMS41MSA1IDEyIDVDMTIuNDkgNSAxMi45NiA1LjA2IDEzLjQyIDUuMTdMMTUuNTkgM0wxNyA0LjQxTDE1LjM3IDYuMDRDMTYuMTIgNi41NSAxNi43NCA3LjIyIDE3LjE5IDhaTTEwIDE2SDE0VjE0SDEwVjE2Wk0xMCAxMkgxNFYxMEgxMFYxMloiIGZpbGw9IiM2MTYxNjEiLz4KICAgICAgICA8cGF0aCBkPSJNMjIgMTguNUMyMiAyMC40MzMgMjAuNDMzIDIyIDE4LjUgMjJDMTYuNTY3IDIyIDE1IDIwLjQzMyAxNSAxOC41QzE1IDE2LjU2NyAxNi41NjcgMTUgMTguNSAxNUMyMC40MzMgMTUgMjIgMTYuNTY3IDIyIDE4LjVaIiBmaWxsPSIjNjE2MTYxIi8+CiAgICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-bug: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yMCA4aC0yLjgxYy0uNDUtLjc4LTEuMDctMS40NS0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdDMTIuOTYgNS4wNiAxMi40OSA1IDEyIDVjLS40OSAwLS45Ni4wNi0xLjQxLjE3TDguNDEgMyA3IDQuNDFsMS42MiAxLjYzQzcuODggNi41NSA3LjI2IDcuMjIgNi44MSA4SDR2MmgyLjA5Yy0uMDUuMzMtLjA5LjY2LS4wOSAxdjFINHYyaDJ2MWMwIC4zNC4wNC42Ny4wOSAxSDR2MmgyLjgxYzEuMDQgMS43OSAyLjk3IDMgNS4xOSAzczQuMTUtMS4yMSA1LjE5LTNIMjB2LTJoLTIuMDljLjA1LS4zMy4wOS0uNjYuMDktMXYtMWgydi0yaC0ydi0xYzAtLjM0LS4wNC0uNjctLjA5LTFIMjBWOHptLTYgOGgtNHYtMmg0djJ6bTAtNGgtNHYtMmg0djJ6Ii8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-build: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE0LjkgMTcuNDVDMTYuMjUgMTcuNDUgMTcuMzUgMTYuMzUgMTcuMzUgMTVDMTcuMzUgMTMuNjUgMTYuMjUgMTIuNTUgMTQuOSAxMi41NUMxMy41NCAxMi41NSAxMi40NSAxMy42NSAxMi40NSAxNUMxMi40NSAxNi4zNSAxMy41NCAxNy40NSAxNC45IDE3LjQ1Wk0yMC4xIDE1LjY4TDIxLjU4IDE2Ljg0QzIxLjcxIDE2Ljk1IDIxLjc1IDE3LjEzIDIxLjY2IDE3LjI5TDIwLjI2IDE5LjcxQzIwLjE3IDE5Ljg2IDIwIDE5LjkyIDE5LjgzIDE5Ljg2TDE4LjA5IDE5LjE2QzE3LjczIDE5LjQ0IDE3LjMzIDE5LjY3IDE2LjkxIDE5Ljg1TDE2LjY0IDIxLjdDMTYuNjIgMjEuODcgMTYuNDcgMjIgMTYuMyAyMkgxMy41QzEzLjMyIDIyIDEzLjE4IDIxLjg3IDEzLjE1IDIxLjdMMTIuODkgMTkuODVDMTIuNDYgMTkuNjcgMTIuMDcgMTkuNDQgMTEuNzEgMTkuMTZMOS45NjAwMiAxOS44NkM5LjgxMDAyIDE5LjkyIDkuNjIwMDIgMTkuODYgOS41NDAwMiAxOS43MUw4LjE0MDAyIDE3LjI5QzguMDUwMDIgMTcuMTMgOC4wOTAwMiAxNi45NSA4LjIyMDAyIDE2Ljg0TDkuNzAwMDIgMTUuNjhMOS42NTAwMSAxNUw5LjcwMDAyIDE0LjMxTDguMjIwMDIgMTMuMTZDOC4wOTAwMiAxMy4wNSA4LjA1MDAyIDEyLjg2IDguMTQwMDIgMTIuNzFMOS41NDAwMiAxMC4yOUM5LjYyMDAyIDEwLjEzIDkuODEwMDIgMTAuMDcgOS45NjAwMiAxMC4xM0wxMS43MSAxMC44NEMxMi4wNyAxMC41NiAxMi40NiAxMC4zMiAxMi44OSAxMC4xNUwxMy4xNSA4LjI4OTk4QzEzLjE4IDguMTI5OTggMTMuMzIgNy45OTk5OCAxMy41IDcuOTk5OThIMTYuM0MxNi40NyA3Ljk5OTk4IDE2LjYyIDguMTI5OTggMTYuNjQgOC4yODk5OEwxNi45MSAxMC4xNUMxNy4zMyAxMC4zMiAxNy43MyAxMC41NiAxOC4wOSAxMC44NEwxOS44MyAxMC4xM0MyMCAxMC4wNyAyMC4xNyAxMC4xMyAyMC4yNiAxMC4yOUwyMS42NiAxMi43MUMyMS43NSAxMi44NiAyMS43MSAxMy4wNSAyMS41OCAxMy4xNkwyMC4xIDE0LjMxTDIwLjE1IDE1TDIwLjEgMTUuNjhaIi8+CiAgICA8cGF0aCBkPSJNNy4zMjk2NiA3LjQ0NDU0QzguMDgzMSA3LjAwOTU0IDguMzM5MzIgNi4wNTMzMiA3LjkwNDMyIDUuMjk5ODhDNy40NjkzMiA0LjU0NjQzIDYuNTA4MSA0LjI4MTU2IDUuNzU0NjYgNC43MTY1NkM1LjM5MTc2IDQuOTI2MDggNS4xMjY5NSA1LjI3MTE4IDUuMDE4NDkgNS42NzU5NEM0LjkxMDA0IDYuMDgwNzEgNC45NjY4MiA2LjUxMTk4IDUuMTc2MzQgNi44NzQ4OEM1LjYxMTM0IDcuNjI4MzIgNi41NzYyMiA3Ljg3OTU0IDcuMzI5NjYgNy40NDQ1NFpNOS42NTcxOCA0Ljc5NTkzTDEwLjg2NzIgNC45NTE3OUMxMC45NjI4IDQuOTc3NDEgMTEuMDQwMiA1LjA3MTMzIDExLjAzODIgNS4xODc5M0wxMS4wMzg4IDYuOTg4OTNDMTEuMDQ1NSA3LjEwMDU0IDEwLjk2MTYgNy4xOTUxOCAxMC44NTUgNy4yMTA1NEw5LjY2MDAxIDcuMzgwODNMOS4yMzkxNSA4LjEzMTg4TDkuNjY5NjEgOS4yNTc0NUM5LjcwNzI5IDkuMzYyNzEgOS42NjkzNCA5LjQ3Njk5IDkuNTc0MDggOS41MzE5OUw4LjAxNTIzIDEwLjQzMkM3LjkxMTMxIDEwLjQ5MiA3Ljc5MzM3IDEwLjQ2NzcgNy43MjEwNSAxMC4zODI0TDYuOTg3NDggOS40MzE4OEw2LjEwOTMxIDkuNDMwODNMNS4zNDcwNCAxMC4zOTA1QzUuMjg5MDkgMTAuNDcwMiA1LjE3MzgzIDEwLjQ5MDUgNS4wNzE4NyAxMC40MzM5TDMuNTEyNDUgOS41MzI5M0MzLjQxMDQ5IDkuNDc2MzMgMy4zNzY0NyA5LjM1NzQxIDMuNDEwNzUgOS4yNTY3OUwzLjg2MzQ3IDguMTQwOTNMMy42MTc0OSA3Ljc3NDg4TDMuNDIzNDcgNy4zNzg4M0wyLjIzMDc1IDcuMjEyOTdDMi4xMjY0NyA3LjE5MjM1IDIuMDQwNDkgNy4xMDM0MiAyLjA0MjQ1IDYuOTg2ODJMMi4wNDE4NyA1LjE4NTgyQzIuMDQzODMgNS4wNjkyMiAyLjExOTA5IDQuOTc5NTggMi4yMTcwNCA0Ljk2OTIyTDMuNDIwNjUgNC43OTM5M0wzLjg2NzQ5IDQuMDI3ODhMMy40MTEwNSAyLjkxNzMxQzMuMzczMzcgMi44MTIwNCAzLjQxMTMxIDIuNjk3NzYgMy41MTUyMyAyLjYzNzc2TDUuMDc0MDggMS43Mzc3NkM1LjE2OTM0IDEuNjgyNzYgNS4yODcyOSAxLjcwNzA0IDUuMzU5NjEgMS43OTIzMUw2LjExOTE1IDIuNzI3ODhMNi45ODAwMSAyLjczODkzTDcuNzI0OTYgMS43ODkyMkM3Ljc5MTU2IDEuNzA0NTggNy45MTU0OCAxLjY3OTIyIDguMDA4NzkgMS43NDA4Mkw5LjU2ODIxIDIuNjQxODJDOS42NzAxNyAyLjY5ODQyIDkuNzEyODUgMi44MTIzNCA5LjY4NzIzIDIuOTA3OTdMOS4yMTcxOCA0LjAzMzgzTDkuNDYzMTYgNC4zOTk4OEw5LjY1NzE4IDQuNzk1OTNaIi8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-caret-down-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iOS45LDEzLjYgMy42LDcuNCA0LjQsNi42IDkuOSwxMi4yIDE1LjQsNi43IDE2LjEsNy40ICIvPgoJPC9nPgo8L3N2Zz4K);
 --jp-icon-caret-down-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNS45TDksOS43bDMuOC0zLjhsMS4yLDEuMmwtNC45LDVsLTQuOS01TDUuMiw1Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-caret-down: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNy41TDksMTEuMmwzLjgtMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-caret-left: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik0xMC44LDEyLjhMNy4xLDlsMy44LTMuOGwwLDcuNkgxMC44eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-caret-right: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik03LjIsNS4yTDEwLjksOWwtMy44LDMuOFY1LjJINy4yeiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-caret-up-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iMTUuNCwxMy4zIDkuOSw3LjcgNC40LDEzLjIgMy42LDEyLjUgOS45LDYuMyAxNi4xLDEyLjYgIi8+Cgk8L2c+Cjwvc3ZnPgo=);
 --jp-icon-caret-up: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik01LjIsMTAuNUw5LDYuOGwzLjgsMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-case-sensitive: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWFjY2VudDIiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTcuNiw4aDAuOWwzLjUsOGgtMS4xTDEwLDE0SDZsLTAuOSwySDRMNy42LDh6IE04LDkuMUw2LjQsMTNoMy4yTDgsOS4xeiIvPgogICAgPHBhdGggZD0iTTE2LjYsOS44Yy0wLjIsMC4xLTAuNCwwLjEtMC43LDAuMWMtMC4yLDAtMC40LTAuMS0wLjYtMC4yYy0wLjEtMC4xLTAuMi0wLjQtMC4yLTAuNyBjLTAuMywwLjMtMC42LDAuNS0wLjksMC43Yy0wLjMsMC4xLTAuNywwLjItMS4xLDAuMmMtMC4zLDAtMC41LDAtMC43LTAuMWMtMC4yLTAuMS0wLjQtMC4yLTAuNi0wLjNjLTAuMi0wLjEtMC4zLTAuMy0wLjQtMC41IGMtMC4xLTAuMi0wLjEtMC40LTAuMS0wLjdjMC0wLjMsMC4xLTAuNiwwLjItMC44YzAuMS0wLjIsMC4zLTAuNCwwLjQtMC41QzEyLDcsMTIuMiw2LjksMTIuNSw2LjhjMC4yLTAuMSwwLjUtMC4xLDAuNy0wLjIgYzAuMy0wLjEsMC41LTAuMSwwLjctMC4xYzAuMiwwLDAuNC0wLjEsMC42LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJjMC4xLTAuMSwwLjItMC4yLDAuMi0wLjRjMC0xLTEuMS0xLTEuMy0xIGMtMC40LDAtMS40LDAtMS40LDEuMmgtMC45YzAtMC40LDAuMS0wLjcsMC4yLTFjMC4xLTAuMiwwLjMtMC40LDAuNS0wLjZjMC4yLTAuMiwwLjUtMC4zLDAuOC0wLjNDMTMuMyw0LDEzLjYsNCwxMy45LDQgYzAuMywwLDAuNSwwLDAuOCwwLjFjMC4zLDAsMC41LDAuMSwwLjcsMC4yYzAuMiwwLjEsMC40LDAuMywwLjUsMC41QzE2LDUsMTYsNS4yLDE2LDUuNnYyLjljMCwwLjIsMCwwLjQsMCwwLjUgYzAsMC4xLDAuMSwwLjIsMC4zLDAuMmMwLjEsMCwwLjIsMCwwLjMsMFY5Ljh6IE0xNS4yLDYuOWMtMS4yLDAuNi0zLjEsMC4yLTMuMSwxLjRjMCwxLjQsMy4xLDEsMy4xLTAuNVY2Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-circle-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-circle: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjgiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-clear: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8bWFzayBpZD0iZG9udXRIb2xlIj4KICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiIC8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiBmaWxsPSJibGFjayIvPgogIDwvbWFzaz4KCiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxyZWN0IGhlaWdodD0iMTgiIHdpZHRoPSIyIiB4PSIxMSIgeT0iMyIgdHJhbnNmb3JtPSJyb3RhdGUoMzE1LCAxMiwgMTIpIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgbWFzaz0idXJsKCNkb251dEhvbGUpIi8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-close: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1ub25lIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIGpwLWljb24zLWhvdmVyIiBmaWxsPSJub25lIj4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjExIi8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIGpwLWljb24tYWNjZW50Mi1ob3ZlciIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPgogIDwvZz4KCiAgPGcgY2xhc3M9ImpwLWljb24tbm9uZSBqcC1pY29uLWJ1c3kiIGZpbGw9Im5vbmUiPgogICAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iNyIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-code-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiI+CiAgICA8cGF0aCBkPSJNNi41OSwzLjQxTDIsOEw2LjU5LDEyLjZMOCwxMS4xOEw0LjgyLDhMOCw0LjgyTDYuNTksMy40MU0xMi40MSwzLjQxTDExLDQuODJMMTQuMTgsOEwxMSwxMS4xOEwxMi40MSwxMi42TDE3LDhMMTIuNDEsMy40MU0yMS41OSwxMS41OUwxMy41LDE5LjY4TDkuODMsMTZMOC40MiwxNy40MUwxMy41LDIyLjVMMjMsMTNMMjEuNTksMTEuNTlaIiAvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-code: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTExLjQgMTguNkw2LjggMTRMMTEuNCA5LjRMMTAgOEw0IDE0TDEwIDIwTDExLjQgMTguNlpNMTYuNiAxOC42TDIxLjIgMTRMMTYuNiA5LjRMMTggOEwyNCAxNEwxOCAyMEwxNi42IDE4LjZWMTguNloiLz4KCTwvZz4KPC9zdmc+Cg==);
 --jp-icon-collapse-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNNiAxM3YyaDh2LTJ6IiAvPgogICAgPC9nPgo8L3N2Zz4K);
 --jp-icon-console: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwMCAyMDAiPgogIDxnIGNsYXNzPSJqcC1jb25zb2xlLWljb24tYmFja2dyb3VuZC1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMjg4RDEiPgogICAgPHBhdGggZD0iTTIwIDE5LjhoMTYwdjE1OS45SDIweiIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtY29uc29sZS1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIj4KICAgIDxwYXRoIGQ9Ik0xMDUgMTI3LjNoNDB2MTIuOGgtNDB6TTUxLjEgNzdMNzQgOTkuOWwtMjMuMyAyMy4zIDEwLjUgMTAuNSAyMy4zLTIzLjNMOTUgOTkuOSA4NC41IDg5LjQgNjEuNiA2Ni41eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-copy: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTExLjksMUgzLjJDMi40LDEsMS43LDEuNywxLjcsMi41djEwLjJoMS41VjIuNWg4LjdWMXogTTE0LjEsMy45aC04Yy0wLjgsMC0xLjUsMC43LTEuNSwxLjV2MTAuMmMwLDAuOCwwLjcsMS41LDEuNSwxLjVoOCBjMC44LDAsMS41LTAuNywxLjUtMS41VjUuNEMxNS41LDQuNiwxNC45LDMuOSwxNC4xLDMuOXogTTE0LjEsMTUuNWgtOFY1LjRoOFYxNS41eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-copyright: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+CiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0xMS44OCw5LjE0YzEuMjgsMC4wNiwxLjYxLDEuMTUsMS42MywxLjY2aDEuNzljLTAuMDgtMS45OC0xLjQ5LTMuMTktMy40NS0zLjE5QzkuNjQsNy42MSw4LDksOCwxMi4xNCBjMCwxLjk0LDAuOTMsNC4yNCwzLjg0LDQuMjRjMi4yMiwwLDMuNDEtMS42NSwzLjQ0LTIuOTVoLTEuNzljLTAuMDMsMC41OS0wLjQ1LDEuMzgtMS42MywxLjQ0QzEwLjU1LDE0LjgzLDEwLDEzLjgxLDEwLDEyLjE0IEMxMCw5LjI1LDExLjI4LDkuMTYsMTEuODgsOS4xNHogTTEyLDJDNi40OCwyLDIsNi40OCwyLDEyczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMFMxNy41MiwyLDEyLDJ6IE0xMiwyMGMtNC40MSwwLTgtMy41OS04LTggczMuNTktOCw4LThzOCwzLjU5LDgsOFMxNi40MSwyMCwxMiwyMHoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-cut: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-delete: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIiAvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjI2MjYyIiBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz4KPC9zdmc+Cg==);
 --jp-icon-download: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-duplicate: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIuNzk5OTggMC44NzVIOC44OTU4MkM5LjIwMDYxIDAuODc1IDkuNDQ5OTggMS4xMzkxNCA5LjQ0OTk4IDEuNDYxOThDOS40NDk5OCAxLjc4NDgyIDkuMjAwNjEgMi4wNDg5NiA4Ljg5NTgyIDIuMDQ4OTZIMy4zNTQxNUMzLjA0OTM2IDIuMDQ4OTYgMi43OTk5OCAyLjMxMzEgMi43OTk5OCAyLjYzNTk0VjkuNjc5NjlDMi43OTk5OCAxMC4wMDI1IDIuNTUwNjEgMTAuMjY2NyAyLjI0NTgyIDEwLjI2NjdDMS45NDEwMyAxMC4yNjY3IDEuNjkxNjUgMTAuMDAyNSAxLjY5MTY1IDkuNjc5NjlWMi4wNDg5NkMxLjY5MTY1IDEuNDAzMjggMi4xOTA0IDAuODc1IDIuNzk5OTggMC44NzVaTTUuMzY2NjUgMTEuOVY0LjU1SDExLjA4MzNWMTEuOUg1LjM2NjY1Wk00LjE0MTY1IDQuMTQxNjdDNC4xNDE2NSAzLjY5MDYzIDQuNTA3MjggMy4zMjUgNC45NTgzMiAzLjMyNUgxMS40OTE3QzExLjk0MjcgMy4zMjUgMTIuMzA4MyAzLjY5MDYzIDEyLjMwODMgNC4xNDE2N1YxMi4zMDgzQzEyLjMwODMgMTIuNzU5NCAxMS45NDI3IDEzLjEyNSAxMS40OTE3IDEzLjEyNUg0Ljk1ODMyQzQuNTA3MjggMTMuMTI1IDQuMTQxNjUgMTIuNzU5NCA0LjE0MTY1IDEyLjMwODNWNC4xNDE2N1oiIGZpbGw9IiM2MTYxNjEiLz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNOS40MzU3NCA4LjI2NTA3SDguMzY0MzFWOS4zMzY1QzguMzY0MzEgOS40NTQzNSA4LjI2Nzg4IDkuNTUwNzggOC4xNTAwMiA5LjU1MDc4QzguMDMyMTcgOS41NTA3OCA3LjkzNTc0IDkuNDU0MzUgNy45MzU3NCA5LjMzNjVWOC4yNjUwN0g2Ljg2NDMxQzYuNzQ2NDUgOC4yNjUwNyA2LjY1MDAyIDguMTY4NjQgNi42NTAwMiA4LjA1MDc4QzYuNjUwMDIgNy45MzI5MiA2Ljc0NjQ1IDcuODM2NSA2Ljg2NDMxIDcuODM2NUg3LjkzNTc0VjYuNzY1MDdDNy45MzU3NCA2LjY0NzIxIDguMDMyMTcgNi41NTA3OCA4LjE1MDAyIDYuNTUwNzhDOC4yNjc4OCA2LjU1MDc4IDguMzY0MzEgNi42NDcyMSA4LjM2NDMxIDYuNzY1MDdWNy44MzY1SDkuNDM1NzRDOS41NTM2IDcuODM2NSA5LjY1MDAyIDcuOTMyOTIgOS42NTAwMiA4LjA1MDc4QzkuNjUwMDIgOC4xNjg2NCA5LjU1MzYgOC4yNjUwNyA5LjQzNTc0IDguMjY1MDdaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC41Ii8+Cjwvc3ZnPgo=);
 --jp-icon-edit: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-ellipses: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjEyIiByPSIyIi8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-error: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIyIi8+PHBhdGggZD0iTTEwIDNoNHYxMmgtNHoiLz48L2c+CjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz4KPC9zdmc+Cg==);
 --jp-icon-expand-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNMTEgMTBIOXYzSDZ2MmgzdjNoMnYtM2gzdi0yaC0zeiIgLz4KICAgIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-extension: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-fast-forward: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-file-upload: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-file: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuMyA4LjJsLTUuNS01LjVjLS4zLS4zLS43LS41LTEuMi0uNUgzLjljLS44LjEtMS42LjktMS42IDEuOHYxNC4xYzAgLjkuNyAxLjYgMS42IDEuNmgxNC4yYy45IDAgMS42LS43IDEuNi0xLjZWOS40Yy4xLS41LS4xLS45LS40LTEuMnptLTUuOC0zLjNsMy40IDMuNmgtMy40VjQuOXptMy45IDEyLjdINC43Yy0uMSAwLS4yIDAtLjItLjJWNC43YzAtLjIuMS0uMy4yLS4zaDcuMnY0LjRzMCAuOC4zIDEuMWMuMy4zIDEuMS4zIDEuMS4zaDQuM3Y3LjJzLS4xLjItLjIuMnoiLz4KPC9zdmc+Cg==);
 --jp-icon-filter-dot: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWRvdCIgZmlsbD0iI0ZGRiI+CiAgICA8Y2lyY2xlIGN4PSIxOCIgY3k9IjE3IiByPSIzIj48L2NpcmNsZT4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-filter-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-filter: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-folder-favorite: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggY2xhc3M9ImpwLWljb24zIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxNjE2MSIgZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0yLjA2IDExTDE1IDE1LjI4IDEyLjA2IDE3bC43OC0zLjMzLTIuNTktMi4yNCAzLjQxLS4yOUwxNSA4bDEuMzQgMy4xNCAzLjQxLjI5LTIuNTkgMi4yNC43OCAzLjMzeiIvPgo8L3N2Zz4K);
 --jp-icon-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6Ii8+Cjwvc3ZnPgo=);
 --jp-icon-home: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xMCAyMHYtNmg0djZoNXYtOGgzTDEyIDMgMiAxMmgzdjh6Ii8+Cjwvc3ZnPgo=);
 --jp-icon-html5: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uMCBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMDAiIGQ9Ik0xMDguNCAwaDIzdjIyLjhoMjEuMlYwaDIzdjY5aC0yM1Y0NmgtMjF2MjNoLTIzLjJNMjA2IDIzaC0yMC4zVjBoNjMuN3YyM0gyMjl2NDZoLTIzbTUzLjUtNjloMjQuMWwxNC44IDI0LjNMMzEzLjIgMGgyNC4xdjY5aC0yM1YzNC44bC0xNi4xIDI0LjgtMTYuMS0yNC44VjY5aC0yMi42bTg5LjItNjloMjN2NDYuMmgzMi42VjY5aC01NS42Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2U0NGQyNiIgZD0iTTEwNy42IDQ3MWwtMzMtMzcwLjRoMzYyLjhsLTMzIDM3MC4yTDI1NS43IDUxMiIvPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNmMTY1MjkiIGQ9Ik0yNTYgNDgwLjVWMTMxaDE0OC4zTDM3NiA0NDciLz4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNlYmViZWIiIGQ9Ik0xNDIgMTc2LjNoMTE0djQ1LjRoLTY0LjJsNC4yIDQ2LjVoNjB2NDUuM0gxNTQuNG0yIDIyLjhIMjAybDMuMiAzNi4zIDUwLjggMTMuNnY0Ny40bC05My4yLTI2Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIiBkPSJNMzY5LjYgMTc2LjNIMjU1Ljh2NDUuNGgxMDkuNm0tNC4xIDQ2LjVIMjU1Ljh2NDUuNGg1NmwtNS4zIDU5LTUwLjcgMTMuNnY0Ny4ybDkzLTI1LjgiLz4KPC9zdmc+Cg==);
 --jp-icon-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1icmFuZDQganAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNGRkYiIGQ9Ik0yLjIgMi4yaDE3LjV2MTcuNUgyLjJ6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzNGNTFCNSIgZD0iTTIuMiAyLjJ2MTcuNWgxNy41bC4xLTE3LjVIMi4yem0xMi4xIDIuMmMxLjIgMCAyLjIgMSAyLjIgMi4ycy0xIDIuMi0yLjIgMi4yLTIuMi0xLTIuMi0yLjIgMS0yLjIgMi4yLTIuMnpNNC40IDE3LjZsMy4zLTguOCAzLjMgNi42IDIuMi0zLjIgNC40IDUuNEg0LjR6Ii8+Cjwvc3ZnPgo=);
 --jp-icon-info: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUwLjk3OCA1MC45NzgiPgoJPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KCQk8cGF0aCBkPSJNNDMuNTIsNy40NThDMzguNzExLDIuNjQ4LDMyLjMwNywwLDI1LjQ4OSwwQzE4LjY3LDAsMTIuMjY2LDIuNjQ4LDcuNDU4LDcuNDU4CgkJCWMtOS45NDMsOS45NDEtOS45NDMsMjYuMTE5LDAsMzYuMDYyYzQuODA5LDQuODA5LDExLjIxMiw3LjQ1NiwxOC4wMzEsNy40NThjMCwwLDAuMDAxLDAsMC4wMDIsMAoJCQljNi44MTYsMCwxMy4yMjEtMi42NDgsMTguMDI5LTcuNDU4YzQuODA5LTQuODA5LDcuNDU3LTExLjIxMiw3LjQ1Ny0xOC4wM0M1MC45NzcsMTguNjcsNDguMzI4LDEyLjI2Niw0My41Miw3LjQ1OHoKCQkJIE00Mi4xMDYsNDIuMTA1Yy00LjQzMiw0LjQzMS0xMC4zMzIsNi44NzItMTYuNjE1LDYuODcyaC0wLjAwMmMtNi4yODUtMC4wMDEtMTIuMTg3LTIuNDQxLTE2LjYxNy02Ljg3MgoJCQljLTkuMTYyLTkuMTYzLTkuMTYyLTI0LjA3MSwwLTMzLjIzM0MxMy4zMDMsNC40NCwxOS4yMDQsMiwyNS40ODksMmM2LjI4NCwwLDEyLjE4NiwyLjQ0LDE2LjYxNyw2Ljg3MgoJCQljNC40MzEsNC40MzEsNi44NzEsMTAuMzMyLDYuODcxLDE2LjYxN0M0OC45NzcsMzEuNzcyLDQ2LjUzNiwzNy42NzUsNDIuMTA2LDQyLjEwNXoiLz4KCQk8cGF0aCBkPSJNMjMuNTc4LDMyLjIxOGMtMC4wMjMtMS43MzQsMC4xNDMtMy4wNTksMC40OTYtMy45NzJjMC4zNTMtMC45MTMsMS4xMS0xLjk5NywyLjI3Mi0zLjI1MwoJCQljMC40NjgtMC41MzYsMC45MjMtMS4wNjIsMS4zNjctMS41NzVjMC42MjYtMC43NTMsMS4xMDQtMS40NzgsMS40MzYtMi4xNzVjMC4zMzEtMC43MDcsMC40OTUtMS41NDEsMC40OTUtMi41CgkJCWMwLTEuMDk2LTAuMjYtMi4wODgtMC43NzktMi45NzljLTAuNTY1LTAuODc5LTEuNTAxLTEuMzM2LTIuODA2LTEuMzY5Yy0xLjgwMiwwLjA1Ny0yLjk4NSwwLjY2Ny0zLjU1LDEuODMyCgkJCWMtMC4zMDEsMC41MzUtMC41MDMsMS4xNDEtMC42MDcsMS44MTRjLTAuMTM5LDAuNzA3LTAuMjA3LDEuNDMyLTAuMjA3LDIuMTc0aC0yLjkzN2MtMC4wOTEtMi4yMDgsMC40MDctNC4xMTQsMS40OTMtNS43MTkKCQkJYzEuMDYyLTEuNjQsMi44NTUtMi40ODEsNS4zNzgtMi41MjdjMi4xNiwwLjAyMywzLjg3NCwwLjYwOCw1LjE0MSwxLjc1OGMxLjI3OCwxLjE2LDEuOTI5LDIuNzY0LDEuOTUsNC44MTEKCQkJYzAsMS4xNDItMC4xMzcsMi4xMTEtMC40MSwyLjkxMWMtMC4zMDksMC44NDUtMC43MzEsMS41OTMtMS4yNjgsMi4yNDNjLTAuNDkyLDAuNjUtMS4wNjgsMS4zMTgtMS43MywyLjAwMgoJCQljLTAuNjUsMC42OTctMS4zMTMsMS40NzktMS45ODcsMi4zNDZjLTAuMjM5LDAuMzc3LTAuNDI5LDAuNzc3LTAuNTY1LDEuMTk5Yy0wLjE2LDAuOTU5LTAuMjE3LDEuOTUxLTAuMTcxLDIuOTc5CgkJCUMyNi41ODksMzIuMjE4LDIzLjU3OCwzMi4yMTgsMjMuNTc4LDMyLjIxOHogTTIzLjU3OCwzOC4yMnYtMy40ODRoMy4wNzZ2My40ODRIMjMuNTc4eiIvPgoJPC9nPgo8L3N2Zz4K);
 --jp-icon-inspector: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaW5zcGVjdG9yLWljb24tY29sb3IganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIvPgo8L3N2Zz4K);
 --jp-icon-json: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtanNvbi1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0Y5QTgyNSI+CiAgICA8cGF0aCBkPSJNMjAuMiAxMS44Yy0xLjYgMC0xLjcuNS0xLjcgMSAwIC40LjEuOS4xIDEuMy4xLjUuMS45LjEgMS4zIDAgMS43LTEuNCAyLjMtMy41IDIuM2gtLjl2LTEuOWguNWMxLjEgMCAxLjQgMCAxLjQtLjggMC0uMyAwLS42LS4xLTEgMC0uNC0uMS0uOC0uMS0xLjIgMC0xLjMgMC0xLjggMS4zLTItMS4zLS4yLTEuMy0uNy0xLjMtMiAwLS40LjEtLjguMS0xLjIuMS0uNC4xLS43LjEtMSAwLS44LS40LS43LTEuNC0uOGgtLjVWNC4xaC45YzIuMiAwIDMuNS43IDMuNSAyLjMgMCAuNC0uMS45LS4xIDEuMy0uMS41LS4xLjktLjEgMS4zIDAgLjUuMiAxIDEuNyAxdjEuOHpNMS44IDEwLjFjMS42IDAgMS43LS41IDEuNy0xIDAtLjQtLjEtLjktLjEtMS4zLS4xLS41LS4xLS45LS4xLTEuMyAwLTEuNiAxLjQtMi4zIDMuNS0yLjNoLjl2MS45aC0uNWMtMSAwLTEuNCAwLTEuNC44IDAgLjMgMCAuNi4xIDEgMCAuMi4xLjYuMSAxIDAgMS4zIDAgMS44LTEuMyAyQzYgMTEuMiA2IDExLjcgNiAxM2MwIC40LS4xLjgtLjEgMS4yLS4xLjMtLjEuNy0uMSAxIDAgLjguMy44IDEuNC44aC41djEuOWgtLjljLTIuMSAwLTMuNS0uNi0zLjUtMi4zIDAtLjQuMS0uOS4xLTEuMy4xLS41LjEtLjkuMS0xLjMgMC0uNS0uMi0xLTEuNy0xdi0xLjl6Ii8+CiAgICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjEzLjgiIHI9IjIuMSIvPgogICAgPGNpcmNsZSBjeD0iMTEiIGN5PSI4LjIiIHI9IjIuMSIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-julia: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDMyNSAzMDAiPgogIDxnIGNsYXNzPSJqcC1icmFuZDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjY2IzYzMzIj4KICAgIDxwYXRoIGQ9Ik0gMTUwLjg5ODQzOCAyMjUgQyAxNTAuODk4NDM4IDI2Ni40MjE4NzUgMTE3LjMyMDMxMiAzMDAgNzUuODk4NDM4IDMwMCBDIDM0LjQ3NjU2MiAzMDAgMC44OTg0MzggMjY2LjQyMTg3NSAwLjg5ODQzOCAyMjUgQyAwLjg5ODQzOCAxODMuNTc4MTI1IDM0LjQ3NjU2MiAxNTAgNzUuODk4NDM4IDE1MCBDIDExNy4zMjAzMTIgMTUwIDE1MC44OTg0MzggMTgzLjU3ODEyNSAxNTAuODk4NDM4IDIyNSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzM4OTgyNiI+CiAgICA8cGF0aCBkPSJNIDIzNy41IDc1IEMgMjM3LjUgMTE2LjQyMTg3NSAyMDMuOTIxODc1IDE1MCAxNjIuNSAxNTAgQyAxMjEuMDc4MTI1IDE1MCA4Ny41IDExNi40MjE4NzUgODcuNSA3NSBDIDg3LjUgMzMuNTc4MTI1IDEyMS4wNzgxMjUgMCAxNjIuNSAwIEMgMjAzLjkyMTg3NSAwIDIzNy41IDMzLjU3ODEyNSAyMzcuNSA3NSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzk1NThiMiI+CiAgICA8cGF0aCBkPSJNIDMyNC4xMDE1NjIgMjI1IEMgMzI0LjEwMTU2MiAyNjYuNDIxODc1IDI5MC41MjM0MzggMzAwIDI0OS4xMDE1NjIgMzAwIEMgMjA3LjY3OTY4OCAzMDAgMTc0LjEwMTU2MiAyNjYuNDIxODc1IDE3NC4xMDE1NjIgMjI1IEMgMTc0LjEwMTU2MiAxODMuNTc4MTI1IDIwNy42Nzk2ODggMTUwIDI0OS4xMDE1NjIgMTUwIEMgMjkwLjUyMzQzOCAxNTAgMzI0LjEwMTU2MiAxODMuNTc4MTI1IDMyNC4xMDE1NjIgMjI1Ii8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-jupyter-favicon: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUyIiBoZWlnaHQ9IjE2NSIgdmlld0JveD0iMCAwIDE1MiAxNjUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgPGcgY2xhc3M9ImpwLWp1cHl0ZXItaWNvbi1jb2xvciIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA3ODk0NywgMTEwLjU4MjkyNykiIGQ9Ik03NS45NDIyODQyLDI5LjU4MDQ1NjEgQzQzLjMwMjM5NDcsMjkuNTgwNDU2MSAxNC43OTY3ODMyLDE3LjY1MzQ2MzQgMCwwIEM1LjUxMDgzMjExLDE1Ljg0MDY4MjkgMTUuNzgxNTM4OSwyOS41NjY3NzMyIDI5LjM5MDQ5NDcsMzkuMjc4NDE3MSBDNDIuOTk5Nyw0OC45ODk4NTM3IDU5LjI3MzcsNTQuMjA2NzgwNSA3NS45NjA1Nzg5LDU0LjIwNjc4MDUgQzkyLjY0NzQ1NzksNTQuMjA2NzgwNSAxMDguOTIxNDU4LDQ4Ljk4OTg1MzcgMTIyLjUzMDY2MywzOS4yNzg0MTcxIEMxMzYuMTM5NDUzLDI5LjU2Njc3MzIgMTQ2LjQxMDI4NCwxNS44NDA2ODI5IDE1MS45MjExNTgsMCBDMTM3LjA4Nzg2OCwxNy42NTM0NjM0IDEwOC41ODI1ODksMjkuNTgwNDU2MSA3NS45NDIyODQyLDI5LjU4MDQ1NjEgTDc1Ljk0MjI4NDIsMjkuNTgwNDU2MSBaIiAvPgogICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMzczNjgsIDAuNzA0ODc4KSIgZD0iTTc1Ljk3ODQ1NzksMjQuNjI2NDA3MyBDMTA4LjYxODc2MywyNC42MjY0MDczIDEzNy4xMjQ0NTgsMzYuNTUzNDQxNSAxNTEuOTIxMTU4LDU0LjIwNjc4MDUgQzE0Ni40MTAyODQsMzguMzY2MjIyIDEzNi4xMzk0NTMsMjQuNjQwMTMxNyAxMjIuNTMwNjYzLDE0LjkyODQ4NzggQzEwOC45MjE0NTgsNS4yMTY4NDM5IDkyLjY0NzQ1NzksMCA3NS45NjA1Nzg5LDAgQzU5LjI3MzcsMCA0Mi45OTk3LDUuMjE2ODQzOSAyOS4zOTA0OTQ3LDE0LjkyODQ4NzggQzE1Ljc4MTUzODksMjQuNjQwMTMxNyA1LjUxMDgzMjExLDM4LjM2NjIyMiAwLDU0LjIwNjc4MDUgQzE0LjgzMzA4MTYsMzYuNTg5OTI5MyA0My4zMzg1Njg0LDI0LjYyNjQwNzMgNzUuOTc4NDU3OSwyNC42MjY0MDczIEw3NS45Nzg0NTc5LDI0LjYyNjQwNzMgWiIgLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-jupyter: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzkiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCAzOSA1MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYzOCAtMjI4MSkiPgogICAgIDxnIGNsYXNzPSJqcC1qdXB5dGVyLWljb24tY29sb3IiIGZpbGw9IiNGMzc3MjYiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5Ljc0IDIzMTEuOTgpIiBkPSJNIDE4LjI2NDYgNy4xMzQxMUMgMTAuNDE0NSA3LjEzNDExIDMuNTU4NzIgNC4yNTc2IDAgMEMgMS4zMjUzOSAzLjgyMDQgMy43OTU1NiA3LjEzMDgxIDcuMDY4NiA5LjQ3MzAzQyAxMC4zNDE3IDExLjgxNTIgMTQuMjU1NyAxMy4wNzM0IDE4LjI2OSAxMy4wNzM0QyAyMi4yODIzIDEzLjA3MzQgMjYuMTk2MyAxMS44MTUyIDI5LjQ2OTQgOS40NzMwM0MgMzIuNzQyNCA3LjEzMDgxIDM1LjIxMjYgMy44MjA0IDM2LjUzOCAwQyAzMi45NzA1IDQuMjU3NiAyNi4xMTQ4IDcuMTM0MTEgMTguMjY0NiA3LjEzNDExWiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5LjczIDIyODUuNDgpIiBkPSJNIDE4LjI3MzMgNS45MzkzMUMgMjYuMTIzNSA1LjkzOTMxIDMyLjk3OTMgOC44MTU4MyAzNi41MzggMTMuMDczNEMgMzUuMjEyNiA5LjI1MzAzIDMyLjc0MjQgNS45NDI2MiAyOS40Njk0IDMuNjAwNEMgMjYuMTk2MyAxLjI1ODE4IDIyLjI4MjMgMCAxOC4yNjkgMEMgMTQuMjU1NyAwIDEwLjM0MTcgMS4yNTgxOCA3LjA2ODYgMy42MDA0QyAzLjc5NTU2IDUuOTQyNjIgMS4zMjUzOSA5LjI1MzAzIDAgMTMuMDczNEMgMy41Njc0NSA4LjgyNDYzIDEwLjQyMzIgNS45MzkzMSAxOC4yNzMzIDUuOTM5MzFaIi8+CiAgICA8L2c+CiAgICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjY5LjMgMjI4MS4zMSkiIGQ9Ik0gNS44OTM1MyAyLjg0NEMgNS45MTg4OSAzLjQzMTY1IDUuNzcwODUgNC4wMTM2NyA1LjQ2ODE1IDQuNTE2NDVDIDUuMTY1NDUgNS4wMTkyMiA0LjcyMTY4IDUuNDIwMTUgNC4xOTI5OSA1LjY2ODUxQyAzLjY2NDMgNS45MTY4OCAzLjA3NDQ0IDYuMDAxNTEgMi40OTgwNSA1LjkxMTcxQyAxLjkyMTY2IDUuODIxOSAxLjM4NDYzIDUuNTYxNyAwLjk1NDg5OCA1LjE2NDAxQyAwLjUyNTE3IDQuNzY2MzMgMC4yMjIwNTYgNC4yNDkwMyAwLjA4MzkwMzcgMy42Nzc1N0MgLTAuMDU0MjQ4MyAzLjEwNjExIC0wLjAyMTIzIDIuNTA2MTcgMC4xNzg3ODEgMS45NTM2NEMgMC4zNzg3OTMgMS40MDExIDAuNzM2ODA5IDAuOTIwODE3IDEuMjA3NTQgMC41NzM1MzhDIDEuNjc4MjYgMC4yMjYyNTkgMi4yNDA1NSAwLjAyNzU5MTkgMi44MjMyNiAwLjAwMjY3MjI5QyAzLjYwMzg5IC0wLjAzMDcxMTUgNC4zNjU3MyAwLjI0OTc4OSA0Ljk0MTQyIDAuNzgyNTUxQyA1LjUxNzExIDEuMzE1MzEgNS44NTk1NiAyLjA1Njc2IDUuODkzNTMgMi44NDRaIi8+CiAgICAgIDxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2MzkuOCAyMzIzLjgxKSIgZD0iTSA3LjQyNzg5IDMuNTgzMzhDIDcuNDYwMDggNC4zMjQzIDcuMjczNTUgNS4wNTgxOSA2Ljg5MTkzIDUuNjkyMTNDIDYuNTEwMzEgNi4zMjYwNyA1Ljk1MDc1IDYuODMxNTYgNS4yODQxMSA3LjE0NDZDIDQuNjE3NDcgNy40NTc2MyAzLjg3MzcxIDcuNTY0MTQgMy4xNDcwMiA3LjQ1MDYzQyAyLjQyMDMyIDcuMzM3MTIgMS43NDMzNiA3LjAwODcgMS4yMDE4NCA2LjUwNjk1QyAwLjY2MDMyOCA2LjAwNTIgMC4yNzg2MSA1LjM1MjY4IDAuMTA1MDE3IDQuNjMyMDJDIC0wLjA2ODU3NTcgMy45MTEzNSAtMC4wMjYyMzYxIDMuMTU0OTQgMC4yMjY2NzUgMi40NTg1NkMgMC40Nzk1ODcgMS43NjIxNyAwLjkzMTY5NyAxLjE1NzEzIDEuNTI1NzYgMC43MjAwMzNDIDIuMTE5ODMgMC4yODI5MzUgMi44MjkxNCAwLjAzMzQzOTUgMy41NjM4OSAwLjAwMzEzMzQ0QyA0LjU0NjY3IC0wLjAzNzQwMzMgNS41MDUyOSAwLjMxNjcwNiA2LjIyOTYxIDAuOTg3ODM1QyA2Ljk1MzkzIDEuNjU4OTYgNy4zODQ4NCAyLjU5MjM1IDcuNDI3ODkgMy41ODMzOEwgNy40Mjc4OSAzLjU4MzM4WiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM4LjM2IDIyODYuMDYpIiBkPSJNIDIuMjc0NzEgNC4zOTYyOUMgMS44NDM2MyA0LjQxNTA4IDEuNDE2NzEgNC4zMDQ0NSAxLjA0Nzk5IDQuMDc4NDNDIDAuNjc5MjY4IDMuODUyNCAwLjM4NTMyOCAzLjUyMTE0IDAuMjAzMzcxIDMuMTI2NTZDIDAuMDIxNDEzNiAyLjczMTk4IC0wLjA0MDM3OTggMi4yOTE4MyAwLjAyNTgxMTYgMS44NjE4MUMgMC4wOTIwMDMxIDEuNDMxOCAwLjI4MzIwNCAxLjAzMTI2IDAuNTc1MjEzIDAuNzEwODgzQyAwLjg2NzIyMiAwLjM5MDUxIDEuMjQ2OTEgMC4xNjQ3MDggMS42NjYyMiAwLjA2MjA1OTJDIDIuMDg1NTMgLTAuMDQwNTg5NyAyLjUyNTYxIC0wLjAxNTQ3MTQgMi45MzA3NiAwLjEzNDIzNUMgMy4zMzU5MSAwLjI4Mzk0MSAzLjY4NzkyIDAuNTUxNTA1IDMuOTQyMjIgMC45MDMwNkMgNC4xOTY1MiAxLjI1NDYyIDQuMzQxNjkgMS42NzQzNiA0LjM1OTM1IDIuMTA5MTZDIDQuMzgyOTkgMi42OTEwNyA0LjE3Njc4IDMuMjU4NjkgMy43ODU5NyAzLjY4NzQ2QyAzLjM5NTE2IDQuMTE2MjQgMi44NTE2NiA0LjM3MTE2IDIuMjc0NzEgNC4zOTYyOUwgMi4yNzQ3MSA0LjM5NjI5WiIvPgogICAgPC9nPgogIDwvZz4+Cjwvc3ZnPgo=);
 --jp-icon-jupyterlab-wordmark: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIHZpZXdCb3g9IjAgMCAxODYwLjggNDc1Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0RTRFNEUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4MC4xMzY0MDEsIDY0LjI3MTQ5MykiPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDU4Ljg3NTU2NikiPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA4NzYwMywgMC4xNDAyOTQpIj4KICAgICAgICA8cGF0aCBkPSJNLTQyNi45LDE2OS44YzAsNDguNy0zLjcsNjQuNy0xMy42LDc2LjRjLTEwLjgsMTAtMjUsMTUuNS0zOS43LDE1LjVsMy43LDI5IGMyMi44LDAuMyw0NC44LTcuOSw2MS45LTIzLjFjMTcuOC0xOC41LDI0LTQ0LjEsMjQtODMuM1YwSC00Mjd2MTcwLjFMLTQyNi45LDE2OS44TC00MjYuOSwxNjkuOHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU1LjA0NTI5NiwgNTYuODM3MTA0KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuNTYyNDUzLCAxLjc5OTg0MikiPgogICAgICAgIDxwYXRoIGQ9Ik0tMzEyLDE0OGMwLDIxLDAsMzkuNSwxLjcsNTUuNGgtMzEuOGwtMi4xLTMzLjNoLTAuOGMtNi43LDExLjYtMTYuNCwyMS4zLTI4LDI3LjkgYy0xMS42LDYuNi0yNC44LDEwLTM4LjIsOS44Yy0zMS40LDAtNjktMTcuNy02OS04OVYwaDM2LjR2MTEyLjdjMCwzOC43LDExLjYsNjQuNyw0NC42LDY0LjdjMTAuMy0wLjIsMjAuNC0zLjUsMjguOS05LjQgYzguNS01LjksMTUuMS0xNC4zLDE4LjktMjMuOWMyLjItNi4xLDMuMy0xMi41LDMuMy0xOC45VjAuMmgzNi40VjE0OEgtMzEyTC0zMTIsMTQ4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzOTAuMDEzMzIyLCA1My40Nzk2MzgpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS43MDY0NTgsIDAuMjMxNDI1KSI+CiAgICAgICAgPHBhdGggZD0iTS00NzguNiw3MS40YzAtMjYtMC44LTQ3LTEuNy02Ni43aDMyLjdsMS43LDM0LjhoMC44YzcuMS0xMi41LDE3LjUtMjIuOCwzMC4xLTI5LjcgYzEyLjUtNywyNi43LTEwLjMsNDEtOS44YzQ4LjMsMCw4NC43LDQxLjcsODQuNywxMDMuM2MwLDczLjEtNDMuNywxMDkuMi05MSwxMDkuMmMtMTIuMSwwLjUtMjQuMi0yLjItMzUtNy44IGMtMTAuOC01LjYtMTkuOS0xMy45LTI2LjYtMjQuMmgtMC44VjI5MWgtMzZ2LTIyMEwtNDc4LjYsNzEuNEwtNDc4LjYsNzEuNHogTS00NDIuNiwxMjUuNmMwLjEsNS4xLDAuNiwxMC4xLDEuNywxNS4xIGMzLDEyLjMsOS45LDIzLjMsMTkuOCwzMS4xYzkuOSw3LjgsMjIuMSwxMi4xLDM0LjcsMTIuMWMzOC41LDAsNjAuNy0zMS45LDYwLjctNzguNWMwLTQwLjctMjEuMS03NS42LTU5LjUtNzUuNiBjLTEyLjksMC40LTI1LjMsNS4xLTM1LjMsMTMuNGMtOS45LDguMy0xNi45LDE5LjctMTkuNiwzMi40Yy0xLjUsNC45LTIuMywxMC0yLjUsMTUuMVYxMjUuNkwtNDQyLjYsMTI1LjZMLTQ0Mi42LDEyNS42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MDYuNzQwNzI2LCA1Ni44MzcxMDQpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC43NTEyMjYsIDEuOTg5Mjk5KSI+CiAgICAgICAgPHBhdGggZD0iTS00NDAuOCwwbDQzLjcsMTIwLjFjNC41LDEzLjQsOS41LDI5LjQsMTIuOCw0MS43aDAuOGMzLjctMTIuMiw3LjktMjcuNywxMi44LTQyLjQgbDM5LjctMTE5LjJoMzguNUwtMzQ2LjksMTQ1Yy0yNiw2OS43LTQzLjcsMTA1LjQtNjguNiwxMjcuMmMtMTIuNSwxMS43LTI3LjksMjAtNDQuNiwyMy45bC05LjEtMzEuMSBjMTEuNy0zLjksMjIuNS0xMC4xLDMxLjgtMTguMWMxMy4yLTExLjEsMjMuNy0yNS4yLDMwLjYtNDEuMmMxLjUtMi44LDIuNS01LjcsMi45LTguOGMtMC4zLTMuMy0xLjItNi42LTIuNS05LjdMLTQ4MC4yLDAuMSBoMzkuN0wtNDQwLjgsMEwtNDQwLjgsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODIyLjc0ODEwNCwgMC4wMDAwMDApIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40NjQwNTAsIDAuMzc4OTE0KSI+CiAgICAgICAgPHBhdGggZD0iTS00MTMuNywwdjU4LjNoNTJ2MjguMmgtNTJWMTk2YzAsMjUsNywzOS41LDI3LjMsMzkuNWM3LjEsMC4xLDE0LjItMC43LDIxLjEtMi41IGwxLjcsMjcuN2MtMTAuMywzLjctMjEuMyw1LjQtMzIuMiw1Yy03LjMsMC40LTE0LjYtMC43LTIxLjMtMy40Yy02LjgtMi43LTEyLjktNi44LTE3LjktMTIuMWMtMTAuMy0xMC45LTE0LjEtMjktMTQuMS01Mi45IFY4Ni41aC0zMVY1OC4zaDMxVjkuNkwtNDEzLjcsMEwtNDEzLjcsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTc0LjQzMzI4NiwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuOTkwMDM0LCAwLjYxMDMzOSkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDQ1LjgsMTEzYzAuOCw1MCwzMi4yLDcwLjYsNjguNiw3MC42YzE5LDAuNiwzNy45LTMsNTUuMy0xMC41bDYuMiwyNi40IGMtMjAuOSw4LjktNDMuNSwxMy4xLTY2LjIsMTIuNmMtNjEuNSwwLTk4LjMtNDEuMi05OC4zLTEwMi41Qy00ODAuMiw0OC4yLTQ0NC43LDAtMzg2LjUsMGM2NS4yLDAsODIuNyw1OC4zLDgyLjcsOTUuNyBjLTAuMSw1LjgtMC41LDExLjUtMS4yLDE3LjJoLTE0MC42SC00NDUuOEwtNDQ1LjgsMTEzeiBNLTMzOS4yLDg2LjZjMC40LTIzLjUtOS41LTYwLjEtNTAuNC02MC4xIGMtMzYuOCwwLTUyLjgsMzQuNC01NS43LDYwLjFILTMzOS4yTC0zMzkuMiw4Ni42TC0zMzkuMiw4Ni42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAxLjk2MTA1OCwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMTc5NjQwLCAwLjcwNTA2OCkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDc4LjYsNjhjMC0yMy45LTAuNC00NC41LTEuNy02My40aDMxLjhsMS4yLDM5LjloMS43YzkuMS0yNy4zLDMxLTQ0LjUsNTUuMy00NC41IGMzLjUtMC4xLDcsMC40LDEwLjMsMS4ydjM0LjhjLTQuMS0wLjktOC4yLTEuMy0xMi40LTEuMmMtMjUuNiwwLTQzLjcsMTkuNy00OC43LDQ3LjRjLTEsNS43LTEuNiwxMS41LTEuNywxNy4ydjEwOC4zaC0zNlY2OCBMLTQ3OC42LDY4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMCIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCBkPSJNMTM1Mi4zLDMyNi4yaDM3VjI4aC0zN1YzMjYuMnogTTE2MDQuOCwzMjYuMmMtMi41LTEzLjktMy40LTMxLjEtMy40LTQ4Ljd2LTc2IGMwLTQwLjctMTUuMS04My4xLTc3LjMtODMuMWMtMjUuNiwwLTUwLDcuMS02Ni44LDE4LjFsOC40LDI0LjRjMTQuMy05LjIsMzQtMTUuMSw1My0xNS4xYzQxLjYsMCw0Ni4yLDMwLjIsNDYuMiw0N3Y0LjIgYy03OC42LTAuNC0xMjIuMywyNi41LTEyMi4zLDc1LjZjMCwyOS40LDIxLDU4LjQsNjIuMiw1OC40YzI5LDAsNTAuOS0xNC4zLDYyLjItMzAuMmgxLjNsMi45LDI1LjZIMTYwNC44eiBNMTU2NS43LDI1Ny43IGMwLDMuOC0wLjgsOC0yLjEsMTEuOGMtNS45LDE3LjItMjIuNywzNC00OS4yLDM0Yy0xOC45LDAtMzQuOS0xMS4zLTM0LjktMzUuM2MwLTM5LjUsNDUuOC00Ni42LDg2LjItNDUuOFYyNTcuN3ogTTE2OTguNSwzMjYuMiBsMS43LTMzLjZoMS4zYzE1LjEsMjYuOSwzOC43LDM4LjIsNjguMSwzOC4yYzQ1LjQsMCw5MS4yLTM2LjEsOTEuMi0xMDguOGMwLjQtNjEuNy0zNS4zLTEwMy43LTg1LjctMTAzLjcgYy0zMi44LDAtNTYuMywxNC43LTY5LjMsMzcuNGgtMC44VjI4aC0zNi42djI0NS43YzAsMTguMS0wLjgsMzguNi0xLjcsNTIuNUgxNjk4LjV6IE0xNzA0LjgsMjA4LjJjMC01LjksMS4zLTEwLjksMi4xLTE1LjEgYzcuNi0yOC4xLDMxLjEtNDUuNCw1Ni4zLTQ1LjRjMzkuNSwwLDYwLjUsMzQuOSw2MC41LDc1LjZjMCw0Ni42LTIzLjEsNzguMS02MS44LDc4LjFjLTI2LjksMC00OC4zLTE3LjYtNTUuNS00My4zIGMtMC44LTQuMi0xLjctOC44LTEuNy0xMy40VjIwOC4yeiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzYxNjE2MSIgZD0iTTE1IDlIOXY2aDZWOXptLTIgNGgtMnYtMmgydjJ6bTgtMlY5aC0yVjdjMC0xLjEtLjktMi0yLTJoLTJWM2gtMnYyaC0yVjNIOXYySDdjLTEuMSAwLTIgLjktMiAydjJIM3YyaDJ2MkgzdjJoMnYyYzAgMS4xLjkgMiAyIDJoMnYyaDJ2LTJoMnYyaDJ2LTJoMmMxLjEgMCAyLS45IDItMnYtMmgydi0yaC0ydi0yaDJ6bS00IDZIN1Y3aDEwdjEweiIvPgo8L3N2Zz4K);
 --jp-icon-keyboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMTdjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0tOSAzaDJ2MmgtMlY4em0wIDNoMnYyaC0ydi0yek04IDhoMnYySDhWOHptMCAzaDJ2Mkg4di0yem0tMSAySDV2LTJoMnYyem0wLTNINVY4aDJ2MnptOSA3SDh2LTJoOHYyem0wLTRoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6bTMgM2gtMnYtMmgydjJ6bTAtM2gtMlY4aDJ2MnoiLz4KPC9zdmc+Cg==);
 --jp-icon-launch: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIHdpZHRoPSIzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yNiwyOEg2YTIuMDAyNywyLjAwMjcsMCwwLDEtMi0yVjZBMi4wMDI3LDIuMDAyNywwLDAsMSw2LDRIMTZWNkg2VjI2SDI2VjE2aDJWMjZBMi4wMDI3LDIuMDAyNywwLDAsMSwyNiwyOFoiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjAgMiAyMCA0IDI2LjU4NiA0IDE4IDEyLjU4NiAxOS40MTQgMTQgMjggNS40MTQgMjggMTIgMzAgMTIgMzAgMiAyMCAyIi8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-launcher: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkgMTlINVY1aDdWM0g1YTIgMiAwIDAwLTIgMnYxNGEyIDIgMCAwMDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiLz4KPC9zdmc+Cg==);
 --jp-icon-line-form: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJNNS44OCA0LjEyTDEzLjc2IDEybC03Ljg4IDcuODhMOCAyMmwxMC0xMEw4IDJ6Ii8+Cjwvc3ZnPgo=);
 --jp-icon-link: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xOSA1djE0SDVWNWgxNG0xLjEtMkgzLjljLS41IDAtLjkuNC0uOS45djE2LjJjMCAuNC40LjkuOS45aDE2LjJjLjQgMCAuOS0uNS45LS45VjMuOWMwLS41LS41LS45LS45LS45ek0xMSA3aDZ2MmgtNlY3em0wIDRoNnYyaC02di0yem0wIDRoNnYyaC02ek03IDdoMnYySDd6bTAgNGgydjJIN3ptMCA0aDJ2Mkg3eiIvPgo8L3N2Zz4K);
 --jp-icon-markdown: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjN0IxRkEyIiBkPSJNNSAxNC45aDEybC02LjEgNnptOS40LTYuOGMwLTEuMy0uMS0yLjktLjEtNC41LS40IDEuNC0uOSAyLjktMS4zIDQuM2wtMS4zIDQuM2gtMkw4LjUgNy45Yy0uNC0xLjMtLjctMi45LTEtNC4zLS4xIDEuNi0uMSAzLjItLjIgNC42TDcgMTIuNEg0LjhsLjctMTFoMy4zTDEwIDVjLjQgMS4yLjcgMi43IDEgMy45LjMtMS4yLjctMi42IDEtMy45bDEuMi0zLjdoMy4zbC42IDExaC0yLjRsLS4zLTQuMnoiLz4KPC9zdmc+Cg==);
 --jp-icon-move-down: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMTIuNDcxIDcuNTI4OTlDMTIuNzYzMiA3LjIzNjg0IDEyLjc2MzIgNi43NjMxNiAxMi40NzEgNi40NzEwMVY2LjQ3MTAxQzEyLjE3OSA2LjE3OTA1IDExLjcwNTcgNi4xNzg4NCAxMS40MTM1IDYuNDcwNTRMNy43NSAxMC4xMjc1VjEuNzVDNy43NSAxLjMzNTc5IDcuNDE0MjEgMSA3IDFWMUM2LjU4NTc5IDEgNi4yNSAxLjMzNTc5IDYuMjUgMS43NVYxMC4xMjc1TDIuNTk3MjYgNi40NjgyMkMyLjMwMzM4IDYuMTczODEgMS44MjY0MSA2LjE3MzU5IDEuNTMyMjYgNi40Njc3NFY2LjQ2Nzc0QzEuMjM4MyA2Ljc2MTcgMS4yMzgzIDcuMjM4MyAxLjUzMjI2IDcuNTMyMjZMNi4yOTI4OSAxMi4yOTI5QzYuNjgzNDIgMTIuNjgzNCA3LjMxNjU4IDEyLjY4MzQgNy43MDcxMSAxMi4yOTI5TDEyLjQ3MSA3LjUyODk5WiIgZmlsbD0iIzYxNjE2MSIvPgo8L3N2Zz4K);
 --jp-icon-move-up: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMS41Mjg5OSA2LjQ3MTAxQzEuMjM2ODQgNi43NjMxNiAxLjIzNjg0IDcuMjM2ODQgMS41Mjg5OSA3LjUyODk5VjcuNTI4OTlDMS44MjA5NSA3LjgyMDk1IDIuMjk0MjYgNy44MjExNiAyLjU4NjQ5IDcuNTI5NDZMNi4yNSAzLjg3MjVWMTIuMjVDNi4yNSAxMi42NjQyIDYuNTg1NzkgMTMgNyAxM1YxM0M3LjQxNDIxIDEzIDcuNzUgMTIuNjY0MiA3Ljc1IDEyLjI1VjMuODcyNUwxMS40MDI3IDcuNTMxNzhDMTEuNjk2NiA3LjgyNjE5IDEyLjE3MzYgNy44MjY0MSAxMi40Njc3IDcuNTMyMjZWNy41MzIyNkMxMi43NjE3IDcuMjM4MyAxMi43NjE3IDYuNzYxNyAxMi40Njc3IDYuNDY3NzRMNy43MDcxMSAxLjcwNzExQzcuMzE2NTggMS4zMTY1OCA2LjY4MzQyIDEuMzE2NTggNi4yOTI4OSAxLjcwNzExTDEuNTI4OTkgNi40NzEwMVoiIGZpbGw9IiM2MTYxNjEiLz4KPC9zdmc+Cg==);
 --jp-icon-new-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS0xIDhoLTN2M2gtMnYtM2gtM3YtMmgzVjloMnYzaDN2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-not-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI1IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMTkgMTcuMTg0NCAyLjk2OTY4IDE0LjMwMzIgMS44NjA5NCAxMS40NDA5WiIvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24yIiBzdHJva2U9IiMzMzMzMzMiIHN0cm9rZS13aWR0aD0iMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4zMTU5MiA5LjMyMDMxKSIgZD0iTTcuMzY4NDIgMEwwIDcuMzY0NzkiLz4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMzE1OTIgMTYuNjgzNikgc2NhbGUoMSAtMSkiIGQ9Ik03LjM2ODQyIDBMMCA3LjM2NDc5Ii8+Cjwvc3ZnPgo=);
 --jp-icon-notebook: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtbm90ZWJvb2staWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNFRjZDMDAiPgogICAgPHBhdGggZD0iTTE4LjcgMy4zdjE1LjRIMy4zVjMuM2gxNS40bTEuNS0xLjVIMS44djE4LjNoMTguM2wuMS0xOC4zeiIvPgogICAgPHBhdGggZD0iTTE2LjUgMTYuNWwtNS40LTQuMy01LjYgNC4zdi0xMWgxMXoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-numbering: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTQgMTlINlYxOS41SDVWMjAuNUg2VjIxSDRWMjJIN1YxOEg0VjE5Wk01IDEwSDZWNkg0VjdINVYxMFpNNCAxM0g1LjhMNCAxNS4xVjE2SDdWMTVINS4yTDcgMTIuOVYxMkg0VjEzWk05IDdWOUgyM1Y3SDlaTTkgMjFIMjNWMTlIOVYyMVpNOSAxNUgyM1YxM0g5VjE1WiIvPgoJPC9nPgo8L3N2Zz4K);
 --jp-icon-offline-bolt: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDIuMDJjLTUuNTEgMC05Ljk4IDQuNDctOS45OCA5Ljk4czQuNDcgOS45OCA5Ljk4IDkuOTggOS45OC00LjQ3IDkuOTgtOS45OFMxNy41MSAyLjAyIDEyIDIuMDJ6TTExLjQ4IDIwdi02LjI2SDhMMTMgNHY2LjI2aDMuMzVMMTEuNDggMjB6Ii8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-palette: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE4IDEzVjIwSDRWNkg5LjAyQzkuMDcgNS4yOSA5LjI0IDQuNjIgOS41IDRINEMyLjkgNCAyIDQuOSAyIDZWMjBDMiAyMS4xIDIuOSAyMiA0IDIySDE4QzE5LjEgMjIgMjAgMjEuMSAyMCAyMFYxNUwxOCAxM1pNMTkuMyA4Ljg5QzE5Ljc0IDguMTkgMjAgNy4zOCAyMCA2LjVDMjAgNC4wMSAxNy45OSAyIDE1LjUgMkMxMy4wMSAyIDExIDQuMDEgMTEgNi41QzExIDguOTkgMTMuMDEgMTEgMTUuNDkgMTFDMTYuMzcgMTEgMTcuMTkgMTAuNzQgMTcuODggMTAuM0wyMSAxMy40MkwyMi40MiAxMkwxOS4zIDguODlaTTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41QzEzIDUuMTIgMTQuMTIgNCAxNS41IDRDMTYuODggNCAxOCA1LjEyIDE4IDYuNUMxOCA3Ljg4IDE2Ljg4IDkgMTUuNSA5WiIvPgogICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDZIOS4wMTg5NEM5LjAwNjM5IDYuMTY1MDIgOSA2LjMzMTc2IDkgNi41QzkgOC44MTU3NyAxMC4yMTEgMTAuODQ4NyAxMi4wMzQzIDEySDlWMTRIMTZWMTIuOTgxMUMxNi41NzAzIDEyLjkzNzcgMTcuMTIgMTIuODIwNyAxNy42Mzk2IDEyLjYzOTZMMTggMTNWMjBINFY2Wk04IDhINlYxMEg4VjhaTTYgMTJIOFYxNEg2VjEyWk04IDE2SDZWMThIOFYxNlpNOSAxNkgxNlYxOEg5VjE2WiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-paste: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-pdf: url(data:image/svg+xml;base64,PHN2ZwogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMiAyMiIgd2lkdGg9IjE2Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0icm90YXRlKDQ1KSIgY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0ZGMkEyQSIKICAgICAgIGQ9Im0gMjIuMzQ0MzY5LC0zLjAxNjM2NDIgaCA1LjYzODYwNCB2IDEuNTc5MjQzMyBoIC0zLjU0OTIyNyB2IDEuNTA4NjkyOTkgaCAzLjMzNzU3NiBWIDEuNjUwODE1NCBoIC0zLjMzNzU3NiB2IDMuNDM1MjYxMyBoIC0yLjA4OTM3NyB6IG0gLTcuMTM2NDQ0LDEuNTc5MjQzMyB2IDQuOTQzOTU0MyBoIDAuNzQ4OTIgcSAxLjI4MDc2MSwwIDEuOTUzNzAzLC0wLjYzNDk1MzUgMC42NzgzNjksLTAuNjM0OTUzNSAwLjY3ODM2OSwtMS44NDUxNjQxIDAsLTEuMjA0NzgzNTUgLTAuNjcyOTQyLC0xLjgzNDMxMDExIC0wLjY3Mjk0MiwtMC42Mjk1MjY1OSAtMS45NTkxMywtMC42Mjk1MjY1OSB6IG0gLTIuMDg5Mzc3LC0xLjU3OTI0MzMgaCAyLjIwMzM0MyBxIDEuODQ1MTY0LDAgMi43NDYwMzksMC4yNjU5MjA3IDAuOTA2MzAxLDAuMjYwNDkzNyAxLjU1MjEwOCwwLjg5MDAyMDMgMC41Njk4MywwLjU0ODEyMjMgMC44NDY2MDUsMS4yNjQ0ODAwNiAwLjI3Njc3NCwwLjcxNjM1NzgxIDAuMjc2Nzc0LDEuNjIyNjU4OTQgMCwwLjkxNzE1NTEgLTAuMjc2Nzc0LDEuNjM4OTM5OSAtMC4yNzY3NzUsMC43MTYzNTc4IC0wLjg0NjYwNSwxLjI2NDQ4IC0wLjY1MTIzNCwwLjYyOTUyNjYgLTEuNTYyOTYyLDAuODk1NDQ3MyAtMC45MTE3MjgsMC4yNjA0OTM3IC0yLjczNTE4NSwwLjI2MDQ5MzcgaCAtMi4yMDMzNDMgeiBtIC04LjE0NTg1NjUsMCBoIDMuNDY3ODIzIHEgMS41NDY2ODE2LDAgMi4zNzE1Nzg1LDAuNjg5MjIzIDAuODMwMzI0LDAuNjgzNzk2MSAwLjgzMDMyNCwxLjk1MzcwMzE0IDAsMS4yNzUzMzM5NyAtMC44MzAzMjQsMS45NjQ1NTcwNiBRIDkuOTg3MTk2MSwyLjI3NDkxNSA4LjQ0MDUxNDUsMi4yNzQ5MTUgSCA3LjA2MjA2ODQgViA1LjA4NjA3NjcgSCA0Ljk3MjY5MTUgWiBtIDIuMDg5Mzc2OSwxLjUxNDExOTkgdiAyLjI2MzAzOTQzIGggMS4xNTU5NDEgcSAwLjYwNzgxODgsMCAwLjkzODg2MjksLTAuMjkzMDU1NDcgMC4zMzEwNDQxLC0wLjI5ODQ4MjQxIDAuMzMxMDQ0MSwtMC44NDExNzc3MiAwLC0wLjU0MjY5NTMxIC0wLjMzMTA0NDEsLTAuODM1NzUwNzQgLTAuMzMxMDQ0MSwtMC4yOTMwNTU1IC0wLjkzODg2MjksLTAuMjkzMDU1NSB6IgovPgo8L3N2Zz4K);
 --jp-icon-python: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iLTEwIC0xMCAxMzEuMTYxMzYxNjk0MzM1OTQgMTMyLjM4ODk5OTkzODk2NDg0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzA2OTk4IiBkPSJNIDU0LjkxODc4NSw5LjE5Mjc0MjFlLTQgQyA1MC4zMzUxMzIsMC4wMjIyMTcyNyA0NS45NTc4NDYsMC40MTMxMzY5NyA0Mi4xMDYyODUsMS4wOTQ2NjkzIDMwLjc2MDA2OSwzLjA5OTE3MzEgMjguNzAwMDM2LDcuMjk0NzcxNCAyOC43MDAwMzUsMTUuMDMyMTY5IHYgMTAuMjE4NzUgaCAyNi44MTI1IHYgMy40MDYyNSBoIC0yNi44MTI1IC0xMC4wNjI1IGMgLTcuNzkyNDU5LDAgLTE0LjYxNTc1ODgsNC42ODM3MTcgLTE2Ljc0OTk5OTgsMTMuNTkzNzUgLTIuNDYxODE5OTgsMTAuMjEyOTY2IC0yLjU3MTAxNTA4LDE2LjU4NjAyMyAwLDI3LjI1IDEuOTA1OTI4Myw3LjkzNzg1MiA2LjQ1NzU0MzIsMTMuNTkzNzQ4IDE0LjI0OTk5OTgsMTMuNTkzNzUgaCA5LjIxODc1IHYgLTEyLjI1IGMgMCwtOC44NDk5MDIgNy42NTcxNDQsLTE2LjY1NjI0OCAxNi43NSwtMTYuNjU2MjUgaCAyNi43ODEyNSBjIDcuNDU0OTUxLDAgMTMuNDA2MjUzLC02LjEzODE2NCAxMy40MDYyNSwtMTMuNjI1IHYgLTI1LjUzMTI1IGMgMCwtNy4yNjYzMzg2IC02LjEyOTk4LC0xMi43MjQ3NzcxIC0xMy40MDYyNSwtMTMuOTM3NDk5NyBDIDY0LjI4MTU0OCwwLjMyNzk0Mzk3IDU5LjUwMjQzOCwtMC4wMjAzNzkwMyA1NC45MTg3ODUsOS4xOTI3NDIxZS00IFogbSAtMTQuNSw4LjIxODc1MDEyNTc5IGMgMi43Njk1NDcsMCA1LjAzMTI1LDIuMjk4NjQ1NiA1LjAzMTI1LDUuMTI0OTk5NiAtMmUtNiwyLjgxNjMzNiAtMi4yNjE3MDMsNS4wOTM3NSAtNS4wMzEyNSw1LjA5Mzc1IC0yLjc3OTQ3NiwtMWUtNiAtNS4wMzEyNSwtMi4yNzc0MTUgLTUuMDMxMjUsLTUuMDkzNzUgLTEwZS03LC0yLjgyNjM1MyAyLjI1MTc3NCwtNS4xMjQ5OTk2IDUuMDMxMjUsLTUuMTI0OTk5NiB6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2ZmZDQzYiIgZD0ibSA4NS42Mzc1MzUsMjguNjU3MTY5IHYgMTEuOTA2MjUgYyAwLDkuMjMwNzU1IC03LjgyNTg5NSwxNi45OTk5OTkgLTE2Ljc1LDE3IGggLTI2Ljc4MTI1IGMgLTcuMzM1ODMzLDAgLTEzLjQwNjI0OSw2LjI3ODQ4MyAtMTMuNDA2MjUsMTMuNjI1IHYgMjUuNTMxMjQ3IGMgMCw3LjI2NjM0NCA2LjMxODU4OCwxMS41NDAzMjQgMTMuNDA2MjUsMTMuNjI1MDA0IDguNDg3MzMxLDIuNDk1NjEgMTYuNjI2MjM3LDIuOTQ2NjMgMjYuNzgxMjUsMCA2Ljc1MDE1NSwtMS45NTQzOSAxMy40MDYyNTMsLTUuODg3NjEgMTMuNDA2MjUsLTEzLjYyNTAwNCBWIDg2LjUwMDkxOSBoIC0yNi43ODEyNSB2IC0zLjQwNjI1IGggMjYuNzgxMjUgMTMuNDA2MjU0IGMgNy43OTI0NjEsMCAxMC42OTYyNTEsLTUuNDM1NDA4IDEzLjQwNjI0MSwtMTMuNTkzNzUgMi43OTkzMywtOC4zOTg4ODYgMi42ODAyMiwtMTYuNDc1Nzc2IDAsLTI3LjI1IC0xLjkyNTc4LC03Ljc1NzQ0MSAtNS42MDM4NywtMTMuNTkzNzUgLTEzLjQwNjI0MSwtMTMuNTkzNzUgeiBtIC0xNS4wNjI1LDY0LjY1NjI1IGMgMi43Nzk0NzgsM2UtNiA1LjAzMTI1LDIuMjc3NDE3IDUuMDMxMjUsNS4wOTM3NDcgLTJlLTYsMi44MjYzNTQgLTIuMjUxNzc1LDUuMTI1MDA0IC01LjAzMTI1LDUuMTI1MDA0IC0yLjc2OTU1LDAgLTUuMDMxMjUsLTIuMjk4NjUgLTUuMDMxMjUsLTUuMTI1MDA0IDJlLTYsLTIuODE2MzMgMi4yNjE2OTcsLTUuMDkzNzQ3IDUuMDMxMjUsLTUuMDkzNzQ3IHoiLz4KPC9zdmc+Cg==);
 --jp-icon-r-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjE5NkYzIiBkPSJNNC40IDIuNWMxLjItLjEgMi45LS4zIDQuOS0uMyAyLjUgMCA0LjEuNCA1LjIgMS4zIDEgLjcgMS41IDEuOSAxLjUgMy41IDAgMi0xLjQgMy41LTIuOSA0LjEgMS4yLjQgMS43IDEuNiAyLjIgMyAuNiAxLjkgMSAzLjkgMS4zIDQuNmgtMy44Yy0uMy0uNC0uOC0xLjctMS4yLTMuN3MtMS4yLTIuNi0yLjYtMi42aC0uOXY2LjRINC40VjIuNXptMy43IDYuOWgxLjRjMS45IDAgMi45LS45IDIuOS0yLjNzLTEtMi4zLTIuOC0yLjNjLS43IDAtMS4zIDAtMS42LjJ2NC41aC4xdi0uMXoiLz4KPC9zdmc+Cg==);
 --jp-icon-react: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMTUwIDE1MCA1NDEuOSAyOTUuMyI+CiAgPGcgY2xhc3M9ImpwLWljb24tYnJhbmQyIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxREFGQiI+CiAgICA8cGF0aCBkPSJNNjY2LjMgMjk2LjVjMC0zMi41LTQwLjctNjMuMy0xMDMuMS04Mi40IDE0LjQtNjMuNiA4LTExNC4yLTIwLjItMTMwLjQtNi41LTMuOC0xNC4xLTUuNi0yMi40LTUuNnYyMi4zYzQuNiAwIDguMy45IDExLjQgMi42IDEzLjYgNy44IDE5LjUgMzcuNSAxNC45IDc1LjctMS4xIDkuNC0yLjkgMTkuMy01LjEgMjkuNC0xOS42LTQuOC00MS04LjUtNjMuNS0xMC45LTEzLjUtMTguNS0yNy41LTM1LjMtNDEuNi01MCAzMi42LTMwLjMgNjMuMi00Ni45IDg0LTQ2LjlWNzhjLTI3LjUgMC02My41IDE5LjYtOTkuOSA1My42LTM2LjQtMzMuOC03Mi40LTUzLjItOTkuOS01My4ydjIyLjNjMjAuNyAwIDUxLjQgMTYuNSA4NCA0Ni42LTE0IDE0LjctMjggMzEuNC00MS4zIDQ5LjktMjIuNiAyLjQtNDQgNi4xLTYzLjYgMTEtMi4zLTEwLTQtMTkuNy01LjItMjktNC43LTM4LjIgMS4xLTY3LjkgMTQuNi03NS44IDMtMS44IDYuOS0yLjYgMTEuNS0yLjZWNzguNWMtOC40IDAtMTYgMS44LTIyLjYgNS42LTI4LjEgMTYuMi0zNC40IDY2LjctMTkuOSAxMzAuMS02Mi4yIDE5LjItMTAyLjcgNDkuOS0xMDIuNyA4Mi4zIDAgMzIuNSA0MC43IDYzLjMgMTAzLjEgODIuNC0xNC40IDYzLjYtOCAxMTQuMiAyMC4yIDEzMC40IDYuNSAzLjggMTQuMSA1LjYgMjIuNSA1LjYgMjcuNSAwIDYzLjUtMTkuNiA5OS45LTUzLjYgMzYuNCAzMy44IDcyLjQgNTMuMiA5OS45IDUzLjIgOC40IDAgMTYtMS44IDIyLjYtNS42IDI4LjEtMTYuMiAzNC40LTY2LjcgMTkuOS0xMzAuMSA2Mi0xOS4xIDEwMi41LTQ5LjkgMTAyLjUtODIuM3ptLTEzMC4yLTY2LjdjLTMuNyAxMi45LTguMyAyNi4yLTEzLjUgMzkuNS00LjEtOC04LjQtMTYtMTMuMS0yNC00LjYtOC05LjUtMTUuOC0xNC40LTIzLjQgMTQuMiAyLjEgMjcuOSA0LjcgNDEgNy45em0tNDUuOCAxMDYuNWMtNy44IDEzLjUtMTUuOCAyNi4zLTI0LjEgMzguMi0xNC45IDEuMy0zMCAyLTQ1LjIgMi0xNS4xIDAtMzAuMi0uNy00NS0xLjktOC4zLTExLjktMTYuNC0yNC42LTI0LjItMzgtNy42LTEzLjEtMTQuNS0yNi40LTIwLjgtMzkuOCA2LjItMTMuNCAxMy4yLTI2LjggMjAuNy0zOS45IDcuOC0xMy41IDE1LjgtMjYuMyAyNC4xLTM4LjIgMTQuOS0xLjMgMzAtMiA0NS4yLTIgMTUuMSAwIDMwLjIuNyA0NSAxLjkgOC4zIDExLjkgMTYuNCAyNC42IDI0LjIgMzggNy42IDEzLjEgMTQuNSAyNi40IDIwLjggMzkuOC02LjMgMTMuNC0xMy4yIDI2LjgtMjAuNyAzOS45em0zMi4zLTEzYzUuNCAxMy40IDEwIDI2LjggMTMuOCAzOS44LTEzLjEgMy4yLTI2LjkgNS45LTQxLjIgOCA0LjktNy43IDkuOC0xNS42IDE0LjQtMjMuNyA0LjYtOCA4LjktMTYuMSAxMy0yNC4xek00MjEuMiA0MzBjLTkuMy05LjYtMTguNi0yMC4zLTI3LjgtMzIgOSAuNCAxOC4yLjcgMjcuNS43IDkuNCAwIDE4LjctLjIgMjcuOC0uNy05IDExLjctMTguMyAyMi40LTI3LjUgMzJ6bS03NC40LTU4LjljLTE0LjItMi4xLTI3LjktNC43LTQxLTcuOSAzLjctMTIuOSA4LjMtMjYuMiAxMy41LTM5LjUgNC4xIDggOC40IDE2IDEzLjEgMjQgNC43IDggOS41IDE1LjggMTQuNCAyMy40ek00MjAuNyAxNjNjOS4zIDkuNiAxOC42IDIwLjMgMjcuOCAzMi05LS40LTE4LjItLjctMjcuNS0uNy05LjQgMC0xOC43LjItMjcuOC43IDktMTEuNyAxOC4zLTIyLjQgMjcuNS0zMnptLTc0IDU4LjljLTQuOSA3LjctOS44IDE1LjYtMTQuNCAyMy43LTQuNiA4LTguOSAxNi0xMyAyNC01LjQtMTMuNC0xMC0yNi44LTEzLjgtMzkuOCAxMy4xLTMuMSAyNi45LTUuOCA0MS4yLTcuOXptLTkwLjUgMTI1LjJjLTM1LjQtMTUuMS01OC4zLTM0LjktNTguMy01MC42IDAtMTUuNyAyMi45LTM1LjYgNTguMy01MC42IDguNi0zLjcgMTgtNyAyNy43LTEwLjEgNS43IDE5LjYgMTMuMiA0MCAyMi41IDYwLjktOS4yIDIwLjgtMTYuNiA0MS4xLTIyLjIgNjAuNi05LjktMy4xLTE5LjMtNi41LTI4LTEwLjJ6TTMxMCA0OTBjLTEzLjYtNy44LTE5LjUtMzcuNS0xNC45LTc1LjcgMS4xLTkuNCAyLjktMTkuMyA1LjEtMjkuNCAxOS42IDQuOCA0MSA4LjUgNjMuNSAxMC45IDEzLjUgMTguNSAyNy41IDM1LjMgNDEuNiA1MC0zMi42IDMwLjMtNjMuMiA0Ni45LTg0IDQ2LjktNC41LS4xLTguMy0xLTExLjMtMi43em0yMzcuMi03Ni4yYzQuNyAzOC4yLTEuMSA2Ny45LTE0LjYgNzUuOC0zIDEuOC02LjkgMi42LTExLjUgMi42LTIwLjcgMC01MS40LTE2LjUtODQtNDYuNiAxNC0xNC43IDI4LTMxLjQgNDEuMy00OS45IDIyLjYtMi40IDQ0LTYuMSA2My42LTExIDIuMyAxMC4xIDQuMSAxOS44IDUuMiAyOS4xem0zOC41LTY2LjdjLTguNiAzLjctMTggNy0yNy43IDEwLjEtNS43LTE5LjYtMTMuMi00MC0yMi41LTYwLjkgOS4yLTIwLjggMTYuNi00MS4xIDIyLjItNjAuNiA5LjkgMy4xIDE5LjMgNi41IDI4LjEgMTAuMiAzNS40IDE1LjEgNTguMyAzNC45IDU4LjMgNTAuNi0uMSAxNS43LTIzIDM1LjYtNTguNCA1MC42ek0zMjAuOCA3OC40eiIvPgogICAgPGNpcmNsZSBjeD0iNDIwLjkiIGN5PSIyOTYuNSIgcj0iNDUuNyIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-redo: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4LjQgMTAuNkMxNi41NSA4Ljk5IDE0LjE1IDggMTEuNSA4Yy00LjY1IDAtOC41OCAzLjAzLTkuOTYgNy4yMkwzLjkgMTZjMS4wNS0zLjE5IDQuMDUtNS41IDcuNi01LjUgMS45NSAwIDMuNzMuNzIgNS4xMiAxLjg4TDEzIDE2aDlWN2wtMy42IDMuNnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-refresh: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTkgMTMuNWMtMi40OSAwLTQuNS0yLjAxLTQuNS00LjVTNi41MSA0LjUgOSA0LjVjMS4yNCAwIDIuMzYuNTIgMy4xNyAxLjMzTDEwIDhoNVYzbC0xLjc2IDEuNzZDMTIuMTUgMy42OCAxMC42NiAzIDkgMyA1LjY5IDMgMy4wMSA1LjY5IDMuMDEgOVM1LjY5IDE1IDkgMTVjMi45NyAwIDUuNDMtMi4xNiA1LjktNWgtMS41MmMtLjQ2IDItMi4yNCAzLjUtNC4zOCAzLjV6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=);
 --jp-icon-regex: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiBmaWxsPSIjRkZGIj4KICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjUuNSIgY3k9IjE0LjUiIHI9IjEuNSIvPgogICAgPHJlY3QgeD0iMTIiIHk9IjQiIGNsYXNzPSJzdDIiIHdpZHRoPSIxIiBoZWlnaHQ9IjgiLz4KICAgIDxyZWN0IHg9IjguNSIgeT0iNy41IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg2NiAtMC41IDAuNSAwLjg2NiAtMi4zMjU1IDcuMzIxOSkiIGNsYXNzPSJzdDIiIHdpZHRoPSI4IiBoZWlnaHQ9IjEiLz4KICAgIDxyZWN0IHg9IjEyIiB5PSI0IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjUgLTAuODY2IDAuODY2IDAuNSAtMC42Nzc5IDE0LjgyNTIpIiBjbGFzcz0ic3QyIiB3aWR0aD0iMSIgaGVpZ2h0PSI4Ii8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-run: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTggNXYxNGwxMS03eiIvPgogICAgPC9nPgo8L3N2Zz4K);
 --jp-icon-running: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMjU2IDhDMTE5IDggOCAxMTkgOCAyNTZzMTExIDI0OCAyNDggMjQ4IDI0OC0xMTEgMjQ4LTI0OFMzOTMgOCAyNTYgOHptOTYgMzI4YzAgOC44LTcuMiAxNi0xNiAxNkgxNzZjLTguOCAwLTE2LTcuMi0xNi0xNlYxNzZjMC04LjggNy4yLTE2IDE2LTE2aDE2MGM4LjggMCAxNiA3LjIgMTYgMTZ2MTYweiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-save: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIvPgogICAgPC9nPgo8L3N2Zz4K);
 --jp-icon-search: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjEsMTAuOWgtMC43bC0wLjItMC4yYzAuOC0wLjksMS4zLTIuMiwxLjMtMy41YzAtMy0yLjQtNS40LTUuNC01LjRTMS44LDQuMiwxLjgsNy4xczIuNCw1LjQsNS40LDUuNCBjMS4zLDAsMi41LTAuNSwzLjUtMS4zbDAuMiwwLjJ2MC43bDQuMSw0LjFsMS4yLTEuMkwxMi4xLDEwLjl6IE03LjEsMTAuOWMtMi4xLDAtMy43LTEuNy0zLjctMy43czEuNy0zLjcsMy43LTMuN3MzLjcsMS43LDMuNywzLjcgUzkuMiwxMC45LDcuMSwxMC45eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-settings: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVBLjQ4OC40ODggMCAwMDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==);
 --jp-icon-share: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTSAxOCAyIEMgMTYuMzU0OTkgMiAxNSAzLjM1NDk5MDQgMTUgNSBDIDE1IDUuMTkwOTUyOSAxNS4wMjE3OTEgNS4zNzcxMjI0IDE1LjA1NjY0MSA1LjU1ODU5MzggTCA3LjkyMTg3NSA5LjcyMDcwMzEgQyA3LjM5ODUzOTkgOS4yNzc4NTM5IDYuNzMyMDc3MSA5IDYgOSBDIDQuMzU0OTkwNCA5IDMgMTAuMzU0OTkgMyAxMiBDIDMgMTMuNjQ1MDEgNC4zNTQ5OTA0IDE1IDYgMTUgQyA2LjczMjA3NzEgMTUgNy4zOTg1Mzk5IDE0LjcyMjE0NiA3LjkyMTg3NSAxNC4yNzkyOTcgTCAxNS4wNTY2NDEgMTguNDM5NDUzIEMgMTUuMDIxNTU1IDE4LjYyMTUxNCAxNSAxOC44MDgzODYgMTUgMTkgQyAxNSAyMC42NDUwMSAxNi4zNTQ5OSAyMiAxOCAyMiBDIDE5LjY0NTAxIDIyIDIxIDIwLjY0NTAxIDIxIDE5IEMgMjEgMTcuMzU0OTkgMTkuNjQ1MDEgMTYgMTggMTYgQyAxNy4yNjc0OCAxNiAxNi42MDE1OTMgMTYuMjc5MzI4IDE2LjA3ODEyNSAxNi43MjI2NTYgTCA4Ljk0MzM1OTQgMTIuNTU4NTk0IEMgOC45NzgyMDk1IDEyLjM3NzEyMiA5IDEyLjE5MDk1MyA5IDEyIEMgOSAxMS44MDkwNDcgOC45NzgyMDk1IDExLjYyMjg3OCA4Ljk0MzM1OTQgMTEuNDQxNDA2IEwgMTYuMDc4MTI1IDcuMjc5Mjk2OSBDIDE2LjYwMTQ2IDcuNzIyMTQ2MSAxNy4yNjc5MjMgOCAxOCA4IEMgMTkuNjQ1MDEgOCAyMSA2LjY0NTAwOTYgMjEgNSBDIDIxIDMuMzU0OTkwNCAxOS42NDUwMSAyIDE4IDIgeiBNIDE4IDQgQyAxOC41NjQxMjkgNCAxOSA0LjQzNTg3MDYgMTkgNSBDIDE5IDUuNTY0MTI5NCAxOC41NjQxMjkgNiAxOCA2IEMgMTcuNDM1ODcxIDYgMTcgNS41NjQxMjk0IDE3IDUgQyAxNyA0LjQzNTg3MDYgMTcuNDM1ODcxIDQgMTggNCB6IE0gNiAxMSBDIDYuNTY0MTI5NCAxMSA3IDExLjQzNTg3MSA3IDEyIEMgNyAxMi41NjQxMjkgNi41NjQxMjk0IDEzIDYgMTMgQyA1LjQzNTg3MDYgMTMgNSAxMi41NjQxMjkgNSAxMiBDIDUgMTEuNDM1ODcxIDUuNDM1ODcwNiAxMSA2IDExIHogTSAxOCAxOCBDIDE4LjU2NDEyOSAxOCAxOSAxOC40MzU4NzEgMTkgMTkgQyAxOSAxOS41NjQxMjkgMTguNTY0MTI5IDIwIDE4IDIwIEMgMTcuNDM1ODcxIDIwIDE3IDE5LjU2NDEyOSAxNyAxOSBDIDE3IDE4LjQzNTg3MSAxNy40MzU4NzEgMTggMTggMTggeiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-spreadsheet: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNENBRjUwIiBkPSJNMi4yIDIuMnYxNy42aDE3LjZWMi4ySDIuMnptMTUuNCA3LjdoLTUuNVY0LjRoNS41djUuNXpNOS45IDQuNHY1LjVINC40VjQuNGg1LjV6bS01LjUgNy43aDUuNXY1LjVINC40di01LjV6bTcuNyA1LjV2LTUuNWg1LjV2NS41aC01LjV6Ii8+Cjwvc3ZnPgo=);
 --jp-icon-stop: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik02IDZoMTJ2MTJINnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-tab: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6Ii8+CiAgPC9nPgo8L3N2Zz4K);
 --jp-icon-table-rows: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMSw4SDNWNGgxOFY4eiBNMjEsMTBIM3Y0aDE4VjEweiBNMjEsMTZIM3Y0aDE4VjE2eiIvPgogICAgPC9nPgo8L3N2Zz4K);
 --jp-icon-tag: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCA0MyAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTI4LjgzMzIgMTIuMzM0TDMyLjk5OTggMTYuNTAwN0wzNy4xNjY1IDEyLjMzNEgyOC44MzMyWiIvPgoJCTxwYXRoIGQ9Ik0xNi4yMDk1IDIxLjYxMDRDMTUuNjg3MyAyMi4xMjk5IDE0Ljg0NDMgMjIuMTI5OSAxNC4zMjQ4IDIxLjYxMDRMNi45ODI5IDE0LjcyNDVDNi41NzI0IDE0LjMzOTQgNi4wODMxMyAxMy42MDk4IDYuMDQ3ODYgMTMuMDQ4MkM1Ljk1MzQ3IDExLjUyODggNi4wMjAwMiA4LjYxOTQ0IDYuMDY2MjEgNy4wNzY5NUM2LjA4MjgxIDYuNTE0NzcgNi41NTU0OCA2LjA0MzQ3IDcuMTE4MDQgNi4wMzA1NUM5LjA4ODYzIDUuOTg0NzMgMTMuMjYzOCA1LjkzNTc5IDEzLjY1MTggNi4zMjQyNUwyMS43MzY5IDEzLjYzOUMyMi4yNTYgMTQuMTU4NSAyMS43ODUxIDE1LjQ3MjQgMjEuMjYyIDE1Ljk5NDZMMTYuMjA5NSAyMS42MTA0Wk05Ljc3NTg1IDguMjY1QzkuMzM1NTEgNy44MjU2NiA4LjYyMzUxIDcuODI1NjYgOC4xODI4IDguMjY1QzcuNzQzNDYgOC43MDU3MSA3Ljc0MzQ2IDkuNDE3MzMgOC4xODI4IDkuODU2NjdDOC42MjM4MiAxMC4yOTY0IDkuMzM1ODIgMTAuMjk2NCA5Ljc3NTg1IDkuODU2NjdDMTAuMjE1NiA5LjQxNzMzIDEwLjIxNTYgOC43MDUzMyA5Ljc3NTg1IDguMjY1WiIvPgoJPC9nPgo8L3N2Zz4K);
 --jp-icon-terminal: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiA+CiAgICA8cmVjdCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1iYWNrZ3JvdW5kLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBmaWxsPSIjMzMzMzMzIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUtaW52ZXJzZSIgZD0iTTUuMDU2NjQgOC43NjE3MkM1LjA1NjY0IDguNTk3NjYgNS4wMzEyNSA4LjQ1MzEyIDQuOTgwNDcgOC4zMjgxMkM0LjkzMzU5IDguMTk5MjIgNC44NTU0NyA4LjA4MjAzIDQuNzQ2MDkgNy45NzY1NkM0LjY0MDYyIDcuODcxMDkgNC41IDcuNzc1MzkgNC4zMjQyMiA3LjY4OTQ1QzQuMTUyMzQgNy41OTk2MSAzLjk0MzM2IDcuNTExNzIgMy42OTcyNyA3LjQyNTc4QzMuMzAyNzMgNy4yODUxNiAyLjk0MzM2IDcuMTM2NzIgMi42MTkxNCA2Ljk4MDQ3QzIuMjk0OTIgNi44MjQyMiAyLjAxNzU4IDYuNjQyNTggMS43ODcxMSA2LjQzNTU1QzEuNTYwNTUgNi4yMjg1MiAxLjM4NDc3IDUuOTg4MjggMS4yNTk3NyA1LjcxNDg0QzEuMTM0NzcgNS40Mzc1IDEuMDcyMjcgNS4xMDkzOCAxLjA3MjI3IDQuNzMwNDdDMS4wNzIyNyA0LjM5ODQ0IDEuMTI4OTEgNC4wOTU3IDEuMjQyMTkgMy44MjIyN0MxLjM1NTQ3IDMuNTQ0OTIgMS41MTU2MiAzLjMwNDY5IDEuNzIyNjYgMy4xMDE1NkMxLjkyOTY5IDIuODk4NDQgMi4xNzk2OSAyLjczNDM3IDIuNDcyNjYgMi42MDkzOEMyLjc2NTYyIDIuNDg0MzggMy4wOTE4IDIuNDA0MyAzLjQ1MTE3IDIuMzY5MTRWMS4xMDkzOEg0LjM4ODY3VjIuMzgwODZDNC43NDAyMyAyLjQyNzczIDUuMDU2NjQgMi41MjM0NCA1LjMzNzg5IDIuNjY3OTdDNS42MTkxNCAyLjgxMjUgNS44NTc0MiAzLjAwMTk1IDYuMDUyNzMgMy4yMzYzM0M2LjI1MTk1IDMuNDY2OCA2LjQwNDMgMy43NDAyMyA2LjUwOTc3IDQuMDU2NjRDNi42MTkxNCA0LjM2OTE0IDYuNjczODMgNC43MjA3IDYuNjczODMgNS4xMTEzM0g1LjA0NDkyQzUuMDQ0OTIgNC42Mzg2NyA0LjkzNzUgNC4yODEyNSA0LjcyMjY2IDQuMDM5MDZDNC41MDc4MSAzLjc5Mjk3IDQuMjE2OCAzLjY2OTkyIDMuODQ5NjEgMy42Njk5MkMzLjY1MDM5IDMuNjY5OTIgMy40NzY1NiAzLjY5NzI3IDMuMzI4MTIgMy43NTE5NUMzLjE4MzU5IDMuODAyNzMgMy4wNjQ0NSAzLjg3Njk1IDIuOTcwNyAzLjk3NDYxQzIuODc2OTUgNC4wNjgzNiAyLjgwNjY0IDQuMTc5NjkgMi43NTk3NyA0LjMwODU5QzIuNzE2OCA0LjQzNzUgMi42OTUzMSA0LjU3ODEyIDIuNjk1MzEgNC43MzA0N0MyLjY5NTMxIDQuODgyODEgMi43MTY4IDUuMDE5NTMgMi43NTk3NyA1LjE0MDYyQzIuODA2NjQgNS4yNTc4MSAyLjg4MjgxIDUuMzY3MTkgMi45ODgyOCA1LjQ2ODc1QzMuMDk3NjYgNS41NzAzMSAzLjI0MDIzIDUuNjY3OTcgMy40MTYwMiA1Ljc2MTcyQzMuNTkxOCA1Ljg1MTU2IDMuODEwNTUgNS45NDMzNiA0LjA3MjI3IDYuMDM3MTFDNC40NjY4IDYuMTg1NTUgNC44MjQyMiA2LjMzOTg0IDUuMTQ0NTMgNi41QzUuNDY0ODQgNi42NTYyNSA1LjczODI4IDYuODM5ODQgNS45NjQ4NCA3LjA1MDc4QzYuMTk1MzEgNy4yNTc4MSA2LjM3MTA5IDcuNSA2LjQ5MjE5IDcuNzc3MzRDNi42MTcxOSA4LjA1MDc4IDYuNjc5NjkgOC4zNzUgNi42Nzk2OSA4Ljc1QzYuNjc5NjkgOS4wOTM3NSA2LjYyMzA1IDkuNDA0MyA2LjUwOTc3IDkuNjgxNjRDNi4zOTY0OCA5Ljk1NTA4IDYuMjM0MzggMTAuMTkxNCA2LjAyMzQ0IDEwLjM5MDZDNS44MTI1IDEwLjU4OTggNS41NTg1OSAxMC43NSA1LjI2MTcyIDEwLjg3MTFDNC45NjQ4NCAxMC45ODgzIDQuNjMyODEgMTEuMDY0NSA0LjI2NTYyIDExLjA5OTZWMTIuMjQ4SDMuMzMzOThWMTEuMDk5NkMzLjAwMTk1IDExLjA2ODQgMi42Nzk2OSAxMC45OTYxIDIuMzY3MTkgMTAuODgyOEMyLjA1NDY5IDEwLjc2NTYgMS43NzczNCAxMC41OTc3IDEuNTM1MTYgMTAuMzc4OUMxLjI5Njg4IDEwLjE2MDIgMS4xMDU0NyA5Ljg4NDc3IDAuOTYwOTM4IDkuNTUyNzNDMC44MTY0MDYgOS4yMTY4IDAuNzQ0MTQxIDguODE0NDUgMC43NDQxNDEgOC4zNDU3SDIuMzc4OTFDMi4zNzg5MSA4LjYyNjk1IDIuNDE5OTIgOC44NjMyOCAyLjUwMTk1IDkuMDU0NjlDMi41ODM5OCA5LjI0MjE5IDIuNjg5NDUgOS4zOTI1OCAyLjgxODM2IDkuNTA1ODZDMi45NTExNyA5LjYxNTIzIDMuMTAxNTYgOS42OTMzNiAzLjI2OTUzIDkuNzQwMjNDMy40Mzc1IDkuNzg3MTEgMy42MDkzOCA5LjgxMDU1IDMuNzg1MTYgOS44MTA1NUM0LjIwMzEyIDkuODEwNTUgNC41MTk1MyA5LjcxMjg5IDQuNzM0MzggOS41MTc1OEM0Ljk0OTIyIDkuMzIyMjcgNS4wNTY2NCA5LjA3MDMxIDUuMDU2NjQgOC43NjE3MlpNMTMuNDE4IDEyLjI3MTVIOC4wNzQyMlYxMUgxMy40MThWMTIuMjcxNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuOTUyNjQgNikiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=);
 --jp-icon-text-editor: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtdGV4dC1lZGl0b3ItaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiLz4KPC9zdmc+Cg==);
 --jp-icon-toc: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik03LDVIMjFWN0g3VjVNNywxM1YxMUgyMVYxM0g3TTQsNC41QTEuNSwxLjUgMCAwLDEgNS41LDZBMS41LDEuNSAwIDAsMSA0LDcuNUExLjUsMS41IDAgMCwxIDIuNSw2QTEuNSwxLjUgMCAwLDEgNCw0LjVNNCwxMC41QTEuNSwxLjUgMCAwLDEgNS41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMy41QTEuNSwxLjUgMCAwLDEgMi41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMC41TTcsMTlWMTdIMjFWMTlIN000LDE2LjVBMS41LDEuNSAwIDAsMSA1LjUsMThBMS41LDEuNSAwIDAsMSA0LDE5LjVBMS41LDEuNSAwIDAsMSAyLjUsMThBMS41LDEuNSAwIDAsMSA0LDE2LjVaIiAvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-tree-view: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMiAxMVYzaC03djNIOVYzSDJ2OGg3VjhoMnYxMGg0djNoN3YtOGgtN3YzaC0yVjhoMnYzeiIvPgogICAgPC9nPgo8L3N2Zz4K);
 --jp-icon-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMiAxNy4xODQ0IDIuOTY5NjggMTQuMzAzMiAxLjg2MDk0IDExLjQ0MDlaIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiMzMzMzMzMiIHN0cm9rZT0iIzMzMzMzMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCA5Ljg2NzE5KSIgZD0iTTIuODYwMTUgNC44NjUzNUwwLjcyNjU0OSAyLjk5OTU5TDAgMy42MzA0NUwyLjg2MDE1IDYuMTMxNTdMOCAwLjYzMDg3Mkw3LjI3ODU3IDBMMi44NjAxNSA0Ljg2NTM1WiIvPgo8L3N2Zz4K);
 --jp-icon-undo: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjUgOGMtMi42NSAwLTUuMDUuOTktNi45IDIuNkwyIDd2OWg5bC0zLjYyLTMuNjJjMS4zOS0xLjE2IDMuMTYtMS44OCA1LjEyLTEuODggMy41NCAwIDYuNTUgMi4zMSA3LjYgNS41bDIuMzctLjc4QzIxLjA4IDExLjAzIDE3LjE1IDggMTIuNSA4eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-user: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE2IDdhNCA0IDAgMTEtOCAwIDQgNCAwIDAxOCAwek0xMiAxNGE3IDcgMCAwMC03IDdoMTRhNyA3IDAgMDAtNy03eiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-users: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDM2IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPGcgY2xhc3M9ImpwLWljb24zIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjczMjcgMCAwIDEuNzMyNyAtMy42MjgyIC4wOTk1NzcpIiBmaWxsPSIjNjE2MTYxIj4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjUsMCwwLDEuNSwwLC02KSIgZD0ibTEyLjE4NiA3LjUwOThjLTEuMDUzNSAwLTEuOTc1NyAwLjU2NjUtMi40Nzg1IDEuNDEwMiAwLjc1MDYxIDAuMzEyNzcgMS4zOTc0IDAuODI2NDggMS44NzMgMS40NzI3aDMuNDg2M2MwLTEuNTkyLTEuMjg4OS0yLjg4MjgtMi44ODA5LTIuODgyOHoiLz4KICA8cGF0aCBkPSJtMjAuNDY1IDIuMzg5NWEyLjE4ODUgMi4xODg1IDAgMCAxLTIuMTg4NCAyLjE4ODUgMi4xODg1IDIuMTg4NSAwIDAgMS0yLjE4ODUtMi4xODg1IDIuMTg4NSAyLjE4ODUgMCAwIDEgMi4xODg1LTIuMTg4NSAyLjE4ODUgMi4xODg1IDAgMCAxIDIuMTg4NCAyLjE4ODV6Ii8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS41LDAsMCwxLjUsMCwtNikiIGQ9Im0zLjU4OTggOC40MjE5Yy0xLjExMjYgMC0yLjAxMzcgMC45MDExMS0yLjAxMzcgMi4wMTM3aDIuODE0NWMwLjI2Nzk3LTAuMzczMDkgMC41OTA3LTAuNzA0MzUgMC45NTg5OC0wLjk3ODUyLTAuMzQ0MzMtMC42MTY4OC0xLjAwMzEtMS4wMzUyLTEuNzU5OC0xLjAzNTJ6Ii8+CiAgPHBhdGggZD0ibTYuOTE1NCA0LjYyM2ExLjUyOTQgMS41Mjk0IDAgMCAxLTEuNTI5NCAxLjUyOTQgMS41Mjk0IDEuNTI5NCAwIDAgMS0xLjUyOTQtMS41Mjk0IDEuNTI5NCAxLjUyOTQgMCAwIDEgMS41Mjk0LTEuNTI5NCAxLjUyOTQgMS41Mjk0IDAgMCAxIDEuNTI5NCAxLjUyOTR6Ii8+CiAgPHBhdGggZD0ibTYuMTM1IDEzLjUzNWMwLTMuMjM5MiAyLjYyNTktNS44NjUgNS44NjUtNS44NjUgMy4yMzkyIDAgNS44NjUgMi42MjU5IDUuODY1IDUuODY1eiIvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMy43Njg1IiByPSIyLjk2ODUiLz4KIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-vega: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbjEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjEyMTIxIj4KICAgIDxwYXRoIGQ9Ik0xMC42IDUuNGwyLjItMy4ySDIuMnY3LjNsNC02LjZ6Ii8+CiAgICA8cGF0aCBkPSJNMTUuOCAyLjJsLTQuNCA2LjZMNyA2LjNsLTQuOCA4djUuNWgxNy42VjIuMmgtNHptLTcgMTUuNEg1LjV2LTQuNGgzLjN2NC40em00LjQgMEg5LjhWOS44aDMuNHY3Ljh6bTQuNCAwaC0zLjRWNi41aDMuNHYxMS4xeiIvPgogIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-word: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KIDxnIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzQxNDE0MSI+CiAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiA8L2c+CiA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSguNDMgLjA0MDEpIiBmaWxsPSIjZmZmIj4KICA8cGF0aCBkPSJtNC4xNCA4Ljc2cTAuMDY4Mi0xLjg5IDIuNDItMS44OSAxLjE2IDAgMS42OCAwLjQyIDAuNTY3IDAuNDEgMC41NjcgMS4xNnYzLjQ3cTAgMC40NjIgMC41MTQgMC40NjIgMC4xMDMgMCAwLjItMC4wMjMxdjAuNzE0cS0wLjM5OSAwLjEwMy0wLjY1MSAwLjEwMy0wLjQ1MiAwLTAuNjkzLTAuMjItMC4yMzEtMC4yLTAuMjg0LTAuNjYyLTAuOTU2IDAuODcyLTIgMC44NzItMC45MDMgMC0xLjQ3LTAuNDcyLTAuNTI1LTAuNDcyLTAuNTI1LTEuMjYgMC0wLjI2MiAwLjA0NTItMC40NzIgMC4wNTY3LTAuMjIgMC4xMTYtMC4zNzggMC4wNjgyLTAuMTY4IDAuMjMxLTAuMzA0IDAuMTU4LTAuMTQ3IDAuMjYyLTAuMjQyIDAuMTE2LTAuMDkxNCAwLjM2OC0wLjE2OCAwLjI2Mi0wLjA5MTQgMC4zOTktMC4xMjYgMC4xMzYtMC4wNDUyIDAuNDcyLTAuMTAzIDAuMzM2LTAuMDU3OCAwLjUwNC0wLjA3OTggMC4xNTgtMC4wMjMxIDAuNTY3LTAuMDc5OCAwLjU1Ni0wLjA2ODIgMC43NzctMC4yMjEgMC4yMi0wLjE1MiAwLjIyLTAuNDQxdi0wLjI1MnEwLTAuNDMtMC4zNTctMC42NjItMC4zMzYtMC4yMzEtMC45NzYtMC4yMzEtMC42NjIgMC0wLjk5OCAwLjI2Mi0wLjMzNiAwLjI1Mi0wLjM5OSAwLjc5OHptMS44OSAzLjY4cTAuNzg4IDAgMS4yNi0wLjQxIDAuNTA0LTAuNDIgMC41MDQtMC45MDN2LTEuMDVxLTAuMjg0IDAuMTM2LTAuODYxIDAuMjMxLTAuNTY3IDAuMDkxNC0wLjk4NyAwLjE1OC0wLjQyIDAuMDY4Mi0wLjc2NiAwLjMyNi0wLjMzNiAwLjI1Mi0wLjMzNiAwLjcwNHQwLjMwNCAwLjcwNCAwLjg2MSAwLjI1MnoiIHN0cm9rZS13aWR0aD0iMS4wNSIvPgogIDxwYXRoIGQ9Im0xMCA0LjU2aDAuOTQ1djMuMTVxMC42NTEtMC45NzYgMS44OS0wLjk3NiAxLjE2IDAgMS44OSAwLjg0IDAuNjgyIDAuODQgMC42ODIgMi4zMSAwIDEuNDctMC43MDQgMi40Mi0wLjcwNCAwLjg4Mi0xLjg5IDAuODgyLTEuMjYgMC0xLjg5LTEuMDJ2MC43NjZoLTAuODV6bTIuNjIgMy4wNHEtMC43NDYgMC0xLjE2IDAuNjQtMC40NTIgMC42My0wLjQ1MiAxLjY4IDAgMS4wNSAwLjQ1MiAxLjY4dDEuMTYgMC42M3EwLjc3NyAwIDEuMjYtMC42MyAwLjQ5NC0wLjY0IDAuNDk0LTEuNjggMC0xLjA1LTAuNDcyLTEuNjgtMC40NjItMC42NC0xLjI2LTAuNjR6IiBzdHJva2Utd2lkdGg9IjEuMDUiLz4KICA8cGF0aCBkPSJtMi43MyAxNS44IDEzLjYgMC4wMDgxYzAuMDA2OSAwIDAtMi42IDAtMi42IDAtMC4wMDc4LTEuMTUgMC0xLjE1IDAtMC4wMDY5IDAtMC4wMDgzIDEuNS0wLjAwODMgMS41LTJlLTMgLTAuMDAxNC0xMS4zLTAuMDAxNC0xMS4zLTAuMDAxNGwtMC4wMDU5Mi0xLjVjMC0wLjAwNzgtMS4xNyAwLjAwMTMtMS4xNyAwLjAwMTN6IiBzdHJva2Utd2lkdGg9Ii45NzUiLz4KIDwvZz4KPC9zdmc+Cg==);
 --jp-icon-yaml: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1jb250cmFzdDIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjRDgxQjYwIj4KICAgIDxwYXRoIGQ9Ik03LjIgMTguNnYtNS40TDMgNS42aDMuM2wxLjQgMy4xYy4zLjkuNiAxLjYgMSAyLjUuMy0uOC42LTEuNiAxLTIuNWwxLjQtMy4xaDMuNGwtNC40IDcuNnY1LjVsLTIuOS0uMXoiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxNi41IiByPSIyLjEiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxMSIgcj0iMi4xIi8+CiAgPC9nPgo8L3N2Zz4K);
}

/* Icon CSS class declarations */

.jp-AddAboveIcon {
 background-image: var(--jp-icon-add-above);
}

.jp-AddBelowIcon {
 background-image: var(--jp-icon-add-below);
}

.jp-AddIcon {
 background-image: var(--jp-icon-add);
}

.jp-BellIcon {
 background-image: var(--jp-icon-bell);
}

.jp-BugDotIcon {
 background-image: var(--jp-icon-bug-dot);
}

.jp-BugIcon {
 background-image: var(--jp-icon-bug);
}

.jp-BuildIcon {
 background-image: var(--jp-icon-build);
}

.jp-CaretDownEmptyIcon {
 background-image: var(--jp-icon-caret-down-empty);
}

.jp-CaretDownEmptyThinIcon {
 background-image: var(--jp-icon-caret-down-empty-thin);
}

.jp-CaretDownIcon {
 background-image: var(--jp-icon-caret-down);
}

.jp-CaretLeftIcon {
 background-image: var(--jp-icon-caret-left);
}

.jp-CaretRightIcon {
 background-image: var(--jp-icon-caret-right);
}

.jp-CaretUpEmptyThinIcon {
 background-image: var(--jp-icon-caret-up-empty-thin);
}

.jp-CaretUpIcon {
 background-image: var(--jp-icon-caret-up);
}

.jp-CaseSensitiveIcon {
 background-image: var(--jp-icon-case-sensitive);
}

.jp-CheckIcon {
 background-image: var(--jp-icon-check);
}

.jp-CircleEmptyIcon {
 background-image: var(--jp-icon-circle-empty);
}

.jp-CircleIcon {
 background-image: var(--jp-icon-circle);
}

.jp-ClearIcon {
 background-image: var(--jp-icon-clear);
}

.jp-CloseIcon {
 background-image: var(--jp-icon-close);
}

.jp-CodeCheckIcon {
 background-image: var(--jp-icon-code-check);
}

.jp-CodeIcon {
 background-image: var(--jp-icon-code);
}

.jp-CollapseAllIcon {
 background-image: var(--jp-icon-collapse-all);
}

.jp-ConsoleIcon {
 background-image: var(--jp-icon-console);
}

.jp-CopyIcon {
 background-image: var(--jp-icon-copy);
}

.jp-CopyrightIcon {
 background-image: var(--jp-icon-copyright);
}

.jp-CutIcon {
 background-image: var(--jp-icon-cut);
}

.jp-DeleteIcon {
 background-image: var(--jp-icon-delete);
}

.jp-DownloadIcon {
 background-image: var(--jp-icon-download);
}

.jp-DuplicateIcon {
 background-image: var(--jp-icon-duplicate);
}

.jp-EditIcon {
 background-image: var(--jp-icon-edit);
}

.jp-EllipsesIcon {
 background-image: var(--jp-icon-ellipses);
}

.jp-ErrorIcon {
 background-image: var(--jp-icon-error);
}

.jp-ExpandAllIcon {
 background-image: var(--jp-icon-expand-all);
}

.jp-ExtensionIcon {
 background-image: var(--jp-icon-extension);
}

.jp-FastForwardIcon {
 background-image: var(--jp-icon-fast-forward);
}

.jp-FileIcon {
 background-image: var(--jp-icon-file);
}

.jp-FileUploadIcon {
 background-image: var(--jp-icon-file-upload);
}

.jp-FilterDotIcon {
 background-image: var(--jp-icon-filter-dot);
}

.jp-FilterIcon {
 background-image: var(--jp-icon-filter);
}

.jp-FilterListIcon {
 background-image: var(--jp-icon-filter-list);
}

.jp-FolderFavoriteIcon {
 background-image: var(--jp-icon-folder-favorite);
}

.jp-FolderIcon {
 background-image: var(--jp-icon-folder);
}

.jp-HomeIcon {
 background-image: var(--jp-icon-home);
}

.jp-Html5Icon {
 background-image: var(--jp-icon-html5);
}

.jp-ImageIcon {
 background-image: var(--jp-icon-image);
}

.jp-InfoIcon {
 background-image: var(--jp-icon-info);
}

.jp-InspectorIcon {
 background-image: var(--jp-icon-inspector);
}

.jp-JsonIcon {
 background-image: var(--jp-icon-json);
}

.jp-JuliaIcon {
 background-image: var(--jp-icon-julia);
}

.jp-JupyterFaviconIcon {
 background-image: var(--jp-icon-jupyter-favicon);
}

.jp-JupyterIcon {
 background-image: var(--jp-icon-jupyter);
}

.jp-JupyterlabWordmarkIcon {
 background-image: var(--jp-icon-jupyterlab-wordmark);
}

.jp-KernelIcon {
 background-image: var(--jp-icon-kernel);
}

.jp-KeyboardIcon {
 background-image: var(--jp-icon-keyboard);
}

.jp-LaunchIcon {
 background-image: var(--jp-icon-launch);
}

.jp-LauncherIcon {
 background-image: var(--jp-icon-launcher);
}

.jp-LineFormIcon {
 background-image: var(--jp-icon-line-form);
}

.jp-LinkIcon {
 background-image: var(--jp-icon-link);
}

.jp-ListIcon {
 background-image: var(--jp-icon-list);
}

.jp-MarkdownIcon {
 background-image: var(--jp-icon-markdown);
}

.jp-MoveDownIcon {
 background-image: var(--jp-icon-move-down);
}

.jp-MoveUpIcon {
 background-image: var(--jp-icon-move-up);
}

.jp-NewFolderIcon {
 background-image: var(--jp-icon-new-folder);
}

.jp-NotTrustedIcon {
 background-image: var(--jp-icon-not-trusted);
}

.jp-NotebookIcon {
 background-image: var(--jp-icon-notebook);
}

.jp-NumberingIcon {
 background-image: var(--jp-icon-numbering);
}

.jp-OfflineBoltIcon {
 background-image: var(--jp-icon-offline-bolt);
}

.jp-PaletteIcon {
 background-image: var(--jp-icon-palette);
}

.jp-PasteIcon {
 background-image: var(--jp-icon-paste);
}

.jp-PdfIcon {
 background-image: var(--jp-icon-pdf);
}

.jp-PythonIcon {
 background-image: var(--jp-icon-python);
}

.jp-RKernelIcon {
 background-image: var(--jp-icon-r-kernel);
}

.jp-ReactIcon {
 background-image: var(--jp-icon-react);
}

.jp-RedoIcon {
 background-image: var(--jp-icon-redo);
}

.jp-RefreshIcon {
 background-image: var(--jp-icon-refresh);
}

.jp-RegexIcon {
 background-image: var(--jp-icon-regex);
}

.jp-RunIcon {
 background-image: var(--jp-icon-run);
}

.jp-RunningIcon {
 background-image: var(--jp-icon-running);
}

.jp-SaveIcon {
 background-image: var(--jp-icon-save);
}

.jp-SearchIcon {
 background-image: var(--jp-icon-search);
}

.jp-SettingsIcon {
 background-image: var(--jp-icon-settings);
}

.jp-ShareIcon {
 background-image: var(--jp-icon-share);
}

.jp-SpreadsheetIcon {
 background-image: var(--jp-icon-spreadsheet);
}

.jp-StopIcon {
 background-image: var(--jp-icon-stop);
}

.jp-TabIcon {
 background-image: var(--jp-icon-tab);
}

.jp-TableRowsIcon {
 background-image: var(--jp-icon-table-rows);
}

.jp-TagIcon {
 background-image: var(--jp-icon-tag);
}

.jp-TerminalIcon {
 background-image: var(--jp-icon-terminal);
}

.jp-TextEditorIcon {
 background-image: var(--jp-icon-text-editor);
}

.jp-TocIcon {
 background-image: var(--jp-icon-toc);
}

.jp-TreeViewIcon {
 background-image: var(--jp-icon-tree-view);
}

.jp-TrustedIcon {
 background-image: var(--jp-icon-trusted);
}

.jp-UndoIcon {
 background-image: var(--jp-icon-undo);
}

.jp-UserIcon {
 background-image: var(--jp-icon-user);
}

.jp-UsersIcon {
 background-image: var(--jp-icon-users);
}

.jp-VegaIcon {
 background-image: var(--jp-icon-vega);
}

.jp-WordIcon {
 background-image: var(--jp-icon-word);
}

.jp-YamlIcon {
 background-image: var(--jp-icon-yaml);
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/**
 * (DEPRECATED) Support for consuming icons as CSS background images
 */

.jp-Icon,
.jp-MaterialIcon {
 background-position: center;
 background-repeat: no-repeat;
 background-size: 16px;
 min-width: 16px;
 min-height: 16px;
}

.jp-Icon-cover {
 background-position: center;
 background-repeat: no-repeat;
 background-size: cover;
}

/**
 * (DEPRECATED) Support for specific CSS icon sizes
 */

.jp-Icon-16 {
 background-size: 16px;
 min-width: 16px;
 min-height: 16px;
}

.jp-Icon-18 {
 background-size: 18px;
 min-width: 18px;
 min-height: 18px;
}

.jp-Icon-20 {
 background-size: 20px;
 min-width: 20px;
 min-height: 20px;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.lm-TabBar .lm-TabBar-addButton {
 align-items: center;
 display: flex;
 padding: 4px;
 padding-bottom: 5px;
 margin-right: 1px;
 background-color: var(--jp-layout-color2);
}

.lm-TabBar .lm-TabBar-addButton:hover {
 background-color: var(--jp-layout-color1);
}

.lm-DockPanel-tabBar .lm-TabBar-tab {
 width: var(--jp-private-horizontal-tab-width);
}

.lm-DockPanel-tabBar .lm-TabBar-content {
 flex: unset;
}

.lm-DockPanel-tabBar[data-orientation='horizontal'] {
 flex: 1 1 auto;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/**
 * Support for icons as inline SVG HTMLElements
 */

/* recolor the primary elements of an icon */
.jp-icon0[fill] {
 fill: var(--jp-inverse-layout-color0);
}

.jp-icon1[fill] {
 fill: var(--jp-inverse-layout-color1);
}

.jp-icon2[fill] {
 fill: var(--jp-inverse-layout-color2);
}

.jp-icon3[fill] {
 fill: var(--jp-inverse-layout-color3);
}

.jp-icon4[fill] {
 fill: var(--jp-inverse-layout-color4);
}

.jp-icon0[stroke] {
 stroke: var(--jp-inverse-layout-color0);
}

.jp-icon1[stroke] {
 stroke: var(--jp-inverse-layout-color1);
}

.jp-icon2[stroke] {
 stroke: var(--jp-inverse-layout-color2);
}

.jp-icon3[stroke] {
 stroke: var(--jp-inverse-layout-color3);
}

.jp-icon4[stroke] {
 stroke: var(--jp-inverse-layout-color4);
}

/* recolor the accent elements of an icon */
.jp-icon-accent0[fill] {
 fill: var(--jp-layout-color0);
}

.jp-icon-accent1[fill] {
 fill: var(--jp-layout-color1);
}

.jp-icon-accent2[fill] {
 fill: var(--jp-layout-color2);
}

.jp-icon-accent3[fill] {
 fill: var(--jp-layout-color3);
}

.jp-icon-accent4[fill] {
 fill: var(--jp-layout-color4);
}

.jp-icon-accent0[stroke] {
 stroke: var(--jp-layout-color0);
}

.jp-icon-accent1[stroke] {
 stroke: var(--jp-layout-color1);
}

.jp-icon-accent2[stroke] {
 stroke: var(--jp-layout-color2);
}

.jp-icon-accent3[stroke] {
 stroke: var(--jp-layout-color3);
}

.jp-icon-accent4[stroke] {
 stroke: var(--jp-layout-color4);
}

/* set the color of an icon to transparent */
.jp-icon-none[fill] {
 fill: none;
}

.jp-icon-none[stroke] {
 stroke: none;
}

/* brand icon colors. Same for light and dark */
.jp-icon-brand0[fill] {
 fill: var(--jp-brand-color0);
}

.jp-icon-brand1[fill] {
 fill: var(--jp-brand-color1);
}

.jp-icon-brand2[fill] {
 fill: var(--jp-brand-color2);
}

.jp-icon-brand3[fill] {
 fill: var(--jp-brand-color3);
}

.jp-icon-brand4[fill] {
 fill: var(--jp-brand-color4);
}

.jp-icon-brand0[stroke] {
 stroke: var(--jp-brand-color0);
}

.jp-icon-brand1[stroke] {
 stroke: var(--jp-brand-color1);
}

.jp-icon-brand2[stroke] {
 stroke: var(--jp-brand-color2);
}

.jp-icon-brand3[stroke] {
 stroke: var(--jp-brand-color3);
}

.jp-icon-brand4[stroke] {
 stroke: var(--jp-brand-color4);
}

/* warn icon colors. Same for light and dark */
.jp-icon-warn0[fill] {
 fill: var(--jp-warn-color0);
}

.jp-icon-warn1[fill] {
 fill: var(--jp-warn-color1);
}

.jp-icon-warn2[fill] {
 fill: var(--jp-warn-color2);
}

.jp-icon-warn3[fill] {
 fill: var(--jp-warn-color3);
}

.jp-icon-warn0[stroke] {
 stroke: var(--jp-warn-color0);
}

.jp-icon-warn1[stroke] {
 stroke: var(--jp-warn-color1);
}

.jp-icon-warn2[stroke] {
 stroke: var(--jp-warn-color2);
}

.jp-icon-warn3[stroke] {
 stroke: var(--jp-warn-color3);
}

/* icon colors that contrast well with each other and most backgrounds */
.jp-icon-contrast0[fill] {
 fill: var(--jp-icon-contrast-color0);
}

.jp-icon-contrast1[fill] {
 fill: var(--jp-icon-contrast-color1);
}

.jp-icon-contrast2[fill] {
 fill: var(--jp-icon-contrast-color2);
}

.jp-icon-contrast3[fill] {
 fill: var(--jp-icon-contrast-color3);
}

.jp-icon-contrast0[stroke] {
 stroke: var(--jp-icon-contrast-color0);
}

.jp-icon-contrast1[stroke] {
 stroke: var(--jp-icon-contrast-color1);
}

.jp-icon-contrast2[stroke] {
 stroke: var(--jp-icon-contrast-color2);
}

.jp-icon-contrast3[stroke] {
 stroke: var(--jp-icon-contrast-color3);
}

.jp-icon-dot[fill] {
 fill: var(--jp-warn-color0);
}

.jp-jupyter-icon-color[fill] {
 fill: var(--jp-jupyter-icon-color, var(--jp-warn-color0));
}

.jp-notebook-icon-color[fill] {
 fill: var(--jp-notebook-icon-color, var(--jp-warn-color0));
}

.jp-json-icon-color[fill] {
 fill: var(--jp-json-icon-color, var(--jp-warn-color1));
}

.jp-console-icon-color[fill] {
 fill: var(--jp-console-icon-color, white);
}

.jp-console-icon-background-color[fill] {
 fill: var(--jp-console-icon-background-color, var(--jp-brand-color1));
}

.jp-terminal-icon-color[fill] {
 fill: var(--jp-terminal-icon-color, var(--jp-layout-color2));
}

.jp-terminal-icon-background-color[fill] {
 fill: var(
 --jp-terminal-icon-background-color,
 var(--jp-inverse-layout-color2)
 );
}

.jp-text-editor-icon-color[fill] {
 fill: var(--jp-text-editor-icon-color, var(--jp-inverse-layout-color3));
}

.jp-inspector-icon-color[fill] {
 fill: var(--jp-inspector-icon-color, var(--jp-inverse-layout-color3));
}

/* CSS for icons in selected filebrowser listing items */
.jp-DirListing-item.jp-mod-selected .jp-icon-selectable[fill] {
 fill: #fff;
}

.jp-DirListing-item.jp-mod-selected .jp-icon-selectable-inverse[fill] {
 fill: var(--jp-brand-color1);
}

/* stylelint-disable selector-max-class, selector-max-compound-selectors */

/**
* TODO: come up with non css-hack solution for showing the busy icon on top
* of the close icon
* CSS for complex behavior of close icon of tabs in the main area tabbar
*/
.lm-DockPanel-tabBar
 .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty
 &gt; .lm-TabBar-tabCloseIcon
 &gt; :not(:hover)
 &gt; .jp-icon3[fill] {
 fill: none;
}

.lm-DockPanel-tabBar
 .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty
 &gt; .lm-TabBar-tabCloseIcon
 &gt; :not(:hover)
 &gt; .jp-icon-busy[fill] {
 fill: var(--jp-inverse-layout-color3);
}

/* stylelint-enable selector-max-class, selector-max-compound-selectors */

/* CSS for icons in status bar */
#jp-main-statusbar .jp-mod-selected .jp-icon-selectable[fill] {
 fill: #fff;
}

#jp-main-statusbar .jp-mod-selected .jp-icon-selectable-inverse[fill] {
 fill: var(--jp-brand-color1);
}

/* special handling for splash icon CSS. While the theme CSS reloads during
 splash, the splash icon can loose theming. To prevent that, we set a
 default for its color variable */
:root {
 --jp-warn-color0: var(--md-orange-700);
}

/* not sure what to do with this one, used in filebrowser listing */
.jp-DragIcon {
 margin-right: 4px;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/**
 * Support for alt colors for icons as inline SVG HTMLElements
 */

/* alt recolor the primary elements of an icon */
.jp-icon-alt .jp-icon0[fill] {
 fill: var(--jp-layout-color0);
}

.jp-icon-alt .jp-icon1[fill] {
 fill: var(--jp-layout-color1);
}

.jp-icon-alt .jp-icon2[fill] {
 fill: var(--jp-layout-color2);
}

.jp-icon-alt .jp-icon3[fill] {
 fill: var(--jp-layout-color3);
}

.jp-icon-alt .jp-icon4[fill] {
 fill: var(--jp-layout-color4);
}

.jp-icon-alt .jp-icon0[stroke] {
 stroke: var(--jp-layout-color0);
}

.jp-icon-alt .jp-icon1[stroke] {
 stroke: var(--jp-layout-color1);
}

.jp-icon-alt .jp-icon2[stroke] {
 stroke: var(--jp-layout-color2);
}

.jp-icon-alt .jp-icon3[stroke] {
 stroke: var(--jp-layout-color3);
}

.jp-icon-alt .jp-icon4[stroke] {
 stroke: var(--jp-layout-color4);
}

/* alt recolor the accent elements of an icon */
.jp-icon-alt .jp-icon-accent0[fill] {
 fill: var(--jp-inverse-layout-color0);
}

.jp-icon-alt .jp-icon-accent1[fill] {
 fill: var(--jp-inverse-layout-color1);
}

.jp-icon-alt .jp-icon-accent2[fill] {
 fill: var(--jp-inverse-layout-color2);
}

.jp-icon-alt .jp-icon-accent3[fill] {
 fill: var(--jp-inverse-layout-color3);
}

.jp-icon-alt .jp-icon-accent4[fill] {
 fill: var(--jp-inverse-layout-color4);
}

.jp-icon-alt .jp-icon-accent0[stroke] {
 stroke: var(--jp-inverse-layout-color0);
}

.jp-icon-alt .jp-icon-accent1[stroke] {
 stroke: var(--jp-inverse-layout-color1);
}

.jp-icon-alt .jp-icon-accent2[stroke] {
 stroke: var(--jp-inverse-layout-color2);
}

.jp-icon-alt .jp-icon-accent3[stroke] {
 stroke: var(--jp-inverse-layout-color3);
}

.jp-icon-alt .jp-icon-accent4[stroke] {
 stroke: var(--jp-inverse-layout-color4);
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-icon-hoverShow:not(:hover) .jp-icon-hoverShow-content {
 display: none !important;
}

/**
 * Support for hover colors for icons as inline SVG HTMLElements
 */

/**
 * regular colors
 */

/* recolor the primary elements of an icon */
.jp-icon-hover :hover .jp-icon0-hover[fill] {
 fill: var(--jp-inverse-layout-color0);
}

.jp-icon-hover :hover .jp-icon1-hover[fill] {
 fill: var(--jp-inverse-layout-color1);
}

.jp-icon-hover :hover .jp-icon2-hover[fill] {
 fill: var(--jp-inverse-layout-color2);
}

.jp-icon-hover :hover .jp-icon3-hover[fill] {
 fill: var(--jp-inverse-layout-color3);
}

.jp-icon-hover :hover .jp-icon4-hover[fill] {
 fill: var(--jp-inverse-layout-color4);
}

.jp-icon-hover :hover .jp-icon0-hover[stroke] {
 stroke: var(--jp-inverse-layout-color0);
}

.jp-icon-hover :hover .jp-icon1-hover[stroke] {
 stroke: var(--jp-inverse-layout-color1);
}

.jp-icon-hover :hover .jp-icon2-hover[stroke] {
 stroke: var(--jp-inverse-layout-color2);
}

.jp-icon-hover :hover .jp-icon3-hover[stroke] {
 stroke: var(--jp-inverse-layout-color3);
}

.jp-icon-hover :hover .jp-icon4-hover[stroke] {
 stroke: var(--jp-inverse-layout-color4);
}

/* recolor the accent elements of an icon */
.jp-icon-hover :hover .jp-icon-accent0-hover[fill] {
 fill: var(--jp-layout-color0);
}

.jp-icon-hover :hover .jp-icon-accent1-hover[fill] {
 fill: var(--jp-layout-color1);
}

.jp-icon-hover :hover .jp-icon-accent2-hover[fill] {
 fill: var(--jp-layout-color2);
}

.jp-icon-hover :hover .jp-icon-accent3-hover[fill] {
 fill: var(--jp-layout-color3);
}

.jp-icon-hover :hover .jp-icon-accent4-hover[fill] {
 fill: var(--jp-layout-color4);
}

.jp-icon-hover :hover .jp-icon-accent0-hover[stroke] {
 stroke: var(--jp-layout-color0);
}

.jp-icon-hover :hover .jp-icon-accent1-hover[stroke] {
 stroke: var(--jp-layout-color1);
}

.jp-icon-hover :hover .jp-icon-accent2-hover[stroke] {
 stroke: var(--jp-layout-color2);
}

.jp-icon-hover :hover .jp-icon-accent3-hover[stroke] {
 stroke: var(--jp-layout-color3);
}

.jp-icon-hover :hover .jp-icon-accent4-hover[stroke] {
 stroke: var(--jp-layout-color4);
}

/* set the color of an icon to transparent */
.jp-icon-hover :hover .jp-icon-none-hover[fill] {
 fill: none;
}

.jp-icon-hover :hover .jp-icon-none-hover[stroke] {
 stroke: none;
}

/**
 * inverse colors
 */

/* inverse recolor the primary elements of an icon */
.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[fill] {
 fill: var(--jp-layout-color0);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[fill] {
 fill: var(--jp-layout-color1);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[fill] {
 fill: var(--jp-layout-color2);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[fill] {
 fill: var(--jp-layout-color3);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[fill] {
 fill: var(--jp-layout-color4);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[stroke] {
 stroke: var(--jp-layout-color0);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[stroke] {
 stroke: var(--jp-layout-color1);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[stroke] {
 stroke: var(--jp-layout-color2);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[stroke] {
 stroke: var(--jp-layout-color3);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[stroke] {
 stroke: var(--jp-layout-color4);
}

/* inverse recolor the accent elements of an icon */
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[fill] {
 fill: var(--jp-inverse-layout-color0);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[fill] {
 fill: var(--jp-inverse-layout-color1);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[fill] {
 fill: var(--jp-inverse-layout-color2);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[fill] {
 fill: var(--jp-inverse-layout-color3);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[fill] {
 fill: var(--jp-inverse-layout-color4);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[stroke] {
 stroke: var(--jp-inverse-layout-color0);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[stroke] {
 stroke: var(--jp-inverse-layout-color1);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[stroke] {
 stroke: var(--jp-inverse-layout-color2);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[stroke] {
 stroke: var(--jp-inverse-layout-color3);
}

.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[stroke] {
 stroke: var(--jp-inverse-layout-color4);
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-IFrame {
 width: 100%;
 height: 100%;
}

.jp-IFrame &gt; iframe {
 border: none;
}

/*
When drag events occur, `lm-mod-override-cursor` is added to the body.
Because iframes steal all cursor events, the following two rules are necessary
to suppress pointer events while resize drags are occurring. There may be a
better solution to this problem.
*/
body.lm-mod-override-cursor .jp-IFrame {
 position: relative;
}

body.lm-mod-override-cursor .jp-IFrame::before {
 content: '';
 position: absolute;
 top: 0;
 left: 0;
 right: 0;
 bottom: 0;
 background: transparent;
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-HoverBox {
 position: fixed;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-FormGroup-content fieldset {
 border: none;
 padding: 0;
 min-width: 0;
 width: 100%;
}

/* stylelint-disable selector-max-type */

.jp-FormGroup-content fieldset .jp-inputFieldWrapper input,
.jp-FormGroup-content fieldset .jp-inputFieldWrapper select,
.jp-FormGroup-content fieldset .jp-inputFieldWrapper textarea {
 font-size: var(--jp-content-font-size2);
 border-color: var(--jp-input-border-color);
 border-style: solid;
 border-radius: var(--jp-border-radius);
 border-width: 1px;
 padding: 6px 8px;
 background: none;
 color: var(--jp-ui-font-color0);
 height: inherit;
}

.jp-FormGroup-content fieldset input[type='checkbox'] {
 position: relative;
 top: 2px;
 margin-left: 0;
}

.jp-FormGroup-content button.jp-mod-styled {
 cursor: pointer;
}

.jp-FormGroup-content .checkbox label {
 cursor: pointer;
 font-size: var(--jp-content-font-size1);
}

.jp-FormGroup-content .jp-root &gt; fieldset &gt; legend {
 display: none;
}

.jp-FormGroup-content .jp-root &gt; fieldset &gt; p {
 display: none;
}

/** copy of `input.jp-mod-styled:focus` style */
.jp-FormGroup-content fieldset input:focus,
.jp-FormGroup-content fieldset select:focus {
 -moz-outline-radius: unset;
 outline: var(--jp-border-width) solid var(--md-blue-500);
 outline-offset: -1px;
 box-shadow: inset 0 0 4px var(--md-blue-300);
}

.jp-FormGroup-content fieldset input:hover:not(:focus),
.jp-FormGroup-content fieldset select:hover:not(:focus) {
 background-color: var(--jp-border-color2);
}

/* stylelint-enable selector-max-type */

.jp-FormGroup-content .checkbox .field-description {
 /* Disable default description field for checkbox:
 because other widgets do not have description fields,
 we add descriptions to each widget on the field level.
 */
 display: none;
}

.jp-FormGroup-content #root__description {
 display: none;
}

.jp-FormGroup-content .jp-modifiedIndicator {
 width: 5px;
 background-color: var(--jp-brand-color2);
 margin-top: 0;
 margin-left: calc(var(--jp-private-settingeditor-modifier-indent) * -1);
 flex-shrink: 0;
}

.jp-FormGroup-content .jp-modifiedIndicator.jp-errorIndicator {
 background-color: var(--jp-error-color0);
 margin-right: 0.5em;
}

/* RJSF ARRAY style */

.jp-arrayFieldWrapper legend {
 font-size: var(--jp-content-font-size2);
 color: var(--jp-ui-font-color0);
 flex-basis: 100%;
 padding: 4px 0;
 font-weight: var(--jp-content-heading-font-weight);
 border-bottom: 1px solid var(--jp-border-color2);
}

.jp-arrayFieldWrapper .field-description {
 padding: 4px 0;
 white-space: pre-wrap;
}

.jp-arrayFieldWrapper .array-item {
 width: 100%;
 border: 1px solid var(--jp-border-color2);
 border-radius: 4px;
 margin: 4px;
}

.jp-ArrayOperations {
 display: flex;
 margin-left: 8px;
}

.jp-ArrayOperationsButton {
 margin: 2px;
}

.jp-ArrayOperationsButton .jp-icon3[fill] {
 fill: var(--jp-ui-font-color0);
}

button.jp-ArrayOperationsButton.jp-mod-styled:disabled {
 cursor: not-allowed;
 opacity: 0.5;
}

/* RJSF form validation error */

.jp-FormGroup-content .validationErrors {
 color: var(--jp-error-color0);
}

/* Hide panel level error as duplicated the field level error */
.jp-FormGroup-content .panel.errors {
 display: none;
}

/* RJSF normal content (settings-editor) */

.jp-FormGroup-contentNormal {
 display: flex;
 align-items: center;
 flex-wrap: wrap;
}

.jp-FormGroup-contentNormal .jp-FormGroup-contentItem {
 margin-left: 7px;
 color: var(--jp-ui-font-color0);
}

.jp-FormGroup-contentNormal .jp-FormGroup-description {
 flex-basis: 100%;
 padding: 4px 7px;
}

.jp-FormGroup-contentNormal .jp-FormGroup-default {
 flex-basis: 100%;
 padding: 4px 7px;
}

.jp-FormGroup-contentNormal .jp-FormGroup-fieldLabel {
 font-size: var(--jp-content-font-size1);
 font-weight: normal;
 min-width: 120px;
}

.jp-FormGroup-contentNormal fieldset:not(:first-child) {
 margin-left: 7px;
}

.jp-FormGroup-contentNormal .field-array-of-string .array-item {
 /* Display `jp-ArrayOperations` buttons side-by-side with content except
 for small screens where flex-wrap will place them one below the other.
 */
 display: flex;
 align-items: center;
 flex-wrap: wrap;
}

.jp-FormGroup-contentNormal .jp-objectFieldWrapper .form-group {
 padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent);
 margin-top: 2px;
}

/* RJSF compact content (metadata-form) */

.jp-FormGroup-content.jp-FormGroup-contentCompact {
 width: 100%;
}

.jp-FormGroup-contentCompact .form-group {
 display: flex;
 padding: 0.5em 0.2em 0.5em 0;
}

.jp-FormGroup-contentCompact
 .jp-FormGroup-compactTitle
 .jp-FormGroup-description {
 font-size: var(--jp-ui-font-size1);
 color: var(--jp-ui-font-color2);
}

.jp-FormGroup-contentCompact .jp-FormGroup-fieldLabel {
 padding-bottom: 0.3em;
}

.jp-FormGroup-contentCompact .jp-inputFieldWrapper .form-control {
 width: 100%;
 box-sizing: border-box;
}

.jp-FormGroup-contentCompact .jp-arrayFieldWrapper .jp-FormGroup-compactTitle {
 padding-bottom: 7px;
}

.jp-FormGroup-contentCompact
 .jp-objectFieldWrapper
 .jp-objectFieldWrapper
 .form-group {
 padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent);
 margin-top: 2px;
}

.jp-FormGroup-contentCompact ul.error-detail {
 margin-block-start: 0.5em;
 margin-block-end: 0.5em;
 padding-inline-start: 1em;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

.jp-SidePanel {
 display: flex;
 flex-direction: column;
 min-width: var(--jp-sidebar-min-width);
 overflow-y: auto;
 color: var(--jp-ui-font-color1);
 background: var(--jp-layout-color1);
 font-size: var(--jp-ui-font-size1);
}

.jp-SidePanel-header {
 flex: 0 0 auto;
 display: flex;
 border-bottom: var(--jp-border-width) solid var(--jp-border-color2);
 font-size: var(--jp-ui-font-size0);
 font-weight: 600;
 letter-spacing: 1px;
 margin: 0;
 padding: 2px;
 text-transform: uppercase;
}

.jp-SidePanel-toolbar {
 flex: 0 0 auto;
}

.jp-SidePanel-content {
 flex: 1 1 auto;
}

.jp-SidePanel-toolbar,
.jp-AccordionPanel-toolbar {
 height: var(--jp-private-toolbar-height);
}

.jp-SidePanel-toolbar.jp-Toolbar-micro {
 display: none;
}

.lm-AccordionPanel .jp-AccordionPanel-title {
 box-sizing: border-box;
 line-height: 25px;
 margin: 0;
 display: flex;
 align-items: center;
 background: var(--jp-layout-color1);
 color: var(--jp-ui-font-color1);
 border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
 box-shadow: var(--jp-toolbar-box-shadow);
 font-size: var(--jp-ui-font-size0);
}

.jp-AccordionPanel-title {
 cursor: pointer;
 user-select: none;
 -moz-user-select: none;
 -webkit-user-select: none;
 text-transform: uppercase;
}

.lm-AccordionPanel[data-orientation='horizontal'] &gt; .jp-AccordionPanel-title {
 /* Title is rotated for horizontal accordion panel using CSS */
 display: block;
 transform-origin: top left;
 transform: rotate(-90deg) translate(-100%);
}

.jp-AccordionPanel-title .lm-AccordionPanel-titleLabel {
 user-select: none;
 text-overflow: ellipsis;
 white-space: nowrap;
 overflow: hidden;
}

.jp-AccordionPanel-title .lm-AccordionPanel-titleCollapser {
 transform: rotate(-90deg);
 margin: auto 0;
 height: 16px;
}

.jp-AccordionPanel-title.lm-mod-expanded .lm-AccordionPanel-titleCollapser {
 transform: rotate(0deg);
}

.lm-AccordionPanel .jp-AccordionPanel-toolbar {
 background: none;
 box-shadow: none;
 border: none;
 margin-left: auto;
}

.lm-AccordionPanel .lm-SplitPanel-handle:hover {
 background: var(--jp-layout-color3);
}

.jp-text-truncated {
 overflow: hidden;
 text-overflow: ellipsis;
 white-space: nowrap;
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-Spinner {
 position: absolute;
 display: flex;
 justify-content: center;
 align-items: center;
 z-index: 10;
 left: 0;
 top: 0;
 width: 100%;
 height: 100%;
 background: var(--jp-layout-color0);
 outline: none;
}

.jp-SpinnerContent {
 font-size: 10px;
 margin: 50px auto;
 text-indent: -9999em;
 width: 3em;
 height: 3em;
 border-radius: 50%;
 background: var(--jp-brand-color3);
 background: linear-gradient(
 to right,
 #f37626 10%,
 rgba(255, 255, 255, 0) 42%
 );
 position: relative;
 animation: load3 1s infinite linear, fadeIn 1s;
}

.jp-SpinnerContent::before {
 width: 50%;
 height: 50%;
 background: #f37626;
 border-radius: 100% 0 0;
 position: absolute;
 top: 0;
 left: 0;
 content: '';
}

.jp-SpinnerContent::after {
 background: var(--jp-layout-color0);
 width: 75%;
 height: 75%;
 border-radius: 50%;
 content: '';
 margin: auto;
 position: absolute;
 top: 0;
 left: 0;
 bottom: 0;
 right: 0;
}

@keyframes fadeIn {
 0% {
 opacity: 0;
 }

 100% {
 opacity: 1;
 }
}

@keyframes load3 {
 0% {
 transform: rotate(0deg);
 }

 100% {
 transform: rotate(360deg);
 }
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

button.jp-mod-styled {
 font-size: var(--jp-ui-font-size1);
 color: var(--jp-ui-font-color0);
 border: none;
 box-sizing: border-box;
 text-align: center;
 line-height: 32px;
 height: 32px;
 padding: 0 12px;
 letter-spacing: 0.8px;
 outline: none;
 appearance: none;
 -webkit-appearance: none;
 -moz-appearance: none;
}

input.jp-mod-styled {
 background: var(--jp-input-background);
 height: 28px;
 box-sizing: border-box;
 border: var(--jp-border-width) solid var(--jp-border-color1);
 padding-left: 7px;
 padding-right: 7px;
 font-size: var(--jp-ui-font-size2);
 color: var(--jp-ui-font-color0);
 outline: none;
 appearance: none;
 -webkit-appearance: none;
 -moz-appearance: none;
}

input[type='checkbox'].jp-mod-styled {
 appearance: checkbox;
 -webkit-appearance: checkbox;
 -moz-appearance: checkbox;
 height: auto;
}

input.jp-mod-styled:focus {
 border: var(--jp-border-width) solid var(--md-blue-500);
 box-shadow: inset 0 0 4px var(--md-blue-300);
}

.jp-select-wrapper {
 display: flex;
 position: relative;
 flex-direction: column;
 padding: 1px;
 background-color: var(--jp-layout-color1);
 box-sizing: border-box;
 margin-bottom: 12px;
}

.jp-select-wrapper:not(.multiple) {
 height: 28px;
}

.jp-select-wrapper.jp-mod-focused select.jp-mod-styled {
 border: var(--jp-border-width) solid var(--jp-input-active-border-color);
 box-shadow: var(--jp-input-box-shadow);
 background-color: var(--jp-input-active-background);
}

select.jp-mod-styled:hover {
 cursor: pointer;
 color: var(--jp-ui-font-color0);
 background-color: var(--jp-input-hover-background);
 box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.5);
}

select.jp-mod-styled {
 flex: 1 1 auto;
 width: 100%;
 font-size: var(--jp-ui-font-size2);
 background: var(--jp-input-background);
 color: var(--jp-ui-font-color0);
 padding: 0 25px 0 8px;
 border: var(--jp-border-width) solid var(--jp-input-border-color);
 border-radius: 0;
 outline: none;
 appearance: none;
 -webkit-appearance: none;
 -moz-appearance: none;
}

select.jp-mod-styled:not([multiple]) {
 height: 32px;
}

select.jp-mod-styled[multiple] {
 max-height: 200px;
 overflow-y: auto;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-switch {
 display: flex;
 align-items: center;
 padding-left: 4px;
 padding-right: 4px;
 font-size: var(--jp-ui-font-size1);
 background-color: transparent;
 color: var(--jp-ui-font-color1);
 border: none;
 height: 20px;
}

.jp-switch:hover {
 background-color: var(--jp-layout-color2);
}

.jp-switch-label {
 margin-right: 5px;
 font-family: var(--jp-ui-font-family);
}

.jp-switch-track {
 cursor: pointer;
 background-color: var(--jp-switch-color, var(--jp-border-color1));
 -webkit-transition: 0.4s;
 transition: 0.4s;
 border-radius: 34px;
 height: 16px;
 width: 35px;
 position: relative;
}

.jp-switch-track::before {
 content: '';
 position: absolute;
 height: 10px;
 width: 10px;
 margin: 3px;
 left: 0;
 background-color: var(--jp-ui-inverse-font-color1);
 -webkit-transition: 0.4s;
 transition: 0.4s;
 border-radius: 50%;
}

.jp-switch[aria-checked='true'] .jp-switch-track {
 background-color: var(--jp-switch-true-position-color, var(--jp-warn-color0));
}

.jp-switch[aria-checked='true'] .jp-switch-track::before {
 /* track width (35) - margins (3 + 3) - thumb width (10) */
 left: 19px;
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

:root {
 --jp-private-toolbar-height: calc(
 28px + var(--jp-border-width)
 ); /* leave 28px for content */
}

.jp-Toolbar {
 color: var(--jp-ui-font-color1);
 flex: 0 0 auto;
 display: flex;
 flex-direction: row;
 border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
 box-shadow: var(--jp-toolbar-box-shadow);
 background: var(--jp-toolbar-background);
 min-height: var(--jp-toolbar-micro-height);
 padding: 2px;
 z-index: 8;
 overflow-x: hidden;
}

/* Toolbar items */

.jp-Toolbar &gt; .jp-Toolbar-item.jp-Toolbar-spacer {
 flex-grow: 1;
 flex-shrink: 1;
}

.jp-Toolbar-item.jp-Toolbar-kernelStatus {
 display: inline-block;
 width: 32px;
 background-repeat: no-repeat;
 background-position: center;
 background-size: 16px;
}

.jp-Toolbar &gt; .jp-Toolbar-item {
 flex: 0 0 auto;
 display: flex;
 padding-left: 1px;
 padding-right: 1px;
 font-size: var(--jp-ui-font-size1);
 line-height: var(--jp-private-toolbar-height);
 height: 100%;
}

/* Toolbar buttons */

/* This is the div we use to wrap the react component into a Widget */
div.jp-ToolbarButton {
 color: transparent;
 border: none;
 box-sizing: border-box;
 outline: none;
 appearance: none;
 -webkit-appearance: none;
 -moz-appearance: none;
 padding: 0;
 margin: 0;
}

button.jp-ToolbarButtonComponent {
 background: var(--jp-layout-color1);
 border: none;
 box-sizing: border-box;
 outline: none;
 appearance: none;
 -webkit-appearance: none;
 -moz-appearance: none;
 padding: 0 6px;
 margin: 0;
 height: 24px;
 border-radius: var(--jp-border-radius);
 display: flex;
 align-items: center;
 text-align: center;
 font-size: 14px;
 min-width: unset;
 min-height: unset;
}

button.jp-ToolbarButtonComponent:disabled {
 opacity: 0.4;
}

button.jp-ToolbarButtonComponent &gt; span {
 padding: 0;
 flex: 0 0 auto;
}

button.jp-ToolbarButtonComponent .jp-ToolbarButtonComponent-label {
 font-size: var(--jp-ui-font-size1);
 line-height: 100%;
 padding-left: 2px;
 color: var(--jp-ui-font-color1);
 font-family: var(--jp-ui-font-family);
}

#jp-main-dock-panel[data-mode='single-document']
 .jp-MainAreaWidget
 &gt; .jp-Toolbar.jp-Toolbar-micro {
 padding: 0;
 min-height: 0;
}

#jp-main-dock-panel[data-mode='single-document']
 .jp-MainAreaWidget
 &gt; .jp-Toolbar {
 border: none;
 box-shadow: none;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

.jp-WindowedPanel-outer {
 position: relative;
 overflow-y: auto;
}

.jp-WindowedPanel-inner {
 position: relative;
}

.jp-WindowedPanel-window {
 position: absolute;
 left: 0;
 right: 0;
 overflow: visible;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/* Sibling imports */

body {
 color: var(--jp-ui-font-color1);
 font-size: var(--jp-ui-font-size1);
}

/* Disable native link decoration styles everywhere outside of dialog boxes */
a {
 text-decoration: unset;
 color: unset;
}

a:hover {
 text-decoration: unset;
 color: unset;
}

/* Accessibility for links inside dialog box text */
.jp-Dialog-content a {
 text-decoration: revert;
 color: var(--jp-content-link-color);
}

.jp-Dialog-content a:hover {
 text-decoration: revert;
}

/* Styles for ui-components */
.jp-Button {
 color: var(--jp-ui-font-color2);
 border-radius: var(--jp-border-radius);
 padding: 0 12px;
 font-size: var(--jp-ui-font-size1);

 /* Copy from blueprint 3 */
 display: inline-flex;
 flex-direction: row;
 border: none;
 cursor: pointer;
 align-items: center;
 justify-content: center;
 text-align: left;
 vertical-align: middle;
 min-height: 30px;
 min-width: 30px;
}

.jp-Button:disabled {
 cursor: not-allowed;
}

.jp-Button:empty {
 padding: 0 !important;
}

.jp-Button.jp-mod-small {
 min-height: 24px;
 min-width: 24px;
 font-size: 12px;
 padding: 0 7px;
}

/* Use our own theme for hover styles */
.jp-Button.jp-mod-minimal:hover {
 background-color: var(--jp-layout-color2);
}

.jp-Button.jp-mod-minimal {
 background: none;
}

.jp-InputGroup {
 display: block;
 position: relative;
}

.jp-InputGroup input {
 box-sizing: border-box;
 border: none;
 border-radius: 0;
 background-color: transparent;
 color: var(--jp-ui-font-color0);
 box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color);
 padding-bottom: 0;
 padding-top: 0;
 padding-left: 10px;
 padding-right: 28px;
 position: relative;
 width: 100%;
 -webkit-appearance: none;
 -moz-appearance: none;
 appearance: none;
 font-size: 14px;
 font-weight: 400;
 height: 30px;
 line-height: 30px;
 outline: none;
 vertical-align: middle;
}

.jp-InputGroup input:focus {
 box-shadow: inset 0 0 0 var(--jp-border-width)
 var(--jp-input-active-box-shadow-color),
 inset 0 0 0 3px var(--jp-input-active-box-shadow-color);
}

.jp-InputGroup input:disabled {
 cursor: not-allowed;
 resize: block;
 background-color: var(--jp-layout-color2);
 color: var(--jp-ui-font-color2);
}

.jp-InputGroup input:disabled ~ span {
 cursor: not-allowed;
 color: var(--jp-ui-font-color2);
}

.jp-InputGroup input::placeholder,
input::placeholder {
 color: var(--jp-ui-font-color2);
}

.jp-InputGroupAction {
 position: absolute;
 bottom: 1px;
 right: 0;
 padding: 6px;
}

.jp-HTMLSelect.jp-DefaultStyle select {
 background-color: initial;
 border: none;
 border-radius: 0;
 box-shadow: none;
 color: var(--jp-ui-font-color0);
 display: block;
 font-size: var(--jp-ui-font-size1);
 font-family: var(--jp-ui-font-family);
 height: 24px;
 line-height: 14px;
 padding: 0 25px 0 10px;
 text-align: left;
 -moz-appearance: none;
 -webkit-appearance: none;
}

.jp-HTMLSelect.jp-DefaultStyle select:disabled {
 background-color: var(--jp-layout-color2);
 color: var(--jp-ui-font-color2);
 cursor: not-allowed;
 resize: block;
}

.jp-HTMLSelect.jp-DefaultStyle select:disabled ~ span {
 cursor: not-allowed;
}

/* Use our own theme for hover and option styles */
/* stylelint-disable-next-line selector-max-type */
.jp-HTMLSelect.jp-DefaultStyle select:hover,
.jp-HTMLSelect.jp-DefaultStyle select &gt; option {
 background-color: var(--jp-layout-color2);
 color: var(--jp-ui-font-color0);
}

select {
 box-sizing: border-box;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Styles
|----------------------------------------------------------------------------*/

.jp-StatusBar-Widget {
 display: flex;
 align-items: center;
 background: var(--jp-layout-color2);
 min-height: var(--jp-statusbar-height);
 justify-content: space-between;
 padding: 0 10px;
}

.jp-StatusBar-Left {
 display: flex;
 align-items: center;
 flex-direction: row;
}

.jp-StatusBar-Middle {
 display: flex;
 align-items: center;
}

.jp-StatusBar-Right {
 display: flex;
 align-items: center;
 flex-direction: row-reverse;
}

.jp-StatusBar-Item {
 max-height: var(--jp-statusbar-height);
 margin: 0 2px;
 height: var(--jp-statusbar-height);
 white-space: nowrap;
 text-overflow: ellipsis;
 color: var(--jp-ui-font-color1);
 padding: 0 6px;
}

.jp-mod-highlighted:hover {
 background-color: var(--jp-layout-color3);
}

.jp-mod-clicked {
 background-color: var(--jp-brand-color1);
}

.jp-mod-clicked:hover {
 background-color: var(--jp-brand-color0);
}

.jp-mod-clicked .jp-StatusBar-TextItem {
 color: var(--jp-ui-inverse-font-color1);
}

.jp-StatusBar-HoverItem {
 box-shadow: '0px 4px 4px rgba(0, 0, 0, 0.25)';
}

.jp-StatusBar-TextItem {
 font-size: var(--jp-ui-font-size1);
 font-family: var(--jp-ui-font-family);
 line-height: 24px;
 color: var(--jp-ui-font-color1);
}

.jp-StatusBar-GroupItem {
 display: flex;
 align-items: center;
 flex-direction: row;
}

.jp-Statusbar-ProgressCircle svg {
 display: block;
 margin: 0 auto;
 width: 16px;
 height: 24px;
 align-self: normal;
}

.jp-Statusbar-ProgressCircle path {
 fill: var(--jp-inverse-layout-color3);
}

.jp-Statusbar-ProgressBar-progress-bar {
 height: 10px;
 width: 100px;
 border: solid 0.25px var(--jp-brand-color2);
 border-radius: 3px;
 overflow: hidden;
 align-self: center;
}

.jp-Statusbar-ProgressBar-progress-bar &gt; div {
 background-color: var(--jp-brand-color2);
 background-image: linear-gradient(
 -45deg,
 rgba(255, 255, 255, 0.2) 25%,
 transparent 25%,
 transparent 50%,
 rgba(255, 255, 255, 0.2) 50%,
 rgba(255, 255, 255, 0.2) 75%,
 transparent 75%,
 transparent
 );
 background-size: 40px 40px;
 float: left;
 width: 0%;
 height: 100%;
 font-size: 12px;
 line-height: 14px;
 color: #fff;
 text-align: center;
 animation: jp-Statusbar-ExecutionTime-progress-bar 2s linear infinite;
}

.jp-Statusbar-ProgressBar-progress-bar p {
 color: var(--jp-ui-font-color1);
 font-family: var(--jp-ui-font-family);
 font-size: var(--jp-ui-font-size1);
 line-height: 10px;
 width: 100px;
}

@keyframes jp-Statusbar-ExecutionTime-progress-bar {
 0% {
 background-position: 0 0;
 }

 100% {
 background-position: 40px 40px;
 }
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/

:root {
 --jp-private-commandpalette-search-height: 28px;
}

/*-----------------------------------------------------------------------------
| Overall styles
|----------------------------------------------------------------------------*/

.lm-CommandPalette {
 padding-bottom: 0;
 color: var(--jp-ui-font-color1);
 background: var(--jp-layout-color1);

 /* This is needed so that all font sizing of children done in ems is
 * relative to this base size */
 font-size: var(--jp-ui-font-size1);
}

/*-----------------------------------------------------------------------------
| Modal variant
|----------------------------------------------------------------------------*/

.jp-ModalCommandPalette {
 position: absolute;
 z-index: 10000;
 top: 38px;
 left: 30%;
 margin: 0;
 padding: 4px;
 width: 40%;
 box-shadow: var(--jp-elevation-z4);
 border-radius: 4px;
 background: var(--jp-layout-color0);
}

.jp-ModalCommandPalette .lm-CommandPalette {
 max-height: 40vh;
}

.jp-ModalCommandPalette .lm-CommandPalette .lm-close-icon::after {
 display: none;
}

.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-header {
 display: none;
}

.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-item {
 margin-left: 4px;
 margin-right: 4px;
}

.jp-ModalCommandPalette
 .lm-CommandPalette
 .lm-CommandPalette-item.lm-mod-disabled {
 display: none;
}

/*-----------------------------------------------------------------------------
| Search
|----------------------------------------------------------------------------*/

.lm-CommandPalette-search {
 padding: 4px;
 background-color: var(--jp-layout-color1);
 z-index: 2;
}

.lm-CommandPalette-wrapper {
 overflow: overlay;
 padding: 0 9px;
 background-color: var(--jp-input-active-background);
 height: 30px;
 box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color);
}

.lm-CommandPalette.lm-mod-focused .lm-CommandPalette-wrapper {
 box-shadow: inset 0 0 0 1px var(--jp-input-active-box-shadow-color),
 inset 0 0 0 3px var(--jp-input-active-box-shadow-color);
}

.jp-SearchIconGroup {
 color: white;
 background-color: var(--jp-brand-color1);
 position: absolute;
 top: 4px;
 right: 4px;
 padding: 5px 5px 1px;
}

.jp-SearchIconGroup svg {
 height: 20px;
 width: 20px;
}

.jp-SearchIconGroup .jp-icon3[fill] {
 fill: var(--jp-layout-color0);
}

.lm-CommandPalette-input {
 background: transparent;
 width: calc(100% - 18px);
 float: left;
 border: none;
 outline: none;
 font-size: var(--jp-ui-font-size1);
 color: var(--jp-ui-font-color0);
 line-height: var(--jp-private-commandpalette-search-height);
}

.lm-CommandPalette-input::-webkit-input-placeholder,
.lm-CommandPalette-input::-moz-placeholder,
.lm-CommandPalette-input:-ms-input-placeholder {
 color: var(--jp-ui-font-color2);
 font-size: var(--jp-ui-font-size1);
}

/*-----------------------------------------------------------------------------
| Results
|----------------------------------------------------------------------------*/

.lm-CommandPalette-header:first-child {
 margin-top: 0;
}

.lm-CommandPalette-header {
 border-bottom: solid var(--jp-border-width) var(--jp-border-color2);
 color: var(--jp-ui-font-color1);
 cursor: pointer;
 display: flex;
 font-size: var(--jp-ui-font-size0);
 font-weight: 600;
 letter-spacing: 1px;
 margin-top: 8px;
 padding: 8px 0 8px 12px;
 text-transform: uppercase;
}

.lm-CommandPalette-header.lm-mod-active {
 background: var(--jp-layout-color2);
}

.lm-CommandPalette-header &gt; mark {
 background-color: transparent;
 font-weight: bold;
 color: var(--jp-ui-font-color1);
}

.lm-CommandPalette-item {
 padding: 4px 12px 4px 4px;
 color: var(--jp-ui-font-color1);
 font-size: var(--jp-ui-font-size1);
 font-weight: 400;
 display: flex;
}

.lm-CommandPalette-item.lm-mod-disabled {
 color: var(--jp-ui-font-color2);
}

.lm-CommandPalette-item.lm-mod-active {
 color: var(--jp-ui-inverse-font-color1);
 background: var(--jp-brand-color1);
}

.lm-CommandPalette-item.lm-mod-active .lm-CommandPalette-itemLabel &gt; mark {
 color: var(--jp-ui-inverse-font-color0);
}

.lm-CommandPalette-item.lm-mod-active .jp-icon-selectable[fill] {
 fill: var(--jp-layout-color0);
}

.lm-CommandPalette-item.lm-mod-active:hover:not(.lm-mod-disabled) {
 color: var(--jp-ui-inverse-font-color1);
 background: var(--jp-brand-color1);
}

.lm-CommandPalette-item:hover:not(.lm-mod-active):not(.lm-mod-disabled) {
 background: var(--jp-layout-color2);
}

.lm-CommandPalette-itemContent {
 overflow: hidden;
}

.lm-CommandPalette-itemLabel &gt; mark {
 color: var(--jp-ui-font-color0);
 background-color: transparent;
 font-weight: bold;
}

.lm-CommandPalette-item.lm-mod-disabled mark {
 color: var(--jp-ui-font-color2);
}

.lm-CommandPalette-item .lm-CommandPalette-itemIcon {
 margin: 0 4px 0 0;
 position: relative;
 width: 16px;
 top: 2px;
 flex: 0 0 auto;
}

.lm-CommandPalette-item.lm-mod-disabled .lm-CommandPalette-itemIcon {
 opacity: 0.6;
}

.lm-CommandPalette-item .lm-CommandPalette-itemShortcut {
 flex: 0 0 auto;
}

.lm-CommandPalette-itemCaption {
 display: none;
}

.lm-CommandPalette-content {
 background-color: var(--jp-layout-color1);
}

.lm-CommandPalette-content:empty::after {
 content: 'No results';
 margin: auto;
 margin-top: 20px;
 width: 100px;
 display: block;
 font-size: var(--jp-ui-font-size2);
 font-family: var(--jp-ui-font-family);
 font-weight: lighter;
}

.lm-CommandPalette-emptyMessage {
 text-align: center;
 margin-top: 24px;
 line-height: 1.32;
 padding: 0 8px;
 color: var(--jp-content-font-color3);
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-Dialog {
 position: absolute;
 z-index: 10000;
 display: flex;
 flex-direction: column;
 align-items: center;
 justify-content: center;
 top: 0;
 left: 0;
 margin: 0;
 padding: 0;
 width: 100%;
 height: 100%;
 background: var(--jp-dialog-background);
}

.jp-Dialog-content {
 display: flex;
 flex-direction: column;
 margin-left: auto;
 margin-right: auto;
 background: var(--jp-layout-color1);
 padding: 24px 24px 12px;
 min-width: 300px;
 min-height: 150px;
 max-width: 1000px;
 max-height: 500px;
 box-sizing: border-box;
 box-shadow: var(--jp-elevation-z20);
 word-wrap: break-word;
 border-radius: var(--jp-border-radius);

 /* This is needed so that all font sizing of children done in ems is
 * relative to this base size */
 font-size: var(--jp-ui-font-size1);
 color: var(--jp-ui-font-color1);
 resize: both;
}

.jp-Dialog-content.jp-Dialog-content-small {
 max-width: 500px;
}

.jp-Dialog-button {
 overflow: visible;
}

button.jp-Dialog-button:focus {
 outline: 1px solid var(--jp-brand-color1);
 outline-offset: 4px;
 -moz-outline-radius: 0;
}

button.jp-Dialog-button:focus::-moz-focus-inner {
 border: 0;
}

button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus,
button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus,
button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus {
 outline-offset: 4px;
 -moz-outline-radius: 0;
}

button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus {
 outline: 1px solid var(--jp-accept-color-normal, var(--jp-brand-color1));
}

button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus {
 outline: 1px solid var(--jp-warn-color-normal, var(--jp-error-color1));
}

button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus {
 outline: 1px solid var(--jp-reject-color-normal, var(--md-grey-600));
}

button.jp-Dialog-close-button {
 padding: 0;
 height: 100%;
 min-width: unset;
 min-height: unset;
}

.jp-Dialog-header {
 display: flex;
 justify-content: space-between;
 flex: 0 0 auto;
 padding-bottom: 12px;
 font-size: var(--jp-ui-font-size3);
 font-weight: 400;
 color: var(--jp-ui-font-color1);
}

.jp-Dialog-body {
 display: flex;
 flex-direction: column;
 flex: 1 1 auto;
 font-size: var(--jp-ui-font-size1);
 background: var(--jp-layout-color1);
 color: var(--jp-ui-font-color1);
 overflow: auto;
}

.jp-Dialog-footer {
 display: flex;
 flex-direction: row;
 justify-content: flex-end;
 align-items: center;
 flex: 0 0 auto;
 margin-left: -12px;
 margin-right: -12px;
 padding: 12px;
}

.jp-Dialog-checkbox {
 padding-right: 5px;
}

.jp-Dialog-checkbox &gt; input:focus-visible {
 outline: 1px solid var(--jp-input-active-border-color);
 outline-offset: 1px;
}

.jp-Dialog-spacer {
 flex: 1 1 auto;
}

.jp-Dialog-title {
 overflow: hidden;
 white-space: nowrap;
 text-overflow: ellipsis;
}

.jp-Dialog-body &gt; .jp-select-wrapper {
 width: 100%;
}

.jp-Dialog-body &gt; button {
 padding: 0 16px;
}

.jp-Dialog-body &gt; label {
 line-height: 1.4;
 color: var(--jp-ui-font-color0);
}

.jp-Dialog-button.jp-mod-styled:not(:last-child) {
 margin-right: 12px;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

.jp-Input-Boolean-Dialog {
 flex-direction: row-reverse;
 align-items: end;
 width: 100%;
}

.jp-Input-Boolean-Dialog &gt; label {
 flex: 1 1 auto;
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-MainAreaWidget &gt; :focus {
 outline: none;
}

.jp-MainAreaWidget .jp-MainAreaWidget-error {
 padding: 6px;
}

.jp-MainAreaWidget .jp-MainAreaWidget-error &gt; pre {
 width: auto;
 padding: 10px;
 background: var(--jp-error-color3);
 border: var(--jp-border-width) solid var(--jp-error-color1);
 border-radius: var(--jp-border-radius);
 color: var(--jp-ui-font-color1);
 font-size: var(--jp-ui-font-size1);
 white-space: pre-wrap;
 word-wrap: break-word;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/**
 * google-material-color v1.2.6
 * https://github.com/danlevan/google-material-color
 */
:root {
 --md-red-50: #ffebee;
 --md-red-100: #ffcdd2;
 --md-red-200: #ef9a9a;
 --md-red-300: #e57373;
 --md-red-400: #ef5350;
 --md-red-500: #f44336;
 --md-red-600: #e53935;
 --md-red-700: #d32f2f;
 --md-red-800: #c62828;
 --md-red-900: #b71c1c;
 --md-red-A100: #ff8a80;
 --md-red-A200: #ff5252;
 --md-red-A400: #ff1744;
 --md-red-A700: #d50000;
 --md-pink-50: #fce4ec;
 --md-pink-100: #f8bbd0;
 --md-pink-200: #f48fb1;
 --md-pink-300: #f06292;
 --md-pink-400: #ec407a;
 --md-pink-500: #e91e63;
 --md-pink-600: #d81b60;
 --md-pink-700: #c2185b;
 --md-pink-800: #ad1457;
 --md-pink-900: #880e4f;
 --md-pink-A100: #ff80ab;
 --md-pink-A200: #ff4081;
 --md-pink-A400: #f50057;
 --md-pink-A700: #c51162;
 --md-purple-50: #f3e5f5;
 --md-purple-100: #e1bee7;
 --md-purple-200: #ce93d8;
 --md-purple-300: #ba68c8;
 --md-purple-400: #ab47bc;
 --md-purple-500: #9c27b0;
 --md-purple-600: #8e24aa;
 --md-purple-700: #7b1fa2;
 --md-purple-800: #6a1b9a;
 --md-purple-900: #4a148c;
 --md-purple-A100: #ea80fc;
 --md-purple-A200: #e040fb;
 --md-purple-A400: #d500f9;
 --md-purple-A700: #a0f;
 --md-deep-purple-50: #ede7f6;
 --md-deep-purple-100: #d1c4e9;
 --md-deep-purple-200: #b39ddb;
 --md-deep-purple-300: #9575cd;
 --md-deep-purple-400: #7e57c2;
 --md-deep-purple-500: #673ab7;
 --md-deep-purple-600: #5e35b1;
 --md-deep-purple-700: #512da8;
 --md-deep-purple-800: #4527a0;
 --md-deep-purple-900: #311b92;
 --md-deep-purple-A100: #b388ff;
 --md-deep-purple-A200: #7c4dff;
 --md-deep-purple-A400: #651fff;
 --md-deep-purple-A700: #6200ea;
 --md-indigo-50: #e8eaf6;
 --md-indigo-100: #c5cae9;
 --md-indigo-200: #9fa8da;
 --md-indigo-300: #7986cb;
 --md-indigo-400: #5c6bc0;
 --md-indigo-500: #3f51b5;
 --md-indigo-600: #3949ab;
 --md-indigo-700: #303f9f;
 --md-indigo-800: #283593;
 --md-indigo-900: #1a237e;
 --md-indigo-A100: #8c9eff;
 --md-indigo-A200: #536dfe;
 --md-indigo-A400: #3d5afe;
 --md-indigo-A700: #304ffe;
 --md-blue-50: #e3f2fd;
 --md-blue-100: #bbdefb;
 --md-blue-200: #90caf9;
 --md-blue-300: #64b5f6;
 --md-blue-400: #42a5f5;
 --md-blue-500: #2196f3;
 --md-blue-600: #1e88e5;
 --md-blue-700: #1976d2;
 --md-blue-800: #1565c0;
 --md-blue-900: #0d47a1;
 --md-blue-A100: #82b1ff;
 --md-blue-A200: #448aff;
 --md-blue-A400: #2979ff;
 --md-blue-A700: #2962ff;
 --md-light-blue-50: #e1f5fe;
 --md-light-blue-100: #b3e5fc;
 --md-light-blue-200: #81d4fa;
 --md-light-blue-300: #4fc3f7;
 --md-light-blue-400: #29b6f6;
 --md-light-blue-500: #03a9f4;
 --md-light-blue-600: #039be5;
 --md-light-blue-700: #0288d1;
 --md-light-blue-800: #0277bd;
 --md-light-blue-900: #01579b;
 --md-light-blue-A100: #80d8ff;
 --md-light-blue-A200: #40c4ff;
 --md-light-blue-A400: #00b0ff;
 --md-light-blue-A700: #0091ea;
 --md-cyan-50: #e0f7fa;
 --md-cyan-100: #b2ebf2;
 --md-cyan-200: #80deea;
 --md-cyan-300: #4dd0e1;
 --md-cyan-400: #26c6da;
 --md-cyan-500: #00bcd4;
 --md-cyan-600: #00acc1;
 --md-cyan-700: #0097a7;
 --md-cyan-800: #00838f;
 --md-cyan-900: #006064;
 --md-cyan-A100: #84ffff;
 --md-cyan-A200: #18ffff;
 --md-cyan-A400: #00e5ff;
 --md-cyan-A700: #00b8d4;
 --md-teal-50: #e0f2f1;
 --md-teal-100: #b2dfdb;
 --md-teal-200: #80cbc4;
 --md-teal-300: #4db6ac;
 --md-teal-400: #26a69a;
 --md-teal-500: #009688;
 --md-teal-600: #00897b;
 --md-teal-700: #00796b;
 --md-teal-800: #00695c;
 --md-teal-900: #004d40;
 --md-teal-A100: #a7ffeb;
 --md-teal-A200: #64ffda;
 --md-teal-A400: #1de9b6;
 --md-teal-A700: #00bfa5;
 --md-green-50: #e8f5e9;
 --md-green-100: #c8e6c9;
 --md-green-200: #a5d6a7;
 --md-green-300: #81c784;
 --md-green-400: #66bb6a;
 --md-green-500: #4caf50;
 --md-green-600: #43a047;
 --md-green-700: #388e3c;
 --md-green-800: #2e7d32;
 --md-green-900: #1b5e20;
 --md-green-A100: #b9f6ca;
 --md-green-A200: #69f0ae;
 --md-green-A400: #00e676;
 --md-green-A700: #00c853;
 --md-light-green-50: #f1f8e9;
 --md-light-green-100: #dcedc8;
 --md-light-green-200: #c5e1a5;
 --md-light-green-300: #aed581;
 --md-light-green-400: #9ccc65;
 --md-light-green-500: #8bc34a;
 --md-light-green-600: #7cb342;
 --md-light-green-700: #689f38;
 --md-light-green-800: #558b2f;
 --md-light-green-900: #33691e;
 --md-light-green-A100: #ccff90;
 --md-light-green-A200: #b2ff59;
 --md-light-green-A400: #76ff03;
 --md-light-green-A700: #64dd17;
 --md-lime-50: #f9fbe7;
 --md-lime-100: #f0f4c3;
 --md-lime-200: #e6ee9c;
 --md-lime-300: #dce775;
 --md-lime-400: #d4e157;
 --md-lime-500: #cddc39;
 --md-lime-600: #c0ca33;
 --md-lime-700: #afb42b;
 --md-lime-800: #9e9d24;
 --md-lime-900: #827717;
 --md-lime-A100: #f4ff81;
 --md-lime-A200: #eeff41;
 --md-lime-A400: #c6ff00;
 --md-lime-A700: #aeea00;
 --md-yellow-50: #fffde7;
 --md-yellow-100: #fff9c4;
 --md-yellow-200: #fff59d;
 --md-yellow-300: #fff176;
 --md-yellow-400: #ffee58;
 --md-yellow-500: #ffeb3b;
 --md-yellow-600: #fdd835;
 --md-yellow-700: #fbc02d;
 --md-yellow-800: #f9a825;
 --md-yellow-900: #f57f17;
 --md-yellow-A100: #ffff8d;
 --md-yellow-A200: #ff0;
 --md-yellow-A400: #ffea00;
 --md-yellow-A700: #ffd600;
 --md-amber-50: #fff8e1;
 --md-amber-100: #ffecb3;
 --md-amber-200: #ffe082;
 --md-amber-300: #ffd54f;
 --md-amber-400: #ffca28;
 --md-amber-500: #ffc107;
 --md-amber-600: #ffb300;
 --md-amber-700: #ffa000;
 --md-amber-800: #ff8f00;
 --md-amber-900: #ff6f00;
 --md-amber-A100: #ffe57f;
 --md-amber-A200: #ffd740;
 --md-amber-A400: #ffc400;
 --md-amber-A700: #ffab00;
 --md-orange-50: #fff3e0;
 --md-orange-100: #ffe0b2;
 --md-orange-200: #ffcc80;
 --md-orange-300: #ffb74d;
 --md-orange-400: #ffa726;
 --md-orange-500: #ff9800;
 --md-orange-600: #fb8c00;
 --md-orange-700: #f57c00;
 --md-orange-800: #ef6c00;
 --md-orange-900: #e65100;
 --md-orange-A100: #ffd180;
 --md-orange-A200: #ffab40;
 --md-orange-A400: #ff9100;
 --md-orange-A700: #ff6d00;
 --md-deep-orange-50: #fbe9e7;
 --md-deep-orange-100: #ffccbc;
 --md-deep-orange-200: #ffab91;
 --md-deep-orange-300: #ff8a65;
 --md-deep-orange-400: #ff7043;
 --md-deep-orange-500: #ff5722;
 --md-deep-orange-600: #f4511e;
 --md-deep-orange-700: #e64a19;
 --md-deep-orange-800: #d84315;
 --md-deep-orange-900: #bf360c;
 --md-deep-orange-A100: #ff9e80;
 --md-deep-orange-A200: #ff6e40;
 --md-deep-orange-A400: #ff3d00;
 --md-deep-orange-A700: #dd2c00;
 --md-brown-50: #efebe9;
 --md-brown-100: #d7ccc8;
 --md-brown-200: #bcaaa4;
 --md-brown-300: #a1887f;
 --md-brown-400: #8d6e63;
 --md-brown-500: #795548;
 --md-brown-600: #6d4c41;
 --md-brown-700: #5d4037;
 --md-brown-800: #4e342e;
 --md-brown-900: #3e2723;
 --md-grey-50: #fafafa;
 --md-grey-100: #f5f5f5;
 --md-grey-200: #eee;
 --md-grey-300: #e0e0e0;
 --md-grey-400: #bdbdbd;
 --md-grey-500: #9e9e9e;
 --md-grey-600: #757575;
 --md-grey-700: #616161;
 --md-grey-800: #424242;
 --md-grey-900: #212121;
 --md-blue-grey-50: #eceff1;
 --md-blue-grey-100: #cfd8dc;
 --md-blue-grey-200: #b0bec5;
 --md-blue-grey-300: #90a4ae;
 --md-blue-grey-400: #78909c;
 --md-blue-grey-500: #607d8b;
 --md-blue-grey-600: #546e7a;
 --md-blue-grey-700: #455a64;
 --md-blue-grey-800: #37474f;
 --md-blue-grey-900: #263238;
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| RenderedText
|----------------------------------------------------------------------------*/

:root {
 /* This is the padding value to fill the gaps between lines containing spans with background color. */
 --jp-private-code-span-padding: calc(
 (var(--jp-code-line-height) - 1) * var(--jp-code-font-size) / 2
 );
}

.jp-RenderedText {
 text-align: left;
 padding-left: var(--jp-code-padding);
 line-height: var(--jp-code-line-height);
 font-family: var(--jp-code-font-family);
}

.jp-RenderedText pre,
.jp-RenderedJavaScript pre,
.jp-RenderedHTMLCommon pre {
 color: var(--jp-content-font-color1);
 font-size: var(--jp-code-font-size);
 border: none;
 margin: 0;
 padding: 0;
}

.jp-RenderedText pre a:link {
 text-decoration: none;
 color: var(--jp-content-link-color);
}

.jp-RenderedText pre a:hover {
 text-decoration: underline;
 color: var(--jp-content-link-color);
}

.jp-RenderedText pre a:visited {
 text-decoration: none;
 color: var(--jp-content-link-color);
}

/* console foregrounds and backgrounds */
.jp-RenderedText pre .ansi-black-fg {
 color: #3e424d;
}

.jp-RenderedText pre .ansi-red-fg {
 color: #e75c58;
}

.jp-RenderedText pre .ansi-green-fg {
 color: #00a250;
}

.jp-RenderedText pre .ansi-yellow-fg {
 color: #ddb62b;
}

.jp-RenderedText pre .ansi-blue-fg {
 color: #208ffb;
}

.jp-RenderedText pre .ansi-magenta-fg {
 color: #d160c4;
}

.jp-RenderedText pre .ansi-cyan-fg {
 color: #60c6c8;
}

.jp-RenderedText pre .ansi-white-fg {
 color: #c5c1b4;
}

.jp-RenderedText pre .ansi-black-bg {
 background-color: #3e424d;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-red-bg {
 background-color: #e75c58;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-green-bg {
 background-color: #00a250;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-yellow-bg {
 background-color: #ddb62b;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-blue-bg {
 background-color: #208ffb;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-magenta-bg {
 background-color: #d160c4;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-cyan-bg {
 background-color: #60c6c8;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-white-bg {
 background-color: #c5c1b4;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-black-intense-fg {
 color: #282c36;
}

.jp-RenderedText pre .ansi-red-intense-fg {
 color: #b22b31;
}

.jp-RenderedText pre .ansi-green-intense-fg {
 color: #007427;
}

.jp-RenderedText pre .ansi-yellow-intense-fg {
 color: #b27d12;
}

.jp-RenderedText pre .ansi-blue-intense-fg {
 color: #0065ca;
}

.jp-RenderedText pre .ansi-magenta-intense-fg {
 color: #a03196;
}

.jp-RenderedText pre .ansi-cyan-intense-fg {
 color: #258f8f;
}

.jp-RenderedText pre .ansi-white-intense-fg {
 color: #a1a6b2;
}

.jp-RenderedText pre .ansi-black-intense-bg {
 background-color: #282c36;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-red-intense-bg {
 background-color: #b22b31;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-green-intense-bg {
 background-color: #007427;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-yellow-intense-bg {
 background-color: #b27d12;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-blue-intense-bg {
 background-color: #0065ca;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-magenta-intense-bg {
 background-color: #a03196;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-cyan-intense-bg {
 background-color: #258f8f;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-white-intense-bg {
 background-color: #a1a6b2;
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-default-inverse-fg {
 color: var(--jp-ui-inverse-font-color0);
}

.jp-RenderedText pre .ansi-default-inverse-bg {
 background-color: var(--jp-inverse-layout-color0);
 padding: var(--jp-private-code-span-padding) 0;
}

.jp-RenderedText pre .ansi-bold {
 font-weight: bold;
}

.jp-RenderedText pre .ansi-underline {
 text-decoration: underline;
}

.jp-RenderedText[data-mime-type='application/vnd.jupyter.stderr'] {
 background: var(--jp-rendermime-error-background);
 padding-top: var(--jp-code-padding);
}

/*-----------------------------------------------------------------------------
| RenderedLatex
|----------------------------------------------------------------------------*/

.jp-RenderedLatex {
 color: var(--jp-content-font-color1);
 font-size: var(--jp-content-font-size1);
 line-height: var(--jp-content-line-height);
}

/* Left-justify outputs.*/
.jp-OutputArea-output.jp-RenderedLatex {
 padding: var(--jp-code-padding);
 text-align: left;
}

/*-----------------------------------------------------------------------------
| RenderedHTML
|----------------------------------------------------------------------------*/

.jp-RenderedHTMLCommon {
 color: var(--jp-content-font-color1);
 font-family: var(--jp-content-font-family);
 font-size: var(--jp-content-font-size1);
 line-height: var(--jp-content-line-height);

 /* Give a bit more R padding on Markdown text to keep line lengths reasonable */
 padding-right: 20px;
}

.jp-RenderedHTMLCommon em {
 font-style: italic;
}

.jp-RenderedHTMLCommon strong {
 font-weight: bold;
}

.jp-RenderedHTMLCommon u {
 text-decoration: underline;
}

.jp-RenderedHTMLCommon a:link {
 text-decoration: none;
 color: var(--jp-content-link-color);
}

.jp-RenderedHTMLCommon a:hover {
 text-decoration: underline;
 color: var(--jp-content-link-color);
}

.jp-RenderedHTMLCommon a:visited {
 text-decoration: none;
 color: var(--jp-content-link-color);
}

/* Headings */

.jp-RenderedHTMLCommon h1,
.jp-RenderedHTMLCommon h2,
.jp-RenderedHTMLCommon h3,
.jp-RenderedHTMLCommon h4,
.jp-RenderedHTMLCommon h5,
.jp-RenderedHTMLCommon h6 {
 line-height: var(--jp-content-heading-line-height);
 font-weight: var(--jp-content-heading-font-weight);
 font-style: normal;
 margin: var(--jp-content-heading-margin-top) 0
 var(--jp-content-heading-margin-bottom) 0;
}

.jp-RenderedHTMLCommon h1:first-child,
.jp-RenderedHTMLCommon h2:first-child,
.jp-RenderedHTMLCommon h3:first-child,
.jp-RenderedHTMLCommon h4:first-child,
.jp-RenderedHTMLCommon h5:first-child,
.jp-RenderedHTMLCommon h6:first-child {
 margin-top: calc(0.5 * var(--jp-content-heading-margin-top));
}

.jp-RenderedHTMLCommon h1:last-child,
.jp-RenderedHTMLCommon h2:last-child,
.jp-RenderedHTMLCommon h3:last-child,
.jp-RenderedHTMLCommon h4:last-child,
.jp-RenderedHTMLCommon h5:last-child,
.jp-RenderedHTMLCommon h6:last-child {
 margin-bottom: calc(0.5 * var(--jp-content-heading-margin-bottom));
}

.jp-RenderedHTMLCommon h1 {
 font-size: var(--jp-content-font-size5);
}

.jp-RenderedHTMLCommon h2 {
 font-size: var(--jp-content-font-size4);
}

.jp-RenderedHTMLCommon h3 {
 font-size: var(--jp-content-font-size3);
}

.jp-RenderedHTMLCommon h4 {
 font-size: var(--jp-content-font-size2);
}

.jp-RenderedHTMLCommon h5 {
 font-size: var(--jp-content-font-size1);
}

.jp-RenderedHTMLCommon h6 {
 font-size: var(--jp-content-font-size0);
}

/* Lists */

/* stylelint-disable selector-max-type, selector-max-compound-selectors */

.jp-RenderedHTMLCommon ul:not(.list-inline),
.jp-RenderedHTMLCommon ol:not(.list-inline) {
 padding-left: 2em;
}

.jp-RenderedHTMLCommon ul {
 list-style: disc;
}

.jp-RenderedHTMLCommon ul ul {
 list-style: square;
}

.jp-RenderedHTMLCommon ul ul ul {
 list-style: circle;
}

.jp-RenderedHTMLCommon ol {
 list-style: decimal;
}

.jp-RenderedHTMLCommon ol ol {
 list-style: upper-alpha;
}

.jp-RenderedHTMLCommon ol ol ol {
 list-style: lower-alpha;
}

.jp-RenderedHTMLCommon ol ol ol ol {
 list-style: lower-roman;
}

.jp-RenderedHTMLCommon ol ol ol ol ol {
 list-style: decimal;
}

.jp-RenderedHTMLCommon ol,
.jp-RenderedHTMLCommon ul {
 margin-bottom: 1em;
}

.jp-RenderedHTMLCommon ul ul,
.jp-RenderedHTMLCommon ul ol,
.jp-RenderedHTMLCommon ol ul,
.jp-RenderedHTMLCommon ol ol {
 margin-bottom: 0;
}

/* stylelint-enable selector-max-type, selector-max-compound-selectors */

.jp-RenderedHTMLCommon hr {
 color: var(--jp-border-color2);
 background-color: var(--jp-border-color1);
 margin-top: 1em;
 margin-bottom: 1em;
}

.jp-RenderedHTMLCommon &gt; pre {
 margin: 1.5em 2em;
}

.jp-RenderedHTMLCommon pre,
.jp-RenderedHTMLCommon code {
 border: 0;
 background-color: var(--jp-layout-color0);
 color: var(--jp-content-font-color1);
 font-family: var(--jp-code-font-family);
 font-size: inherit;
 line-height: var(--jp-code-line-height);
 padding: 0;
 white-space: pre-wrap;
}

.jp-RenderedHTMLCommon :not(pre) &gt; code {
 background-color: var(--jp-layout-color2);
 padding: 1px 5px;
}

/* Tables */

.jp-RenderedHTMLCommon table {
 border-collapse: collapse;
 border-spacing: 0;
 border: none;
 color: var(--jp-ui-font-color1);
 font-size: var(--jp-ui-font-size1);
 table-layout: fixed;
 margin-left: auto;
 margin-bottom: 1em;
 margin-right: auto;
}

.jp-RenderedHTMLCommon thead {
 border-bottom: var(--jp-border-width) solid var(--jp-border-color1);
 vertical-align: bottom;
}

.jp-RenderedHTMLCommon td,
.jp-RenderedHTMLCommon th,
.jp-RenderedHTMLCommon tr {
 vertical-align: middle;
 padding: 0.5em;
 line-height: normal;
 white-space: normal;
 max-width: none;
 border: none;
}

.jp-RenderedMarkdown.jp-RenderedHTMLCommon td,
.jp-RenderedMarkdown.jp-RenderedHTMLCommon th {
 max-width: none;
}

:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon td,
:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon th,
:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon tr {
 text-align: right;
}

.jp-RenderedHTMLCommon th {
 font-weight: bold;
}

.jp-RenderedHTMLCommon tbody tr:nth-child(odd) {
 background: var(--jp-layout-color0);
}

.jp-RenderedHTMLCommon tbody tr:nth-child(even) {
 background: var(--jp-rendermime-table-row-background);
}

.jp-RenderedHTMLCommon tbody tr:hover {
 background: var(--jp-rendermime-table-row-hover-background);
}

.jp-RenderedHTMLCommon p {
 text-align: left;
 margin: 0;
 margin-bottom: 1em;
}

.jp-RenderedHTMLCommon img {
 -moz-force-broken-image-icon: 1;
}

/* Restrict to direct children as other images could be nested in other content. */
.jp-RenderedHTMLCommon &gt; img {
 display: block;
 margin-left: 0;
 margin-right: 0;
 margin-bottom: 1em;
}

/* Change color behind transparent images if they need it... */
[data-jp-theme-light='false'] .jp-RenderedImage img.jp-needs-light-background {
 background-color: var(--jp-inverse-layout-color1);
}

[data-jp-theme-light='true'] .jp-RenderedImage img.jp-needs-dark-background {
 background-color: var(--jp-inverse-layout-color1);
}

.jp-RenderedHTMLCommon img,
.jp-RenderedImage img,
.jp-RenderedHTMLCommon svg,
.jp-RenderedSVG svg {
 max-width: 100%;
 height: auto;
}

.jp-RenderedHTMLCommon img.jp-mod-unconfined,
.jp-RenderedImage img.jp-mod-unconfined,
.jp-RenderedHTMLCommon svg.jp-mod-unconfined,
.jp-RenderedSVG svg.jp-mod-unconfined {
 max-width: none;
}

.jp-RenderedHTMLCommon .alert {
 padding: var(--jp-notebook-padding);
 border: var(--jp-border-width) solid transparent;
 border-radius: var(--jp-border-radius);
 margin-bottom: 1em;
}

.jp-RenderedHTMLCommon .alert-info {
 color: var(--jp-info-color0);
 background-color: var(--jp-info-color3);
 border-color: var(--jp-info-color2);
}

.jp-RenderedHTMLCommon .alert-info hr {
 border-color: var(--jp-info-color3);
}

.jp-RenderedHTMLCommon .alert-info &gt; p:last-child,
.jp-RenderedHTMLCommon .alert-info &gt; ul:last-child {
 margin-bottom: 0;
}

.jp-RenderedHTMLCommon .alert-warning {
 color: var(--jp-warn-color0);
 background-color: var(--jp-warn-color3);
 border-color: var(--jp-warn-color2);
}

.jp-RenderedHTMLCommon .alert-warning hr {
 border-color: var(--jp-warn-color3);
}

.jp-RenderedHTMLCommon .alert-warning &gt; p:last-child,
.jp-RenderedHTMLCommon .alert-warning &gt; ul:last-child {
 margin-bottom: 0;
}

.jp-RenderedHTMLCommon .alert-success {
 color: var(--jp-success-color0);
 background-color: var(--jp-success-color3);
 border-color: var(--jp-success-color2);
}

.jp-RenderedHTMLCommon .alert-success hr {
 border-color: var(--jp-success-color3);
}

.jp-RenderedHTMLCommon .alert-success &gt; p:last-child,
.jp-RenderedHTMLCommon .alert-success &gt; ul:last-child {
 margin-bottom: 0;
}

.jp-RenderedHTMLCommon .alert-danger {
 color: var(--jp-error-color0);
 background-color: var(--jp-error-color3);
 border-color: var(--jp-error-color2);
}

.jp-RenderedHTMLCommon .alert-danger hr {
 border-color: var(--jp-error-color3);
}

.jp-RenderedHTMLCommon .alert-danger &gt; p:last-child,
.jp-RenderedHTMLCommon .alert-danger &gt; ul:last-child {
 margin-bottom: 0;
}

.jp-RenderedHTMLCommon blockquote {
 margin: 1em 2em;
 padding: 0 1em;
 border-left: 5px solid var(--jp-border-color2);
}

a.jp-InternalAnchorLink {
 visibility: hidden;
 margin-left: 8px;
 color: var(--md-blue-800);
}

h1:hover .jp-InternalAnchorLink,
h2:hover .jp-InternalAnchorLink,
h3:hover .jp-InternalAnchorLink,
h4:hover .jp-InternalAnchorLink,
h5:hover .jp-InternalAnchorLink,
h6:hover .jp-InternalAnchorLink {
 visibility: visible;
}

.jp-RenderedHTMLCommon kbd {
 background-color: var(--jp-rendermime-table-row-background);
 border: 1px solid var(--jp-border-color0);
 border-bottom-color: var(--jp-border-color2);
 border-radius: 3px;
 box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
 display: inline-block;
 font-size: var(--jp-ui-font-size0);
 line-height: 1em;
 padding: 0.2em 0.5em;
}

/* Most direct children of .jp-RenderedHTMLCommon have a margin-bottom of 1.0.
 * At the bottom of cells this is a bit too much as there is also spacing
 * between cells. Going all the way to 0 gets too tight between markdown and
 * code cells.
 */
.jp-RenderedHTMLCommon &gt; *:last-child {
 margin-bottom: 0.5em;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/

.lm-cursor-backdrop {
 position: fixed;
 width: 200px;
 height: 200px;
 margin-top: -100px;
 margin-left: -100px;
 will-change: transform;
 z-index: 100;
}

.lm-mod-drag-image {
 will-change: transform;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

.jp-lineFormSearch {
 padding: 4px 12px;
 background-color: var(--jp-layout-color2);
 box-shadow: var(--jp-toolbar-box-shadow);
 z-index: 2;
 font-size: var(--jp-ui-font-size1);
}

.jp-lineFormCaption {
 font-size: var(--jp-ui-font-size0);
 line-height: var(--jp-ui-font-size1);
 margin-top: 4px;
 color: var(--jp-ui-font-color0);
}

.jp-baseLineForm {
 border: none;
 border-radius: 0;
 position: absolute;
 background-size: 16px;
 background-repeat: no-repeat;
 background-position: center;
 outline: none;
}

.jp-lineFormButtonContainer {
 top: 4px;
 right: 8px;
 height: 24px;
 padding: 0 12px;
 width: 12px;
}

.jp-lineFormButtonIcon {
 top: 0;
 right: 0;
 background-color: var(--jp-brand-color1);
 height: 100%;
 width: 100%;
 box-sizing: border-box;
 padding: 4px 6px;
}

.jp-lineFormButton {
 top: 0;
 right: 0;
 background-color: transparent;
 height: 100%;
 width: 100%;
 box-sizing: border-box;
}

.jp-lineFormWrapper {
 overflow: hidden;
 padding: 0 8px;
 border: 1px solid var(--jp-border-color0);
 background-color: var(--jp-input-active-background);
 height: 22px;
}

.jp-lineFormWrapperFocusWithin {
 border: var(--jp-border-width) solid var(--md-blue-500);
 box-shadow: inset 0 0 4px var(--md-blue-300);
}

.jp-lineFormInput {
 background: transparent;
 width: 200px;
 height: 100%;
 border: none;
 outline: none;
 color: var(--jp-ui-font-color0);
 line-height: 28px;
}

/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-JSONEditor {
 display: flex;
 flex-direction: column;
 width: 100%;
}

.jp-JSONEditor-host {
 flex: 1 1 auto;
 border: var(--jp-border-width) solid var(--jp-input-border-color);
 border-radius: 0;
 background: var(--jp-layout-color0);
 min-height: 50px;
 padding: 1px;
}

.jp-JSONEditor.jp-mod-error .jp-JSONEditor-host {
 border-color: red;
 outline-color: red;
}

.jp-JSONEditor-header {
 display: flex;
 flex: 1 0 auto;
 padding: 0 0 0 12px;
}

.jp-JSONEditor-header label {
 flex: 0 0 auto;
}

.jp-JSONEditor-commitButton {
 height: 16px;
 width: 16px;
 background-size: 18px;
 background-repeat: no-repeat;
 background-position: center;
}

.jp-JSONEditor-host.jp-mod-focused {
 background-color: var(--jp-input-active-background);
 border: 1px solid var(--jp-input-active-border-color);
 box-shadow: var(--jp-input-box-shadow);
}

.jp-Editor.jp-mod-dropTarget {
 border: var(--jp-border-width) solid var(--jp-input-active-border-color);
 box-shadow: var(--jp-input-box-shadow);
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-DocumentSearch-input {
 border: none;
 outline: none;
 color: var(--jp-ui-font-color0);
 font-size: var(--jp-ui-font-size1);
 background-color: var(--jp-layout-color0);
 font-family: var(--jp-ui-font-family);
 padding: 2px 1px;
 resize: none;
}

.jp-DocumentSearch-overlay {
 position: absolute;
 background-color: var(--jp-toolbar-background);
 border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
 border-left: var(--jp-border-width) solid var(--jp-toolbar-border-color);
 top: 0;
 right: 0;
 z-index: 7;
 min-width: 405px;
 padding: 2px;
 font-size: var(--jp-ui-font-size1);

 --jp-private-document-search-button-height: 20px;
}

.jp-DocumentSearch-overlay button {
 background-color: var(--jp-toolbar-background);
 outline: 0;
}

.jp-DocumentSearch-overlay button:hover {
 background-color: var(--jp-layout-color2);
}

.jp-DocumentSearch-overlay button:active {
 background-color: var(--jp-layout-color3);
}

.jp-DocumentSearch-overlay-row {
 display: flex;
 align-items: center;
 margin-bottom: 2px;
}

.jp-DocumentSearch-button-content {
 display: inline-block;
 cursor: pointer;
 box-sizing: border-box;
 width: 100%;
 height: 100%;
}

.jp-DocumentSearch-button-content svg {
 width: 100%;
 height: 100%;
}

.jp-DocumentSearch-input-wrapper {
 border: var(--jp-border-width) solid var(--jp-border-color0);
 display: flex;
 background-color: var(--jp-layout-color0);
 margin: 2px;
}

.jp-DocumentSearch-input-wrapper:focus-within {
 border-color: var(--jp-cell-editor-active-border-color);
}

.jp-DocumentSearch-toggle-wrapper,
.jp-DocumentSearch-button-wrapper {
 all: initial;
 overflow: hidden;
 display: inline-block;
 border: none;
 box-sizing: border-box;
}

.jp-DocumentSearch-toggle-wrapper {
 width: 14px;
 height: 14px;
}

.jp-DocumentSearch-button-wrapper {
 width: var(--jp-private-document-search-button-height);
 height: var(--jp-private-document-search-button-height);
}

.jp-DocumentSearch-toggle-wrapper:focus,
.jp-DocumentSearch-button-wrapper:focus {
 outline: var(--jp-border-width) solid
 var(--jp-cell-editor-active-border-color);
 outline-offset: -1px;
}

.jp-DocumentSearch-toggle-wrapper,
.jp-DocumentSearch-button-wrapper,
.jp-DocumentSearch-button-content:focus {
 outline: none;
}

.jp-DocumentSearch-toggle-placeholder {
 width: 5px;
}

.jp-DocumentSearch-input-button::before {
 display: block;
 padding-top: 100%;
}

.jp-DocumentSearch-input-button-off {
 opacity: var(--jp-search-toggle-off-opacity);
}

.jp-DocumentSearch-input-button-off:hover {
 opacity: var(--jp-search-toggle-hover-opacity);
}

.jp-DocumentSearch-input-button-on {
 opacity: var(--jp-search-toggle-on-opacity);
}

.jp-DocumentSearch-index-counter {
 padding-left: 10px;
 padding-right: 10px;
 user-select: none;
 min-width: 35px;
 display: inline-block;
}

.jp-DocumentSearch-up-down-wrapper {
 display: inline-block;
 padding-right: 2px;
 margin-left: auto;
 white-space: nowrap;
}

.jp-DocumentSearch-spacer {
 margin-left: auto;
}

.jp-DocumentSearch-up-down-wrapper button {
 outline: 0;
 border: none;
 width: var(--jp-private-document-search-button-height);
 height: var(--jp-private-document-search-button-height);
 vertical-align: middle;
 margin: 1px 5px 2px;
}

.jp-DocumentSearch-up-down-button:hover {
 background-color: var(--jp-layout-color2);
}

.jp-DocumentSearch-up-down-button:active {
 background-color: var(--jp-layout-color3);
}

.jp-DocumentSearch-filter-button {
 border-radius: var(--jp-border-radius);
}

.jp-DocumentSearch-filter-button:hover {
 background-color: var(--jp-layout-color2);
}

.jp-DocumentSearch-filter-button-enabled {
 background-color: var(--jp-layout-color2);
}

.jp-DocumentSearch-filter-button-enabled:hover {
 background-color: var(--jp-layout-color3);
}

.jp-DocumentSearch-search-options {
 padding: 0 8px;
 margin-left: 3px;
 width: 100%;
 display: grid;
 justify-content: start;
 grid-template-columns: 1fr 1fr;
 align-items: center;
 justify-items: stretch;
}

.jp-DocumentSearch-search-filter-disabled {
 color: var(--jp-ui-font-color2);
}

.jp-DocumentSearch-search-filter {
 display: flex;
 align-items: center;
 user-select: none;
}

.jp-DocumentSearch-regex-error {
 color: var(--jp-error-color0);
}

.jp-DocumentSearch-replace-button-wrapper {
 overflow: hidden;
 display: inline-block;
 box-sizing: border-box;
 border: var(--jp-border-width) solid var(--jp-border-color0);
 margin: auto 2px;
 padding: 1px 4px;
 height: calc(var(--jp-private-document-search-button-height) + 2px);
}

.jp-DocumentSearch-replace-button-wrapper:focus {
 border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color);
}

.jp-DocumentSearch-replace-button {
 display: inline-block;
 text-align: center;
 cursor: pointer;
 box-sizing: border-box;
 color: var(--jp-ui-font-color1);

 /* height - 2 * (padding of wrapper) */
 line-height: calc(var(--jp-private-document-search-button-height) - 2px);
 width: 100%;
 height: 100%;
}

.jp-DocumentSearch-replace-button:focus {
 outline: none;
}

.jp-DocumentSearch-replace-wrapper-class {
 margin-left: 14px;
 display: flex;
}

.jp-DocumentSearch-replace-toggle {
 border: none;
 background-color: var(--jp-toolbar-background);
 border-radius: var(--jp-border-radius);
}

.jp-DocumentSearch-replace-toggle:hover {
 background-color: var(--jp-layout-color2);
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.cm-editor {
 line-height: var(--jp-code-line-height);
 font-size: var(--jp-code-font-size);
 font-family: var(--jp-code-font-family);
 border: 0;
 border-radius: 0;
 height: auto;

 /* Changed to auto to autogrow */
}

.cm-editor pre {
 padding: 0 var(--jp-code-padding);
}

.jp-CodeMirrorEditor[data-type='inline'] .cm-dialog {
 background-color: var(--jp-layout-color0);
 color: var(--jp-content-font-color1);
}

.jp-CodeMirrorEditor {
 cursor: text;
}

/* When zoomed out 67% and 33% on a screen of 1440 width x 900 height */
@media screen and (min-width: 2138px) and (max-width: 4319px) {
 .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor {
 border-left: var(--jp-code-cursor-width1) solid
 var(--jp-editor-cursor-color);
 }
}

/* When zoomed out less than 33% */
@media screen and (min-width: 4320px) {
 .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor {
 border-left: var(--jp-code-cursor-width2) solid
 var(--jp-editor-cursor-color);
 }
}

.cm-editor.jp-mod-readOnly .cm-cursor {
 display: none;
}

.jp-CollaboratorCursor {
 border-left: 5px solid transparent;
 border-right: 5px solid transparent;
 border-top: none;
 border-bottom: 3px solid;
 background-clip: content-box;
 margin-left: -5px;
 margin-right: -5px;
}

.cm-searching,
.cm-searching span {
 /* `.cm-searching span`: we need to override syntax highlighting */
 background-color: var(--jp-search-unselected-match-background-color);
 color: var(--jp-search-unselected-match-color);
}

.cm-searching::selection,
.cm-searching span::selection {
 background-color: var(--jp-search-unselected-match-background-color);
 color: var(--jp-search-unselected-match-color);
}

.jp-current-match &gt; .cm-searching,
.jp-current-match &gt; .cm-searching span,
.cm-searching &gt; .jp-current-match,
.cm-searching &gt; .jp-current-match span {
 background-color: var(--jp-search-selected-match-background-color);
 color: var(--jp-search-selected-match-color);
}

.jp-current-match &gt; .cm-searching::selection,
.cm-searching &gt; .jp-current-match::selection,
.jp-current-match &gt; .cm-searching span::selection {
 background-color: var(--jp-search-selected-match-background-color);
 color: var(--jp-search-selected-match-color);
}

.cm-trailingspace {
 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAsElEQVQIHQGlAFr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+r3zKmT0/+pk9P/7+r3zAAAAAAAAAAABAAAAAAAAAAA6OPzM+/q9wAAAAAA6OPzMwAAAAAAAAAAAgAAAAAAAAAAGR8NiRQaCgAZIA0AGR8NiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQyoYJ/SY80UAAAAASUVORK5CYII=);
 background-position: center left;
 background-repeat: repeat-x;
}

.jp-CollaboratorCursor-hover {
 position: absolute;
 z-index: 1;
 transform: translateX(-50%);
 color: white;
 border-radius: 3px;
 padding-left: 4px;
 padding-right: 4px;
 padding-top: 1px;
 padding-bottom: 1px;
 text-align: center;
 font-size: var(--jp-ui-font-size1);
 white-space: nowrap;
}

.jp-CodeMirror-ruler {
 border-left: 1px dashed var(--jp-border-color2);
}

/* Styles for shared cursors (remote cursor locations and selected ranges) */
.jp-CodeMirrorEditor .cm-ySelectionCaret {
 position: relative;
 border-left: 1px solid black;
 margin-left: -1px;
 margin-right: -1px;
 box-sizing: border-box;
}

.jp-CodeMirrorEditor .cm-ySelectionCaret &gt; .cm-ySelectionInfo {
 white-space: nowrap;
 position: absolute;
 top: -1.15em;
 padding-bottom: 0.05em;
 left: -1px;
 font-size: 0.95em;
 font-family: var(--jp-ui-font-family);
 font-weight: bold;
 line-height: normal;
 user-select: none;
 color: white;
 padding-left: 2px;
 padding-right: 2px;
 z-index: 101;
 transition: opacity 0.3s ease-in-out;
}

.jp-CodeMirrorEditor .cm-ySelectionInfo {
 transition-delay: 0.7s;
 opacity: 0;
}

.jp-CodeMirrorEditor .cm-ySelectionCaret:hover &gt; .cm-ySelectionInfo {
 opacity: 1;
 transition-delay: 0s;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-MimeDocument {
 outline: none;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/

:root {
 --jp-private-filebrowser-button-height: 28px;
 --jp-private-filebrowser-button-width: 48px;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-FileBrowser .jp-SidePanel-content {
 display: flex;
 flex-direction: column;
}

.jp-FileBrowser-toolbar.jp-Toolbar {
 flex-wrap: wrap;
 row-gap: 12px;
 border-bottom: none;
 height: auto;
 margin: 8px 12px 0;
 box-shadow: none;
 padding: 0;
 justify-content: flex-start;
}

.jp-FileBrowser-Panel {
 flex: 1 1 auto;
 display: flex;
 flex-direction: column;
}

.jp-BreadCrumbs {
 flex: 0 0 auto;
 margin: 8px 12px;
}

.jp-BreadCrumbs-item {
 margin: 0 2px;
 padding: 0 2px;
 border-radius: var(--jp-border-radius);
 cursor: pointer;
}

.jp-BreadCrumbs-item:hover {
 background-color: var(--jp-layout-color2);
}

.jp-BreadCrumbs-item:first-child {
 margin-left: 0;
}

.jp-BreadCrumbs-item.jp-mod-dropTarget {
 background-color: var(--jp-brand-color2);
 opacity: 0.7;
}

/*-----------------------------------------------------------------------------
| Buttons
|----------------------------------------------------------------------------*/

.jp-FileBrowser-toolbar &gt; .jp-Toolbar-item {
 flex: 0 0 auto;
 padding-left: 0;
 padding-right: 2px;
 align-items: center;
 height: unset;
}

.jp-FileBrowser-toolbar &gt; .jp-Toolbar-item .jp-ToolbarButtonComponent {
 width: 40px;
}

/*-----------------------------------------------------------------------------
| Other styles
|----------------------------------------------------------------------------*/

.jp-FileDialog.jp-mod-conflict input {
 color: var(--jp-error-color1);
}

.jp-FileDialog .jp-new-name-title {
 margin-top: 12px;
}

.jp-LastModified-hidden {
 display: none;
}

.jp-FileSize-hidden {
 display: none;
}

.jp-FileBrowser .lm-AccordionPanel &gt; h3:first-child {
 display: none;
}

/*-----------------------------------------------------------------------------
| DirListing
|----------------------------------------------------------------------------*/

.jp-DirListing {
 flex: 1 1 auto;
 display: flex;
 flex-direction: column;
 outline: 0;
}

.jp-DirListing-header {
 flex: 0 0 auto;
 display: flex;
 flex-direction: row;
 align-items: center;
 overflow: hidden;
 border-top: var(--jp-border-width) solid var(--jp-border-color2);
 border-bottom: var(--jp-border-width) solid var(--jp-border-color1);
 box-shadow: var(--jp-toolbar-box-shadow);
 z-index: 2;
}

.jp-DirListing-headerItem {
 padding: 4px 12px 2px;
 font-weight: 500;
}

.jp-DirListing-headerItem:hover {
 background: var(--jp-layout-color2);
}

.jp-DirListing-headerItem.jp-id-name {
 flex: 1 0 84px;
}

.jp-DirListing-headerItem.jp-id-modified {
 flex: 0 0 112px;
 border-left: var(--jp-border-width) solid var(--jp-border-color2);
 text-align: right;
}

.jp-DirListing-headerItem.jp-id-filesize {
 flex: 0 0 75px;
 border-left: var(--jp-border-width) solid var(--jp-border-color2);
 text-align: right;
}

.jp-id-narrow {
 display: none;
 flex: 0 0 5px;
 padding: 4px;
 border-left: var(--jp-border-width) solid var(--jp-border-color2);
 text-align: right;
 color: var(--jp-border-color2);
}

.jp-DirListing-narrow .jp-id-narrow {
 display: block;
}

.jp-DirListing-narrow .jp-id-modified,
.jp-DirListing-narrow .jp-DirListing-itemModified {
 display: none;
}

.jp-DirListing-headerItem.jp-mod-selected {
 font-weight: 600;
}

/* increase specificity to override bundled default */
.jp-DirListing-content {
 flex: 1 1 auto;
 margin: 0;
 padding: 0;
 list-style-type: none;
 overflow: auto;
 background-color: var(--jp-layout-color1);
}

.jp-DirListing-content mark {
 color: var(--jp-ui-font-color0);
 background-color: transparent;
 font-weight: bold;
}

.jp-DirListing-content .jp-DirListing-item.jp-mod-selected mark {
 color: var(--jp-ui-inverse-font-color0);
}

/* Style the directory listing content when a user drops a file to upload */
.jp-DirListing.jp-mod-native-drop .jp-DirListing-content {
 outline: 5px dashed rgba(128, 128, 128, 0.5);
 outline-offset: -10px;
 cursor: copy;
}

.jp-DirListing-item {
 display: flex;
 flex-direction: row;
 align-items: center;
 padding: 4px 12px;
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.jp-DirListing-checkboxWrapper {
 /* Increases hit area of checkbox. */
 padding: 4px;
}

.jp-DirListing-header
 .jp-DirListing-checkboxWrapper
 + .jp-DirListing-headerItem {
 padding-left: 4px;
}

.jp-DirListing-content .jp-DirListing-checkboxWrapper {
 position: relative;
 left: -4px;
 margin: -4px 0 -4px -8px;
}

.jp-DirListing-checkboxWrapper.jp-mod-visible {
 visibility: visible;
}

/* For devices that support hovering, hide checkboxes until hovered, selected...
*/
@media (hover: hover) {
 .jp-DirListing-checkboxWrapper {
 visibility: hidden;
 }

 .jp-DirListing-item:hover .jp-DirListing-checkboxWrapper,
 .jp-DirListing-item.jp-mod-selected .jp-DirListing-checkboxWrapper {
 visibility: visible;
 }
}

.jp-DirListing-item[data-is-dot] {
 opacity: 75%;
}

.jp-DirListing-item.jp-mod-selected {
 color: var(--jp-ui-inverse-font-color1);
 background: var(--jp-brand-color1);
}

.jp-DirListing-item.jp-mod-dropTarget {
 background: var(--jp-brand-color3);
}

.jp-DirListing-item:hover:not(.jp-mod-selected) {
 background: var(--jp-layout-color2);
}

.jp-DirListing-itemIcon {
 flex: 0 0 20px;
 margin-right: 4px;
}

.jp-DirListing-itemText {
 flex: 1 0 64px;
 white-space: nowrap;
 overflow: hidden;
 text-overflow: ellipsis;
 user-select: none;
}

.jp-DirListing-itemText:focus {
 outline-width: 2px;
 outline-color: var(--jp-inverse-layout-color1);
 outline-style: solid;
 outline-offset: 1px;
}

.jp-DirListing-item.jp-mod-selected .jp-DirListing-itemText:focus {
 outline-color: var(--jp-layout-color1);
}

.jp-DirListing-itemModified {
 flex: 0 0 125px;
 text-align: right;
}

.jp-DirListing-itemFileSize {
 flex: 0 0 90px;
 text-align: right;
}

.jp-DirListing-editor {
 flex: 1 0 64px;
 outline: none;
 border: none;
 color: var(--jp-ui-font-color1);
 background-color: var(--jp-layout-color1);
}

.jp-DirListing-item.jp-mod-running .jp-DirListing-itemIcon::before {
 color: var(--jp-success-color1);
 content: '\25CF';
 font-size: 8px;
 position: absolute;
 left: -8px;
}

.jp-DirListing-item.jp-mod-running.jp-mod-selected
 .jp-DirListing-itemIcon::before {
 color: var(--jp-ui-inverse-font-color1);
}

.jp-DirListing-item.lm-mod-drag-image,
.jp-DirListing-item.jp-mod-selected.lm-mod-drag-image {
 font-size: var(--jp-ui-font-size1);
 padding-left: 4px;
 margin-left: 4px;
 width: 160px;
 background-color: var(--jp-ui-inverse-font-color2);
 box-shadow: var(--jp-elevation-z2);
 border-radius: 0;
 color: var(--jp-ui-font-color1);
 transform: translateX(-40%) translateY(-58%);
}

.jp-Document {
 min-width: 120px;
 min-height: 120px;
 outline: none;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Main OutputArea
| OutputArea has a list of Outputs
|----------------------------------------------------------------------------*/

.jp-OutputArea {
 overflow-y: auto;
}

.jp-OutputArea-child {
 display: table;
 table-layout: fixed;
 width: 100%;
 overflow: hidden;
}

.jp-OutputPrompt {
 width: var(--jp-cell-prompt-width);
 color: var(--jp-cell-outprompt-font-color);
 font-family: var(--jp-cell-prompt-font-family);
 padding: var(--jp-code-padding);
 letter-spacing: var(--jp-cell-prompt-letter-spacing);
 line-height: var(--jp-code-line-height);
 font-size: var(--jp-code-font-size);
 border: var(--jp-border-width) solid transparent;
 opacity: var(--jp-cell-prompt-opacity);

 /* Right align prompt text, don't wrap to handle large prompt numbers */
 text-align: right;
 white-space: nowrap;
 overflow: hidden;
 text-overflow: ellipsis;

 /* Disable text selection */
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.jp-OutputArea-prompt {
 display: table-cell;
 vertical-align: top;
}

.jp-OutputArea-output {
 display: table-cell;
 width: 100%;
 height: auto;
 overflow: auto;
 user-select: text;
 -moz-user-select: text;
 -webkit-user-select: text;
 -ms-user-select: text;
}

.jp-OutputArea .jp-RenderedText {
 padding-left: 1ch;
}

/**
 * Prompt overlay.
 */

.jp-OutputArea-promptOverlay {
 position: absolute;
 top: 0;
 width: var(--jp-cell-prompt-width);
 height: 100%;
 opacity: 0.5;
}

.jp-OutputArea-promptOverlay:hover {
 background: var(--jp-layout-color2);
 box-shadow: inset 0 0 1px var(--jp-inverse-layout-color0);
 cursor: zoom-out;
}

.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay:hover {
 cursor: zoom-in;
}

/**
 * Isolated output.
 */
.jp-OutputArea-output.jp-mod-isolated {
 width: 100%;
 display: block;
}

/*
When drag events occur, `lm-mod-override-cursor` is added to the body.
Because iframes steal all cursor events, the following two rules are necessary
to suppress pointer events while resize drags are occurring. There may be a
better solution to this problem.
*/
body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated {
 position: relative;
}

body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated::before {
 content: '';
 position: absolute;
 top: 0;
 left: 0;
 right: 0;
 bottom: 0;
 background: transparent;
}

/* pre */

.jp-OutputArea-output pre {
 border: none;
 margin: 0;
 padding: 0;
 overflow-x: auto;
 overflow-y: auto;
 word-break: break-all;
 word-wrap: break-word;
 white-space: pre-wrap;
}

/* tables */

.jp-OutputArea-output.jp-RenderedHTMLCommon table {
 margin-left: 0;
 margin-right: 0;
}

/* description lists */

.jp-OutputArea-output dl,
.jp-OutputArea-output dt,
.jp-OutputArea-output dd {
 display: block;
}

.jp-OutputArea-output dl {
 width: 100%;
 overflow: hidden;
 padding: 0;
 margin: 0;
}

.jp-OutputArea-output dt {
 font-weight: bold;
 float: left;
 width: 20%;
 padding: 0;
 margin: 0;
}

.jp-OutputArea-output dd {
 float: left;
 width: 80%;
 padding: 0;
 margin: 0;
}

.jp-TrimmedOutputs pre {
 background: var(--jp-layout-color3);
 font-size: calc(var(--jp-code-font-size) * 1.4);
 text-align: center;
 text-transform: uppercase;
}

/* Hide the gutter in case of
 * - nested output areas (e.g. in the case of output widgets)
 * - mirrored output areas
 */
.jp-OutputArea .jp-OutputArea .jp-OutputArea-prompt {
 display: none;
}

/* Hide empty lines in the output area, for instance due to cleared widgets */
.jp-OutputArea-prompt:empty {
 padding: 0;
 border: 0;
}

/*-----------------------------------------------------------------------------
| executeResult is added to any Output-result for the display of the object
| returned by a cell
|----------------------------------------------------------------------------*/

.jp-OutputArea-output.jp-OutputArea-executeResult {
 margin-left: 0;
 width: 100%;
}

/* Text output with the Out[] prompt needs a top padding to match the
 * alignment of the Out[] prompt itself.
 */
.jp-OutputArea-executeResult .jp-RenderedText.jp-OutputArea-output {
 padding-top: var(--jp-code-padding);
 border-top: var(--jp-border-width) solid transparent;
}

/*-----------------------------------------------------------------------------
| The Stdin output
|----------------------------------------------------------------------------*/

.jp-Stdin-prompt {
 color: var(--jp-content-font-color0);
 padding-right: var(--jp-code-padding);
 vertical-align: baseline;
 flex: 0 0 auto;
}

.jp-Stdin-input {
 font-family: var(--jp-code-font-family);
 font-size: inherit;
 color: inherit;
 background-color: inherit;
 width: 42%;
 min-width: 200px;

 /* make sure input baseline aligns with prompt */
 vertical-align: baseline;

 /* padding + margin = 0.5em between prompt and cursor */
 padding: 0 0.25em;
 margin: 0 0.25em;
 flex: 0 0 70%;
}

.jp-Stdin-input::placeholder {
 opacity: 0;
}

.jp-Stdin-input:focus {
 box-shadow: none;
}

.jp-Stdin-input:focus::placeholder {
 opacity: 1;
}

/*-----------------------------------------------------------------------------
| Output Area View
|----------------------------------------------------------------------------*/

.jp-LinkedOutputView .jp-OutputArea {
 height: 100%;
 display: block;
}

.jp-LinkedOutputView .jp-OutputArea-output:only-child {
 height: 100%;
}

/*-----------------------------------------------------------------------------
| Printing
|----------------------------------------------------------------------------*/

@media print {
 .jp-OutputArea-child {
 break-inside: avoid-page;
 }
}

/*-----------------------------------------------------------------------------
| Mobile
|----------------------------------------------------------------------------*/
@media only screen and (max-width: 760px) {
 .jp-OutputPrompt {
 display: table-row;
 text-align: left;
 }

 .jp-OutputArea-child .jp-OutputArea-output {
 display: table-row;
 margin-left: var(--jp-notebook-padding);
 }
}

/* Trimmed outputs warning */
.jp-TrimmedOutputs &gt; a {
 margin: 10px;
 text-decoration: none;
 cursor: pointer;
}

.jp-TrimmedOutputs &gt; a:hover {
 text-decoration: none;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Table of Contents
|----------------------------------------------------------------------------*/

:root {
 --jp-private-toc-active-width: 4px;
}

.jp-TableOfContents {
 display: flex;
 flex-direction: column;
 background: var(--jp-layout-color1);
 color: var(--jp-ui-font-color1);
 font-size: var(--jp-ui-font-size1);
 height: 100%;
}

.jp-TableOfContents-placeholder {
 text-align: center;
}

.jp-TableOfContents-placeholderContent {
 color: var(--jp-content-font-color2);
 padding: 8px;
}

.jp-TableOfContents-placeholderContent &gt; h3 {
 margin-bottom: var(--jp-content-heading-margin-bottom);
}

.jp-TableOfContents .jp-SidePanel-content {
 overflow-y: auto;
}

.jp-TableOfContents-tree {
 margin: 4px;
}

.jp-TableOfContents ol {
 list-style-type: none;
}

/* stylelint-disable-next-line selector-max-type */
.jp-TableOfContents li &gt; ol {
 /* Align left border with triangle icon center */
 padding-left: 11px;
}

.jp-TableOfContents-content {
 /* left margin for the active heading indicator */
 margin: 0 0 0 var(--jp-private-toc-active-width);
 padding: 0;
 background-color: var(--jp-layout-color1);
}

.jp-tocItem {
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

.jp-tocItem-heading {
 display: flex;
 cursor: pointer;
}

.jp-tocItem-heading:hover {
 background-color: var(--jp-layout-color2);
}

.jp-tocItem-content {
 display: block;
 padding: 4px 0;
 white-space: nowrap;
 text-overflow: ellipsis;
 overflow-x: hidden;
}

.jp-tocItem-collapser {
 height: 20px;
 margin: 2px 2px 0;
 padding: 0;
 background: none;
 border: none;
 cursor: pointer;
}

.jp-tocItem-collapser:hover {
 background-color: var(--jp-layout-color3);
}

/* Active heading indicator */

.jp-tocItem-heading::before {
 content: ' ';
 background: transparent;
 width: var(--jp-private-toc-active-width);
 height: 24px;
 position: absolute;
 left: 0;
 border-radius: var(--jp-border-radius);
}

.jp-tocItem-heading.jp-tocItem-active::before {
 background-color: var(--jp-brand-color1);
}

.jp-tocItem-heading:hover.jp-tocItem-active::before {
 background: var(--jp-brand-color0);
 opacity: 1;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

.jp-Collapser {
 flex: 0 0 var(--jp-cell-collapser-width);
 padding: 0;
 margin: 0;
 border: none;
 outline: none;
 background: transparent;
 border-radius: var(--jp-border-radius);
 opacity: 1;
}

.jp-Collapser-child {
 display: block;
 width: 100%;
 box-sizing: border-box;

 /* height: 100% doesn't work because the height of its parent is computed from content */
 position: absolute;
 top: 0;
 bottom: 0;
}

/*-----------------------------------------------------------------------------
| Printing
|----------------------------------------------------------------------------*/

/*
Hiding collapsers in print mode.

Note: input and output wrappers have "display: block" propery in print mode.
*/

@media print {
 .jp-Collapser {
 display: none;
 }
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Header/Footer
|----------------------------------------------------------------------------*/

/* Hidden by zero height by default */
.jp-CellHeader,
.jp-CellFooter {
 height: 0;
 width: 100%;
 padding: 0;
 margin: 0;
 border: none;
 outline: none;
 background: transparent;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Input
|----------------------------------------------------------------------------*/

/* All input areas */
.jp-InputArea {
 display: table;
 table-layout: fixed;
 width: 100%;
 overflow: hidden;
}

.jp-InputArea-editor {
 display: table-cell;
 overflow: hidden;
 vertical-align: top;

 /* This is the non-active, default styling */
 border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
 border-radius: 0;
 background: var(--jp-cell-editor-background);
}

.jp-InputPrompt {
 display: table-cell;
 vertical-align: top;
 width: var(--jp-cell-prompt-width);
 color: var(--jp-cell-inprompt-font-color);
 font-family: var(--jp-cell-prompt-font-family);
 padding: var(--jp-code-padding);
 letter-spacing: var(--jp-cell-prompt-letter-spacing);
 opacity: var(--jp-cell-prompt-opacity);
 line-height: var(--jp-code-line-height);
 font-size: var(--jp-code-font-size);
 border: var(--jp-border-width) solid transparent;

 /* Right align prompt text, don't wrap to handle large prompt numbers */
 text-align: right;
 white-space: nowrap;
 overflow: hidden;
 text-overflow: ellipsis;

 /* Disable text selection */
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

/*-----------------------------------------------------------------------------
| Mobile
|----------------------------------------------------------------------------*/
@media only screen and (max-width: 760px) {
 .jp-InputArea-editor {
 display: table-row;
 margin-left: var(--jp-notebook-padding);
 }

 .jp-InputPrompt {
 display: table-row;
 text-align: left;
 }
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Placeholder
|----------------------------------------------------------------------------*/

.jp-Placeholder {
 display: table;
 table-layout: fixed;
 width: 100%;
}

.jp-Placeholder-prompt {
 display: table-cell;
 box-sizing: border-box;
}

.jp-Placeholder-content {
 display: table-cell;
 padding: 4px 6px;
 border: 1px solid transparent;
 border-radius: 0;
 background: none;
 box-sizing: border-box;
 cursor: pointer;
}

.jp-Placeholder-contentContainer {
 display: flex;
}

.jp-Placeholder-content:hover,
.jp-InputPlaceholder &gt; .jp-Placeholder-content:hover {
 border-color: var(--jp-layout-color3);
}

.jp-Placeholder-content .jp-MoreHorizIcon {
 width: 32px;
 height: 16px;
 border: 1px solid transparent;
 border-radius: var(--jp-border-radius);
}

.jp-Placeholder-content .jp-MoreHorizIcon:hover {
 border: 1px solid var(--jp-border-color1);
 box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.25);
 background-color: var(--jp-layout-color0);
}

.jp-PlaceholderText {
 white-space: nowrap;
 overflow-x: hidden;
 color: var(--jp-inverse-layout-color3);
 font-family: var(--jp-code-font-family);
}

.jp-InputPlaceholder &gt; .jp-Placeholder-content {
 border-color: var(--jp-cell-editor-border-color);
 background: var(--jp-cell-editor-background);
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Private CSS variables
|----------------------------------------------------------------------------*/

:root {
 --jp-private-cell-scrolling-output-offset: 5px;
}

/*-----------------------------------------------------------------------------
| Cell
|----------------------------------------------------------------------------*/

.jp-Cell {
 padding: var(--jp-cell-padding);
 margin: 0;
 border: none;
 outline: none;
 background: transparent;
}

/*-----------------------------------------------------------------------------
| Common input/output
|----------------------------------------------------------------------------*/

.jp-Cell-inputWrapper,
.jp-Cell-outputWrapper {
 display: flex;
 flex-direction: row;
 padding: 0;
 margin: 0;

 /* Added to reveal the box-shadow on the input and output collapsers. */
 overflow: visible;
}

/* Only input/output areas inside cells */
.jp-Cell-inputArea,
.jp-Cell-outputArea {
 flex: 1 1 auto;
}

/*-----------------------------------------------------------------------------
| Collapser
|----------------------------------------------------------------------------*/

/* Make the output collapser disappear when there is not output, but do so
 * in a manner that leaves it in the layout and preserves its width.
 */
.jp-Cell.jp-mod-noOutputs .jp-Cell-outputCollapser {
 border: none !important;
 background: transparent !important;
}

.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputCollapser {
 min-height: var(--jp-cell-collapser-min-height);
}

/*-----------------------------------------------------------------------------
| Output
|----------------------------------------------------------------------------*/

/* Put a space between input and output when there IS output */
.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputWrapper {
 margin-top: 5px;
}

.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea {
 overflow-y: auto;
 max-height: 24em;
 margin-left: var(--jp-private-cell-scrolling-output-offset);
 resize: vertical;
}

.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea[style*='height'] {
 max-height: unset;
}

.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea::after {
 content: ' ';
 box-shadow: inset 0 0 6px 2px rgb(0 0 0 / 30%);
 width: 100%;
 height: 100%;
 position: sticky;
 bottom: 0;
 top: 0;
 margin-top: -50%;
 float: left;
 display: block;
 pointer-events: none;
}

.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-child {
 padding-top: 6px;
}

.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-prompt {
 width: calc(
 var(--jp-cell-prompt-width) - var(--jp-private-cell-scrolling-output-offset)
 );
}

.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay {
 left: calc(-1 * var(--jp-private-cell-scrolling-output-offset));
}

/*-----------------------------------------------------------------------------
| CodeCell
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| MarkdownCell
|----------------------------------------------------------------------------*/

.jp-MarkdownOutput {
 display: table-cell;
 width: 100%;
 margin-top: 0;
 margin-bottom: 0;
 padding-left: var(--jp-code-padding);
}

.jp-MarkdownOutput.jp-RenderedHTMLCommon {
 overflow: auto;
}

/* collapseHeadingButton (show always if hiddenCellsButton is _not_ shown) */
.jp-collapseHeadingButton {
 display: flex;
 min-height: var(--jp-cell-collapser-min-height);
 font-size: var(--jp-code-font-size);
 position: absolute;
 background-color: transparent;
 background-size: 25px;
 background-repeat: no-repeat;
 background-position-x: center;
 background-position-y: top;
 background-image: var(--jp-icon-caret-down);
 right: 0;
 top: 0;
 bottom: 0;
}

.jp-collapseHeadingButton.jp-mod-collapsed {
 background-image: var(--jp-icon-caret-right);
}

/*
 set the container font size to match that of content
 so that the nested collapse buttons have the right size
*/
.jp-MarkdownCell .jp-InputPrompt {
 font-size: var(--jp-content-font-size1);
}

/*
 Align collapseHeadingButton with cell top header
 The font sizes are identical to the ones in packages/rendermime/style/base.css
*/
.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='1'] {
 font-size: var(--jp-content-font-size5);
 background-position-y: calc(0.3 * var(--jp-content-font-size5));
}

.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='2'] {
 font-size: var(--jp-content-font-size4);
 background-position-y: calc(0.3 * var(--jp-content-font-size4));
}

.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='3'] {
 font-size: var(--jp-content-font-size3);
 background-position-y: calc(0.3 * var(--jp-content-font-size3));
}

.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='4'] {
 font-size: var(--jp-content-font-size2);
 background-position-y: calc(0.3 * var(--jp-content-font-size2));
}

.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='5'] {
 font-size: var(--jp-content-font-size1);
 background-position-y: top;
}

.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='6'] {
 font-size: var(--jp-content-font-size0);
 background-position-y: top;
}

/* collapseHeadingButton (show only on (hover,active) if hiddenCellsButton is shown) */
.jp-Notebook.jp-mod-showHiddenCellsButton .jp-collapseHeadingButton {
 display: none;
}

.jp-Notebook.jp-mod-showHiddenCellsButton
 :is(.jp-MarkdownCell:hover, .jp-mod-active)
 .jp-collapseHeadingButton {
 display: flex;
}

/* showHiddenCellsButton (only show if jp-mod-showHiddenCellsButton is set, which
is a consequence of the showHiddenCellsButton option in Notebook Settings)*/
.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton {
 margin-left: calc(var(--jp-cell-prompt-width) + 2 * var(--jp-code-padding));
 margin-top: var(--jp-code-padding);
 border: 1px solid var(--jp-border-color2);
 background-color: var(--jp-border-color3) !important;
 color: var(--jp-content-font-color0) !important;
 display: flex;
}

.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton:hover {
 background-color: var(--jp-border-color2) !important;
}

.jp-showHiddenCellsButton {
 display: none;
}

/*-----------------------------------------------------------------------------
| Printing
|----------------------------------------------------------------------------*/

/*
Using block instead of flex to allow the use of the break-inside CSS property for
cell outputs.
*/

@media print {
 .jp-Cell-inputWrapper,
 .jp-Cell-outputWrapper {
 display: block;
 }
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/

:root {
 --jp-notebook-toolbar-padding: 2px 5px 2px 2px;
}

/*-----------------------------------------------------------------------------

/*-----------------------------------------------------------------------------
| Styles
|----------------------------------------------------------------------------*/

.jp-NotebookPanel-toolbar {
 padding: var(--jp-notebook-toolbar-padding);

 /* disable paint containment from lumino 2.0 default strict CSS containment */
 contain: style size !important;
}

.jp-Toolbar-item.jp-Notebook-toolbarCellType .jp-select-wrapper.jp-mod-focused {
 border: none;
 box-shadow: none;
}

.jp-Notebook-toolbarCellTypeDropdown select {
 height: 24px;
 font-size: var(--jp-ui-font-size1);
 line-height: 14px;
 border-radius: 0;
 display: block;
}

.jp-Notebook-toolbarCellTypeDropdown span {
 top: 5px !important;
}

.jp-Toolbar-responsive-popup {
 position: absolute;
 height: fit-content;
 display: flex;
 flex-direction: row;
 flex-wrap: wrap;
 justify-content: flex-end;
 border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
 box-shadow: var(--jp-toolbar-box-shadow);
 background: var(--jp-toolbar-background);
 min-height: var(--jp-toolbar-micro-height);
 padding: var(--jp-notebook-toolbar-padding);
 z-index: 1;
 right: 0;
 top: 0;
}

.jp-Toolbar &gt; .jp-Toolbar-responsive-opener {
 margin-left: auto;
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------

/*-----------------------------------------------------------------------------
| Styles
|----------------------------------------------------------------------------*/

.jp-Notebook-ExecutionIndicator {
 position: relative;
 display: inline-block;
 height: 100%;
 z-index: 9997;
}

.jp-Notebook-ExecutionIndicator-tooltip {
 visibility: hidden;
 height: auto;
 width: max-content;
 width: -moz-max-content;
 background-color: var(--jp-layout-color2);
 color: var(--jp-ui-font-color1);
 text-align: justify;
 border-radius: 6px;
 padding: 0 5px;
 position: fixed;
 display: table;
}

.jp-Notebook-ExecutionIndicator-tooltip.up {
 transform: translateX(-50%) translateY(-100%) translateY(-32px);
}

.jp-Notebook-ExecutionIndicator-tooltip.down {
 transform: translateX(calc(-100% + 16px)) translateY(5px);
}

.jp-Notebook-ExecutionIndicator-tooltip.hidden {
 display: none;
}

.jp-Notebook-ExecutionIndicator:hover .jp-Notebook-ExecutionIndicator-tooltip {
 visibility: visible;
}

.jp-Notebook-ExecutionIndicator span {
 font-size: var(--jp-ui-font-size1);
 font-family: var(--jp-ui-font-family);
 color: var(--jp-ui-font-color1);
 line-height: 24px;
 display: block;
}

.jp-Notebook-ExecutionIndicator-progress-bar {
 display: flex;
 justify-content: center;
 height: 100%;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

/*
 * Execution indicator
 */
.jp-tocItem-content::after {
 content: '';

 /* Must be identical to form a circle */
 width: 12px;
 height: 12px;
 background: none;
 border: none;
 position: absolute;
 right: 0;
}

.jp-tocItem-content[data-running='0']::after {
 border-radius: 50%;
 border: var(--jp-border-width) solid var(--jp-inverse-layout-color3);
 background: none;
}

.jp-tocItem-content[data-running='1']::after {
 border-radius: 50%;
 border: var(--jp-border-width) solid var(--jp-inverse-layout-color3);
 background-color: var(--jp-inverse-layout-color3);
}

.jp-tocItem-content[data-running='0'],
.jp-tocItem-content[data-running='1'] {
 margin-right: 12px;
}

/*
 * Copyright (c) Jupyter Development Team.
 * Distributed under the terms of the Modified BSD License.
 */

.jp-Notebook-footer {
 height: 27px;
 margin-left: calc(
 var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) +
 var(--jp-cell-padding)
 );
 width: calc(
 100% -
 (
 var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) +
 var(--jp-cell-padding) + var(--jp-cell-padding)
 )
 );
 border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
 color: var(--jp-ui-font-color3);
 margin-top: 6px;
 background: none;
 cursor: pointer;
}

.jp-Notebook-footer:focus {
 border-color: var(--jp-cell-editor-active-border-color);
}

/* For devices that support hovering, hide footer until hover */
@media (hover: hover) {
 .jp-Notebook-footer {
 opacity: 0;
 }

 .jp-Notebook-footer:focus,
 .jp-Notebook-footer:hover {
 opacity: 1;
 }
}

/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| Imports
|----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
| CSS variables
|----------------------------------------------------------------------------*/

:root {
 --jp-side-by-side-output-size: 1fr;
 --jp-side-by-side-resized-cell: var(--jp-side-by-side-output-size);
 --jp-private-notebook-dragImage-width: 304px;
 --jp-private-notebook-dragImage-height: 36px;
 --jp-private-notebook-selected-color: var(--md-blue-400);
 --jp-private-notebook-active-color: var(--md-green-400);
}

/*-----------------------------------------------------------------------------
| Notebook
|----------------------------------------------------------------------------*/

/* stylelint-disable selector-max-class */

.jp-NotebookPanel {
 display: block;
 height: 100%;
}

.jp-NotebookPanel.jp-Document {
 min-width: 240px;
 min-height: 120px;
}

.jp-Notebook {
 padding: var(--jp-notebook-padding);
 outline: none;
 overflow: auto;
 background: var(--jp-layout-color0);
}

.jp-Notebook.jp-mod-scrollPastEnd::after {
 display: block;
 content: '';
 min-height: var(--jp-notebook-scroll-padding);
}

.jp-MainAreaWidget-ContainStrict .jp-Notebook * {
 contain: strict;
}

.jp-Notebook .jp-Cell {
 overflow: visible;
}

.jp-Notebook .jp-Cell .jp-InputPrompt {
 cursor: move;
}

/*-----------------------------------------------------------------------------
| Notebook state related styling
|
| The notebook and cells each have states, here are the possibilities:
|
| - Notebook
| - Command
| - Edit
| - Cell
| - None
| - Active (only one can be active)
| - Selected (the cells actions are applied to)
| - Multiselected (when multiple selected, the cursor)
| - No outputs
|----------------------------------------------------------------------------*/

/* Command or edit modes */

.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-InputPrompt {
 opacity: var(--jp-cell-prompt-not-active-opacity);
 color: var(--jp-cell-prompt-not-active-font-color);
}

.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-OutputPrompt {
 opacity: var(--jp-cell-prompt-not-active-opacity);
 color: var(--jp-cell-prompt-not-active-font-color);
}

/* cell is active */
.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser {
 background: var(--jp-brand-color1);
}

/* cell is dirty */
.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt {
 color: var(--jp-warn-color1);
}

.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt::before {
 color: var(--jp-warn-color1);
 content: '•';
}

.jp-Notebook .jp-Cell.jp-mod-active.jp-mod-dirty .jp-Collapser {
 background: var(--jp-warn-color1);
}

/* collapser is hovered */
.jp-Notebook .jp-Cell .jp-Collapser:hover {
 box-shadow: var(--jp-elevation-z2);
 background: var(--jp-brand-color1);
 opacity: var(--jp-cell-collapser-not-active-hover-opacity);
}

/* cell is active and collapser is hovered */
.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser:hover {
 background: var(--jp-brand-color0);
 opacity: 1;
}

/* Command mode */

.jp-Notebook.jp-mod-commandMode .jp-Cell.jp-mod-selected {
 background: var(--jp-notebook-multiselected-color);
}

.jp-Notebook.jp-mod-commandMode
 .jp-Cell.jp-mod-active.jp-mod-selected:not(.jp-mod-multiSelected) {
 background: transparent;
}

/* Edit mode */

.jp-Notebook.jp-mod-editMode .jp-Cell.jp-mod-active .jp-InputArea-editor {
 border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color);
 box-shadow: var(--jp-input-box-shadow);
 background-color: var(--jp-cell-editor-active-background);
}

/*-----------------------------------------------------------------------------
| Notebook drag and drop
|----------------------------------------------------------------------------*/

.jp-Notebook-cell.jp-mod-dropSource {
 opacity: 0.5;
}

.jp-Notebook-cell.jp-mod-dropTarget,
.jp-Notebook.jp-mod-commandMode
 .jp-Notebook-cell.jp-mod-active.jp-mod-selected.jp-mod-dropTarget {
 border-top-color: var(--jp-private-notebook-selected-color);
 border-top-style: solid;
 border-top-width: 2px;
}

.jp-dragImage {
 display: block;
 flex-direction: row;
 width: var(--jp-private-notebook-dragImage-width);
 height: var(--jp-private-notebook-dragImage-height);
 border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
 background: var(--jp-cell-editor-background);
 overflow: visible;
}

.jp-dragImage-singlePrompt {
 box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12);
}

.jp-dragImage .jp-dragImage-content {
 flex: 1 1 auto;
 z-index: 2;
 font-size: var(--jp-code-font-size);
 font-family: var(--jp-code-font-family);
 line-height: var(--jp-code-line-height);
 padding: var(--jp-code-padding);
 border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
 background: var(--jp-cell-editor-background-color);
 color: var(--jp-content-font-color3);
 text-align: left;
 margin: 4px 4px 4px 0;
}

.jp-dragImage .jp-dragImage-prompt {
 flex: 0 0 auto;
 min-width: 36px;
 color: var(--jp-cell-inprompt-font-color);
 padding: var(--jp-code-padding);
 padding-left: 12px;
 font-family: var(--jp-cell-prompt-font-family);
 letter-spacing: var(--jp-cell-prompt-letter-spacing);
 line-height: 1.9;
 font-size: var(--jp-code-font-size);
 border: var(--jp-border-width) solid transparent;
}

.jp-dragImage-multipleBack {
 z-index: -1;
 position: absolute;
 height: 32px;
 width: 300px;
 top: 8px;
 left: 8px;
 background: var(--jp-layout-color2);
 border: var(--jp-border-width) solid var(--jp-input-border-color);
 box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12);
}

/*-----------------------------------------------------------------------------
| Cell toolbar
|----------------------------------------------------------------------------*/

.jp-NotebookTools {
 display: block;
 min-width: var(--jp-sidebar-min-width);
 color: var(--jp-ui-font-color1);
 background: var(--jp-layout-color1);

 /* This is needed so that all font sizing of children done in ems is
 * relative to this base size */
 font-size: var(--jp-ui-font-size1);
 overflow: auto;
}

.jp-ActiveCellTool {
 padding: 12px 0;
 display: flex;
}

.jp-ActiveCellTool-Content {
 flex: 1 1 auto;
}

.jp-ActiveCellTool .jp-ActiveCellTool-CellContent {
 background: var(--jp-cell-editor-background);
 border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
 border-radius: 0;
 min-height: 29px;
}

.jp-ActiveCellTool .jp-InputPrompt {
 min-width: calc(var(--jp-cell-prompt-width) * 0.75);
}

.jp-ActiveCellTool-CellContent &gt; pre {
 padding: 5px 4px;
 margin: 0;
 white-space: normal;
}

.jp-MetadataEditorTool {
 flex-direction: column;
 padding: 12px 0;
}

.jp-RankedPanel &gt; :not(:first-child) {
 margin-top: 12px;
}

.jp-KeySelector select.jp-mod-styled {
 font-size: var(--jp-ui-font-size1);
 color: var(--jp-ui-font-color0);
 border: var(--jp-border-width) solid var(--jp-border-color1);
}

.jp-KeySelector label,
.jp-MetadataEditorTool label,
.jp-NumberSetter label {
 line-height: 1.4;
}

.jp-NotebookTools .jp-select-wrapper {
 margin-top: 4px;
 margin-bottom: 0;
}

.jp-NumberSetter input {
 width: 100%;
 margin-top: 4px;
}

.jp-NotebookTools .jp-Collapse {
 margin-top: 16px;
}

/*-----------------------------------------------------------------------------
| Presentation Mode (.jp-mod-presentationMode)
|----------------------------------------------------------------------------*/

.jp-mod-presentationMode .jp-Notebook {
 --jp-content-font-size1: var(--jp-content-presentation-font-size1);
 --jp-code-font-size: var(--jp-code-presentation-font-size);
}

.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-InputPrompt,
.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-OutputPrompt {
 flex: 0 0 110px;
}

/*-----------------------------------------------------------------------------
| Side-by-side Mode (.jp-mod-sideBySide)
|----------------------------------------------------------------------------*/
.jp-mod-sideBySide.jp-Notebook .jp-Notebook-cell {
 margin-top: 3em;
 margin-bottom: 3em;
 margin-left: 5%;
 margin-right: 5%;
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell {
 display: grid;
 grid-template-columns: minmax(0, 1fr) min-content minmax(
 0,
 var(--jp-side-by-side-output-size)
 );
 grid-template-rows: auto minmax(0, 1fr) auto;
 grid-template-areas:
 'header header header'
 'input handle output'
 'footer footer footer';
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell.jp-mod-resizedCell {
 grid-template-columns: minmax(0, 1fr) min-content minmax(
 0,
 var(--jp-side-by-side-resized-cell)
 );
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellHeader {
 grid-area: header;
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-inputWrapper {
 grid-area: input;
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-outputWrapper {
 /* overwrite the default margin (no vertical separation needed in side by side move */
 margin-top: 0;
 grid-area: output;
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellFooter {
 grid-area: footer;
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle {
 grid-area: handle;
 user-select: none;
 display: block;
 height: 100%;
 cursor: ew-resize;
 padding: 0 var(--jp-cell-padding);
}

.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle::after {
 content: '';
 display: block;
 background: var(--jp-border-color2);
 height: 100%;
 width: 5px;
}

.jp-mod-sideBySide.jp-Notebook
 .jp-CodeCell.jp-mod-resizedCell
 .jp-CellResizeHandle::after {
 background: var(--jp-border-color0);
}

.jp-CellResizeHandle {
 display: none;
}

/*-----------------------------------------------------------------------------
| Placeholder
|----------------------------------------------------------------------------*/

.jp-Cell-Placeholder {
 padding-left: 55px;
}

.jp-Cell-Placeholder-wrapper {
 background: #fff;
 border: 1px solid;
 border-color: #e5e6e9 #dfe0e4 #d0d1d5;
 border-radius: 4px;
 -webkit-border-radius: 4px;
 margin: 10px 15px;
}

.jp-Cell-Placeholder-wrapper-inner {
 padding: 15px;
 position: relative;
}

.jp-Cell-Placeholder-wrapper-body {
 background-repeat: repeat;
 background-size: 50% auto;
}

.jp-Cell-Placeholder-wrapper-body div {
 background: #f6f7f8;
 background-image: -webkit-linear-gradient(
 left,
 #f6f7f8 0%,
 #edeef1 20%,
 #f6f7f8 40%,
 #f6f7f8 100%
 );
 background-repeat: no-repeat;
 background-size: 800px 104px;
 height: 104px;
 position: absolute;
 right: 15px;
 left: 15px;
 top: 15px;
}

div.jp-Cell-Placeholder-h1 {
 top: 20px;
 height: 20px;
 left: 15px;
 width: 150px;
}

div.jp-Cell-Placeholder-h2 {
 left: 15px;
 top: 50px;
 height: 10px;
 width: 100px;
}

div.jp-Cell-Placeholder-content-1,
div.jp-Cell-Placeholder-content-2,
div.jp-Cell-Placeholder-content-3 {
 left: 15px;
 right: 15px;
 height: 10px;
}

div.jp-Cell-Placeholder-content-1 {
 top: 100px;
}

div.jp-Cell-Placeholder-content-2 {
 top: 120px;
}

div.jp-Cell-Placeholder-content-3 {
 top: 140px;
}

&lt;/style&gt;
&lt;style type="text/css"&gt;
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/

/*
The following CSS variables define the main, public API for styling JupyterLab.
These variables should be used by all plugins wherever possible. In other
words, plugins should not define custom colors, sizes, etc unless absolutely
necessary. This enables users to change the visual theme of JupyterLab
by changing these variables.

Many variables appear in an ordered sequence (0,1,2,3). These sequences
are designed to work well together, so for example, `--jp-border-color1` should
be used with `--jp-layout-color1`. The numbers have the following meanings:

* 0: super-primary, reserved for special emphasis
* 1: primary, most important under normal situations
* 2: secondary, next most important under normal situations
* 3: tertiary, next most important under normal situations

Throughout JupyterLab, we are mostly following principles from Google's
Material Design when selecting colors. We are not, however, following
all of MD as it is not optimized for dense, information rich UIs.
*/

:root {
 /* Elevation
 *
 * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here:
 *
 * https://github.com/material-components/material-components-web
 * https://material-components-web.appspot.com/elevation.html
 */

 --jp-shadow-base-lightness: 0;
 --jp-shadow-umbra-color: rgba(
 var(--jp-shadow-base-lightness),
 var(--jp-shadow-base-lightness),
 var(--jp-shadow-base-lightness),
 0.2
 );
 --jp-shadow-penumbra-color: rgba(
 var(--jp-shadow-base-lightness),
 var(--jp-shadow-base-lightness),
 var(--jp-shadow-base-lightness),
 0.14
 );
 --jp-shadow-ambient-color: rgba(
 var(--jp-shadow-base-lightness),
 var(--jp-shadow-base-lightness),
 var(--jp-shadow-base-lightness),
 0.12
 );
 --jp-elevation-z0: none;
 --jp-elevation-z1: 0 2px 1px -1px var(--jp-shadow-umbra-color),
 0 1px 1px 0 var(--jp-shadow-penumbra-color),
 0 1px 3px 0 var(--jp-shadow-ambient-color);
 --jp-elevation-z2: 0 3px 1px -2px var(--jp-shadow-umbra-color),
 0 2px 2px 0 var(--jp-shadow-penumbra-color),
 0 1px 5px 0 var(--jp-shadow-ambient-color);
 --jp-elevation-z4: 0 2px 4px -1px var(--jp-shadow-umbra-color),
 0 4px 5px 0 var(--jp-shadow-penumbra-color),
 0 1px 10px 0 var(--jp-shadow-ambient-color);
 --jp-elevation-z6: 0 3px 5px -1px var(--jp-shadow-umbra-color),
 0 6px 10px 0 var(--jp-shadow-penumbra-color),
 0 1px 18px 0 var(--jp-shadow-ambient-color);
 --jp-elevation-z8: 0 5px 5px -3px var(--jp-shadow-umbra-color),
 0 8px 10px 1px var(--jp-shadow-penumbra-color),
 0 3px 14px 2px var(--jp-shadow-ambient-color);
 --jp-elevation-z12: 0 7px 8px -4px var(--jp-shadow-umbra-color),
 0 12px 17px 2px var(--jp-shadow-penumbra-color),
 0 5px 22px 4px var(--jp-shadow-ambient-color);
 --jp-elevation-z16: 0 8px 10px -5px var(--jp-shadow-umbra-color),
 0 16px 24px 2px var(--jp-shadow-penumbra-color),
 0 6px 30px 5px var(--jp-shadow-ambient-color);
 --jp-elevation-z20: 0 10px 13px -6px var(--jp-shadow-umbra-color),
 0 20px 31px 3px var(--jp-shadow-penumbra-color),
 0 8px 38px 7px var(--jp-shadow-ambient-color);
 --jp-elevation-z24: 0 11px 15px -7px var(--jp-shadow-umbra-color),
 0 24px 38px 3px var(--jp-shadow-penumbra-color),
 0 9px 46px 8px var(--jp-shadow-ambient-color);

 /* Borders
 *
 * The following variables, specify the visual styling of borders in JupyterLab.
 */

 --jp-border-width: 1px;
 --jp-border-color0: var(--md-grey-400);
 --jp-border-color1: var(--md-grey-400);
 --jp-border-color2: var(--md-grey-300);
 --jp-border-color3: var(--md-grey-200);
 --jp-inverse-border-color: var(--md-grey-600);
 --jp-border-radius: 2px;

 /* UI Fonts
 *
 * The UI font CSS variables are used for the typography all of the JupyterLab
 * user interface elements that are not directly user generated content.
 *
 * The font sizing here is done assuming that the body font size of --jp-ui-font-size1
 * is applied to a parent element. When children elements, such as headings, are sized
 * in em all things will be computed relative to that body size.
 */

 --jp-ui-font-scale-factor: 1.2;
 --jp-ui-font-size0: 0.83333em;
 --jp-ui-font-size1: 13px; /* Base font size */
 --jp-ui-font-size2: 1.2em;
 --jp-ui-font-size3: 1.44em;
 --jp-ui-font-family: system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI',
 helvetica, arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
 'Segoe UI Symbol';

 /*
 * Use these font colors against the corresponding main layout colors.
 * In a light theme, these go from dark to light.
 */

 /* Defaults use Material Design specification */
 --jp-ui-font-color0: rgba(0, 0, 0, 1);
 --jp-ui-font-color1: rgba(0, 0, 0, 0.87);
 --jp-ui-font-color2: rgba(0, 0, 0, 0.54);
 --jp-ui-font-color3: rgba(0, 0, 0, 0.38);

 /*
 * Use these against the brand/accent/warn/error colors.
 * These will typically go from light to darker, in both a dark and light theme.
 */

 --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1);
 --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1);
 --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7);
 --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5);

 /* Content Fonts
 *
 * Content font variables are used for typography of user generated content.
 *
 * The font sizing here is done assuming that the body font size of --jp-content-font-size1
 * is applied to a parent element. When children elements, such as headings, are sized
 * in em all things will be computed relative to that body size.
 */

 --jp-content-line-height: 1.6;
 --jp-content-font-scale-factor: 1.2;
 --jp-content-font-size0: 0.83333em;
 --jp-content-font-size1: 14px; /* Base font size */
 --jp-content-font-size2: 1.2em;
 --jp-content-font-size3: 1.44em;
 --jp-content-font-size4: 1.728em;
 --jp-content-font-size5: 2.0736em;

 /* This gives a magnification of about 125% in presentation mode over normal. */
 --jp-content-presentation-font-size1: 17px;
 --jp-content-heading-line-height: 1;
 --jp-content-heading-margin-top: 1.2em;
 --jp-content-heading-margin-bottom: 0.8em;
 --jp-content-heading-font-weight: 500;

 /* Defaults use Material Design specification */
 --jp-content-font-color0: rgba(0, 0, 0, 1);
 --jp-content-font-color1: rgba(0, 0, 0, 0.87);
 --jp-content-font-color2: rgba(0, 0, 0, 0.54);
 --jp-content-font-color3: rgba(0, 0, 0, 0.38);
 --jp-content-link-color: var(--md-blue-900);
 --jp-content-font-family: system-ui, -apple-system, blinkmacsystemfont,
 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji',
 'Segoe UI Emoji', 'Segoe UI Symbol';

 /*
 * Code Fonts
 *
 * Code font variables are used for typography of code and other monospaces content.
 */

 --jp-code-font-size: 13px;
 --jp-code-line-height: 1.3077; /* 17px for 13px base */
 --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */
 --jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace;
 --jp-code-font-family: var(--jp-code-font-family-default);

 /* This gives a magnification of about 125% in presentation mode over normal. */
 --jp-code-presentation-font-size: 16px;

 /* may need to tweak cursor width if you change font size */
 --jp-code-cursor-width0: 1.4px;
 --jp-code-cursor-width1: 2px;
 --jp-code-cursor-width2: 4px;

 /* Layout
 *
 * The following are the main layout colors use in JupyterLab. In a light
 * theme these would go from light to dark.
 */

 --jp-layout-color0: white;
 --jp-layout-color1: white;
 --jp-layout-color2: var(--md-grey-200);
 --jp-layout-color3: var(--md-grey-400);
 --jp-layout-color4: var(--md-grey-600);

 /* Inverse Layout
 *
 * The following are the inverse layout colors use in JupyterLab. In a light
 * theme these would go from dark to light.
 */

 --jp-inverse-layout-color0: #111;
 --jp-inverse-layout-color1: var(--md-grey-900);
 --jp-inverse-layout-color2: var(--md-grey-800);
 --jp-inverse-layout-color3: var(--md-grey-700);
 --jp-inverse-layout-color4: var(--md-grey-600);

 /* Brand/accent */

 --jp-brand-color0: var(--md-blue-900);
 --jp-brand-color1: var(--md-blue-700);
 --jp-brand-color2: var(--md-blue-300);
 --jp-brand-color3: var(--md-blue-100);
 --jp-brand-color4: var(--md-blue-50);
 --jp-accent-color0: var(--md-green-900);
 --jp-accent-color1: var(--md-green-700);
 --jp-accent-color2: var(--md-green-300);
 --jp-accent-color3: var(--md-green-100);

 /* State colors (warn, error, success, info) */

 --jp-warn-color0: var(--md-orange-900);
 --jp-warn-color1: var(--md-orange-700);
 --jp-warn-color2: var(--md-orange-300);
 --jp-warn-color3: var(--md-orange-100);
 --jp-error-color0: var(--md-red-900);
 --jp-error-color1: var(--md-red-700);
 --jp-error-color2: var(--md-red-300);
 --jp-error-color3: var(--md-red-100);
 --jp-success-color0: var(--md-green-900);
 --jp-success-color1: var(--md-green-700);
 --jp-success-color2: var(--md-green-300);
 --jp-success-color3: var(--md-green-100);
 --jp-info-color0: var(--md-cyan-900);
 --jp-info-color1: var(--md-cyan-700);
 --jp-info-color2: var(--md-cyan-300);
 --jp-info-color3: var(--md-cyan-100);

 /* Cell specific styles */

 --jp-cell-padding: 5px;
 --jp-cell-collapser-width: 8px;
 --jp-cell-collapser-min-height: 20px;
 --jp-cell-collapser-not-active-hover-opacity: 0.6;
 --jp-cell-editor-background: var(--md-grey-100);
 --jp-cell-editor-border-color: var(--md-grey-300);
 --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300);
 --jp-cell-editor-active-background: var(--jp-layout-color0);
 --jp-cell-editor-active-border-color: var(--jp-brand-color1);
 --jp-cell-prompt-width: 64px;
 --jp-cell-prompt-font-family: var(--jp-code-font-family-default);
 --jp-cell-prompt-letter-spacing: 0;
 --jp-cell-prompt-opacity: 1;
 --jp-cell-prompt-not-active-opacity: 0.5;
 --jp-cell-prompt-not-active-font-color: var(--md-grey-700);

 /* A custom blend of MD grey and blue 600
 * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */
 --jp-cell-inprompt-font-color: #307fc1;

 /* A custom blend of MD grey and orange 600
 * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */
 --jp-cell-outprompt-font-color: #bf5b3d;

 /* Notebook specific styles */

 --jp-notebook-padding: 10px;
 --jp-notebook-select-background: var(--jp-layout-color1);
 --jp-notebook-multiselected-color: var(--md-blue-50);

 /* The scroll padding is calculated to fill enough space at the bottom of the
 notebook to show one single-line cell (with appropriate padding) at the top
 when the notebook is scrolled all the way to the bottom. We also subtract one
 pixel so that no scrollbar appears if we have just one single-line cell in the
 notebook. This padding is to enable a 'scroll past end' feature in a notebook.
 */
 --jp-notebook-scroll-padding: calc(
 100% - var(--jp-code-font-size) * var(--jp-code-line-height) -
 var(--jp-code-padding) - var(--jp-cell-padding) - 1px
 );

 /* Rendermime styles */

 --jp-rendermime-error-background: #fdd;
 --jp-rendermime-table-row-background: var(--md-grey-100);
 --jp-rendermime-table-row-hover-background: var(--md-light-blue-50);

 /* Dialog specific styles */

 --jp-dialog-background: rgba(0, 0, 0, 0.25);

 /* Console specific styles */

 --jp-console-padding: 10px;

 /* Toolbar specific styles */

 --jp-toolbar-border-color: var(--jp-border-color1);
 --jp-toolbar-micro-height: 8px;
 --jp-toolbar-background: var(--jp-layout-color1);
 --jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.24);
 --jp-toolbar-header-margin: 4px 4px 0 4px;
 --jp-toolbar-active-background: var(--md-grey-300);

 /* Statusbar specific styles */

 --jp-statusbar-height: 24px;

 /* Input field styles */

 --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300);
 --jp-input-active-background: var(--jp-layout-color1);
 --jp-input-hover-background: var(--jp-layout-color1);
 --jp-input-background: var(--md-grey-100);
 --jp-input-border-color: var(--jp-inverse-border-color);
 --jp-input-active-border-color: var(--jp-brand-color1);
 --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3);

 /* General editor styles */

 --jp-editor-selected-background: #d9d9d9;
 --jp-editor-selected-focused-background: #d7d4f0;
 --jp-editor-cursor-color: var(--jp-ui-font-color0);

 /* Code mirror specific styles */

 --jp-mirror-editor-keyword-color: #008000;
 --jp-mirror-editor-atom-color: #88f;
 --jp-mirror-editor-number-color: #080;
 --jp-mirror-editor-def-color: #00f;
 --jp-mirror-editor-variable-color: var(--md-grey-900);
 --jp-mirror-editor-variable-2-color: rgb(0, 54, 109);
 --jp-mirror-editor-variable-3-color: #085;
 --jp-mirror-editor-punctuation-color: #05a;
 --jp-mirror-editor-property-color: #05a;
 --jp-mirror-editor-operator-color: #a2f;
 --jp-mirror-editor-comment-color: #408080;
 --jp-mirror-editor-string-color: #ba2121;
 --jp-mirror-editor-string-2-color: #708;
 --jp-mirror-editor-meta-color: #a2f;
 --jp-mirror-editor-qualifier-color: #555;
 --jp-mirror-editor-builtin-color: #008000;
 --jp-mirror-editor-bracket-color: #997;
 --jp-mirror-editor-tag-color: #170;
 --jp-mirror-editor-attribute-color: #00c;
 --jp-mirror-editor-header-color: blue;
 --jp-mirror-editor-quote-color: #090;
 --jp-mirror-editor-link-color: #00c;
 --jp-mirror-editor-error-color: #f00;
 --jp-mirror-editor-hr-color: #999;

 /*
 RTC user specific colors.
 These colors are used for the cursor, username in the editor,
 and the icon of the user.
 */

 --jp-collaborator-color1: #ffad8e;
 --jp-collaborator-color2: #dac83d;
 --jp-collaborator-color3: #72dd76;
 --jp-collaborator-color4: #00e4d0;
 --jp-collaborator-color5: #45d4ff;
 --jp-collaborator-color6: #e2b1ff;
 --jp-collaborator-color7: #ff9de6;

 /* Vega extension styles */

 --jp-vega-background: white;

 /* Sidebar-related styles */

 --jp-sidebar-min-width: 250px;

 /* Search-related styles */

 --jp-search-toggle-off-opacity: 0.5;
 --jp-search-toggle-hover-opacity: 0.8;
 --jp-search-toggle-on-opacity: 1;
 --jp-search-selected-match-background-color: rgb(245, 200, 0);
 --jp-search-selected-match-color: black;
 --jp-search-unselected-match-background-color: var(
 --jp-inverse-layout-color0
 );
 --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0);

 /* Icon colors that work well with light or dark backgrounds */
 --jp-icon-contrast-color0: var(--md-purple-600);
 --jp-icon-contrast-color1: var(--md-green-600);
 --jp-icon-contrast-color2: var(--md-pink-600);
 --jp-icon-contrast-color3: var(--md-blue-600);

 /* Button colors */
 --jp-accept-color-normal: var(--md-blue-700);
 --jp-accept-color-hover: var(--md-blue-800);
 --jp-accept-color-active: var(--md-blue-900);
 --jp-warn-color-normal: var(--md-red-700);
 --jp-warn-color-hover: var(--md-red-800);
 --jp-warn-color-active: var(--md-red-900);
 --jp-reject-color-normal: var(--md-grey-600);
 --jp-reject-color-hover: var(--md-grey-700);
 --jp-reject-color-active: var(--md-grey-800);

 /* File or activity icons and switch semantic variables */
 --jp-jupyter-icon-color: #f37626;
 --jp-notebook-icon-color: #f37626;
 --jp-json-icon-color: var(--md-orange-700);
 --jp-console-icon-background-color: var(--md-blue-700);
 --jp-console-icon-color: white;
 --jp-terminal-icon-background-color: var(--md-grey-800);
 --jp-terminal-icon-color: var(--md-grey-200);
 --jp-text-editor-icon-color: var(--md-grey-700);
 --jp-inspector-icon-color: var(--md-grey-700);
 --jp-switch-color: var(--md-grey-400);
 --jp-switch-true-position-color: var(--md-orange-900);
}
&lt;/style&gt;
&lt;style type="text/css"&gt;
/* Force rendering true colors when outputing to pdf */
* {
 -webkit-print-color-adjust: exact;
}

/* Misc */
a.anchor-link {
 display: none;
}

/* Input area styling */
.jp-InputArea {
 overflow: hidden;
}

.jp-InputArea-editor {
 overflow: hidden;
}

.cm-editor.cm-s-jupyter .highlight pre {
/* weird, but --jp-code-padding defined to be 5px but 4px horizontal padding is hardcoded for pre.cm-line */
 padding: var(--jp-code-padding) 4px;
 margin: 0;

 font-family: inherit;
 font-size: inherit;
 line-height: inherit;
 color: inherit;

}

.jp-OutputArea-output pre {
 line-height: inherit;
 font-family: inherit;
}

.jp-RenderedText pre {
 color: var(--jp-content-font-color1);
 font-size: var(--jp-code-font-size);
}

/* Hiding the collapser by default */
.jp-Collapser {
 display: none;
}

@page {
 margin: 0.5in; /* Margin for each printed piece of paper */
}

@media print {
 .jp-Cell-inputWrapper,
 .jp-Cell-outputWrapper {
 display: block;
 }
}
&lt;/style&gt;
&lt;!-- Load mathjax --&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe"&gt; &lt;/script&gt;
&lt;!-- MathJax configuration --&gt;
&lt;script type="text/x-mathjax-config"&gt;
 init_mathjax = function() {
 if (window.MathJax) {
 // MathJax loaded
 MathJax.Hub.Config({
 TeX: {
 equationNumbers: {
 autoNumber: "AMS",
 useLabelIds: true
 }
 },
 tex2jax: {
 inlineMath: [ ['$','$'], ["\\(","\\)"] ],
 displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
 processEscapes: true,
 processEnvironments: true
 },
 displayAlign: 'center',
 messageStyle: 'none',
 CommonHTML: {
 linebreaks: {
 automatic: true
 }
 }
 });

 MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
 }
 }
 init_mathjax();
 &lt;/script&gt;
&lt;!-- End of mathjax configuration --&gt;&lt;script type="module"&gt;
 document.addEventListener("DOMContentLoaded", async () =&gt; {
 const diagrams = document.querySelectorAll(".jp-Mermaid &gt; pre.mermaid");
 // do not load mermaidjs if not needed
 if (!diagrams.length) {
 return;
 }
 const mermaid = (await import("https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs")).default;
 const parser = new DOMParser();

 mermaid.initialize({
 maxTextSize: 100000,
 maxEdges: 100000,
 startOnLoad: false,
 fontFamily: window
 .getComputedStyle(document.body)
 .getPropertyValue("--jp-ui-font-family"),
 theme: document.querySelector("body[data-jp-theme-light='true']")
 ? "default"
 : "dark",
 });

 let _nextMermaidId = 0;

 function makeMermaidImage(svg) {
 const img = document.createElement("img");
 const doc = parser.parseFromString(svg, "image/svg+xml");
 const svgEl = doc.querySelector("svg");
 const { maxWidth } = svgEl?.style || {};
 const firstTitle = doc.querySelector("title");
 const firstDesc = doc.querySelector("desc");

 img.setAttribute("src", `data:image/svg+xml,${encodeURIComponent(svg)}`);
 if (maxWidth) {
 img.width = parseInt(maxWidth);
 }
 if (firstTitle) {
 img.setAttribute("alt", firstTitle.textContent);
 }
 if (firstDesc) {
 const caption = document.createElement("figcaption");
 caption.className = "sr-only";
 caption.textContent = firstDesc.textContent;
 return [img, caption];
 }
 return [img];
 }

 async function makeMermaidError(text) {
 let errorMessage = "";
 try {
 await mermaid.parse(text);
 } catch (err) {
 errorMessage = `${err}`;
 }

 const result = document.createElement("details");
 result.className = 'jp-RenderedMermaid-Details';
 const summary = document.createElement("summary");
 summary.className = 'jp-RenderedMermaid-Summary';
 const pre = document.createElement("pre");
 const code = document.createElement("code");
 code.innerText = text;
 pre.appendChild(code);
 summary.appendChild(pre);
 result.appendChild(summary);

 const warning = document.createElement("pre");
 warning.innerText = errorMessage;
 result.appendChild(warning);
 return [result];
 }

 async function renderOneMarmaid(src) {
 const id = `jp-mermaid-${_nextMermaidId++}`;
 const parent = src.parentNode;
 let raw = src.textContent.trim();
 const el = document.createElement("div");
 el.style.visibility = "hidden";
 document.body.appendChild(el);
 let results = null;
 let output = null;
 try {
 let { svg } = await mermaid.render(id, raw, el);
 svg = cleanMermaidSvg(svg);
 results = makeMermaidImage(svg);
 output = document.createElement("figure");
 results.map(output.appendChild, output);
 } catch (err) {
 parent.classList.add("jp-mod-warning");
 results = await makeMermaidError(raw);
 output = results[0];
 } finally {
 el.remove();
 }
 parent.classList.add("jp-RenderedMermaid");
 parent.appendChild(output);
 }


 /**
 * Post-process to ensure mermaid diagrams contain only valid SVG and XHTML.
 */
 function cleanMermaidSvg(svg) {
 return svg.replace(RE_VOID_ELEMENT, replaceVoidElement);
 }


 /**
 * A regular expression for all void elements, which may include attributes and
 * a slash.
 *
 * @see https://developer.mozilla.org/en-US/docs/Glossary/Void_element
 *
 * Of these, only `&lt;br&gt;` is generated by Mermaid in place of `\n`,
 * but _any_ "malformed" tag will break the SVG rendering entirely.
 */
 const RE_VOID_ELEMENT =
 /&lt;\s*(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)\s*([^&gt;]*?)\s*&gt;/gi;

 /**
 * Ensure a void element is closed with a slash, preserving any attributes.
 */
 function replaceVoidElement(match, tag, rest) {
 rest = rest.trim();
 if (!rest.endsWith('/')) {
 rest = `${rest} /`;
 }
 return `&lt;${tag} ${rest}&gt;`;
 }

 void Promise.all([...diagrams].map(renderOneMarmaid));
 });
&lt;/script&gt;
&lt;style&gt;
 .jp-Mermaid:not(.jp-RenderedMermaid) {
 display: none;
 }

 .jp-RenderedMermaid {
 overflow: auto;
 display: flex;
 }

 .jp-RenderedMermaid.jp-mod-warning {
 width: auto;
 padding: 0.5em;
 margin-top: 0.5em;
 border: var(--jp-border-width) solid var(--jp-warn-color2);
 border-radius: var(--jp-border-radius);
 color: var(--jp-ui-font-color1);
 font-size: var(--jp-ui-font-size1);
 white-space: pre-wrap;
 word-wrap: break-word;
 }

 .jp-RenderedMermaid figure {
 margin: 0;
 overflow: auto;
 max-width: 100%;
 }

 .jp-RenderedMermaid img {
 max-width: 100%;
 }

 .jp-RenderedMermaid-Details &gt; pre {
 margin-top: 1em;
 }

 .jp-RenderedMermaid-Summary {
 color: var(--jp-warn-color2);
 }

 .jp-RenderedMermaid:not(.jp-mod-warning) pre {
 display: none;
 }

 .jp-RenderedMermaid-Summary &gt; pre {
 display: inline-block;
 white-space: normal;
 }
&lt;/style&gt;
&lt;!-- End of mermaid configuration --&gt;&lt;/head&gt;
&lt;body class="jp-Notebook" data-jp-theme-light="true" data-jp-theme-name="JupyterLab Light"&gt;
&lt;main&gt;
&lt;div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ea7fe001"&gt;
&lt;div class="jp-Cell-inputWrapper" tabindex="0"&gt;
&lt;div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"&gt;
&lt;/div&gt;
&lt;div class="jp-InputArea jp-Cell-inputArea"&gt;&lt;div class="jp-InputPrompt jp-InputArea-prompt"&gt;
&lt;/div&gt;&lt;div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"&gt;
 &lt;a href="https://colab.research.google.com/github/IngridMorstrad/NeuralNetCourse/blob/main/Lesson 1 Gradient Descent.ipynb"&gt;
 &lt;img src="https://colab.research.google.com/assets/colab-badge.svg"&gt;
&lt;/a&gt;

&lt;h1 id="Lesson-1:-Neural-Networks-with-PyTorch"&gt;Lesson 1: Neural Networks with PyTorch&lt;a class="anchor-link" href="#Lesson-1:-Neural-Networks-with-PyTorch"&gt;¶&lt;/a&gt;&lt;/h1&gt;&lt;h2 id="%F0%9F%93%9A-Prerequisites-(Your-Starting-Level)"&gt;📚 Prerequisites (Your Starting Level)&lt;a class="anchor-link" href="#%F0%9F%93%9A-Prerequisites-(Your-Starting-Level)"&gt;¶&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Based on your background:&lt;/p&gt;</description></item><item><title>My returns against VOO</title><link>https://www.ashwinmenon.com/finance/investing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/finance/investing/</guid><description>&lt;iframe src="https://docs.google.com/spreadsheets/d/e/2PACX-1vS855r8TRwYSdgOSzVFeJnPDP-sfsCzPxA7u-FHL-Rt5r1xo5iCl7M3VZOg2Sj0Y2xu3rQr6SU-IxKo/pubhtml?gid=338382601&amp;amp;single=true&amp;amp;widget=true&amp;amp;headers=false"&gt;&lt;/iframe&gt;</description></item><item><title>Stock pricer</title><link>https://www.ashwinmenon.com/finance/stock_pricer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ashwinmenon.com/finance/stock_pricer/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;Stock price estimator&lt;/title&gt;

&lt;style&gt;
 :root {
 /* Cactus-inspired palette */
 --bg: #faf7f2; /* sand */
 --card: #ffffff; /* white card */
 --border: #d5c7b8; /* warm beige */
 --text: #2f2a26; /* deep warm */
 --sub: #6a5f58; /* muted brown */
 --accent: #5b8a72; /* cactus green */
 --accent-light: #6fa88a;
 --radius: 10px;
 }

 body {
 font-family: system-ui, sans-serif;
 background: var(--bg);
 color: var(--text);
 max-width: 760px;
 margin: 40px auto;
 padding: 0 20px;
 line-height: 1.5;
 }

 h1, h2, h3 {
 margin-bottom: 8px;
 font-weight: 600;
 color: var(--accent);
 }

 a {
 color: var(--accent);
 text-decoration: none;
 }
 a:hover {
 text-decoration: underline;
 }

 .section {
 background: var(--card);
 padding: 24px;
 border: 1px solid var(--border);
 border-radius: var(--radius);
 margin-top: 28px;
 box-shadow: 0 1px 3px rgba(0,0,0,0.05);
 }

 label {
 display: block;
 margin-top: 18px;
 font-weight: 600;
 }

 input[type="number"] {
 margin-top: 6px;
 padding: 8px 10px;
 width: 220px;
 border: 1px solid var(--border);
 border-radius: 6px;
 font-size: 14px;
 background: #fcfbf8;
 }

 button {
 padding: 8px 14px;
 border-radius: 6px;
 cursor: pointer;
 margin-top: 14px;
 border: none;
 background: var(--accent);
 color: white;
 font-weight: 600;
 transition: background 0.15s ease;
 }

 button:hover {
 background: var(--accent-light);
 }

 table {
 width: 100%;
 border-collapse: collapse;
 margin-top: 14px;
 }

 th {
 text-align: left;
 padding-bottom: 6px;
 font-weight: 600;
 color: var(--sub);
 }

 td {
 padding: 8px 0;
 border-bottom: 1px solid var(--border);
 }

 #out {
 background: #f2ede6;
 padding: 14px;
 border-radius: 6px;
 margin-top: 12px;
 font-family: monospace;
 white-space: pre;
 border: 1px solid var(--border);
 }

 details summary {
 cursor: pointer;
 font-weight: 600;
 color: var(--accent);
 }

 .small {
 color: var(--sub);
 font-size: 0.9em;
 margin-top: 10px;
 }

 .center {
 text-align: center;
 margin-top: 30px;
 }

 #outTitle {
 margin-top: 32px;
 font-weight: 600;
 color: var(--accent);
 }
&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;h1&gt;Stock pricer (stock price estimator)&lt;/h1&gt;

&lt;details class="section" style="margin-top:18px;"&gt;
 &lt;summary&gt;What this tool does (click to expand)&lt;/summary&gt;
 &lt;p style="margin-top:12px;"&gt;
 This tool estimates the fair value of a stock based on your assumptions about earnings, 
 required return, and future growth. It projects earnings forward year by year, discounts 
 them back to the present using your required return, and converts that into either a fair P/E ratio and a fair price if the EPS is provided.
 &lt;/p&gt;</description></item></channel></rss>