<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Piano Archives - Canton Music Academy</title>
	<atom:link href="https://www.cantonmusicacademy.com/category/piano/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Music Lessons for all ages</description>
	<lastBuildDate>Tue, 13 Oct 2026 12:15:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://www.cantonmusicacademy.com/wp-content/uploads/2023/02/cropped-canton-record-logo-150x150.jpg</url>
	<title>Piano Archives - Canton Music Academy</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">222841575</site>	<item>
		<title>Free Piano Scams: What to Know Before Accepting a “Free Piano” in Canton, MI</title>
		<link>https://www.cantonmusicacademy.com/free-piano-scams-canton-michigan/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Thu, 12 Jun 2025 17:17:32 +0000</pubDate>
				<category><![CDATA[Piano]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Piano Lessons]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1527</guid>

					<description><![CDATA[<p>At Canton Music Academy we get calls and emails all year from people offering to give away a piano. Many are generous neighbors downsizing. Others are scams aimed at music schools, churches and families. Here&#8217;s how to tell the difference before you lose money or end up with a piano you can&#8217;t use. 🚩 The...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/free-piano-scams-canton-michigan/">Free Piano Scams: What to Know Before Accepting a “Free Piano” in Canton, MI</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Free Piano Scams (rewrite)
  URL stays the same: /free-piano-scams-canton-michigan/
  WHERE: Posts → edit the post → delete all the old content blocks →
  add ONE "Custom HTML" block → paste everything below → Update → Delete Cache.
  Post title (H1), keep or use:  Free Piano Scams: What to Know Before Accepting a "Free Piano" in Canton, MI
  Yoast SEO title:               Free Piano Scams: How to Spot One | Canton Music Academy
  Yoast meta description:        Offered a free Yamaha baby grand? Learn how the free piano scam works,
                                 the red flags to watch for, and how to safely accept a real piano in Canton, MI.
  Keep the current featured image (piano-scam.jpg). No scripts.
============================================================= -->
<style>
.cmp{--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;--red:#c53030;font-family:Montserrat,sans-serif}
.cmp *{box-sizing:border-box}
.cmp .lead{font-size:1.18rem;line-height:1.7;color:var(--ink)}
.cmp .alert{display:flex;gap:16px;align-items:flex-start;background:#fdecec;border:1px solid #f5c2c2;border-radius:20px;padding:20px 24px;margin:8px 0 28px}
.cmp .alert .ic{font-size:1.9rem;line-height:1;flex:none}
.cmp .alert p{margin:0;color:var(--ink)}
.cmp .alert b{display:block;font-size:1.05rem;margin-bottom:4px;color:var(--red)}
.cmp .email{background:#fff;border:1px solid var(--line);border-radius:18px;margin:18px 0 22px;overflow:hidden;box-shadow:0 10px 26px rgba(26,32,44,.07)}
.cmp .email .hd{background:var(--soft);border-bottom:1px solid var(--line);padding:12px 18px;font-size:.85rem;color:var(--mut);line-height:1.5}
.cmp .email .hd b{color:var(--ink)}
.cmp .email .bd{padding:18px;font-style:italic;color:var(--ink);line-height:1.7}
.cmp .chain{counter-reset:c;display:grid;gap:10px;margin:18px 0 10px;padding:0;list-style:none}
.cmp .chain li{counter-increment:c;position:relative;background:var(--soft);border-radius:16px;padding:16px 18px 16px 66px;margin:0;line-height:1.55}
.cmp .chain li:before{content:counter(c);position:absolute;left:16px;top:14px;width:36px;height:36px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;display:flex;align-items:center;justify-content:center}
.cmp .chain li.bad{background:#fdecec}
.cmp .chain li.bad:before{background:var(--red)}
.cmp .chain b{display:block;color:var(--ink)}
.cmp .vs{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:18px 0 10px}
.cmp .vs .col{border-radius:20px;padding:20px 22px;border:1px solid var(--line)}
.cmp .vs .col.no{background:#fff7f7;border-color:#f5c2c2}
.cmp .vs .col.ok{background:#f0faf4;border-color:#bfe5cc}
.cmp .vs h3{margin:0 0 10px!important;font-size:1.05rem!important}
.cmp .vs ul{margin:0;padding:0;list-style:none}
.cmp .vs li{position:relative;padding-left:26px;margin:0 0 8px;font-size:.96rem;line-height:1.5}
.cmp .vs .no li:before{content:"✕";position:absolute;left:0;color:var(--red);font-weight:700}
.cmp .vs .ok li:before{content:"✓";position:absolute;left:0;color:#22803f;font-weight:700}
.cmp .check{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin:18px 0 10px}
.cmp .check div{background:#fff;border:1px solid var(--line);border-radius:16px;padding:16px 18px;line-height:1.5;font-size:.96rem}
.cmp .check div b{display:block;color:var(--ink);margin-bottom:2px}
.cmp .check div span{font-size:1.4rem;display:block;margin-bottom:6px}
.cmp .cost{background:var(--soft);border-radius:20px;padding:20px 24px;margin:18px 0}
.cmp .cost p{margin:0}
.cmp .res{display:grid;gap:10px;margin:16px 0 10px}
.cmp .res a{display:flex;justify-content:space-between;align-items:center;gap:12px;background:#fff;border:1px solid var(--line);border-radius:16px;padding:14px 18px;text-decoration:none!important;color:var(--ink)!important;font-weight:600}
.cmp .res a small{display:block;font-weight:500;color:var(--mut);font-size:.85rem}
.cmp .res a:after{content:"→";color:var(--b);font-weight:700}
.cmp .res a:hover{border-color:var(--b)}
.cmp .call{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px 20px;background:var(--ink);color:#fff;border-radius:22px;padding:24px 26px;margin:26px 0}
.cmp .call p{margin:0;color:#cbd5e0;font-size:.98rem}
.cmp .call p b{display:block;color:#fff;font-size:1.15rem}
.cmp .call a.btn{display:inline-block;background:var(--gold);color:var(--ink)!important;font-weight:700;padding:13px 24px;border-radius:999px;text-decoration:none!important;white-space:nowrap}
.cmp .call a.btn:hover{background:#fff}
.cmp details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmp summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmp summary::-webkit-details-marker{display:none}
.cmp summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmp details[open] summary:after{content:"–"}
.cmp details p{margin:0 0 16px;color:var(--mut)}
@media (max-width:640px){
  .cmp .vs,.cmp .check{grid-template-columns:1fr}
  .cmp .call{padding:22px 20px}
  .cmp .call a.btn{width:100%;text-align:center}
}
</style>

<div class="cmp">

<p class="lead">At Canton Music Academy we get calls and emails all year from people offering to give away a piano. Many are generous neighbors downsizing. Others are scams aimed at music schools, churches and families. Here&#8217;s how to tell the difference before you lose money or end up with a piano you can&#8217;t use.</p>

<div class="alert">
  <span class="ic" aria-hidden="true">🚩</span>
  <p><b>The #1 red flag</b>Anyone who asks you to pay before you&#8217;ve seen the piano in person is not giving you a gift. That includes shipping, a &#8220;deposit&#8221; or a moving fee.</p>
</div>

<h2>How the &#8220;Free Baby Grand Piano&#8221; Scam Works</h2>
<p>This scam has been going around for years, and it still catches people off guard. It almost always starts with a warm, emotional message like this one:</p>

<div class="email">
  <div class="hd"><b>From:</b> someone you don&#8217;t know<br><b>Subject:</b> Free Yamaha baby grand piano</div>
  <div class="bd">&#8220;Hello, I&#8217;m giving away my late husband&#8217;s Yamaha baby grand piano. It&#8217;s in great condition, but I&#8217;m downsizing and would love to see it go to someone who will appreciate it.&#8221;</div>
</div>

<p>There&#8217;s usually a nice photo, often copied from a real listing or a stock image. Once you reply, it plays out like this:</p>
<ol class="chain">
  <li><b>The piano is &#8220;in another state&#8221;</b>The owner has moved, or the piano is in storage somewhere far away.</li>
  <li><b>A &#8220;shipping company&#8221; will deliver it</b>You&#8217;re given a mover&#8217;s name or a website. It&#8217;s often fake or run by the scammer.</li>
  <li class="bad"><b>You&#8217;re asked to pay first</b>Usually $500–$1,000 to &#8220;hold&#8221; the piano or &#8220;coordinate the move,&#8221; with a promise that you&#8217;ll get it back.</li>
  <li class="bad"><b>The pressure starts</b>If you hesitate, you&#8217;re told you&#8217;ve already &#8220;committed.&#8221; Some messages hint at legal trouble or guilt to keep you paying. The piano never arrives.</li>
</ol>

<h2>Scam vs. Real Free Piano: Side by Side</h2>
<div class="vs">
  <div class="col no">
    <h3>Likely a scam</h3>
    <ul>
      <li>Piano is out of state or &#8220;in storage&#8221;</li>
      <li>They pick the moving or shipping company</li>
      <li>Money is needed before you see it</li>
      <li>Payment by wire, gift card, app or crypto</li>
      <li>Sad story, urgency and pressure</li>
      <li>Won&#8217;t let you visit or video call</li>
    </ul>
  </div>
  <div class="col ok">
    <h3>Likely legit</h3>
    <ul>
      <li>Piano is local and you can see it</li>
      <li>You choose and pay your own mover</li>
      <li>No money goes to the owner</li>
      <li>Happy to let you play it first</li>
      <li>Flexible on timing</li>
      <li>Can answer questions about its history</li>
    </ul>
  </div>
</div>

<h2>Local Free Pianos Can Be Real</h2>
<p>Plenty of people in Canton and nearby communities really do want to give a piano away. Pianos are big and heavy, often sit unplayed for years, and families who are downsizing or moving don&#8217;t want to see a loved instrument thrown out. These offers are often genuine, but it pays to go in with your eyes open.</p>

<h2>Tips for Safely Accepting a Free Piano</h2>
<div class="check">
  <div><span aria-hidden="true">👀</span><b>See it in person</b>Visit before you agree to anything, and play every key.</div>
  <div><span aria-hidden="true">🎵</span><b>Ask about tuning</b>When was it last tuned? Has it been maintained regularly?</div>
  <div><span aria-hidden="true">🔍</span><b>Check for damage</b>Look for sticking keys, a cracked soundboard and water damage.</div>
  <div><span aria-hidden="true">🚚</span><b>Hire your own mover</b>Never use a shipper the giver chooses. Use a local piano mover you&#8217;ve checked out yourself.</div>
</div>

<div class="cost">
  <p><b>Budget for the &#8220;free&#8221; part.</b> Every piano needs tuning after a move, and older pianos may need repairs. Sometimes moving and fixing a free piano costs more than the piano is worth, so get a piano technician&#8217;s opinion if you&#8217;re unsure.</p>
</div>

<h2>What If You Get a Good Piano for Free?</h2>
<p>Sometimes it works out perfectly. We&#8217;ve seen students and families bring home upright and console pianos in great shape, and they make wonderful practice instruments. Plan for a tuning soon after the move and you&#8217;ll be ready to play.</p>

<div class="call">
  <p><b>Got a piano? Let&#8217;s put it to use.</b>Private piano lessons in Canton for ages 5 through adult, beginner to advanced.</p>
  <a class="btn" href="https://www.cantonmusicacademy.com/piano-lessons-in-canton-mi/">Explore Piano Lessons</a>
</div>

<h2>Helpful Resources</h2>
<div class="res">
  <a href="https://www.michiganpianomoving.com/" target="_blank" rel="noopener">Michigan Piano Moving Company<small>Professional piano moving in Michigan</small></a>
  <a href="https://reportfraud.ftc.gov/" target="_blank" rel="noopener">Report a scam to the FTC<small>ReportFraud.ftc.gov</small></a>
  <a href="https://www.michigan.gov/ag/consumer-protection" target="_blank" rel="noopener">Michigan Attorney General: Consumer Protection<small>File a complaint or check scam alerts</small></a>
</div>
<p>Looking for a piano rather than giving one away? Facebook Marketplace and Craigslist can work if you always inspect first, and churches and schools sometimes give away instruments.</p>

<h2>Free Piano Scam FAQ</h2>
<details><summary>Is the free Yamaha baby grand piano email a scam?</summary><p>Almost always, yes. If the piano is out of state and you&#8217;re asked to pay a shipping company before you can see it, it&#8217;s a scam. Don&#8217;t send money and stop replying.</p></details>
<details><summary>I already paid. What should I do?</summary><p>Contact your bank or payment provider right away to try to stop or reverse the payment, then report it at ReportFraud.ftc.gov and to the Michigan Attorney General.</p></details>
<details><summary>Is a free piano worth it?</summary><p>It can be. A well-kept upright or console can be a great practice piano. Count on paying for professional moving and a tuning, and check its condition first so you don&#8217;t take on a piano that costs more to fix than it&#8217;s worth.</p></details>
<details><summary>Does Canton Music Academy accept piano donations?</summary><p>We don&#8217;t have room for donated pianos, but we gladly accept <a href="https://www.cantonmusicacademy.com/donate-sheet-music-canton-michigan/">sheet music and music books</a> and pass them on to students.</p></details>

<p>A piano can be a wonderful gift, so don&#8217;t let a scammer turn it into an expensive mistake. If it sounds too good to be true, especially when shipping is involved, it probably is. And if there really is a piano gathering dust in a neighbor&#8217;s living room, bring your checklist and a trusted mover, and enjoy it.</p>

</div>
<p>The post <a href="https://www.cantonmusicacademy.com/free-piano-scams-canton-michigan/">Free Piano Scams: What to Know Before Accepting a “Free Piano” in Canton, MI</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1527</post-id>	</item>
		<item>
		<title>Why Should I Learn Modes? (Interactive Mode Explorer)</title>
		<link>https://www.cantonmusicacademy.com/why-should-i-learn-modes/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Tue, 08 Oct 2024 12:33:17 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Piano]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1197</guid>

					<description><![CDATA[<p>As a guitarist, you&#8217;ve likely heard the term modes thrown around in discussions about theory or improvisation. If you&#8217;re anything like me, when you first encountered modes, it may have felt like a confusing new layer to an already complex subject. But once you hear them, modes become powerful tools that unlock new ways to...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">Why Should I Learn Modes? (Interactive Mode Explorer)</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Why Should I Learn Modes? (interactive)
  URL stays the same: /why-should-i-learn-modes/
  WHERE: Posts → edit "Why Should I Learn Modes?" → delete ALL old blocks
  (including the separate YouTube embed; the video is built into this block)
  → add ONE "Custom HTML" block → paste everything below → Update → Delete Cache.
  Post title (H1):        Why Should I Learn Modes? (Interactive Mode Explorer)
  Yoast SEO title:        Why Learn Modes? Hear All 7 Musical Modes | Canton Music Academy
  Yoast meta description: Hear and see all 7 modes, from bright Lydian to dark Locrian, in any key. Learn each mode's formula, characteristic note and sound on piano and guitar.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}

.cmx-modes{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
.cmx-mode{font-family:inherit;display:flex;flex-direction:column;align-items:center;gap:2px;background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:9px 4px;cursor:pointer;min-width:0;text-align:center}
.cmx-mode b{font-size:.88rem;color:var(--ink)}
.cmx-mode small{font-size:.62rem;color:var(--mut);font-weight:600;line-height:1.2}
.cmx-mode:hover{border-color:var(--b)}
.cmx-mode.on{background:var(--b);border-color:var(--b)}
.cmx-mode.on b,.cmx-mode.on small{color:#fff}
.cmx-parent{margin:6px 0 0!important;color:var(--mut)!important;font-size:.95rem!important}
.cmx-parent b{color:var(--ink)}
.cmx-mood{margin:0 0 14px!important;font-weight:600;color:var(--ink)!important;font-size:.98rem!important}
.cmx-ladder{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin:0 0 16px}
.cmx-rung{font-family:inherit;border:0;border-radius:8px;padding:8px 2px;font-size:.72rem;font-weight:800;cursor:pointer;opacity:.8;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cmx-rung.on{opacity:1;outline:3px solid var(--b);outline-offset:1px}
.cmx-notes-7 .cmx-note{flex:1 1 0;min-width:0;padding:10px 2px;max-width:none}
.cmx-notes-7 .cmx-note b{font-size:1.25rem}
.cmx-note.char{border-color:#22803f;background:#f0faf4}
.cmx-note.char .deg{background:#22803f;color:#fff}
.cmx-charline{margin:0 0 14px!important;font-size:.92rem!important;color:var(--ink)!important}
.cmx-dot{display:inline-block;width:10px;height:10px;border-radius:50%;background:#22803f;margin-right:8px;vertical-align:0}
.cmx-fbhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px}
.cmx-swipe{display:none;font-size:.78rem;font-weight:700;color:var(--mut)}
.cmx-fbwrap{background:#fff;border:1px solid var(--line);padding:6px}
.cmx-video{position:relative;aspect-ratio:16/9;border-radius:18px;overflow:hidden;background:#000;margin:10px 0 24px}
.cmx-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.cmx-byline{color:var(--mut)!important;font-style:italic}
@media (max-width:820px){.cmx-swipe{display:inline}}
@media (max-width:640px){
  .cmx-modes{grid-template-columns:repeat(4,1fr)}
  .cmx-ladder{grid-template-columns:repeat(7,1fr);gap:2px}
  .cmx-rung{font-size:.56rem;padding:7px 0}
  .cmx-notes-7{gap:4px}
  .cmx-notes-7 .cmx-note b{font-size:1rem}
}
#cmx-modes .cmx-kb svg{max-width:520px;margin:0 auto}

</style>

<div class="cmx">

<p class="cmx-lead">As a guitarist, you&#8217;ve likely heard the term <b>modes</b> thrown around in discussions about theory or improvisation. If you&#8217;re anything like me, when you first encountered modes, it may have felt like a confusing new layer to an already complex subject. But once you hear them, modes become powerful tools that unlock new ways to express yourself. Try them below.</p>

<div class="cmx-tool" id="cmx-modes"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the mode explorer…</p></div>

<h2>What Are Modes?</h2>
<p>A mode is a scale created from a parent scale by starting on a different note while keeping the same notes. For example, take the C major scale (C, D, E, F, G, A, B) and start on D, and you get the Dorian mode (D, E, F, G, A, B, C). The same idea applies to all seven modes, each starting on a different degree of the major scale:</p>
<ol class="wp-block-list">
  <li><b>Ionian</b> (the major scale)</li>
  <li><b>Dorian</b></li>
  <li><b>Phrygian</b></li>
  <li><b>Lydian</b></li>
  <li><b>Mixolydian</b></li>
  <li><b>Aeolian</b> (the natural minor scale)</li>
  <li><b>Locrian</b></li>
</ol>
<p>Even though the notes are shared, each mode sounds different because a different note becomes &#8220;home.&#8221; The explorer above lets you hear that by playing each mode over a drone on its root. Listen for the green <b>characteristic note</b>, the one note that gives each mode its personality.</p>

<h2>Why Modes Matter for Musicians</h2>
<h3>Expand your harmonic and melodic vocabulary</h3>
<p>Each mode has its own distinctive sound and mood. Dorian has a jazzy minor feel with a bright 6th, while Phrygian has an exotic, almost Spanish vibe with its flattened 2nd. Learning modes gives you a broader palette for everything from jazz and fusion to rock and metal.</p>
<h3>Improve your soloing</h3>
<p>Many guitarists hit a wall when soloing, defaulting to minor pentatonic or major scale shapes. Modes give you a fresh framework. Over a minor progression, instead of sticking to Aeolian (natural minor), try Dorian for a more colorful sound. Mixolydian is great over dominant 7th chords, giving your playing a bluesy or funky edge.</p>
<h3>Unlock new chord progressions</h3>
<p>Each mode implies a different harmonic landscape. Lydian&#8217;s raised 4th, for example, opens up chord possibilities that sound more unique than standard major and minor progressions.</p>
<h3>Better understand music theory</h3>
<p>Modes are a gateway to deeper theory. Instead of just memorizing patterns on the fretboard, you start to understand how harmony and melody interact, which helps you communicate with other musicians, write more sophisticated music, and even teach.</p>
<h3>Adapt to different genres</h3>
<p>Jazz guitarists frequently use Dorian and Mixolydian. Rock and metal players often reach for Phrygian and Locrian for darker, more aggressive sounds. Knowing modes makes you more versatile in any style.</p>

<h2>Video: Breaking Down the Mode Formula</h2>
<p>Check out my video for a deeper dive into modes and how to start using them in your music today.</p>
<div class="cmx-video"><iframe src="https://www.youtube.com/embed/W4YYO63jEsY" title="Major Scale Modes: Breaking Down the Mode Formula and Why Guitar Players Should Understand Them" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>

<h2>Modes FAQ</h2>
<details><summary>Which mode should I learn first?</summary><p>Start with Dorian and Mixolydian. They&#8217;re each one note away from the minor and major scales you already know, and they&#8217;re used constantly in rock, blues, funk and jazz.</p></details>
<details><summary>Are modes just the major scale starting on a different note?</summary><p>They use the same notes, but what makes a mode is which note feels like home. That&#8217;s why hearing a mode over a drone or a chord on its root is the best way to learn its sound.</p></details>
<details><summary>What&#8217;s the brightest and darkest mode?</summary><p>Lydian is the brightest and Locrian is the darkest. In between, from bright to dark: Ionian, Mixolydian, Dorian, Aeolian and Phrygian.</p></details>
<details><summary>Do modes work on piano and other instruments?</summary><p>Yes. Modes are part of music theory for every instrument; the explorer shows them on both piano and guitar.</p></details>

<p class="cmx-byline">By Henry Bahrou, Guitarist, Music Theorist, Music Academy School Director</p>

<p>Explore <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">guitar lessons for all ages</a> at Canton Music Academy, try the <a href="https://www.cantonmusicacademy.com/minor-pentatonic-scales/">minor pentatonic fretboard</a> and <a href="https://www.cantonmusicacademy.com/circle-of-fifths-chart/">interactive circle of fifths</a>, or visit our <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Guitar Theory Hub</a>.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogTW9kZSBleHBsb3JlciDigJQgdXNlcyB3aW5kb3cuQ01LICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC1tb2RlcycpOwogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScpKSByZXR1cm47CiAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknLCAnMScpOwogIHZhciBLID0gd2luZG93LkNNSywgaCA9IEsuaDsKICB2YXIgVFVOID0gWzQwLCA0NSwgNTAsIDU1LCA1OSwgNjRdLCBPUEVOID0gWydFJywgJ0EnLCAnRCcsICdHJywgJ0InLCAnRSddOwogIHZhciBNQUogPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBNT0RFUyA9IFsKICAgIHsgbjogJ0lvbmlhbicsIGFsaWFzOiAnTWFqb3Igc2NhbGUnLCBjaDogNywgbW9vZDogJ0JyaWdodCwgaGFwcHkgYW5kIHNldHRsZWQnLCB1c2U6ICdQb3AsIHJvY2ssIGNvdW50cnksIGNsYXNzaWNhbCcsIHdoeTogJ3RoZSBuYXR1cmFsIDd0aCBwdWxscyBzdHJvbmdseSBiYWNrIGhvbWUnIH0sCiAgICB7IG46ICdEb3JpYW4nLCBhbGlhczogJ01pbm9yIHdpdGggYSBuYXR1cmFsIDYnLCBjaDogNiwgbW9vZDogJ01pbm9yLCBidXQgaG9wZWZ1bCBhbmQgYSBsaXR0bGUgamF6enknLCB1c2U6ICdKYXp6LCBmdW5rLCBzb3VsLCBjbGFzc2ljIHJvY2snLCB3aHk6ICd0aGUgbmF0dXJhbCA2dGggYnJpZ2h0ZW5zIGFuIG90aGVyd2lzZSBtaW5vciBzb3VuZCcgfSwKICAgIHsgbjogJ1BocnlnaWFuJywgYWxpYXM6ICdNaW5vciB3aXRoIGEg4pmtMicsIGNoOiAyLCBtb29kOiAnRGFyaywgd2l0aCBhIFNwYW5pc2ggb3IgZmxhbWVuY28gZWRnZScsIHVzZTogJ0ZsYW1lbmNvLCBtZXRhbCwgZmlsbSBtdXNpYycsIHdoeTogJ3RoZSDima0yIHNpdHMgYSBoYWxmIHN0ZXAgYWJvdmUgdGhlIHJvb3QnIH0sCiAgICB7IG46ICdMeWRpYW4nLCBhbGlhczogJ01ham9yIHdpdGggYSDima80JywgY2g6IDQsIG1vb2Q6ICdEcmVhbXksIGZsb2F0aW5nIGFuZCBleHRyYSBicmlnaHQnLCB1c2U6ICdGaWxtIHNjb3JlcywgamF6eiwgcHJvZ3Jlc3NpdmUgcm9jaycsIHdoeTogJ3RoZSDima80IGxpZnRzIHRoZSBtYWpvciBzb3VuZCBldmVuIGhpZ2hlcicgfSwKICAgIHsgbjogJ01peG9seWRpYW4nLCBhbGlhczogJ01ham9yIHdpdGggYSDima03JywgY2g6IDcsIG1vb2Q6ICdNYWpvciB3aXRoIGEgYmx1ZXN5LCBsYWlkLWJhY2sgZWRnZScsIHVzZTogJ0JsdWVzLCByb2NrLCBmdW5rLCBmb2xrJywgd2h5OiAndGhlIOKZrTcgc29mdGVucyB0aGUgcHVsbCBiYWNrIHRvIHRoZSByb290JyB9LAogICAgeyBuOiAnQWVvbGlhbicsIGFsaWFzOiAnTmF0dXJhbCBtaW5vciBzY2FsZScsIGNoOiA2LCBtb29kOiAnU2FkLCBzZXJpb3VzLCB0aGUgY2xhc3NpYyBtaW5vciBzb3VuZCcsIHVzZTogJ1JvY2ssIHBvcCwgY2xhc3NpY2FsLCBtZXRhbCcsIHdoeTogJ3RoZSDima02IGdpdmVzIG1pbm9yIGl0cyBkYXJrZXIgY29sb3InIH0sCiAgICB7IG46ICdMb2NyaWFuJywgYWxpYXM6ICdEaW1pbmlzaGVkLCB3aXRoIGEg4pmtNScsIGNoOiA1LCBtb29kOiAnVW5zdGFibGUsIHRlbnNlIGFuZCB2ZXJ5IGRhcmsnLCB1c2U6ICdNZXRhbCwgamF6eiBvdmVyIG034pmtNSBjaG9yZHMnLCB3aHk6ICd0aGUg4pmtNSBtZWFucyB0aGVyZSBpcyBubyBzdGFibGUgNXRoIGF0IGFsbCcgfQogIF07CiAgdmFyIEJSSUdIVCA9IFszLCAwLCA0LCAxLCA1LCAyLCA2XTsKICB2YXIgUk9PVFMgPSBbJ0MnLCAnRGInLCAnRCcsICdFYicsICdFJywgJ0YnLCAnRiMnLCAnRycsICdBYicsICdBJywgJ0JiJywgJ0InXTsKICB2YXIgRU5IID0geyBEYjogJ0MjJywgRWI6ICdEIycsICdGIyc6ICdHYicsIEFiOiAnRyMnLCBCYjogJ0EjJywgJ0MjJzogJ0RiJywgJ0QjJzogJ0ViJywgR2I6ICdGIycsICdHIyc6ICdBYicsICdBIyc6ICdCYicgfTsKICB2YXIgU1REID0gWydDJywgJ0cnLCAnRCcsICdBJywgJ0UnLCAnQicsICdGIycsICdDIycsICdGJywgJ0JiJywgJ0ViJywgJ0FiJywgJ0RiJywgJ0diJywgJ0NiJ107CiAgdmFyIHN0YXRlID0geyByb290OiAnRCcsIG1vZGU6IDEsIGxhYmVsczogJ25vdGVzJyB9OwogIChmdW5jdGlvbiBmcm9tSGFzaCgpIHsKICAgIHZhciBtID0gbG9jYXRpb24uaGFzaC5tYXRjaCgvbW9kZT0oW0EtR11bI2JdPyktKFx3KykvKTsKICAgIGlmICghbSkgcmV0dXJuOwogICAgdmFyIHIgPSBST09UUy5pbmRleE9mKG1bMV0pID49IDAgPyBtWzFdIDogKEVOSFttWzFdXSAmJiBST09UUy5pbmRleE9mKEVOSFttWzFdXSkgPj0gMCA_IEVOSFttWzFdXSA6IG51bGwpOwogICAgdmFyIG1pID0gTU9ERVMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Lm4udG9Mb3dlckNhc2UoKTsgfSkuaW5kZXhPZihtWzJdLnRvTG93ZXJDYXNlKCkpOwogICAgaWYgKHIpIHN0YXRlLnJvb3QgPSByOyBpZiAobWkgPj0gMCkgc3RhdGUubW9kZSA9IG1pOwogIH0pKCk7CiAgZnVuY3Rpb24gcHJldHR5KG4pIHsgcmV0dXJuIG4ucmVwbGFjZSgnIycsICfima8nKS5yZXBsYWNlKC9iJC8sICfima0nKTsgfQogIGZ1bmN0aW9uIGFzY2lpT2Yoc3ApIHsgcmV0dXJuIEsuTEVUW3NwLmxdICsgKHNwLmEgPiAwID8gbmV3IEFycmF5KHNwLmEgKyAxKS5qb2luKCcjJykgOiBuZXcgQXJyYXkoLXNwLmEgKyAxKS5qb2luKCdiJykpOyB9CiAgZnVuY3Rpb24gc2VtaXMoaSkgeyByZXR1cm4gWzAsIDEsIDIsIDMsIDQsIDUsIDZdLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gKE1BSlsoaSArIGspICUgN10gLSBNQUpbaV0gKyAxMikgJSAxMjsgfSk7IH0KICBmdW5jdGlvbiBidWlsZChyb290TmFtZSkgewogICAgdmFyIHIgPSBLLnBhcnNlTm90ZShyb290TmFtZSksIGkgPSBzdGF0ZS5tb2RlLCBzbSA9IHNlbWlzKGkpOwogICAgdmFyIHBhcmVudCA9IEsuc3BlbGwoci5sIC0gaSwgci5wYyAtIE1BSltpXSk7CiAgICB2YXIgbm90ZXMgPSBzbS5tYXAoZnVuY3Rpb24gKHMsIGspIHsgcmV0dXJuIHsgZGVnOiBrICsgMSwgc2VtaXM6IHMsIG5vdGU6IEsubm90ZUF0KHIsIGsgKyAxLCBzKSwgbGFiZWw6IEsuZGVncmVlTGFiZWwoayArIDEsIHMpIH07IH0pOwogICAgcmV0dXJuIHsgcjogciwgcm9vdE5hbWU6IHJvb3ROYW1lLCBwYXJlbnQ6IHBhcmVudCwgbm90ZXM6IG5vdGVzLCBzbTogc20gfTsKICB9CiAgZnVuY3Rpb24gY3VycmVudCgpIHsKICAgIHZhciBhID0gYnVpbGQoc3RhdGUucm9vdCk7CiAgICBpZiAoU1RELmluZGV4T2YoYXNjaWlPZihhLnBhcmVudCkpIDwgMCAmJiBFTkhbc3RhdGUucm9vdF0pIHsgdmFyIGIgPSBidWlsZChFTkhbc3RhdGUucm9vdF0pOyBpZiAoU1RELmluZGV4T2YoYXNjaWlPZihiLnBhcmVudCkpID49IDApIHJldHVybiBiOyB9CiAgICByZXR1cm4gYTsKICB9CiAgZnVuY3Rpb24gY2hvcmRPZihjKSB7CiAgICB2YXIgczMgPSBjLnNtWzJdLCBzNSA9IGMuc21bNF0sIHM3ID0gYy5zbVs2XTsKICAgIHZhciBzeW0gPSBzMyA9PT0gNCA_IChzNyA9PT0gMTEgPyAnbWFqNycgOiAnNycpIDogKHM1ID09PSA2ID8gJ2034pmtNScgOiAnbTcnKTsKICAgIHJldHVybiB7IG5hbWU6IGMubm90ZXNbMF0ubm90ZS5uYW1lICsgc3ltLCBtaWRpczogWzAsIDIsIDQsIDZdLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gNDggKyBjLnIucGMgKyBjLnNtW2tdOyB9KSB9OwogIH0KCiAgdmFyIGVscyA9IHt9LCB0aW1lcnMgPSBbXTsKICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBvbiwgZm4sIGNscykgeyByZXR1cm4gaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1jaGlwJyArIChvbiA_ICcgb24nIDogJycpICsgKGNscyA_ICcgJyArIGNscyA6ICcnKSwgJ2FyaWEtcHJlc3NlZCc6IG9uID8gJ3RydWUnIDogJ2ZhbHNlJywgb25jbGljazogZm4gfSwgW2xhYmVsXSk7IH0KICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICBzdG9wKCk7CiAgICB2YXIgYyA9IGN1cnJlbnQoKSwgTSA9IE1PREVTW3N0YXRlLm1vZGVdOwogICAgdHJ5IHsgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsICcjbW9kZT0nICsgYy5yb290TmFtZSArICctJyArIE0ubi50b0xvd2VyQ2FzZSgpKTsgfSBjYXRjaCAoZSkge30KICAgIGVscy5yb290cy5pbm5lckhUTUwgPSAnJzsKICAgIFJPT1RTLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgZWxzLnJvb3RzLmFwcGVuZENoaWxkKGNoaXAocHJldHR5KHIpLCByID09PSBzdGF0ZS5yb290LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnJvb3QgPSByOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIGVscy5tb2Rlcy5pbm5lckhUTUwgPSAnJzsKICAgIE1PREVTLmZvckVhY2goZnVuY3Rpb24gKG0sIGkpIHsgZWxzLm1vZGVzLmFwcGVuZENoaWxkKGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtbW9kZScgKyAoaSA9PT0gc3RhdGUubW9kZSA_ICcgb24nIDogJycpLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IHN0YXRlLm1vZGUgPSBpOyByZW5kZXIoKTsgfSB9LCBbaCgnYicsIHsgdGV4dDogbS5uIH0pLCBoKCdzbWFsbCcsIHsgdGV4dDogbS5hbGlhcyB9KV0pKTsgfSk7CiAgICBlbHMubGFicy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ25vdGVzJywgJ05vdGUgbmFtZXMnXSwgWydkZWdyZWVzJywgJ1NjYWxlIGRlZ3JlZXMnXV0uZm9yRWFjaChmdW5jdGlvbiAobykgeyBlbHMubGFicy5hcHBlbmRDaGlsZChjaGlwKG9bMV0sIG9bMF0gPT09IHN0YXRlLmxhYmVscywgZnVuY3Rpb24gKCkgeyBzdGF0ZS5sYWJlbHMgPSBvWzBdOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIHZhciBybiA9IGMubm90ZXNbMF0ubm90ZS5uYW1lOwogICAgZWxzLnRpdGxlLnRleHRDb250ZW50ID0gcm4gKyAnICcgKyBNLm47CiAgICBlbHMucGFyZW50LmlubmVySFRNTCA9ICcnOwogICAgZWxzLnBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnU2FtZSBub3RlcyBhcyAnKSk7CiAgICBlbHMucGFyZW50LmFwcGVuZENoaWxkKGgoJ2InLCB7IHRleHQ6IGMucGFyZW50Lm5hbWUgKyAnIG1ham9yJyB9KSk7CiAgICBlbHMucGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcsIHN0YXJ0aW5nIG9uICcgKyBybiArIChzdGF0ZS5tb2RlID8gJycgOiAnIChpdCBpcyB0aGUgbWFqb3Igc2NhbGUpJykgKyAnLicpKTsKICAgIGVscy5tb29kLnRleHRDb250ZW50ID0gTS5tb29kICsgJy4gVXNlZCBpbjogJyArIE0udXNlICsgJy4nOwogICAgZWxzLmxhZGRlci5pbm5lckhUTUwgPSAnJzsKICAgIEJSSUdIVC5mb3JFYWNoKGZ1bmN0aW9uIChtaSwgaykgewogICAgICB2YXIgdHQgPSBrIC8gNiwgbWl4ID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIE1hdGgucm91bmQoYSArIChiIC0gYSkgKiB0dCk7IH07CiAgICAgIGVscy5sYWRkZXIuYXBwZW5kQ2hpbGQoaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1ydW5nJyArIChtaSA9PT0gc3RhdGUubW9kZSA_ICcgb24nIDogJycpLCBzdHlsZTogJ2JhY2tncm91bmQ6cmdiKCcgKyBtaXgoMjQyLCAyNikgKyAnLCcgKyBtaXgoMTc4LCAzMikgKyAnLCcgKyBtaXgoNTEsIDQ0KSArICcpO2NvbG9yOicgKyAodHQgPCAwLjQ1ID8gJyMxQTIwMkMnIDogJyNmZmYnKSwgb25jbGljazogZnVuY3Rpb24gKCkgeyBzdGF0ZS5tb2RlID0gbWk7IHJlbmRlcigpOyB9IH0sIFtNT0RFU1ttaV0ubl0pKTsKICAgIH0pOwogICAgZWxzLm5vdGVzLmlubmVySFRNTCA9ICcnOwogICAgYy5ub3Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgIHZhciBpc0NoID0gbi5kZWcgPT09IE0uY2g7CiAgICAgIGVscy5ub3Rlcy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtbm90ZScgKyAobi5kZWcgPT09IDEgPyAnIHJvb3QnIDogJycpICsgKGlzQ2ggPyAnIGNoYXInIDogJycpIH0sIFtoKCdiJywgeyB0ZXh0OiBuLm5vdGUubmFtZSB9KSwgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2RlZycsIHRleHQ6IG4ubGFiZWwgfSldKSk7CiAgICB9KTsKICAgIHZhciBjaG4gPSBjLm5vdGVzW00uY2ggLSAxXTsKICAgIGVscy5jaGFybGluZS5pbm5lckhUTUwgPSAnJzsKICAgIGVscy5jaGFybGluZS5hcHBlbmRDaGlsZChoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWRvdCcgfSkpOwogICAgZWxzLmNoYXJsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdDaGFyYWN0ZXJpc3RpYyBub3RlOiAnKSk7CiAgICBlbHMuY2hhcmxpbmUuYXBwZW5kQ2hpbGQoaCgnYicsIHsgdGV4dDogY2huLmxhYmVsICsgJyAoJyArIGNobi5ub3RlLm5hbWUgKyAnKScgfSkpOwogICAgZWxzLmNoYXJsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcg4oCUICcgKyBNLndoeSArICcuJykpOwogICAgdmFyIGNkID0gY2hvcmRPZihjKTsKICAgIGVscy5jaG9yZEJ0bi50ZXh0Q29udGVudCA9ICfilrYgUGxheSAnICsgY2QubmFtZTsKICAgIGVscy5jb21wYXJlQnRuLnRleHRDb250ZW50ID0gJ0NvbXBhcmUgd2l0aCAnICsgKHJlZklkeCgpID09PSA1ID8gJ25hdHVyYWwgbWlub3InIDogJ21ham9yJyk7CiAgICB2YXIgb24gPSB7fSwgcm9vdE9mZiA9IG51bGwsIHN0YXJ0ID0gNDgsIGFsdEsgPSB7fTsKICAgIGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobikgeyB2YXIgbSA9IDQ4ICsgYy5yLnBjICsgbi5zZW1pczsgb25bbSAtIHN0YXJ0XSA9IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IG4ubm90ZS5uYW1lIDogbi5sYWJlbDsgaWYgKG4uZGVnID09PSAxKSByb290T2ZmID0gbSAtIHN0YXJ0OyBpZiAobi5kZWcgPT09IE0uY2gpIGFsdEtbbSAtIHN0YXJ0XSA9IDE7IH0pOwogICAgb25bNDggKyBjLnIucGMgKyAxMiAtIHN0YXJ0XSA9IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IHJuIDogJzEnOwogICAgZWxzLmtiLmlubmVySFRNTCA9ICcnOyBlbHMua2IuYXBwZW5kQ2hpbGQoSy5rZXlib2FyZCh7IG9jdGF2ZXM6IDIsIG9uOiBvbiwgcm9vdDogcm9vdE9mZiwgYWx0OiBhbHRLIH0pKTsKICAgIHZhciBtYXJrcyA9IFtdOwogICAgZm9yICh2YXIgcyA9IDA7IHMgPCA2OyBzKyspIGZvciAodmFyIGYgPSAwOyBmIDw9IDEyOyBmKyspIHsKICAgICAgdmFyIHBjID0gKFRVTltzXSArIGYpICUgMTI7CiAgICAgIGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobikgeyBpZiAobi5ub3RlLnBjID09PSBwYykgbWFya3MucHVzaCh7IHM6IHMsIGY6IGYsIGtpbmQ6IG4uZGVnID09PSAxID8gJ3Jvb3QnIDogbi5kZWcgPT09IE0uY2ggPyAnYWx0JyA6ICdub3RlJywgbGFiZWw6IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IG4ubm90ZS5uYW1lIDogbi5sYWJlbCwgY2xpY2s6IHRhcChUVU5bc10gKyBmLCBzLCBmKSB9KTsgfSk7CiAgICB9CiAgICBlbHMuZmIuaW5uZXJIVE1MID0gJyc7IGVscy5mYi5hcHBlbmRDaGlsZChLLmZyZXRib2FyZChUVU4sIG1hcmtzLCB7IGZyZXRzOiAxMiwgb3Blbk5hbWVzOiBPUEVOIH0pKTsKICB9CiAgZnVuY3Rpb24gdGFwKG0sIHMsIGYpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttXSwgJ2Jsb2NrJywgeyBkdXI6IDEsIHZvbDogMC41IH0pOyB9OyB9CiAgZnVuY3Rpb24gc3RvcCgpIHsgdGltZXJzLmZvckVhY2goY2xlYXJUaW1lb3V0KTsgdGltZXJzID0gW107IH0KICBmdW5jdGlvbiBzY2FsZU1pZGlzKHNtLCByKSB7IHZhciBiID0gNjAgKyByLnBjOyBpZiAoYiA-IDY2KSBiIC09IDEyOyB2YXIgdXAgPSBzbS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGIgKyB4OyB9KS5jb25jYXQoW2IgKyAxMl0pOyByZXR1cm4gdXAuY29uY2F0KHVwLnNsaWNlKDAsIC0xKS5yZXZlcnNlKCkpOyB9CiAgZnVuY3Rpb24gcGxheVNlcShzZXEsIGRlbGF5LCB3aXRoRHJvbmUsIHIpIHsKICAgIHZhciBzdGVwID0gMzMwOwogICAgaWYgKHdpdGhEcm9uZSkgSy5kcm9uZSgzNiArIHIucGMgKyAoci5wYyA-IDcgPyAwIDogMTIpLCAoc2VxLmxlbmd0aCAqIHN0ZXApIC8gMTAwMCArIDAuOCk7CiAgICBzZXEuZm9yRWFjaChmdW5jdGlvbiAobSwgaSkgeyB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttXSwgJ2Jsb2NrJywgeyBkdXI6IDAuNTUsIHZvbDogMC40MiB9KTsgfSwgZGVsYXkgKyBpICogc3RlcCkpOyB9KTsKICAgIHJldHVybiBkZWxheSArIHNlcS5sZW5ndGggKiBzdGVwOwogIH0KICBmdW5jdGlvbiBwbGF5TW9kZSgpIHsgc3RvcCgpOyB2YXIgYyA9IGN1cnJlbnQoKTsgcGxheVNlcShzY2FsZU1pZGlzKGMuc20sIGMuciksIDAsIHRydWUsIGMucik7IH0KICBmdW5jdGlvbiByZWZJZHgoKSB7IHZhciBNID0gc3RhdGUubW9kZTsgcmV0dXJuIE0gPT09IDAgPyA1IDogTSA9PT0gNSA_IDAgOiAoWzEsIDIsIDZdLmluZGV4T2YoTSkgPj0gMCA_IDUgOiAwKTsgfQogIGZ1bmN0aW9uIGNvbXBhcmUoKSB7CiAgICBzdG9wKCk7IHZhciBjID0gY3VycmVudCgpOwogICAgdmFyIHJJID0gcmVmSWR4KCk7CiAgICB2YXIgcmVmID0gc2VtaXMockkpOwogICAgdmFyIHVwID0gZnVuY3Rpb24gKHNtKSB7IHZhciBiID0gNjAgKyBjLnIucGM7IGlmIChiID4gNjYpIGIgLT0gMTI7IHJldHVybiBzbS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGIgKyB4OyB9KS5jb25jYXQoW2IgKyAxMl0pOyB9OwogICAgdmFyIHQgPSBwbGF5U2VxKHVwKHJlZiksIDAsIHRydWUsIGMucik7CiAgICB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcGxheVNlcSh1cChjLnNtKSwgMCwgdHJ1ZSwgYy5yKTsgfSwgdCArIDUwMCkpOwogIH0KICBmdW5jdGlvbiBidWlsZDIoKSB7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgZWxzLnJvb3RzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIGVscy5tb2RlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1tb2RlcycgfSk7CiAgICBlbHMubGFicyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7CiAgICBlbHMudGl0bGUgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtYmlnJyB9KTsKICAgIGVscy5wYXJlbnQgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXBhcmVudCcgfSk7CiAgICBlbHMubW9vZCA9IGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtbW9vZCcgfSk7CiAgICBlbHMubGFkZGVyID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWxhZGRlcicgfSk7CiAgICBlbHMubm90ZXMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtbm90ZXMgY214LW5vdGVzLTcnIH0pOwogICAgZWxzLmNoYXJsaW5lID0gaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1jaGFybGluZScgfSk7CiAgICBlbHMua2IgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgta2InIH0pOwogICAgZWxzLmZiID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZid3JhcCcgfSk7CiAgICBlbHMuY2hvcmRCdG4gPSBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCcsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc3RvcCgpOyB2YXIgYyA9IGN1cnJlbnQoKTsgSy5wbGF5KGNob3JkT2YoYykubWlkaXMsICdzdHJ1bScpOyB9IH0pOwogICAgZWxzLmNvbXBhcmVCdG4gPSBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCcsIG9uY2xpY2s6IGNvbXBhcmUgfSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkJyB9LCBbCiAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1Jvb3Qgbm90ZScgfSksIGVscy5yb290cywKICAgICAgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCBzdHlsZTogJ21hcmdpbi10b3A6MTRweCcsIHRleHQ6ICdNb2RlJyB9KSwgZWxzLm1vZGVzCiAgICBdKSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkIGNteC1yZXN1bHQnIH0sIFsKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXJoZWFkJyB9LCBbaCgnZGl2Jywge30sIFtlbHMudGl0bGUsIGVscy5wYXJlbnRdKSwgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBsYXknIH0sIFtoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogcGxheU1vZGUgfSwgWyfilrYgUGxheSBvdmVyIGRyb25lJ10pXSldKSwKICAgICAgZWxzLm1vb2QsCiAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ0JyaWdodGVzdCDihpIgZGFya2VzdCcgfSksIGVscy5sYWRkZXIsCiAgICAgIGVscy5ub3RlcywgZWxzLmNoYXJsaW5lLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtcGxheScsIHN0eWxlOiAnbWFyZ2luOjAgMCAxNHB4JyB9LCBbZWxzLmNob3JkQnRuLCBlbHMuY29tcGFyZUJ0bl0pLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtZmJoZWFkJyB9LCBbZWxzLmxhYnMsIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtc3dpcGUnLCB0ZXh0OiAnU3dpcGUgdG8gc2VlIHRoZSB3aG9sZSBuZWNrIOKGkicgfSldKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBhbmVsJywgc3R5bGU6ICdtYXJnaW4tYm90dG9tOjEwcHgnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdQaWFubycgfSksIGVscy5rYl0pLAogICAgICBlbHMuZmIsCiAgICAgIGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtY2Rub3RlJywgdGV4dDogJ0dvbGQgPSByb290IMK3IEdyZWVuID0gY2hhcmFjdGVyaXN0aWMgbm90ZSDCtyBUYXAgYW55IG5vdGUgdG8gaGVhciBpdCcgfSkKICAgIF0pKTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZDIoKTsKfSkoKTsK".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">Why Should I Learn Modes? (Interactive Mode Explorer)</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1197</post-id>	</item>
		<item>
		<title>Chord Spelling Calculator</title>
		<link>https://www.cantonmusicacademy.com/chord-calculator/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Fri, 04 Oct 2024 02:51:20 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Piano]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1181</guid>

					<description><![CDATA[<p>Pick any root note and chord type to see exactly which notes are in the chord, how it&#8217;s built, and how to play it on piano, guitar or ukulele. Tap play to hear it. Loading the chord calculator… How to Use the Chord Spelling Calculator Start by choosing a root note. All 17 note names...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/chord-calculator/">Chord Spelling Calculator</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Chord Spelling Calculator (interactive)
  URL stays the same: /chord-calculator/
  WHERE: Posts → edit "Chord Spelling Calculator" → delete ALL old blocks
  (including the old calculator code and images) → add ONE "Custom HTML"
  block → paste everything below → Update → Delete Cache.
  Yoast SEO title:        Chord Spelling Calculator: Notes in Any Chord | Canton Music Academy
  Yoast meta description: Free chord spelling calculator. Pick any root and chord type to see the notes,
                          formula and intervals, plus piano, guitar and ukulele shapes you can hear.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}


</style>

<div class="cmx">

<p class="cmx-lead">Pick any root note and chord type to see exactly which notes are in the chord, how it&#8217;s built, and how to play it on piano, guitar or ukulele. Tap play to hear it.</p>

<div class="cmx-tool" id="cmx-chord"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the chord calculator…</p></div>

<h2>How to Use the Chord Spelling Calculator</h2>
<p>Start by choosing a root note. All 17 note names are here, including sharps and flats like C♯ and D♭, so your chord is always spelled the way you&#8217;d see it written in music. Then choose a chord type: triads, 6th and 7th chords, or extended chords like 9ths, 11ths and 13ths.</p>
<p>The calculator instantly shows the notes in the chord, each note&#8217;s role (root, 3rd, 5th, 7th and so on), the chord formula, and the chord on a piano keyboard and a guitar or ukulele diagram. You can also flip through the inversions to see which note ends up in the bass.</p>
<p>For example, choose <b>A</b> and <b>m7</b> to see that A minor 7th is spelled <b>A – C – E – G</b>, with the formula 1 – ♭3 – 5 – ♭7.</p>

<h2>Why Chord Spelling Matters</h2>
<p>Every chord is built by stacking notes in a pattern above its root. Knowing a chord&#8217;s spelling helps you:</p>
<ul class="wp-block-list">
  <li>Read and write chords correctly in sheet music</li>
  <li>Find new voicings and inversions on your instrument</li>
  <li>Understand why progressions sound the way they do</li>
  <li>Communicate clearly with bandmates and teachers</li>
</ul>
<p>Spelling also follows letter names. A C major chord in the key of D♭ isn&#8217;t spelled with an E♯; a D♭ major chord is D♭ – F – A♭, not C♯ – F – G♯. The calculator always uses the correct letters, which is exactly what music theory exams and lead sheets expect.</p>

<h2>Chord Spelling FAQ</h2>
<details><summary>What&#8217;s the difference between a chord&#8217;s formula and its spelling?</summary><p>The formula is the pattern (like 1 – 3 – 5 for a major chord) and works in every key. The spelling is the actual notes you get when you apply that formula to a specific root, like C – E – G.</p></details>
<details><summary>What is a chord inversion?</summary><p>An inversion is the same chord with a different note in the bass. C major in root position is C – E – G; first inversion puts E on the bottom (C/E), and second inversion puts G on the bottom (C/G).</p></details>
<details><summary>Why does the guitar shape leave out a note on big chords?</summary><p>Chords like 11ths and 13ths have more notes than you can comfortably play, so guitarists usually leave out the 5th (and sometimes other notes). The calculator does the same to give you a playable shape.</p></details>
<details><summary>What does ♭ or ♯ in the formula mean?</summary><p>It compares each note to the major scale. ♭3 means the 3rd is a half step lower than in the major scale, which is what makes a chord minor.</p></details>

<p>Want to put chords together? Try our free <a href="https://www.cantonmusicacademy.com/chord-progression-builder/">Chord Progression Builder</a> to create, hear and print your own progressions. For a full breakdown of scales and chords, see the <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Music Theory Guide for Guitar</a>, or learn with a teacher in our <a href="https://www.cantonmusicacademy.com/music-lessons-in-canton-mi/">music lessons in Canton</a>.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290OwogICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvY3Q7IG8rKykgV0kuZm9yRWFjaChmdW5jdGlvbiAoc2VtLCBpKSB7CiAgICAgIHZhciBuID0gbyAqIDEyICsgc2VtLCB4ID0gKG8gKiA3ICsgaSkgKiB3dyArIDAuNSwgaGl0ID0gb25bbl0gIT09IHVuZGVmaW5lZDsKICAgICAgcygncmVjdCcsIHsgeDogeCwgeTogMC41LCB3aWR0aDogd3csIGhlaWdodDogd2gsIHJ4OiA0LCBmaWxsOiBoaXQgPyAobiA9PT0gcm9vdCA_ICcjRjJCMjMzJyA6ICcjMDQ3N0JGJykgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyAobjIgPT09IHJvb3QgPyAnI0YyQjIzMycgOiAnIzA0NzdCRicpIDogJyMxQTIwMkMnLCBzdHJva2U6ICcjMUEyMDJDJywgJ3N0cm9rZS13aWR0aCc6IDEgfSwgZWwpOwogICAgICBpZiAoaGl0MiAmJiBvbltuMl0pIHMoJ3RleHQnLCB7IHg6IHgyICsgYncgLyAyLCB5OiBiaCAtIDgsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogOS41LCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6IG4yID09PSByb290ID8gJyMxQTIwMkMnIDogJyNmZmYnLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb25bbjJdKTsKICAgIH0KICAgIHJldHVybiBlbDsKICB9CgogIC8qIGZyZXR0ZWQgY2hvcmQgZGlhZ3JhbTogZnJldHMgYXJyYXkgbG93LT5oaWdoICgtMSBtdXRlKSwgbGFiZWxzIG9wdGlvbmFsICovCiAgZnVuY3Rpb24gZnJldEJhcnJlKGZyZXRzKSB7CiAgICB2YXIgZnIgPSBmcmV0cy5maWx0ZXIoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPiAwOyB9KTsKICAgIGlmICghZnIubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciBsbyA9IE1hdGgubWluLmFwcGx5KG51bGwsIGZyKSwgZmlyc3QgPSAtMSwgbiA9IDA7CiAgICBmcmV0cy5mb3JFYWNoKGZ1bmN0aW9uIChmLCBpKSB7IGlmIChmID09PSBsbykgeyBuKys7IGlmIChmaXJzdCA8IDApIGZpcnN0ID0gaTsgfSB9KTsKICAgIGlmIChuIDwgMiB8fCBmcmV0c1tmcmV0cy5sZW5ndGggLSAxXSAhPT0gbG8pIHJldHVybiBudWxsOwogICAgZm9yICh2YXIgaSA9IGZpcnN0OyBpIDwgZnJldHMubGVuZ3RoOyBpKyspIGlmIChmcmV0c1tpXSA8IGxvKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7IGZyZXQ6IGxvLCBmcm9tOiBmaXJzdCB9OwogIH0KICBmdW5jdGlvbiBjaG9yZERpYWdyYW0odiwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgbiA9IHYgPyB2LmZyZXRzLmxlbmd0aCA6IChvcHRzLnN0cmluZ3MgfHwgNiksIHNwID0gMjIsIGZzID0gMjYsIFcgPSBzcCAqIChuIC0gMSksIHBhZEwgPSAzMCwgcGFkVCA9IDM0OwogICAgdmFyIGVsID0gc3ZnKFcgKyBwYWRMICsgMjQsIGZzICogNSArIHBhZFQgKyAyNiwgJ2Ntay1jZCcpOwogICAgdmFyIGJhc2UgPSAxOwogICAgaWYgKHYpIHsgdmFyIGZyID0gdi5mcmV0cy5maWx0ZXIoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPiAwOyB9KTsgdmFyIG14ID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMDsgaWYgKG14ID4gNCkgYmFzZSA9IE1hdGgubWluLmFwcGx5KG51bGwsIGZyKTsgfQogICAgdmFyIHgwID0gcGFkTCwgeTAgPSBwYWRUOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCArIGkgKiBzcCwgeTE6IHkwLCB4MjogeDAgKyBpICogc3AsIHkyOiB5MCArIGZzICogNSwgc3Ryb2tlOiAnIzY0NzQ4YicsICdzdHJva2Utd2lkdGgnOiAxLjMgfSwgZWwpOwogICAgZm9yICh2YXIgZiA9IDA7IGYgPD0gNTsgZisrKSBzKCdsaW5lJywgeyB4MTogeDAsIHkxOiB5MCArIGYgKiBmcywgeDI6IHgwICsgVywgeTI6IHkwICsgZiAqIGZzLCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IGYgPT09IDAgJiYgYmFzZSA9PT0gMSA_IDUgOiAxLjMgfSwgZWwpOwogICAgaWYgKCF2KSByZXR1cm4gZWw7CiAgICBpZiAoYmFzZSA-IDEpIHMoJ3RleHQnLCB7IHg6IHgwIC0gMTAsIHk6IHkwICsgZnMgKiAwLjY1LCAndGV4dC1hbmNob3InOiAnZW5kJywgJ2ZvbnQtc2l6ZSc6IDEyLCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6ICcjNDc1NTY5JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGJhc2UgKyAnZnInKTsKICAgIHZhciBiYXIgPSB2LmJhcnJlID09PSB1bmRlZmluZWQgPyBmcmV0QmFycmUodi5mcmV0cykgOiB2LmJhcnJlOwogICAgaWYgKGJhciAmJiBiYXIuZnJldCA-IDApIHsgdmFyIGJ5ID0geTAgKyAoYmFyLmZyZXQgLSBiYXNlICsgMC41KSAqIGZzOyBzKCdyZWN0JywgeyB4OiB4MCArIGJhci5mcm9tICogc3AgLSA5LCB5OiBieSAtIDksIHdpZHRoOiAobiAtIDEgLSBiYXIuZnJvbSkgKiBzcCArIDE4LCBoZWlnaHQ6IDE4LCByeDogOSwgZmlsbDogJyMxQTIwMkMnIH0sIGVsKTsgfQogICAgdi5mcmV0cy5mb3JFYWNoKGZ1bmN0aW9uIChmdiwgaSkgewogICAgICB2YXIgY3ggPSB4MCArIGkgKiBzcCwgbGFiID0gdi5sYWJlbHMgPyB2LmxhYmVsc1tpXSA6ICcnOwogICAgICBpZiAoZnYgPCAwKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgLSAxMCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxNSwgZmlsbDogJyM2NDc0OGInLCAnZm9udC1mYW1pbHknOiAnQXJpYWwnIH0sIGVsLCAnw5cnKTsKICAgICAgZWxzZSBpZiAoZnYgPT09IDApIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogeTAgLSAxNCwgcjogNiwgZmlsbDogJ25vbmUnLCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuOCB9LCBlbCk7CiAgICAgIGVsc2UgaWYgKCEoYmFyICYmIGZ2ID09PSBiYXIuZnJldCAmJiBpID49IGJhci5mcm9tKSkgewogICAgICAgIHZhciBjeSA9IHkwICsgKGZ2IC0gYmFzZSArIDAuNSkgKiBmczsKICAgICAgICBzKCdjaXJjbGUnLCB7IGN4OiBjeCwgY3k6IGN5LCByOiA5LjUsIGZpbGw6IHYucm9vdElkeCA9PT0gaSA_ICcjRjJCMjMzJyA6ICcjMUEyMDJDJyB9LCBlbCk7CiAgICAgIH0KICAgICAgaWYgKGxhYikgcygndGV4dCcsIHsgeDogY3gsIHk6IHkwICsgZnMgKiA1ICsgMTgsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgbGFiKTsKICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KICAvKiBnZW5lcmljIGZyZXR0ZWQgdm9pY2luZyBzZWFyY2g6IHR1bmluZyA9IG1pZGkgcGVyIHN0cmluZyBsb3ctPmhpZ2ggKi8KICBmdW5jdGlvbiBzZWFyY2hWb2ljaW5nKHR1bmluZywgdG9uZXMsIGJhc3NQYywgZmlmdGgsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHIgPSBzZWFyY2hQYXNzKHR1bmluZywgdG9uZXMsIGJhc3NQYywgZmlmdGgsIG9wdHMsIGZhbHNlKTsKICAgIGlmICghciAmJiB0dW5pbmcubGVuZ3RoIDw9IDQpIHIgPSBzZWFyY2hQYXNzKHR1bmluZywgdG9uZXMsIGJhc3NQYywgZmlmdGgsIG9wdHMsIHRydWUpOwogICAgcmV0dXJuIHI7CiAgfQogIGZ1bmN0aW9uIHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgcmVsYXhlZCkgewogICAgdmFyIG4gPSB0dW5pbmcubGVuZ3RoLCBiZXN0ID0gbnVsbCwgZiA9IG5ldyBBcnJheShuKSwgbWluUGxheWVkID0gcmVsYXhlZCA_IG4gLSAxIDogKG9wdHMubWluUGxheWVkIHx8IE1hdGgubWluKG4sIE1hdGgubWF4KDMsIHRvbmVzLmxlbmd0aCkpKTsKICAgIHZhciBhbGxvd011dGUgPSBuID4gNCB8fCByZWxheGVkOwogICAgZm9yICh2YXIgcCA9IDA7IHAgPCAxMTsgcCsrKSB7CiAgICAgIHZhciBvcHRzRiA9IGFsbG93TXV0ZSA_IFstMSwgMF0gOiBbMF07CiAgICAgIGZvciAodmFyIGsgPSBNYXRoLm1heCgxLCBwKTsgayA8PSBwICsgMzsgaysrKSBvcHRzRi5wdXNoKGspOwogICAgICAoZnVuY3Rpb24gcmVjKGkpIHsKICAgICAgICBpZiAoaSA9PT0gbikgewogICAgICAgICAgdmFyIGhhdmUgPSB7fSwgZnIgPSBbXSwgZmlyc3QgPSAtMSwgcGxheWVkID0gMDsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbjsgaisrKSB7IGlmIChmW2pdIDwgMCkgY29udGludWU7IGlmIChmaXJzdCA8IDApIGZpcnN0ID0gajsgcGxheWVkKys7IGhhdmVbKHR1bmluZ1tqXSArIGZbal0pICUgMTJdID0gMTsgaWYgKGZbal0gPiAwKSBmci5wdXNoKGZbal0pOyB9CiAgICAgICAgICBpZiAocGxheWVkIDwgbWluUGxheWVkKSByZXR1cm47CiAgICAgICAgICBpZiAoYmFzc1BjICE9PSBudWxsICYmIGJhc3NQYyAhPT0gdW5kZWZpbmVkICYmICh0dW5pbmdbZmlyc3RdICsgZltmaXJzdF0pICUgMTIgIT09IGJhc3NQYykgcmV0dXJuOwogICAgICAgICAgaWYgKCFyZWxheGVkKSBmb3IgKHZhciBtID0gZmlyc3Q7IG0gPCBuIC0gMTsgbSsrKSBpZiAoZlttXSA8IDApIHJldHVybjsKICAgICAgICAgIHZhciBtaXNzaW5nID0gdG9uZXMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7IHJldHVybiAhaGF2ZVt0XTsgfSk7CiAgICAgICAgICB2YXIgYWxsb3dNaXNzID0gdG9uZXMubGVuZ3RoID4gbiA_IDIgOiAxOwogICAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gYWxsb3dNaXNzKSByZXR1cm47CiAgICAgICAgICBpZiAobWlzc2luZy5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4ICE9PSBmaWZ0aCAmJiAhKChyZWxheGVkIHx8IHRvbmVzLmxlbmd0aCA-IG4pICYmIHggPT09IHRvbmVzWzBdKTsgfSkpIHJldHVybjsKICAgICAgICAgIHZhciBoaSA9IGZyLmxlbmd0aCA_IE1hdGgubWF4LmFwcGx5KG51bGwsIGZyKSA6IDAsIGxvID0gZnIubGVuZ3RoID8gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpIDogMDsKICAgICAgICAgIGlmIChoaSAtIGxvID4gMykgcmV0dXJuOwogICAgICAgICAgdmFyIGJhciA9IGZyZXRCYXJyZShmKSwgZmluZ2VycyA9IGZyLmxlbmd0aDsKICAgICAgICAgIGlmIChiYXIpIGZpbmdlcnMgLT0gZnIuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4ID09PSBsbzsgfSkubGVuZ3RoIC0gMTsKICAgICAgICAgIGlmIChmaW5nZXJzID4gNCkgcmV0dXJuOwogICAgICAgICAgdmFyIHNjb3JlID0gaGkgKiAyICsgKGhpIC0gbG8pICsgZnIubGVuZ3RoICogMC4zICsgKG4gLSBwbGF5ZWQpICogMC44ICsgbWlzc2luZy5sZW5ndGggKiA1OwogICAgICAgICAgaWYgKCFiZXN0IHx8IHNjb3JlIDwgYmVzdC5zY29yZSkgYmVzdCA9IHsgc2NvcmU6IHNjb3JlLCBmcmV0czogZi5zbGljZSgpLCBiYXJyZTogKGJhciAmJiBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggPj0gMykgPyBiYXIgOiBudWxsIH07CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb3B0c0YubGVuZ3RoOyBvKyspIHsKICAgICAgICAgIHZhciB2ID0gb3B0c0Zbb107CiAgICAgICAgICBpZiAodiA-PSAwICYmIHRvbmVzLmluZGV4T2YoKHR1bmluZ1tpXSArIHYpICUgMTIpIDwgMCkgY29udGludWU7CiAgICAgICAgICBmW2ldID0gdjsgcmVjKGkgKyAxKTsKICAgICAgICB9CiAgICAgIH0pKDApOwogICAgfQogICAgcmV0dXJuIGJlc3Q7CiAgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyZXRzID0gb3B0cy5mcmV0cyB8fCAxNSwgbiA9IHR1bmluZy5sZW5ndGgsIGZ3ID0gNDYsIHNoID0gMjYsIHBhZEwgPSA0NiwgcGFkVCA9IDIyOwogICAgdmFyIFcgPSBwYWRMICsgZnJldHMgKiBmdyArIDE2LCBIID0gcGFkVCArIChuIC0gMSkgKiBzaCArIDM0OwogICAgdmFyIGVsID0gc3ZnKFcsIEgsICdjbWstZmInKTsKICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPD0gZnJldHMpIHMoJ2NpcmNsZScsIHsgY3g6IHBhZEwgKyAoZnggLSAwLjUpICogZncsIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoIC8gMiwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfSk7CiAgICBpZiAoZnJldHMgPj0gMTIpIHsgcygnY2lyY2xlJywgeyBjeDogcGFkTCArIDExLjUgKiBmdywgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggKiAwLjI1LCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyBzKCdjaXJjbGUnLCB7IGN4OiBwYWRMICsgMTEuNSAqIGZ3LCBjeTogcGFkVCArIChuIC0gMSkgKiBzaCAqIDAuNzUsIHI6IDUsIGZpbGw6ICcjZTdkY2NiJyB9LCBlbCk7IH0KICAgIGZvciAodmFyIGZ4MiA9IDA7IGZ4MiA8PSBmcmV0czsgZngyKyspIHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IGZ4MiA9PT0gMCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IGZ4MiA9PT0gMCA_IDUgOiAxLjQgfSwgZWwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgdmFyIHkgPSBwYWRUICsgKG4gLSAxIC0gaSkgKiBzaDsKICAgICAgcygnbGluZScsIHsgeDE6IHBhZEwsIHkxOiB5LCB4MjogcGFkTCArIGZyZXRzICogZncsIHkyOiB5LCBzdHJva2U6ICcjOGE3YTY0JywgJ3N0cm9rZS13aWR0aCc6IDEgKyAobiAtIDEgLSBpKSAqIDAuMjUgfSwgZWwpOwogICAgICB2YXIgb3BlbiA9IHNwZWxsKExFVC5pbmRleE9mKG9wdHMub3Blbk5hbWVzID8gb3B0cy5vcGVuTmFtZXNbaV0uY2hhckF0KDApIDogJ0MnKSwgdHVuaW5nW2ldKTsKICAgICAgcygndGV4dCcsIHsgeDogcGFkTCAtIDE4LCB5OiB5ICsgNC41LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEzLCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6ICcjNDc1NTY5JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9wdHMub3Blbk5hbWVzID8gb3B0cy5vcGVuTmFtZXNbaV0gOiBvcGVuLm5hbWUpOwogICAgfQogICAgZm9yICh2YXIgZngzID0gMTsgZngzIDw9IGZyZXRzOyBmeDMrKykgaWYgKFszLCA1LCA3LCA5LCAxMiwgMTVdLmluZGV4T2YoZngzKSA-PSAwKSBzKCd0ZXh0JywgeyB4OiBwYWRMICsgKGZ4MyAtIDAuNSkgKiBmdywgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICAobWFya3MgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgICAgdmFyIGN4ID0gbS5mID09PSAwID8gcGFkTCAtIDE4IDogcGFkTCArIChtLmYgLSAwLjUpICogZncsIGN5ID0gcGFkVCArIChuIC0gMSAtIG0ucykgKiBzaDsKICAgICAgdmFyIGZpbGwgPSBtLmtpbmQgPT09ICdyb290JyA_ICcjRjJCMjMzJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnI2NiZDVlMScgOiBtLmtpbmQgPT09ICdhbHQnID8gJyMyMjgwM2YnIDogJyMwNDc3QkYnOwogICAgICBpZiAobS5mID09PSAwKSBzKCdjaXJjbGUnLCB7IGN4OiBjeCwgY3k6IGN5LCByOiAxMSwgZmlsbDogZmlsbCwgc3Ryb2tlOiAnI2ZmZicsICdzdHJva2Utd2lkdGgnOiAyIH0sIGVsKTsKICAgICAgZWxzZSBzKCdjaXJjbGUnLCB7IGN4OiBjeCwgY3k6IGN5LCByOiAxMSwgZmlsbDogZmlsbCB9LCBlbCk7CiAgICAgIGlmIChtLmxhYmVsKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogY3kgKyA0LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IG0ubGFiZWwubGVuZ3RoID4gMiA_IDguNSA6IDEwLjUsICdmb250LXdlaWdodCc6IDgwMCwgZmlsbDogbS5raW5kID09PSAncm9vdCcgfHwgbS5raW5kID09PSAnZGltJyA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG0ubGFiZWwpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQoKICAvKiBET00gaGVscGVyICovCiAgZnVuY3Rpb24gaCh0YWcsIGF0dHJzLCBraWRzKSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICBpZiAoayA9PT0gJ3RleHQnKSBlLnRleHRDb250ZW50ID0gYXR0cnNba107CiAgICAgIGVsc2UgaWYgKGsuc2xpY2UoMCwgMikgPT09ICdvbicpIGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLCBhdHRyc1trXSk7CiAgICAgIGVsc2UgaWYgKGF0dHJzW2tdICE9PSBmYWxzZSAmJiBhdHRyc1trXSAhPT0gbnVsbCAmJiBhdHRyc1trXSAhPT0gdW5kZWZpbmVkKSBlLnNldEF0dHJpYnV0ZShrLCBhdHRyc1trXSA9PT0gdHJ1ZSA_ICcnIDogYXR0cnNba10pOwogICAgfQogICAgKGtpZHMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgaWYgKGMpIGUuYXBwZW5kQ2hpbGQodHlwZW9mIGMgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYykgOiBjKTsgfSk7CiAgICByZXR1cm4gZTsKICB9CgogIHdpbmRvdy5DTUsgPSB7CiAgICBMRVQ6IExFVCwgTkFUOiBOQVQsIHBhcnNlTm90ZTogcGFyc2VOb3RlLCBzcGVsbDogc3BlbGwsIGFjY1N0cjogYWNjU3RyLCBub3RlQXQ6IG5vdGVBdCwgZGVncmVlTGFiZWw6IGRlZ3JlZUxhYmVsLAogICAgaW50ZXJ2YWxOYW1lOiBpbnRlcnZhbE5hbWUsIE1BSl9TRU1JOiBNQUpfU0VNSSwgcGxheTogcGxheSwgZHJvbmU6IGRyb25lLCBjdHg6IGN0eCwgc3ZnRWw6IHMsIHN2Zzogc3ZnLAogICAga2V5Ym9hcmQ6IGtleWJvYXJkLCBjaG9yZERpYWdyYW06IGNob3JkRGlhZ3JhbSwgc2VhcmNoVm9pY2luZzogc2VhcmNoVm9pY2luZywgZnJldEJhcnJlOiBmcmV0QmFycmUsCiAgICBUVU5JTkdTOiBUVU5JTkdTLCBmcmV0Ym9hcmQ6IGZyZXRib2FyZCwgaDogaAogIH07Cn0pKCk7CgovKiBDaG9yZCBTcGVsbGluZyBDYWxjdWxhdG9yIOKAlCB1c2VzIHdpbmRvdy5DTUsgKHRoZW9yeS1raXQpICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC1jaG9yZCcpOwogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScpKSByZXR1cm47CiAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknLCAnMScpOwogIHZhciBLID0gd2luZG93LkNNSywgaCA9IEsuaDsKCiAgdmFyIFJPT1RTID0gWydDJywgJ0MjJywgJ0RiJywgJ0QnLCAnRCMnLCAnRWInLCAnRScsICdGJywgJ0YjJywgJ0diJywgJ0cnLCAnRyMnLCAnQWInLCAnQScsICdBIycsICdCYicsICdCJ107CiAgdmFyIFQgPSBbWzEsIDBdLCBbMywgNF0sIFs1LCA3XV0sIG0gPSBbWzEsIDBdLCBbMywgM10sIFs1LCA3XV0sIGQgPSBbWzEsIDBdLCBbMywgM10sIFs1LCA2XV0sIHM0ID0gW1sxLCAwXSwgWzQsIDVdLCBbNSwgN11dOwogIGZ1bmN0aW9uIGFkZChiYXNlLCBleHRyYSkgeyByZXR1cm4gYmFzZS5jb25jYXQoZXh0cmEpOyB9CiAgdmFyIFEgPSB7CiAgICBtYWo6IHsgc3ltOiAnJywgbmFtZTogJ01ham9yJywgZjogVCB9LAogICAgbWluOiB7IHN5bTogJ20nLCBuYW1lOiAnTWlub3InLCBmOiBtIH0sCiAgICBkaW06IHsgc3ltOiAnwrAnLCBuYW1lOiAnRGltaW5pc2hlZCcsIGY6IGQgfSwKICAgIGF1ZzogeyBzeW06ICcrJywgbmFtZTogJ0F1Z21lbnRlZCcsIGY6IFtbMSwgMF0sIFszLCA0XSwgWzUsIDhdXSB9LAogICAgc3VzMjogeyBzeW06ICdzdXMyJywgbmFtZTogJ1N1c3BlbmRlZCAybmQnLCBmOiBbWzEsIDBdLCBbMiwgMl0sIFs1LCA3XV0gfSwKICAgIHN1czQ6IHsgc3ltOiAnc3VzNCcsIG5hbWU6ICdTdXNwZW5kZWQgNHRoJywgZjogczQgfSwKICAgIHA1OiB7IHN5bTogJzUnLCBuYW1lOiAnUG93ZXIgY2hvcmQnLCBmOiBbWzEsIDBdLCBbNSwgN11dIH0sCiAgICBzaXg6IHsgc3ltOiAnNicsIG5hbWU6ICdNYWpvciA2dGgnLCBmOiBhZGQoVCwgW1s2LCA5XV0pIH0sCiAgICBtNjogeyBzeW06ICdtNicsIG5hbWU6ICdNaW5vciA2dGgnLCBmOiBhZGQobSwgW1s2LCA5XV0pIH0sCiAgICBkb203OiB7IHN5bTogJzcnLCBuYW1lOiAnRG9taW5hbnQgN3RoJywgZjogYWRkKFQsIFtbNywgMTBdXSkgfSwKICAgIG1hajc6IHsgc3ltOiAnbWFqNycsIG5hbWU6ICdNYWpvciA3dGgnLCBmOiBhZGQoVCwgW1s3LCAxMV1dKSB9LAogICAgbTc6IHsgc3ltOiAnbTcnLCBuYW1lOiAnTWlub3IgN3RoJywgZjogYWRkKG0sIFtbNywgMTBdXSkgfSwKICAgIG03YjU6IHsgc3ltOiAnbTfima01JywgbmFtZTogJ0hhbGYtZGltaW5pc2hlZCA3dGgnLCBmOiBhZGQoZCwgW1s3LCAxMF1dKSB9LAogICAgZGltNzogeyBzeW06ICfCsDcnLCBuYW1lOiAnRGltaW5pc2hlZCA3dGgnLCBmOiBhZGQoZCwgW1s3LCA5XV0pIH0sCiAgICBtTTc6IHsgc3ltOiAnbShtYWo3KScsIG5hbWU6ICdNaW5vci1tYWpvciA3dGgnLCBmOiBhZGQobSwgW1s3LCAxMV1dKSB9LAogICAgc3VzNDc6IHsgc3ltOiAnN3N1czQnLCBuYW1lOiAnRG9taW5hbnQgN3RoIHN1czQnLCBmOiBhZGQoczQsIFtbNywgMTBdXSkgfSwKICAgIGFkZDk6IHsgc3ltOiAnYWRkOScsIG5hbWU6ICdBZGRlZCA5dGgnLCBmOiBhZGQoVCwgW1s5LCAxNF1dKSB9LAogICAgbWFkZDk6IHsgc3ltOiAnbShhZGQ5KScsIG5hbWU6ICdNaW5vciBhZGRlZCA5dGgnLCBmOiBhZGQobSwgW1s5LCAxNF1dKSB9LAogICAgbmluZTogeyBzeW06ICc5JywgbmFtZTogJ0RvbWluYW50IDl0aCcsIGY6IGFkZChULCBbWzcsIDEwXSwgWzksIDE0XV0pIH0sCiAgICBtYWo5OiB7IHN5bTogJ21hajknLCBuYW1lOiAnTWFqb3IgOXRoJywgZjogYWRkKFQsIFtbNywgMTFdLCBbOSwgMTRdXSkgfSwKICAgIG05OiB7IHN5bTogJ205JywgbmFtZTogJ01pbm9yIDl0aCcsIGY6IGFkZChtLCBbWzcsIDEwXSwgWzksIDE0XV0pIH0sCiAgICBlbGV2ZW46IHsgc3ltOiAnMTEnLCBuYW1lOiAnRG9taW5hbnQgMTF0aCcsIGY6IGFkZChULCBbWzcsIDEwXSwgWzksIDE0XSwgWzExLCAxN11dKSB9LAogICAgdGhpcnRlZW46IHsgc3ltOiAnMTMnLCBuYW1lOiAnRG9taW5hbnQgMTN0aCcsIGY6IGFkZChULCBbWzcsIDEwXSwgWzksIDE0XSwgWzEzLCAyMV1dKSB9CiAgfTsKICB2YXIgR1JPVVBTID0gWwogICAgWydUcmlhZHMnLCBbJ21haicsICdtaW4nLCAnZGltJywgJ2F1ZycsICdzdXMyJywgJ3N1czQnLCAncDUnXV0sCiAgICBbJzZ0aHMgJiA3dGhzJywgWydzaXgnLCAnbTYnLCAnZG9tNycsICdtYWo3JywgJ203JywgJ203YjUnLCAnZGltNycsICdtTTcnLCAnc3VzNDcnXV0sCiAgICBbJ0V4dGVuZGVkJywgWydhZGQ5JywgJ21hZGQ5JywgJ25pbmUnLCAnbWFqOScsICdtOScsICdlbGV2ZW4nLCAndGhpcnRlZW4nXV0KICBdOwogIHZhciBzdGF0ZSA9IHsgcm9vdDogJ0EnLCBxOiAnbTcnLCBpbnY6IDAsIGluc3Q6ICdndWl0YXInIH07CiAgKGZ1bmN0aW9uIGZyb21IYXNoKCkgewogICAgdmFyIG10ID0gbG9jYXRpb24uaGFzaC5tYXRjaCgvY2hvcmQ9KFtBLUddWyNiXT8pLShcdyspKD86LShcZCkpPy8pOwogICAgaWYgKG10ICYmIFJPT1RTLmluZGV4T2YobXRbMV0pID49IDAgJiYgUVttdFsyXV0pIHsgc3RhdGUucm9vdCA9IG10WzFdOyBzdGF0ZS5xID0gbXRbMl07IHN0YXRlLmludiA9ICsobXRbM10gfHwgMCk7IH0KICB9KSgpOwogIGZ1bmN0aW9uIHByZXR0eShuKSB7IHJldHVybiBuLnJlcGxhY2UoJyMnLCAn4pmvJykucmVwbGFjZSgnYicsICfima0nKTsgfQoKICBmdW5jdGlvbiBjb21wdXRlKCkgewogICAgdmFyIHIgPSBLLnBhcnNlTm90ZShzdGF0ZS5yb290KSwgcSA9IFFbc3RhdGUucV07CiAgICB2YXIgbm90ZXMgPSBxLmYubWFwKGZ1bmN0aW9uIChpdikgewogICAgICB2YXIgbiA9IEsubm90ZUF0KHIsIGl2WzBdLCBpdlsxXSk7CiAgICAgIHJldHVybiB7IGRlZzogaXZbMF0sIHNlbWlzOiBpdlsxXSwgbm90ZTogbiwgbGFiZWw6IEsuZGVncmVlTGFiZWwoaXZbMF0sIGl2WzFdKSwgaW5hbWU6IEsuaW50ZXJ2YWxOYW1lKGl2WzBdLCBpdlsxXSkgfTsKICAgIH0pOwogICAgdmFyIG1heEludiA9IE1hdGgubWluKG5vdGVzLmxlbmd0aCwgNCkgLSAxOwogICAgaWYgKHN0YXRlLnEgPT09ICdwNScpIG1heEludiA9IDE7CiAgICBpZiAoc3RhdGUuaW52ID4gbWF4SW52KSBzdGF0ZS5pbnYgPSAwOwogICAgdmFyIG9yZGVyID0gbm90ZXMuc2xpY2Uoc3RhdGUuaW52KS5jb25jYXQobm90ZXMuc2xpY2UoMCwgc3RhdGUuaW52KSk7CiAgICB2YXIgYmFzcyA9IG9yZGVyWzBdLm5vdGU7CiAgICB2YXIgbmFtZSA9IHByZXR0eShzdGF0ZS5yb290KSArIHEuc3ltICsgKHN0YXRlLmludiA_ICcvJyArIGJhc3MubmFtZSA6ICcnKTsKICAgIHJldHVybiB7IHI6IHIsIHE6IHEsIG5vdGVzOiBub3Rlcywgb3JkZXI6IG9yZGVyLCBiYXNzOiBiYXNzLCBuYW1lOiBuYW1lLCBtYXhJbnY6IG1heEludiB9OwogIH0KICBmdW5jdGlvbiBtaWRpc0ZvcihjKSB7CiAgICB2YXIgYmFzZSA9IDQ4ICsgYy5yLnBjLCBsaXN0ID0gW107CiAgICBjLm5vdGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgbGlzdC5wdXNoKGJhc2UgKyBuLnNlbWlzKTsgfSk7CiAgICB2YXIgaW52ID0gbGlzdC5zbGljZShzdGF0ZS5pbnYpLmNvbmNhdChsaXN0LnNsaWNlKDAsIHN0YXRlLmludikubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4ICsgMTI7IH0pKTsKICAgIHdoaWxlIChpbnZbMF0gPj0gNjApIGludiA9IGludi5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggLSAxMjsgfSk7CiAgICByZXR1cm4gaW52OwogIH0KICBmdW5jdGlvbiBmcmV0VG9uZXMoYykgewogICAgdmFyIHQgPSBjLm5vdGVzLnNsaWNlKCk7CiAgICBmdW5jdGlvbiBkcm9wKGRlZykgeyBpZiAodC5sZW5ndGggPiA0KSB0ID0gdC5maWx0ZXIoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4uZGVnICE9PSBkZWc7IH0pOyB9CiAgICBpZiAoc3RhdGUucSA9PT0gJ2VsZXZlbicpIGRyb3AoMyk7CiAgICBkcm9wKDUpOwogICAgaWYgKHN0YXRlLnEgPT09ICd0aGlydGVlbicpIGRyb3AoOSk7CiAgICByZXR1cm4gdC5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4ubm90ZS5wYzsgfSk7CiAgfQogIHZhciB2Y2FjaGUgPSB7fTsKICBmdW5jdGlvbiB2b2ljaW5nKGMsIGluc3QpIHsKICAgIHZhciBrZXkgPSBpbnN0ICsgYy5yLnBjICsgc3RhdGUucSArIHN0YXRlLmludjsKICAgIGlmICh2Y2FjaGVba2V5XSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmNhY2hlW2tleV07CiAgICB2YXIgdG9uZXMgPSBmcmV0VG9uZXMoYyksIGZpZnRoID0gLTE7CiAgICBjLm5vdGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgaWYgKG4uZGVnID09PSA1KSBmaWZ0aCA9IG4ubm90ZS5wYzsgfSk7CiAgICB2YXIgdHVuID0gSy5UVU5JTkdTW2luc3RdOwogICAgdmFyIGJhc3NQYyA9IGluc3QgPT09ICdndWl0YXInID8gYy5iYXNzLnBjIDogbnVsbDsKICAgIGlmIChpbnN0ID09PSAnZ3VpdGFyJyAmJiB0b25lcy5pbmRleE9mKGJhc3NQYykgPCAwKSB0b25lcy5wdXNoKGJhc3NQYyk7CiAgICB2YXIgdiA9IEsuc2VhcmNoVm9pY2luZyh0dW4sIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCB7IG1pblBsYXllZDogaW5zdCA9PT0gJ2d1aXRhcicgPyBNYXRoLm1pbig0LCBNYXRoLm1heCgzLCB0b25lcy5sZW5ndGgpKSA6IDQgfSk7CiAgICBpZiAodikgewogICAgICB2LmxhYmVscyA9IHYuZnJldHMubWFwKGZ1bmN0aW9uIChmLCBpKSB7CiAgICAgICAgaWYgKGYgPCAwKSByZXR1cm4gJyc7CiAgICAgICAgdmFyIHBjID0gKHR1bltpXSArIGYpICUgMTIsIGhpdCA9IG51bGw7CiAgICAgICAgYy5ub3Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IGlmIChuLm5vdGUucGMgPT09IHBjKSBoaXQgPSBuOyB9KTsKICAgICAgICByZXR1cm4gaGl0ID8gaGl0Lm5vdGUubmFtZSA6ICcnOwogICAgICB9KTsKICAgICAgdi5yb290SWR4ID0gLTE7CiAgICB9CiAgICB2Y2FjaGVba2V5XSA9IHYgfHwgbnVsbDsKICAgIHJldHVybiB2Y2FjaGVba2V5XTsKICB9CgogIHZhciBlbHMgPSB7fTsKICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBvbiwgb25jbGljaywgY2xzKSB7IHJldHVybiBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWNoaXAnICsgKG9uID8gJyBvbicgOiAnJykgKyAoY2xzID8gJyAnICsgY2xzIDogJycpLCAnYXJpYS1wcmVzc2VkJzogb24gPyAndHJ1ZScgOiAnZmFsc2UnLCBvbmNsaWNrOiBvbmNsaWNrIH0sIFtsYWJlbF0pOyB9CiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgdmFyIGMgPSBjb21wdXRlKCk7CiAgICB0cnkgeyBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgJyNjaG9yZD0nICsgc3RhdGUucm9vdCArICctJyArIHN0YXRlLnEgKyAoc3RhdGUuaW52ID8gJy0nICsgc3RhdGUuaW52IDogJycpKTsgfSBjYXRjaCAoZSkge30KICAgIC8vIHJvb3RzCiAgICBlbHMucm9vdHMuaW5uZXJIVE1MID0gJyc7CiAgICBST09UUy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IGVscy5yb290cy5hcHBlbmRDaGlsZChjaGlwKHByZXR0eShuKSwgbiA9PT0gc3RhdGUucm9vdCwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5yb290ID0gbjsgcmVuZGVyKCk7IHBsYXlDaG9yZCgnYmxvY2snKTsgfSkpOyB9KTsKICAgIGVscy5xdWFscy5pbm5lckhUTUwgPSAnJzsKICAgIEdST1VQUy5mb3JFYWNoKGZ1bmN0aW9uIChnKSB7CiAgICAgIGVscy5xdWFscy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtcWcnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6IGdbMF0gfSksIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSwgZ1sxXS5tYXAoZnVuY3Rpb24gKGspIHsKICAgICAgICByZXR1cm4gY2hpcChRW2tdLnN5bSB8fCAnbWFqJywgayA9PT0gc3RhdGUucSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5xID0gazsgcmVuZGVyKCk7IHBsYXlDaG9yZCgnYmxvY2snKTsgfSwgJ3NtJyk7CiAgICAgIH0pKV0pKTsKICAgIH0pOwogICAgLy8gcmVzdWx0CiAgICBlbHMubmFtZS50ZXh0Q29udGVudCA9IGMubmFtZTsKICAgIGVscy5xbmFtZS50ZXh0Q29udGVudCA9IHByZXR0eShzdGF0ZS5yb290KSArICcgJyArIGMucS5uYW1lICsgKHN0YXRlLmludiA_ICcgwrcgJyArIFsnJywgJzFzdCcsICcybmQnLCAnM3JkJ11bc3RhdGUuaW52XSArICcgaW52ZXJzaW9uJyA6ICcnKTsKICAgIGVscy5ub3Rlcy5pbm5lckhUTUwgPSAnJzsKICAgIGMub3JkZXIuZm9yRWFjaChmdW5jdGlvbiAobiwgaSkgewogICAgICBlbHMubm90ZXMuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LW5vdGUnICsgKG4uZGVnID09PSAxID8gJyByb290JyA6ICcnKSArIChpID09PSAwID8gJyBiYXNzJyA6ICcnKSB9LCBbCiAgICAgICAgaCgnYicsIHsgdGV4dDogbi5ub3RlLm5hbWUgfSksIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdkZWcnLCB0ZXh0OiBuLmxhYmVsIH0pLCBoKCdzbWFsbCcsIHsgdGV4dDogbi5pbmFtZSB9KQogICAgICBdKSk7CiAgICB9KTsKICAgIGVscy5mb3JtdWxhLnRleHRDb250ZW50ID0gYy5ub3Rlcy5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4ubGFiZWw7IH0pLmpvaW4oJyDigJMgJyk7CiAgICB2YXIgc2VtaXMgPSBjLm5vdGVzLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gbi5zZW1pczsgfSk7CiAgICBlbHMuc3RlcHMudGV4dENvbnRlbnQgPSBzZW1pcy5zbGljZSgxKS5tYXAoZnVuY3Rpb24gKHgsIGkpIHsgcmV0dXJuIHggLSBzZW1pc1tpXTsgfSkuam9pbignICsgJykgKyAnIGhhbGYgc3RlcHMnOwogICAgLy8gaW52ZXJzaW9ucwogICAgZWxzLmludi5pbm5lckhUTUwgPSAnJzsKICAgIFsnUm9vdCcsICcxc3QnLCAnMm5kJywgJzNyZCddLnNsaWNlKDAsIGMubWF4SW52ICsgMSkuZm9yRWFjaChmdW5jdGlvbiAobGFiLCBpKSB7IGVscy5pbnYuYXBwZW5kQ2hpbGQoY2hpcChsYWIsIGkgPT09IHN0YXRlLmludiwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5pbnYgPSBpOyByZW5kZXIoKTsgcGxheUNob3JkKCdibG9jaycpOyB9LCAnc20nKSk7IH0pOwogICAgLy8ga2V5Ym9hcmQKICAgIHZhciBtaWRzID0gbWlkaXNGb3IoYyksIHN0YXJ0ID0gNDgsIG9uID0ge30sIHJvb3RPZmYgPSBudWxsOwogICAgdmFyIHRvcCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIG1pZHMpIC0gc3RhcnQ7CiAgICBtaWRzLmZvckVhY2goZnVuY3Rpb24gKHgsIGkpIHsgdmFyIG4gPSBjLm9yZGVyW2ldOyBvblt4IC0gc3RhcnRdID0gbi5ub3RlLm5hbWU7IGlmIChuLmRlZyA9PT0gMSkgcm9vdE9mZiA9IHggLSBzdGFydDsgfSk7CiAgICBlbHMua2IuaW5uZXJIVE1MID0gJyc7CiAgICBlbHMua2IuYXBwZW5kQ2hpbGQoSy5rZXlib2FyZCh7IG9jdGF2ZXM6IHRvcCA-IDIzID8gMyA6IDIsIG9uOiBvbiwgcm9vdDogcm9vdE9mZiB9KSk7CiAgICAvLyBmcmV0dGVkCiAgICBlbHMudGFicy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ2d1aXRhcicsICdHdWl0YXInXSwgWyd1a3VsZWxlJywgJ1VrdWxlbGUnXV0uZm9yRWFjaChmdW5jdGlvbiAobykgeyBlbHMudGFicy5hcHBlbmRDaGlsZChjaGlwKG9bMV0sIHN0YXRlLmluc3QgPT09IG9bMF0sIGZ1bmN0aW9uICgpIHsgc3RhdGUuaW5zdCA9IG9bMF07IHJlbmRlcigpOyB9LCAnc20nKSk7IH0pOwogICAgdmFyIHYgPSB2b2ljaW5nKGMsIHN0YXRlLmluc3QpOwogICAgZWxzLmNkLmlubmVySFRNTCA9ICcnOwogICAgaWYgKHYpIHsKICAgICAgdi5mcmV0cy5mb3JFYWNoKGZ1bmN0aW9uIChmLCBpKSB7IGlmIChmID49IDAgJiYgdi5yb290SWR4IDwgMCkgeyB2YXIgcGMgPSAoSy5UVU5JTkdTW3N0YXRlLmluc3RdW2ldICsgZikgJSAxMjsgaWYgKHBjID09PSBjLnIucGMpIHYucm9vdElkeCA9IGk7IH0gfSk7CiAgICAgIGVscy5jZC5hcHBlbmRDaGlsZChLLmNob3JkRGlhZ3JhbSh2KSk7CiAgICAgIGVscy5jZG5vdGUudGV4dENvbnRlbnQgPSBzdGF0ZS5pbnN0ID09PSAndWt1bGVsZScgPyAnVWt1bGVsZSBzaGFwZSAoRyBDIEUgQSB0dW5pbmcpJyA6IChzdGF0ZS5pbnYgPyAnTG93ZXN0IG5vdGU6ICcgKyBjLmJhc3MubmFtZSA6ICdPbmUgcGxheWFibGUgc2hhcGUnKTsKICAgIH0gZWxzZSB7CiAgICAgIGVscy5jZC5hcHBlbmRDaGlsZChLLmNob3JkRGlhZ3JhbShudWxsLCB7IHN0cmluZ3M6IHN0YXRlLmluc3QgPT09ICdndWl0YXInID8gNiA6IDQgfSkpOwogICAgICBlbHMuY2Rub3RlLnRleHRDb250ZW50ID0gJ05vIGVhc3kgc2hhcGUgZm9yIHRoaXMgb25lLiBUcnkgcm9vdCBwb3NpdGlvbi4nOwogICAgfQogIH0KICBmdW5jdGlvbiBwbGF5Q2hvcmQobW9kZSkgeyB2YXIgYyA9IGNvbXB1dGUoKTsgSy5wbGF5KG1pZGlzRm9yKGMpLCBtb2RlKTsgfQoKICBmdW5jdGlvbiBidWlsZCgpIHsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICBlbHMucm9vdHMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMgcm9vdHMnIH0pOwogICAgZWxzLnF1YWxzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXF1YWxzJyB9KTsKICAgIGVscy5uYW1lID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWJpZycgfSk7CiAgICBlbHMucW5hbWUgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtc3ViJyB9KTsKICAgIGVscy5ub3RlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1ub3RlcycgfSk7CiAgICBlbHMuZm9ybXVsYSA9IGgoJ2InKTsKICAgIGVscy5zdGVwcyA9IGgoJ3NwYW4nKTsKICAgIGVscy5pbnYgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMnIH0pOwogICAgZWxzLmtiID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWtiJyB9KTsKICAgIGVscy50YWJzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIGVscy5jZCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jZCcgfSk7CiAgICBlbHMuY2Rub3RlID0gaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1jZG5vdGUnIH0pOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCcgfSwgWwogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtc3RlcCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbicsIHRleHQ6ICcxJyB9KSwgaCgnYicsIHsgdGV4dDogJ0Nob29zZSBhIHJvb3Qgbm90ZScgfSldKSwKICAgICAgZWxzLnJvb3RzLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtc3RlcCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbicsIHRleHQ6ICcyJyB9KSwgaCgnYicsIHsgdGV4dDogJ0Nob29zZSBhIGNob3JkIHR5cGUnIH0pXSksCiAgICAgIGVscy5xdWFscwogICAgXSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCBjbXgtcmVzdWx0JyB9LCBbCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1yaGVhZCcgfSwgWwogICAgICAgIGgoJ2RpdicsIHt9LCBbZWxzLm5hbWUsIGVscy5xbmFtZV0pLAogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1wbGF5JyB9LCBbCiAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBwbGF5Q2hvcmQoJ2Jsb2NrJyk7IH0gfSwgWyfilrYgUGxheSBjaG9yZCddKSwKICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGdob3N0Jywgb25jbGljazogZnVuY3Rpb24gKCkgeyBwbGF5Q2hvcmQoJ3VwJyk7IH0gfSwgWydBcnBlZ2dpbyddKQogICAgICAgIF0pCiAgICAgIF0pLAogICAgICBlbHMubm90ZXMsCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mb3JtdWxhJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnRm9ybXVsYScgfSksIGVscy5mb3JtdWxhLCBlbHMuc3RlcHNdKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWludnJvdycgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ0ludmVyc2lvbicgfSksIGVscy5pbnZdKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXZpcycgfSwgWwogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1wYW5lbCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1BpYW5vJyB9KSwgZWxzLmtiXSksCiAgICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBhbmVsJyB9LCBbaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXB0b3AnIH0sIFtlbHMudGFic10pLCBlbHMuY2QsIGVscy5jZG5vdGVdKQogICAgICBdKQogICAgXSkpOwogICAgcmVuZGVyKCk7CiAgfQogIGJ1aWxkKCk7Cn0pKCk7Cg==".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/chord-calculator/">Chord Spelling Calculator</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1181</post-id>	</item>
	</channel>
</rss>
