<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Paolo Volterra</title>
<link>https://paolovolterra.com/posts.html</link>
<atom:link href="https://paolovolterra.com/posts.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.9.36</generator>
<lastBuildDate>Thu, 29 Oct 2026 23:00:00 GMT</lastBuildDate>
<item>
  <title>Auto, Germania e Cina: il sorpasso nei dati del commercio estero</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2610_AutoGermaniaCina/</link>
  <description><![CDATA[ 




<p>Nell’agosto 2026 il valore dei veicoli e dei componenti che la Germania ha importato dalla Cina ha superato quello delle sue esportazioni verso la Cina, per la prima volta nel periodo osservato. Il dato viene dalle statistiche del commercio estero dell’Unione europea <span class="citation" data-cites="eurostat2026comext">[1]</span>, aggiornate al 16 ottobre 2026. Per leggerlo bene servono tre distinzioni: fra auto e componenti, fra valore e peso, e fra un singolo mese e l’andamento dell’anno.</p>
<section id="il-sorpasso-in-valore-dura-un-mese" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Il sorpasso in valore dura un mese</h1>
<p>Il capitolo 87 della nomenclatura doganale comprende tutti i veicoli stradali e le loro parti, non solo le automobili <span class="citation" data-cites="wco2022hs87">[2]</span>. Le automobili per il trasporto di persone sono una sua voce, la 8703; i componenti e gli accessori sono la voce 8708.</p>
<div id="cell-fig-valore" class="cell" data-execution_count="2">
<div class="cell-output cell-output-display">
<div id="fig-valore" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-valore-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://paolovolterra.com/posts/2610_AutoGermaniaCina/index_files/figure-html/fig-valore-output-1.png" width="854" height="355" class="figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-valore-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figura&nbsp;1: Interscambio Germania–Cina, milioni di euro al mese, gennaio 2022 – agosto 2026. Fonte: Eurostat COMEXT; elaborazione dell’autore.
</figcaption>
</figure>
</div>
</div>
</div>
<p><em>In parole semplici:</em> la linea blu è quanto la Germania vende alla Cina, quella rossa quanto compra. Dal 2022 la linea blu scende molto, la rossa sale piano; le due si incrociano solo all’ultimo mese.</p>
<p>L’export tedesco del capitolo 87 ha toccato <strong>2.935 milioni di euro</strong> nel mese di marzo 2022 ed è sceso a 530 milioni nel mese di agosto 2026. L’import dalla Cina ha superato l’export in un solo mese su 56, agosto 2026, con 629 milioni contro 530. Anche per le sole automobili l’import ha superato l’export soltanto nel mese di agosto 2026.</p>
<p>Agosto è ogni anno il mese più debole per l’export tedesco: nel 2024, per esempio, il capitolo 87 è passato da 1.878 milioni a luglio a 1.314 milioni ad agosto. Il sorpasso cade quindi nel mese in cui la linea tedesca è più bassa per ragioni di calendario.</p>
<p>Il valore delle esportazioni è misurato al confine del paese che esporta, quello delle importazioni al confine del paese che importa, con trasporto e assicurazione inclusi <span class="citation" data-cites="eurostat2026esms">[3]</span>.<sup>1</sup> A parità di merce, quindi, l’import incorpora qualche costo in più dell’export.</p>
</section>
<section id="che-cosa-vende-la-germania-sempre-più-componenti" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> Che cosa vende la Germania: sempre più componenti</h1>
<p>Una parte crescente dell’export tedesco verso la Cina non sono automobili, ma pezzi per le automobili. Nel mese di agosto 2026 i componenti (voce 8708) valevano il <strong>59%</strong> dell’export del capitolo 87, contro il 32% nel mese di marzo 2022. È coerente con una produzione dei marchi tedeschi che si sposta in Cina e viene rifornita dalla Germania; i dati di commercio, però, non dicono chi compra i componenti.</p>
</section>
<section id="in-peso-la-cina-è-già-davanti" class="level1" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> In peso la Cina è già davanti</h1>
<p>Le statistiche registrano anche il peso delle merci, cioè la massa netta senza imballaggio.<sup>2</sup> Il numero di automobili non è diffuso a questo livello di dettaglio, quindi il confronto in quantità si fa in tonnellate.</p>
<div id="cell-fig-peso" class="cell" data-execution_count="3">
<div class="cell-output cell-output-display">
<div id="fig-peso" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-peso-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://paolovolterra.com/posts/2610_AutoGermaniaCina/index_files/figure-html/fig-peso-output-1.png" width="854" height="355" class="figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-peso-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figura&nbsp;2: Automobili (voce 8703): tonnellate all’anno e valore medio in euro per chilogrammo, 2015–2026. Il 2026 comprende i mesi da gennaio ad agosto. Fonte: Eurostat COMEXT; elaborazione dell’autore.
</figcaption>
</figure>
</div>
</div>
</div>
<p><em>In parole semplici:</em> a sinistra quante tonnellate di automobili passano nei due sensi, a destra quanto vale in media ogni chilo. La Cina spedisce in Germania più chili di auto della Germania verso la Cina, ma ogni chilo vale meno della metà.</p>
<p>Da gennaio ad agosto 2026 la Cina ha spedito in Germania <strong>176.644 tonnellate</strong> di automobili, contro 120.801 nella direzione opposta; in tutto il 2025 erano state 125.864. Nello stesso periodo un chilo di automobile tedesca esportata valeva in media <strong>24,2 euro</strong>, un chilo di automobile cinese importata 10,7 euro. Nel 2022 i due valori erano 32,6 e 17,1 euro: sono scesi entrambi, e il rapporto fra i due è rimasto intorno a due. Il confronto in euro mette quindi sullo stesso piano merci con prezzi molto diversi: in quantità il sorpasso cinese è già avvenuto, in valore resta limitato a un mese.</p>
</section>
<section id="benzina-da-una-parte-elettrico-e-plug-in-dallaltra" class="level1" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> Benzina da una parte, elettrico e plug-in dall’altra</h1>
<p>La nomenclatura distingue le automobili per tipo di motore: la voce 8703.80 comprende le auto con solo motore elettrico, la 8703.60 le ibride a benzina ricaricabili dalla rete.<sup>3</sup></p>
<div id="cell-fig-composizione" class="cell" data-execution_count="4">
<div class="cell-output cell-output-display">
<div id="fig-composizione" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-composizione-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://paolovolterra.com/posts/2610_AutoGermaniaCina/index_files/figure-html/fig-composizione-output-1.png" width="756" height="317" class="figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-composizione-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figura&nbsp;3: Automobili per tipo di motore, gennaio–agosto 2026, milioni di euro. Fonte: Eurostat COMEXT; elaborazione dell’autore.
</figcaption>
</figure>
</div>
</div>
</div>
<p><em>In parole semplici:</em> le barre blu mostrano che cosa la Germania vende alla Cina, quasi solo auto a benzina; le rosse che cosa compra, soprattutto auto elettriche e ibride ricaricabili.</p>
<p>Nei primi otto mesi del 2026 la Germania ha esportato in Cina automobili per 2.918 milioni di euro, di cui 2.715 milioni (il 93%) a benzina con cilindrata fra 1.500 e 3.000 cc; le elettriche erano 59 milioni. L’import dalla Cina, 1.896 milioni, era fatto per 899 milioni di auto elettriche e per 741 milioni di ibride plug-in; nel 2024 le plug-in importate valevano 55 milioni.</p>
</section>
<section id="che-cosa-i-dati-non-dicono" class="level1" data-number="5">
<h1 data-number="5"><span class="header-section-number">5</span> Che cosa i dati non dicono</h1>
<p>I dati di commercio non distinguono i marchi: un’automobile di un marchio europeo o americano prodotta in Cina e spedita in Germania conta come import dalla Cina. Per separare i marchi servono le immatricolazioni per marca. Il valore per chilogrammo è una misura media, che risente del mix di modelli e del peso delle batterie; non è il prezzo di un’automobile.</p>
<hr>
<p><strong>Nota metodologica</strong></p>
<p>Questo documento nasce dall’interazione di tre componenti. L’autore definisce le domande, esercita il giudizio critico e assume la responsabilità scientifica ed editoriale del risultato. Strumenti di intelligenza artificiale generativa sono impiegati a supporto della ricerca bibliografica, della lettura, della sintesi, della riorganizzazione argomentativa e della revisione del testo. Un’infrastruttura open source sviluppata dall’autore automatizza il reperimento, l’armonizzazione e il controllo dei dati dalle fonti statistiche ufficiali, e mantiene l’elaborazione documentata e riproducibile.</p>
<p>Le fonti sono pubblicamente accessibili e citate con la loro denominazione ufficiale; l’analisi è pertanto integralmente auditabile e replicabile da terzi a partire da esse. Le tabelle e i grafici sono elaborazioni dell’autore: calcoli, aggregazioni, trasformazioni e scelte di rappresentazione sono attribuibili all’autore e non agli enti produttori dei dati.</p>
<p>La responsabilità per le fonti utilizzate, le analisi condotte, le elaborazioni effettuate, le interpretazioni proposte e le conclusioni formulate resta interamente in capo all’autore. L’intelligenza artificiale è stata impiegata come ambiente di supporto cognitivo ed editoriale, non come fonte primaria, autore autonomo o sostituto del giudizio critico.</p>
</section>
<section id="bibliografia" class="level1 unnumbered">
<h1 class="unnumbered">Bibliografia</h1>
<div id="refs" class="references csl-bib-body" data-entry-spacing="0">
<div id="ref-eurostat2026comext" class="csl-entry">
<div class="csl-left-margin">[1] </div><div class="csl-right-inline">Eurostat, <span>«EU trade since 1988 by HS2-4-6 and CN8 (DS-045409)»</span>. Comext SDMX API, 2026. Disponibile su: <a href="https://ec.europa.eu/eurostat/comext/newxtweb/">https://ec.europa.eu/eurostat/comext/newxtweb/</a></div>
</div>
<div id="ref-wco2022hs87" class="csl-entry">
<div class="csl-left-margin">[2] </div><div class="csl-right-inline">World Customs Organization, <span>«HS Nomenclature 2022 edition, Section XVII, Chapter 87: Vehicles other than railway or tramway rolling-stock, and parts and accessories thereof»</span>. 2022. Disponibile su: <a href="https://www.wcoomd.org/-/media/wco/public/global/pdf/topics/nomenclature/instruments-and-tools/hs-nomenclature-2022/2022/1787_2022e.pdf">https://www.wcoomd.org/-/media/wco/public/global/pdf/topics/nomenclature/instruments-and-tools/hs-nomenclature-2022/2022/1787_2022e.pdf</a></div>
</div>
<div id="ref-eurostat2026esms" class="csl-entry">
<div class="csl-left-margin">[3] </div><div class="csl-right-inline">Eurostat, <span>«International trade in goods, detailed data (ext_go_detail): Reference Metadata in Single Integrated Metadata Structure»</span>. 2026. Consultato: 30 ottobre 2026. [Online]. Disponibile su: <a href="https://ec.europa.eu/eurostat/cache/metadata/en/ext_go_detail_sims.htm">https://ec.europa.eu/eurostat/cache/metadata/en/ext_go_detail_sims.htm</a></div>
</div>
</div>


</section>


<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a><div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Note</h2>

<ol>
<li id="fn1"><p>«It is said to be a FOB (Free On Board) valuation for exports and a CIF (Cost Insurance Freight) valuation for imports.» <span class="citation" data-cites="eurostat2026esms">[3]</span>↩︎</p></li>
<li id="fn2"><p>«This is the weight of the goods in kilograms without packaging; this quantity is referred to as the ‘net mass’.» <span class="citation" data-cites="eurostat2026esms">[3]</span>↩︎</p></li>
<li id="fn3"><p>«Other vehicles, with both spark-ignition internal combustion piston engine and electric motor as motors for propulsion, capable of being charged by plugging to external source of electric power» <span class="citation" data-cites="wco2022hs87">[2, p. 2]</span>↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>Commercio estero</category>
  <category>Automobili</category>
  <category>Germania</category>
  <category>Cina</category>
  <category>Eurostat</category>
  <guid>https://paolovolterra.com/posts/2610_AutoGermaniaCina/</guid>
  <pubDate>Thu, 29 Oct 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Censimento permanente delle imprese 2025: le fonti di finanziamento, a confronto con BACH</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/</link>
  <description><![CDATA[ 




<p><strong>Fonte</strong>: Istat, <em>Censimento permanente delle imprese 2025: primi risultati</em> (29 ottobre 2026) e Appendice statistica; per il confronto, l’Appendice dell’edizione 2022 e il database BACH (Italia). Le appendici xlsx si leggono dai file originali Istat, BACH si scarica a ogni esecuzione.</p>
<p><strong>Che cosa contiene.</strong> La Rilevazione multiscopo chiede a un campione di circa 265mila imprese con almeno 3 addetti quali fonti di finanziamento hanno usato, perché sono ricorse al credito esterno, se hanno chiesto e ottenuto prestiti, se intendono ricapitalizzarsi. Le risposte sono riportate all’universo (stime con decimali): <strong>quante imprese</strong> usano una fonte, non <strong>quanto</strong> debito o capitale. La terza edizione ha anno di riferimento 2025; la seconda il 2022.</p>
<p><strong>Perché interessa per BACH.</strong> BACH misura le stesse fonti dal lato del bilancio, in percentuale del totale attivo: debiti verso banche a breve (<code>L21</code>) e a medio-lungo termine (<code>L22</code>), debiti commerciali (<code>L4</code>), altri debiti finanziari, soprattutto infragruppo (<code>L31</code>), obbligazioni (<code>L1</code>), patrimonio netto (<code>E</code>). Le due fonti guardano lo stesso fenomeno da due lati: diffusione fra le imprese contro peso nei bilanci.</p>
<p><strong>Limiti strutturali per il confronto.</strong></p>
<ul>
<li><p>Unità diverse: la Rilevazione conta imprese (ogni impresa pesa uno), BACH somma bilanci (la media ponderata riflette le imprese grandi).</p></li>
<li><p>Classi diverse: la Rilevazione classifica per addetti, BACH per fatturato; nessun raccordo esatto.</p></li>
<li><p>Anni diversi: Rilevazione 2022 e 2025, BACH Italia fino al 2024.</p></li>
<li><p>Universo: la Rilevazione include imprese individuali e società di persone con almeno 3 addetti; BACH Italia le sole società di capitali con bilancio depositato.</p></li>
</ul>
<div id="2294940e" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="2">
<div class="cell-output cell-output-display cell-output-markdown">
<p>Appendici lette: 2025 <code>Appendice-statistica_Rilevazione-Multiscopo-Censimento-imprese.xlsx</code>, 2022 <code>Appendice-statistica-Censimprese.xlsx</code>. Rilascio BACH: <strong>20260914</strong>.</p>
</div>
</div>
<section id="luniverso-e-il-controllo-delle-tavole" class="level2">
<h2 class="anchored" data-anchor-id="luniverso-e-il-controllo-delle-tavole">1. L’universo e il controllo delle tavole</h2>
<p>Ogni tavola ha un blocco di valori assoluti e uno di percentuali. Il notebook legge i valori assoluti e ricalcola le percentuali; il confronto con quelle pubblicate controlla la lettura.</p>
<div id="7d80dbe3" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="3">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 33%">
<col style="width: 15%">
<col style="width: 19%">
<col style="width: 19%">
<col style="width: 12%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">settore</th>
<th style="text-align: left;">classe</th>
<th style="text-align: right;">imprese 2022</th>
<th style="text-align: right;">imprese 2025</th>
<th style="text-align: right;">var. %</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">188,255.0</td>
<td style="text-align: right;">181,807.7</td>
<td style="text-align: right;">-3.4</td>
</tr>
<tr class="even">
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">116,334.0</td>
<td style="text-align: right;">107,763.9</td>
<td style="text-align: right;">-7.4</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">40,188.0</td>
<td style="text-align: right;">39,822.8</td>
<td style="text-align: right;">-0.9</td>
</tr>
<tr class="even">
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">20,325.0</td>
<td style="text-align: right;">21,715.0</td>
<td style="text-align: right;">6.8</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">6,349.0</td>
<td style="text-align: right;">6,950.0</td>
<td style="text-align: right;">9.5</td>
</tr>
<tr class="even">
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">3,507.0</td>
<td style="text-align: right;">3,857.0</td>
<td style="text-align: right;">10.0</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">1,552.0</td>
<td style="text-align: right;">1,699.0</td>
<td style="text-align: right;">9.5</td>
</tr>
<tr class="even">
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">122,215.0</td>
<td style="text-align: right;">129,324.0</td>
<td style="text-align: right;">5.8</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">98,277.0</td>
<td style="text-align: right;">100,359.0</td>
<td style="text-align: right;">2.1</td>
</tr>
<tr class="even">
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">16,985.0</td>
<td style="text-align: right;">19,877.0</td>
<td style="text-align: right;">17.0</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">5,428.0</td>
<td style="text-align: right;">7,089.0</td>
<td style="text-align: right;">30.6</td>
</tr>
<tr class="even">
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">1,045.0</td>
<td style="text-align: right;">1,352.0</td>
<td style="text-align: right;">29.4</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">368.0</td>
<td style="text-align: right;">503.0</td>
<td style="text-align: right;">36.7</td>
</tr>
<tr class="even">
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">112.0</td>
<td style="text-align: right;">144.0</td>
<td style="text-align: right;">28.6</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Commercio</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">247,732.0</td>
<td style="text-align: right;">234,376.0</td>
<td style="text-align: right;">-5.4</td>
</tr>
<tr class="even">
<td style="text-align: left;">Commercio</td>
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">207,403.0</td>
<td style="text-align: right;">192,151.0</td>
<td style="text-align: right;">-7.4</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Commercio</td>
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">27,494.0</td>
<td style="text-align: right;">27,894.0</td>
<td style="text-align: right;">1.5</td>
</tr>
<tr class="even">
<td style="text-align: left;">Commercio</td>
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">9,074.0</td>
<td style="text-align: right;">10,020.0</td>
<td style="text-align: right;">10.4</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Commercio</td>
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">2,164.0</td>
<td style="text-align: right;">2,492.0</td>
<td style="text-align: right;">15.2</td>
</tr>
<tr class="even">
<td style="text-align: left;">Commercio</td>
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">1,043.0</td>
<td style="text-align: right;">1,191.0</td>
<td style="text-align: right;">14.2</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Commercio</td>
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">554.0</td>
<td style="text-align: right;">628.0</td>
<td style="text-align: right;">13.4</td>
</tr>
<tr class="even">
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">449,602.2</td>
<td style="text-align: right;">459,810.1</td>
<td style="text-align: right;">2.3</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">372,092.0</td>
<td style="text-align: right;">365,218.9</td>
<td style="text-align: right;">-1.8</td>
</tr>
<tr class="even">
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">50,144.2</td>
<td style="text-align: right;">60,238.2</td>
<td style="text-align: right;">20.1</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">17,786.0</td>
<td style="text-align: right;">23,129.0</td>
<td style="text-align: right;">30.0</td>
</tr>
<tr class="even">
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">5,044.0</td>
<td style="text-align: right;">6,071.0</td>
<td style="text-align: right;">20.4</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">2,942.0</td>
<td style="text-align: right;">3,339.0</td>
<td style="text-align: right;">13.5</td>
</tr>
<tr class="even">
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">1,594.0</td>
<td style="text-align: right;">1,814.0</td>
<td style="text-align: right;">13.8</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Totale</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">1,007,804.2</td>
<td style="text-align: right;">1,005,317.8</td>
<td style="text-align: right;">-0.2</td>
</tr>
<tr class="even">
<td style="text-align: left;">Totale</td>
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">794,106.0</td>
<td style="text-align: right;">765,492.8</td>
<td style="text-align: right;">-3.6</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Totale</td>
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">134,811.2</td>
<td style="text-align: right;">147,832.0</td>
<td style="text-align: right;">9.7</td>
</tr>
<tr class="even">
<td style="text-align: left;">Totale</td>
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">52,613.0</td>
<td style="text-align: right;">61,953.0</td>
<td style="text-align: right;">17.8</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Totale</td>
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">14,602.0</td>
<td style="text-align: right;">16,865.0</td>
<td style="text-align: right;">15.5</td>
</tr>
<tr class="even">
<td style="text-align: left;">Totale</td>
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">7,860.0</td>
<td style="text-align: right;">8,890.0</td>
<td style="text-align: right;">13.1</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Totale</td>
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">3,812.0</td>
<td style="text-align: right;">4,285.0</td>
<td style="text-align: right;">12.4</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> l’universo della Rilevazione passa da 1.007.804 a 1.005.318 imprese con almeno 3 addetti. Calano le microimprese (3-9 addetti) e crescono tutte le altre classi: lo stesso spostamento verso imprese più grandi che il comunicato documenta con il registro ASIA.</p>
</div>
</div>
<p><strong>Commento.</strong> La tabella conta le imprese dell’universo della Rilevazione: imprese attive con almeno 3 addetti nell’industria e nei servizi, esclusa la finanza. I valori hanno decimali perché sono stime campionarie riportate all’universo, non un conteggio. Le grandezze strutturali dell’edizione 2025 si riferiscono al 2024 (registro statistico delle imprese attive), quelle dell’edizione 2022 al 2021; le risposte al questionario riguardano invece l’anno della rilevazione.</p>
<p>Fra le due edizioni il totale resta quasi fermo (−0,2%), ma la composizione cambia. Le microimprese da 3 a 9 addetti scendono del 3,6%, le classi da 10 addetti in su crescono fra il 9,7% e il 17,8%. I macrosettori si muovono in direzioni diverse: commercio (−5,4%) e industria in senso stretto (−3,4%) perdono imprese, costruzioni (+5,8%) e altri servizi (+2,3%) ne guadagnano.</p>
<p>Questa tabella è il denominatore di tutto il notebook. Un cambiamento di composizione pesa sulle quote aggregate: se crescono le classi più grandi, che usano più spesso il credito bancario, la quota totale può salire anche senza che una singola classe cambi comportamento. La sezione 3 controlla questo effetto classe per classe.</p>
<div id="dd3d06fb" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="4">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-5-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> in ogni macrosettore le barre arancioni (calo) stanno in alto, fra le microimprese, e quelle blu (crescita) nelle classi più grandi. Le costruzioni sono l’unico macrosettore in cui crescono anche le microimprese (2,1%).</p>
</div>
</div>
<p><strong>Commento.</strong> Il grafico mostra la variazione 2022-2025 classe per classe. In tre macrosettori su quattro le microimprese calano: −7,4% nell’industria in senso stretto e nel commercio, −1,8% negli altri servizi. Le costruzioni sono l’eccezione: crescono anche le microimprese (+2,1%) e le classi da 20 addetti in su aumentano fra il 28,6 e il 36,7%. Negli altri servizi la crescita più forte è fra 20 e 49 addetti (+30,0%).</p>
<p>Le barre non dicono quanto pesa ciascuna classe. Le microimprese sono il 76,1% delle imprese nel 2025: il loro calo del 3,6% vale circa 28.600 imprese, più dell’aumento di tutte le altre classi messe insieme (circa 26.100). Per questo il totale scende leggermente anche se quasi tutte le barre sono blu.</p>
<div id="2cc64521" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="5">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 9%">
<col style="width: 11%">
<col style="width: 47%">
<col style="width: 32%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: right;">anno</th>
<th style="text-align: right;">tavola</th>
<th style="text-align: left;">contenuto</th>
<th style="text-align: right;">scarto massimo (punti %)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;">2022</td>
<td style="text-align: right;">39</td>
<td style="text-align: left;">fonti di finanziamento</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="even">
<td style="text-align: right;">2022</td>
<td style="text-align: right;">40</td>
<td style="text-align: left;">fonti di finanziamento, divisioni</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="odd">
<td style="text-align: right;">2022</td>
<td style="text-align: right;">41</td>
<td style="text-align: left;">motivi del finanziamento esterno</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="even">
<td style="text-align: right;">2022</td>
<td style="text-align: right;">43</td>
<td style="text-align: left;">prestiti richiesti e ottenuti</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="odd">
<td style="text-align: right;">2025</td>
<td style="text-align: right;">39</td>
<td style="text-align: left;">fonti di finanziamento</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="even">
<td style="text-align: right;">2025</td>
<td style="text-align: right;">40</td>
<td style="text-align: left;">fonti di finanziamento, divisioni</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="odd">
<td style="text-align: right;">2025</td>
<td style="text-align: right;">41</td>
<td style="text-align: left;">motivi del finanziamento esterno</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="even">
<td style="text-align: right;">2025</td>
<td style="text-align: right;">43</td>
<td style="text-align: left;">prestiti richiesti e ottenuti</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="odd">
<td style="text-align: right;">2025</td>
<td style="text-align: right;">45</td>
<td style="text-align: left;">ricapitalizzazione</td>
<td style="text-align: right;">0.000000</td>
</tr>
<tr class="even">
<td style="text-align: right;">2025</td>
<td style="text-align: right;">47</td>
<td style="text-align: left;">motivi della mancata ricapitalizzazione</td>
<td style="text-align: right;">0.000000</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> le percentuali ricalcolate dai valori assoluti coincidono con quelle pubblicate da Istat: la lettura delle tavole è corretta.</p>
</div>
</div>
<p><strong>Commento.</strong> La tabella controlla la lettura delle tavole. Per ogni tavola usata si ricalcolano le percentuali dai valori assoluti e si confrontano con quelle pubblicate da Istat nello stesso foglio; lo scarto massimo è zero in tutte. Ogni tavola usa il suo denominatore: l’universo per le fonti di finanziamento, le imprese che ricorrono a finanziamenti esterni per i motivi, le imprese che hanno chiesto un prestito per l’esito, le società di capitali per la ricapitalizzazione.</p>
<p>Il controllo dice che i numeri del notebook sono quelli di Istat; non dice nulla sulla precisione delle stime. L’appendice non pubblica gli errori campionari cella per cella, quindi le differenze di pochi decimi di punto fra due anni o due classi piccole vanno lette con cautela. Due voci hanno cambiato nome fra le edizioni. «Finanziamenti pubblici» (2022) e «Finanziamenti pubblici nazionali» (2025) sono trattate come la stessa voce, come fa Istat nel comunicato; i motivi «responsabilità sociale ed ambientale» (2022) e «sostenibilità ambientale» (2025) restano separati.</p>
</section>
<section id="fonti-di-finanziamento-2022-e-2025" class="level2">
<h2 class="anchored" data-anchor-id="fonti-di-finanziamento-2022-e-2025">2. Fonti di finanziamento: 2022 e 2025</h2>
<p>Quota di imprese che dichiara di aver usato ciascuna fonte fra le principali (risposta multipla).</p>
<div id="5a782b9d" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="6">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 67%">
<col style="width: 9%">
<col style="width: 9%">
<col style="width: 13%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">fonte</th>
<th style="text-align: right;">% 2022</th>
<th style="text-align: right;">% 2025</th>
<th style="text-align: right;">diff. punti</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">Autofinanziamento</td>
<td style="text-align: right;">80.29</td>
<td style="text-align: right;">81.40</td>
<td style="text-align: right;">1.12</td>
</tr>
<tr class="even">
<td style="text-align: left;">Credito bancario a medio o lungo termine (12 mesi e oltre)</td>
<td style="text-align: right;">28.15</td>
<td style="text-align: right;">27.92</td>
<td style="text-align: right;">-0.23</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Credito bancario a breve termine (meno di 12 mesi)</td>
<td style="text-align: right;">11.53</td>
<td style="text-align: right;">14.19</td>
<td style="text-align: right;">2.67</td>
</tr>
<tr class="even">
<td style="text-align: left;">Leasing o factoring</td>
<td style="text-align: right;">9.12</td>
<td style="text-align: right;">11.71</td>
<td style="text-align: right;">2.59</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: right;">5.52</td>
<td style="text-align: right;">6.93</td>
<td style="text-align: right;">1.42</td>
</tr>
<tr class="even">
<td style="text-align: left;">Equity (mezzi propri)</td>
<td style="text-align: right;">2.73</td>
<td style="text-align: right;">4.42</td>
<td style="text-align: right;">1.69</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Incentivi e/o agevolazioni pubbliche</td>
<td style="text-align: right;">3.55</td>
<td style="text-align: right;">3.37</td>
<td style="text-align: right;">-0.17</td>
</tr>
<tr class="even">
<td style="text-align: left;">Altre fonti di finanziamento esterno</td>
<td style="text-align: right;">2.51</td>
<td style="text-align: right;">2.97</td>
<td style="text-align: right;">0.47</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Contributi e/o fondi UE</td>
<td style="text-align: right;">2.46</td>
<td style="text-align: right;">2.55</td>
<td style="text-align: right;">0.08</td>
</tr>
<tr class="even">
<td style="text-align: left;">Finanziamenti pubblici nazionali</td>
<td style="text-align: right;">2.02</td>
<td style="text-align: right;">1.71</td>
<td style="text-align: right;">-0.32</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Prestiti intra-gruppo</td>
<td style="text-align: right;">0.75</td>
<td style="text-align: right;">0.85</td>
<td style="text-align: right;">0.09</td>
</tr>
<tr class="even">
<td style="text-align: left;">Cambiali finanziarie</td>
<td style="text-align: right;">0.18</td>
<td style="text-align: right;">0.17</td>
<td style="text-align: right;">-0.01</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Venture capital e/o private equity</td>
<td style="text-align: right;">0.08</td>
<td style="text-align: right;">0.14</td>
<td style="text-align: right;">0.06</td>
</tr>
<tr class="even">
<td style="text-align: left;">Prestiti su titoli</td>
<td style="text-align: right;">0.13</td>
<td style="text-align: right;">0.11</td>
<td style="text-align: right;">-0.02</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Equity derivante da aumento di capitale in IPO (Initial Public Offering)</td>
<td style="text-align: right;">0.06</td>
<td style="text-align: right;">0.10</td>
<td style="text-align: right;">0.05</td>
</tr>
<tr class="even">
<td style="text-align: left;">Project finance</td>
<td style="text-align: right;">0.04</td>
<td style="text-align: right;">0.05</td>
<td style="text-align: right;">0.01</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Crowd-funding</td>
<td style="text-align: right;">0.03</td>
<td style="text-align: right;">0.03</td>
<td style="text-align: right;">0.01</td>
</tr>
<tr class="even">
<td style="text-align: left;">Minibond</td>
<td style="text-align: right;">0.04</td>
<td style="text-align: right;">0.03</td>
<td style="text-align: right;">-0.01</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> l’autofinanziamento resta la fonte di gran lunga più diffusa (81,4%). Fra le fonti esterne crescono il credito bancario a breve (11,5 → 14,2%), leasing e factoring e il credito commerciale; il credito a medio-lungo termine è fermo. L’equity passa da 2,7 a 4,4%.</p>
</div>
</div>
<p><strong>Commento.</strong> La domanda chiede le principali fonti di finanziamento usate nell’anno, con risposta multipla: le quote non sommano a 100. L’ordine delle prime due fonti non cambia. L’autofinanziamento resta di gran lunga la più diffusa (dall’80,3 all’81,4%), il credito bancario a medio-lungo termine la seconda (dal 28,2 al 27,9%).</p>
<p>I movimenti più ampi sono fra le fonti esterne a breve. Il credito bancario a breve guadagna 2,7 punti (dall’11,5 al 14,2%), leasing e factoring 2,6 punti (dal 9,1 all’11,7%), il credito commerciale 1,4 punti (dal 5,5 al 6,9%). L’equity da mezzi propri passa dal 2,7 al 4,4%.</p>
<p>Il sostegno pubblico è stabile o in lieve calo: incentivi e agevolazioni dal 3,5 al 3,4%, finanziamenti pubblici nazionali dal 2,0 all’1,7%, contributi e fondi UE intorno al 2,5%. Gli strumenti di mercato restano marginali: venture capital, quotazione, project finance, crowdfunding e minibond stanno ciascuno sotto lo 0,2% delle imprese.</p>
<p>Nel comunicato Istat legge questi movimenti alla luce della discesa dei tassi della BCE nel 2025, dopo i rialzi del 2022: è l’interpretazione della fonte, non un risultato di questa tabella.</p>
<div id="1a8b3b35" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="7">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-8-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> 11 fonti superano lo 0,5% delle imprese nel 2025. L’autofinanziamento ha una scala a parte; fra le altre il credito bancario a medio-lungo termine resta la seconda fonte, ma il passo avanti più lungo è del credito a breve e di leasing e factoring.</p>
</div>
</div>
<p><strong>Commento.</strong> Il grafico riporta le fonti usate da almeno lo 0,5% delle imprese nel 2025. L’autofinanziamento sta in un pannello a parte perché la sua scala, intorno all’80%, schiaccerebbe tutte le altre. Il punto grigio è il 2022, quello colorato il 2025: blu se la quota sale, arancione se scende.</p>
<p>I segmenti più lunghi sono quelli del credito bancario a breve e di leasing e factoring. Le tre voci arancioni (credito bancario a medio-lungo termine, incentivi pubblici, finanziamenti pubblici nazionali) si muovono di pochi decimi di punto: a questa distanza la differenza fra salire e scendere è più piccola dell’incertezza di una stima campionaria.</p>
<div id="83ead024" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="8">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-9-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> salgono in tutti i macrosettori: banca, breve, credito commerciale, leasing o factoring, equity, intra-gruppo. Il credito bancario a medio-lungo termine varia fra -0,8 e 0,4 punti.</p>
</div>
</div>
<p><strong>Commento.</strong> Lo stesso confronto per macrosettore mostra che i movimenti non vengono da un solo settore. Il credito bancario a breve sale ovunque: industria in senso stretto dal 17,3 al 20,1%, commercio dal 13,0 al 16,5%, costruzioni dal 13,0 al 15,6%, altri servizi dal 7,9 al 10,3%. Il credito commerciale sale in tutti e quattro (nel commercio dal 7,9 al 10,5%), e così leasing e factoring, equity e prestiti infragruppo.</p>
<p>Il credito a medio-lungo termine è quasi fermo: cala di pochi decimi in industria, costruzioni e commercio e cresce di 0,3 punti negli altri servizi. L’industria in senso stretto resta il macrosettore più legato al credito bancario, gli altri servizi il meno legato; le costruzioni raddoppiano la quota di imprese che usa l’equity (dal 2,1 al 4,3%). I prestiti infragruppo restano sotto l’1,5% ovunque, perché riguardano soprattutto le imprese che appartengono a un gruppo.</p>
</section>
<section id="per-classe-di-addetti" class="level2">
<h2 class="anchored" data-anchor-id="per-classe-di-addetti">3. Per classe di addetti</h2>
<p>Le stesse quote per classe di addetti, totale dei settori.</p>
<div id="a1fe2f6e" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="9">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-10-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 16%">
<col style="width: 12%">
<col style="width: 16%">
<col style="width: 17%">
<col style="width: 17%">
<col style="width: 7%">
<col style="width: 12%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">classe di addetti</th>
<th style="text-align: right;">Banca, breve</th>
<th style="text-align: right;">Banca, medio-lungo</th>
<th style="text-align: right;">Credito commerciale</th>
<th style="text-align: right;">Leasing o factoring</th>
<th style="text-align: right;">Equity</th>
<th style="text-align: right;">Intra-gruppo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">+2.5</td>
<td style="text-align: right;">-0.6</td>
<td style="text-align: right;">+1.3</td>
<td style="text-align: right;">+2.2</td>
<td style="text-align: right;">+1.6</td>
<td style="text-align: right;">+0.1</td>
</tr>
<tr class="even">
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">+2.2</td>
<td style="text-align: right;">-0.1</td>
<td style="text-align: right;">+1.4</td>
<td style="text-align: right;">+2.3</td>
<td style="text-align: right;">+2.0</td>
<td style="text-align: right;">-0.0</td>
</tr>
<tr class="odd">
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">+1.7</td>
<td style="text-align: right;">-1.9</td>
<td style="text-align: right;">+1.3</td>
<td style="text-align: right;">+2.8</td>
<td style="text-align: right;">+1.6</td>
<td style="text-align: right;">-0.2</td>
</tr>
<tr class="even">
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">+2.1</td>
<td style="text-align: right;">-1.7</td>
<td style="text-align: right;">+1.5</td>
<td style="text-align: right;">+3.4</td>
<td style="text-align: right;">+1.8</td>
<td style="text-align: right;">-0.1</td>
</tr>
<tr class="odd">
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">+1.3</td>
<td style="text-align: right;">-1.5</td>
<td style="text-align: right;">+1.1</td>
<td style="text-align: right;">+3.4</td>
<td style="text-align: right;">+1.6</td>
<td style="text-align: right;">-0.3</td>
</tr>
<tr class="even">
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">+0.9</td>
<td style="text-align: right;">+1.3</td>
<td style="text-align: right;">+0.0</td>
<td style="text-align: right;">+4.9</td>
<td style="text-align: right;">-1.0</td>
<td style="text-align: right;">-0.5</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> nel grafico, i livelli 2025: usa il credito bancario a breve il 31,5% delle imprese con 250 addetti e oltre, contro 11,9% delle microimprese. Nella tabella, la variazione 2022-2025 in punti: il credito a breve cresce di più fra le microimprese (2,5) che fra le grandi (0,9); leasing e factoring al contrario (2,2 contro 4,9).</p>
</div>
</div>
<p><strong>Commento.</strong> Per classe di addetti la diffusione delle fonti esterne cresce con la dimensione. Nel 2025 usa il credito bancario a breve l’11,9% delle microimprese e il 31,5% delle imprese con 250 addetti e oltre; i prestiti infragruppo vanno dallo 0,4 al 15,4%. Il credito a medio-lungo termine fa eccezione: tocca il massimo fra 50 e 99 addetti (43,0%) e scende fra le imprese più grandi (40,6%).</p>
<p>La tabella sotto il grafico risponde alla domanda lasciata aperta nella sezione 1. L’aumento del credito a breve c’è in ogni classe, da +0,9 punti fra le grandi a +2,5 fra le microimprese: non è solo un effetto della composizione. Leasing e factoring crescono invece di più fra le grandi (+4,9 punti contro +2,2). Le imprese con 250 addetti e oltre sono l’unica classe in cui l’equity cala (−1,0 punti) e il credito a medio-lungo termine sale (+1,3).</p>
</section>
<section id="perché-le-imprese-ricorrono-al-finanziamento-esterno" class="level2">
<h2 class="anchored" data-anchor-id="perché-le-imprese-ricorrono-al-finanziamento-esterno">4. Perché le imprese ricorrono al finanziamento esterno</h2>
<p>Quota sulle imprese che hanno fatto ricorso a finanziamenti esterni (risposta multipla).</p>
<div id="311d006b" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="10">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 72%">
<col style="width: 7%">
<col style="width: 7%">
<col style="width: 11%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">motivo</th>
<th style="text-align: right;">% 2022</th>
<th style="text-align: right;">% 2025</th>
<th style="text-align: right;">diff. punti</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">Esigenze di liquidità e/o capitale liquido</td>
<td style="text-align: right;">43.1</td>
<td style="text-align: right;">39.0</td>
<td style="text-align: right;">-4.1</td>
</tr>
<tr class="even">
<td style="text-align: left;">Attività ordinaria (es: personale, spese correnti, ecc.)</td>
<td style="text-align: right;">37.5</td>
<td style="text-align: right;">37.0</td>
<td style="text-align: right;">-0.5</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Investimenti per l’ampliamento della capacità produttiva</td>
<td style="text-align: right;">29.8</td>
<td style="text-align: right;">33.2</td>
<td style="text-align: right;">3.3</td>
</tr>
<tr class="even">
<td style="text-align: left;">Altro motivo</td>
<td style="text-align: right;">20.3</td>
<td style="text-align: right;">22.5</td>
<td style="text-align: right;">2.2</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Investimenti in nuove tecnologie di tipo digitale</td>
<td style="text-align: right;">8.9</td>
<td style="text-align: right;">7.5</td>
<td style="text-align: right;">-1.4</td>
</tr>
<tr class="even">
<td style="text-align: left;">Investimenti per implementare misure finalizzate alla sostenibilità ambientale</td>
<td style="text-align: right;">nan</td>
<td style="text-align: right;">3.8</td>
<td style="text-align: right;">nan</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Investimenti in nuove tecnologie di tipo non digitale (es: tecnologie green)</td>
<td style="text-align: right;">2.4</td>
<td style="text-align: right;">2.8</td>
<td style="text-align: right;">0.4</td>
</tr>
<tr class="even">
<td style="text-align: left;">Internazionalizzazione</td>
<td style="text-align: right;">1.3</td>
<td style="text-align: right;">1.4</td>
<td style="text-align: right;">0.1</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Partecipazione (anche azionaria) in altre imprese</td>
<td style="text-align: right;">0.6</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">0.3</td>
</tr>
<tr class="even">
<td style="text-align: left;">Investimenti per implementare misure finalizzate alla responsabilità sociale ed ambientale</td>
<td style="text-align: right;">1.3</td>
<td style="text-align: right;">nan</td>
<td style="text-align: right;">nan</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> ricorrono a finanziamenti esterni 459.615 imprese nel 2025 (45,7% dell’universo; 44,1% nel 2022). Il bisogno di liquidità resta il primo motivo ma scende; sale l’ampliamento della capacità produttiva.</p>
</div>
</div>
<p><strong>Commento.</strong> Qui il denominatore cambia: sono le imprese che hanno fatto ricorso a finanziamenti esterni, 459.615 nel 2025, cioè il 45,7% dell’universo (44,1% nel 2022). Anche questa domanda ammette più risposte.</p>
<p>I tre motivi principali restano gli stessi. Le esigenze di liquidità scendono dal 43,1 al 39,0%, l’attività ordinaria (personale, spese correnti) è stabile intorno al 37%, l’ampliamento della capacità produttiva sale dal 29,8 al 33,2%. Fra gli investimenti specifici, le nuove tecnologie digitali scendono dall’8,9 al 7,5%, quelle non digitali salgono dal 2,4 al 2,8%.</p>
<p>Il quadro è di un credito esterno meno legato al bisogno di cassa e un po’ più agli investimenti in capacità. Nel comunicato Istat aggiunge che le imprese piccole ricorrono al credito esterno soprattutto per l’attività corrente, quelle grandi per investire. La voce sulla sostenibilità ambientale (2025) e quella sulla responsabilità sociale e ambientale (2022) sono domande diverse e non si confrontano.</p>
<div id="669e1502" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="11">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-12-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> i tre motivi principali restano liquidità, attività ordinaria e ampliamento della capacità produttiva; fra il 2022 e il 2025 i primi due perdono terreno e il terzo ne guadagna. Le misure di sostenibilità ambientale (2025) e di responsabilità sociale e ambientale (2022) sono domande diverse: un solo punto ciascuna.</p>
</div>
</div>
<p><strong>Commento.</strong> Il grafico ordina i motivi per la quota del 2025. Le due voci arancioni in alto (liquidità e attività ordinaria) indicano un ricorso al credito meno legato alla gestione corrente; il segmento blu dell’ampliamento della capacità produttiva è il movimento opposto. Le voci in fondo riguardano pochi punti percentuali: internazionalizzazione e partecipazioni in altre imprese restano sotto il 2% di chi ricorre al credito esterno.</p>
</section>
<section id="prestiti-richiesti-e-ottenuti" class="level2">
<h2 class="anchored" data-anchor-id="prestiti-richiesti-e-ottenuti">5. Prestiti richiesti e ottenuti</h2>
<p>Quota di imprese che ha chiesto un prestito a banche o altri intermediari e, fra queste, esito della richiesta. Nel 2022 la tavola riportava anche se il prestito era assistito da garanzia pubblica; nell’edizione 2025 quella domanda non c’è più.</p>
<div id="30ee4e3d" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="12">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 4%">
<col style="width: 16%">
<col style="width: 24%">
<col style="width: 24%">
<col style="width: 20%">
<col style="width: 10%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: right;">anno</th>
<th style="text-align: right;">richiesto prestito % imprese</th>
<th style="text-align: right;">Sì, per l’ammontare richiesto % richiedenti</th>
<th style="text-align: right;">Sì, ma per ammontare inferiore % richiedenti</th>
<th style="text-align: right;">Esito non ancora noto % richiedenti</th>
<th style="text-align: right;">No % richiedenti</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;">2022</td>
<td style="text-align: right;">24.0</td>
<td style="text-align: right;">84.4</td>
<td style="text-align: right;">9.5</td>
<td style="text-align: right;">2.6</td>
<td style="text-align: right;">3.5</td>
</tr>
<tr class="even">
<td style="text-align: right;">2025</td>
<td style="text-align: right;">23.8</td>
<td style="text-align: right;">85.6</td>
<td style="text-align: right;">8.2</td>
<td style="text-align: right;">3.9</td>
<td style="text-align: right;">2.4</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> la quota di imprese che chiede un prestito passa da 24,0 a 23,8%. Fra chi lo chiede, nel 2025 lo ottiene per l’intero importo l’85,6%; i rifiuti sono 2,4% (3,5% nel 2022).</p>
</div>
</div>
<p><strong>Commento.</strong> La quota di imprese che ha chiesto un prestito a banche o altri intermediari è stabile: 24,0% nel 2022, 23,8% nel 2025. Fra chi l’ha chiesto, la quota che lo ottiene per l’intero importo sale dall’84,4 all’85,6%, quella che lo ottiene per un importo inferiore scende dal 9,5 all’8,2%, i rifiuti scendono dal 3,5 al 2,4%.</p>
<p>Due cautele. L’esito non ancora noto sale dal 2,6 al 3,9%: una parte delle richieste del 2025 era ancora in istruttoria e il suo esito finale non è nella tavola. La base delle percentuali sull’esito sono le imprese che hanno chiesto un prestito, come nella figura 25 del comunicato; nel testo del comunicato il 2,4% di rifiuti è riferito invece alle imprese con almeno 3 addetti. Sul totale delle imprese i rifiuti sarebbero circa lo 0,6%.</p>
<p>Secondo Istat, tre imprese su quattro non hanno chiesto prestiti e l’80,3% di queste non ne aveva bisogno (77% nel 2022).</p>
<div id="b47c499a" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="13">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-14-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> ogni barra è il 100% delle imprese che hanno chiesto un prestito. La parte scura (prestito concesso per intero) copre quasi tutta la barra in entrambi gli anni; la parte arancione (rifiutato) è sottile e si assottiglia nel 2025.</p>
</div>
</div>
<p><strong>Commento.</strong> Ogni barra è il 100% delle imprese che hanno chiesto un prestito. La parte scura, il prestito concesso per intero, occupa più dell’84% in entrambi gli anni. La differenza fra le due barre sta nelle code: si accorcia la parte concessa per un importo inferiore, si allunga quella con esito non ancora noto, si assottiglia quella dei rifiuti.</p>
<div id="a2672b1c" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="14">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 19%">
<col style="width: 5%">
<col style="width: 34%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">classe di addetti</th>
<th style="text-align: right;">Sì, completamente</th>
<th style="text-align: right;">Sì, parzialmente</th>
<th style="text-align: right;">No</th>
<th style="text-align: right;">con garanzia (totale o parziale)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">19.4</td>
<td style="text-align: right;">27.3</td>
<td style="text-align: right;">53.2</td>
<td style="text-align: right;">46.8</td>
</tr>
<tr class="even">
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">14.5</td>
<td style="text-align: right;">37.4</td>
<td style="text-align: right;">48.1</td>
<td style="text-align: right;">51.9</td>
</tr>
<tr class="odd">
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">14.1</td>
<td style="text-align: right;">41.6</td>
<td style="text-align: right;">44.3</td>
<td style="text-align: right;">55.7</td>
</tr>
<tr class="even">
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">12.1</td>
<td style="text-align: right;">42.7</td>
<td style="text-align: right;">45.2</td>
<td style="text-align: right;">54.8</td>
</tr>
<tr class="odd">
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">9.8</td>
<td style="text-align: right;">39.4</td>
<td style="text-align: right;">50.8</td>
<td style="text-align: right;">49.2</td>
</tr>
<tr class="even">
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">7.3</td>
<td style="text-align: right;">26.5</td>
<td style="text-align: right;">66.2</td>
<td style="text-align: right;">33.8</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">17.6</td>
<td style="text-align: right;">31.1</td>
<td style="text-align: right;">51.3</td>
<td style="text-align: right;">48.7</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> solo edizione 2022. Fra le imprese che hanno chiesto un prestito, il 48,7% lo ha avuto assistito in tutto o in parte da garanzia pubblica; la quota più alta è fra 20-49 addetti (55,7%), la più bassa fra 250 e oltre addetti (33,8%). È il dato che si collega al Fondo di garanzia per le PMI; l’edizione 2025 non permette di aggiornarlo.</p>
</div>
</div>
<p><strong>Commento.</strong> Solo l’edizione 2022 chiedeva se il prestito era assistito da una garanzia pubblica. Fra le imprese con almeno 3 addetti che avevano chiesto un prestito, il 48,7% aveva una garanzia pubblica: completa per il 17,6%, parziale per il 31,1%. Le tre colonne sommano al 100% delle imprese che hanno chiesto un prestito, comprese quelle che non l’hanno ottenuto.</p>
<p>La forma della garanzia cambia con la dimensione. La garanzia completa è più frequente fra le microimprese (19,4%) e scende fino al 7,3% fra le imprese con 250 addetti e oltre. La garanzia parziale prevale fra 10 e 249 addetti, con un massimo del 42,7% fra 50 e 99. Nel complesso la quota garantita più alta è fra 20 e 49 addetti (55,7%), la più bassa fra le imprese più grandi (33,8%).</p>
<p>È il dato della Rilevazione che si collega al Fondo di garanzia per le PMI. L’edizione 2025 non ripete la domanda: non si può dire da questa fonte se la quota di prestiti garantiti sia cresciuta o calata.</p>
<div id="9ff8aa84" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="15">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-16-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> la garanzia completa (blu scuro) pesa di più fra le microimprese, quella parziale (azzurro) fra le imprese da 10 a 249 addetti; fra le imprese con 250 addetti e oltre entrambe sono più rare.</p>
</div>
</div>
<p><strong>Commento.</strong> Il grafico separa la garanzia completa (blu) da quella parziale (azzurro). La lunghezza totale della barra disegna una curva: sale dalle microimprese fino alla classe 20-49 e poi scende, con un calo netto fra le imprese con 250 addetti e oltre. Il blu invece si accorcia con continuità al crescere della dimensione: più l’impresa è piccola, più spesso la garanzia copre tutto il prestito.</p>
</section>
<section id="ricapitalizzazione-solo-2025" class="level2">
<h2 class="anchored" data-anchor-id="ricapitalizzazione-solo-2025">6. Ricapitalizzazione (solo 2025)</h2>
<p>Le tavole 45-48 sono nuove nell’edizione 2025 e riguardano le sole società di capitali.</p>
<div id="9c51bea6" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="16">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 7%">
<col style="width: 7%">
<col style="width: 26%">
<col style="width: 15%">
<col style="width: 19%">
<col style="width: 20%">
<col style="width: 2%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">classe di addetti</th>
<th style="text-align: right;">attuato % società</th>
<th style="text-align: right;">Sì, con l’apporto di capitale privato di fondi di private equity o IPOs</th>
<th style="text-align: right;">Sì, con l’apporto di capitale dei soci</th>
<th style="text-align: right;">Sì, con l’apporto di capitale privato di nuovi soci</th>
<th style="text-align: right;">Sì, con il sostegno di incentivi pubblici o contributi</th>
<th style="text-align: right;">No</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">9.1</td>
<td style="text-align: right;">0.5</td>
<td style="text-align: right;">5.2</td>
<td style="text-align: right;">1.0</td>
<td style="text-align: right;">2.4</td>
<td style="text-align: right;">90.9</td>
</tr>
<tr class="even">
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">10.8</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">5.9</td>
<td style="text-align: right;">0.9</td>
<td style="text-align: right;">3.1</td>
<td style="text-align: right;">89.2</td>
</tr>
<tr class="odd">
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">10.6</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">5.8</td>
<td style="text-align: right;">1.1</td>
<td style="text-align: right;">2.9</td>
<td style="text-align: right;">89.4</td>
</tr>
<tr class="even">
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">11.5</td>
<td style="text-align: right;">1.2</td>
<td style="text-align: right;">6.3</td>
<td style="text-align: right;">1.3</td>
<td style="text-align: right;">2.6</td>
<td style="text-align: right;">88.5</td>
</tr>
<tr class="odd">
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">10.1</td>
<td style="text-align: right;">1.3</td>
<td style="text-align: right;">6.1</td>
<td style="text-align: right;">1.1</td>
<td style="text-align: right;">1.6</td>
<td style="text-align: right;">89.9</td>
</tr>
<tr class="even">
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">11.1</td>
<td style="text-align: right;">1.7</td>
<td style="text-align: right;">6.8</td>
<td style="text-align: right;">1.4</td>
<td style="text-align: right;">1.2</td>
<td style="text-align: right;">88.9</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">9.7</td>
<td style="text-align: right;">0.6</td>
<td style="text-align: right;">5.5</td>
<td style="text-align: right;">1.0</td>
<td style="text-align: right;">2.6</td>
<td style="text-align: right;">90.3</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> il 9,7% delle società di capitali prevede una ricapitalizzazione; il canale principale è il capitale dei soci (5,5 punti, poco più della metà), poi gli incentivi pubblici. Private equity e quotazione restano marginali anche fra le società con 250 addetti e oltre (1,7%).</p>
</div>
</div>
<p><strong>Commento.</strong> Le tavole sulla ricapitalizzazione sono nuove nell’edizione 2025 e riguardano solo le società di capitali con almeno 3 addetti, circa 482mila. Il 9,7%, quasi 47mila società, ha attuato o prevede una ricapitalizzazione.</p>
<p>Il canale prevalente è il capitale dei soci (5,5% delle società), seguito dagli incentivi pubblici o contributi (2,6%), dai nuovi soci (1,0%) e dai fondi di private equity o dalla quotazione (0,6%). La quota che si ricapitalizza varia poco con la dimensione, dal 9,1% delle microimprese all’11,5% della classe 50-99. Cambia invece il canale: il capitale dei soci sale dal 5,2 al 6,8% andando dalle micro alle grandi, private equity e quotazione dallo 0,5 all’1,7%, mentre gli incentivi pubblici toccano il massimo fra 10 e 19 addetti (3,1%) e scendono all’1,2% fra le grandi.</p>
<p>Nel comunicato Istat segnala una propensione più alta nel Mezzogiorno (12,0%).</p>
<div id="7a8df507" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="17">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-18-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> la barra intera è la quota di società che prevede una ricapitalizzazione: circa una su dieci in ogni classe. Il blu scuro (capitale dei soci) è sempre la parte più lunga; l’arancione (private equity o quotazione) si allunga con la dimensione ma resta sotto il 2%.</p>
</div>
</div>
<p><strong>Commento.</strong> La barra intera è la quota di società che prevede una ricapitalizzazione, quasi la stessa in ogni classe: circa una su dieci. La parte blu scura, il capitale dei soci, è sempre la più lunga. La parte arancione, private equity o quotazione, si allunga con la dimensione ma resta sotto il 2% anche fra le società con 250 addetti e oltre. L’azzurro degli incentivi pubblici si accorcia nelle classi più grandi: le imprese che ne fanno il canale prevalente sono soprattutto piccole.</p>
<div id="6e55831f" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="18">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 6%">
<col style="width: 14%">
<col style="width: 19%">
<col style="width: 19%">
<col style="width: 10%">
<col style="width: 24%">
<col style="width: 4%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">classe di addetti</th>
<th style="text-align: right;">Mantenere inalterato l’assetto proprietario</th>
<th style="text-align: right;">Impossibilità da parte dei soci a conferire nuovi capitali</th>
<th style="text-align: right;">Difficoltà di accesso a capitale esterno (pubblico o privato)</th>
<th style="text-align: right;">Mancanza di adeguati incentivi</th>
<th style="text-align: right;">Non erano previsti piani di espansione o investimento di dimensione rilevante</th>
<th style="text-align: right;">Altro motivo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">3-9</td>
<td style="text-align: right;">48.2</td>
<td style="text-align: right;">7.8</td>
<td style="text-align: right;">2.2</td>
<td style="text-align: right;">4.3</td>
<td style="text-align: right;">33.1</td>
<td style="text-align: right;">20.1</td>
</tr>
<tr class="even">
<td style="text-align: left;">10-19</td>
<td style="text-align: right;">52.6</td>
<td style="text-align: right;">6.3</td>
<td style="text-align: right;">1.4</td>
<td style="text-align: right;">2.9</td>
<td style="text-align: right;">28.8</td>
<td style="text-align: right;">21.0</td>
</tr>
<tr class="odd">
<td style="text-align: left;">20-49</td>
<td style="text-align: right;">53.5</td>
<td style="text-align: right;">4.7</td>
<td style="text-align: right;">1.1</td>
<td style="text-align: right;">2.0</td>
<td style="text-align: right;">26.9</td>
<td style="text-align: right;">23.3</td>
</tr>
<tr class="even">
<td style="text-align: left;">50-99</td>
<td style="text-align: right;">53.7</td>
<td style="text-align: right;">3.2</td>
<td style="text-align: right;">0.9</td>
<td style="text-align: right;">1.3</td>
<td style="text-align: right;">24.4</td>
<td style="text-align: right;">26.3</td>
</tr>
<tr class="odd">
<td style="text-align: left;">100-249</td>
<td style="text-align: right;">51.7</td>
<td style="text-align: right;">2.3</td>
<td style="text-align: right;">0.6</td>
<td style="text-align: right;">1.0</td>
<td style="text-align: right;">22.7</td>
<td style="text-align: right;">30.6</td>
</tr>
<tr class="even">
<td style="text-align: left;">250 e oltre</td>
<td style="text-align: right;">47.4</td>
<td style="text-align: right;">1.2</td>
<td style="text-align: right;">0.5</td>
<td style="text-align: right;">0.6</td>
<td style="text-align: right;">19.8</td>
<td style="text-align: right;">39.4</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">50.0</td>
<td style="text-align: right;">6.9</td>
<td style="text-align: right;">1.8</td>
<td style="text-align: right;">3.5</td>
<td style="text-align: right;">30.9</td>
<td style="text-align: right;">21.2</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> chi non si ricapitalizza lo fa soprattutto per scelta (non cambiare l’assetto proprietario, nessun piano di investimento rilevante), meno per vincoli (soci senza capitali, accesso difficile al capitale esterno).</p>
</div>
</div>
<p><strong>Commento.</strong> La tabella riguarda le società di capitali che non prevedono una ricapitalizzazione, circa 435mila, con risposta multipla. La metà indica la volontà di mantenere invariato l’assetto proprietario (50,0%), quasi una su tre l’assenza di piani di espansione o investimento rilevanti (30,9%). I vincoli pesano poco: soci senza capitali da conferire 6,9%, incentivi inadeguati 3,5%, accesso difficile al capitale esterno 1,8%.</p>
<p>Con la dimensione i vincoli si riducono. L’impossibilità dei soci di conferire capitale passa dal 7,8% delle microimprese all’1,2% delle grandi; anche la mancanza di piani di investimento scende, dal 33,1 al 19,8%. L’assetto proprietario resta intorno alla metà in tutte le classi, fra il 47,4 e il 53,7%. Cresce invece con la dimensione l’«altro motivo», dal 20,1 al 39,4%: fra le società più grandi quattro su dieci indicano un motivo che il questionario non prevede.</p>
<div id="eee68502" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="19">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-20-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> le due barre blu (scelte) sommano 80,9 punti, le tre azzurre (vincoli) 12,2; la risposta è multipla, quindi le somme possono superare 100.</p>
</div>
</div>
<p><strong>Commento.</strong> Il grafico separa le scelte (blu) dai vincoli (azzurro); l’«altro motivo» è in grigio perché non si sa a quale gruppo appartenga. Le due scelte sommano 80,9 punti, i tre vincoli 12,2. Poiché la risposta è multipla, le due somme non dicono quante società indicano almeno una scelta o almeno un vincolo, ma il rapporto fra le due resta netto.</p>
</section>
<section id="confronto-con-bach-per-macrosettore" class="level2">
<h2 class="anchored" data-anchor-id="confronto-con-bach-per-macrosettore">7. Confronto con BACH per macrosettore</h2>
<p>BACH Italia, società non finanziarie, campione variabile, tutte le classi: voci del passivo in % del totale attivo. I macrosettori della Rilevazione si ricompongono dalle sezioni BACH, ponderando per il totale attivo. Industria in senso stretto = B-E; Costruzioni = F; Commercio = G; Altri servizi = H, I, J, L, M (senza sedi centrali), N, R, divisioni S95 e S96. Mancano in BACH le sezioni P (istruzione) e Q (sanità), presenti nella Rilevazione.</p>
<div id="6b9e9dbd" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="20">
<div class="cell-output cell-output-display cell-output-markdown">
<p>Totale ricomposto contro <code>Zc</code> (totale BACH), debiti bancari a breve 2024: 6,28% contro 6,27%.</p>
</div>
</div>
<div id="1a6db5ce" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="21">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 14%">
<col style="width: 19%">
<col style="width: 16%">
<col style="width: 9%">
<col style="width: 15%">
<col style="width: 9%">
<col style="width: 14%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">voce</th>
<th style="text-align: left;">macrosettore</th>
<th style="text-align: right;">Istat % imprese 2022</th>
<th style="text-align: right;">Istat 2025</th>
<th style="text-align: right;">BACH % attivo 2022</th>
<th style="text-align: right;">BACH 2024</th>
<th style="text-align: left;">stessa direzione</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">Banca, breve</td>
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: right;">17.3</td>
<td style="text-align: right;">20.1</td>
<td style="text-align: right;">5.3</td>
<td style="text-align: right;">4.8</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Banca, breve</td>
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: right;">13.0</td>
<td style="text-align: right;">15.6</td>
<td style="text-align: right;">4.7</td>
<td style="text-align: right;">4.2</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Banca, breve</td>
<td style="text-align: left;">Commercio</td>
<td style="text-align: right;">13.0</td>
<td style="text-align: right;">16.5</td>
<td style="text-align: right;">6.2</td>
<td style="text-align: right;">5.9</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Banca, breve</td>
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: right;">7.9</td>
<td style="text-align: right;">10.3</td>
<td style="text-align: right;">11.8</td>
<td style="text-align: right;">9.6</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Banca, breve</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">11.5</td>
<td style="text-align: right;">14.2</td>
<td style="text-align: right;">7.2</td>
<td style="text-align: right;">6.3</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Banca, medio-lungo</td>
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: right;">35.7</td>
<td style="text-align: right;">35.0</td>
<td style="text-align: right;">7.1</td>
<td style="text-align: right;">6.1</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Banca, medio-lungo</td>
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: right;">30.9</td>
<td style="text-align: right;">30.4</td>
<td style="text-align: right;">8.0</td>
<td style="text-align: right;">7.1</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="even">
<td style="text-align: left;">Banca, medio-lungo</td>
<td style="text-align: left;">Commercio</td>
<td style="text-align: right;">30.2</td>
<td style="text-align: right;">29.9</td>
<td style="text-align: right;">5.9</td>
<td style="text-align: right;">4.9</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Banca, medio-lungo</td>
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: right;">23.1</td>
<td style="text-align: right;">23.4</td>
<td style="text-align: right;">6.3</td>
<td style="text-align: right;">5.5</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Banca, medio-lungo</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">28.1</td>
<td style="text-align: right;">27.9</td>
<td style="text-align: right;">6.8</td>
<td style="text-align: right;">5.8</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: right;">8.6</td>
<td style="text-align: right;">9.8</td>
<td style="text-align: right;">18.8</td>
<td style="text-align: right;">16.9</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: right;">4.6</td>
<td style="text-align: right;">6.7</td>
<td style="text-align: right;">20.1</td>
<td style="text-align: right;">20.7</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: left;">Commercio</td>
<td style="text-align: right;">7.9</td>
<td style="text-align: right;">10.5</td>
<td style="text-align: right;">26.2</td>
<td style="text-align: right;">25.9</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: right;">3.1</td>
<td style="text-align: right;">4.1</td>
<td style="text-align: right;">12.2</td>
<td style="text-align: right;">11.3</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">5.5</td>
<td style="text-align: right;">6.9</td>
<td style="text-align: right;">18.4</td>
<td style="text-align: right;">17.1</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Equity</td>
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: right;">2.7</td>
<td style="text-align: right;">4.7</td>
<td style="text-align: right;">39.5</td>
<td style="text-align: right;">42.2</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Equity</td>
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: right;">2.1</td>
<td style="text-align: right;">4.3</td>
<td style="text-align: right;">27.4</td>
<td style="text-align: right;">30.4</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="even">
<td style="text-align: left;">Equity</td>
<td style="text-align: left;">Commercio</td>
<td style="text-align: right;">2.7</td>
<td style="text-align: right;">3.8</td>
<td style="text-align: right;">35.2</td>
<td style="text-align: right;">37.4</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Equity</td>
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: right;">2.9</td>
<td style="text-align: right;">4.7</td>
<td style="text-align: right;">31.1</td>
<td style="text-align: right;">33.5</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="even">
<td style="text-align: left;">Equity</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">2.7</td>
<td style="text-align: right;">4.4</td>
<td style="text-align: right;">35.6</td>
<td style="text-align: right;">38.1</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Intra-gruppo</td>
<td style="text-align: left;">Industria in senso stretto</td>
<td style="text-align: right;">1.1</td>
<td style="text-align: right;">1.4</td>
<td style="text-align: right;">11.2</td>
<td style="text-align: right;">10.4</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td style="text-align: left;">Intra-gruppo</td>
<td style="text-align: left;">Costruzioni</td>
<td style="text-align: right;">0.3</td>
<td style="text-align: right;">0.4</td>
<td style="text-align: right;">8.9</td>
<td style="text-align: right;">8.5</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Intra-gruppo</td>
<td style="text-align: left;">Commercio</td>
<td style="text-align: right;">0.6</td>
<td style="text-align: right;">0.7</td>
<td style="text-align: right;">7.7</td>
<td style="text-align: right;">7.8</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="even">
<td style="text-align: left;">Intra-gruppo</td>
<td style="text-align: left;">Altri servizi</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">15.5</td>
<td style="text-align: right;">17.1</td>
<td style="text-align: left;">sì</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Intra-gruppo</td>
<td style="text-align: left;">Totale</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">11.6</td>
<td style="text-align: right;">11.7</td>
<td style="text-align: left;">sì</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> in 13 casi su 25 le due fonti si muovono nella stessa direzione; per voce: banca, breve 0 su 5; banca, medio-lungo 4 su 5; credito commerciale 1 su 5; equity 5 su 5; intra-gruppo 3 su 5. L’equity concorda ovunque. Il credito bancario a breve diverge ovunque: più imprese lo usano, ma pesa meno nei bilanci BACH.</p>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p>Per capire se la divergenza dipende dal peso delle grandi imprese nella media ponderata, la distribuzione BACH del debito bancario a breve (totale <code>Zc</code>). La mediana è 0,00%: più di metà delle società non ha debiti bancari a breve, quindi la mediana non è informativa. Il terzo quartile passa da 0,91% (2022) a 0,81% (2024), la media ponderata da 7,13 a 6,27%. Scende anche il terzo quartile: la divergenza non viene solo dalle grandi imprese; resta la differenza fra «usare» una fonte, anche per un importo piccolo, e il suo peso sul totale attivo.</p>
</div>
</div>
<p><strong>Commento.</strong> La tabella accosta, per ogni voce e macrosettore, la quota di imprese che usa la fonte (Istat, 2022 e 2025) e il peso della voce corrispondente nel bilancio delle società non finanziarie (BACH, 2022 e 2024, in % del totale attivo). Il raccordo fra le voci è: credito bancario a breve con i debiti verso banche entro 12 mesi (<code>L21</code>), a medio-lungo con quelli oltre 12 mesi (<code>L22</code>), credito commerciale con i debiti verso fornitori (<code>L4</code>), equity con il patrimonio netto (<code>E</code>), prestiti infragruppo con gli altri debiti finanziari (<code>L31</code>).</p>
<p>Le due fonti vanno nella stessa direzione in 13 casi su 25. L’equity concorda in tutti i macrosettori: più imprese usano i mezzi propri e il patrimonio netto pesa di più sull’attivo (dal 35,6 al 38,1% nel totale). Il credito bancario a medio-lungo concorda in quattro casi su cinque; fa eccezione negli altri servizi, dove la quota Istat sale di 0,3 punti e il peso BACH scende. Il credito commerciale concorda solo nelle costruzioni.</p>
<p>Il credito bancario a breve non concorda in nessun macrosettore: più imprese lo usano, ma pesa meno nei bilanci (dal 7,2 al 6,3% dell’attivo nel totale ricomposto). Il paragrafo sotto la tabella mostra che scende anche il terzo quartile BACH, quindi la divergenza non viene solo dalle imprese grandi. Una lettura compatibile, da verificare, è che più imprese usino un fido per importi piccoli rispetto all’attivo. Restano le differenze di metodo: anni diversi (BACH arriva al 2024), unità diverse (imprese contro bilanci), universi diversi (la Rilevazione comprende imprese individuali e società di persone).</p>
<div id="2e3f224f" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="22">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-23-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<colgroup>
<col style="width: 8%">
<col style="width: 16%">
<col style="width: 23%">
<col style="width: 24%">
<col style="width: 10%">
<col style="width: 16%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: right;">anno</th>
<th style="text-align: right;">Banca, breve</th>
<th style="text-align: right;">Banca, medio-lungo</th>
<th style="text-align: right;">Credito commerciale</th>
<th style="text-align: right;">Equity</th>
<th style="text-align: right;">Intra-gruppo</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;">2018</td>
<td style="text-align: right;">6.1</td>
<td style="text-align: right;">6.7</td>
<td style="text-align: right;">18.5</td>
<td style="text-align: right;">34.2</td>
<td style="text-align: right;">11.6</td>
</tr>
<tr class="even">
<td style="text-align: right;">2021</td>
<td style="text-align: right;">7.7</td>
<td style="text-align: right;">7.4</td>
<td style="text-align: right;">17.5</td>
<td style="text-align: right;">36.3</td>
<td style="text-align: right;">10.1</td>
</tr>
<tr class="odd">
<td style="text-align: right;">2024</td>
<td style="text-align: right;">6.3</td>
<td style="text-align: right;">5.8</td>
<td style="text-align: right;">17.1</td>
<td style="text-align: right;">38.1</td>
<td style="text-align: right;">11.7</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> la tabella riporta le stesse serie per il 2018, 2021 e 2024. Fra il 2021 e il 2024: banca, breve 7,7 → 6,3%; banca, medio-lungo 7,4 → 5,8%; credito commerciale 17,5 → 17,1%; equity 36,3 → 38,1%; intra-gruppo 10,1 → 11,7%.</p>
</div>
</div>
<p><strong>Commento.</strong> Le serie BACH coprono il 2018-2024 per il totale ricomposto delle società non finanziarie. Il debito bancario, a breve e a medio-lungo, sale dal 2019 al 2021 (nel 2021 a breve 7,7%, a medio-lungo 7,4% dell’attivo) e poi scende fino al 2024 (6,3 e 5,8%). Il patrimonio netto cresce per tutto il periodo, dal 34,2% del 2018 al 38,1% del 2024; i debiti verso fornitori calano leggermente (dal 18,5 al 17,1%); gli altri debiti finanziari, soprattutto infragruppo, tornano nel 2024 al livello del 2018 (11,7%).</p>
<p>Il picco del 2021 è compatibile con i prestiti garantiti del periodo pandemico, ma è un’ipotesi: il notebook non scompone il debito per tipo di prestito. Il 2022, anno della seconda edizione della Rilevazione, cade già nella fase di discesa.</p>
</section>
<section id="confronto-con-bach-per-divisione" class="level2">
<h2 class="anchored" data-anchor-id="confronto-con-bach-per-divisione">8. Confronto con BACH per divisione</h2>
<p>Per ogni divisione Ateco presente in entrambe le fonti: quota di imprese che usa la fonte (Istat 2025) contro peso della voce nel bilancio (BACH 2024), come media ponderata e come terzo quartile. La mediana BACH non serve: per i debiti bancari è zero nella grande maggioranza delle divisioni (più di metà delle società non ne ha). Se le due fonti descrivono lo stesso fenomeno, le divisioni in cui più imprese usano il credito bancario dovrebbero essere anche quelle con più debito bancario in bilancio.</p>
<div id="4245b256" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="23">
<div class="cell-output cell-output-display cell-output-markdown">
<table class="caption-top table table-sm table-striped small">
<thead>
<tr class="header">
<th style="text-align: left;">voce</th>
<th style="text-align: left;">statistica BACH</th>
<th style="text-align: right;">divisioni</th>
<th style="text-align: right;">Spearman</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">Banca, breve</td>
<td style="text-align: left;">media ponderata</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.46</td>
</tr>
<tr class="even">
<td style="text-align: left;">Banca, breve</td>
<td style="text-align: left;">terzo quartile</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.81</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Banca, medio-lungo</td>
<td style="text-align: left;">media ponderata</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.32</td>
</tr>
<tr class="even">
<td style="text-align: left;">Banca, medio-lungo</td>
<td style="text-align: left;">terzo quartile</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.77</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: left;">media ponderata</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.45</td>
</tr>
<tr class="even">
<td style="text-align: left;">Credito commerciale</td>
<td style="text-align: left;">terzo quartile</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.61</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Equity</td>
<td style="text-align: left;">media ponderata</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.06</td>
</tr>
<tr class="even">
<td style="text-align: left;">Equity</td>
<td style="text-align: left;">terzo quartile</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.28</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Intra-gruppo</td>
<td style="text-align: left;">media ponderata</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.36</td>
</tr>
<tr class="even">
<td style="text-align: left;">Intra-gruppo</td>
<td style="text-align: left;">terzo quartile</td>
<td style="text-align: right;">71</td>
<td style="text-align: right;">0.47</td>
</tr>
</tbody>
</table>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> 71 divisioni in comune. Un indice di Spearman vicino a 1 vuol dire che l’ordine delle divisioni è lo stesso nelle due fonti, vicino a 0 che non c’è relazione. Il legame più forte è per banca, breve (terzo quartile, 0,81); per l’equity è debole (0,28 al massimo): usare l’aumento di capitale come fonte nell’anno non dice quanto patrimonio netto ha già l’impresa. Divisioni con mediana BACH pari a zero: banca, breve 64; banca, medio-lungo 68; credito commerciale 20; equity 0; intra-gruppo 69.</p>
</div>
</div>
<p><strong>Commento.</strong> Il confronto per divisione Ateco guarda la sezione trasversale: in quali settori una fonte è più diffusa e in quali pesa di più nei bilanci. L’indice di Spearman misura quanto le due fonti ordinano le 71 divisioni comuni nello stesso modo.</p>
<p>Con il terzo quartile BACH il legame è forte per il credito bancario a breve (0,81) e a medio-lungo (0,77), buono per il credito commerciale (0,61), più debole per l’intra-gruppo (0,47) e per l’equity (0,28). Con la media ponderata i valori sono più bassi, perché la media riflette le poche società grandi di ogni divisione mentre la Rilevazione conta le imprese. La mediana non si usa: per i debiti bancari è zero nella grande maggioranza delle divisioni.</p>
<p>Il risultato completa quello della sezione 7. Le due fonti concordano su dove si usa il credito bancario, non su come cambia nel tempo. Per l’equity il legame debole ha una spiegazione semplice: la Rilevazione chiede se l’impresa ha usato i mezzi propri come fonte nell’anno, BACH misura il patrimonio netto accumulato.</p>
<div id="9e533dc6" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="24">
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/index_files/figure-html/cell-25-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display cell-output-markdown">
<p><em>In parole semplici:</em> ogni punto è una divisione. Se la nuvola sale verso destra, le divisioni in cui più imprese usano il credito bancario sono anche quelle in cui le società più indebitate con le banche (terzo quartile) hanno più debito bancario in bilancio.</p>
</div>
</div>
<p><strong>Commento.</strong> Ogni punto è una divisione Ateco. Le nuvole salgono verso destra: le divisioni in cui più imprese usano il credito bancario sono quelle in cui le società più indebitate con le banche hanno più debito in bilancio. Le divisioni manifatturiere ad alta intensità di capitale, come la metallurgia (C24) per il breve e le bevande (C11) per il medio-lungo, stanno in alto a destra.</p>
<p>Alcuni punti estremi dipendono da divisioni con pochissime imprese. L’industria del tabacco (C12) ha 6 imprese nella Rilevazione e un terzo di esse usa il credito a breve; l’estrazione di petrolio e gas (B06) ne ha circa 7, nessuna con credito a breve. Su numeri così piccoli una sola risposta sposta la quota di molti punti: il legame si legge sull’insieme, non sui singoli punti.</p>
<div id="0da1c157" class="cell" data-quarto-private-1="{&quot;key&quot;:&quot;jupyter&quot;,&quot;value&quot;:{&quot;source_hidden&quot;:true}}" data-execution_count="25">
<div class="cell-output cell-output-display cell-output-markdown">
<blockquote class="blockquote">
<p>Istat, Censimento permanente delle imprese - Rilevazione multiscopo, Appendice statistica (edizioni 2022 e 2025). — BACH database: ECCBSO, Oesterreichische Nationalbank, National Bank of Belgium, Deutsche Bundesbank, Banco de España, Banque de France, Hrvatska Narodna Banka, Magyar Nemzeti Bank, Centrale dei Bilanci - Cerved srl / Banca d’Italia, Statec Luxembourg, Narodowy Bank Polski (calculations of Narodowy Bank Polski on the basis of the data from the Statistics Poland), Banco de Portugal, National Bank of Slovakia (calculations based on data from the Ministry of Finance). Rilascio BACH 20260914.</p>
</blockquote>
</div>
</div>
</section>
<section id="limiti" class="level2">
<h2 class="anchored" data-anchor-id="limiti">9. Limiti</h2>
<ul>
<li><p>Le quote della Rilevazione sono stime campionarie riportate all’universo; Istat non pubblica in appendice gli errori campionari per cella.</p></li>
<li><p>La domanda sulle fonti di finanziamento chiede le fonti «principali», non tutte quelle in essere: una fonte usata poco può non essere dichiarata.</p></li>
<li><p>Il confronto per divisione accosta 2025 (Rilevazione) e 2024 (BACH), e popolazioni diverse (tutte le imprese con almeno 3 addetti contro le società di capitali).</p></li>
<li><p>La domanda sulla garanzia pubblica dei prestiti, presente nel 2022, manca nel 2025: non si può dire dalla Rilevazione se le garanzie siano cresciute o calate.</p></li>
</ul>
<hr>
<p><strong>Nota metodologica</strong></p>
<p>Questo documento nasce dall’interazione di tre componenti. L’autore definisce le domande, esercita il giudizio critico e assume la responsabilità scientifica ed editoriale del risultato. Strumenti di intelligenza artificiale generativa sono impiegati a supporto della ricerca bibliografica, della lettura, della sintesi, della riorganizzazione argomentativa e della revisione del testo. Un’infrastruttura open source sviluppata dall’autore automatizza il reperimento, l’armonizzazione e il controllo dei dati dalle fonti statistiche ufficiali, e mantiene l’elaborazione documentata e riproducibile.</p>
<p>Le fonti sono pubblicamente accessibili e citate con la loro denominazione ufficiale; l’analisi è pertanto integralmente auditabile e replicabile da terzi a partire da esse. Le tabelle e i grafici sono elaborazioni dell’autore: calcoli, aggregazioni, trasformazioni e scelte di rappresentazione sono attribuibili all’autore e non agli enti produttori dei dati.</p>
<p>La responsabilità per le fonti utilizzate, le analisi condotte, le elaborazioni effettuate, le interpretazioni proposte e le conclusioni formulate resta interamente in capo all’autore. L’intelligenza artificiale è stata impiegata come ambiente di supporto cognitivo ed editoriale, non come fonte primaria, autore autonomo o sostituto del giudizio critico.</p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Imprese</category>
  <category>Credito</category>
  <category>Istat</category>
  <category>BACH</category>
  <category>Censimento</category>
  <guid>https://paolovolterra.com/posts/2610_CensimentoImpreseFinanza/</guid>
  <pubDate>Thu, 29 Oct 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Struttura finanziaria delle imprese per regione</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2606_BankitRegioni/</link>
  <description><![CDATA[ 




<p>Analisi della struttura finanziaria e operativa delle imprese italiane per regione, basata sui dati Cerved (fonte A2.9 Banca d’Italia, 2018–2023).</p>
<p>Indicatori principali: <strong>MOL/Attivo</strong> (redditività operativa) e <strong>Leverage</strong> (leva finanziaria), per 20 regioni e macro-ripartizioni geografiche.</p>
<p>→ <a href="bilanci_regionali.html"><strong>Apri l’analisi completa</strong></a></p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Banca d&#39;Italia</category>
  <category>Imprese</category>
  <category>Regioni</category>
  <category>Credito</category>
  <category>Python</category>
  <guid>https://paolovolterra.com/posts/2606_BankitRegioni/</guid>
  <pubDate>Wed, 10 Jun 2026 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Offerta delle Banche Italiane per la Coesione 2021-2027</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2518_FSC/md/Offerta delle Banche Italiane per la Coesione 2021-2027.html</link>
  <description><![CDATA[ 




<p>Nel contesto della programmazione 2021-2027, l’Italia ha a disposizione un ampio pacchetto di risorse destinate alla Politica di Coesione, che ammonta a <strong>75,3 miliardi di euro</strong>. Questi fondi provengono da diverse fonti, incluse le risorse europee e il cofinanziamento nazionale. Di questi, <strong>43,1 miliardi di euro</strong> sono fondi europei, che includono anche il <strong>Fondo per la Transizione Giusta</strong> e la <strong>Cooperazione Territoriale Europea</strong><sup>1</sup>.</p>
<section id="fondi-strutturali-e-investimenti" class="level3">
<h3 class="anchored" data-anchor-id="fondi-strutturali-e-investimenti">Fondi Strutturali e Investimenti</h3>
<p>I fondi saranno distribuiti tra diverse regioni italiane in base al loro livello di sviluppo:</p>
<ul>
<li><strong>Regioni più sviluppate</strong>: 23,882 miliardi di euro</li>
<li><strong>Regioni in transizione</strong>: 3,612 miliardi di euro</li>
<li><strong>Regioni meno sviluppate</strong>: 46,575 miliardi di euro<sup>2</sup>.</li>
</ul>
</section>
<section id="programmi-interreg" class="level3">
<h3 class="anchored" data-anchor-id="programmi-interreg">Programmi Interreg</h3>
<p>L’Italia parteciperà a <strong>19 programmi Interreg</strong>, con un budget totale di oltre <strong>1,2 miliardi di euro</strong>, destinati a promuovere progetti innovativi e sostenibili. Questi programmi mirano a stimolare la cooperazione territoriale tra le regioni europee e si concentreranno su temi come la transizione verde, la digitalizzazione e l’inclusione sociale<sup>3</sup>.</p>
</section>
<section id="obiettivi-strategici" class="level3">
<h3 class="anchored" data-anchor-id="obiettivi-strategici">Obiettivi Strategici</h3>
<p>La nuova programmazione introduce cinque obiettivi strategici principali, che sostituiscono gli undici obiettivi tematici precedenti. Questi obiettivi mirano a garantire maggiore flessibilità nell’uso delle risorse e includono:</p>
<ol type="1">
<li>Un’Europa più intelligente</li>
<li>Un’Europa più verde</li>
<li>Un’Europa più connessa</li>
<li>Un’Europa più sociale</li>
<li>Un’Europa più vicina ai cittadini<sup>4</sup><sup>5</sup>.</li>
</ol>
</section>
<section id="ruolo-delle-banche" class="level3">
<h3 class="anchored" data-anchor-id="ruolo-delle-banche">Ruolo delle Banche</h3>
<p>Le banche italiane giocheranno un ruolo cruciale nel facilitare l’accesso a questi fondi attraverso strumenti finanziari specializzati. Saranno disponibili consulenze dedicate per le imprese che desiderano partecipare ai programmi di coesione, supportando così lo sviluppo economico e l’innovazione<sup>6</sup><sup>7</sup>.</p>
<p>In sintesi, l’offerta delle banche italiane per la coesione 2021-2027 si configura come un’opportunità significativa per promuovere lo sviluppo regionale e la cooperazione europea, con un focus particolare su progetti innovativi e sostenibili.</p>
</section>
<section id="citations" class="level2">
<h2 class="anchored" data-anchor-id="citations">Citations</h2>


</section>


<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a><div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Note</h2>

<ol>
<li id="fn1"><p>https://www.regione.fvg.it/rafvg/cms/RAFVG/formazione-lavoro/formazione/fondo-sociale-europeo/FOGLIA33/↩︎</p></li>
<li id="fn2"><p>https://ue.regione.lombardia.it/it/pc2127/la-politica-di-coesione-2021-2027/accordo-di-partenariato-italia-2021-2027↩︎</p></li>
<li id="fn3"><p>https://www.credem.it/content/credem/it/scopri-credem-banca/scopri-credem-banca/magazine/guide-articoli/interreg-italia-centro-europa.html↩︎</p></li>
<li id="fn4"><p>https://www.regione.fvg.it/rafvg/cms/RAFVG/formazione-lavoro/formazione/fondo-sociale-europeo/FOGLIA33/↩︎</p></li>
<li id="fn5"><p>https://documenti.camera.it/leg19/dossier/pdf/BI0017.pdf↩︎</p></li>
<li id="fn6"><p>https://www.credem.it/content/credem/it/scopri-credem-banca/scopri-credem-banca/magazine/guide-articoli/interreg-italia-centro-europa.html↩︎</p></li>
<li id="fn7"><p>https://www.rgs.mef.gov.it/_Documenti/VERSIONE-I/attivita_istituzionali/monitoraggio/rapporti_finanziari_ue/monitoraggio_politiche_di_coesione_2014-2020/2024-04-30/BMPC-30.04.2024.pdf↩︎</p></li>
</ol>
</section></div> ]]></description>
  <guid>https://paolovolterra.com/posts/2518_FSC/md/Offerta delle Banche Italiane per la Coesione 2021-2027.html</guid>
  <pubDate>Mon, 10 Feb 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Intelligenza Artificiale e banche</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2520_AiBanche/20250210_AiBanche.html</link>
  <description><![CDATA[ 




<section id="data-is-king" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Data is King</h1>
<p>I dati sono estremamente preziosi e fondamentali nel mondo moderno: 1. <strong>Il valore dei dati</strong> → In un’economia sempre più digitale, le decisioni si basano sui dati, non solo sull’intuizione. 2. <strong>Potere competitivo</strong> → Le aziende che sfruttano i dati in modo efficace (analisi, AI, Big Data) hanno un enorme vantaggio. 3. <strong>Personalizzazione e automazione</strong> → I dati permettono di creare esperienze personalizzate per gli utenti, automatizzare processi e migliorare prodotti/servizi. 4. <strong>Influenza nel business e nella politica</strong> → I dati vengono usati per strategie di marketing, previsioni finanziarie e persino per influenzare decisioni politiche.</p>
<p><img src="https://paolovolterra.com/posts/2520_AiBanche/media/20250206170727.png" class="img-fluid"></p>
<p>Chi possiede e sa interpretare i dati <strong>ha il potere</strong> di prendere decisioni migliori e più strategiche.</p>
<p>Nel settore bancario, l’espressione <strong>“Data is King”</strong> significa che i dati sono la risorsa più preziosa per migliorare i servizi finanziari, ridurre i rischi e aumentare la competitività. ### Personalizzazione dei Servizi</p>
<p>Le banche utilizzano i dati per offrire prodotti su misura:</p>
<ul>
<li>Analizzano il comportamento finanziario dei clienti per proporre prestiti, mutui o investimenti adatti.</li>
<li>Creano offerte personalizzate basate sullo storico delle transazioni.</li>
</ul>
<section id="valutazione-del-rischio-e-credit-scoring" class="level3" data-number="1.0.1">
<h3 data-number="1.0.1" class="anchored" data-anchor-id="valutazione-del-rischio-e-credit-scoring"><span class="header-section-number">1.0.1</span> Valutazione del Rischio e Credit Scoring</h3>
<p>I dati sono fondamentali per determinare l’affidabilità creditizia di un cliente:</p>
<ul>
<li>Gli algoritmi analizzano reddito, spese e debiti per assegnare un punteggio di credito.</li>
<li>Le banche usano il <strong>machine learning</strong> per rilevare potenziali insolvenze prima che si verifichino.</li>
</ul>
</section>
<section id="prevenzione-delle-frodi-e-sicurezza" class="level3" data-number="1.0.2">
<h3 data-number="1.0.2" class="anchored" data-anchor-id="prevenzione-delle-frodi-e-sicurezza"><span class="header-section-number">1.0.2</span> Prevenzione delle Frodi e Sicurezza</h3>
<p>L’analisi dei dati permette di individuare transazioni sospette in tempo reale:</p>
<ul>
<li>Le banche monitorano pattern di spesa anomali per prevenire frodi.</li>
<li>La biometria (impronte digitali, riconoscimento facciale) migliora la sicurezza basandosi su dati unici dei clienti.</li>
</ul>
</section>
<section id="ottimizzazione-della-customer-experience" class="level3" data-number="1.0.3">
<h3 data-number="1.0.3" class="anchored" data-anchor-id="ottimizzazione-della-customer-experience"><span class="header-section-number">1.0.3</span> Ottimizzazione della Customer Experience</h3>
<p>I dati aiutano le banche a migliorare l’interazione con i clienti:</p>
<ul>
<li>Chatbot e assistenti virtuali personalizzano il supporto.</li>
<li>Le app bancarie suggeriscono modi per risparmiare e investire in base allo storico del cliente.</li>
</ul>
</section>
<section id="compliance-e-regolamentazione" class="level3" data-number="1.0.4">
<h3 data-number="1.0.4" class="anchored" data-anchor-id="compliance-e-regolamentazione"><span class="header-section-number">1.0.4</span> Compliance e Regolamentazione</h3>
<p>Nel settore bancario, la gestione dei dati è cruciale per rispettare normative come:</p>
<ul>
<li><strong>GDPR</strong> (protezione dati personali)</li>
<li><strong>Basilea III</strong> (rischio di credito e capitale)</li>
<li><strong>AML (Anti-Money Laundering)</strong> per prevenire il riciclaggio di denaro.</li>
</ul>
<p>Le banche che sfruttano al meglio i dati migliorano la sicurezza, la customer experience e la redditività. Chi padroneggia i dati, ha il vero potere nel settore finanziario.</p>
</section>
<section id="uso-dellintelligenza-artificiale-in-banca" class="level2" data-number="1.1">
<h2 data-number="1.1" class="anchored" data-anchor-id="uso-dellintelligenza-artificiale-in-banca"><span class="header-section-number">1.1</span> Uso dell’Intelligenza artificiale in banca</h2>
<p>L’<strong>Intelligenza Artificiale (AI) nei dati bancari</strong> sta trasformando il settore finanziario, rendendo i servizi più efficienti, sicuri e personalizzati. Ecco come viene applicata l’AI nei dati bancari:</p>
<section id="analisi-predittiva-per-il-credit-scoring" class="level3" data-number="1.1.1">
<h3 data-number="1.1.1" class="anchored" data-anchor-id="analisi-predittiva-per-il-credit-scoring"><span class="header-section-number">1.1.1</span> Analisi Predittiva per il Credit Scoring</h3>
<p>L’AI analizza enormi quantità di dati per prevedere il comportamento finanziario di un cliente e migliorare il <strong>credit scoring</strong>: - Analizza transazioni, reddito e spese - Valuta la probabilità di insolvenza con algoritmi di <strong>machine learning</strong> - Consente di approvare o rifiutare prestiti in tempo reale con meno rischi.</p>
<p><strong>Esempio:</strong> Modelli AI alternativi aiutano chi non ha uno storico creditizio a ottenere finanziamenti, analizzando dati come pagamenti di utenze o comportamento online.</p>
<p><img src="https://paolovolterra.com/posts/2520_AiBanche/media/iter.jpg" class="img-fluid"></p>
</section>
<section id="rilevazione-frodi-e-sicurezza" class="level3" data-number="1.1.2">
<h3 data-number="1.1.2" class="anchored" data-anchor-id="rilevazione-frodi-e-sicurezza"><span class="header-section-number">1.1.2</span> Rilevazione Frodi e Sicurezza</h3>
<p>Le banche utilizzano l’AI per individuare <strong>transazioni sospette in tempo reale</strong>: - Gli algoritmi analizzano pattern di spesa e segnalano anomalie.<br>
- L’AI blocca operazioni fraudolente e avvisa il cliente.<br>
- Biometria e <strong>deep learning</strong> migliorano la sicurezza nelle autenticazioni (riconoscimento facciale, impronte digitali).</p>
<p><strong>Esempio:</strong> Se una carta viene usata in un paese straniero mentre il cliente è altrove, l’AI può bloccare il pagamento e richiedere una verifica.</p>
</section>
<section id="chatbot-e-assistenza-virtuale" class="level3" data-number="1.1.3">
<h3 data-number="1.1.3" class="anchored" data-anchor-id="chatbot-e-assistenza-virtuale"><span class="header-section-number">1.1.3</span> Chatbot e Assistenza Virtuale</h3>
<p>L’AI migliora il <strong>customer service</strong> attraverso chatbot avanzati e assistenti virtuali:<br>
- Rispondono 24/7 a domande su saldo, bonifici, pagamenti.<br>
- Offrono consigli finanziari basati sullo storico del cliente.<br>
- Possono gestire operazioni complesse, riducendo i tempi di attesa nei call center.</p>
<p><strong>Esempio:</strong> Chatbot come <strong>Erica di Bank of America</strong> o <strong>Eva di HDFC Bank</strong> aiutano i clienti a controllare il saldo, pianificare risparmi e segnalare problemi.</p>
</section>
<section id="gestione-degli-investimenti-e-fintech-ai" class="level3" data-number="1.1.4">
<h3 data-number="1.1.4" class="anchored" data-anchor-id="gestione-degli-investimenti-e-fintech-ai"><span class="header-section-number">1.1.4</span> Gestione degli Investimenti e Fintech AI</h3>
<p>Le <strong>robo-advisor</strong> utilizzano l’AI per creare strategie di investimento personalizzate:<br>
- Analizzano dati di mercato in tempo reale.<br>
- Suggeriscono asset in base al profilo di rischio del cliente.<br>
- Automatizzano il trading sfruttando opportunità di mercato.</p>
<p><strong>Esempio:</strong> Piattaforme come <strong>Betterment</strong> e <strong>Wealthfront</strong> usano l’AI per creare portafogli su misura.</p>
</section>
<section id="prevenzione-del-riciclaggio-di-denaro-aml" class="level3" data-number="1.1.5">
<h3 data-number="1.1.5" class="anchored" data-anchor-id="prevenzione-del-riciclaggio-di-denaro-aml"><span class="header-section-number">1.1.5</span> Prevenzione del Riciclaggio di Denaro (AML)</h3>
<p>Le banche devono rispettare regolamenti antiriciclaggio (<strong>AML</strong>). L’AI aiuta a:<br>
- Rilevare operazioni sospette tra milioni di transazioni.<br>
- Generare alert su comportamenti anomali.<br>
- Automatizzare i controlli di conformità, riducendo i falsi positivi.</p>
<p><strong>Esempio:</strong> L’AI può scoprire schemi di riciclaggio analizzando trasferimenti fra conti, anche se avvengono con piccole somme per evitare controlli manuali.</p>
</section>
<section id="ottimizzazione-della-customer-experience-1" class="level3" data-number="1.1.6">
<h3 data-number="1.1.6" class="anchored" data-anchor-id="ottimizzazione-della-customer-experience-1"><span class="header-section-number">1.1.6</span> Ottimizzazione della Customer Experience</h3>
<ul>
<li><strong>Analisi comportamentale</strong>: l’AI prevede i bisogni del cliente prima che li esprima.<br>
</li>
<li><strong>Raccomandazioni personalizzate</strong>: l’AI suggerisce prodotti finanziari basati sulle abitudini del cliente.<br>
</li>
<li><strong>Gestione delle spese</strong>: alcune app bancarie usano l’AI per suggerire modi per risparmiare.</li>
</ul>
<p><strong>Esempio:</strong> <strong>Revolut</strong> e <strong>N26</strong> usano l’AI per fornire previsioni di spesa e suggerimenti finanziari personalizzati.</p>
</section>
<section id="strumenti-e-tecnologie-usate-nelle-banche" class="level3" data-number="1.1.7">
<h3 data-number="1.1.7" class="anchored" data-anchor-id="strumenti-e-tecnologie-usate-nelle-banche"><span class="header-section-number">1.1.7</span> Strumenti e Tecnologie Usate nelle Banche</h3>
<ul>
<li><strong>Machine Learning (ML)</strong>: per analisi predittive e rilevamento frodi.</li>
<li><strong>Natural Language Processing (NLP)</strong>: per chatbot e comprensione delle richieste clienti.</li>
<li><strong>Deep Learning</strong>: per analisi avanzate di frodi e modelli di rischio.</li>
<li><strong>Blockchain &amp; AI</strong>: per aumentare la sicurezza nelle transazioni.</li>
</ul>
<p>L’Intelligenza Artificiale sta trasformando il settore bancario <strong>rendendo i servizi più sicuri, veloci e personalizzati</strong>. Le banche che sfruttano meglio l’AI hanno un <strong>vantaggio competitivo</strong> enorme, soprattutto nel miglioramento della sicurezza e dell’esperienza cliente.</p>
</section>
</section>
</section>
<section id="il-tech-in-banca" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> Il tech in banca</h1>
<p>Un <a href="https://www.bloomberg.com/news/articles/2025-01-09/wall-street-expected-to-shed-200-000-jobs-as-ai-erodes-roles?srnd=technology-ai">report</a> di Bloomberg Intelligence prevede che l’intelligenza artificiale causerà la riduzione di circa 200.000 posti di lavoro nel settore bancario globale nei prossimi 3-5 anni (<a href="https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html#ref-wall_street_job_losses_ai">Bloomberg News, 2025</a>).</p>
<p><img src="https://paolovolterra.com/posts/2506_IAInBanca/immagini/Screenshot%202025-01-10%20150944.png" class="img-fluid"></p>
<p>Nel marzo del 2023, Goldman Sachs aveva pubblicato una ricerca secondo la quale nei successivi 10 anni si sarebbero persi 300 milioni di posti di lavoro.</p>
<p>Secondo <a href="https://www.bcg.com/press/6september2023-lutilizzo-di-strumenti-di-genai-riduce-i-tempi-di-lavoro-del-50-per-singola-attivita">BCG</a> l’utilizzo di strumenti di GenAI ridurrà i tempi di lavoro del 50% per singola attività.</p>
<p>Questo cambiamento riguarderà soprattutto mansioni ripetitive del back office e di assistenza clienti, ma porterà anche a un aumento della produttività e dei profitti per le banche, stimato tra il 12% e il 17%.</p>
<p>Sebbene molti posti di lavoro siano a rischio di automazione, si assisterà più a una trasformazione dei ruoli che a una sostituzione totale, con la creazione di nuove posizioni legate allo sviluppo e alla gestione dell’AI.</p>
<p>In un precedente articolo (Il Sole 24 Ore Mercoledì 4 Dicembre 2024) si discuteva dell’impatto della #GenAI evidenziando una mancanza di preparazione significativa da parte delle istituzioni.</p>
<p>Mentre molte banche si concentrano sul taglio dei costi tramite la GenAI (63% degli istituti secondo BCG), il successo delle strategie dipende soprattutto dal fattore umano (70%), attraverso la riqualificazione del personale e la trasformazione organizzativa.</p>
<p>Studi di Banca d’Italia confermano l’alta esposizione del settore finanziario alla sostituzione automatizzata di posti di lavoro, sottolineando la necessità di investimenti significativi in formazione e upskilling per evitare conseguenze negative.</p>
<p>Secondo il report #Bankit <a href="https://www.bancaditalia.it/pubblicazioni/qef/2024-0878/index.html">An assessment of occupational exposure to artificial intelligence in Italy</a>, l’#IA è già presente e il suo impatto crescerà esponenzialmente.</p>
<p>C’è però scarsezza di piani specifici per lo sviluppo delle competenze in GenAI nel settore bancario a livello globale (solo il 5% delle banche ne ha uno).</p>
<section id="le-tech" class="level2" data-number="2.1">
<h2 data-number="2.1" class="anchored" data-anchor-id="le-tech"><span class="header-section-number">2.1</span> Le “Tech”</h2>
<p>Molte delle ultime tecnologie utilizzano l’<strong>intelligenza artificiale #IA</strong> e, in alcuni casi, <strong>robot</strong> (sia fisici che software) per migliorare i servizi bancari e finanziari:</p>
<p>L’<strong>Intelligenza Artificiale (IA)</strong> è ampiamente utilizzata in quasi tutte le tecnologie per migliorare l’efficienza, personalizzare i servizi, analizzare grandi quantità di dati e rafforzare la sicurezza. I <strong>Robot Software</strong>, come i chatbot e i processi automatizzati (RPA), sono comuni in <strong>AI/ML in Banking</strong>, <strong>RegTech</strong>, <strong>WealthTech</strong> e altre aree per automatizzare le interazioni con i clienti e i processi interni. I <strong>Robot Fisici</strong>, meno comuni nel settore bancario, possono essere utilizzati in <strong>filiali sperimentali</strong> per migliorare l’esperienza del cliente o in ambito <strong>IoT</strong>, come ATM intelligenti.</p>
</section>
<section id="tabella-delle-tech" class="level2" data-number="2.2">
<h2 data-number="2.2" class="anchored" data-anchor-id="tabella-delle-tech"><span class="header-section-number">2.2</span> Tabella delle Tech</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Tecnologia</strong></th>
<th><strong>Descrizione</strong></th>
<th><strong>Esempi</strong></th>
<th><strong>Lavori Ripetitivi Sostituibili</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>AI/ML in Banking</strong></td>
<td>Intelligenza artificiale per automazione, prevenzione frodi e analisi.</td>
<td>Chatbot bancari, rilevamento frodi con AI.</td>
<td>Gestione delle richieste di base dei clienti, monitoraggio delle transazioni, analisi dei dati.</td>
</tr>
<tr class="even">
<td><strong>Biometric Banking</strong></td>
<td>Tecnologie biometriche per autenticazione sicura.</td>
<td>Riconoscimento facciale, impronte digitali, scansione dell’iride.</td>
<td>Verifica dell’identità manuale, controllo accessi fisici.</td>
</tr>
<tr class="odd">
<td><strong>Cloud Banking Technology</strong></td>
<td>Infrastrutture cloud per maggiore agilità, scalabilità e riduzione dei costi.</td>
<td>AWS, Microsoft Azure per servizi bancari.</td>
<td>Gestione manuale di infrastrutture IT e backup.</td>
</tr>
<tr class="even">
<td><strong>CryptoTech</strong></td>
<td>Tecnologie basate su blockchain e criptovalute.</td>
<td>Binance, Coinbase, wallet digitali.</td>
<td>Esecuzione manuale di transazioni ripetitive.</td>
</tr>
<tr class="odd">
<td><strong>CyberTech</strong></td>
<td>Soluzioni di cybersecurity per proteggere da attacchi e violazioni.</td>
<td>Autenticazione biometrica, crittografia avanzata.</td>
<td>Monitoraggio manuale della sicurezza, risposta a minacce.</td>
</tr>
<tr class="even">
<td><strong>DataTech</strong></td>
<td>Analisi dei Big Data per decisioni strategiche e personalizzazione.</td>
<td>CRM avanzati, strumenti di data visualization.</td>
<td>Elaborazione manuale di report e analisi dati.</td>
</tr>
<tr class="odd">
<td><strong>FinTech</strong></td>
<td>Innovazioni nei servizi finanziari tradizionali.</td>
<td>PayPal, Stripe, Revolut, N26.</td>
<td>Elaborazione di pagamenti, apertura conti, riconciliazioni manuali.</td>
</tr>
<tr class="even">
<td><strong>Green Finance Technology</strong></td>
<td>Soluzioni per gestire finanziamenti sostenibili e monitorare l’impatto ambientale.</td>
<td>Piattaforme ESG per il monitoraggio ambientale.</td>
<td>Raccolta manuale di dati ESG, preparazione di report ambientali.</td>
</tr>
<tr class="odd">
<td><strong>InsurTech</strong></td>
<td>Tecnologie per migliorare i processi assicurativi.</td>
<td>Lemonade, Trov.</td>
<td>Elaborazione manuale di richieste di sinistri, valutazione rischi di base.</td>
</tr>
<tr class="even">
<td><strong>IoT in Banking</strong></td>
<td>Dispositivi connessi per migliorare l’esperienza bancaria.</td>
<td>Wearable per pagamenti contactless, ATM intelligenti.</td>
<td>Operazioni di cassa fisica, interazioni di base con i clienti.</td>
</tr>
<tr class="odd">
<td><strong>LendTech</strong></td>
<td>Tecnologie per il prestito e valutazioni del credito.</td>
<td>LendingClub, Funding Circle.</td>
<td>Valutazioni manuali del credito, gestione delle pratiche di prestito.</td>
</tr>
<tr class="even">
<td><strong>Open Banking Technology</strong></td>
<td>API per condividere dati finanziari con terze parti in modo sicuro.</td>
<td>Soluzioni basate su PSD2 in Europa.</td>
<td>Raccolta e condivisione manuale di dati con terze parti.</td>
</tr>
<tr class="odd">
<td><strong>PayTech</strong></td>
<td>Tecnologie per pagamenti digitali.</td>
<td>Google Pay, Apple Pay, SumUp.</td>
<td>Elaborazione manuale dei pagamenti, riconciliazione transazioni.</td>
</tr>
<tr class="even">
<td><strong>PropTech</strong></td>
<td>Tecnologie per il settore immobiliare.</td>
<td>Zillow, Casavo, piattaforme per la valutazione immobiliare.</td>
<td>Valutazioni immobiliari manuali, raccolta dati di mercato.</td>
</tr>
<tr class="odd">
<td><strong>RegTech</strong></td>
<td>Tecnologie per la conformità normativa.</td>
<td>Piattaforme di compliance automatizzata, analisi normativa con AI.</td>
<td>Controllo manuale della conformità normativa, generazione report di audit.</td>
</tr>
<tr class="even">
<td><strong>WealthTech</strong></td>
<td>Soluzioni per la gestione del patrimonio e investimenti.</td>
<td>Betterment, eToro, Moneyfarm.</td>
<td>Analisi patrimoniale di base, consulenza finanziaria ripetitiva.</td>
</tr>
</tbody>
</table>
</section>
<section id="riferimenti-bibliografici" class="level2" data-number="2.3">
<h2 data-number="2.3" class="anchored" data-anchor-id="riferimenti-bibliografici"><span class="header-section-number">2.3</span> Riferimenti Bibliografici</h2>
<ol type="1">
<li>Wall Street potrebbe perdere oltre 200.000 posti di lavoro a causa dell’IA (<a href="https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html#ref-wall_street_job_losses_ai">Bloomberg News, 2025</a>).</li>
<li>L’IA sostituirà 200.000 dipendenti nel settore bancario (<a href="https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html#ref-banche_ai_200k_dipendenti_ilsole24ore">Il Sole 24 Ore, 2025</a>).</li>
<li>L’IA manderà in ‘pensione’ molti lavoratori bancari (<a href="https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html#ref-banche_ai_200k_dipendenti_italiaoggi">Italia Oggi, 2025</a>).</li>
<li>JPMorgan utilizza l’IA per aumentare i posti di lavoro anziché sostituirli (<a href="https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html#ref-jpmorgan_ai_rollout_jobs">Bloomberg News, 2024b</a>).</li>
<li>Citi ritiene che l’IA sostituirà più lavori nel settore bancario rispetto ad altri settori (<a href="https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html#ref-citi_ai_displacing_jobs">Bloomberg News, 2024a</a>).</li>
<li>Dimon vede l’IA offrire una settimana lavorativa di 3 giorni e mezzo per le generazioni future (<a href="https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html#ref-dimon_ai_shorter_workweek">Bloomberg News, 2023</a>).</li>
</ol>
</section>
</section>
<section id="gli-investimenti-bancari-in-ai" class="level1" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> Gli Investimenti Bancari in AI</h1>
<p>Tendenze, Strategie e Impatti</p>
<p>Le banche stanno investendo <strong>miliardi di dollari</strong> nell’<strong>Intelligenza Artificiale (AI)</strong> per migliorare sicurezza, efficienza operativa e customer experience. L’AI non è più solo un’innovazione sperimentale, ma un elemento chiave per la competitività nel settore finanziario. Le banche stanno <strong>scommettendo fortemente sull’AI</strong>, perché porta vantaggi in termini di sicurezza, efficienza e soddisfazione del cliente. La sfida è <strong>bilanciare innovazione e compliance</strong>, evitando rischi etici e di cybersecurity.</p>
<section id="quanto-investono-le-banche-in-ai" class="level2" data-number="3.1">
<h2 data-number="3.1" class="anchored" data-anchor-id="quanto-investono-le-banche-in-ai"><span class="header-section-number">3.1</span> Quanto investono le banche in AI</h2>
<p>Secondo le ultime analisi:<br>
- <strong>Nel 2023</strong>, le banche hanno investito oltre <strong>77 miliardi di dollari</strong> in AI e automazione.<br>
- Si prevede che il valore degli investimenti in AI nel settore finanziario supererà <strong>150 miliardi di dollari entro il 2027</strong>.<br>
- Le principali aree di investimento riguardano <strong>Machine Learning, Generative AI, RPA e sicurezza anti-frode</strong>.</p>
<p>🔹 <strong>Banche leader nell’AI</strong>: JPMorgan Chase, Goldman Sachs, Bank of America, HSBC e Deutsche Bank sono tra le più attive negli investimenti AI.</p>
</section>
<section id="perché-le-banche-investono-in-ai" class="level2" data-number="3.2">
<h2 data-number="3.2" class="anchored" data-anchor-id="perché-le-banche-investono-in-ai"><span class="header-section-number">3.2</span> Perché le banche investono in AI</h2>
<p>L’adozione dell’AI è motivata da diversi fattori:<br>
- <strong>Riduzione dei costi operativi</strong> – Automazione e ottimizzazione dei processi riducono il personale necessario per attività ripetitive.<br>
- <strong>Migliore gestione dei rischi</strong> – Algoritmi AI prevedono insolvenze e individuano frodi con maggiore precisione.<br>
- <strong>Customer Experience migliorata</strong> – Chatbot intelligenti, consulenza personalizzata e servizi finanziari basati su AI.<br>
- <strong>Trading algoritmico avanzato</strong> – L’AI permette operazioni più rapide e accurate nel mercato finanziario.</p>
</section>
<section id="principali-aree-di-investimento-in-ai-nel-settore-bancario" class="level2" data-number="3.3">
<h2 data-number="3.3" class="anchored" data-anchor-id="principali-aree-di-investimento-in-ai-nel-settore-bancario"><span class="header-section-number">3.3</span> Principali Aree di Investimento in AI nel Settore Bancario</h2>
<section id="rilevazione-frodi-sicurezza" class="level3" data-number="3.3.1">
<h3 data-number="3.3.1" class="anchored" data-anchor-id="rilevazione-frodi-sicurezza"><span class="header-section-number">3.3.1</span> Rilevazione Frodi &amp; Sicurezza</h3>
<p>Le banche investono in AI per <strong>rilevare transazioni sospette e prevenire cyber-attacchi</strong>.<br>
- <strong>Analisi in tempo reale</strong> – AI monitora le transazioni e blocca operazioni anomale.<br>
- <strong>Rilevamento di deepfake e identità false</strong> – Verifica biometrica e controllo avanzato dell’identità.<br>
- <strong>Protezione da attacchi informatici</strong> – AI potenzia la cybersecurity con sistemi di auto-apprendimento.</p>
<p><strong>Esempio:</strong> HSBC ha investito in AI per ridurre del <strong>70%</strong> le frodi nelle transazioni internazionali.</p>
</section>
<section id="automazione-con-rpa-ai" class="level3" data-number="3.3.2">
<h3 data-number="3.3.2" class="anchored" data-anchor-id="automazione-con-rpa-ai"><span class="header-section-number">3.3.2</span> Automazione con RPA &amp; AI</h3>
<p>Molte banche utilizzano <strong>Robotic Process Automation (RPA)</strong> e AI per <strong>automatizzare processi ripetitivi</strong>, come:<br>
- Elaborazione dei pagamenti e bonifici.<br>
- Validazione di documenti e verifica KYC (<em>Know Your Customer</em>).<br>
- Compliance con normative bancarie ed AML (<em>Anti-Money Laundering</em>).</p>
<p><strong>Esempio:</strong> JPMorgan utilizza un sistema AI chiamato <strong>COIN</strong> che analizza <strong>contratti bancari</strong> in pochi secondi, risparmiando oltre <strong>360.000 ore di lavoro umano</strong> all’anno.</p>
</section>
<section id="ai-per-il-credit-scoring-risk-management" class="level3" data-number="3.3.3">
<h3 data-number="3.3.3" class="anchored" data-anchor-id="ai-per-il-credit-scoring-risk-management"><span class="header-section-number">3.3.3</span> AI per il Credit Scoring &amp; Risk Management</h3>
<p>Le banche stanno rivoluzionando la concessione di prestiti grazie all’AI:<br>
- Modelli di <strong>Machine Learning</strong> per valutare il rischio di credito basandosi su dati non tradizionali (es. abitudini di spesa).<br>
- AI per <strong>prevedere insolvenze</strong> e migliorare la gestione dei rischi finanziari.<br>
- Valutazione più accurata per i clienti <strong>senza storico creditizio</strong> (utilizzando dati alternativi come bollette, affitti, ecc.).</p>
<p><strong>Esempio:</strong> Goldman Sachs utilizza AI per analizzare dati non convenzionali nei prestiti a piccole imprese.</p>
</section>
<section id="chatbot-ai-assistenza-clienti" class="level3" data-number="3.3.4">
<h3 data-number="3.3.4" class="anchored" data-anchor-id="chatbot-ai-assistenza-clienti"><span class="header-section-number">3.3.4</span> Chatbot AI &amp; Assistenza Clienti</h3>
<p>Le banche investono in <strong>AI conversazionale</strong> per migliorare il customer service:<br>
- <strong>Chatbot bancari avanzati</strong> – Assistenza clienti 24/7 con AI generativa.<br>
- <strong>AI per consulenza finanziaria personalizzata</strong> – Analizza le spese e suggerisce strategie di risparmio.<br>
- <strong>Riconoscimento del linguaggio naturale (NLP)</strong> per un’interazione più fluida.</p>
<p><strong>Esempio:</strong> <strong>Bank of America</strong> ha lanciato “Erica”, un assistente AI che ha gestito oltre <strong>1 miliardo di interazioni</strong> con clienti in pochi anni.</p>
</section>
<section id="ai-nel-trading-fintech" class="level3" data-number="3.3.5">
<h3 data-number="3.3.5" class="anchored" data-anchor-id="ai-nel-trading-fintech"><span class="header-section-number">3.3.5</span> AI nel Trading &amp; Fintech</h3>
<p>L’AI è essenziale per <strong>il trading algoritmico</strong> e la gestione degli investimenti:<br>
- <strong>Trading ad alta frequenza (HFT)</strong> – L’AI prende decisioni in millisecondi.<br>
- <strong>Analisi predittiva</strong> – L’AI analizza dati di mercato per prevedere tendenze e strategie.<br>
- <strong>Wealth Management AI</strong> – Robo-advisor che creano strategie di investimento personalizzate.</p>
<p><strong>Esempio:</strong> BlackRock utilizza <strong>Aladdin AI</strong>, una piattaforma che gestisce <strong>miliardi di dollari</strong> di investimenti con algoritmi avanzati.</p>
</section>
</section>
<section id="benefici-degli-investimenti-in-ai-per-le-banche" class="level2" data-number="3.4">
<h2 data-number="3.4" class="anchored" data-anchor-id="benefici-degli-investimenti-in-ai-per-le-banche"><span class="header-section-number">3.4</span> Benefici degli Investimenti in AI per le Banche</h2>
<ul>
<li><strong>+60% di efficienza operativa</strong> grazie all’automazione.<br>
</li>
<li><strong>Riduzione delle frodi fino all’80%</strong> con AI per il rilevamento delle transazioni sospette.<br>
</li>
<li><strong>Aumento del 30-40% nella soddisfazione dei clienti</strong> grazie a chatbot e consulenza personalizzata.<br>
</li>
<li><strong>Miglioramento della compliance e riduzione delle sanzioni</strong> grazie ad AI per il monitoraggio regolamentare.</li>
</ul>
</section>
<section id="sfide-rischi-dellai-nel-settore-bancario" class="level2" data-number="3.5">
<h2 data-number="3.5" class="anchored" data-anchor-id="sfide-rischi-dellai-nel-settore-bancario"><span class="header-section-number">3.5</span> Sfide &amp; Rischi dell’AI nel Settore Bancario</h2>
<p>Nonostante i vantaggi, ci sono ancora alcune sfide da affrontare:<br>
- <strong>Rischio di bias negli algoritmi</strong> – Decisioni errate se i dati di training non sono bilanciati.<br>
- <strong>Regolamentazione &amp; compliance</strong> – Le banche devono garantire che l’uso dell’AI rispetti le normative.<br>
- <strong>Cybersecurity &amp; Deepfake</strong> – L’AI può essere usata anche dai criminali per creare frodi più sofisticate.<br>
- <strong>Resistenza al cambiamento</strong> – Molti dipendenti e clienti sono scettici sull’AI.</p>
<p><strong>Soluzioni:</strong> Investire in <strong>modelli più trasparenti</strong>, implementare <strong>AI explainability</strong> (AI interpretabile) e rafforzare la <strong>cybersecurity</strong>.</p>
</section>
<section id="il-futuro-dellai-nelle-banche-tendenze-2025-2030" class="level2" data-number="3.6">
<h2 data-number="3.6" class="anchored" data-anchor-id="il-futuro-dellai-nelle-banche-tendenze-2025-2030"><span class="header-section-number">3.6</span> Il Futuro dell’AI nelle Banche: Tendenze 2025-2030</h2>
<p>🔹 <strong>AI Generativa per la creazione automatizzata di report finanziari</strong> 📑<br>
🔹 <strong>Blockchain + AI per maggiore sicurezza nelle transazioni</strong> 🔗<br>
🔹 <strong>Banking-as-a-Service (BaaS) potenziato dall’AI</strong> 🏦<br>
🔹 <strong>Riconoscimento facciale + AI per autenticazione senza password</strong> 🛡</p>
<p><strong>Previsione:</strong> Entro il 2030, l’AI sarà la tecnologia dominante nel settore bancario, rendendo i servizi più <strong>efficienti, sicuri e personalizzati</strong>.</p>
</section>
</section>
<section id="i-nuovi-paradigmi-normativi" class="level1" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> I nuovi paradigmi normativi</h1>
<p><strong>AI Act, FIDA, DORA e NIS2</strong>, stanno ridefinendo il rapporto tra <strong>banche, tecnologia e gestione del rischio</strong>. Le istituzioni finanziarie, già altamente regolamentate, devono ora adattarsi a normative che mirano a garantire <strong>sicurezza, trasparenza e affidabilità</strong> nell’uso dell’Intelligenza Artificiale e delle infrastrutture digitali.</p>
<p>L’<strong>AI Act</strong> impone regole rigorose sull’uso di modelli AI nelle decisioni finanziarie, limitando il rischio di <strong>bias nei credit scoring</strong> o di frodi legate a sistemi automatizzati. Le banche devono implementare <strong>AI spiegabile e auditabile</strong>, riducendo il rischio di sanzioni per discriminazione algoritmica. Parallelamente, il <strong>FIDA</strong> spinge per una gestione responsabile dei dati finanziari, imponendo maggiore trasparenza sulle tecnologie impiegate.</p>
<p>Dal lato della sicurezza operativa, il <strong>DORA</strong> introduce requisiti più stringenti per la <strong>resilienza digitale</strong>, obbligando le banche a garantire la continuità dei servizi anche in caso di attacchi informatici. La <strong>NIS2</strong>, invece, amplia gli obblighi di cybersecurity, imponendo una gestione proattiva delle minacce su infrastrutture critiche.</p>
<p>In sintesi, questi regolamenti trasformano le banche in <strong>hub tecnologici più sicuri, trasparenti e resilienti</strong>, costringendole a un’evoluzione strategica che combina innovazione AI con rigide misure di compliance e cybersecurity.</p>
<section id="gli-organi-di-vigilanza-e-il-controllo-del-settore-bancario" class="level2" data-number="4.1">
<h2 data-number="4.1" class="anchored" data-anchor-id="gli-organi-di-vigilanza-e-il-controllo-del-settore-bancario"><span class="header-section-number">4.1</span> Gli Organi di Vigilanza e il Controllo del Settore Bancario</h2>
<p>Le banche operano in un contesto altamente regolamentato, soggetto alla supervisione di diversi <strong>organi di vigilanza</strong>, che ne garantiscono <strong>stabilità, sicurezza e conformità normativa</strong>. Con l’introduzione di regolamenti come <strong>AI Act, FIDA, DORA e NIS2</strong>, il ruolo di queste autorità si è rafforzato, soprattutto nell’ambito della digitalizzazione e della gestione dei rischi tecnologici.</p>
<p>Con la crescente digitalizzazione bancaria, le autorità di vigilanza hanno ampliato il loro ruolo per affrontare <strong>nuove sfide tecnologiche e di sicurezza</strong>:</p>
<p>🔹 <strong>AI Act &amp; BCE/EBA</strong> → Impone alle banche requisiti di <strong>trasparenza sugli algoritmi AI</strong>, riducendo rischi di discriminazione o decisioni opache sui crediti.<br>
🔹 <strong>FIDA &amp; GDPR</strong> → Maggiore protezione dei <strong>dati finanziari</strong>, con vigilanza rafforzata sulla gestione e condivisione delle informazioni.<br>
🔹 <strong>DORA &amp; BCE/NIS2</strong> → Impone test di <strong>resilienza operativa</strong> e obbliga le banche a <strong>piani di emergenza IT</strong> per affrontare cyberattacchi.<br>
🔹 <strong>AML &amp; FATF/Banca d’Italia</strong> → Rafforza il monitoraggio sulle operazioni sospette grazie all’<strong>uso di AI per l’antiriciclaggio</strong>.</p>
</section>
<section id="impatti-per-le-banche" class="level2" data-number="4.2">
<h2 data-number="4.2" class="anchored" data-anchor-id="impatti-per-le-banche"><span class="header-section-number">4.2</span> <strong>Impatti per le Banche</strong></h2>
<p>Gli organi di vigilanza non si limitano più alla stabilità finanziaria, ma giocano un ruolo centrale nel <strong>governare l’innovazione digitale</strong>, garantendo che l’uso di AI e tecnologie avanzate nelle banche sia <strong>sicuro, trasparente e resiliente</strong>.</p>
<p>✅ <strong>Maggiore trasparenza</strong> → Obbligo di spiegare le decisioni AI nei prestiti e negli investimenti.<br>
✅ <strong>Cybersecurity rafforzata</strong> → Sistemi di difesa più robusti e gestione del rischio IT obbligatoria.<br>
✅ <strong>Compliance più rigorosa</strong> → Obbligo di conformarsi a regole più stringenti sui dati e sulle infrastrutture digitali.</p>
</section>
</section>
<section id="la-confusione-fra-ai-genai-e-rpa" class="level1" data-number="5">
<h1 data-number="5"><span class="header-section-number">5</span> La confusione fra AI, GenAI e RPA</h1>
<p><strong>AI (Intelligenza Artificiale), GenAI (Intelligenza Artificiale Generativa) e RPA (Robotic Process Automation)</strong> vengono spesso confusi, non solo dal cliente, ma anche dall’addetto: tutte e tre le tecnologie riguardano l’automazione e il miglioramento dei processi. Tuttavia, hanno differenze fondamentali</p>
<section id="tabella-di-confronto-ai-vs.-genai-vs.-rpa" class="level2" data-number="5.1">
<h2 data-number="5.1" class="anchored" data-anchor-id="tabella-di-confronto-ai-vs.-genai-vs.-rpa"><span class="header-section-number">5.1</span> Tabella di confronto AI vs.&nbsp;GenAI vs.&nbsp;RPA</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 14%">
<col style="width: 28%">
<col style="width: 28%">
<col style="width: 28%">
</colgroup>
<thead>
<tr class="header">
<th>Tecnologia</th>
<th>Funzione principale</th>
<th>Esempi bancari</th>
<th>Capacità di apprendimento?</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>AI</strong></td>
<td>Analizza dati e prende decisioni</td>
<td>Credit Scoring, Rilevamento Frodi</td>
<td>- Sì</td>
</tr>
<tr class="even">
<td><strong>GenAI</strong></td>
<td>Crea testo, immagini, codice</td>
<td>Report finanziari, Chatbot avanzati</td>
<td>- Sì (ma creativa)</td>
</tr>
<tr class="odd">
<td><strong>RPA</strong></td>
<td>Automatizza compiti ripetitivi</td>
<td>Pagamenti automatici, Data Entry</td>
<td>❌ No</td>
</tr>
</tbody>
</table>
</section>
<section id="quando-è-usata-ai-genai-o-rpa-in-banca" class="level2" data-number="5.2">
<h2 data-number="5.2" class="anchored" data-anchor-id="quando-è-usata-ai-genai-o-rpa-in-banca"><span class="header-section-number">5.2</span> Quando è usata AI, GenAI o RPA in banca</h2>
<ul>
<li><strong>Se serve automazione semplice</strong> → RPA (ad es. processare transazioni, verificare documenti).<br>
</li>
<li><strong>Se servono decisioni basate sui dati</strong> → AI (ad es. rilevare frodi, assegnare punteggi di credito).<br>
</li>
<li><strong>Se serve generare contenuti o conversazioni avanzate</strong> → GenAI (ad es. chatbot avanzati, reportistica automatica).</li>
</ul>
</section>
<section id="ai-intelligenza-artificiale" class="level2" data-number="5.3">
<h2 data-number="5.3" class="anchored" data-anchor-id="ai-intelligenza-artificiale"><span class="header-section-number">5.3</span> AI – Intelligenza Artificiale</h2>
<p>L’<strong>AI (Artificial Intelligence)</strong> è un insieme di tecnologie che simulano l’intelligenza umana per prendere decisioni, riconoscere schemi e migliorare con l’esperienza.</p>
<section id="caratteristiche-principali" class="level3" data-number="5.3.1">
<h3 data-number="5.3.1" class="anchored" data-anchor-id="caratteristiche-principali"><span class="header-section-number">5.3.1</span> Caratteristiche principali</h3>
<ul>
<li>Analizza dati e apprende (Machine Learning).<br>
</li>
<li>Prende decisioni basate su modelli predittivi.<br>
</li>
<li>Può lavorare su dati strutturati e non strutturati.</li>
</ul>
</section>
<section id="esempi-di-ai-in-banca" class="level3" data-number="5.3.2">
<h3 data-number="5.3.2" class="anchored" data-anchor-id="esempi-di-ai-in-banca"><span class="header-section-number">5.3.2</span> Esempi di AI in banca</h3>
<p>📊 <strong>Credit Scoring</strong> – Valuta il rischio di insolvenza basandosi su dati finanziari.<br>
🔍 <strong>Frode bancaria</strong> – Rileva operazioni sospette monitorando transazioni in tempo reale.<br>
🤖 <strong>Chatbot AI (NLP)</strong> – Comprende il linguaggio naturale per rispondere ai clienti.</p>
</section>
</section>
<section id="genai-intelligenza-artificiale-generativa" class="level2" data-number="5.4">
<h2 data-number="5.4" class="anchored" data-anchor-id="genai-intelligenza-artificiale-generativa"><span class="header-section-number">5.4</span> GenAI – Intelligenza Artificiale Generativa</h2>
<p>La <strong>Generative AI</strong> è una sottocategoria dell’AI che si concentra sulla <strong>creazione di nuovi contenuti</strong> (testo, immagini, codice, musica, ecc.).</p>
<section id="caratteristiche-principali-1" class="level3" data-number="5.4.1">
<h3 data-number="5.4.1" class="anchored" data-anchor-id="caratteristiche-principali-1"><span class="header-section-number">5.4.1</span> Caratteristiche principali</h3>
<ul>
<li>Crea testo, immagini, video o codice in base ai dati forniti.<br>
</li>
<li>Modelli come GPT (per testo), DALL·E (per immagini) e Codex (per codice).<br>
</li>
<li>Può generare risposte, traduzioni, riassunti e simulare conversazioni avanzate.</li>
</ul>
</section>
<section id="esempi-di-genai-in-banca" class="level3" data-number="5.4.2">
<h3 data-number="5.4.2" class="anchored" data-anchor-id="esempi-di-genai-in-banca"><span class="header-section-number">5.4.2</span> Esempi di GenAI in banca</h3>
<p><strong>Analisi automatica di documenti</strong> – Estrarre informazioni da contratti, bilanci e report.<br>
<strong>Chatbot avanzati</strong> – Chatbot che rispondono in modo più naturale e contestuale.<br>
<strong>Generazione di report finanziari</strong> – Creazione automatica di analisi e previsioni economiche.</p>
<p><strong>Differenza tra AI e GenAI:</strong><br>
L’AI è più <strong>analitica e decisionale</strong>, mentre la GenAI è <strong>creativa</strong> e può generare contenuti autonomamente.</p>
</section>
</section>
<section id="rpa-robotic-process-automation" class="level2" data-number="5.5">
<h2 data-number="5.5" class="anchored" data-anchor-id="rpa-robotic-process-automation"><span class="header-section-number">5.5</span> RPA – Robotic Process Automation</h2>
<p>L’<strong>RPA (Robotic Process Automation)</strong> è una tecnologia che utilizza <strong>bot software</strong> per automatizzare attività ripetitive basate su regole <strong>senza intelligenza vera</strong>.</p>
<section id="caratteristiche-principali-2" class="level3" data-number="5.5.1">
<h3 data-number="5.5.1" class="anchored" data-anchor-id="caratteristiche-principali-2"><span class="header-section-number">5.5.1</span> Caratteristiche principali</h3>
<ul>
<li>Automatizza compiti ripetitivi e basati su regole.<br>
</li>
<li>Non ha capacità di apprendimento come l’AI (esegue esattamente ciò che è programmato).<br>
</li>
<li>Interagisce con software e sistemi esistenti imitando le azioni umane.</li>
</ul>
</section>
<section id="esempi-di-rpa-in-banca" class="level3" data-number="5.5.2">
<h3 data-number="5.5.2" class="anchored" data-anchor-id="esempi-di-rpa-in-banca"><span class="header-section-number">5.5.2</span> Esempi di RPA in banca</h3>
<p><strong>Automazione dei pagamenti</strong> – I bot RPA elaborano bonifici e fatture senza errori.<br>
<strong>Verifica documenti</strong> – Estraggono e inseriscono dati nei sistemi bancari.<br>
<strong>Reportistica automatizzata</strong> – Generano report periodici senza intervento umano.</p>
<p>🔹 <strong>Differenza tra AI e RPA:</strong></p>
<ul>
<li><strong>AI</strong> apprende ed evolve, mentre <strong>RPA</strong> esegue solo azioni predefinite.</li>
<li><strong>AI</strong> è utile in scenari complessi (analisi dati, riconoscimento immagini), mentre <strong>RPA</strong> è perfetto per compiti ripetitivi (trasferimento dati tra software).</li>
</ul>
</section>
</section>
</section>
<section id="fintech-ai-e-comportamento-della-clientela" class="level1" data-number="6">
<h1 data-number="6"><span class="header-section-number">6</span> Fintech, AI e Comportamento della Clientela</h1>
<p>Nuove Frontiere per Banche, Intermediari Finanziari e Finanza d’Impresa</p>
<p>L’innovazione tecnologica sta ridefinendo il settore finanziario, con <strong>Fintech e Intelligenza Artificiale (AI)</strong> che stanno trasformando l’interazione tra <strong>banche, intermediari finanziari e imprese</strong>. Queste nuove tecnologie <strong>automatizzano processi, migliorano l’efficienza e personalizzano i servizi</strong>, ridefinendo il comportamento della clientela e le strategie delle istituzioni finanziarie.</p>
<p>Fintech e AI stanno ridisegnando il settore bancario, imponendo un <strong>cambiamento nelle strategie delle banche, degli intermediari finanziari e delle imprese</strong>. L’<strong>automazione e la personalizzazione</strong> sono le chiavi per attrarre e fidelizzare una clientela sempre più digitale. Per restare competitivi, gli operatori finanziari devono <strong>abbracciare queste nuove tecnologie</strong> e adattarsi rapidamente alle <strong>nuove esigenze di mercato</strong>.</p>
<section id="limpatto-del-fintech-sulle-banche-tradizionali" class="level2" data-number="6.1">
<h2 data-number="6.1" class="anchored" data-anchor-id="limpatto-del-fintech-sulle-banche-tradizionali"><span class="header-section-number">6.1</span> L’impatto del Fintech sulle Banche Tradizionali</h2>
<p>Le <strong>Fintech</strong>, grazie a tecnologie come <strong>blockchain, AI e open banking</strong>, stanno cambiando il modo in cui i clienti accedono ai servizi finanziari. Le banche tradizionali devono rispondere con:</p>
<p>✅ <strong>Digitalizzazione dei servizi</strong> – Home banking avanzato e interfacce utente intuitive.<br>
✅ <strong>Pagamenti istantanei &amp; Open Banking</strong> – API che integrano conti bancari con servizi di terze parti.<br>
✅ <strong>Prestiti e mutui digitalizzati</strong> – Processi di concessione automatizzati basati su AI.<br>
✅ <strong>Tokenizzazione degli asset</strong> – Nuovi strumenti di investimento tramite blockchain.</p>
<p>📌 <strong>Esempio:</strong> Revolut e N26 offrono <strong>esperienze bancarie completamente digitali</strong>, sfidando il modello tradizionale.</p>
</section>
<section id="ai-e-personalizzazione-nei-servizi-finanziari" class="level2" data-number="6.2">
<h2 data-number="6.2" class="anchored" data-anchor-id="ai-e-personalizzazione-nei-servizi-finanziari"><span class="header-section-number">6.2</span> AI e Personalizzazione nei Servizi Finanziari</h2>
<p>L’<strong>Intelligenza Artificiale</strong> consente di analizzare enormi quantità di dati per offrire servizi su misura:</p>
<p>✅ <strong>Analisi predittiva</strong> – Prevede le esigenze finanziarie del cliente (es. risparmi, investimenti).<br>
✅ <strong>Chatbot intelligenti</strong> – Assistenti virtuali risolvono problemi in tempo reale.<br>
✅ <strong>AI per la gestione patrimoniale</strong> – Robo-advisor personalizzano strategie di investimento.<br>
✅ <strong>Prevenzione delle frodi</strong> – Algoritmi di machine learning rilevano transazioni sospette.</p>
<p>📌 <strong>Esempio:</strong> <strong>JP Morgan</strong> utilizza AI per il trading e per analizzare documenti contrattuali in pochi secondi.</p>
</section>
<section id="evoluzione-del-comportamento-della-clientela" class="level2" data-number="6.3">
<h2 data-number="6.3" class="anchored" data-anchor-id="evoluzione-del-comportamento-della-clientela"><span class="header-section-number">6.3</span> Evoluzione del Comportamento della Clientela</h2>
<p>La clientela sta cambiando il proprio approccio ai servizi finanziari, preferendo <strong>esperienze digitali e personalizzate</strong>:</p>
<p>🔹 <strong>Maggiore fiducia nei servizi Fintech</strong> – Più utenti scelgono neobank e piattaforme alternative.<br>
🔹 <strong>Domanda di servizi più veloci e intuitivi</strong> – Si riduce la pazienza per burocrazia e processi lenti.<br>
🔹 <strong>Crescente attenzione alla sicurezza e alla privacy</strong> – GDPR e AI explainability diventano centrali.<br>
🔹 <strong>Nuove abitudini di investimento</strong> – Interesse per asset digitali, criptovalute e prodotti ESG.</p>
<p>📌 <strong>Dati:</strong> Il 74% dei Millennials preferisce gestire le proprie finanze tramite app mobile piuttosto che in filiale.</p>
</section>
<section id="finanza-dimpresa-e-ai-nuove-opportunità-per-le-aziende" class="level2" data-number="6.4">
<h2 data-number="6.4" class="anchored" data-anchor-id="finanza-dimpresa-e-ai-nuove-opportunità-per-le-aziende"><span class="header-section-number">6.4</span> Finanza d’Impresa e AI: Nuove Opportunità per le Aziende</h2>
<p>L’AI e il Fintech stanno ridefinendo anche la <strong>finanza aziendale</strong>:</p>
<p>✅ <strong>Automazione della contabilità</strong> – AI per la gestione di cash flow e report finanziari.<br>
✅ <strong>Accesso ai finanziamenti alternativo</strong> – Crowdfunding, peer-to-peer lending e fintech lending.<br>
✅ <strong>Risk management avanzato</strong> – AI per valutare rischi finanziari e creditizi in tempo reale.<br>
✅ <strong>Supply Chain Finance</strong> – Blockchain per la trasparenza nelle transazioni aziendali.</p>
<p>📌 <strong>Esempio:</strong> <strong>Stripe e Klarna</strong> offrono soluzioni di pagamento integrate per le imprese, migliorando il cash flow.</p>
</section>
</section>
<section id="la-doppia-tripla-transizione-digitale-green-e-generazionale" class="level1" data-number="7">
<h1 data-number="7"><span class="header-section-number">7</span> La Doppia (Tripla) Transizione: Digitale, Green e Generazionale</h1>
<p>Il settore bancario si trova al centro di una <strong>doppia, se non tripla, transizione</strong> che coinvolge la <strong>digitalizzazione, la sostenibilità e il cambiamento generazionale</strong>. Tuttavia, fattori come l’<strong>analfabetismo informatico</strong>, l’<strong>età media elevata dei bancari</strong> e il <strong>digital divide</strong> rendono questa trasformazione complessa e ricca di sfide.</p>
<ul>
<li><strong>Transizione Digitale</strong> → Automazione, AI, blockchain, neobank.<br>
</li>
<li><strong>Transizione Green</strong> → Investimenti ESG, finanza sostenibile.<br>
</li>
<li><strong>Transizione Generazionale</strong> → Cambio tra vecchia e nuova classe di bancari.</li>
</ul>
<p><strong>Sfida principale</strong>: bilanciare innovazione e sostenibilità, senza perdere il contatto con una clientela diversificata.</p>
<p>La digitalizzazione è inevitabile, ma il settore bancario deve affrontare <strong>sfide culturali e formative</strong>. Le istituzioni devono investire in <strong>formazione, mentorship e strategie inclusive</strong> per assicurare che l’innovazione non lasci indietro nessuno, favorendo una <strong>transizione armonica</strong> tra generazioni e modelli operativi.</p>
<p><img src="https://paolovolterra.com/posts/2520_AiBanche/media/20250206170810.png" class="img-fluid"></p>
<section id="analfabetismo-informatico-digital-divide" class="level2" data-number="7.1">
<h2 data-number="7.1" class="anchored" data-anchor-id="analfabetismo-informatico-digital-divide"><span class="header-section-number">7.1</span> Analfabetismo Informatico &amp; Digital Divide</h2>
<p>🔹 Molti dipendenti bancari <strong>non hanno competenze digitali avanzate</strong>, rendendo complessa l’adozione di nuove tecnologie.<br>
🔹 Il <strong>digital divide</strong> crea disparità tra clienti giovani (nativi digitali) e quelli più anziani, meno avvezzi ai servizi online.<br>
🔹 L’uso dell’AI nei servizi finanziari richiede personale formato per evitare errori nell’automazione e nei processi decisionali.</p>
<p><strong>Soluzione</strong>: Investire in <strong>formazione digitale</strong> per dipendenti e clienti, con il supporto di enti come <strong>Fabi, AIPB e Feduf</strong>.</p>
</section>
<section id="letà-media-del-bancario-e-il-passaggio-generazionale" class="level2" data-number="7.2">
<h2 data-number="7.2" class="anchored" data-anchor-id="letà-media-del-bancario-e-il-passaggio-generazionale"><span class="header-section-number">7.2</span> L’Età Media del Bancario e il Passaggio Generazionale</h2>
<p>🔹 L’<strong>età media del bancario</strong> è attorno ai 50 anni, e molti faticano ad adattarsi alle nuove tecnologie.<br>
🔹 Il <strong>passaggio generazionale</strong> è complesso: i giovani hanno competenze digitali, ma meno esperienza finanziaria e gestionale.<br>
🔹 Le banche devono <strong>riformare i modelli organizzativi</strong>, valorizzando l’esperienza dei senior e la flessibilità dei giovani.</p>
<p><strong>Soluzione</strong>: Creazione di <strong>mentorship</strong> tra bancari senior e junior per una <strong>transizione più fluida</strong>.</p>
<hr>
</section>
<section id="il-ruolo-della-formazione-fot-feduf-fabi-aipb" class="level2" data-number="7.3">
<h2 data-number="7.3" class="anchored" data-anchor-id="il-ruolo-della-formazione-fot-feduf-fabi-aipb"><span class="header-section-number">7.3</span> Il Ruolo della Formazione (FOT, Feduf, Fabi, AIPB)</h2>
<p>🔹 <strong>FOT (Fondo per l’Occupazione del Credito)</strong> → Supporta piani di aggiornamento professionale per bancari.<br>
🔹 <strong>Feduf (Educazione Finanziaria e Digitale)</strong> → Promuove l’alfabetizzazione finanziaria nelle scuole e tra i cittadini.<br>
🔹 <strong>Fabi (Sindacato Bancari)</strong> → Difende i diritti dei lavoratori nel contesto della digitalizzazione.<br>
🔹 <strong>AIPB (Private Banking)</strong> → Supporta la formazione per i professionisti del wealth management.</p>
<p><strong>Obiettivo</strong>: Un piano strategico per <strong>formare bancari e clienti</strong>, riducendo il digital divide e facilitando la transizione tecnologica.</p>
</section>
</section>
<section id="la-genai-in-banca" class="level1" data-number="8">
<h1 data-number="8"><span class="header-section-number">8</span> La GenAI in banca</h1>
<table class="caption-top table">
<colgroup>
<col style="width: 21%">
<col style="width: 78%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Tema</strong></th>
<th><strong>Dati principali</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Adozione GenAI</strong></td>
<td>88% delle banche con strategia entro il 2025 (38% già operativa).</td>
</tr>
<tr class="even">
<td><strong>Sperimentazione</strong></td>
<td>69% in fase di test, 60% con progetti AI in produzione.</td>
</tr>
<tr class="odd">
<td><strong>Investimenti</strong></td>
<td>82% aumenterà il budget AI, 88% incrementerà gli investimenti in GenAI.</td>
</tr>
<tr class="even">
<td><strong>Fattori di investimento</strong></td>
<td>80% valuta benefici attesi, 67% considera costi e compliance.</td>
</tr>
<tr class="odd">
<td><strong>ROI atteso</strong></td>
<td>75% senza tempistiche precise, 13% prevede ROI entro 1 anno.</td>
</tr>
<tr class="even">
<td><strong>Strategia “Make or Buy”</strong></td>
<td>“Make” per studio e gestione rischi (40%), “Buy” per formazione e sviluppo.</td>
</tr>
<tr class="odd">
<td><strong>Partnership</strong></td>
<td>54% collabora con BigTech/ICT, future sinergie con Software Vendor (55%) e startup fintech (45%).</td>
</tr>
<tr class="even">
<td><strong>Governance AI</strong></td>
<td>81% monitora AI, 77% integra GenAI nei team AI/Innovazione, 23% ha un team dedicato.</td>
</tr>
<tr class="odd">
<td><strong>Skill gap &amp; Formazione</strong></td>
<td>57% ha gap in Ethics, Data Science, Testing; 75% investe in change management.</td>
</tr>
<tr class="even">
<td><strong>Conformità AI Act</strong></td>
<td>70% in fase di adeguamento, 50% ha già un framework di governance.</td>
</tr>
</tbody>
</table>
<p>Fonte: <strong>Deloitte</strong>&nbsp;nell’ambito dell’**Osservatorio Fintech Innovation</p>
<table class="caption-top table">
<colgroup>
<col style="width: 8%">
<col style="width: 91%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Tema</strong></th>
<th><strong>Dati e Informazioni</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Adozione della GenAI</strong></td>
<td>- <strong>88%</strong> delle banche italiane avrà una strategia GenAI entro il <strong>2025</strong> (già operativa nel <strong>38%</strong> dei casi).- <strong>80%</strong> delle banche integra la GenAI nella strategia AI complessiva.</td>
</tr>
<tr class="even">
<td><strong>Sperimentazione e Produzione</strong></td>
<td>- <strong>69%</strong> delle banche è in fase di sperimentazione per la GenAI.- <strong>60%</strong> ha già progetti AI in produzione.</td>
</tr>
<tr class="odd">
<td><strong>Investimenti e Budget</strong></td>
<td>- <strong>69%</strong> include il budget GenAI nel budget AI complessivo.- Solo <strong>13%</strong> ha un budget specifico per GenAI.- <strong>82%</strong> prevede un aumento del budget AI: - <strong>38%</strong> incremento significativo (&gt;10%). - <strong>44%</strong> incremento moderato (fino al 10%).- <strong>88%</strong> prevede un aumento degli investimenti in GenAI.</td>
</tr>
<tr class="even">
<td><strong>Fattori di valutazione per gli investimenti</strong></td>
<td>- <strong>80%</strong> considera ricavi e benefici attesi.- <strong>67%</strong> valuta costi e investimenti necessari.- <strong>67%</strong> tiene conto di rischi e compliance.</td>
</tr>
<tr class="odd">
<td><strong>ROI della GenAI</strong></td>
<td>- <strong>75%</strong> non indica un periodo preciso di ritorno.- <strong>13%</strong> prevede un ROI tra <strong>6 mesi e 1 anno</strong>.</td>
</tr>
<tr class="even">
<td><strong>Strategia “Make or Buy”</strong></td>
<td>- <strong>Fattori di scelta</strong>: risorse disponibili, tempi di sviluppo, strategia aziendale.- <strong>“Make”</strong>: preferito per studio, progettazione, risk management, audit e assurance (<strong>40%</strong> delle banche).- <strong>“Buy”</strong>: usato per formazione, implementazione architetturale, manutenzione e sviluppo.</td>
</tr>
<tr class="odd">
<td><strong>Collaborazioni e Partnership</strong></td>
<td>- <strong>54%</strong> delle banche ha partnership attive con aziende ICT/BigTech.- <strong>Sinergie future</strong>: - <strong>55%</strong> Software Vendor. - <strong>45%</strong> Fintech/Startup.</td>
</tr>
<tr class="even">
<td><strong>Governance e Compliance AI</strong></td>
<td>- <strong>81%</strong> monitora tematiche AI.- <strong>77%</strong> assegna la GenAI ai team AI/Innovazione.- <strong>23%</strong> ha creato un presidio dedicato alla GenAI.- In media <strong>4 dipendenti ogni 1000</strong> coinvolti in AI/GenAI.- <strong>75%</strong> prevede un aumento degli FTE interni nei prossimi 2 anni.</td>
</tr>
<tr class="odd">
<td><strong>Skill Gap e Formazione</strong></td>
<td>- <strong>57%</strong> segnala skill gap moderato o alto in: - Ethics. - Solution Testing &amp; Deployment. - Data Science/Prompt Engineering.- <strong>75%</strong> ha già attuato o pianifica azioni di change management.- <strong>Iniziative di formazione</strong>: - <strong>50%</strong> corsi su GenAI. - <strong>50%</strong> revisione processi aziendali. - <strong>40%</strong> nuove figure professionali. - <strong>44%</strong> corsi per dipendenti su GenAI. - <strong>33%</strong> awareness su GenAI. - <strong>33%</strong> formazione team di sviluppo. - <strong>56%</strong> percorsi per nuovi ruoli interni.</td>
</tr>
<tr class="even">
<td><strong>Conformità all’AI Act</strong></td>
<td>- <strong>70%</strong> definisce o sta definendo metodologie per garantire etica e compliance all’AI Act entro il <strong>2025</strong>.- <strong>Pratiche adottate</strong>: - <strong>79%</strong> monitoraggio normativo e conformità. - <strong>71%</strong> AI Governance by Design. - <strong>57%</strong> supervisione umana nella validazione dei contenuti.- <strong>50%</strong> ha definito un framework di governance per GenAI.</td>
</tr>
</tbody>
</table>
</section>
<section id="glossario" class="level1" data-number="9">
<h1 data-number="9"><span class="header-section-number">9</span> Glossario</h1>
<section id="ai-act" class="level2" data-number="9.1">
<h2 data-number="9.1" class="anchored" data-anchor-id="ai-act"><span class="header-section-number">9.1</span> AI Act</h2>
<ul>
<li><strong>Obiettivo</strong>: Regolare l’uso dell’intelligenza artificiale nell’UE per proteggere i diritti fondamentali.</li>
<li><strong>Categorie di Rischio</strong>: Classifica le applicazioni AI in base al loro livello di rischio; quelle ad alto rischio, come le valutazioni del merito creditizio, sono soggette a controlli più rigorosi</li>
</ul>
</section>
<section id="allucinazione" class="level2" data-number="9.2">
<h2 data-number="9.2" class="anchored" data-anchor-id="allucinazione"><span class="header-section-number">9.2</span> Allucinazione</h2>
<p>In ambito AI, il termine <strong>“allucinazione”</strong> si riferisce a quando un modello di Intelligenza Artificiale <strong>genera informazioni errate, inventate o fuorvianti</strong>, pur presentandole come se fossero vere. Questo fenomeno è particolarmente rilevante nell’AI generativa (<strong>GenAI</strong>), come nei chatbot basati su modelli di linguaggio (LLM), ma può avvenire anche in sistemi di machine learning in altri ambiti. Le allucinazioni avvengono perché i modelli di AI <strong>non comprendono realmente il significato dei dati</strong>, ma si basano su pattern statistici. Ecco alcune cause principali: ✅ <strong>Mancanza di dati</strong> – Se un modello non ha dati sufficienti su un argomento, può riempire i vuoti con informazioni errate.<br>
✅ <strong>Bias nei dati di training</strong> – Se i dati con cui è stato addestrato contengono errori o distorsioni, l’AI può replicarli.<br>
✅ <strong>Modello predittivo, non verificativo</strong> – L’AI genera risposte sulla base di probabilità statistiche, non su un controllo fattuale.<br>
✅ <strong>Errori di contestualizzazione</strong> – Può mescolare informazioni da fonti diverse, creando affermazioni incoerenti o inesatte. Esempi: - Un chatbot bancario potrebbe <strong>inventare politiche sui prestiti</strong> o riferire condizioni errate sui conti correnti.<br>
- Un modello di AI per il trading potrebbe suggerire decisioni basate su dati inesistenti o correlazioni errate.</p>
</section>
<section id="deep-fake" class="level2" data-number="9.3">
<h2 data-number="9.3" class="anchored" data-anchor-id="deep-fake"><span class="header-section-number">9.3</span> Deep Fake</h2>
<p>contenuti multimediali (video, immagini, audio) <strong>generati o manipolati con l’Intelligenza Artificiale</strong> per creare simulazioni realistiche di persone, spesso con lo scopo di <strong>ingannare o intrattenere</strong>. Questa tecnologia utilizza <strong>reti neurali profonde</strong> (da cui il nome <em>deep</em> fake) per sostituire volti, voci o movimenti con grande precisione.</p>
</section>
<section id="dora-digital-operational-resilience-act" class="level2" data-number="9.4">
<h2 data-number="9.4" class="anchored" data-anchor-id="dora-digital-operational-resilience-act"><span class="header-section-number">9.4</span> DORA (Digital Operational Resilience Act)</h2>
<ul>
<li><strong>Obiettivo</strong>: Migliorare la resilienza operativa digitale delle istituzioni finanziarie, inclusi i servizi bancari.</li>
<li><strong>Requisiti</strong>: Le banche devono implementare misure per garantire la continuità operativa e gestire i rischi legati alla tecnologia.</li>
<li><strong>Applicazione</strong>: Si concentra su aspetti come la sicurezza informatica, l’efficienza dei processi digitali e la gestione degli incidenti.</li>
</ul>
</section>
<section id="nis2-network-and-information-security-directive" class="level2" data-number="9.5">
<h2 data-number="9.5" class="anchored" data-anchor-id="nis2-network-and-information-security-directive"><span class="header-section-number">9.5</span> NIS2 (Network and Information Security Directive)</h2>
<ul>
<li><strong>Obiettivo</strong>: Rafforzare la sicurezza informatica delle entità essenziali e importanti nell’UE.</li>
<li><strong>Requisiti Principali</strong>:
<ul>
<li>Valutazione del rischio</li>
<li>Misure di sicurezza</li>
<li>Segnalazione degli incidenti</li>
<li>Sicurezza della catena di approvvigionamento</li>
<li>Formazione sulla cybersecurity</li>
</ul></li>
</ul>
</section>
</section>
<section id="note" class="level1" data-number="10">
<h1 data-number="10"><span class="header-section-number">10</span> note</h1>
<hr>
<section id="note-1" class="level2" data-number="10.1">
<h2 data-number="10.1" class="anchored" data-anchor-id="note-1"><span class="header-section-number">10.1</span> note</h2>


</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>AI</category>
  <category>Banche</category>
  <guid>https://paolovolterra.com/posts/2520_AiBanche/20250210_AiBanche.html</guid>
  <pubDate>Sun, 09 Feb 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Fondo Intelligenza Artificiale</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2519_FondoAI/20250209_FondoAI.html</link>
  <description><![CDATA[ 




<section id="fondo-per-interventi-volti-a-favorire-lo-sviluppo-delle-tecnologie-e-delle-applicazioni-di-intelligenza-artificiale-blockchain-e-internet-of-things" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Fondo per interventi volti a favorire lo sviluppo delle tecnologie e delle applicazioni di intelligenza artificiale, blockchain e internet of things</h1>
<p>#Infratel</p>
<p><img src="https://paolovolterra.com/posts/2519_FondoAI/media/immagine1.png" class="img-fluid"></p>
<p>Decreto - Blockchain e intelligenza artificiale - 9/12/21: € 45 milioni alle imprese per investimenti in blockchain e intelligenza artificiale. Il Ministro dello sviluppo economico ha firmato il Decreto attuativo del Fondo per lo sviluppo delle tecnologie e delle applicazioni di intelligenza artificiale, blockchain e internet of things, istituito presso il Mise con una dotazione iniziale di 45 milioni di euro, ha l’obiettivo di promuovere la competitività e la produttività del sistema imprenditoriale del Paese attraverso progetti di ricerca e innovazione tecnologica legati al programma transizione 4.0. 45 milioni alle imprese per investimenti in blockchain e intelligenza artificiale (mise.gov.it) Decreto: DM_6_dicembre_2021_firmato.pdf (mise.gov.it)</p>
<p><a href="https://www.infratelitalia.it/piani-nazionali-e-regionali/intelligenza-artificiale-blockchain-e-internet-of-things">Qui</a> le caratteristiche</p>
</section>
<section id="registro-nazionale-degli-aiuti-di-stato" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> Registro Nazionale degli Aiuti di Stato</h1>
<p>https://www.rna.gov.it/</p>
<p><img src="https://www.rna.gov.it/sites/rna.mise.gov.it/themes/custom/rna/logo.svg" class="img-fluid"></p>
</section>
<section id="opencup" class="level1" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> Opencup</h1>
<p>https://www.opencup.gov.it/portale</p>
<p><img src="https://www.opencup.gov.it/portale/o/Opencup-NewTheme/images/tema/OpencupIcon.svg" class="img-fluid"></p>
</section>
<section id="opencoesione" class="level1" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> Opencoesione</h1>
<p>https://opencoesione.gov.it/it/</p>
<p><img src="https://opencoesione.gov.it/static/images/footer/loghi/capcoe.png" class="img-fluid"></p>
<p><img src="https://opencoesione.gov.it/static/images/coesioneitalia_logo.svg" class="img-fluid"></p>
<p><img src="https://www.infratelitalia.it/-/media/infratel/images/internet-things/banner_innovation_800.png?la=it-it&amp;h=400&amp;w=800&amp;hash=D5E410D0A9ED3090F4BE86ADDBB80DA3023DCA11" class="img-fluid"> ## Biblio e sitografia</p>
<ul>
<li>https://www.mimit.gov.it/index.php/it/notizie-stampa/mise-45-milioni-alle-imprese-per-investimenti-in-blockchain-e-intelligenza-artificiale</li>
<li>Fondo nuove tecnologie, al via domande per 45 milioni, Il Sole 24 Ore Mercoledì 21 Settembre 2022</li>
<li>Incentivata la ricerca sull’intelligenza artificiale, Il Sole 24 Ore Giovedì 7 Luglio 2022</li>
</ul>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Aiuti</category>
  <category>RNA</category>
  <category>Coesione</category>
  <category>Python</category>
  <category>CUP</category>
  <guid>https://paolovolterra.com/posts/2519_FondoAI/20250209_FondoAI.html</guid>
  <pubDate>Sat, 08 Feb 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Google Search</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2517_googlesearch/20250209_GoogleSearch.html</link>
  <description><![CDATA[ 




<section id="google-search" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Google Search</h1>
<p><img src="https://paolovolterra.com/posts/2517_googlesearch/media/google-485611_1280.jpg" class="img-fluid"></p>
<p>https://www.google.com/search?q=genai+finance+banking+filetype:pdf&amp;tbs=qdr:m&amp;num=10 Così ottieni solo i PDF pubblicati nell’ultimo mese senza parametri di tracking.</p>
<p>I parametri servono principalmente a:</p>
<ul>
<li>Definire il numero di risultati per pagina (num=10)</li>
<li>Applicare filtri temporali (tbs=qdr:m)</li>
<li>Ottimizzare la ricerca in base al dispositivo e alla sessione utente (biw, bih, dpr, sxsrf)</li>
<li>Monitorare e migliorare l’esperienza di ricerca (sca_esv, sa=X, ved)</li>
<li>Se vuoi fare una ricerca più pulita e replicabile, puoi usare un URL più semplice, ad esempio:</li>
</ul>
<section id="a-cosa-servono-num10sca_esvb7f49eb14b13d0ffsxsrfahtn8zox-wju4kej-su5ugy0sl_aqaeurg1739086839079sourcelnttbsqdrmsaxved2ahukewjnmjuqi7alaxxrywihhs8cddkqpwv6bageea8biw1843bih1017dpr1.56" class="level2" data-number="1.1">
<h2 data-number="1.1" class="anchored" data-anchor-id="a-cosa-servono-num10sca_esvb7f49eb14b13d0ffsxsrfahtn8zox-wju4kej-su5ugy0sl_aqaeurg1739086839079sourcelnttbsqdrmsaxved2ahukewjnmjuqi7alaxxrywihhs8cddkqpwv6bageea8biw1843bih1017dpr1.56"><span class="header-section-number">1.1</span> a cosa servono num=10&amp;sca_esv=b7f49eb14b13d0ff&amp;sxsrf=AHTn8zoX-WJU4kej-SU5uGy0Sl_AqaeURg:1739086839079&amp;source=lnt&amp;tbs=qdr:m&amp;sa=X&amp;ved=2ahUKEwjNmJuqi7aLAxXRywIHHS8CDDkQpwV6BAgEEA8&amp;biw=1843&amp;bih=1017&amp;dpr=1.56</h2>
<p>Questi parametri nell’URL della tua ricerca su Google hanno diverse funzioni specifiche:</p>
<ul>
<li>num=10 – Indica il numero di risultati per pagina. In questo caso, Google mostrerà 10 risultati per pagina.</li>
<li>sca_esv=b7f49eb14b13d0ff – È un parametro di sessione che Google utilizza per il monitoraggio della ricerca. Non ha un impatto diretto sui risultati, ma serve a Google per ottimizzare la ricerca e migliorare l’esperienza utente.</li>
<li>sxsrf=AHTn8zoX-WJU4kej-SU5uGy0Sl_AqaeURg – Fa parte del sistema di sicurezza di Google per prevenire attacchi CSRF (Cross-Site Request Forgery). Non influenza i risultati.</li>
<li>source=lnt – Indica che la ricerca ha utilizzato un filtro temporale o altri strumenti avanzati di ricerca.</li>
<li>tbs=qdr:m – Applica un filtro temporale alla ricerca. In questo caso, qdr:m significa che vengono mostrati solo i risultati pubblicati nell’ultimo mese.</li>
<li>sa=X – È un parametro che indica che la ricerca è stata effettuata manualmente (senza passare da suggerimenti o altre fonti).</li>
<li>ved=2ahUKEwjNmJuqi7aLAxXRywIHHS8CDDkQpwV6BAgEEA8 – È un parametro di tracking interno usato da Google per monitorare clic e interazioni con i risultati di ricerca.</li>
<li>biw=1843&amp;bih=1017 – Indicano la larghezza (biw) e l’altezza (bih) della finestra del browser in pixel al momento della ricerca. Questo può influenzare la disposizione dei risultati sulla pagina.</li>
<li>dpr=1.56 – Indica il device pixel ratio, cioè il rapporto tra pixel fisici e pixel logici dello schermo. Google utilizza questo parametro per ottimizzare la visualizzazione dei risultati su schermi ad alta risoluzione.</li>
</ul>
</section>
<section id="nellultima-settimana" class="level2" data-number="1.2">
<h2 data-number="1.2" class="anchored" data-anchor-id="nellultima-settimana"><span class="header-section-number">1.2</span> nell’ultima settimana</h2>
<p>Per filtrare i risultati della ricerca agli ultimi 7 giorni, devi modificare il parametro tbs=qdr:m (che filtra per l’ultimo mese) con tbs=qdr:w, che filtra per l’ultima settimana.</p>
<p>L’URL corretto per la tua ricerca diventa:</p>
<p>arduino Copia Modifica https://www.google.com/search?q=genai+finance+banking+filetype:pdf&amp;tbs=qdr:w&amp;num=10 📌 Spiegazione della modifica:</p>
<p>tbs=qdr:w → Mostra solo risultati pubblicati nell’ultima settimana. num=10 → Limita il numero di risultati per pagina a 10. filetype:pdf → Restringe la ricerca ai soli documenti PDF. Se vuoi un periodo ancora più ristretto (es. ultime 24 ore), puoi usare tbs=qdr:d.</p>
</section>
<section id="per-cercare-nellanno-2022-o-in-intervallo-di-date" class="level2" data-number="1.3">
<h2 data-number="1.3" class="anchored" data-anchor-id="per-cercare-nellanno-2022-o-in-intervallo-di-date"><span class="header-section-number">1.3</span> per cercare nell’anno 2022 o in intervallo di date</h2>
<p>ChatGPT ha detto: Per cercare documenti nell’anno 2022 o in un intervallo di date specifico su Google, devi usare il parametro tbs=cdr:1,cd_min:[data inizio],cd_max:[data fine].</p>
<p>1️⃣ Cercare nell’anno 2022 Puoi usare questo URL:</p>
<p>arduino Copia Modifica https://www.google.com/search?q=genai+finance+banking+filetype:pdf&amp;tbs=cdr:1,cd_min:01/01/2022,cd_max:12/31/2022&amp;num=10 📌 Spiegazione:</p>
<p>tbs=cdr:1,cd_min:01/01/2022,cd_max:12/31/2022 → Filtra i risultati pubblicati tra il 1° gennaio 2022 e il 31 dicembre 2022.</p>
<p>2️⃣ Cercare in un intervallo di date specifico Se vuoi risultati pubblicati tra 1° giugno 2023 e 31 dicembre 2023, usa:</p>
<p>arduino Copia Modifica https://www.google.com/search?q=genai+finance+banking+filetype:pdf&amp;tbs=cdr:1,cd_min:06/01/2023,cd_max:12/31/2023&amp;num=10 📌 Personalizza l’intervallo di date:</p>
<p>cd_min:MM/DD/YYYY → Data di inizio della ricerca. cd_max:MM/DD/YYYY → Data di fine della ricerca. 3️⃣ Metodo Alternativo Manuale Se preferisci, puoi fare la ricerca direttamente su Google, poi:</p>
<p>Clicca su Strumenti (sotto la barra di ricerca). Seleziona Intervallo di date personalizzato. Inserisci le date desiderate. Questa tecnica è utile se vuoi un filtro più preciso senza dover modificare l’URL manualmente. 🚀</p>
</section>
<section id="crea-una-routine-bash-che-chiede-testo-da-cercare-numero-di-risultati-e-periodo-da-a-.-i-risultati-devono-essere-solo-pdf.-la-ricerca-deve-essere-salvata-in-un-file-markdown" class="level2" data-number="1.4">
<h2 data-number="1.4" class="anchored" data-anchor-id="crea-una-routine-bash-che-chiede-testo-da-cercare-numero-di-risultati-e-periodo-da-a-.-i-risultati-devono-essere-solo-pdf.-la-ricerca-deve-essere-salvata-in-un-file-markdown"><span class="header-section-number">1.4</span> crea una routine bash che chiede testo da cercare numero di risultati e periodo da a . i risultati devono essere solo pdf. la ricerca deve essere salvata in un file markdown</h2>
</section>
<section id="script-puppeteer" class="level2" data-number="1.5">
<h2 data-number="1.5" class="anchored" data-anchor-id="script-puppeteer"><span class="header-section-number">1.5</span> script puppeteer</h2>
<p>ChatGPT ha detto: Google Pdf Search Puppeteer Ho creato uno script Puppeteer in JavaScript che esegue una ricerca su Google per file PDF, con la possibilità di specificare un intervallo di date e un numero di risultati. I risultati vengono salvati in un file Markdown. Se hai bisogno di modifiche o miglioramenti, fammi sapere! 🚀</p>
<pre><code>const puppeteer = require('puppeteer');
const fs = require('fs');

(async () =&gt; {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();

    // Chiedi all'utente il testo da cercare
    const readline = require('readline-sync');
    const query = readline.question("Inserisci il testo da cercare: ");
    const numResults = readline.question("Inserisci il numero di risultati (es. 10): ");
    const startDate = readline.question("Inserisci la data di inizio (formato MM/DD/YYYY): ");
    const endDate = readline.question("Inserisci la data di fine (formato MM/DD/YYYY): ");

    // Formatta la query per l'URL
    const queryUrl = encodeURIComponent(query);
    
    // Costruisci l'URL di ricerca di Google
    const searchUrl = `https://www.google.com/search?q=${queryUrl}+filetype:pdf&amp;tbs=cdr:1,cd_min:${startDate},cd_max:${endDate}&amp;num=${numResults}`;
    
    console.log(`Navigating to: ${searchUrl}`);
    await page.goto(searchUrl, { waitUntil: 'domcontentloaded' });

    // Estrai i link dai risultati di ricerca
    const links = await page.evaluate(() =&gt; {
        return Array.from(document.querySelectorAll('a'))
            .map(anchor =&gt; anchor.href)
            .filter(href =&gt; href.endsWith('.pdf'));
    });

    // Salva i risultati in un file Markdown
    const outputFile = 'risultati.md';
    let outputContent = `# Risultati per: ${query}\n`;
    outputContent += `_Periodo: ${startDate} - ${endDate}_\n\n`;
    links.forEach(link =&gt; {
        outputContent += `- [${link}](${link})\n`;
    });
    
    fs.writeFileSync(outputFile, outputContent);
    console.log(`Risultati salvati in ${outputFile}`);

    await browser.close();
})();
</code></pre>
</section>
<section id="routine-bash" class="level2" data-number="1.6">
<h2 data-number="1.6" class="anchored" data-anchor-id="routine-bash"><span class="header-section-number">1.6</span> routine bash</h2>
<ul>
<li>che chiede testo da cercare numero di risultati e periodo da a .</li>
<li>i risultati devono essere solo pdf.</li>
<li>la ricerca deve essere salvata in un file markdown ChatGPT ha detto: Google Pdf Search Puppeteer modifica apportata Ho aggiornato lo script Bash per eseguire la ricerca di file PDF su Google, chiedendo all’utente il testo da cercare, il numero di risultati e l’intervallo di date. I risultati vengono salvati in un file Markdown.</li>
</ul>
<pre><code>#!/bin/bash

# Chiedi all'utente il testo da cercare
echo "Inserisci il testo da cercare:"
read query

# Chiedi all'utente il numero di risultati
echo "Inserisci il numero di risultati (es. 10):"
read num_results

# Chiedi l'intervallo di date
echo "Inserisci la data di inizio (formato YYYY-MM-DD):"
read start_date
echo "Inserisci la data di fine (formato YYYY-MM-DD):"
read end_date

# Converti la query per l'URL
query_url=$(echo "$query" | sed 's/ /+/g')

# Costruisci l'URL di ricerca
search_url="https://www.google.com/search?q=${query_url}+filetype:pdf&amp;tbs=cdr:1,cd_min:${start_date},cd_max:${end_date}&amp;num=${num_results}"

# Definisci il file di output
output_file="risultati.md"

# Esegui la ricerca e salva i risultati in Markdown
echo "# Risultati per: $query" &gt; "$output_file"
echo "_Periodo: $start_date - $end_date_" &gt;&gt; "$output_file"
echo "" &gt;&gt; "$output_file"

# Usa wget e grep per estrarre i link
wget -qO- "$search_url" | grep -Eo 'https?://[^ ]+\.pdf' | sort -u | while read -r link; do
    echo "- [$link]($link)" &gt;&gt; "$output_file"
done

echo "Risultati salvati in $output_file"</code></pre>
</section>
<section id="script-python" class="level2" data-number="1.7">
<h2 data-number="1.7" class="anchored" data-anchor-id="script-python"><span class="header-section-number">1.7</span> script python</h2>
<pre><code>import requests
from bs4 import BeautifulSoup
import urllib.parse

# Chiedi all'utente il testo da cercare
query = input("Inserisci il testo da cercare: ")
num_results = input("Inserisci il numero di risultati (es. 10): ")
start_date = input("Inserisci la data di inizio (formato YYYY-MM-DD): ")
end_date = input("Inserisci la data di fine (formato YYYY-MM-DD): ")

# Converti la query per l'URL
query_url = urllib.parse.quote(query)
search_url = f"https://www.google.com/search?q={query_url}+filetype:pdf&amp;tbs=cdr:1,cd_min:{start_date},cd_max:{end_date}&amp;num={num_results}"

# Definisci il file di output
output_file = "risultati.md"

# Esegui la richiesta HTTP
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(search_url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

# Trova tutti i link ai file PDF
links = set()
for a in soup.find_all('a', href=True):
    href = a['href']
    if ".pdf" in href:
        links.add(href)

# Salva i risultati in un file Markdown
with open(output_file, "w", encoding="utf-8") as f:
    f.write(f"# Risultati per: {query}\n")
    f.write(f"_Periodo: {start_date} - {end_date}_\n\n")
    for link in links:
        f.write(f"- [{link}]({link})\n")

print(f"Risultati salvati in {output_file}")
</code></pre>


</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Python</category>
  <category>Bash</category>
  <guid>https://paolovolterra.com/posts/2517_googlesearch/20250209_GoogleSearch.html</guid>
  <pubDate>Fri, 07 Feb 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Fondi comunitari, nazionali, regionali, bancari, privati</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2518_FSC/FSC.html</link>
  <description><![CDATA[ 




<section id="fondi-comunitari-nazionali-regionali-bancari-privati" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Fondi comunitari, nazionali, regionali, bancari, privati</h1>
<div id="b0be2546" class="cell" data-execution_count="1">
<div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb1-3"></span>
<span id="cb1-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Definizione degli anni (2014-2036 con tolleranza N+2)</span></span>
<span id="cb1-5">anni <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2014</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2036</span>))</span>
<span id="cb1-6"></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Distribuzione dei fondi (importi fittizi in milioni di euro)</span></span>
<span id="cb1-8">anticipazioni_fsc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-9">fondi_fsc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">120</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">110</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-10">fondi_fesr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">110</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-11">fondi_pnrr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">120</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">130</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">140</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">120</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-12">rimborso_fsc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-13">fondi_privati <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">110</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-14">finanziamenti_brevi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-15">finanziamenti_lunghi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">110</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">40</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>]</span>
<span id="cb1-16"></span>
<span id="cb1-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Creazione del DataFrame</span></span>
<span id="cb1-18">cronoprogramma <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame({</span>
<span id="cb1-19">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>: anni,</span>
<span id="cb1-20">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>: anticipazioni_fsc,</span>
<span id="cb1-21">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>: fondi_fsc,</span>
<span id="cb1-22">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi FESR'</span>: fondi_fesr,</span>
<span id="cb1-23">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi PNRR'</span>: fondi_pnrr,</span>
<span id="cb1-24">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Rimborso Anticipazioni FSC'</span>: rimborso_fsc,</span>
<span id="cb1-25">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Privati'</span>: fondi_privati,</span>
<span id="cb1-26">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Finanziamenti Bancari Breve Termine'</span>: finanziamenti_brevi,</span>
<span id="cb1-27">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Finanziamenti Bancari Lungo Termine'</span>: finanziamenti_lunghi</span>
<span id="cb1-28">})</span>
<span id="cb1-29"></span>
<span id="cb1-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># **📌 Salva il cronoprogramma in un file CSV**</span></span>
<span id="cb1-31">cronoprogramma.to_csv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cronoprogramma_finanziamenti.csv"</span>, index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-32"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Tabella salvata come 'cronoprogramma_finanziamenti.csv'"</span>)</span>
<span id="cb1-33"></span>
<span id="cb1-34"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># **📌 Creazione del grafico a barre sovrapposte**</span></span>
<span id="cb1-35">plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>))</span>
<span id="cb1-36"></span>
<span id="cb1-37"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiunta delle barre per i vari fondi</span></span>
<span id="cb1-38">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>], label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'blue'</span>)</span>
<span id="cb1-39">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>], bottom<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>], label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'green'</span>)</span>
<span id="cb1-40">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi FESR'</span>], bottom<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>], label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi FESR'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'red'</span>)</span>
<span id="cb1-41">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi PNRR'</span>], bottom<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi FESR'</span>], label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi PNRR'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'purple'</span>)</span>
<span id="cb1-42">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Privati'</span>], bottom<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cronoprogramma[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi FESR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi PNRR'</span>]].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>), label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Privati'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'brown'</span>)</span>
<span id="cb1-43">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Finanziamenti Bancari Breve Termine'</span>], bottom<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cronoprogramma[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi FESR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi PNRR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Privati'</span>]].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>), label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Finanziamenti Bancari Breve Termine'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'cyan'</span>)</span>
<span id="cb1-44">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Finanziamenti Bancari Lungo Termine'</span>], bottom<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cronoprogramma[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anticipazioni FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Ordinari FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi FESR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi PNRR'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondi Privati'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Finanziamenti Bancari Breve Termine'</span>]].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>), label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Finanziamenti Bancari Lungo Termine'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'darkorange'</span>)</span>
<span id="cb1-45"></span>
<span id="cb1-46"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiunta dei rimborsi FSC come barre negative</span></span>
<span id="cb1-47">plt.bar(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Rimborso Anticipazioni FSC'</span>], label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Rimborso FSC'</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'orange'</span>)</span>
<span id="cb1-48"></span>
<span id="cb1-49"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># **📌 Aggiunta delle linee verticali per i cicli di programmazione con tolleranza (N+2)**</span></span>
<span id="cb1-50">cicli_ue <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2014</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2022</span>), (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2021</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2029</span>), (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2028</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2036</span>)]</span>
<span id="cb1-51"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> start, end <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> cicli_ue:</span>
<span id="cb1-52">    plt.axvline(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>start, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Inizio ciclo UE'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> start <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2014</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>)</span>
<span id="cb1-53">    plt.axvline(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>end, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fine ciclo UE + Tolleranza'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> end <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2022</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>)</span>
<span id="cb1-54"></span>
<span id="cb1-55"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiunta della scadenza del PNRR (2026, senza tolleranza)</span></span>
<span id="cb1-56">plt.axvline(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2026</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'grey'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'-.'</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Scadenza PNRR'</span>)</span>
<span id="cb1-57"></span>
<span id="cb1-58"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Impostazione degli assi e della legenda</span></span>
<span id="cb1-59">plt.xticks(cronoprogramma[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>], rotation<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">45</span>)</span>
<span id="cb1-60">plt.xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>)</span>
<span id="cb1-61">plt.ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Importo (€)'</span>)</span>
<span id="cb1-62">plt.title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Cronoprogramma con Fondi Pubblici, Privati e Finanziamenti Bancari'</span>)</span>
<span id="cb1-63">plt.legend()</span>
<span id="cb1-64">plt.grid(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'y'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>)</span>
<span id="cb1-65"></span>
<span id="cb1-66"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># **📌 Mostra il grafico**</span></span>
<span id="cb1-67">plt.show()</span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre><code>Tabella salvata come 'cronoprogramma_finanziamenti.csv'</code></pre>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2518_FSC/FSC_files/figure-html/cell-2-output-2.png" width="965" height="617" class="figure-img"></p>
</figure>
</div>
</div>
</div>
<div id="ab1da2b9" class="cell" data-execution_count="2">
<div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">cronoprogramma</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="2">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Anno</th>
<th data-quarto-table-cell-role="th">Anticipazioni FSC</th>
<th data-quarto-table-cell-role="th">Fondi Ordinari FSC</th>
<th data-quarto-table-cell-role="th">Fondi FESR</th>
<th data-quarto-table-cell-role="th">Fondi PNRR</th>
<th data-quarto-table-cell-role="th">Rimborso Anticipazioni FSC</th>
<th data-quarto-table-cell-role="th">Fondi Privati</th>
<th data-quarto-table-cell-role="th">Finanziamenti Bancari Breve Termine</th>
<th data-quarto-table-cell-role="th">Finanziamenti Bancari Lungo Termine</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>2014</td>
<td>50</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>2015</td>
<td>70</td>
<td>10</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>2016</td>
<td>80</td>
<td>30</td>
<td>10</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>20</td>
<td>20</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>2017</td>
<td>90</td>
<td>50</td>
<td>20</td>
<td>10</td>
<td>0</td>
<td>10</td>
<td>30</td>
<td>30</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>2018</td>
<td>60</td>
<td>70</td>
<td>30</td>
<td>20</td>
<td>0</td>
<td>20</td>
<td>40</td>
<td>40</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>2019</td>
<td>50</td>
<td>90</td>
<td>40</td>
<td>40</td>
<td>0</td>
<td>30</td>
<td>50</td>
<td>50</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>2020</td>
<td>30</td>
<td>100</td>
<td>60</td>
<td>60</td>
<td>-10</td>
<td>50</td>
<td>60</td>
<td>60</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>2021</td>
<td>0</td>
<td>120</td>
<td>80</td>
<td>90</td>
<td>-20</td>
<td>70</td>
<td>50</td>
<td>70</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>2022</td>
<td>0</td>
<td>110</td>
<td>100</td>
<td>120</td>
<td>-30</td>
<td>90</td>
<td>40</td>
<td>80</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>2023</td>
<td>0</td>
<td>100</td>
<td>110</td>
<td>130</td>
<td>-40</td>
<td>100</td>
<td>30</td>
<td>90</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">10</td>
<td>2024</td>
<td>0</td>
<td>90</td>
<td>100</td>
<td>140</td>
<td>-50</td>
<td>110</td>
<td>20</td>
<td>100</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">11</td>
<td>2025</td>
<td>0</td>
<td>70</td>
<td>90</td>
<td>120</td>
<td>-50</td>
<td>100</td>
<td>10</td>
<td>110</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">12</td>
<td>2026</td>
<td>0</td>
<td>50</td>
<td>70</td>
<td>100</td>
<td>-40</td>
<td>80</td>
<td>0</td>
<td>100</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">13</td>
<td>2027</td>
<td>0</td>
<td>30</td>
<td>50</td>
<td>80</td>
<td>-30</td>
<td>60</td>
<td>0</td>
<td>90</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">14</td>
<td>2028</td>
<td>0</td>
<td>20</td>
<td>40</td>
<td>60</td>
<td>-20</td>
<td>40</td>
<td>0</td>
<td>80</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">15</td>
<td>2029</td>
<td>0</td>
<td>10</td>
<td>20</td>
<td>40</td>
<td>-10</td>
<td>30</td>
<td>0</td>
<td>70</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">16</td>
<td>2030</td>
<td>0</td>
<td>0</td>
<td>10</td>
<td>20</td>
<td>0</td>
<td>20</td>
<td>0</td>
<td>60</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">17</td>
<td>2031</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>10</td>
<td>0</td>
<td>10</td>
<td>0</td>
<td>50</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">18</td>
<td>2032</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>40</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">19</td>
<td>2033</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>30</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">20</td>
<td>2034</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>20</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">21</td>
<td>2035</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<div id="28cfbb2a" class="cell" data-execution_count="3">
<div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">cronoprogramma.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Anno'</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>()</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="3">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Anticipazioni FSC</th>
<th data-quarto-table-cell-role="th">Fondi Ordinari FSC</th>
<th data-quarto-table-cell-role="th">Fondi FESR</th>
<th data-quarto-table-cell-role="th">Fondi PNRR</th>
<th data-quarto-table-cell-role="th">Rimborso Anticipazioni FSC</th>
<th data-quarto-table-cell-role="th">Fondi Privati</th>
<th data-quarto-table-cell-role="th">Finanziamenti Bancari Breve Termine</th>
<th data-quarto-table-cell-role="th">Finanziamenti Bancari Lungo Termine</th>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">Anno</th>
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th"></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">2014</td>
<td>50</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2015</td>
<td>70</td>
<td>10</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2016</td>
<td>80</td>
<td>30</td>
<td>10</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>20</td>
<td>20</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2017</td>
<td>90</td>
<td>50</td>
<td>20</td>
<td>10</td>
<td>0</td>
<td>10</td>
<td>30</td>
<td>30</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2018</td>
<td>60</td>
<td>70</td>
<td>30</td>
<td>20</td>
<td>0</td>
<td>20</td>
<td>40</td>
<td>40</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2019</td>
<td>50</td>
<td>90</td>
<td>40</td>
<td>40</td>
<td>0</td>
<td>30</td>
<td>50</td>
<td>50</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2020</td>
<td>30</td>
<td>100</td>
<td>60</td>
<td>60</td>
<td>-10</td>
<td>50</td>
<td>60</td>
<td>60</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2021</td>
<td>0</td>
<td>120</td>
<td>80</td>
<td>90</td>
<td>-20</td>
<td>70</td>
<td>50</td>
<td>70</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2022</td>
<td>0</td>
<td>110</td>
<td>100</td>
<td>120</td>
<td>-30</td>
<td>90</td>
<td>40</td>
<td>80</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2023</td>
<td>0</td>
<td>100</td>
<td>110</td>
<td>130</td>
<td>-40</td>
<td>100</td>
<td>30</td>
<td>90</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2024</td>
<td>0</td>
<td>90</td>
<td>100</td>
<td>140</td>
<td>-50</td>
<td>110</td>
<td>20</td>
<td>100</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2025</td>
<td>0</td>
<td>70</td>
<td>90</td>
<td>120</td>
<td>-50</td>
<td>100</td>
<td>10</td>
<td>110</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2026</td>
<td>0</td>
<td>50</td>
<td>70</td>
<td>100</td>
<td>-40</td>
<td>80</td>
<td>0</td>
<td>100</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2027</td>
<td>0</td>
<td>30</td>
<td>50</td>
<td>80</td>
<td>-30</td>
<td>60</td>
<td>0</td>
<td>90</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2028</td>
<td>0</td>
<td>20</td>
<td>40</td>
<td>60</td>
<td>-20</td>
<td>40</td>
<td>0</td>
<td>80</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2029</td>
<td>0</td>
<td>10</td>
<td>20</td>
<td>40</td>
<td>-10</td>
<td>30</td>
<td>0</td>
<td>70</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2030</td>
<td>0</td>
<td>0</td>
<td>10</td>
<td>20</td>
<td>0</td>
<td>20</td>
<td>0</td>
<td>60</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2031</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>10</td>
<td>0</td>
<td>10</td>
<td>0</td>
<td>50</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2032</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>40</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2033</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>30</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2034</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>20</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">2035</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<section id="lanticipazione-del-fondo-per-lo-sviluppo-e-la-coesione-fsc" class="level2" data-number="1.1">
<h2 data-number="1.1" class="anchored" data-anchor-id="lanticipazione-del-fondo-per-lo-sviluppo-e-la-coesione-fsc"><span class="header-section-number">1.1</span> l’anticipazione del Fondo per lo sviluppo e la Coesione (FSC)</h2>
<p>L’anticipazione del Fondo per lo Sviluppo e la Coesione (FSC) si riferisce all’assegnazione anticipata di risorse finanziarie, provenienti dalla programmazione FSC 2021-2027, a favore di amministrazioni centrali, regioni o province autonome. Queste anticipazioni sono destinate a finanziare interventi che possono essere avviati immediatamente o a completare progetti già in corso, garantendo così una rapida attuazione delle politiche di coesione economica, sociale e territoriale.</p>
<p>Ad esempio, la Delibera CIPESS n.&nbsp;79/2021 ha disposto un’assegnazione complessiva di circa 2,6 miliardi di euro a favore di regioni e province autonome, utilizzando in parte le risorse FSC 2014-2020 e in parte quelle della programmazione 2021-2027. Queste risorse sono state destinate a interventi immediatamente cantierabili o al completamento di progetti esistenti. PROGRAMMAZIONEECONOMICA.GOV.IT</p>
<p>Un ulteriore esempio è rappresentato dalla Delibera CIPESS n.&nbsp;1/2022, che ha assegnato, a titolo di anticipazione, circa 4,68 miliardi di euro al Ministero delle Infrastrutture e della Mobilità Sostenibili per il finanziamento di opere strategiche e interventi locali, con l’obiettivo di promuovere la mobilità sostenibile e migliorare le infrastrutture nel Paese. PROGRAMMAZIONEECONOMICA.GOV.IT</p>
<p>Queste anticipazioni consentono di accelerare l’implementazione di progetti strategici, contribuendo al riequilibrio economico e sociale tra le diverse aree del Paese, in linea con le finalità del FSC.</p>
</section>
<section id="perchè-si-usa-lanticipazione-invece-dei-fondi-previsti" class="level2" data-number="1.2">
<h2 data-number="1.2" class="anchored" data-anchor-id="perchè-si-usa-lanticipazione-invece-dei-fondi-previsti"><span class="header-section-number">1.2</span> perchè si usa l’anticipazione invece dei fondi previsti?</h2>
<p>L’uso dell’<strong>anticipazione</strong> del Fondo per lo Sviluppo e la Coesione (FSC) invece dei fondi già previsti dipende da diversi motivi tecnici, burocratici e strategici. Ecco le principali ragioni:</p>
<section id="accelerazione-della-spesa-pubblica-e-degli-investimenti" class="level3" data-number="1.2.1">
<h3 data-number="1.2.1" class="anchored" data-anchor-id="accelerazione-della-spesa-pubblica-e-degli-investimenti"><span class="header-section-number">1.2.1</span> 1. <strong>Accelerazione della Spesa Pubblica e degli Investimenti</strong></h3>
<ul>
<li>I fondi FSC sono soggetti a lunghi processi di programmazione e approvazione da parte delle autorità nazionali ed europee.</li>
<li>L’anticipazione consente di sbloccare immediatamente risorse finanziarie per progetti già avviati o cantierabili, evitando ritardi dovuti alla burocrazia.</li>
</ul>
</section>
<section id="superamento-dei-vincoli-della-programmazione-pluriennale" class="level3" data-number="1.2.2">
<h3 data-number="1.2.2" class="anchored" data-anchor-id="superamento-dei-vincoli-della-programmazione-pluriennale"><span class="header-section-number">1.2.2</span> 2. <strong>Superamento dei Vincoli della Programmazione Pluriennale</strong></h3>
<ul>
<li>Il FSC è assegnato su <strong>cicli pluriennali</strong> (es. 2014-2020, 2021-2027) e la ripartizione delle risorse avviene gradualmente.</li>
<li>L’anticipazione permette di usare una parte delle risorse future per progetti urgenti senza aspettare la completa definizione della programmazione.</li>
</ul>
</section>
<section id="miglioramento-del-tasso-di-attuazione-della-spesa" class="level3" data-number="1.2.3">
<h3 data-number="1.2.3" class="anchored" data-anchor-id="miglioramento-del-tasso-di-attuazione-della-spesa"><span class="header-section-number">1.2.3</span> 3. <strong>Miglioramento del Tasso di Attuazione della Spesa</strong></h3>
<ul>
<li>Spesso i fondi strutturali e di coesione registrano un basso tasso di utilizzo a causa della complessità delle procedure.</li>
<li>Attraverso l’anticipazione, si garantisce che le risorse vengano spese tempestivamente, riducendo il rischio di perdere finanziamenti a causa di ritardi.</li>
</ul>
</section>
<section id="supporto-a-progetti-in-corso-o-completamento-di-opere" class="level3" data-number="1.2.4">
<h3 data-number="1.2.4" class="anchored" data-anchor-id="supporto-a-progetti-in-corso-o-completamento-di-opere"><span class="header-section-number">1.2.4</span> 4. <strong>Supporto a Progetti in Corso o Completamento di Opere</strong></h3>
<ul>
<li>Alcuni progetti finanziati dal FSC rischiano di bloccarsi per mancanza di fondi immediati.</li>
<li>L’anticipazione consente di coprire temporaneamente i costi fino all’effettiva assegnazione delle risorse ordinarie.</li>
</ul>
</section>
<section id="allineamento-con-altri-fondi-pnrr-e-bilancio-nazionale" class="level3" data-number="1.2.5">
<h3 data-number="1.2.5" class="anchored" data-anchor-id="allineamento-con-altri-fondi-pnrr-e-bilancio-nazionale"><span class="header-section-number">1.2.5</span> 5. <strong>Allineamento con Altri Fondi (PNRR e Bilancio Nazionale)</strong></h3>
<ul>
<li>In alcuni casi, l’anticipazione viene utilizzata per integrare risorse del <strong>PNRR</strong> o del bilancio statale, garantendo coerenza tra le varie fonti di finanziamento.</li>
<li>Questo è fondamentale per evitare che progetti strategici subiscano stop a causa della frammentazione dei finanziamenti.</li>
</ul>
</section>
<section id="conclusione" class="level3" data-number="1.2.6">
<h3 data-number="1.2.6" class="anchored" data-anchor-id="conclusione"><span class="header-section-number">1.2.6</span> <strong>Conclusione</strong></h3>
<p>L’anticipazione del FSC è quindi uno <strong>strumento flessibile e strategico</strong> che permette di sbloccare risorse in tempi più rapidi rispetto ai meccanismi tradizionali. Questo consente di accelerare investimenti cruciali, evitare ritardi amministrativi e garantire il raggiungimento degli obiettivi di sviluppo territoriale, infrastrutturale ed economico.</p>
</section>
</section>
<section id="come-funziona-liter-di-gestione-di-fondi-e-anticipazioni-in-modo-che-nel-tempo-si-allineino" class="level2" data-number="1.3">
<h2 data-number="1.3" class="anchored" data-anchor-id="come-funziona-liter-di-gestione-di-fondi-e-anticipazioni-in-modo-che-nel-tempo-si-allineino"><span class="header-section-number">1.3</span> come funziona l’iter di gestione di fondi e anticipazioni in modo che nel tempo si allineino</h2>
<section id="iter-di-gestione-dei-fondi-fsc-e-delle-anticipazioni-meccanismo-di-allineamento-nel-tempo" class="level3" data-number="1.3.1">
<h3 data-number="1.3.1" class="anchored" data-anchor-id="iter-di-gestione-dei-fondi-fsc-e-delle-anticipazioni-meccanismo-di-allineamento-nel-tempo"><span class="header-section-number">1.3.1</span> <strong>Iter di gestione dei Fondi FSC e delle Anticipazioni: Meccanismo di Allineamento nel Tempo</strong></h3>
<p>Per garantire che i <strong>fondi ordinari del FSC</strong> e le <strong>anticipazioni</strong> si allineino nel tempo senza creare squilibri finanziari, il processo segue un iter articolato, che coinvolge diverse fasi di <strong>programmazione, attuazione e rendicontazione</strong>.</p>
<hr>
</section>
</section>
<section id="programmazione-e-pianificazione-dei-fondi-fsc" class="level2" data-number="1.4">
<h2 data-number="1.4" class="anchored" data-anchor-id="programmazione-e-pianificazione-dei-fondi-fsc"><span class="header-section-number">1.4</span> <strong>1️⃣ Programmazione e Pianificazione dei Fondi FSC</strong></h2>
<ol type="1">
<li><strong>Definizione della programmazione pluriennale</strong>
<ul>
<li>Il Governo italiano, insieme alle <strong>Regioni e Province Autonome</strong>, stabilisce le priorità di investimento per il ciclo FSC (es. 2021-2027).<br>
</li>
<li>La programmazione viene approvata dal <strong>Comitato Interministeriale per la Programmazione Economica e lo Sviluppo Sostenibile (CIPESS)</strong>.<br>
</li>
<li>Le risorse vengono suddivise tra macro-aree tematiche (infrastrutture, digitalizzazione, transizione verde, ecc.).</li>
</ul></li>
<li><strong>Ripartizione delle risorse e assegnazione ai progetti</strong>
<ul>
<li>Le amministrazioni centrali e regionali definiscono i progetti da finanziare.<br>
</li>
<li>Le risorse vengono <strong>assegnate progressivamente</strong> in base ai tempi di realizzazione e alla capacità di spesa dei soggetti attuatori.</li>
</ul></li>
</ol>
<hr>
</section>
<section id="richiesta-e-concessione-dellanticipazione" class="level2" data-number="1.5">
<h2 data-number="1.5" class="anchored" data-anchor-id="richiesta-e-concessione-dellanticipazione"><span class="header-section-number">1.5</span> <strong>2️⃣ Richiesta e Concessione dell’Anticipazione</strong></h2>
<ol start="3" type="1">
<li><strong>Richiesta di anticipazione</strong>
<ul>
<li>Se un progetto necessita di fondi immediati, la Regione o l’Ente interessato può richiedere un’<strong>anticipazione</strong> sui fondi FSC futuri.<br>
</li>
<li>La richiesta deve essere motivata e dimostrare la capacità di spesa immediata.</li>
</ul></li>
<li><strong>Approvazione da parte del CIPESS e Ministero dell’Economia e delle Finanze (MEF)</strong>
<ul>
<li>Il CIPESS approva la richiesta e assegna le risorse in <strong>via provvisoria</strong>.<br>
</li>
<li>Il MEF verifica la disponibilità di fondi nel bilancio dello Stato e autorizza l’erogazione.</li>
</ul></li>
<li><strong>Erogazione dell’anticipazione</strong>
<ul>
<li>L’anticipazione viene versata all’ente beneficiario, che può utilizzarla per avviare il progetto.</li>
</ul></li>
</ol>
<hr>
</section>
<section id="gestione-e-monitoraggio-dellallineamento" class="level2" data-number="1.6">
<h2 data-number="1.6" class="anchored" data-anchor-id="gestione-e-monitoraggio-dellallineamento"><span class="header-section-number">1.6</span> <strong>3️⃣ Gestione e Monitoraggio dell’Allineamento</strong></h2>
<ol start="6" type="1">
<li><strong>Monitoraggio della spesa e rendicontazione</strong>
<ul>
<li>Gli enti devono dimostrare di aver speso i fondi anticipati per gli scopi dichiarati.<br>
</li>
<li>Il <strong>Sistema Nazionale di Monitoraggio</strong> traccia lo stato di avanzamento dei progetti.</li>
</ul></li>
<li><strong>Allineamento con i fondi ordinari FSC</strong>
<ul>
<li>Quando le risorse FSC previste per quel ciclo diventano disponibili, si procede a un <strong>conguaglio finanziario</strong>.<br>
</li>
<li>L’anticipazione viene <strong>scalata dalle risorse ordinarie</strong>, evitando sovrapposizioni di finanziamento.</li>
</ul></li>
<li><strong>Rendicontazione finale e chiusura finanziaria</strong>
<ul>
<li>L’ente beneficiario presenta un bilancio finale.<br>
</li>
<li>Se l’anticipazione è stata spesa correttamente, il progetto viene ufficialmente chiuso.<br>
</li>
<li>Se vi sono risorse non utilizzate, possono essere riallocate.</li>
</ul></li>
</ol>
<hr>
</section>
<section id="meccanismi-di-equilibrio-per-evitare-disallineamenti" class="level2" data-number="1.7">
<h2 data-number="1.7" class="anchored" data-anchor-id="meccanismi-di-equilibrio-per-evitare-disallineamenti"><span class="header-section-number">1.7</span> <strong>🔄 Meccanismi di Equilibrio per Evitare Disallineamenti</strong></h2>
<ul>
<li><strong>Vincoli di destinazione</strong> → Le anticipazioni devono essere utilizzate solo per spese strettamente collegate ai progetti FSC.<br>
</li>
<li><strong>Controlli periodici</strong> → Il MEF e il Dipartimento per la Coesione effettuano verifiche per garantire l’equilibrio tra anticipazioni e fondi ordinari.<br>
</li>
<li><strong>Clausole di compensazione</strong> → Se una Regione riceve un’anticipazione ma poi non utilizza i fondi, può subire <strong>riduzioni nelle assegnazioni future</strong>.<br>
</li>
<li><strong>Flessibilità</strong> → Se le risorse ordinarie FSC subiscono ritardi, è possibile prevedere ulteriori anticipazioni per evitare blocchi.</li>
</ul>
<hr>
<section id="conclusione-1" class="level3" data-number="1.7.1">
<h3 data-number="1.7.1" class="anchored" data-anchor-id="conclusione-1"><span class="header-section-number">1.7.1</span> <strong>📌 Conclusione</strong></h3>
<p>Il sistema di gestione delle anticipazioni FSC è strutturato per garantire che nel tempo non si creino squilibri finanziari. Il monitoraggio continuo e i meccanismi di compensazione permettono di evitare il rischio di <strong>spese non coperte</strong> o di <strong>progetti bloccati</strong>.</p>
<p>👉 <strong>Vuoi approfondire un caso specifico di allineamento o un settore particolare di spesa (es. infrastrutture, digitale, PNRR)?</strong></p>
<p><img src="https://paolovolterra.com/posts/2518_FSC/media/467a54ab-6d5f-443c-b40e-156fba14661f.png" class="img-fluid"></p>
<p>Il grafico mostra l’evoluzione nel tempo delle anticipazioni FSC (linea blu) e dei fondi ordinari FSC (linea verde) dal 2024 al 2030.</p>
<p>Interpretazione del grafico: Anticipazioni iniziali elevate (2024-2026) → Nei primi anni, i fondi ordinari non sono ancora disponibili, quindi si fa ricorso alle anticipazioni per avviare i progetti. Graduale riduzione delle anticipazioni (2027-2029) → Man mano che i fondi ordinari FSC vengono erogati, si riduce la necessità di anticipazioni. Pieno allineamento (2030) → Alla fine del ciclo di programmazione, i fondi ordinari coprono completamente il fabbisogno, azzerando la necessità di anticipazioni. Questo modello consente di mantenere un flusso continuo di finanziamenti, evitando blocchi nei progetti e garantendo un uso efficiente delle risorse nel tempo.</p>
</section>
</section>
<section id="perchè-hai-usato-un-tempo-così-lungo" class="level2" data-number="1.8">
<h2 data-number="1.8" class="anchored" data-anchor-id="perchè-hai-usato-un-tempo-così-lungo"><span class="header-section-number">1.8</span> perchè hai usato un tempo così lungo?</h2>
<p>Ho utilizzato un periodo <strong>lungo (2024-2030)</strong> perché il <strong>Fondo per lo Sviluppo e la Coesione (FSC)</strong> è strutturato su <strong>cicli pluriennali di programmazione</strong> (tipicamente <strong>7 anni</strong>, es. 2014-2020, 2021-2027). Le anticipazioni servono a coprire i primi anni, in attesa della piena operatività dei fondi ordinari.</p>
<section id="perché-un-orizzonte-di-6-7-anni-è-realistico" class="level3" data-number="1.8.1">
<h3 data-number="1.8.1" class="anchored" data-anchor-id="perché-un-orizzonte-di-6-7-anni-è-realistico"><span class="header-section-number">1.8.1</span> <strong>Perché un orizzonte di 6-7 anni è realistico?</strong></h3>
<ol type="1">
<li><strong>Programmazione FSC e tempi di assegnazione</strong>
<ul>
<li>I fondi vengono programmati con una visione di <strong>medio-lungo periodo</strong>.</li>
<li>L’assegnazione effettiva spesso avviene <strong>con ritardi di 2-3 anni</strong> rispetto all’inizio del ciclo.</li>
</ul></li>
<li><strong>Ritardi nella spesa e nel finanziamento</strong>
<ul>
<li>Le risorse FSC vengono spese gradualmente nel tempo (es. il FSC 2014-2020 si è chiuso solo nel 2023).<br>
</li>
<li>Le anticipazioni vengono richieste nei primi anni per garantire <strong>liquidità immediata</strong>.</li>
</ul></li>
<li><strong>Allineamento progressivo</strong>
<ul>
<li>Nei primi anni: <strong>più anticipazioni, meno fondi ordinari</strong>.<br>
</li>
<li>Dopo 3-4 anni: <strong>inizia l’erogazione dei fondi FSC ordinari</strong>.<br>
</li>
<li>Verso la fine del ciclo: <strong>le anticipazioni si azzerano e restano solo i fondi ordinari</strong>.</li>
</ul></li>
</ol>
<hr>
</section>
<section id="vuoi-che-faccia-una-simulazione-su-un-periodo-più-breve" class="level3" data-number="1.8.2">
<h3 data-number="1.8.2" class="anchored" data-anchor-id="vuoi-che-faccia-una-simulazione-su-un-periodo-più-breve"><span class="header-section-number">1.8.2</span> <strong>Vuoi che faccia una simulazione su un periodo più breve?</strong></h3>
<p>Posso modificare il grafico considerando un <strong>ciclo di 3-4 anni</strong> per mostrarti un’anticipazione di breve periodo! 🚀</p>
<p><img src="https://paolovolterra.com/posts/2518_FSC/media/output.png" class="img-fluid"></p>
<p>Il grafico mostra l’andamento dei finanziamenti per un progetto di lungo periodo (2024-2038) che attraversa più cicli di programmazione FSC e FESR.</p>
<p>Interpretazione del grafico: Fase iniziale (2024-2026) → Uso delle anticipazioni FSC (blu)</p>
<p>Nei primi anni, i fondi ordinari non sono ancora disponibili, quindi vengono utilizzate anticipazioni FSC per avviare il progetto. Fase di finanziamento principale (2027-2032) → Fondi ordinari FSC (verde) e FESR (rosso)</p>
<p>Dopo l’azzeramento delle anticipazioni, entrano in gioco i fondi ordinari FSC, che coprono la maggior parte della spesa. I fondi FESR si attivano in parallelo per cofinanziare il progetto. Fase di chiusura (2033-2038) → Riduzione graduale dei finanziamenti</p>
<p>I fondi FSC e FESR iniziano a calare, segnalando l’approssimarsi della conclusione del progetto. Verso il 2038, i finanziamenti si azzerano progressivamente. 📌 Cosa evidenzia questo esempio? L’uso strategico delle anticipazioni per avviare il progetto senza aspettare i fondi ordinari. L’alternanza tra FSC e FESR per garantire un finanziamento continuo. Un ciclo multi-programmazione, con il progetto che supera un singolo ciclo FSC (2021-2027) e continua nei successivi.</p>
<p><img src="https://paolovolterra.com/posts/2518_FSC/media/output3.png" class="img-fluid"></p>
<p>Ecco il grafico che rappresenta il finanziamento di un Contratto di Sviluppo dal 2014 al 2038, sfruttando FSC e FESR su più cicli di programmazione.</p>
<p>🔍 Analisi del grafico: Fase di avvio (2014-2020):</p>
<p>Il progetto parte con anticipazioni FSC (blu) perché i fondi ordinari non sono ancora erogabili. Gradualmente, dal 2017, iniziano ad arrivare i primi fondi FSC ordinari (verde). Il FESR (rosso) inizia a cofinanziare il progetto dal 2016, con un contributo crescente. Fase di pieno finanziamento (2021-2030):</p>
<p>Con la chiusura del ciclo 2014-2020, le anticipazioni FSC si azzerano. I fondi ordinari FSC e FESR coprono il progetto, con il picco tra il 2025 e il 2028. Il finanziamento FESR rimane elevato fino al 2030, quando inizia a calare. Fase di chiusura (2031-2038):</p>
<p>I fondi FSC si riducono gradualmente, finanziando solo gli ultimi interventi. Il FESR continua a supportare la chiusura del progetto, ma con importi decrescenti. Dal 2038, il finanziamento termina completamente. 📌 Conclusioni: ✔️ Gestione equilibrata del finanziamento → Si evitano interruzioni nei lavori. ✔️ Utilizzo strategico delle anticipazioni FSC → Per avviare il progetto prima dell’arrivo dei fondi ordinari. ✔️ Integrazione tra FSC e FESR → I due fondi lavorano in sinergia per garantire un finanziamento costante.</p>
<p>I Fondi Anticipati dal FSC Saranno Rimborsati dagli Altri Fondi? La risposta dipende da come viene strutturato il finanziamento del progetto e da quali meccanismi di compensazione sono previsti tra FSC, FESR e altre fonti di finanziamento pubblico. Vediamo i possibili scenari:</p>
<p>📌 1. Rimborso Diretto delle Anticipazioni FSC da Parte di Altri Fondi In alcuni casi, le anticipazioni FSC possono essere compensate con l’arrivo successivo di fondi europei (FESR) o nazionali (PNRR, bilancio statale, risorse regionali). Questo meccanismo è previsto quando i fondi FSC vengono anticipati per coprire ritardi burocratici di altri finanziamenti già assegnati ma non ancora erogabili. Esempio: Un progetto di infrastruttura riceve anticipazioni FSC nei primi anni. Dopo il 2025, con l’arrivo dei fondi FESR e PNRR, parte di queste anticipazioni viene scalata o rimborsata. 📌 2. Nessun Rimborso, ma Solo Sostituzione Progressiva Spesso, il FSC anticipa fondi che non vengono rimborsati, ma vengono progressivamente sostituiti dai fondi ordinari del FSC stesso o dal FESR. In questo caso, la spesa iniziale viene coperta con anticipazioni FSC, ma quando arrivano i fondi definitivi, questi prendono il posto delle anticipazioni, senza un vero e proprio rimborso. Esempio: Il FSC finanzia un progetto con 200 milioni di anticipazioni nel 2024-2026. Nel 2027-2028 arrivano i fondi FSC ordinari e coprono il costo del progetto senza bisogno di rimborsi. 📌 3. Cofinanziamento senza Rimborso Se un progetto viene finanziato con FSC + FESR, le anticipazioni FSC non vengono rimborsate, ma il progetto continua ad essere finanziato con una combinazione di fondi. Qui, il FESR entra in gioco per coprire parte della spesa, senza restituire le anticipazioni FSC, ma riducendo la necessità di ulteriori fondi FSC nei cicli successivi. Esempio: Nel 2024-2026, il FSC anticipa 150 milioni. Dal 2027 in poi, il FESR copre progressivamente una quota maggiore, ma senza rimborsare direttamente le anticipazioni FSC. 📌 4. Rimborso Parziale in Caso di Sostituzione con Fondi PNRR o Bilancio Nazionale In alcuni casi, i fondi anticipati dal FSC possono essere rimborsati da risorse del PNRR o da fondi nazionali se il progetto viene riclassificato. Esempio: Un progetto avviato con FSC viene successivamente trasferito sotto il PNRR. Il MEF può decidere di rimborsare una parte delle anticipazioni FSC con risorse PNRR. 🔍 Conclusione: Il Rimborso Dipende dal Tipo di Progetto e dalla Fonte di Finanziamento ✔️ Se i fondi FSC coprono ritardi di FESR/PNRR: potrebbero essere rimborsati. ✔️ Se il FSC finanzia direttamente il progetto: le anticipazioni vengono solo sostituite dai fondi ordinari. ✔️ Se il progetto ha cofinanziamenti (FSC + FESR): il rimborso non avviene, ma si riduce la necessità di ulteriori fondi FSC.</p>
</section>
</section>
<section id="perchè-il-fsc-non-è-stato-rimborsato-totalmente" class="level2" data-number="1.9">
<h2 data-number="1.9" class="anchored" data-anchor-id="perchè-il-fsc-non-è-stato-rimborsato-totalmente"><span class="header-section-number">1.9</span> perchè il fsc non è stato rimborsato totalmente?</h2>
<p>Il <strong>FSC non è stato rimborsato totalmente</strong> per diversi motivi strutturali e strategici legati alla gestione dei fondi pubblici. Ecco le principali spiegazioni:</p>
<hr>
<section id="non-tutte-le-anticipazioni-sono-destinate-al-rimborso" class="level3" data-number="1.9.1">
<h3 data-number="1.9.1" class="anchored" data-anchor-id="non-tutte-le-anticipazioni-sono-destinate-al-rimborso"><span class="header-section-number">1.9.1</span> <strong>📌 1. Non Tutte le Anticipazioni Sono Destinate al Rimborso</strong></h3>
<ul>
<li>Le anticipazioni FSC <strong>non sempre sono considerate prestiti</strong>, ma piuttosto un modo per <strong>anticipare risorse che in parte rimarranno a carico del FSC stesso</strong>.<br>
</li>
<li><strong>Scenario tipico:</strong>
<ul>
<li>Se un progetto è finanziato con <strong>FSC + FESR + PNRR</strong>, alcuni fondi FSC vengono <strong>effettivamente rimborsati</strong>, ma <strong>altri rimangono come quota definitiva</strong>.</li>
</ul></li>
</ul>
<hr>
</section>
<section id="i-rimborsi-dipendono-dalla-struttura-del-cofinanziamento" class="level3" data-number="1.9.2">
<h3 data-number="1.9.2" class="anchored" data-anchor-id="i-rimborsi-dipendono-dalla-struttura-del-cofinanziamento"><span class="header-section-number">1.9.2</span> <strong>📌 2. I Rimborsi Dipendono Dalla Struttura del Cofinanziamento</strong></h3>
<ul>
<li>Il <strong>FSC</strong> può finanziare un progetto insieme a <strong>FESR e PNRR</strong>, ma <strong>non necessariamente nella stessa proporzione nel tempo</strong>.</li>
<li>Se il FESR o il PNRR <strong>coprono nuove fasi del progetto</strong>, questo <strong>non significa che le anticipazioni FSC vengano interamente restituite</strong>.</li>
<li><strong>Esempio pratico:</strong>
<ul>
<li>Se nel 2024-2026 il FSC ha anticipato 780 milioni, ma solo <strong>450 milioni vengono rimborsati</strong>, significa che <strong>330 milioni rimangono stabilmente finanziati dal FSC</strong>.</li>
</ul></li>
</ul>
<hr>
</section>
<section id="alcune-anticipazioni-sono-trasformate-in-contributi-a-fondo-perduto" class="level3" data-number="1.9.3">
<h3 data-number="1.9.3" class="anchored" data-anchor-id="alcune-anticipazioni-sono-trasformate-in-contributi-a-fondo-perduto"><span class="header-section-number">1.9.3</span> <strong>📌 3. Alcune Anticipazioni Sono Trasformate in Contributi a Fondo Perduto</strong></h3>
<ul>
<li>In alcuni casi, i fondi anticipati dal FSC <strong>non vengono rimborsati direttamente</strong>, ma vengono <strong>trasformati in una componente a fondo perduto</strong>, soprattutto se il progetto è considerato di <strong>rilevanza strategica nazionale</strong>.</li>
<li><strong>Settori tipici:</strong>
<ul>
<li>Grandi infrastrutture<br>
</li>
<li>Progetti di sviluppo industriale<br>
</li>
<li>Investimenti in transizione ecologica</li>
</ul></li>
</ul>
<hr>
</section>
<section id="il-pnrr-e-il-fesr-sono-vincolati-a-specifiche-spese" class="level3" data-number="1.9.4">
<h3 data-number="1.9.4" class="anchored" data-anchor-id="il-pnrr-e-il-fesr-sono-vincolati-a-specifiche-spese"><span class="header-section-number">1.9.4</span> <strong>📌 4. Il PNRR e il FESR Sono Vincolati a Specifiche Spese</strong></h3>
<ul>
<li>Il <strong>PNRR e il FESR</strong> devono finanziare <strong>spese specifiche</strong> e <strong>non sempre</strong> possono coprire retroattivamente i costi anticipati dal FSC.</li>
<li>Questo significa che <strong>una parte delle anticipazioni FSC rimane in carico al fondo stesso</strong>, senza essere rimborsata.</li>
</ul>
<hr>
</section>
<section id="conclusione-il-rimborso-parziale-è-una-scelta-strategica" class="level3" data-number="1.9.5">
<h3 data-number="1.9.5" class="anchored" data-anchor-id="conclusione-il-rimborso-parziale-è-una-scelta-strategica"><span class="header-section-number">1.9.5</span> <strong>🔍 Conclusione: Il Rimborso Parziale è una Scelta Strategica</strong></h3>
<p>✔️ <strong>Parte delle anticipazioni FSC viene restituita</strong>, ma un’altra parte rimane nel progetto come finanziamento definitivo.<br>
✔️ <strong>Il PNRR e il FESR sostituiscono il FSC, ma non necessariamente rimborsano tutto il pregresso.</strong><br>
✔️ <strong>Alcuni fondi FSC vengono trasformati in finanziamenti a fondo perduto.</strong></p>
<p>👉 <strong>Vuoi simulare un caso con il rimborso totale delle anticipazioni FSC?</strong> 🚀</p>
</section>
</section>
<section id="usa-lesempio-che-parte-dal-2014-e-costa-complessivamente-1000-euro.-dammi-grafico-e-tabella-con-valori-negativi-per-i-rimborsi-delle-anticipazioni" class="level2" data-number="1.10">
<h2 data-number="1.10" class="anchored" data-anchor-id="usa-lesempio-che-parte-dal-2014-e-costa-complessivamente-1000-euro.-dammi-grafico-e-tabella-con-valori-negativi-per-i-rimborsi-delle-anticipazioni"><span class="header-section-number">1.10</span> usa l’esempio che parte dal 2014 e costa complessivamente 1000 euro. dammi grafico e tabella con valori negativi per i rimborsi delle anticipazioni</h2>
<p>Cronoprogramma Con Costo Totale 1000€</p>
<p>Cronoprogramma Con Finanziamenti, Rimborsi E Cicli Di Programmazione</p>
<p>Ho generato il cronoprogramma con un costo totale di 1000€, includendo: ✔️ Tabella con i valori dettagliati (anticipazioni FSC, fondi FSC ordinari, FESR, PNRR e rimborsi). ✔️ Grafico a barre sovrapposte con linee verticali per i cicli settennali dell’UE (2021, 2028) e la scadenza del PNRR (2026).</p>
<p>Ora puoi vedere chiaramente quando e come i fondi vengono erogati e rimborsati. Fammi sapere se vuoi modifiche o altre visualizzazioni! 🚀 ​​</p>
<p>Hai detto: asse ascisse con numeri interi linee verticali coincidenti con le date min max dei cicli ChatGPT ha detto: Cronoprogramma Con Finanziamenti, Rimborsi E Cicli Di Programmazione</p>
<p>Ecco il grafico aggiornato, con: ✔️ Asse delle ascisse con numeri interi, migliorando la leggibilità. ✔️ Linee verticali corrispondenti esattamente all’inizio e alla fine dei cicli UE (2014-2020, 2021-2027, 2028-2034). ✔️ Linea per la scadenza del PNRR (2026).</p>
<p>Ora il grafico rappresenta con precisione i cicli di finanziamento e come si sovrappongono nel tempo. Se vuoi altre migliorie o personalizzazioni, fammelo sapere! 🚀 ​​</p>
<p>Hai detto: i cicli hanno un periodo di tolleranza (5+2?) il costo del progetto è noto dall’inizio e si può programmare quanto assorbirà nel tempo? ChatGPT ha detto: 📌 I Cicli di Programmazione e la Tolleranza Temporale (5+2) I cicli settennali dei fondi europei (come il FESR) seguono una logica di “N+2” (prima era “N+3”), il che significa che:</p>
<p>I fondi stanziati in un ciclo (es. 2014-2020) possono essere spesi fino a due anni dopo la fine del ciclo, cioè fino al 2022. Il ciclo 2021-2027 avrà risorse utilizzabili fino al 2029. Il ciclo 2028-2034 potrebbe estendersi fino al 2036, se manterrà la stessa regola. Questo periodo di tolleranza consente flessibilità nella spesa, riducendo il rischio di perdere fondi a causa di ritardi amministrativi.</p>
<p>📌 Il Costo del Progetto è Noto dall’Inizio? Sì, in teoria il costo complessivo del progetto è noto dall’inizio, ma con alcune considerazioni:</p>
<p>La pianificazione iniziale stabilisce un budget globale (es. 1000 milioni di € nel nostro esempio). L’assorbimento delle risorse varia nel tempo, dipendendo da: Disponibilità dei fondi (FSC, FESR, PNRR) Avanzamento del progetto (studi, appalti, realizzazione) Eventuali imprevisti (ritardi burocratici, costi aggiuntivi, nuove fonti di finanziamento) Gli enti programmano l’assorbimento nel tempo, ma con possibilità di variazione. 📌 È Possibile Pianificare Quanto un Progetto Assorbirà Ogni Anno? ✔️ Sì, in larga misura. L’assorbimento dei fondi può essere programmato in base a:</p>
<p>Il fabbisogno del progetto (spese di progettazione, cantierizzazione, realizzazione) Le disponibilità finanziarie (arrivo dei fondi UE e nazionali) Il periodo di spesa autorizzato (sfruttando il meccanismo “5+2”) 📌 Quindi, un progetto può essere strutturato per assorbire fondi FSC all’inizio e poi utilizzare FESR e PNRR nei cicli successivi, sfruttando la tolleranza “N+2”.</p>
<p>📌 Vuoi che modifichi il cronoprogramma per tener conto della tolleranza nei cicli? Posso adattare il grafico per mostrare che i fondi di un ciclo vengono assorbiti anche nei due anni successivi, rendendo più realistica la distribuzione nel tempo. 🚀</p>
<p>Hai detto: si ChatGPT ha detto: Cronoprogramma Con Periodo Di Tolleranza (N+2)</p>
<p>Cronoprogramma Con Periodo Di Tolleranza (N+2) Per I Cicli Di Programmazione</p>
<p>Ho aggiornato il cronoprogramma e il grafico a barre sovrapposte per includere la tolleranza N+2 nei cicli di programmazione UE. Ora puoi vedere chiaramente che:</p>
<p>✔️ I cicli settennali UE (2014-2020, 2021-2027, 2028-2034) si estendono di due anni (N+2), fino a 2022, 2029 e 2036. ✔️ I fondi FESR vengono assorbiti anche dopo la fine del ciclo principale, sfruttando la tolleranza. ✔️ Il PNRR ha una scadenza rigida (2026), senza tolleranza. ✔️ Il rimborso delle anticipazioni FSC è distribuito negli anni successivi.</p>
<p>Ora il grafico rappresenta in modo più realistico come un progetto può pianificare l’assorbimento dei fondi nel tempo. Fammi sapere se vuoi altre modifiche o approfondimenti! 🚀 ​​</p>
<p>Hai detto: nel grafico inserisci i fondi privati e i fondi anticipati a breve o a lungo termine dalle banche ChatGPT ha detto: Cronoprogramma Con Fondi Privati E Finanziamenti Bancari</p>
<p>Cronoprogramma Con Fondi Privati E Finanziamenti Bancari (Breve E Lungo Termine)</p>
<p>Ho aggiornato il cronoprogramma e il grafico includendo: ✔️ Fondi Privati (brown) → Capitale privato investito nel progetto. ✔️ Finanziamenti Bancari a Breve Termine (cyan) → Prestiti con durata breve per anticipare spese. ✔️ Finanziamenti Bancari a Lungo Termine (dark orange) → Prestiti con durata pluriennale.</p>
<p>Ora il grafico mostra tutte le fonti di finanziamento, inclusi i contributi pubblici, i finanziamenti privati e bancari, evidenziando anche le restituzioni delle anticipazioni FSC.</p>
<p>Se vuoi altre personalizzazioni o un’analisi più dettagliata, fammelo sapere! 🚀 ​​</p>
<p>Hai detto: dammi lo script python per realizzare il grafico e la tabella ChatGPT ha detto: Ecco lo script Python per generare il cronoprogramma con fondi pubblici, privati e bancari, includendo il grafico a barre sovrapposte e la tabella dei dati.</p>
</section>
<section id="se-a-livello-di-progetto-liter-è-complesso-a-livello-regionale-nazionale-comunitario-è-ancora-più-complesso-in-quanto-le-risorse-devono-concigliarsi-con-le-misure-missioni-e-obiettivi" class="level2" data-number="1.11">
<h2 data-number="1.11" class="anchored" data-anchor-id="se-a-livello-di-progetto-liter-è-complesso-a-livello-regionale-nazionale-comunitario-è-ancora-più-complesso-in-quanto-le-risorse-devono-concigliarsi-con-le-misure-missioni-e-obiettivi"><span class="header-section-number">1.11</span> se a livello di progetto l’iter è complesso, a livello regionale nazionale comunitario è ancora più complesso in quanto le risorse devono concigliarsi con le misure missioni e obiettivi</h2>
<section id="la-complessità-delliter-a-livello-regionale-nazionale-e-comunitario" class="level3" data-number="1.11.1">
<h3 data-number="1.11.1" class="anchored" data-anchor-id="la-complessità-delliter-a-livello-regionale-nazionale-e-comunitario"><span class="header-section-number">1.11.1</span> <strong>📌 La Complessità dell’Iter a Livello Regionale, Nazionale e Comunitario</strong></h3>
<p>Se <strong>a livello di singolo progetto</strong> l’iter di gestione dei fondi è complesso (anticipazioni, rimborsi, cofinanziamenti), <strong>a livello di programmazione regionale, nazionale e comunitaria</strong> la complessità <strong>aumenta esponenzialmente</strong>.<br>
Questo perché le risorse devono essere <strong>armonizzate con misure, missioni e obiettivi strategici</strong>, sia nel breve che nel lungo periodo.</p>
<hr>
</section>
</section>
<section id="complessità-della-programmazione-pluriennale" class="level2" data-number="1.12">
<h2 data-number="1.12" class="anchored" data-anchor-id="complessità-della-programmazione-pluriennale"><span class="header-section-number">1.12</span> <strong>📌 1. Complessità della Programmazione Pluriennale</strong></h2>
<p>A livello <strong>comunitario, nazionale e regionale</strong>, le risorse devono essere <strong>pianificate e distribuite</strong> nel tempo, rispettando: ✔️ <strong>Cicli di programmazione UE (7+2 anni)</strong> per i fondi strutturali (FESR, FSE+).<br>
✔️ <strong>Vincoli e scadenze rigide</strong> per strumenti come il <strong>PNRR</strong> (2026).<br>
✔️ <strong>Fondi FSC senza ciclo predefinito</strong>, ma che devono coordinarsi con altri strumenti.<br>
✔️ <strong>Bilanci nazionali e regionali</strong>, che prevedono spese annuali.</p>
<p>Tutte queste fonti devono essere <strong>coerenti tra loro</strong> per evitare sovrapposizioni o fondi non spesi.</p>
<hr>
</section>
<section id="necessità-di-conciliarsi-con-misure-missioni-e-obiettivi" class="level2" data-number="1.13">
<h2 data-number="1.13" class="anchored" data-anchor-id="necessità-di-conciliarsi-con-misure-missioni-e-obiettivi"><span class="header-section-number">1.13</span> <strong>📌 2. Necessità di Conciliarsi con Misure, Missioni e Obiettivi</strong></h2>
<p>La spesa pubblica non può essere casuale: deve <strong>rispondere a strategie definite</strong> a livello UE, nazionale e regionale.</p>
<section id="a.-struttura-della-programmazione-ue-stato-regioni" class="level3" data-number="1.13.1">
<h3 data-number="1.13.1" class="anchored" data-anchor-id="a.-struttura-della-programmazione-ue-stato-regioni"><span class="header-section-number">1.13.1</span> <strong>A. Struttura della Programmazione (UE, Stato, Regioni)</strong></h3>
<p>🔹 <strong>A livello comunitario</strong> → I fondi UE sono assegnati a <strong>priorità strategiche</strong> (es. digitalizzazione, transizione ecologica, inclusione sociale).<br>
🔹 <strong>A livello nazionale</strong> → I fondi vengono <strong>ripartiti in Programmi Operativi</strong> e Piani Nazionali (PNRR, FSC).<br>
🔹 <strong>A livello regionale</strong> → I fondi si traducono in <strong>Programmi Operativi Regionali (POR)</strong> e progetti concreti.</p>
<p>⚠️ <strong>Sfida</strong>: A ogni livello, i piani devono essere coerenti con quelli superiori per evitare il disallineamento dei finanziamenti.</p>
<hr>
</section>
<section id="b.-collegamento-tra-missioni-misure-e-obiettivi" class="level3" data-number="1.13.2">
<h3 data-number="1.13.2" class="anchored" data-anchor-id="b.-collegamento-tra-missioni-misure-e-obiettivi"><span class="header-section-number">1.13.2</span> <strong>B. Collegamento tra Missioni, Misure e Obiettivi</strong></h3>
<p>Ogni <strong>fondo e programma</strong> deve essere collegato a <strong>specifici obiettivi</strong>. Ad esempio:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 20%">
<col style="width: 40%">
<col style="width: 40%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Livello</strong></th>
<th><strong>Strumento di Pianificazione</strong></th>
<th><strong>Esempio di Obiettivo</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>UE</strong></td>
<td>Politiche di Coesione 2021-2027</td>
<td>Aumentare la digitalizzazione</td>
</tr>
<tr class="even">
<td><strong>Italia</strong></td>
<td>PNRR, FSC, Bilancio Nazionale</td>
<td>Potenziare le reti ferroviarie</td>
</tr>
<tr class="odd">
<td><strong>Regione</strong></td>
<td>Programmi Operativi Regionali</td>
<td>Creare poli di innovazione</td>
</tr>
<tr class="even">
<td><strong>Progetto</strong></td>
<td>Contratti di Sviluppo, Investimenti locali</td>
<td>Costruire un hub tecnologico</td>
</tr>
</tbody>
</table>
<p>💡 <strong>Ogni fondo deve rispettare la missione a cui è destinato</strong>:<br>
- Se un progetto è finanziato dal <strong>PNRR</strong>, deve <strong>contribuire agli obiettivi del PNRR</strong>.<br>
- Se usa fondi FESR, deve <strong>rispettare i target UE 2021-2027</strong>.</p>
<p>⚠️ <strong>Sfida</strong>: Evitare che risorse siano allocate a progetti fuori strategia o che le misure si sovrappongano.</p>
<hr>
</section>
</section>
<section id="coordinamento-tra-le-diverse-fonti-di-finanziamento" class="level2" data-number="1.14">
<h2 data-number="1.14" class="anchored" data-anchor-id="coordinamento-tra-le-diverse-fonti-di-finanziamento"><span class="header-section-number">1.14</span> <strong>📌 3. Coordinamento tra le Diverse Fonti di Finanziamento</strong></h2>
<p>Uno dei problemi più critici è la <strong>sovrapposizione e il coordinamento</strong> tra le diverse fonti:</p>
<p>✔️ <strong>Evitare il doppio finanziamento</strong> → Un progetto non può ricevere <strong>sia PNRR che FSC per le stesse spese</strong>.<br>
✔️ <strong>Garantire continuità</strong> → Se il PNRR si chiude nel 2026, bisogna <strong>prevedere un passaggio ai fondi strutturali UE</strong>.<br>
✔️ <strong>Monitorare la spesa in tempo reale</strong> → Serve <strong>un sistema centralizzato</strong> per tenere traccia di quanto è stato speso e quanto rimane.</p>
<p>⚠️ <strong>Sfida</strong>: Gli enti devono gestire strumenti diversi con <strong>regole, tempistiche e vincoli differenti</strong>.</p>
<hr>
</section>
<section id="simulazione-di-allocazione-fondi-tra-misure-e-obiettivi" class="level2" data-number="1.15">
<h2 data-number="1.15" class="anchored" data-anchor-id="simulazione-di-allocazione-fondi-tra-misure-e-obiettivi"><span class="header-section-number">1.15</span> <strong>📌 4. Simulazione di Allocazione Fondi tra Misure e Obiettivi</strong></h2>
<p>📊 <strong>Vuoi che realizzi un’analisi visiva (es. grafico a barre, diagramma di flusso) per mostrare come i fondi devono essere allocati tra missioni e misure?</strong><br>
Posso creare una <strong>simulazione di allocazione fondi tra livelli UE, nazionali e regionali</strong> per evidenziare la complessità della programmazione! 🚀</p>
</section>
<section id="come-si-fa-allora-a-costruire-una-misura-si-parte-dalla-misura-e-poi-si-cercano-i-fondi-coerenti-o-si-parte-dagli-obiettivi-per-costruire-alla-fine-una-misura" class="level2" data-number="1.16">
<h2 data-number="1.16" class="anchored" data-anchor-id="come-si-fa-allora-a-costruire-una-misura-si-parte-dalla-misura-e-poi-si-cercano-i-fondi-coerenti-o-si-parte-dagli-obiettivi-per-costruire-alla-fine-una-misura"><span class="header-section-number">1.16</span> come si fa allora a costruire una misura? si parte dalla misura e poi si cercano i fondi coerenti o si parte dagli obiettivi per costruire alla fine una misura?</h2>
<section id="come-si-costruisce-una-misura-di-finanziamento" class="level3" data-number="1.16.1">
<h3 data-number="1.16.1" class="anchored" data-anchor-id="come-si-costruisce-una-misura-di-finanziamento"><span class="header-section-number">1.16.1</span> <strong>📌 Come si Costruisce una Misura di Finanziamento?</strong></h3>
<p>La costruzione di una <strong>misura di finanziamento</strong> (ad esempio una misura del PNRR o un’azione all’interno di un Programma Operativo Regionale - POR) può seguire <strong>due approcci principali</strong>:</p>
<p>1️⃣ <strong>Approccio “Top-Down” (Obiettivi → Misura → Fondi)</strong><br>
2️⃣ <strong>Approccio “Bottom-Up” (Fondi → Misura → Obiettivi)</strong></p>
<p>L’approccio usato dipende dal contesto e dalla fonte di finanziamento. Vediamo nel dettaglio entrambi i casi.</p>
<hr>
</section>
</section>
<section id="approccio-top-down-dagli-obiettivi-alle-misure" class="level2" data-number="1.17">
<h2 data-number="1.17" class="anchored" data-anchor-id="approccio-top-down-dagli-obiettivi-alle-misure"><span class="header-section-number">1.17</span> <strong>📌 1. Approccio “Top-Down” → Dagli Obiettivi alle Misure</strong></h2>
<p>Questo approccio è tipico delle <strong>strategie di lungo termine</strong> e dei <strong>piani comunitari e nazionali</strong> (es. <strong>Fondi UE, PNRR, FSC</strong>).<br>
Si parte da <strong>grandi obiettivi strategici</strong> e si costruiscono misure ad hoc.</p>
<p>🔹 <strong>Fasi principali:</strong> 1. <strong>Definizione degli obiettivi generali</strong> → Es. “Digitalizzare la PA entro il 2027”<br>
2. <strong>Identificazione delle missioni</strong> → Es. “Migliorare i servizi digitali per le imprese”<br>
3. <strong>Creazione della misura</strong> → Es. “Finanziamenti per la transizione al cloud nelle PA locali”<br>
4. <strong>Individuazione delle fonti di finanziamento</strong> → Es. “PNRR, FESR, FSC”</p>
<p>✔️ <strong>Vantaggi</strong>:<br>
- Coerenza con la programmazione strategica<br>
- Ottimizzazione delle risorse in base agli obiettivi di policy<br>
- Facile integrazione con altre iniziative</p>
<p>⚠️ <strong>Svantaggi</strong>:<br>
- Lento da attivare (richiede pianificazione politica e negoziati)<br>
- Rischio di poca flessibilità se i fondi disponibili non coprono le reali necessità</p>
<section id="esempio-di-approccio-top-down-pnrr" class="level3" data-number="1.17.1">
<h3 data-number="1.17.1" class="anchored" data-anchor-id="esempio-di-approccio-top-down-pnrr"><span class="header-section-number">1.17.1</span> <strong>📌 Esempio di Approccio “Top-Down” (PNRR)</strong></h3>
<table class="caption-top table">
<thead>
<tr class="header">
<th><strong>Fase</strong></th>
<th><strong>Esempio PNRR</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Obiettivo generale</td>
<td>Transizione digitale</td>
</tr>
<tr class="even">
<td>Missione</td>
<td>PA Digitale</td>
</tr>
<tr class="odd">
<td>Misura</td>
<td>Fondo per la digitalizzazione delle PMI</td>
</tr>
<tr class="even">
<td>Fondi</td>
<td>PNRR, FESR</td>
</tr>
</tbody>
</table>
<hr>
</section>
</section>
<section id="approccio-bottom-up-dai-fondi-alle-misure" class="level2" data-number="1.18">
<h2 data-number="1.18" class="anchored" data-anchor-id="approccio-bottom-up-dai-fondi-alle-misure"><span class="header-section-number">1.18</span> <strong>📌 2. Approccio “Bottom-Up” → Dai Fondi alle Misure</strong></h2>
<p>Questo approccio è più <strong>pragmatico</strong> e tipico dei <strong>livelli regionali e locali</strong>, dove si parte dalle risorse disponibili e si costruiscono misure operative.</p>
<p>🔹 <strong>Fasi principali:</strong> 1. <strong>Analisi delle risorse disponibili</strong> → Es. “Abbiamo 200 milioni di FESR per innovazione”<br>
2. <strong>Definizione dei bisogni territoriali</strong> → Es. “Le PMI locali hanno bisogno di supporto per il digitale”<br>
3. <strong>Creazione di una misura compatibile con i fondi</strong> → Es. “Voucher digitalizzazione PMI”<br>
4. <strong>Allineamento con gli obiettivi strategici</strong> → Es. “La misura rientra nella strategia UE 2021-2027”</p>
<p>✔️ <strong>Vantaggi</strong>:<br>
- Più rapido ed efficace (si parte da risorse già assegnate)<br>
- Maggiore adattabilità ai bisogni locali<br>
- Più semplice da implementare</p>
<p>⚠️ <strong>Svantaggi</strong>:<br>
- Rischio di creare misure non completamente in linea con le strategie di lungo periodo<br>
- Possibili sovrapposizioni o inefficienze se i fondi non sono coordinati</p>
<section id="esempio-di-approccio-bottom-up-regioni" class="level3" data-number="1.18.1">
<h3 data-number="1.18.1" class="anchored" data-anchor-id="esempio-di-approccio-bottom-up-regioni"><span class="header-section-number">1.18.1</span> <strong>📌 Esempio di Approccio “Bottom-Up” (Regioni)</strong></h3>
<table class="caption-top table">
<colgroup>
<col style="width: 62%">
<col style="width: 37%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Fase</strong></th>
<th><strong>Esempio POR FESR</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Risorse disponibili</td>
<td>100 milioni di € FESR per innovazione</td>
</tr>
<tr class="even">
<td>Esigenze territoriali</td>
<td>Supportare la transizione digitale delle PMI</td>
</tr>
<tr class="odd">
<td>Misura</td>
<td>Voucher per software e formazione digitale</td>
</tr>
<tr class="even">
<td>Allineamento strategico</td>
<td>Strategia regionale di innovazione 2021-2027</td>
</tr>
</tbody>
</table>
<hr>
</section>
</section>
<section id="quale-approccio-è-meglio" class="level2" data-number="1.19">
<h2 data-number="1.19" class="anchored" data-anchor-id="quale-approccio-è-meglio"><span class="header-section-number">1.19</span> <strong>📌 Quale Approccio è Meglio?</strong></h2>
<p>🔹 <strong>A livello comunitario e nazionale → Approccio “Top-Down”</strong><br>
- Si definiscono prima gli obiettivi e le strategie<br>
- Le misure vengono costruite per rispondere a questi obiettivi</p>
<p>🔹 <strong>A livello regionale e locale → Approccio “Bottom-Up”</strong><br>
- Si parte dalle risorse disponibili<br>
- Si creano misure che rispondano ai bisogni territoriali</p>
<p>💡 <strong>La soluzione migliore?</strong><br>
🔹 <strong>Un modello misto</strong>, in cui i governi nazionali e regionali stabiliscono le <strong>priorità strategiche (Top-Down)</strong> ma lasciano flessibilità alle regioni e agli enti locali per adattare le misure ai bisogni reali <strong>(Bottom-Up)</strong>.</p>
<hr>
</section>
<section id="ci-sono-poi-anche-i-fondi-regionali-che-necessitano-di-un-coordinamento-con-quelli-nazionali-ed-europei-è-il-cipess-che-organizza" class="level2" data-number="1.20">
<h2 data-number="1.20" class="anchored" data-anchor-id="ci-sono-poi-anche-i-fondi-regionali-che-necessitano-di-un-coordinamento-con-quelli-nazionali-ed-europei-è-il-cipess-che-organizza"><span class="header-section-number">1.20</span> ci sono poi anche i fondi regionali che necessitano di un coordinamento con quelli nazionali ed europei è il cipess che organizza?</h2>
<section id="coordinamento-tra-fondi-regionali-nazionali-ed-europei-il-ruolo-del-cipess" class="level3" data-number="1.20.1">
<h3 data-number="1.20.1" class="anchored" data-anchor-id="coordinamento-tra-fondi-regionali-nazionali-ed-europei-il-ruolo-del-cipess"><span class="header-section-number">1.20.1</span> <strong>📌 Coordinamento tra Fondi Regionali, Nazionali ed Europei: Il Ruolo del CIPESS</strong></h3>
<p>Il <strong>coordinamento tra fondi regionali, nazionali ed europei</strong> è essenziale per garantire una <strong>spesa efficace, sinergie tra le diverse fonti e l’assenza di sovrapposizioni</strong>.</p>
<p>A livello nazionale, il <strong>CIPESS (Comitato Interministeriale per la Programmazione Economica e lo Sviluppo Sostenibile)</strong> ha un ruolo <strong>centrale nella governance</strong> delle risorse.</p>
<hr>
</section>
</section>
<section id="quali-sono-i-fondi-coinvolti" class="level2" data-number="1.21">
<h2 data-number="1.21" class="anchored" data-anchor-id="quali-sono-i-fondi-coinvolti"><span class="header-section-number">1.21</span> <strong>📌 1. Quali sono i Fondi Coinvolti?</strong></h2>
<p>Il sistema finanziario per lo sviluppo del territorio si basa su <strong>tre livelli principali di fondi</strong>:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 53%">
<col style="width: 21%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Livello</strong></th>
<th><strong>Esempi di Fondi</strong></th>
<th><strong>Gestione</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Europeo</strong></td>
<td>FESR, FSE+, FEASR, PNRR (indiretto)</td>
<td>Gestiti da Commissione UE e autorità nazionali/regionali</td>
</tr>
<tr class="even">
<td><strong>Nazionale</strong></td>
<td>FSC, PNRR, Fondi di Bilancio, Contratti di Sviluppo</td>
<td>Definiti dal governo, allocati dal CIPESS</td>
</tr>
<tr class="odd">
<td><strong>Regionale</strong></td>
<td>POR FESR, POR FSE+, Fondi Regionali propri</td>
<td>Gestiti dalle Regioni con coordinamento nazionale</td>
</tr>
</tbody>
</table>
<p>⚠️ <strong>Sfida</strong>: Ogni livello ha <strong>priorità e regole diverse</strong>, quindi serve un <strong>coordinamento forte</strong> per evitare duplicazioni o inefficienze.</p>
<hr>
</section>
<section id="il-ruolo-del-cipess-nel-coordinamento" class="level2" data-number="1.22">
<h2 data-number="1.22" class="anchored" data-anchor-id="il-ruolo-del-cipess-nel-coordinamento"><span class="header-section-number">1.22</span> <strong>📌 2. Il Ruolo del CIPESS nel Coordinamento</strong></h2>
<p>Il <strong>CIPESS</strong> (ex CIPE) è l’organo principale che garantisce il <strong>coordinamento della programmazione e dell’uso dei fondi pubblici</strong>, con particolare attenzione a <strong>FSC e fondi regionali</strong>.</p>
<p>🔹 <strong>Compiti principali del CIPESS:</strong> ✔️ <strong>Programmazione strategica</strong> → Definisce le priorità per l’uso del Fondo per lo Sviluppo e la Coesione (FSC).<br>
✔️ <strong>Allocazione delle risorse</strong> → Decide la ripartizione dei fondi FSC tra Regioni, Ministeri e programmi nazionali.<br>
✔️ <strong>Coordinamento con fondi UE e nazionali</strong> → Assicura che le risorse FSC siano <strong>complementari</strong> ai fondi strutturali UE e ai fondi regionali.<br>
✔️ <strong>Monitoraggio della spesa pubblica</strong> → Verifica che i fondi siano spesi nei tempi e nei modi previsti.<br>
✔️ <strong>Supervisione del PNRR</strong> → Anche se il PNRR è gestito principalmente dal MEF e dal Dipartimento per la Coesione, il CIPESS ha un ruolo di supporto nel coordinamento.</p>
<p>💡 <strong>Es. Decisioni del CIPESS</strong>:<br>
- <strong>Assegna il FSC alle Regioni</strong> per finanziare infrastrutture, innovazione, ambiente.<br>
- <strong>Allinea i fondi FSC con FESR e FSE+</strong> per massimizzare l’impatto.<br>
- <strong>Decide le anticipazioni FSC</strong> per avviare progetti strategici in attesa di fondi UE.</p>
<hr>
</section>
<section id="come-funziona-il-coordinamento-tra-fondi" class="level2" data-number="1.23">
<h2 data-number="1.23" class="anchored" data-anchor-id="come-funziona-il-coordinamento-tra-fondi"><span class="header-section-number">1.23</span> <strong>📌 3. Come Funziona il Coordinamento tra Fondi?</strong></h2>
<p>Per evitare <strong>sovrapposizioni e inefficienze</strong>, il CIPESS lavora con un <strong>modello multilivello</strong>, in cui i fondi vengono <strong>combinati e riallocati</strong> in base alle esigenze e alle strategie territoriali.</p>
<p><strong>🔹 Coordinamento tra livelli di fondi:</strong> 1️⃣ <strong>Fondi Europei (FESR, FSE+, FEASR, PNRR indiretto)</strong><br>
- Destinati a obiettivi di sviluppo <strong>comunitari</strong><br>
- Gestiti dalle Regioni attraverso i <strong>Programmi Operativi Regionali (POR)</strong><br>
- <strong>Obbligo di cofinanziamento</strong> con risorse nazionali</p>
<p>2️⃣ <strong>Fondi Nazionali (FSC, PNRR, Bilancio di Stato, Contratti di Sviluppo)</strong><br>
- Servono a <strong>complementare</strong> i fondi europei<br>
- Allocati dal CIPESS in base alle priorità del governo<br>
- In alcuni casi, <strong>sostituiscono i fondi UE in caso di ritardi</strong></p>
<p>3️⃣ <strong>Fondi Regionali</strong><br>
- Finanziano progetti specifici <strong>su scala locale</strong><br>
- Spesso cofinanziati da fondi UE o FSC<br>
- Devono essere allineati con le strategie nazionali e comunitarie</p>
<p>💡 <strong>Esempio pratico di coordinamento:</strong> 1. Il CIPESS assegna <strong>FSC alla Regione X</strong> per infrastrutture digitali.<br>
2. La Regione X usa <strong>FESR per coprire parte degli stessi investimenti</strong>.<br>
3. Il bilancio regionale aggiunge risorse proprie per completare il progetto.</p>
<p>⚠️ <strong>Senza coordinamento, il rischio è che uno stesso intervento venga finanziato da più fonti senza una logica chiara.</strong></p>
<hr>
</section>
<section id="come-viene-realizzata-la-programmazione-integrata" class="level2" data-number="1.24">
<h2 data-number="1.24" class="anchored" data-anchor-id="come-viene-realizzata-la-programmazione-integrata"><span class="header-section-number">1.24</span> <strong>📌 4. Come Viene Realizzata la Programmazione Integrata?</strong></h2>
<p>Per garantire <strong>coerenza tra i diversi livelli di fondi</strong>, il processo di programmazione segue questi passaggi:</p>
<section id="fasi-della-programmazione-integrata" class="level3" data-number="1.24.1">
<h3 data-number="1.24.1" class="anchored" data-anchor-id="fasi-della-programmazione-integrata"><span class="header-section-number">1.24.1</span> <strong>📌 Fasi della Programmazione Integrata:</strong></h3>
<p>1️⃣ <strong>Definizione delle Strategie e Priorità</strong><br>
- La Commissione UE definisce le <strong>priorità tematiche</strong> per i fondi strutturali<br>
- Il governo italiano elabora la <strong>Strategia Nazionale per lo Sviluppo</strong><br>
- Le Regioni definiscono i propri <strong>Programmi Operativi</strong></p>
<p>2️⃣ <strong>Allocazione e Coordinamento delle Risorse</strong><br>
- Il CIPESS assegna i fondi FSC e verifica la <strong>coerenza con i fondi UE</strong><br>
- Le Regioni pianificano come combinare FSC, FESR e fondi propri<br>
- Il MEF coordina l’attuazione del PNRR con il resto della programmazione</p>
<p>3️⃣ <strong>Monitoraggio e Controllo della Spesa</strong><br>
- Il CIPESS e il Dipartimento per la Coesione monitorano l’uso del FSC<br>
- Le Regioni rendicontano la spesa dei fondi FESR e FSE+<br>
- La Ragioneria Generale dello Stato e la Commissione UE controllano la spesa</p>
<p>💡 <strong>Esempio pratico di programmazione coordinata:</strong><br>
- <strong>Il CIPESS assegna 500 milioni di FSC a una Regione per infrastrutture</strong><br>
- <strong>La Regione usa anche 300 milioni di FESR</strong> per cofinanziare il progetto<br>
- <strong>Il bilancio regionale aggiunge 100 milioni di fondi propri</strong><br>
- <strong>Un monitoraggio periodico verifica l’avanzamento dei lavori</strong></p>
<hr>
</section>
</section>
<section id="strumenti-di-coordinamento-tra-fondi" class="level2" data-number="1.25">
<h2 data-number="1.25" class="anchored" data-anchor-id="strumenti-di-coordinamento-tra-fondi"><span class="header-section-number">1.25</span> <strong>📌 5. Strumenti di Coordinamento tra Fondi</strong></h2>
<p>Per garantire la coerenza e il corretto utilizzo delle risorse, esistono vari strumenti di <strong>coordinamento istituzionale</strong>:</p>
<p>🔹 <strong>Accordi di Coesione</strong> → Intese tra Stato e Regioni per l’uso integrato di FSC, FESR e PNRR.<br>
🔹 <strong>Cabine di Regia PNRR</strong> → Tavoli tecnici per verificare l’attuazione delle misure.<br>
🔹 <strong>Delibere CIPESS</strong> → Decisioni ufficiali sull’allocazione e la riprogrammazione dei fondi.<br>
🔹 <strong>Sistemi di Monitoraggio (ReGiS, Opencoesione)</strong> → Strumenti per tracciare la spesa dei fondi.</p>
<hr>
</section>
<section id="conclusione-2" class="level2" data-number="1.26">
<h2 data-number="1.26" class="anchored" data-anchor-id="conclusione-2"><span class="header-section-number">1.26</span> <strong>📌 Conclusione</strong></h2>
<p>✔️ <strong>Il CIPESS è l’organo principale che coordina FSC, fondi regionali e nazionali con quelli UE.</strong><br>
✔️ <strong>Garantisce che le risorse siano usate in modo sinergico e senza duplicazioni.</strong><br>
✔️ <strong>Il coordinamento multilivello è essenziale per evitare inefficienze e accelerare la spesa pubblica.</strong></p>
<p>👉 <strong>Vuoi che realizzi un diagramma di flusso per visualizzare il coordinamento tra fondi UE, nazionali e regionali?</strong> 🚀</p>
</section>
<section id="riesco-a-ricostruire-importi-tempi-e-fondi-di-un-progetto-usano-i-dati-di-opencoesione-opencup-o-altri-opendata" class="level2" data-number="1.27">
<h2 data-number="1.27" class="anchored" data-anchor-id="riesco-a-ricostruire-importi-tempi-e-fondi-di-un-progetto-usano-i-dati-di-opencoesione-opencup-o-altri-opendata"><span class="header-section-number">1.27</span> riesco a ricostruire importi tempi e fondi di un progetto usano i dati di opencoesione opencup o altri opendata?</h2>
<section id="ricostruire-importi-tempi-e-fondi-di-un-progetto-con-open-data" class="level3" data-number="1.27.1">
<h3 data-number="1.27.1" class="anchored" data-anchor-id="ricostruire-importi-tempi-e-fondi-di-un-progetto-con-open-data"><span class="header-section-number">1.27.1</span> <strong>📌 Ricostruire Importi, Tempi e Fondi di un Progetto con Open Data</strong></h3>
<p>Sì, è possibile <strong>ricostruire il finanziamento e l’iter temporale di un progetto</strong> utilizzando <strong>opendata</strong> disponibili su piattaforme ufficiali come: 1. <strong>OpenCoesione</strong> → Dati sui progetti finanziati con <strong>FESR, FSE+ e FSC</strong>.<br>
2. <strong>OpenCUP</strong> → Codici Unici di Progetto per tutti gli investimenti pubblici italiani.<br>
3. <strong>OpenPNRR</strong> → Database sui progetti finanziati dal <strong>PNRR</strong>.<br>
4. <strong>Banche dati regionali e ministeriali</strong> → Alcune Regioni e Ministeri pubblicano dataset dettagliati.</p>
<hr>
</section>
</section>
<section id="dati-disponibili-su-opencoesione" class="level2" data-number="1.28">
<h2 data-number="1.28" class="anchored" data-anchor-id="dati-disponibili-su-opencoesione"><span class="header-section-number">1.28</span> <strong>📌 1. Dati Disponibili su OpenCoesione</strong></h2>
<p>🔹 <strong>OpenCoesione</strong> è la piattaforma ufficiale del governo italiano che <strong>traccia i progetti finanziati con fondi UE e FSC</strong>.<br>
🔹 Fornisce dati su: - <strong>Importo finanziato e speso</strong><br>
- <strong>Fondi di provenienza (FESR, FSE+, FSC, PNRR, Regionali, ecc.)</strong><br>
- <strong>Soggetti attuatori</strong><br>
- <strong>Date di inizio e fine progetto</strong><br>
- <strong>Settore e categoria del progetto</strong><br>
- <strong>Stato di avanzamento</strong></p>
<p>💡 <strong>Come usare OpenCoesione per ricostruire un progetto?</strong> 1. <strong>Accedi al portale</strong> <a href="https://opencoesione.gov.it/it/">OpenCoesione</a><br>
2. <strong>Cerca un progetto</strong> per <strong>nome, codice CUP o ente attuatore</strong><br>
3. <strong>Scarica il dataset</strong> e analizza le informazioni di finanziamento</p>
<hr>
</section>
<section id="dati-disponibili-su-opencup" class="level2" data-number="1.29">
<h2 data-number="1.29" class="anchored" data-anchor-id="dati-disponibili-su-opencup"><span class="header-section-number">1.29</span> <strong>📌 2. Dati Disponibili su OpenCUP</strong></h2>
<p>🔹 <strong>OpenCUP</strong> contiene informazioni <strong>su tutti i progetti di investimento pubblico in Italia</strong>, indipendentemente dal tipo di finanziamento.<br>
🔹 Permette di tracciare un progetto a partire dal <strong>Codice Unico di Progetto (CUP)</strong>.<br>
🔹 Dati disponibili: - <strong>Importo totale e fonti di finanziamento (PNRR, FSC, FESR, bilancio statale, ecc.)</strong><br>
- <strong>Data di approvazione e cronoprogramma</strong><br>
- <strong>Soggetto beneficiario e localizzazione</strong></p>
<p>💡 <strong>Come usare OpenCUP?</strong> 1. <strong>Vai su</strong> <a href="https://opencup.gov.it/">OpenCUP</a><br>
2. <strong>Cerca un progetto per CUP</strong><br>
3. <strong>Analizza il finanziamento e le tempistiche</strong></p>
<hr>
</section>
<section id="dati-disponibili-su-openpnrr" class="level2" data-number="1.30">
<h2 data-number="1.30" class="anchored" data-anchor-id="dati-disponibili-su-openpnrr"><span class="header-section-number">1.30</span> <strong>📌 3. Dati Disponibili su OpenPNRR</strong></h2>
<p>🔹 <strong>OpenPNRR</strong> è la piattaforma che traccia lo stato di attuazione dei progetti finanziati con il <strong>Piano Nazionale di Ripresa e Resilienza (PNRR)</strong>.<br>
🔹 Informazioni disponibili: - <strong>Fondi assegnati e spesi</strong><br>
- <strong>Scadenze e milestone previste</strong><br>
- <strong>Ministeri e Regioni responsabili</strong><br>
- <strong>Stato di avanzamento</strong></p>
<p>💡 <strong>Come usare OpenPNRR?</strong> 1. <strong>Vai su</strong> <a href="https://openpnrr.it/">OpenPNRR</a><br>
2. <strong>Consulta i dati per missione, misura o ente attuatore</strong><br>
3. <strong>Scarica i dataset per analisi dettagliate</strong></p>
<hr>
</section>
<section id="dati-aggiuntivi-da-fonti-regionali-e-ministeriali" class="level2" data-number="1.31">
<h2 data-number="1.31" class="anchored" data-anchor-id="dati-aggiuntivi-da-fonti-regionali-e-ministeriali"><span class="header-section-number">1.31</span> <strong>📌 4. Dati Aggiuntivi da Fonti Regionali e Ministeriali</strong></h2>
<p>Alcune Regioni e Ministeri pubblicano <strong>dati dettagliati su progetti finanziati</strong>, ad esempio: - <strong>Portali open data regionali</strong> → Con dati su progetti finanziati localmente.<br>
- <strong>Banca dati ReGiS del MEF</strong> → Per il monitoraggio degli investimenti pubblici.<br>
- <strong>Anagrafe Opere Pubbliche (MIT)</strong> → Con dettagli su progetti infrastrutturali.</p>
<p>💡 <strong>Esempio: Open Data Regione Lombardia</strong> 1. <strong>Vai su</strong> <a href="https://www.dati.lombardia.it/">Open Data Lombardia</a><br>
2. <strong>Scarica i dataset su fondi FESR e FSC</strong><br>
3. <strong>Incrocia i dati con OpenCoesione per ricostruire il progetto</strong></p>
<hr>
</section>
<section id="posso-estrarre-e-analizzare-i-dati-per-un-progetto-specifico" class="level2" data-number="1.32">
<h2 data-number="1.32" class="anchored" data-anchor-id="posso-estrarre-e-analizzare-i-dati-per-un-progetto-specifico"><span class="header-section-number">1.32</span> <strong>📌 5. Posso Estrarre e Analizzare i Dati per un Progetto Specifico?</strong></h2>
<p>Se mi fornisci: - <strong>Il nome del progetto</strong><br>
- <strong>Il codice CUP (se disponibile)</strong><br>
- <strong>L’ente attuatore o il settore di riferimento</strong></p>
<p>Posso cercare i dati su OpenCoesione, OpenCUP o OpenPNRR e fornirti un’<strong>analisi dettagliata con importi, fondi e tempi di realizzazione</strong>! 🚀</p>
</section>
</section>
<section id="quale-sono-le-misure-più-semplici-per-il-corrdinamento-delle-risore-se-quali-i-più-complessi" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> quale sono le misure più semplici per il corrdinamento delle risore-se? quali i più complessi?</h1>
<section id="coordinamento-delle-risorse-misure-più-semplici-vs-più-complesse" class="level3" data-number="2.0.1">
<h3 data-number="2.0.1" class="anchored" data-anchor-id="coordinamento-delle-risorse-misure-più-semplici-vs-più-complesse"><span class="header-section-number">2.0.1</span> <strong>📌 Coordinamento delle Risorse: Misure Più Semplici vs Più Complesse</strong></h3>
<p>Il coordinamento delle risorse tra <strong>fondi europei, nazionali e regionali</strong> può variare in termini di <strong>semplicità e complessità</strong>, a seconda di diversi fattori, come:<br>
✔️ <strong>Il numero di fonti di finanziamento coinvolte</strong><br>
✔️ <strong>I livelli amministrativi che partecipano alla gestione</strong><br>
✔️ <strong>Le regole e vincoli di spesa associati ai fondi</strong></p>
<p>Vediamo quali sono le <strong>misure più semplici</strong> e quali le <strong>più complesse</strong> da coordinare.</p>
<hr>
</section>
<section id="misure-più-semplici-da-coordinare" class="level2" data-number="2.1">
<h2 data-number="2.1" class="anchored" data-anchor-id="misure-più-semplici-da-coordinare"><span class="header-section-number">2.1</span> <strong>📌 1. Misure Più Semplici da Coordinare</strong></h2>
<p>Le misure più facili da gestire sono quelle in cui: ✔️ <strong>Si utilizza un’unica fonte di finanziamento</strong><br>
✔️ <strong>Il soggetto attuatore ha un ruolo chiaro e definito</strong><br>
✔️ <strong>Non sono necessari cofinanziamenti o complementarità con altri fondi</strong><br>
✔️ <strong>Le regole di spesa sono standardizzate e con meno vincoli burocratici</strong></p>
<section id="esempi-di-misure-semplici" class="level3" data-number="2.1.1">
<h3 data-number="2.1.1" class="anchored" data-anchor-id="esempi-di-misure-semplici"><span class="header-section-number">2.1.1</span> <strong>📌 Esempi di Misure Semplici</strong></h3>
<p>🔹 <strong>Voucher Digitalizzazione PMI (FESR o PNRR)</strong><br>
- Finanziato interamente con <strong>una sola fonte</strong> (es. PNRR o POR FESR).<br>
- Gestito direttamente da un ministero o da una Regione.<br>
- Facile da attuare: le imprese ricevono un contributo per acquistare beni e servizi digitali.</p>
<p>🔹 <strong>Bonus Edilizi Finanziati da Bilancio Statale</strong><br>
- Fondi provenienti solo dal <strong>bilancio nazionale</strong>.<br>
- Regole di accesso semplici (es. incentivi fiscali automatici).<br>
- Non richiede complementarità con altri strumenti finanziari.</p>
<p>🔹 <strong>Piani di Formazione Finanziati dal FSE+</strong><br>
- I fondi FSE+ sono già destinati alla formazione e non necessitano di integrazioni con altri fondi.<br>
- La gestione è solitamente <strong>regionale</strong> e ha un iter amministrativo standardizzato.</p>
<p>💡 <strong>Perché sono semplici?</strong><br>
✔️ Si basano su <strong>un solo fondo</strong>.<br>
✔️ Il coordinamento è minimo.<br>
✔️ Le procedure di spesa sono snelle.</p>
<hr>
</section>
</section>
<section id="misure-più-complesse-da-coordinare" class="level2" data-number="2.2">
<h2 data-number="2.2" class="anchored" data-anchor-id="misure-più-complesse-da-coordinare"><span class="header-section-number">2.2</span> <strong>📌 2. Misure Più Complesse da Coordinare</strong></h2>
<p>Le misure più difficili da gestire sono quelle in cui: ❌ <strong>Sono coinvolti più fondi con regole diverse (FESR, FSC, PNRR, FEASR, ecc.)</strong><br>
❌ <strong>I finanziamenti arrivano da livelli amministrativi diversi (UE, Stato, Regioni)</strong><br>
❌ <strong>Sono previsti cofinanziamenti tra soggetti pubblici e privati</strong><br>
❌ <strong>Le tempistiche di erogazione e spesa dei fondi sono diverse</strong></p>
<section id="esempi-di-misure-complesse" class="level3" data-number="2.2.1">
<h3 data-number="2.2.1" class="anchored" data-anchor-id="esempi-di-misure-complesse"><span class="header-section-number">2.2.1</span> <strong>📌 Esempi di Misure Complesse</strong></h3>
<p>🔹 <strong>Grandi Opere Infrastrutturali Finanziate con FSC + FESR + PNRR</strong><br>
- Un’autostrada o una ferrovia può essere finanziata con <strong>FSC (nazionale)</strong>, <strong>FESR (europeo)</strong> e <strong>PNRR</strong>.<br>
- Ogni fondo ha <strong>regole diverse</strong> su <strong>tempistiche e rendicontazione</strong>.<br>
- Richiede <strong>coordinamento tra Ministero, Regione e Unione Europea</strong>.</p>
<p>🔹 <strong>Interventi di Rigenerazione Urbana (FSC + FESR + Bilancio Comunale + Privati)</strong><br>
- Coinvolge fondi nazionali, europei, regionali e privati.<br>
- Deve rispettare obiettivi di sostenibilità, inclusione sociale, transizione ecologica.<br>
- Richiede <strong>concertazione tra pubblico e privato</strong> per definire regole e risorse.</p>
<p>🔹 <strong>ZES (Zone Economiche Speciali) con PNRR + Bilancio Nazionale + Finanziamenti Privati</strong><br>
- Le ZES ricevono finanziamenti misti da <strong>PNRR, fondi nazionali e investitori privati</strong>.<br>
- Il coordinamento richiede un <strong>piano dettagliato di attrazione degli investimenti</strong>.<br>
- Devono garantire <strong>coerenza con le strategie industriali nazionali e UE</strong>.</p>
<p>💡 <strong>Perché sono complesse?</strong><br>
❌ Necessitano di <strong>coordinamento multilivello</strong> (Regioni, Ministeri, UE).<br>
❌ I tempi di erogazione e spesa sono diversi tra i fondi.<br>
❌ Richiedono <strong>procedure burocratiche più lunghe e articolate</strong>.</p>
<hr>
</section>
</section>
<section id="come-semplificare-il-coordinamento-delle-misure-complesse" class="level2" data-number="2.3">
<h2 data-number="2.3" class="anchored" data-anchor-id="come-semplificare-il-coordinamento-delle-misure-complesse"><span class="header-section-number">2.3</span> <strong>📌 3. Come Semplificare il Coordinamento delle Misure Complesse?</strong></h2>
<p>Per evitare ritardi e inefficienze, si possono adottare alcuni strumenti di <strong>coordinamento istituzionale</strong>:</p>
<p>✔️ <strong>Accordi di Coesione</strong> → Permettono di integrare FSC e FESR in modo sinergico.<br>
✔️ <strong>Piani Nazionali Integrati</strong> → Definiti dal CIPESS per allineare PNRR, FSC e FESR.<br>
✔️ <strong>Cabine di Regia PNRR e FSC</strong> → Strumenti di governance per monitorare la spesa.<br>
✔️ <strong>Sistemi di Monitoraggio (ReGiS, OpenCoesione)</strong> → Consentono di tracciare la spesa in tempo reale.</p>
<p>📌 <strong>Esempio: il CIPESS può assegnare FSC a una Regione con un vincolo di complementarità con il FESR.</strong><br>
📌 <strong>In questo modo si evita che uno stesso progetto venga finanziato da due fondi diversi senza coordinamento.</strong></p>
<hr>
</section>
<section id="conclusione-3" class="level2" data-number="2.4">
<h2 data-number="2.4" class="anchored" data-anchor-id="conclusione-3"><span class="header-section-number">2.4</span> <strong>📌 Conclusione</strong></h2>
<p>🔹 <strong>Le misure più semplici</strong> da coordinare sono quelle che utilizzano <strong>un solo fondo</strong> e hanno una gestione chiara (es. voucher, incentivi fiscali).<br>
🔹 <strong>Le misure più complesse</strong> coinvolgono <strong>più fondi e livelli amministrativi</strong> e richiedono un forte coordinamento tra istituzioni.<br>
🔹 <strong>Strumenti come Accordi di Coesione e Cabine di Regia aiutano a gestire il coordinamento tra le diverse fonti di finanziamento.</strong></p>
<p>👉 <strong>Vuoi che realizzi un diagramma per visualizzare le differenze tra misure semplici e complesse?</strong> 🚀</p>
</section>
</section>
<section id="come-possono-intervenire-le-banche-momentaneamente-al-posto-dei-fondi-pubblici" class="level1" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> come possono intervenire le banche momentaneamente al posto dei fondi pubblici?</h1>
<section id="come-possono-intervenire-le-banche-per-sostituire-temporaneamente-i-fondi-pubblici" class="level3" data-number="3.0.1">
<h3 data-number="3.0.1" class="anchored" data-anchor-id="come-possono-intervenire-le-banche-per-sostituire-temporaneamente-i-fondi-pubblici"><span class="header-section-number">3.0.1</span> <strong>📌 Come Possono Intervenire le Banche per Sostituire Temporaneamente i Fondi Pubblici?</strong></h3>
<p>Le <strong>banche</strong> possono giocare un ruolo fondamentale nel <strong>finanziare temporaneamente progetti pubblici</strong> in attesa dell’erogazione dei fondi europei, nazionali o regionali. Questo avviene attraverso strumenti finanziari specifici che permettono di <strong>anticipare liquidità</strong> ed evitare ritardi nei progetti.</p>
<hr>
</section>
<section id="meccanismi-di-intervento-bancario-per-sostituire-temporaneamente-i-fondi-pubblici" class="level2" data-number="3.1">
<h2 data-number="3.1" class="anchored" data-anchor-id="meccanismi-di-intervento-bancario-per-sostituire-temporaneamente-i-fondi-pubblici"><span class="header-section-number">3.1</span> <strong>📌 1. Meccanismi di Intervento Bancario per Sostituire Temporaneamente i Fondi Pubblici</strong></h2>
<p>Quando i fondi pubblici sono assegnati, ma non ancora erogati per motivi amministrativi o burocratici, le banche possono <strong>anticipare il finanziamento</strong> attraverso diverse modalità:</p>
<section id="anticipazione-di-liquidità-su-fondi-assegnati" class="level3" data-number="3.1.1">
<h3 data-number="3.1.1" class="anchored" data-anchor-id="anticipazione-di-liquidità-su-fondi-assegnati"><span class="header-section-number">3.1.1</span> <strong>1️⃣ Anticipazione di Liquidità su Fondi Assegnati</strong></h3>
<p>📌 <strong>Cosa significa?</strong><br>
- Se un progetto ha già ricevuto un finanziamento <strong>dal PNRR, FSC o FESR</strong>, ma la somma non è ancora erogata, la banca può anticipare il valore dell’investimento.<br>
- Quando il fondo pubblico viene erogato, l’importo viene <strong>rimborsato alla banca</strong>.</p>
<p>📌 <strong>Esempio</strong><br>
- Un Comune ha ottenuto 5 milioni di euro da <strong>FSC</strong> per un’infrastruttura.<br>
- La Regione tarda nell’erogazione → La banca anticipa i 5 milioni al Comune con un <strong>finanziamento ponte</strong>.<br>
- Quando i fondi FSC vengono accreditati, il Comune rimborsa la banca.</p>
<p>✔️ <strong>Vantaggio</strong>: Il progetto non si ferma in attesa della burocrazia.<br>
❌ <strong>Rischio</strong>: Se il fondo pubblico viene ridotto o ritardato, il Comune potrebbe dover coprire il debito con risorse proprie.</p>
<hr>
</section>
<section id="finanziamenti-a-breve-termine-bridge-financing" class="level3" data-number="3.1.2">
<h3 data-number="3.1.2" class="anchored" data-anchor-id="finanziamenti-a-breve-termine-bridge-financing"><span class="header-section-number">3.1.2</span> <strong>2️⃣ Finanziamenti a Breve Termine (Bridge Financing)</strong></h3>
<p>📌 <strong>Cosa significa?</strong><br>
- La banca concede un prestito <strong>a breve termine</strong> (da pochi mesi a 2-3 anni) per <strong>coprire temporaneamente i costi del progetto</strong> in attesa dei fondi pubblici.<br>
- Questo strumento è usato spesso per i <strong>Fondi Strutturali UE (FESR, FSE+)</strong> che hanno tempi di erogazione lunghi.</p>
<p>📌 <strong>Esempio</strong><br>
- Un’impresa ha ottenuto un contributo FESR per l’acquisto di macchinari, ma i fondi arriveranno tra 12 mesi.<br>
- La banca concede un <strong>prestito-ponte</strong> di 12 mesi.<br>
- Quando i fondi UE vengono erogati, l’azienda rimborsa il prestito.</p>
<p>✔️ <strong>Vantaggio</strong>: Nessun blocco degli investimenti per i tempi di attesa dei fondi pubblici.<br>
❌ <strong>Rischio</strong>: Se l’impresa non riceve i fondi, deve ripagare il prestito con altre risorse.</p>
<hr>
</section>
<section id="anticipazione-su-crediti-di-pagamento" class="level3" data-number="3.1.3">
<h3 data-number="3.1.3" class="anchored" data-anchor-id="anticipazione-su-crediti-di-pagamento"><span class="header-section-number">3.1.3</span> <strong>3️⃣ Anticipazione su Crediti di Pagamento</strong></h3>
<p>📌 <strong>Cosa significa?</strong><br>
- Se un’impresa o un ente pubblico ha <strong>crediti certi verso lo Stato o le Regioni</strong>, la banca può concedere <strong>un’anticipazione finanziaria su questi crediti</strong>.</p>
<p>📌 <strong>Esempio</strong><br>
- Un’impresa ha completato un’opera pubblica e deve ricevere 10 milioni dallo Stato.<br>
- L’erogazione avverrà tra 18 mesi → La banca anticipa 8 milioni subito.<br>
- Quando lo Stato paga, l’impresa estingue il prestito.</p>
<p>✔️ <strong>Vantaggio</strong>: Le imprese evitano problemi di liquidità in attesa di pagamenti pubblici.<br>
❌ <strong>Rischio</strong>: Se lo Stato ritarda il pagamento, l’impresa deve coprire il debito con altre risorse.</p>
<hr>
</section>
<section id="finanziamento-a-lungo-termine-con-garanzia-pubblica-project-finance" class="level3" data-number="3.1.4">
<h3 data-number="3.1.4" class="anchored" data-anchor-id="finanziamento-a-lungo-termine-con-garanzia-pubblica-project-finance"><span class="header-section-number">3.1.4</span> <strong>4️⃣ Finanziamento a Lungo Termine con Garanzia Pubblica (Project Finance)</strong></h3>
<p>📌 <strong>Cosa significa?</strong><br>
- Se un progetto pubblico ha un forte interesse strategico, ma i fondi pubblici <strong>non sono sufficienti o arrivano a scaglioni</strong>, la banca può intervenire con un <strong>finanziamento a lungo termine</strong>.<br>
- Questo è tipico delle <strong>grandi opere infrastrutturali</strong> (strade, ferrovie, ospedali).</p>
<p>📌 <strong>Esempio</strong><br>
- Un aeroporto riceve 100 milioni dal PNRR, ma il costo è 200 milioni.<br>
- La banca finanzia i restanti 100 milioni con un <strong>mutuo ventennale</strong>.<br>
- Il rimborso avviene con ricavi futuri dell’aeroporto + eventuali fondi pubblici successivi.</p>
<p>✔️ <strong>Vantaggio</strong>: Progetti complessi vengono realizzati anche senza fondi pubblici immediati.<br>
❌ <strong>Rischio</strong>: Se i fondi pubblici non coprono il finanziamento, il progetto potrebbe essere in difficoltà finanziaria.</p>
<hr>
</section>
</section>
<section id="strumenti-bancari-specifici-per-il-settore-pubblico" class="level2" data-number="3.2">
<h2 data-number="3.2" class="anchored" data-anchor-id="strumenti-bancari-specifici-per-il-settore-pubblico"><span class="header-section-number">3.2</span> <strong>📌 2. Strumenti Bancari Specifici per il Settore Pubblico</strong></h2>
<p>Le banche offrono strumenti specifici per enti pubblici e imprese coinvolte in progetti finanziati con fondi pubblici:</p>
<p>🔹 <strong>Factoring su crediti verso la PA</strong> → Le imprese cedono i loro crediti alla banca per avere liquidità immediata.<br>
🔹 <strong>Mutui agevolati per Comuni e Regioni</strong> → Finanziamenti a lungo termine per investimenti pubblici.<br>
🔹 <strong>Fondi di garanzia per progetti UE</strong> → Garanzie bancarie per accedere ai fondi europei senza anticipare risorse proprie.<br>
🔹 <strong>Prestiti BEI (Banca Europea degli Investimenti)</strong> → Strumento europeo per supportare progetti pubblici con tassi agevolati.</p>
<p>💡 <strong>Ad esempio, un Comune può richiedere un prestito BEI per un’opera pubblica e poi ripagarlo con fondi UE/FSC ricevuti successivamente.</strong></p>
<hr>
</section>
<section id="vantaggi-e-rischi-dellintervento-bancario" class="level2" data-number="3.3">
<h2 data-number="3.3" class="anchored" data-anchor-id="vantaggi-e-rischi-dellintervento-bancario"><span class="header-section-number">3.3</span> <strong>📌 3. Vantaggi e Rischi dell’Intervento Bancario</strong></h2>
<section id="vantaggi" class="level3" data-number="3.3.1">
<h3 data-number="3.3.1" class="anchored" data-anchor-id="vantaggi"><span class="header-section-number">3.3.1</span> <strong>✔️ Vantaggi</strong></h3>
<p>✅ Evita <strong>blocchi e ritardi nei progetti pubblici</strong> dovuti a lentezze burocratiche.<br>
✅ Fornisce <strong>liquidità immediata a enti pubblici e imprese</strong>.<br>
✅ Permette di <strong>realizzare investimenti anche senza fondi pubblici disponibili al 100%</strong>.<br>
✅ Si può integrare con <strong>fondi strutturali UE e FSC</strong>.</p>
</section>
<section id="rischi" class="level3" data-number="3.3.2">
<h3 data-number="3.3.2" class="anchored" data-anchor-id="rischi"><span class="header-section-number">3.3.2</span> <strong>❌ Rischi</strong></h3>
<p>⚠️ Se i fondi pubblici vengono <strong>tagliati o ritardati</strong>, enti e imprese devono coprire il debito.<br>
⚠️ Gli <strong>interessi bancari aumentano il costo finale del progetto</strong>.<br>
⚠️ Alcuni enti pubblici hanno <strong>limiti di indebitamento</strong> che non permettono l’uso di strumenti bancari.</p>
<hr>
</section>
</section>
<section id="conclusione-4" class="level2" data-number="3.4">
<h2 data-number="3.4" class="anchored" data-anchor-id="conclusione-4"><span class="header-section-number">3.4</span> <strong>📌 4. Conclusione</strong></h2>
<p>✔️ <strong>Le banche possono sostituire temporaneamente i fondi pubblici</strong> con strumenti finanziari dedicati.<br>
✔️ <strong>L’intervento bancario accelera i progetti e garantisce liquidità</strong> a imprese ed enti pubblici.<br>
✔️ <strong>È essenziale una gestione attenta del rischio</strong>, per evitare indebitamenti eccessivi in caso di ritardi nei fondi pubblici.</p>
<p>👉 <strong>Vuoi una simulazione pratica su un caso specifico?</strong> 🚀</p>
</section>
</section>
<section id="come-deve-una-impresa-organizzarsi-per-ricevere-fondi" class="level1" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> come deve una impresa organizzarsi per ricevere fondi ?</h1>
<section id="come-deve-organizzarsi-unimpresa-per-ricevere-fondi-pubblici" class="level3" data-number="4.0.1">
<h3 data-number="4.0.1" class="anchored" data-anchor-id="come-deve-organizzarsi-unimpresa-per-ricevere-fondi-pubblici"><span class="header-section-number">4.0.1</span> <strong>📌 Come Deve Organizzarsi un’Impresa per Ricevere Fondi Pubblici?</strong></h3>
<p>Per un’<strong>impresa</strong> che vuole accedere ai <strong>fondi pubblici</strong> (europei, nazionali o regionali), è fondamentale seguire una <strong>strategia strutturata</strong>, che comprende:<br>
✔️ <strong>Analisi delle opportunità di finanziamento</strong><br>
✔️ <strong>Pianificazione e preparazione della documentazione</strong><br>
✔️ <strong>Gestione e rendicontazione</strong></p>
<p>Ecco una guida <strong>passo dopo passo</strong> su come un’impresa deve organizzarsi per ricevere e gestire al meglio i fondi pubblici.</p>
<hr>
</section>
<section id="definire-il-progetto-e-lobiettivo-del-finanziamento" class="level2" data-number="4.1">
<h2 data-number="4.1" class="anchored" data-anchor-id="definire-il-progetto-e-lobiettivo-del-finanziamento"><span class="header-section-number">4.1</span> <strong>📌 1. Definire il Progetto e l’Obiettivo del Finanziamento</strong></h2>
<p>Prima di cercare fondi, un’impresa deve definire chiaramente <strong>cosa vuole finanziare</strong> e <strong>con quale scopo</strong>.<br>
🔹 Vuole <strong>investire in macchinari e innovazione</strong>? → Potrebbe accedere a fondi FESR o FSC.<br>
🔹 Vuole <strong>formare il personale</strong>? → Il FSE+ potrebbe essere il fondo adatto.<br>
🔹 Vuole <strong>internazionalizzarsi</strong>? → Potrebbe beneficiare di fondi SIMEST o BEI.</p>
<p>💡 <strong>Azioni da fare:</strong> ✔️ Definire un <strong>piano di investimento dettagliato</strong><br>
✔️ Identificare <strong>il fabbisogno finanziario</strong><br>
✔️ Valutare <strong>se l’investimento rientra in un bando o misura già esistente</strong></p>
<p>📌 <strong>Esempio</strong>: Un’azienda manifatturiera vuole acquistare nuovi macchinari per ridurre l’impatto ambientale.<br>
→ Potrebbe accedere ai fondi <strong>PNRR Transizione Ecologica o FESR Innovazione Industriale</strong>.</p>
<hr>
</section>
<section id="cercare-le-opportunità-di-finanziamento" class="level2" data-number="4.2">
<h2 data-number="4.2" class="anchored" data-anchor-id="cercare-le-opportunità-di-finanziamento"><span class="header-section-number">4.2</span> <strong>📌 2. Cercare le Opportunità di Finanziamento</strong></h2>
<p>Un’impresa può accedere a fondi pubblici attraverso <strong>bandi e programmi di finanziamento</strong> a diversi livelli:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th><strong>Livello</strong></th>
<th><strong>Fondi Principali</strong></th>
<th><strong>Dove trovarli</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Europeo</strong></td>
<td>FESR, FSE+, Horizon Europe, LIFE, InvestEU</td>
<td>Portale <a href="https://ec.europa.eu/info/funding-tenders">Funding &amp; Tenders</a></td>
</tr>
<tr class="even">
<td><strong>Nazionale</strong></td>
<td>PNRR, FSC, SIMEST, BEI, Invitalia</td>
<td><a href="https://www.mimit.gov.it">MIMIT</a>, <a href="https://www.invitalia.it/">Invitalia</a></td>
</tr>
<tr class="odd">
<td><strong>Regionale</strong></td>
<td>POR FESR, POR FSE+, Fondi per imprese locali</td>
<td>Portali open data delle Regioni</td>
</tr>
</tbody>
</table>
<p>💡 <strong>Azioni da fare:</strong><br>
✔️ Monitorare <strong>i portali ufficiali</strong> per i bandi aperti.<br>
✔️ Contattare <strong>Confidi, Associazioni di Categoria o Camere di Commercio</strong> per assistenza.<br>
✔️ Utilizzare servizi di <strong>consulenza specializzata</strong> per valutare i bandi migliori.</p>
<p>📌 <strong>Esempio</strong>: Un’impresa di software cerca finanziamenti per R&amp;S.<br>
→ Horizon Europe offre bandi per innovazione tecnologica a livello UE.</p>
<hr>
</section>
<section id="verificare-i-requisiti-di-ammissibilità" class="level2" data-number="4.3">
<h2 data-number="4.3" class="anchored" data-anchor-id="verificare-i-requisiti-di-ammissibilità"><span class="header-section-number">4.3</span> <strong>📌 3. Verificare i Requisiti di Ammissibilità</strong></h2>
<p>Ogni bando ha <strong>criteri specifici</strong> per accedere ai finanziamenti.<br>
🔹 <strong>Dimensione dell’impresa</strong> → PMI, grande impresa o startup?<br>
🔹 <strong>Settore di appartenenza</strong> → Industria, agricoltura, servizi?<br>
🔹 <strong>Tipologia di spesa ammissibile</strong> → Investimenti in attrezzature, personale, formazione?</p>
<p>💡 <strong>Azioni da fare:</strong><br>
✔️ Leggere <strong>attentamente i requisiti del bando</strong>.<br>
✔️ Verificare se sono richiesti <strong>cofinanziamenti privati</strong>.<br>
✔️ Preparare una <strong>checklist dei documenti richiesti</strong>.</p>
<p>📌 <strong>Esempio</strong>: Un’impresa vuole accedere a un bando per digitalizzazione.<br>
→ Il bando richiede che sia <strong>una PMI con almeno 2 anni di attività e bilanci certificati</strong>.</p>
<hr>
</section>
<section id="preparare-il-business-plan-e-la-domanda-di-finanziamento" class="level2" data-number="4.4">
<h2 data-number="4.4" class="anchored" data-anchor-id="preparare-il-business-plan-e-la-domanda-di-finanziamento"><span class="header-section-number">4.4</span> <strong>📌 4. Preparare il Business Plan e la Domanda di Finanziamento</strong></h2>
<p>Una buona domanda di finanziamento deve includere:<br>
✔️ <strong>Descrizione del progetto</strong> (obiettivi, innovazione, impatto)<br>
✔️ <strong>Piano finanziario</strong> (quanto serve, come verrà speso)<br>
✔️ <strong>Tempistiche</strong> (cronoprogramma degli investimenti)<br>
✔️ <strong>Benefici attesi</strong> (economici, ambientali, sociali)</p>
<p>💡 <strong>Azioni da fare:</strong><br>
✔️ Redigere un <strong>business plan dettagliato</strong>.<br>
✔️ Preparare <strong>documentazione tecnica</strong> (preventivi, studi di fattibilità).<br>
✔️ Assicurarsi di avere <strong>tutti i documenti amministrativi in regola</strong> (bilancio, DURC, visura camerale).</p>
<p>📌 <strong>Esempio</strong>: Un’impresa richiede un finanziamento PNRR per digitalizzazione.<br>
→ Deve allegare <strong>piano dettagliato degli investimenti e prospetti finanziari</strong>.</p>
<hr>
</section>
<section id="presentare-la-domanda-e-monitorare-liter" class="level2" data-number="4.5">
<h2 data-number="4.5" class="anchored" data-anchor-id="presentare-la-domanda-e-monitorare-liter"><span class="header-section-number">4.5</span> <strong>📌 5. Presentare la Domanda e Monitorare l’Iter</strong></h2>
<p>Dopo aver preparato tutto, è il momento di <strong>inviare la domanda</strong> e monitorare il processo.<br>
🔹 <strong>Canali di presentazione:</strong> Portali regionali, nazionali o europei.<br>
🔹 <strong>Tempistiche di valutazione:</strong> Dipendono dal bando (da pochi mesi fino a un anno).<br>
🔹 <strong>Possibili richieste di integrazioni documentali.</strong></p>
<p>💡 <strong>Azioni da fare:</strong><br>
✔️ Presentare la domanda <strong>nei tempi stabiliti</strong>.<br>
✔️ <strong>Monitorare l’iter di valutazione</strong> e rispondere a eventuali richieste di chiarimenti.<br>
✔️ Prepararsi a gestire <strong>l’anticipo e gli stati di avanzamento del finanziamento</strong>.</p>
<p>📌 <strong>Esempio</strong>: Un’impresa ottiene un finanziamento FESR.<br>
→ Deve seguire <strong>step di rendicontazione periodica</strong> per ricevere i fondi.</p>
<hr>
</section>
<section id="gestire-il-finanziamento-e-la-rendicontazione" class="level2" data-number="4.6">
<h2 data-number="4.6" class="anchored" data-anchor-id="gestire-il-finanziamento-e-la-rendicontazione"><span class="header-section-number">4.6</span> <strong>📌 6. Gestire il Finanziamento e la Rendicontazione</strong></h2>
<p>Dopo l’approvazione del finanziamento, l’impresa deve gestire i fondi in modo <strong>corretto e trasparente</strong>.<br>
🔹 <strong>Rispettare le tempistiche</strong> di realizzazione del progetto.<br>
🔹 <strong>Conservare tutta la documentazione di spesa</strong>.<br>
🔹 <strong>Inviare report di avanzamento</strong> se richiesto dal bando.</p>
<p>💡 <strong>Azioni da fare:</strong><br>
✔️ Creare <strong>un sistema di gestione finanziaria separato</strong> per il progetto finanziato.<br>
✔️ Archiviare <strong>fatture, contratti e report</strong> per la rendicontazione.<br>
✔️ Seguire eventuali <strong>audit o controlli</strong> da parte dell’ente finanziatore.</p>
<p>📌 <strong>Esempio</strong>: Un’impresa che riceve fondi PNRR deve rispettare le <strong>milestone e target stabiliti</strong>.</p>
<hr>
</section>
<section id="strategie-per-ottimizzare-laccesso-ai-fondi" class="level2" data-number="4.7">
<h2 data-number="4.7" class="anchored" data-anchor-id="strategie-per-ottimizzare-laccesso-ai-fondi"><span class="header-section-number">4.7</span> <strong>📌 7. Strategie per Ottimizzare l’Accesso ai Fondi</strong></h2>
<p>✔️ <strong>Essere sempre aggiornati</strong> → Seguire portali ufficiali, partecipare a webinar informativi.<br>
✔️ <strong>Affidarsi a consulenti esperti</strong> → Supporto tecnico e fiscale per evitare errori nella domanda.<br>
✔️ <strong>Valutare combinazioni di fondi</strong> → Es. cofinanziamenti tra FESR, FSC e PNRR per massimizzare il supporto.<br>
✔️ <strong>Creare una rete di partner</strong> → Collaborare con altre imprese, università, enti pubblici per accedere a bandi più grandi.</p>
<p>📌 <strong>Esempio</strong>: Una startup innovativa può combinare <strong>PNRR per digitalizzazione</strong> con <strong>fondi regionali per startup</strong>.</p>
<hr>
</section>
<section id="conclusione-5" class="level2" data-number="4.8">
<h2 data-number="4.8" class="anchored" data-anchor-id="conclusione-5"><span class="header-section-number">4.8</span> <strong>📌 Conclusione</strong></h2>
<p>🔹 <strong>Un’impresa deve strutturarsi bene per ottenere fondi pubblici</strong>, con una strategia chiara e una gestione finanziaria precisa.<br>
🔹 <strong>Il successo dipende dalla capacità di scegliere il bando giusto, preparare una buona domanda e gestire il finanziamento in modo corretto.</strong><br>
🔹 <strong>Monitorare costantemente le opportunità di finanziamento è essenziale per restare competitivi.</strong></p>
<p>👉 <strong>Vuoi che crei un diagramma di flusso per sintetizzare il processo di accesso ai fondi?</strong> 🚀</p>
<div id="511440fa" class="cell" data-execution_count="4">
<div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> graphviz</span>
<span id="cb5-2"></span>
<span id="cb5-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Creazione del blueprint del progetto con Graphviz</span></span>
<span id="cb5-4">dot <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> graphviz.Digraph(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">format</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'png'</span>, engine<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'dot'</span>)</span>
<span id="cb5-5"></span>
<span id="cb5-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Definizione dei nodi principali (attori coinvolti)</span></span>
<span id="cb5-7">dot.node(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa Beneficiaria'</span>, shape<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'box'</span>, style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'filled'</span>, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'lightblue'</span>)</span>
<span id="cb5-8">dot.node(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Banca'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Banca (Finanziamento Ponte)'</span>, shape<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'ellipse'</span>, style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'filled'</span>, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'lightgrey'</span>)</span>
<span id="cb5-9">dot.node(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoUE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondo Comunitario (FESR, FSE+)'</span>, shape<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'ellipse'</span>, style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'filled'</span>, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'lightgreen'</span>)</span>
<span id="cb5-10">dot.node(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoNaz'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondo Nazionale (PNRR, Invitalia)'</span>, shape<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'ellipse'</span>, style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'filled'</span>, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'lightyellow'</span>)</span>
<span id="cb5-11">dot.node(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondo per lo Sviluppo e la Coesione (FSC)'</span>, shape<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'ellipse'</span>, style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'filled'</span>, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'lightcoral'</span>)</span>
<span id="cb5-12">dot.node(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoReg'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Fondo Regionale (POR FESR, FSE+)'</span>, shape<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'ellipse'</span>, style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'filled'</span>, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'lightsalmon'</span>)</span>
<span id="cb5-13"></span>
<span id="cb5-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Collegamenti tra gli attori</span></span>
<span id="cb5-15">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Banca'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Richiesta Finanziamento Temporaneo'</span>)</span>
<span id="cb5-16">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Banca'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Erogazione Finanziamento Ponte'</span>)</span>
<span id="cb5-17">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoUE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Domanda di Finanziamento'</span>)</span>
<span id="cb5-18">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoNaz'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Richiesta Cofinanziamento'</span>)</span>
<span id="cb5-19">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Richiesta Fondi per Investimento'</span>)</span>
<span id="cb5-20">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoReg'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Richiesta Supporto Regionale'</span>)</span>
<span id="cb5-21"></span>
<span id="cb5-22"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Flussi di finanziamento</span></span>
<span id="cb5-23">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoUE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Erogazione Fondi UE'</span>)</span>
<span id="cb5-24">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoNaz'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Erogazione Fondi Nazionali'</span>)</span>
<span id="cb5-25">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FSC'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Erogazione Fondi FSC'</span>)</span>
<span id="cb5-26">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FondoReg'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Erogazione Fondi Regionali'</span>)</span>
<span id="cb5-27"></span>
<span id="cb5-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Ritorno del finanziamento bancario</span></span>
<span id="cb5-29">dot.edge(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Impresa'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Banca'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Rimborso Finanziamento con Fondi Ricevuti'</span>)</span>
<span id="cb5-30"></span>
<span id="cb5-31"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Creazione del diagramma</span></span>
<span id="cb5-32">dot.render(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'blueprint_progetto'</span>, view<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="4">
<pre><code>'blueprint_progetto.png'</code></pre>
</div>
</div>
</section>
</section>
<section id="la-misura-è-come-una-torta-i-fondi-gli-ingredienti-il-cipess-il-pasticcere" class="level1" data-number="5">
<h1 data-number="5"><span class="header-section-number">5</span> la misura è come una torta , i fondi gli ingredienti, il cipess il pasticcere</h1>
<section id="la-misura-come-una-torta-i-fondi-come-ingredienti-il-cipess-come-il-pasticcere" class="level3" data-number="5.0.1">
<h3 data-number="5.0.1" class="anchored" data-anchor-id="la-misura-come-una-torta-i-fondi-come-ingredienti-il-cipess-come-il-pasticcere"><span class="header-section-number">5.0.1</span> <strong>📌 La Misura come una Torta, i Fondi come Ingredienti, il CIPESS come il Pasticcere</strong> 🎂</h3>
<p>Questa <strong>metafora</strong> spiega in modo chiaro come funziona la <strong>costruzione e gestione di una misura di finanziamento pubblico</strong>:</p>
<ul>
<li><strong>La misura</strong> → È <strong>la torta</strong>, il prodotto finale che deve rispondere a un bisogno specifico.<br>
</li>
<li><strong>I fondi</strong> → Sono <strong>gli ingredienti</strong> (FESR, FSE+, FSC, PNRR, fondi regionali) necessari per realizzare la misura.<br>
</li>
<li><strong>Il CIPESS</strong> → È <strong>il pasticcere</strong>, che combina gli ingredienti e garantisce che il risultato finale sia ben strutturato e conforme alle regole.</li>
</ul>
<hr>
</section>
<section id="scegliere-la-ricetta-definizione-della-misura" class="level2" data-number="5.1">
<h2 data-number="5.1" class="anchored" data-anchor-id="scegliere-la-ricetta-definizione-della-misura"><span class="header-section-number">5.1</span> <strong>📌 1. Scegliere la Ricetta (Definizione della Misura)</strong></h2>
<p>Prima di preparare la torta, bisogna decidere <strong>che tipo di misura creare</strong> e quali obiettivi raggiungere.</p>
<p>🔹 <strong>Quale problema deve risolvere la misura?</strong> → Digitalizzazione, sostenibilità, infrastrutture?<br>
🔹 <strong>Chi sono i beneficiari?</strong> → Imprese, enti pubblici, cittadini?<br>
🔹 <strong>Quali sono i risultati attesi?</strong> → Crescita economica, riduzione dell’inquinamento, maggiore inclusione sociale?</p>
<p>📌 <strong>Esempio</strong>: Se vogliamo creare una misura per <strong>innovazione tecnologica nelle PMI</strong>, la torta sarà un programma di finanziamento che aiuti le imprese a investire in digitalizzazione.</p>
<hr>
</section>
<section id="selezionare-gli-ingredienti-scelta-dei-fondi" class="level2" data-number="5.2">
<h2 data-number="5.2" class="anchored" data-anchor-id="selezionare-gli-ingredienti-scelta-dei-fondi"><span class="header-section-number">5.2</span> <strong>📌 2. Selezionare gli Ingredienti (Scelta dei Fondi)</strong></h2>
<p>Ogni misura necessita di <strong>diversi fondi</strong>, che devono essere <strong>combinati in modo efficace</strong>.</p>
<p>✔️ <strong>Fondi Strutturali Europei (FESR, FSE+)</strong> → Supportano innovazione, formazione, crescita sostenibile.<br>
✔️ <strong>FSC (Fondo per lo Sviluppo e la Coesione)</strong> → Complementa i fondi UE per aree svantaggiate.<br>
✔️ <strong>PNRR (Piano Nazionale di Ripresa e Resilienza)</strong> → Strumento straordinario con tempistiche rigide.<br>
✔️ <strong>Fondi Regionali (POR, Bilancio Regionale)</strong> → Adattati alle specifiche esigenze locali.<br>
✔️ <strong>Fondi Privati e Bancari</strong> → Cofinanziamento per aumentare l’impatto.</p>
<p>📌 <strong>Esempio</strong>: Se la misura riguarda la transizione ecologica nelle imprese, si può usare: - <strong>FESR per investimenti in tecnologie pulite</strong> - <strong>FSC per supportare aree meno sviluppate</strong> - <strong>PNRR per accelerare l’adozione delle nuove tecnologie</strong> - <strong>Fondi regionali per progetti locali</strong> - <strong>Prestiti bancari per integrare il finanziamento pubblico</strong></p>
<p>💡 <strong>Come un bravo pasticcere, il CIPESS deve bilanciare gli ingredienti per ottenere il risultato migliore!</strong> 🎂</p>
<hr>
</section>
<section id="mescolare-e-cuocere-coordinamento-tra-i-fondi" class="level2" data-number="5.3">
<h2 data-number="5.3" class="anchored" data-anchor-id="mescolare-e-cuocere-coordinamento-tra-i-fondi"><span class="header-section-number">5.3</span> <strong>📌 3. Mescolare e Cuocere (Coordinamento tra i Fondi)</strong></h2>
<p>Una volta scelti gli ingredienti, bisogna <strong>gestire il processo di finanziamento</strong>, garantendo che tutto sia armonizzato.</p>
<p>✔️ <strong>Il CIPESS (Pasticcere)</strong> decide come distribuire i fondi FSC per complementare FESR e PNRR.<br>
✔️ <strong>Il MEF (forno)</strong> garantisce che i fondi siano erogati rispettando i vincoli di bilancio.<br>
✔️ <strong>Le Regioni (assistenti in cucina)</strong> applicano le misure sui territori attraverso i Programmi Operativi (POR).<br>
✔️ <strong>Gli Enti Attuatori (operatori di pasticceria)</strong> devono seguire le regole di attuazione e rendicontazione.</p>
<p>📌 <strong>Esempio</strong>: Se una Regione vuole avviare una misura per l’economia circolare, il CIPESS deve: - Verificare che il FSC sia complementare ai fondi FESR. - Definire come il PNRR può accelerare i progetti. - Assicurarsi che le Regioni possano cofinanziare la misura con risorse locali.</p>
<p>💡 <strong>Senza un buon coordinamento, la torta può bruciarsi o avere un sapore sbagliato!</strong> 🔥🍰</p>
<hr>
</section>
<section id="servire-la-torta-erogazione-dei-fondi-e-attuazione-della-misura" class="level2" data-number="5.4">
<h2 data-number="5.4" class="anchored" data-anchor-id="servire-la-torta-erogazione-dei-fondi-e-attuazione-della-misura"><span class="header-section-number">5.4</span> <strong>📌 4. Servire la Torta (Erogazione dei Fondi e Attuazione della Misura)</strong></h2>
<p>Dopo aver <strong>preparato e cotto</strong> la misura, è il momento di <strong>distribuire le risorse ai beneficiari</strong>.</p>
<p>✔️ <strong>Le imprese e gli enti pubblici ricevono i fondi</strong> per realizzare i progetti.<br>
✔️ <strong>Il monitoraggio verifica che i fondi vengano spesi correttamente</strong>.<br>
✔️ <strong>Se qualcosa va storto, si corregge la ricetta per i prossimi anni!</strong></p>
<p>📌 <strong>Esempio</strong>: Se un bando per le PMI ha meno richieste del previsto, si possono aggiustare gli incentivi o semplificare l’accesso ai fondi.</p>
<p>💡 <strong>Una torta ben fatta soddisfa tutti: imprese, cittadini e istituzioni!</strong> 🎂✅</p>
<hr>
</section>
<section id="conclusione-6" class="level2" data-number="5.5">
<h2 data-number="5.5" class="anchored" data-anchor-id="conclusione-6"><span class="header-section-number">5.5</span> <strong>📌 Conclusione</strong></h2>
<p>✔️ <strong>La misura è la torta</strong>, il risultato finale che deve essere ben bilanciato.<br>
✔️ <strong>I fondi sono gli ingredienti</strong>, che devono essere dosati con attenzione per ottenere un impatto efficace.<br>
✔️ <strong>Il CIPESS è il pasticcere</strong>, che coordina e armonizza le risorse per evitare sprechi e inefficienze.</p>
<p>👉 <strong>Vuoi che crei un diagramma per rappresentare graficamente questa metafora?</strong> 🚀🍰</p>


</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Aiuti</category>
  <category>RNA</category>
  <category>Coesione</category>
  <guid>https://paolovolterra.com/posts/2518_FSC/FSC.html</guid>
  <pubDate>Thu, 06 Feb 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Obsidian</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2516_Obsidian/20250202_Obsidian.html</link>
  <description><![CDATA[ 




<section id="temi-belli" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="temi-belli"><span class="header-section-number">1</span> Temi belli</h2>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2516_Obsidian/media/ITS-Theme.png" class="img-fluid figure-img"></p>
<figcaption>ITS-Theme.png</figcaption>
</figure>
</div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2516_Obsidian/media/Primary.png" class="img-fluid figure-img"></p>
<figcaption>Primary.png</figcaption>
</figure>
</div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2516_Obsidian/media/Shimmering.png" class="img-fluid figure-img"></p>
<figcaption>Shimmering.png</figcaption>
</figure>
</div>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Obsidian</category>
  <guid>https://paolovolterra.com/posts/2516_Obsidian/20250202_Obsidian.html</guid>
  <pubDate>Sat, 01 Feb 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Utilizzare Quarto</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2515_Quarto/Quarto.html</link>
  <description><![CDATA[ 




<p><img src="https://quarto.org/quarto.png" class="img-fluid"></p>
<section id="quarto-cosè-e-a-cosa-serve" class="level3" data-number="0.0.1">
<h3 data-number="0.0.1" class="anchored" data-anchor-id="quarto-cosè-e-a-cosa-serve"><span class="header-section-number">0.0.1</span> <strong>Quarto: Cos’è e a cosa serve?</strong></h3>
<p><strong>Quarto</strong> è un sistema open-source per la creazione di documenti dinamici, report scientifici, presentazioni, siti web e libri utilizzando <strong>Markdown avanzato</strong> e <strong>blocco di codice eseguibile</strong>. È il successore di <strong>R Markdown</strong> ed è progettato per essere indipendente dal linguaggio di programmazione, supportando <strong>Python, R, Julia e ObservableJS</strong>.</p>
<hr>
</section>
<section id="funzionalità-principali-di-quarto" class="level2" data-number="0.1">
<h2 data-number="0.1" class="anchored" data-anchor-id="funzionalità-principali-di-quarto"><span class="header-section-number">0.1</span> <strong>🛠️ Funzionalità principali di Quarto</strong></h2>
<ol type="1">
<li><strong>Markdown Esteso (<code>.qmd</code>)</strong>
<ul>
<li>Basato su Markdown, ma con supporto per codice eseguibile.</li>
<li>Include funzionalità avanzate come <strong>bibliografie, LaTeX, cross-referencing</strong>.</li>
</ul></li>
<li><strong>Esecuzione di codice (Python, R, Julia, ObservableJS)</strong>
<ul>
<li>Permette di integrare ed eseguire codice all’interno di un documento.<br>
</li>
<li>L’output (grafici, tabelle, statistiche) viene incluso automaticamente.</li>
</ul></li>
<li><strong>Supporto per più formati di output</strong>
<ul>
<li>📄 <strong>HTML</strong> (per blog, siti web, dashboard)<br>
</li>
<li>📊 <strong>PDF</strong> (con LaTeX)<br>
</li>
<li>📜 <strong>Word</strong><br>
</li>
<li>🎞 <strong>Presentazioni</strong> (PowerPoint, Reveal.js, Beamer)<br>
</li>
<li>📚 <strong>Libri e documentazione</strong></li>
</ul></li>
<li><strong>Interattività</strong>
<ul>
<li>Supporta <strong>Shiny, ObservableJS e widgets interattivi</strong>.</li>
<li>Perfetto per <strong>dashboard dinamiche</strong> e documenti interattivi.</li>
</ul></li>
<li><strong>Automazione e Reproducibility</strong>
<ul>
<li>Può essere utilizzato in <strong>Data Science e Finanza</strong> per report aggiornabili in automatico.</li>
<li>Perfetto per <strong>analisi economiche, finanziarie e report aziendali</strong>.</li>
</ul></li>
<li><strong>Gestione YAML per configurazione avanzata</strong>
<ul>
<li>Consente di definire <strong>metadati, opzioni di rendering e layout</strong>.</li>
</ul></li>
</ol>
<hr>
</section>
<section id="differenza-tra-quarto-e-jupyter-notebook" class="level2" data-number="0.2">
<h2 data-number="0.2" class="anchored" data-anchor-id="differenza-tra-quarto-e-jupyter-notebook"><span class="header-section-number">0.2</span> <strong>📌 Differenza tra Quarto e Jupyter Notebook</strong></h2>
<table class="caption-top table">
<colgroup>
<col style="width: 28%">
<col style="width: 43%">
<col style="width: 28%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Caratteristica</strong></th>
<th><strong>Jupyter Notebook (<code>.ipynb</code>)</strong></th>
<th><strong>Quarto (<code>.qmd</code>)</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Formato file</strong></td>
<td>JSON con codice e output</td>
<td>Markdown + codice eseguibile</td>
</tr>
<tr class="even">
<td><strong>Modificabile con Git</strong></td>
<td>Difficile da versionare</td>
<td>Facile da usare con Git</td>
</tr>
<tr class="odd">
<td><strong>Output</strong></td>
<td>Solo interattivo</td>
<td>HTML, PDF, Word, PPT, ecc.</td>
</tr>
<tr class="even">
<td><strong>Uso ideale</strong></td>
<td>Data Science esplorativa</td>
<td>Report, articoli scientifici, presentazioni</td>
</tr>
</tbody>
</table>
<hr>
</section>
<section id="come-installare-quarto" class="level2" data-number="0.3">
<h2 data-number="0.3" class="anchored" data-anchor-id="come-installare-quarto"><span class="header-section-number">0.3</span> <strong>🖥️ Come installare Quarto</strong></h2>
<p>Puoi installarlo con:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Per Windows, Mac e Linux</span></span>
<span id="cb1-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">https://quarto.org/docs/get-started/</span></span></code></pre></div></div>
<p>Oppure, se usi Conda:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">conda</span> install <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-c</span> conda-forge quarto</span></code></pre></div></div>
<p>Esegui un test con:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb3-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">quarto</span> check</span></code></pre></div></div>
</section>
<section id="quarto-usa-qmd-e-non-md" class="level2" data-number="0.4">
<h2 data-number="0.4" class="anchored" data-anchor-id="quarto-usa-qmd-e-non-md"><span class="header-section-number">0.4</span> Quarto usa qmd e non md</h2>
<ul>
<li><strong><code>.md</code></strong> è un file Markdown tradizionale, usato principalmente per documentazione semplice.</li>
<li><strong><code>.qmd</code></strong> è un file Markdown esteso per <strong>Quarto</strong>, che permette di eseguire codice, generare report interattivi e produrre output in più formati.</li>
</ul>
<p>Ecco la tabella completa con le differenze tra <strong><code>.md</code></strong> e <strong><code>.qmd</code></strong>:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 27%">
<col style="width: 36%">
<col style="width: 36%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Caratteristica</strong></th>
<th><strong>.md (Markdown)</strong></th>
<th><strong>.qmd (Quarto Markdown)</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Linguaggio base</strong></td>
<td>Markdown standard</td>
<td>Markdown con estensioni per Quarto</td>
</tr>
<tr class="even">
<td><strong>Obiettivo</strong></td>
<td>Formattazione di testo semplice, spesso usato per documentazione, README, blog</td>
<td>Creazione di documenti scientifici, report interattivi, presentazioni</td>
</tr>
<tr class="odd">
<td><strong>Supporto per codice</strong></td>
<td>Supporta solo evidenziazione del codice con ``<code>| Supporta blocchi di codice eseguibili (Python, R, Julia, ecc.) | | **Esecuzione di codice** | No, solo visualizzazione | Sì, può eseguire codice e mostrare output | | **Supporto YAML**      | Facoltativo (usato per metadata in alcuni casi) | Sì, il front matter YAML è essenziale per la configurazione | | **Compilazione**       | Non necessita di compilazione, può essere letto direttamente | Necessita di</code>quarto render` per generare output in HTML, PDF, Word, ecc.</td>
<td></td>
</tr>
<tr class="even">
<td><strong>Funzionalità avanzate</strong></td>
<td>Markdown standard</td>
<td>Supporta LaTeX, bibliografie, cross-referencing, interattività con Shiny, ObservableJS</td>
</tr>
</tbody>
</table>
<hr>
</section>
<section id="quando-usare-quarto" class="level2" data-number="0.5">
<h2 data-number="0.5" class="anchored" data-anchor-id="quando-usare-quarto"><span class="header-section-number">0.5</span> <strong>📌 Quando usare Quarto?</strong></h2>
<ul>
<li>Per <strong>report finanziari e analisi economiche</strong> (può integrare dati aggiornati automaticamente).</li>
<li>Per <strong>presentazioni su innovazione e AI</strong> (come il tuo intervento all’OPEN INNOVATION SUMMIT 2024).</li>
<li>Per creare <strong>documentazione bancaria e normativa</strong> con output in PDF, HTML o Word.</li>
</ul>
<hr>
</section>
<section id="finalità" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Finalità</h1>
<ul>
<li>creare
<ul>
<li>progetti</li>
<li><a href="https://quarto.org/docs/presentations/">presentazioni</a></li>
<li><a href="https://quarto.org/docs/websites/">siti</a></li>
<li><a href="">blog</a></li>
<li><a href="https://quarto.org/docs/books/">libri</a></li>
<li><a href="https://quarto.org/docs/manuscripts/">manoscritti</a></li>
<li>dashboard</li>
<li>documenti <a href="https://quarto.org/docs/publishing/confluence.html">confluence</a> condivisi</li>
</ul></li>
<li>inserire codice <strong>Python</strong> (<code>python</code>) ,<strong>R</strong> (<code>r</code>), <strong>Julia</strong> (<code>julia</code>), <strong>Observable JavaScript</strong> (<code>ojs</code>), <strong>Bash</strong>, <strong>C</strong>, <strong>C++</strong>, <strong>SQL</strong>, <strong>Stan</strong>,, <strong>Fortran</strong> e altri, se installi i kernel appropriati</li>
<li><a href="https://quarto.org/docs/publishing/">pubblicare</a> i risultati su <a href="https://quartopub.com/">Quarto Pub</a> (serve login; questo è il <a href="https://paolovolterra.quarto.pub/">mio</a>), <a href="https://github.com/">github</a> (serve login, configurazione e <a href="https://git-scm.com/">GIT</a>; questo è il <a href="https://paolovolterra.com/">mio</a> ), <a href="https://gohugo.io/">Hugo</a>, ecC. ogni sito ha proprie modalità per interfacciarsi e pubblicare; occorre studiarsele.</li>
</ul>
</section>
<section id="come" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> come</h1>
<p>Il progetto si può creare da terminale, con RStudio, VSCode, Positron, PCharm, ecc. Si può fare tutto anche con notepad e terminale Da terminale però si capisce meglio cosa succede “sotto il cofano”: - entri in una cartella dedicata e scrivi <code>quarto create project</code> - il prompt guida la scelta per indicare - il tipo di progetto, - la sottocartella dove inserire il tutto, - il titolo del progetto, - l’IDE da utilizzare</p>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131193127.png" class="img-fluid"></p>
<p>Il progetto più semplice è default o manuscript Ci sono poi altri tipi di progetto che non sono riportati nella scelta da terminale: - dashboard - presentationi <a href="https://quarto.org/docs/presentations/revealjs/">reveal.js</a>&nbsp;(HTML), &nbsp;<a href="https://quarto.org/docs/presentations/powerpoint.html">PowerPoint</a>&nbsp;(MS Office), &nbsp;<a href="https://quarto.org/docs/presentations/beamer.html">Beamer</a>&nbsp;(LaTeX/PDF) - …</p>
<p>A questo punto Quarto costruisce la struttura del progetto, in base al tipo di progEtto selezionato - se si sceglie <code>default</code> Quarto costruisce 2 soli file <strong>principali</strong> - <strong><code>_quarto.yml</code></strong> → File di configurazione generale del progetto - <strong>File <code>.qmd</code></strong> → Documento principale (di norma <code>index.qmd</code>)</p>
<p>Negli altri casi costruisce file utili al caso - per manuscript <code>references.bib</code> - per site <code>about.qmd, style.css</code></p>
<pre class="{bash}"><code>tree /F

D:.
├───manoscritto
│       _quarto.yml
│       index.qmd
│       references.bib
│
├───sito prova
│       _quarto.yml
│       index.qmd
│       about.qmd
│       styles.css
│
└───default
        _quarto.yml
        prova.qmd
</code></pre>
<p>Per il preview scrivo <code>quarto preview</code> da terminal Per il rendering scrivo <code>quarto render</code> da terminal</p>
<p>Quarto costruirà prima la struttura di output (cartelle e files) e poi mostrerà l’output su browser. La cartella di output inizia con <code>_</code> (es.: _manuscript _site) La porta è random ma può essere settata inserendo le informazioni nel preambolo YAML del .qmd Anche la dir di output può essere settata.</p>
<pre class="{bash}"><code>
# esempio per manuscript

project:
  type: manuscript
  preview:
    port: 4200
    browser: false</code></pre>
<p>Questo è il risultato:</p>
<pre class="{bash}"><code>tree /F

D:.
├───manoscritto
│   │   _quarto.yml
│   │   index.qmd
│   │   references.bib
│   │   styles.scss
│   │   MCC.css
│   │   styles.css
│   │
│   ├───.quarto
│   │   ├───preview
│   │   │       lock
│   │   │
│   │   ├───xref
│   │   │       INDEX
│   │   │       2f91f2fd
│   │   │       550746bb
│   │   │       3f709881
│   │   │       4d0e549a
│   │   │
│   │   └───idx
│   └───_manuscript
│       │   index.html
│       │   index.docx
│       │
│       └───site_libs
│           ├───clipboard
│           │       clipboard.min.js
│           │
│           ├───quarto-html
│           │       quarto.js
│           │       popper.min.js
│           │       tippy.umd.min.js
│           │       anchor.min.js
│           │       tippy.css
│           │       quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css
│           │
│           └───bootstrap
│                   bootstrap.min.js
│                   bootstrap-icons.css
│                   bootstrap-a1ff8711b79ae3724c050874b28d9907.min.css
│                   bootstrap-icons.woff
│
├───sito prova
│       _quarto.yml
│       index.qmd
│       about.qmd
│       styles.css
│       MCC.css
│       styles.scss
│
├───default
│       _quarto.yml
│       prova.qmd
│       styles.scss
│       MCC.css
│       styles.css
│
└───mybook
    │   _quarto.yml
    │   index.qmd
    │   intro.qmd
    │   summary.qmd
    │   references.qmd
    │   cover.png
    │   references.bib
    │   styles.scss
    │   MCC.css
    │   styles.css
    │
    ├───.quarto
    │   ├───preview
    │   │       lock
    │   │
    │   ├───idx
    │   │       index.qmd.json
    │   │       intro.qmd.json
    │   │       summary.qmd.json
    │   │       references.qmd.json
    │   │
    │   ├───xref
    │   │       INDEX
    │   │       d7202488
    │   │       5f634940
    │   │       e68c4dcb
    │   │       1066ac5e
    │   │
    │   └───cites
    │           index.json
    │
    └───_book
        │   index.html
        │   intro.html
        │   search.json
        │   summary.html
        │   references.html
        │
        └───site_libs
            ├───quarto-nav
            │       quarto-nav.js
            │       headroom.min.js
            │
            ├───clipboard
            │       clipboard.min.js
            │
            ├───quarto-search
            │       autocomplete.umd.js
            │       fuse.min.js
            │       quarto-search.js
            │
            ├───quarto-html
            │       quarto.js
            │       popper.min.js
            │       tippy.umd.min.js
            │       anchor.min.js
            │       tippy.css
            │       quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css
            │
            └───bootstrap
                    bootstrap.min.js
                    bootstrap-icons.css
                    bootstrap-icons.woff
                    bootstrap-8da5b4427184b79ecddefad3d342027e.min.css</code></pre>
</section>
<section id="personalizzazione" class="level1" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> Personalizzazione</h1>
<p>il link al css va in <code>_quarto.yml</code></p>
<hr>
</section>
<section id="tipi-di-progetto" class="level1" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> tipi di progetto</h1>
<section id="default" class="level2" data-number="4.1">
<h2 data-number="4.1" class="anchored" data-anchor-id="default"><span class="header-section-number">4.1</span> default</h2>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131192626.png" class="img-fluid"> <img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131192930.png" class="img-fluid"></p>
</section>
<section id="presentazione" class="level2" data-number="4.2">
<h2 data-number="4.2" class="anchored" data-anchor-id="presentazione"><span class="header-section-number">4.2</span> presentazione</h2>
</section>
<section id="manoscritto" class="level2" data-number="4.3">
<h2 data-number="4.3" class="anchored" data-anchor-id="manoscritto"><span class="header-section-number">4.3</span> manoscritto</h2>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131191238.png" class="img-fluid" alt="manoscritto"> <img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131192013.png" class="img-fluid"></p>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250201233334.png" class="img-fluid"></p>
</section>
<section id="sito" class="level2" data-number="4.4">
<h2 data-number="4.4" class="anchored" data-anchor-id="sito"><span class="header-section-number">4.4</span> Sito</h2>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131191811.png" class="img-fluid figure-img"></p>
<figcaption>sito</figcaption>
</figure>
</div>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131191927.png" class="img-fluid"></p>
</section>
<section id="libro" class="level2" data-number="4.5">
<h2 data-number="4.5" class="anchored" data-anchor-id="libro"><span class="header-section-number">4.5</span> libro</h2>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250201233255.png" class="img-fluid"></p>
</section>
<section id="dashboard" class="level2" data-number="4.6">
<h2 data-number="4.6" class="anchored" data-anchor-id="dashboard"><span class="header-section-number">4.6</span> dashboard</h2>
</section>
</section>
<section id="file-_quarto.yml" class="level1" data-number="5">
<h1 data-number="5"><span class="header-section-number">5</span> file _quarto.yml</h1>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131205407.png" class="img-fluid"></p>
</section>
<section id="file-.qmd" class="level1" data-number="6">
<h1 data-number="6"><span class="header-section-number">6</span> file .qmd</h1>
<p><img src="https://paolovolterra.com/posts/2515_Quarto/media/Pasted image 20250131205701.png" class="img-fluid"></p>
</section>
<section id="esempi-di-codice" class="level1" data-number="7">
<h1 data-number="7"><span class="header-section-number">7</span> Esempi di codice</h1>
<ul>
<li><strong>1️⃣ Python</strong></li>
</ul>
<p><code>```{python} import numpy as np print(np.array([1, 2, 3])) ```</code></p>
<ul>
<li><strong>2️⃣ R</strong></li>
</ul>
<p><code>```{r} summary(cars) ```</code></p>
<ul>
<li><strong>3️⃣ Julia</strong></li>
</ul>
<p><code>```{julia} using Statistics mean([1, 2, 3, 4, 5]) ```</code></p>
<ul>
<li><strong>4️⃣ Observable JavaScript</strong></li>
</ul>
<p><code>```{ojs} Plot.lineY([1, 2, 3, 4, 5]) ```</code></p>
<ul>
<li><strong>Esempio in Bash</strong></li>
</ul>
<p><code>```{bash} echo "Hello from Bash!" ```</code></p>
<ul>
<li><strong>Esempio in SQL</strong></li>
</ul>
<p><code>```{sql} SELECT * FROM my_table; ```</code></p>
</section>
<section id="siti-interessanti" class="level1" data-number="8">
<h1 data-number="8"><span class="header-section-number">8</span> Siti interessanti</h1>
<ul>
<li>https://ivelasq.quarto.pub/building-a-blog-with-quarto/lets-build-a-quarto-blog/</li>
<li>https://samanthacsik.github.io/posts/2022-10-24-quarto-blogs/</li>
<li>https://www.crumplab.com/blog/post_887_8_25_22_quartoblog/</li>
</ul>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Quarto</category>
  <guid>https://paolovolterra.com/posts/2515_Quarto/Quarto.html</guid>
  <pubDate>Thu, 30 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Difference-in-Differences e Propensity Score Matching</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2514_DidPsm/20250126_DidPsm.html</link>
  <description><![CDATA[ 




<p>Il Difference-in-Differences (DiD) e il Propensity Score Matching (PSM) sono due tecniche comuni di analisi causale.</p>
<p>Puoi combinarle o usarle separatamente per stimare gli effetti di un trattamento.</p>
<p>#DiD e #PSM sono frequentemente utilizzate negli studi sulle imprese per valutare gli effetti causali di interventi o politiche.</p>
<p>Queste tecniche sono applicate per isolare l’impatto di specifiche iniziative.</p>
<section id="difference-in-differences-did" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="difference-in-differences-did"><span class="header-section-number">1</span> Difference-in-Differences (DiD)</h2>
<p>Il DiD confronta l’andamento dei risultati tra un gruppo trattato e un gruppo di controllo prima e dopo un evento/treatment. I passi principali sono:</p>
<ul>
<li>Dividi i dati in gruppi trattati e di controllo.</li>
<li>Calcola le differenze nei risultati prima e dopo il trattamento per entrambi i gruppi.</li>
<li>La differenza di queste differenze rappresenta l’effetto del trattamento.</li>
</ul>
</section>
<section id="esempio-in-python" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="esempio-in-python"><span class="header-section-number">2</span> Esempio in Python</h2>
<p>Supponiamo di avere un dataset con le colonne group (trattato/controllo), time (pre/post), e outcome.</p>
<div id="ad39814c" class="cell" data-execution_count="1">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> statsmodels.api <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> sm</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> statsmodels.formula.api <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> smf</span>
<span id="cb1-4"></span>
<span id="cb1-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Dataset simulato</span></span>
<span id="cb1-6">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame({</span>
<span id="cb1-7">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'group'</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>],</span>
<span id="cb1-8">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'time'</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>],</span>
<span id="cb1-9">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'outcome'</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>]</span>
<span id="cb1-10">})</span>
<span id="cb1-11"></span>
<span id="cb1-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiunta interazione trattato-tempo</span></span>
<span id="cb1-13">data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'group_time'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'group'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'time'</span>]</span>
<span id="cb1-14"></span>
<span id="cb1-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Regressione DiD</span></span>
<span id="cb1-16">model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> smf.ols(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'outcome ~ group + time + group_time'</span>, data<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>data).fit()</span>
<span id="cb1-17"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(model.summary())</span>
<span id="cb1-18"></span>
<span id="cb1-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Effetto del trattamento</span></span>
<span id="cb1-20">treatment_effect <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> model.params[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'group_time'</span>]</span>
<span id="cb1-21"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Effetto stimato del trattamento: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>treatment_effect<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>                            OLS Regression Results                            
==============================================================================
Dep. Variable:                outcome   R-squared:                       0.957
Model:                            OLS   Adj. R-squared:                  0.936
Method:                 Least Squares   F-statistic:                     44.66
Date:                Fri, 30 Oct 2026   Prob (F-statistic):           0.000169
Time:                        05:00:04   Log-Likelihood:                -11.494
No. Observations:                  10   AIC:                             30.99
Df Residuals:                       6   BIC:                             32.20
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P&gt;|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      5.6667      0.569      9.954      0.000       4.274       7.060
group         -0.6667      0.900     -0.741      0.487      -2.869       1.536
time           1.8333      0.900      2.037      0.088      -0.369       4.036
group_time     6.8333      1.273      5.368      0.002       3.719       9.948
==============================================================================
Omnibus:                        2.318   Durbin-Watson:                   1.829
Prob(Omnibus):                  0.314   Jarque-Bera (JB):                0.540
Skew:                          -0.549   Prob(JB):                        0.763
Kurtosis:                       3.302   Cond. No.                         7.01
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Effetto stimato del trattamento: 6.833333333333334</code></pre>
</div>
</div>
</section>
<section id="propensity-score-matching-psm" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="propensity-score-matching-psm"><span class="header-section-number">3</span> Propensity Score Matching (PSM)</h2>
<p>Il PSM abbina le unità trattate con quelle di controllo che hanno una probabilità simile di ricevere il trattamento, basata su variabili osservabili. È utile per ridurre il bias di selezione.</p>
<p>Esempio in Python Supponiamo di avere un dataset con le colonne treatment, outcome, e alcune variabili predittive (X1, X2).</p>
<div id="59578767" class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb3-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> sklearn.linear_model <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> LogisticRegression</span>
<span id="cb3-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> sklearn.neighbors <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> NearestNeighbors</span>
<span id="cb3-4"></span>
<span id="cb3-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Dataset simulato</span></span>
<span id="cb3-6">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame({</span>
<span id="cb3-7">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'treatment'</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>],</span>
<span id="cb3-8">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'outcome'</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>],</span>
<span id="cb3-9">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'X1'</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>],</span>
<span id="cb3-10">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'X2'</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>]</span>
<span id="cb3-11">})</span>
<span id="cb3-12"></span>
<span id="cb3-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcolo del propensity score</span></span>
<span id="cb3-14">X <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'X1'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'X2'</span>]]</span>
<span id="cb3-15">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'treatment'</span>]</span>
<span id="cb3-16">logit <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> LogisticRegression()</span>
<span id="cb3-17">data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'propensity_score'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logit.fit(X, y).predict_proba(X)[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb3-18"></span>
<span id="cb3-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Matching usando i Nearest Neighbors</span></span>
<span id="cb3-20">treated <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data[data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'treatment'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb3-21">control <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data[data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'treatment'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb3-22">nn <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> NearestNeighbors(n_neighbors<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb3-23">nn.fit(control[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'propensity_score'</span>]])</span>
<span id="cb3-24">distances, indices <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> nn.kneighbors(treated[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'propensity_score'</span>]])</span>
<span id="cb3-25"></span>
<span id="cb3-26"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Creazione del dataset abbinato</span></span>
<span id="cb3-27">matched_control <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> control.iloc[indices.flatten()].reset_index(drop<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb3-28">matched_treated <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> treated.reset_index(drop<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb3-29"></span>
<span id="cb3-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Unire i dati con suffissi</span></span>
<span id="cb3-31">matched_data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([matched_treated, matched_control], axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, keys<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"treated"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"control"</span>])</span>
<span id="cb3-32">matched_data.columns <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>col[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>col[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> col <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> matched_data.columns]</span>
<span id="cb3-33"></span>
<span id="cb3-34"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcolo della differenza negli outcome</span></span>
<span id="cb3-35">effect <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> matched_data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'treated_outcome'</span>].mean() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> matched_data[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'control_outcome'</span>].mean()</span>
<span id="cb3-36"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Effetto stimato del trattamento: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>effect<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>Effetto stimato del trattamento: 6.5</code></pre>
</div>
</div>
</section>
<section id="cosa-significa-6.5" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="cosa-significa-6.5"><span class="header-section-number">4</span> cosa significa 6.5?</h2>
<p>Quando il codice restituisce un valore come Effetto stimato del trattamento: 6.5, significa che l’effetto medio del trattamento (cioè la differenza media tra il gruppo trattato e il gruppo di controllo in termini di un determinato outcome) è pari a 6.5 unità</p>
<p>In termini pratici:</p>
<p>Il gruppo trattato ha ricevuto un trattamento o intervento specifico. Il gruppo di controllo non ha ricevuto il trattamento, ma viene utilizzato come punto di riferimento per capire cosa sarebbe successo al gruppo trattato in assenza del trattamento. 6.5 indica che, in media:</p>
<p>Il trattamento ha aumentato (o ridotto) l’outcome del gruppo trattato di 6.5 unità rispetto al gruppo di controllo. Un esempio pratico Supponiamo che tu stia valutando l’effetto di un programma di formazione aziendale sulla produttività dei dipendenti, e l’outcome misurato sia il numero di unità prodotte.</p>
<p>Il gruppo trattato (dipendenti che hanno partecipato al corso) ha una produttività media di 15 unità. Il gruppo di controllo (dipendenti che non hanno partecipato) ha una produttività media di 8.5 unità. L’effetto stimato del trattamento è:</p>
<p>15−8.5=6.5</p>
<p>L’intervento ha aumentato la produttività di 6.5 unità, in media.</p>
<p>##Limiti e considerazioni - Causalità: L’effetto stimato assume che tutti i bias di selezione e le - differenze osservabili/non osservabili tra i due gruppi siano correttamente - gestiti (ad esempio, con il Propensity Score Matching o un disegno - sperimentale ben fatto). - Significatività statistica: È importante verificare se l’effetto stimato è - statisticamente significativo (es. con un test statistico). - Unità di misura: Assicurati che il risultato sia chiaro in termini dell’outcome misurato (es. unità prodotte, reddito, vendite, ecc.).</p>
</section>
<section id="librerie-utili" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="librerie-utili"><span class="header-section-number">5</span> Librerie utili:</h2>
<ul>
<li>statsmodels: Per la regressione del DiD.</li>
<li>sklearn: Per calcolare il propensity score e abbinare i dati.</li>
<li>causalinference: Per analisi causali.</li>
<li>econml: Per metodi avanzati di stima degli effetti causali.</li>
</ul>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Statistica</category>
  <category>Python</category>
  <guid>https://paolovolterra.com/posts/2514_DidPsm/20250126_DidPsm.html</guid>
  <pubDate>Sat, 25 Jan 2025 23:00:00 GMT</pubDate>
  <media:content url="https://paolovolterra.com/posts/2514_DidPsm/media/DidPsm.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>io e noi</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2513_IoNoi/20250126_Noi.html</link>
  <description><![CDATA[ 




<section id="linguaggio-nella-leadership-il-valore-del-noi" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Linguaggio nella Leadership: Il Valore del “Noi”</h1>
<p><img src="https://paolovolterra.com/posts/2513_IoNoi/media/ioNoi.webp" class="img-fluid"></p>
<p>La leadership è un’arte complessa che coinvolge molti aspetti, tra cui la capacità di comunicare efficacemente. Una delle scelte più rilevanti e spesso sottovalutate è il linguaggio che i leader utilizzano nel rapportarsi con il proprio team. La differenza tra parlare in prima persona singolare (“Io”) e in prima persona plurale (“Noi”) può sembrare sottile, ma ha implicazioni profonde sul modo in cui un team percepisce il proprio leader, il senso di appartenenza e la motivazione collettiva. Questa riflessione trova analogie significative anche nel mondo dello sport, dove allenatori e capitani utilizzano strategie comunicative simili per motivare i loro giocatori e costruire squadre vincenti.</p>
<section id="limportanza-del-linguaggio-nella-leadership-il-valore-del-noi" class="level2" data-number="1.1">
<h2 data-number="1.1" class="anchored" data-anchor-id="limportanza-del-linguaggio-nella-leadership-il-valore-del-noi"><span class="header-section-number">1.1</span> L’importanza del linguaggio nella leadership: il valore del “noi”</h2>
<p>La comunicazione è un elemento cruciale nella leadership, poiché le parole e il linguaggio utilizzati dai leader possono influenzare profondamente il clima lavorativo, la motivazione del team e il raggiungimento degli obiettivi. In questo contesto, l’uso di un linguaggio inclusivo e collaborativo, che enfatizza il concetto di “noi”, gioca un ruolo fondamentale.</p>
<section id="il-potere-delle-parole" class="level3" data-number="1.1.1">
<h3 data-number="1.1.1" class="anchored" data-anchor-id="il-potere-delle-parole"><span class="header-section-number">1.1.1</span> <strong>Il potere delle parole</strong></h3>
<p>Le parole non sono solo strumenti di comunicazione; esse hanno il potere di <strong>guidare, ispirare e unire</strong>. Un leader deve essere consapevole dell’impatto che le sue parole possono avere sui membri del team. Utilizzare termini che promuovono un senso di appartenenza e inclusione contribuisce a creare un ambiente di lavoro positivo e coeso[2][3][9]. Come affermato da Livio Zingarelli, “le parole determinano il modo con cui ci relazioniamo con gli altri” e possono contribuire a costruire empatia o, al contrario, generare divisione[2].</p>
</section>
<section id="comunicazione-efficace-e-inclusiva" class="level3" data-number="1.1.2">
<h3 data-number="1.1.2" class="anchored" data-anchor-id="comunicazione-efficace-e-inclusiva"><span class="header-section-number">1.1.2</span> <strong>Comunicazione efficace e inclusiva</strong></h3>
<p>La comunicazione efficace è una competenza fondamentale per i leader, specialmente in contesti internazionali o diversificati. Essa richiede non solo chiarezza e ascolto attivo, ma anche la capacità di adattare il proprio stile comunicativo per rispondere alle esigenze del team[1][9]. L’adozione di un linguaggio inclusivo è essenziale per garantire che tutti i membri si sentano valorizzati e coinvolti. Questo tipo di linguaggio non solo promuove la diversità, ma favorisce anche un ambiente in cui le idee possono essere condivise liberamente[6][8].</p>
</section>
<section id="costruire-fiducia-attraverso-la-comunicazione" class="level3" data-number="1.1.3">
<h3 data-number="1.1.3" class="anchored" data-anchor-id="costruire-fiducia-attraverso-la-comunicazione"><span class="header-section-number">1.1.3</span> <strong>Costruire fiducia attraverso la comunicazione</strong></h3>
<p>Per costruire fiducia all’interno di un team, i leader devono utilizzare un linguaggio che incoraggi la partecipazione e l’apertura. La persuasione attraverso le parole è spesso più efficace del comando diretto; descrivere una visione condivisa aiuta a motivare e coinvolgere i membri del team[5][7]. Inoltre, il dialogo aperto permette ai leader di comprendere meglio le esigenze e le preoccupazioni dei loro collaboratori, creando così una dinamica di squadra più forte[4][9].</p>
</section>
<section id="conclusione" class="level3" data-number="1.1.4">
<h3 data-number="1.1.4" class="anchored" data-anchor-id="conclusione"><span class="header-section-number">1.1.4</span> <strong>Conclusione</strong></h3>
<p>L’importanza del linguaggio nella leadership non può essere sottovalutata. Utilizzare un linguaggio che enfatizzi il “noi” aiuta a costruire un ambiente di lavoro inclusivo e collaborativo. Le parole scelte con attenzione possono ispirare fiducia, motivazione e coesione all’interno del team, rendendo la leadership più efficace nel raggiungimento degli obiettivi comuni.</p>
<p>Citations: [1] https://www.speexx.com/it/speexx-blog/importanza-competenze-comunicative-leader-di-team-internazionali/ [2] https://www.ilsole24ore.com/art/la-forza-parole-linguaggio-costruire-ambienti-lavoro-inclusivi-AEIgTPQC [3] https://www.theleadershipforum.it/limportanza-delle-parole-per-un-leader/ [4] https://www.bottegafilosofica.net/sviluppo-personale/inclusione-e-dialogo-sono-una-necessita [5] https://www.teamworking.it/team-coaching/linguaggio-della-leadership/ [6] https://www.thinkwithgoogle.com/intl/it-it/futuro-del-marketing/management-e-cultura-aziendale/diversita-e-inclusione/benefici-linguaggio-inclusivo-in-italia/ [7] https://www.afcformazione.it/blog/7-vantaggi-della-leadership-comunicativa-e-come-usarla-per-motivare-il-vostro-team/ [8] https://blog.reverse.hr/linguaggio-inclusivo [9] https://andreamiriello.com/it/comunicazione-efficace-per-leader/</p>
</section>
</section>
<section id="il-linguaggio-del-noi-un-catalizzatore-per-il-successo-del-team" class="level2" data-number="1.2">
<h2 data-number="1.2" class="anchored" data-anchor-id="il-linguaggio-del-noi-un-catalizzatore-per-il-successo-del-team"><span class="header-section-number">1.2</span> Il Linguaggio del “Noi”: Un Catalizzatore per il Successo del Team</h2>
<p>Quando un manager o un leader utilizza il “noi” anziché l““io”, sta mandando un messaggio potente: il successo è frutto del lavoro collettivo e non di un singolo individuo. Questo approccio è particolarmente importante per costruire una cultura aziendale inclusiva e motivante. In un contesto lavorativo, il senso di appartenenza è uno dei principali fattori che determinano la soddisfazione dei dipendenti e la loro produttività. Studi psicologici e manageriali dimostrano che i dipendenti che si sentono parte di un team coeso sono più motivati e tendono a lavorare meglio rispetto a quelli che percepiscono il successo come una conquista esclusivamente individuale.</p>
</section>
<section id="il-linguaggio-del-noi-un-catalizzatore-per-il-successo-del-team-1" class="level2" data-number="1.3">
<h2 data-number="1.3" class="anchored" data-anchor-id="il-linguaggio-del-noi-un-catalizzatore-per-il-successo-del-team-1"><span class="header-section-number">1.3</span> Il linguaggio del “noi”: un catalizzatore per il successo del team</h2>
<p>L’uso di un linguaggio inclusivo, in particolare attraverso l’adozione di pronomi come “noi”, “ci” e “nostro”, è fondamentale per promuovere un senso di unità e uno scopo condiviso all’interno di un team. Questo approccio non solo favorisce la collaborazione, ma contribuisce anche a creare un ambiente di lavoro positivo e produttivo.</p>
<section id="benefici-del-linguaggio-inclusivo" class="level3" data-number="1.3.1">
<h3 data-number="1.3.1" class="anchored" data-anchor-id="benefici-del-linguaggio-inclusivo"><span class="header-section-number">1.3.1</span> <strong>Benefici del linguaggio inclusivo</strong></h3>
<ol type="1">
<li><p><strong>Senso di appartenenza</strong>: Utilizzare il linguaggio inclusivo aiuta i membri del team a sentirsi parte integrante di uno sforzo collettivo. Quando le persone percepiscono che il loro contributo è apprezzato e che stanno lavorando verso obiettivi comuni, la loro motivazione e il loro impegno aumentano[1][2].</p></li>
<li><p><strong>Collaborazione interfunzionale</strong>: Un linguaggio che enfatizza il “noi” rompe i silos tra i reparti, incoraggiando la comunicazione aperta e la condivisione di idee tra membri con background diversi. Questo porta a una maggiore innovazione e creatività nel problem solving[1][4].</p></li>
<li><p><strong>Miglioramento delle performance</strong>: Le aziende che adottano un linguaggio inclusivo hanno riportato aumenti significativi nella performance del team, nella qualità delle decisioni e nei tassi di collaborazione. Ad esempio, si è osservato un incremento del 17% nella performance dei team e del 29% nei tassi di collaborazione[2][3].</p></li>
</ol>
</section>
<section id="strategie-per-implementare-il-linguaggio-inclusivo" class="level3" data-number="1.3.2">
<h3 data-number="1.3.2" class="anchored" data-anchor-id="strategie-per-implementare-il-linguaggio-inclusivo"><span class="header-section-number">1.3.2</span> <strong>Strategie per implementare il linguaggio inclusivo</strong></h3>
<ul>
<li><p><strong>Formazione continua</strong>: Offrire seminari e workshop sul linguaggio inclusivo per sensibilizzare i dipendenti sull’importanza di una comunicazione rispettosa e accogliente[4][6].</p></li>
<li><p><strong>Politiche di reclutamento</strong>: Utilizzare un linguaggio neutro durante il processo di selezione per attrarre una gamma più ampia di candidati, garantendo così diversità nel team[4][5].</p></li>
<li><p><strong>Feedback regolare</strong>: Condurre sondaggi e interviste per monitorare la soddisfazione dei dipendenti e identificare aree di miglioramento nella comunicazione interna[4].</p></li>
</ul>
</section>
<section id="conclusione-1" class="level3" data-number="1.3.3">
<h3 data-number="1.3.3" class="anchored" data-anchor-id="conclusione-1"><span class="header-section-number">1.3.3</span> <strong>Conclusione</strong></h3>
<p>In sintesi, il linguaggio del “noi” non è solo una questione di stile comunicativo, ma rappresenta un catalizzatore per il successo del team. Promuovendo un linguaggio inclusivo, le organizzazioni possono creare un ambiente in cui tutti i membri si sentono valorizzati e motivati a contribuire al raggiungimento degli obiettivi comuni. Questo approccio non solo migliora le performance aziendali, ma favorisce anche un clima di lavoro armonioso e produttivo.</p>
<p>Citations: [1] https://okrinstitute.org/it/does-your-team-feel-like-a-family/ [2] https://it.wyser-search.com/knowledge-center/il-linguaggio-inclusivo-in-azienda-consigli/ [3] https://www.parklab.eu/stories/il-linguaggio-inclusivo-in-azienda-perche-e-importante-e-come-utilizzarlo/ [4] https://www.iagica.it/2024/08/01/costruire-un-team-efficace-e-inclusivo/ [5] https://www.sitebysite.it/stories/digital-strategy/comunicare-con-un-linguaggio-inclusivo-cosa-significa-e-come-applicarlo/ [6] https://www.babbelforbusiness.com/it/blog/linguaggio-inclusivo/ [7] https://blog.reverse.hr/linguaggio-inclusivo [8] https://www.thinkwithgoogle.com/intl/it-it/futuro-del-marketing/management-e-cultura-aziendale/diversita-e-inclusione/benefici-linguaggio-inclusivo-in-italia/</p>
</section>
</section>
<section id="limpatto-del-linguaggio-sul-team" class="level2" data-number="1.4">
<h2 data-number="1.4" class="anchored" data-anchor-id="limpatto-del-linguaggio-sul-team"><span class="header-section-number">1.4</span> L’Impatto del Linguaggio sul Team</h2>
<p>Parlare al plurale ha un impatto diretto su come i membri del team percepiscono il proprio ruolo e la propria importanza all’interno del gruppo. Quando un leader dice: “Abbiamo raggiunto questo obiettivo”, ogni membro si sente riconosciuto e valorizzato. Questo approccio ha diversi vantaggi:</p>
<p>Incremento della coesione: I membri del team sentono di far parte di qualcosa di più grande di loro stessi, il che rafforza i legami interpersonali.</p>
<p>Motivazione collettiva: I successi condivisi generano entusiasmo e desiderio di raggiungere ulteriori traguardi.</p>
<p>Responsabilità condivisa: Quando le responsabilità e i successi sono percepiti come collettivi, i membri sono più propensi a collaborare e ad aiutarsi reciprocamente.</p>
</section>
<section id="il-caso-opposto-il-linguaggio-del-io" class="level2" data-number="1.5">
<h2 data-number="1.5" class="anchored" data-anchor-id="il-caso-opposto-il-linguaggio-del-io"><span class="header-section-number">1.5</span> Il Caso Opposto: Il Linguaggio del “Io”</h2>
<p>Al contrario, quando un leader usa prevalentemente il “Io” (“Io ho deciso”, “Io ho raggiunto”), il messaggio implicito è che il merito è solo suo. Questo può generare malcontento e demotivazione all’interno del team, portando a:</p>
<p>Frustrazione: I membri del team possono sentirsi ignorati o non apprezzati per il loro contributo.</p>
<p>Perdita di fiducia: Un leader che si prende tutto il merito rischia di alienare i propri collaboratori.</p>
<p>Riduzione della produttività: Senza un senso di appartenenza, i membri del team possono essere meno motivati a impegnarsi al massimo.</p>
</section>
<section id="lesempio-del-mister-nel-calcio" class="level2" data-number="1.6">
<h2 data-number="1.6" class="anchored" data-anchor-id="lesempio-del-mister-nel-calcio"><span class="header-section-number">1.6</span> L’Esempio del Mister nel Calcio</h2>
<p>Il mondo dello sport è una metafora perfetta per comprendere l’importanza del linguaggio nella leadership. Gli allenatori di successo raramente si prendono il merito delle vittorie. Al contrario, utilizzano il “noi” per sottolineare che ogni vittoria è il risultato di uno sforzo collettivo. Allenatori come Carlo Ancelotti, Jürgen Klopp o Pep Guardiola sono noti per attribuire i successi ai loro giocatori, sottolineando il lavoro di squadra e il contributo di ciascun membro.</p>
<p>Questa strategia non è solo una questione di umiltà: è un modo per rafforzare la coesione del gruppo e mantenere alta la motivazione. Un allenatore che si prende il merito delle vittorie rischia di perdere il rispetto e la fiducia dei suoi giocatori, mentre chi riconosce il valore del team crea un ambiente in cui tutti si sentono protagonisti.</p>
</section>
<section id="lesempio-del-mister-nel-calcio-1" class="level2" data-number="1.7">
<h2 data-number="1.7" class="anchored" data-anchor-id="lesempio-del-mister-nel-calcio-1"><span class="header-section-number">1.7</span> L’esempio del Mister nel calcio</h2>
<p>Il termine “mister” è un appellativo affettuoso e rispettoso utilizzato per designare gli allenatori di calcio, che ha origini storiche significative. Questo soprannome è emerso in Italia nel 1912, grazie a William Garbutt, un allenatore inglese che ha rivoluzionato il calcio italiano e che ha introdotto nuove metodologie di allenamento e tattiche di gioco.</p>
<section id="origini-del-termine-mister" class="level3" data-number="1.7.1">
<h3 data-number="1.7.1" class="anchored" data-anchor-id="origini-del-termine-mister"><span class="header-section-number">1.7.1</span> <strong>Origini del termine “mister”</strong></h3>
<p>William Garbutt, il primo a essere chiamato “mister”, ha guidato il Genoa per circa 15 anni, apportando cambiamenti fondamentali nel modo di concepire il gioco. La sua attenzione all’aspetto tattico e alla preparazione fisica ha segnato l’inizio di una nuova era nel calcio italiano, trasformando la figura dell’allenatore in un professionista a tutto tondo[1]. Garbutt non solo ha innovato le tecniche di allenamento, ma ha anche contribuito a creare un’identità per l’allenatore come leader carismatico e stratega.</p>
</section>
<section id="il-ruolo-dellallenatore-come-leader" class="level3" data-number="1.7.2">
<h3 data-number="1.7.2" class="anchored" data-anchor-id="il-ruolo-dellallenatore-come-leader"><span class="header-section-number">1.7.2</span> <strong>Il ruolo dell’allenatore come leader</strong></h3>
<p>L’allenatore nel calcio non è solo un tecnico; egli svolge diverse funzioni che lo rendono una figura centrale all’interno della squadra. Tra le sue responsabilità vi sono:</p>
<ul>
<li><strong>Formazione e sviluppo</strong>: L’allenatore è incaricato di formare i giocatori, migliorando le loro abilità tecniche e tattiche.</li>
<li><strong>Motivazione</strong>: Deve saper motivare i membri del team, creando un ambiente positivo e stimolante.</li>
<li><strong>Gestione delle dinamiche di gruppo</strong>: È fondamentale per l’allenatore mantenere l’armonia all’interno della squadra, gestendo conflitti e promuovendo la cooperazione[2][3].</li>
</ul>
</section>
<section id="caratteristiche-di-un-buon-mister" class="level3" data-number="1.7.3">
<h3 data-number="1.7.3" class="anchored" data-anchor-id="caratteristiche-di-un-buon-mister"><span class="header-section-number">1.7.3</span> <strong>Caratteristiche di un buon “mister”</strong></h3>
<p>Un buon mister deve possedere diverse competenze e qualità:</p>
<ul>
<li><strong>Capacità comunicative</strong>: Essere in grado di comunicare in modo chiaro ed efficace con i giocatori.</li>
<li><strong>Leadership</strong>: Essere un modello da seguire, capace di ispirare fiducia e rispetto.</li>
<li><strong>Intelligenza emotiva</strong>: Comprendere le emozioni dei giocatori e saper gestire situazioni delicate[4][5].</li>
</ul>
</section>
<section id="conclusione-2" class="level3" data-number="1.7.4">
<h3 data-number="1.7.4" class="anchored" data-anchor-id="conclusione-2"><span class="header-section-number">1.7.4</span> <strong>Conclusione</strong></h3>
<p>La figura del mister nel calcio rappresenta un esempio emblematico di come il linguaggio e il ruolo dell’allenatore possano influenzare il successo di una squadra. Attraverso l’uso del termine “mister”, si sottolinea non solo il rispetto verso l’allenatore, ma anche la sua importanza come leader strategico capace di guidare il gruppo verso obiettivi comuni. La storia di William Garbutt e la sua eredità continuano a vivere nel modo in cui gli allenatori sono percepiti e rispettati nel mondo del calcio.</p>
<p>Citations: [1] https://sapere.virgilio.it/rubriche/perche-allenatori-calcio-si-chiamano-mister-5992 [2] https://www.calzetti-mariucci.it/articoli/lallenatore-nel-calcio-giovanile-leadership-e-inte [3] https://www.igeacps.it/il-ruolo-e-le-funzioni-dellallenatore-sportivo/ [4] https://it.wikipedia.org/wiki/Allenatore [5] https://www.olimpiacastello.it/il-ruolo-dellallenatore-nel-calcio-italiano [6] https://golee.it/le-chiavi-del-ruolo-compiti-dellallenatore-di-una-asd/ [7] https://www.football.ch/it/portaldata/27/Resources/Dokumente/Trainer/IT/Istruzione_e_formazione/00_corso_animatore/02_i_TH_Corso_animatore_Essere_allenatore.pdf [8] https://www.youcoach.it/articolo/il-ruolo-dellallenatore-di-successo-caratteristiche-e-dati-interessanti</p>
<hr>
</section>
</section>
<section id="un-approccio-equilibrato" class="level2" data-number="1.8">
<h2 data-number="1.8" class="anchored" data-anchor-id="un-approccio-equilibrato"><span class="header-section-number">1.8</span> Un Approccio Equilibrato</h2>
<p>È interessante notare che, anche in caso di sconfitte, un buon leader sportivo non attribuisce la colpa a singoli individui. Frasi come “Abbiamo sbagliato” o “Dobbiamo migliorare” sono molto più efficaci nel mantenere unito il gruppo rispetto a “Lui ha sbagliato”. Questo approccio favorisce una cultura dell’apprendimento e del miglioramento continuo, invece di creare divisioni o tensioni.</p>
</section>
<section id="il-linguaggio-nella-leadership-aziendale" class="level2" data-number="1.9">
<h2 data-number="1.9" class="anchored" data-anchor-id="il-linguaggio-nella-leadership-aziendale"><span class="header-section-number">1.9</span> Il Linguaggio nella Leadership Aziendale</h2>
<p>Tornando al contesto aziendale, le dinamiche sono molto simili. Un manager che utilizza il linguaggio del “noi” può ottenere risultati sorprendenti in termini di motivazione e performance del team. Tuttavia, questo approccio deve essere autentico: il linguaggio deve essere accompagnato da azioni concrete che dimostrino che il leader crede davvero nel lavoro di squadra.</p>
</section>
<section id="come-utilizzare-il-linguaggio-del-noi-in-azienda" class="level2" data-number="1.10">
<h2 data-number="1.10" class="anchored" data-anchor-id="come-utilizzare-il-linguaggio-del-noi-in-azienda"><span class="header-section-number">1.10</span> Come Utilizzare il Linguaggio del “Noi” in Azienda</h2>
<p>Riconoscere i successi: Durante riunioni o comunicazioni ufficiali, sottolineare sempre il contributo del team nel raggiungimento degli obiettivi.</p>
<p>Includere tutti nei processi decisionali: Quando possibile, coinvolgere i membri del team nelle decisioni chiave per rafforzare il senso di appartenenza.</p>
<p>Accettare la responsabilità: In caso di errori o insuccessi, un leader deve assumersi la responsabilità senza scaricarla sui membri del team.</p>
<p>Creare una narrativa condivisa: Utilizzare storie e metafore per costruire una visione comune che ispiri e motivi il gruppo.</p>
</section>
<section id="il-ruolo-dei-feedback" class="level2" data-number="1.11">
<h2 data-number="1.11" class="anchored" data-anchor-id="il-ruolo-dei-feedback"><span class="header-section-number">1.11</span> Il Ruolo dei Feedback</h2>
<p>Un altro elemento cruciale è l’utilizzo del feedback. Un leader che apprezza il lavoro di squadra fornisce feedback costruttivi, riconoscendo i contributi individuali all’interno di un contesto collettivo. Frasi come “Il tuo contributo è stato fondamentale per il successo del team” sono molto più efficaci di semplici lodi individuali, poiché rafforzano il legame tra la performance personale e il successo collettivo.</p>
</section>
<section id="conclusioni" class="level2" data-number="1.12">
<h2 data-number="1.12" class="anchored" data-anchor-id="conclusioni"><span class="header-section-number">1.12</span> Conclusioni</h2>
<p>Il linguaggio che un leader utilizza è uno strumento potentissimo per costruire un team coeso e motivato. Scegliere il “noi” anziché l““io” è molto più di una semplice questione stilistica: è una scelta strategica che può fare la differenza tra un team che funziona e uno che fallisce. Lezione che si applica tanto al mondo aziendale quanto a quello sportivo, questa pratica riflette una leadership autentica e inclusiva, capace di ispirare e guidare verso il successo.</p>
<p>In definitiva, essere leader non significa prendere il controllo, ma condividere la responsabilità e il merito. Un vero leader sa che il successo è il risultato di un impegno collettivo, e sceglie il linguaggio per valorizzare e rafforzare questa realtà.</p>
</section>
</section>
<section id="link-interessanti" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> Link interessanti</h1>
<ul>
<li>https://www.ferpi.it/news/quelli-del-noi-e-quelli-dellio</li>
</ul>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>NLP</category>
  <guid>https://paolovolterra.com/posts/2513_IoNoi/20250126_Noi.html</guid>
  <pubDate>Sat, 25 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Interrogazione di Bagnai alla Camera dei deputati su PMI e Banche</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2512_FactChecking/</link>
  <description><![CDATA[ 




<p><img src="https://paolovolterra.com/posts/2512_FactChecking/media/maxresdefault.jpg" class="img-fluid"></p>
<p>costruzione di una pagina di test sui callout e sulle verifiche fatte con ChatGPT</p>
<section id="bagnai-interroga-giorgetti-sullaccesso-al-credito-bancario-da-parte-delle-piccole-medie-imprese" class="level1">
<h1>BAGNAI INTERROGA GIORGETTI SULL’ACCESSO AL CREDITO BANCARIO DA PARTE DELLE PICCOLE MEDIE IMPRESE</h1>
<p>https://www.youtube.com/watch?v=IUWhHJxyOXw</p>
<section id="affermazione-1" class="level2">
<h2 class="anchored" data-anchor-id="affermazione-1">Affermazione 1</h2>
<p>*“il settore delle piccole e medie imprese è preponderante a livello europeo in termini numerici. Queste piccole e medie imprese rappresentano il 99% in media delle aziende registrate ed esprimono, sostanzialmente, a livello europeo, i 2/3 degli occupati e circa 1/2 del valore aggiunto” (<a href="zotero://open-pdf/library/items/B4RMZ7B3?page=1&amp;annotation=4TAI7CT2">pdf</a>)</p>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Conclusione
</div>
</div>
<div class="callout-body-container callout-body">
<p>La dichiarazione è generalmente corretta.</p>
</div>
</div>
<p><strong>Percentuale di PMI sul totale delle imprese:</strong> Le PMI costituiscono oltre il 99% di tutte le imprese nell’Unione Europea (Fonte: Parlamento Europeo, Factsheets on the European Union, disponibile su <a href="https://www.europarl.europa.eu/factsheets/it/sheet/63/piccole-e-medie-imprese">europarl.europa.eu</a>).</p>
<p><strong>Occupazione nelle PMI:</strong> Circa due terzi della forza lavoro nel settore privato è impiegata nelle PMI (Fonte: CORDIS, Observatory of European SMEs, disponibile su <a href="https://cordis.europa.eu/article/id/18356-observatory-of-european-smes-publishes-first-three-reports">cordis.europa.eu</a>).</p>
<p><strong>Valore aggiunto generato dalle PMI:</strong> Le PMI contribuiscono a circa il 56% del prodotto interno lordo (PIL) dell’UE (Fonte: Parlamento Europeo, Studio sull’economia europea, disponibile su <a href="https://www.europarl.europa.eu/RegData/etudes/ATAG/2021/690633/EPRS_ATA%282021%29690633_IT.pdf">europarl.europa.eu</a>).</p>
<p>In sintesi, le PMI rappresentano la spina dorsale dell’economia europea, con un impatto significativo su occupazione e valore aggiunto.</p>
<hr>
</section>
<section id="affermazione-2" class="level2">
<h2 class="anchored" data-anchor-id="affermazione-2">Affermazione 2</h2>
<p><em>“a settembre scorso, i primi 10 gruppi bancari per totale dell’attivo di bilancio detenevano una quota di mercato nazionale di prestiti alle piccole e medie imprese pari al%, quindi le prime dieci banche hanno il 65% del mercato di prestiti sulle piccole e medie imprese, con l’eccezione del Trentino-Alto Adige, dove la quota di mercato dei primi dieci gruppi è minore rispetto alla media nazionale, sia per i prestiti alle PMI, sia per quelli al complesso delle imprese. La variabilità delle quote a livello regionale è relativamente contenuta: si passa dal 48,1% del Friuli-Venezia Giulia, all’82,5% della Sardegna, con percentuali pari al 76,6% della Liguria, il 70 per cento della Lombardia e il 59 per cento del Veneto” (<a href="zotero://open-pdf/library/items/B4RMZ7B3?page=1&amp;annotation=T4DLE8D4">pdf</a>)</em></p>
<p>A settembre scorso, i dati confermano che i primi dieci gruppi bancari in Italia detenevano una quota di mercato nazionale dei prestiti alle piccole e medie imprese (PMI) pari al <strong>65%</strong>. Questo dato è stato riportato dal ministro dell’Economia Giancarlo Giorgetti durante un’interrogazione parlamentare[1][2][6].</p>
<section id="quota-di-mercato-e-variazioni-regionali" class="level3">
<h3 class="anchored" data-anchor-id="quota-di-mercato-e-variazioni-regionali">Quota di Mercato e Variazioni Regionali</h3>
<ul>
<li><strong>Quota di Mercato</strong>: Le prime dieci banche, tra cui UniCredit e Intesa Sanpaolo, controllano il 65% del mercato dei prestiti alle PMI.</li>
<li><strong>Eccezione del Trentino-Alto Adige</strong>: In questa regione, la quota di mercato dei primi dieci gruppi è inferiore rispetto alla media nazionale sia per i prestiti alle PMI sia per quelli destinati a tutte le imprese[1][2].</li>
<li><strong>Variabilità Regionale</strong>: Le quote a livello regionale variano da un minimo del <strong>48,1%</strong> in Friuli-Venezia Giulia a un massimo dell’<strong>82,5%</strong> in Sardegna. Altre regioni presentano percentuali come il <strong>76,6%</strong> in Liguria, il <strong>70,3%</strong> in Lombardia e il <strong>59,1%</strong> in Veneto[1][2][6].</li>
</ul>
</section>
<section id="rapporto-prestitiattivo" class="level3">
<h3 class="anchored" data-anchor-id="rapporto-prestitiattivo">Rapporto Prestiti/Attivo</h3>
<p>Il rapporto tra l’ammontare dei prestiti e il totale attivo di bilancio per i prestiti alle PMI è mediamente pari al <strong>9%</strong>, mentre per il totale dei prestiti alle imprese è del <strong>16%</strong>[3][4].</p>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Conclusione
</div>
</div>
<div class="callout-body-container callout-body">
<p>In sintesi, l’affermazione riguardo alla quota di mercato delle prime dieci banche per i prestiti alle PMI è corretta e supportata da dati ufficiali.</p>
</div>
</div>
<section id="citations" class="level4">
<h4 class="anchored" data-anchor-id="citations">Citations:</h4>
<ul>
<li>[1] https://www.borsaitaliana.it/borsa/notizie/radiocor/finanza/dettaglio/- banche-giorgetti-a-settembre-per-prime-10-rapporto-prestiti-pmiattivi-a-9-nRC_15012025_1626_5196874- 16.html</li>
<li>[2] https://www.ansa.it/sito/notizie/economia/pmi/2025/01/15/- giorgetti-prime-10-banche-hanno-65-mercato-prestiti-pmi_a8fad4c6-414f-46d5-94a1-cdf9d8028aea.html</li>
<li>[3] https://www.italiaoggi.it/diritto-e-fisco/diritto-e-impresa/- banche-giorgetti-nel-2024-le-imprese-hanno-chiesto-meno-prestiti-hxk4277l</li>
<li>[4] https://www.confindustria.it/home/centro-studi/prodotti/previsioni/rapporto/highlights/- rapporto-previsione-economia-italiana-autunno-2024/4450a521-615e-4af8-b5e0-d2a734796003</li>
<li>[5] https://www.confindustria.it/home/centro-studi/prodotti/previsioni/rapporto/highlights/- rapporto-previsione-economia-italiana-primavera-2024/ca98805a-1f1a-4fef-8d24-1d4e00cfe358</li>
<li>[6] https://www.9colonne.it/502477/- giorgetti-primi-dieci-gruppi-bancari-a-settembre-scorso-avevano-65-mercato-prestiti-a-pmi</li>
<li>[7] https://finanza.lastampa.it/News/2024/11/12/- bankitalia-prestiti-ancora-in-calo-a-settembre-per-imprese-2-4percento-su-anno/- ODdfMjAyNC0xMS0xMl9UTEI</li>
<li>[8] https://www.teleborsa.it/News/2024/11/12/bankitalia-prestiti-ancora-in-calo-a-settembre-per-imprese-2-4percent-su-anno-87.html</li>
</ul>
<hr>
</section>
</section>
</section>
<section id="affermazione-3" class="level2">
<h2 class="anchored" data-anchor-id="affermazione-3">Affermazione 3</h2>
<p><em>“il rapporto tra l’ammontare dei prestiti e il totale dell’attivo di bilancio, che ovviamente ricomprende altre voci oltre i prestiti, era mediamente pari al 9% nel caso di prestiti alle piccole e medie imprese e al 16% con riferimento al complesso dei prestiti alle imprese. Quindi, dato 100 l’attivo, il 9% è prestato alle piccole e medie imprese, il 16% al complesso. L’andamento dei prestiti alle imprese, negli scorsi mesi si è andata attenuando la diminuzione dei prestiti bancari: meno 3,5% a ottobre, su 12 mesi, cioè continua ma decelera”</em></p>
<p>L’affermazione riguardante il rapporto tra l’ammontare dei prestiti e il totale dell’attivo di bilancio è corretta. I dati confermano che:</p>
<ul>
<li><p><strong>Rapporto Prestiti/Attivo</strong>: A settembre, il rapporto tra l’ammontare dei prestiti alle piccole e medie imprese (PMI) e il totale dell’attivo di bilancio era mediamente pari al <strong>9%</strong>. Per quanto riguarda il complesso dei prestiti alle imprese, questo rapporto era del <strong>16%</strong> [1][4].</p></li>
<li><p><strong>Interpretazione dei Dati</strong>: Ciò significa che, su un attivo totale di 100, il <strong>9%</strong> è prestato alle PMI e il <strong>16%</strong> al complesso delle imprese.</p></li>
<li><p><strong>Andamento dei Prestiti</strong>: Negli ultimi mesi, si è osservata una diminuzione dei prestiti bancari, con una contrazione del <strong>3,5%</strong> a ottobre su base annua. Tuttavia, questa diminuzione sta decelerando, indicando una certa stabilizzazione nel mercato del credito [1][4].</p></li>
</ul>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Conclusione
</div>
</div>
<div class="callout-body-container callout-body">
<p>In sintesi, l’affermazione è supportata da dati ufficiali e riflette accuratamente la situazione attuale del mercato dei prestiti alle PMI in Italia.</p>
</div>
</div>
<section id="citations-1" class="level4">
<h4 class="anchored" data-anchor-id="citations-1">Citations:</h4>
<ul>
<li>[1] https://www.borsaitaliana.it/borsa/notizie/radiocor/finanza/dettaglio/- banche-giorgetti-a-settembre-per-prime-10-rapporto-prestiti-pmiattivi-a-9-nRC_15012025_1626_5196874- 16.html</li>
<li>[2] https://www.bancaditalia.it/pubblicazioni/metodi-e-fonti-note/metodi-note-2021/- BAM_note-met_20211210.pdf</li>
<li>[3] https://assets.kpmg.com/content/dam/kpmg/it/pdf/2022/07/- KPMG_AnalisiBilanciGruppiBancariItaliani_Edizione2022.pdf</li>
<li>[4] https://www.ansa.it/sito/notizie/economia/pmi/2025/01/15/- giorgetti-prime-10-banche-hanno-65-mercato-prestiti-pmi_a8fad4c6-414f-46d5-94a1-cdf9d8028aea.html</li>
<li>[5] https://www.bancaditalia.it/pubblicazioni/conti-finanziari/2025-conti-finanziari/index.html?- com.dotmarketing.htmlpage.language=1</li>
<li>[6] https://docenti.unimc.it/massimo.biasin/teaching/2024/30662/files/kpmg-analisi-bilanci-banche-2024</li>
</ul>
<hr>
</section>
</section>
<section id="affermazione-4" class="level2">
<h2 class="anchored" data-anchor-id="affermazione-4">Affermazione 4</h2>
<p><em>“l’andamento dei prestiti alle imprese, negli scorsi mesi si è andata attenuando la diminuzione dei prestiti bancari: meno 3,5 per cento a ottobre, su 12 mesi, cioè continua ma decelera”</em></p>
<p>L’affermazione riguardante l’andamento dei prestiti alle imprese è corretta e supportata da dati recenti. Ecco i punti principali:</p>
<ul>
<li><p><strong>Diminuzione dei Prestiti</strong>: A ottobre 2024, i prestiti bancari alle imprese hanno registrato una diminuzione del <strong>3,5%</strong> su base annua. Questo calo è in linea con le tendenze precedenti, ma si segnala che la diminuzione sta rallentando rispetto ai tassi più elevati di contrazione osservati in passato (ad esempio, un calo del <strong>6,7%</strong> a settembre 2023) [1][3].</p></li>
<li><p><strong>Decelerazione della Diminuzione</strong>: Il calo dei prestiti è ancora presente, ma la sua intensità sta diminuendo. Questo suggerisce una stabilizzazione nel mercato del credito, con una possibile ripresa in vista [1][2][3].</p></li>
<li><p><strong>Richiesta di Credito</strong>: Nonostante la diminuzione dei prestiti, la domanda di credito da parte delle imprese continua a essere debole, anche se a ritmi più contenuti rispetto ai trimestri precedenti. Ciò è attribuibile all’aumento dei tassi di interesse e alla necessità di rimborsi su finanziamenti preesistenti [1][3][4].</p></li>
</ul>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Conclusione
</div>
</div>
<div class="callout-body-container callout-body">
<p>In sintesi, l’affermazione che “l’andamento dei prestiti alle imprese negli scorsi mesi si è andata attenuando” è confermata dai dati attuali, mostrando una diminuzione del <strong>3,5%</strong> a ottobre, con un trend di decelerazione rispetto ai periodi precedenti.</p>
</div>
</div>
<section id="citations-2" class="level4">
<h4 class="anchored" data-anchor-id="citations-2">Citations:</h4>
<ul>
<li>[1] https://www.confindustria.it/home/centro-studi/prodotti/previsioni/rapporto/highlights/- rapporto-previsione-economia-italiana-primavera-2024/ca98805a-1f1a-4fef-8d24-1d4e00cfe358</li>
<li>[2] https://www.giornaledellepmi.it/- report-mensile-abi-a-ottobre-diminuzione-dei-tassi-di-interesse-e-calo-dei-prestiti/</li>
<li>[3] https://www.italiaoggi.it/diritto-e-fisco/diritto-e-impresa/- banche-giorgetti-nel-2024-le-imprese-hanno-chiesto-meno-prestiti-hxk4277l</li>
<li>[4] https://www.confindustria.it/home/centro-studi/prodotti/previsioni/rapporto/highlights/- rapporto-previsione-economia-italiana-autunno-2024/4450a521-615e-4af8-b5e0-d2a734796003</li>
<li>[5] https://www.bancaditalia.it/statistiche/tematiche/moneta-intermediari-finanza/- intermediari-finanziari/indagine-credito-bancario/risultati/BLS_Ottobre_2024.pdf</li>
<li>[6] https://www.gaeta.it/- diminuzione-tassi-di-interesse-e-calo-prestiti-il-report-mensile-dellabi-per-ottobre-2024</li>
<li>[7] https://it.marketscreener.com/notizie/ultimo/Banche-Abi-prestiti-in-ripresa-nel-2024-rischiosta-in-aumento-moderato-48131490/</li>
</ul>
<hr>
</section>
</section>
<section id="affermazione-5" class="level2">
<h2 class="anchored" data-anchor-id="affermazione-5">Affermazione 5</h2>
<p><em>“In base all’elaborazione della Banca d’Italia di dati della Centrale dei rischi Cerved, la flessione dei prestiti è generalizzata tra classi di rischiosità e dimensione d’impresa”</em> (<a href="zotero://open-pdf/library/items/B4RMZ7B3?page=2&amp;annotation=33H6DFF3">pdf</a>)</p>
<p>L’affermazione che “la flessione dei prestiti è generalizzata tra classi di rischiosità e dimensione d’impresa” è supportata dai dati elaborati dalla Banca d’Italia. Ecco i punti principali:</p>
<ul>
<li><p><strong>Flessione Generalizzata</strong>: I prestiti bancari alle imprese italiane stanno diminuendo in modo generalizzato, con una contrazione che si estende a diverse classi di rischiosità e dimensioni aziendali. Questo è confermato dall’indagine della Banca d’Italia, che evidenzia come la domanda di credito continui a ridursi, specialmente per i prestiti a lungo termine, mentre la diminuzione è meno marcata per quelli a breve termine[1][2].</p></li>
<li><p><strong>Dati Recenti</strong>: A febbraio 2024, i prestiti alle imprese hanno mostrato una flessione del <strong>3,8%</strong> rispetto all’anno precedente, sebbene la diminuzione sia meno accentuata rispetto ai picchi negativi del 2023, che avevano raggiunto un calo del <strong>6,7%</strong> a settembre[1][2].</p></li>
<li><p><strong>Impatto delle Condizioni Economiche</strong>: La contrazione dei prestiti è influenzata da vari fattori, tra cui l’aumento dei tassi di interesse da parte della BCE e le condizioni economiche generali. Le imprese manifestano difficoltà nell’accesso al credito, con una percentuale significativa che non riesce a ottenere i finanziamenti richiesti[3][4].</p></li>
</ul>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Conclusione
</div>
</div>
<div class="callout-body-container callout-body">
<p>In sintesi, l’affermazione sulla flessione generalizzata dei prestiti tra diverse classi di rischiosità e dimensione d’impresa è corretta e riflette la situazione attuale del mercato del credito in Italia.</p>
</div>
</div>
<section id="citations-3" class="level4">
<h4 class="anchored" data-anchor-id="citations-3">Citations:</h4>
<ul>
<li>[1] https://www.confindustria.it/home/centro-studi/prodotti/previsioni/rapporto/highlights/- rapporto-previsione-economia-italiana-primavera-2024/ca98805a-1f1a-4fef-8d24-1d4e00cfe358</li>
<li>[2] https://www.confindustria.it/home/centro-studi/prodotti/previsioni/rapporto/highlights/- rapporto-previsione-economia-italiana-autunno-2024/4450a521-615e-4af8-b5e0-d2a734796003</li>
<li>[3] https://www.bancaditalia.it/statistiche/tematiche/moneta-intermediari-finanza/- intermediari-finanziari/indagine-credito-bancario/risultati/BLS_Luglio_2024.pdf</li>
<li>[4] https://www.simplybiz.eu/- banca-ditalia-prestiti-a-famiglie-e-imprese-rapporto-stabilita-finanziaria-2024/</li>
<li>[5] https://infostat.bancaditalia.it/inquiry/GetDocumentFile?type=PDF&amp;docId=208675&amp;- cubeId=BAM_STATICISSUE1</li>
<li>[6] https://finanza.repubblica.it/News/2024/03/11/bankitalia_a_gennaio_accelera_il_calo_dei_prestiti_alle_imprese-61/</li>
</ul>


</section>
</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <guid>https://paolovolterra.com/posts/2512_FactChecking/</guid>
  <pubDate>Wed, 15 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Il rischio nei finanziamenti e nelle agevolazioni</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2507_Rischio/Rischio.html</link>
  <description><![CDATA[ 




<p><img src="https://paolovolterra.com/posts/2507_Rischio/media/cover01.webp" class="img-fluid"></p>
<section id="definizione-e-processo-di-riciclaggio" class="level2">
<h2 class="anchored" data-anchor-id="definizione-e-processo-di-riciclaggio"><strong>Definizione e Processo di Riciclaggio:</strong></h2>
<ul>
<li><p>Il riciclaggio è definito come il processo attraverso cui la ricchezza di provenienza illecita viene occultata, trasferita per dissimularne l’origine e successivamente reinvestita nell’economia legale.</p></li>
<li><p>Le azioni di contrasto al riciclaggio mirano a limitare gli effetti distorsivi sulla concorrenza, la crescita economica e il benessere dei cittadini.</p></li>
<li><p>Il processo tipico di riciclaggio si articola in tre fasi: <strong>collocamento (placement), stratificazione (layering) e integrazione</strong>.</p>
<ul>
<li><p>Il <strong>collocamento</strong> è la fase in cui il denaro sporco entra nel sistema finanziario, spesso attraverso intermediari regolamentati.</p></li>
<li><p>La <strong>stratificazione</strong> è la fase in cui il denaro viene trasferito attraverso una serie complessa di transazioni per offuscarne l’origine.</p></li>
<li><p>L’<strong>integrazione</strong> è la fase in cui il denaro riciclato viene reimmesso nell’economia legale.</p></li>
</ul></li>
</ul>
</section>
<section id="dimensioni-del-riciclaggio" class="level2">
<h2 class="anchored" data-anchor-id="dimensioni-del-riciclaggio"><strong>Dimensioni del Riciclaggio:</strong></h2>
<ul>
<li><p>Le stime globali del riciclaggio variano, ma si attestano tra il 2 e il 5% del PIL mondiale.</p></li>
<li><p>In Italia, le stime variano dall’1% fino al 12% del PIL.</p></li>
<li><p>La dimensione del riciclaggio è difficile da stimare a causa della sua natura occulta e delle varie tecniche utilizzate per mascherare l’origine illecita dei proventi.</p></li>
</ul>
</section>
<section id="tecniche-di-riciclaggio" class="level2">
<h2 class="anchored" data-anchor-id="tecniche-di-riciclaggio"><strong>Tecniche di Riciclaggio:</strong></h2>
<ul>
<li><p>Le tecniche di riciclaggio sono in continua evoluzione.</p></li>
<li><p>Il contante, a causa della sua facile utilizzabilità e non tracciabilità, è uno strumento spesso funzionale al riciclaggio.</p></li>
<li><p>I riciclatori sfruttano la natura anonima delle criptoattività e le maggiori possibilità che offrono nella fase di stratificazione.</p></li>
<li><p>Strumenti come i <strong>mixer (o tumbler)</strong> vengono utilizzati per mescolare criptoattività e offuscarne la provenienza.</p></li>
<li><p>Il <strong>“chain peeling”</strong> è una tecnica che frammenta grandi quantità di criptovalute in piccole transazioni.</p></li>
<li><p>L’uso di <strong>identità fittizie, prestanome e società di comodo</strong> sono tecniche comuni per nascondere i titolari effettivi di rapporti e transazioni.</p></li>
</ul>
<p><img src="https://paolovolterra.com/posts/2507_Rischio/media/cover02.webp" class="img-fluid"></p>
</section>
<section id="settori-a-rischio" class="level2">
<h2 class="anchored" data-anchor-id="settori-a-rischio"><strong>Settori a Rischio:</strong></h2>
<ul>
<li><p>Il <strong>settore del commercio</strong> è considerato un ambito in cui si riscontra la maggior presenza di imprese “cartiere” utilizzate per riciclare denaro.</p></li>
<li><p>Il <strong>settore delle costruzioni</strong> è tradizionalmente considerato profittevole per le organizzazioni criminali, che sfruttano lavoro irregolare e aggirano i vincoli normativi.</p></li>
<li><p>Anche il <strong>settore del gioco</strong> è considerato vulnerabile, con punti gioco che non eseguono correttamente l’adeguata verifica dei giocatori.</p></li>
<li><p>Le <strong>operazioni in oro</strong> sono soggette a dichiarazione alla UIF per importi pari o superiori a 12.500 euro, poiché questo settore può essere usato per finalità di riciclaggio.</p></li>
<li><p>Il settore delle <strong>carte di pagamento</strong> è idoneo ad essere analizzato tramite l’analisi di rete, data l’elevata frammentazione delle operazioni.</p></li>
<li><p>I <strong>finanziamenti a tasso agevolato</strong> nell’ambito del PNRR sono un’area di rischio, a causa di anomalie nelle richieste e dell’inadeguatezza economico-patrimoniale dei richiedenti.</p></li>
<li><p>Le <strong>cessioni di crediti d’imposta</strong> sono state identificate come un’area di rischio, con la circolazione di crediti fittizi e l’infiltrazione della criminalità organizzata.</p></li>
<li><p>Anche i <strong>rimborsi IRPEF</strong> possono essere oggetto di schemi fraudolenti, con soggetti a basso reddito che dichiarano ritenute maggiori per ottenere rimborsi.</p></li>
<li><p>Le <strong>operazioni con il reddito di cittadinanza</strong> possono essere utilizzate per la monetizzazione del beneficio, aggirando i limiti al prelievo di contante.</p></li>
<li><p>Le <strong>piattaforme estere online</strong> possono essere utilizzate per speculazioni o truffe nella vendita di dispositivi medici e sanitari.</p></li>
</ul>
</section>
<section id="ruolo-delle-autorità" class="level2">
<h2 class="anchored" data-anchor-id="ruolo-delle-autorità"><strong>Ruolo delle Autorità:</strong></h2>
<ul>
<li><p>L’Unità di Informazione Finanziaria (UIF) svolge un ruolo centrale nel monitoraggio e nell’analisi delle segnalazioni di operazioni sospette (SOS).</p></li>
<li><p>La UIF collabora con gli organi investigativi per lo scambio di informazioni e la trasmissione di approfondimenti.</p></li>
<li><p>La UIF conduce analisi operative di rischio, come “Austrian connection”, basata sulla valutazione di elementi informativi pervenuti dalla Banca d’Italia.</p></li>
<li><p>Il Nucleo Speciale Polizia Valutaria della Guardia di Finanza è coinvolto in indagini e attività di polizia giudiziaria relative al riciclaggio.</p></li>
<li><p>La Banca d’Italia svolge attività di vigilanza sugli intermediari finanziari per prevenire il riciclaggio.</p></li>
<li><p>La Direzione Investigativa Antimafia (DIA) svolge indagini sulle segnalazioni connesse alla criminalità organizzata.</p></li>
<li><p>Il GAFI (Gruppo di Azione Finanziaria Internazionale) identifica i paesi ad alto rischio e/o con legislazione antiriciclaggio carente.</p></li>
</ul>
</section>
<section id="riciclaggio-e-criptoattività" class="level2">
<h2 class="anchored" data-anchor-id="riciclaggio-e-criptoattività"><strong>Riciclaggio e Criptoattività:</strong></h2>
<ul>
<li><p>Le criptoattività offrono nuove opportunità per il riciclaggio, grazie alla loro natura pseudonima e alle possibilità di stratificazione.</p></li>
<li><p>Il riciclaggio tramite criptoattività può avvenire sia attraverso la conversione di denaro fiat sporco in cripto, sia attraverso condotte illegali direttamente in cripto.</p></li>
<li><p>La finanza decentralizzata (DeFi) pone sfide significative per l’applicazione delle normative antiriciclaggio, a causa dell’assenza di intermediari.</p></li>
<li><p>Le piattaforme di scambio di criptovalute che operano senza adeguati controlli di verifica rappresentano un rischio.</p></li>
<li><p>I mixer e i tumbler sono strumenti utilizzati per oscurare le transazioni in criptovalute.</p></li>
</ul>
</section>
<section id="dati-e-analisi" class="level2">
<h2 class="anchored" data-anchor-id="dati-e-analisi"><strong>Dati e Analisi:</strong></h2>
<ul>
<li><p>Le segnalazioni di operazioni sospette sono un’importante fonte di dati per l’analisi del riciclaggio.</p></li>
<li><p>L’analisi della qualità delle segnalazioni è cruciale per individuare i fenomeni più rilevanti.</p></li>
<li><p>La UIF conduce analisi sui flussi finanziari con l’estero, identificando anomalie per paese o settore.</p></li>
</ul>
</section>
<section id="infiltrazione-della-criminalità-organizzata" class="level2">
<h2 class="anchored" data-anchor-id="infiltrazione-della-criminalità-organizzata"><strong>Infiltrazione della Criminalità Organizzata:</strong></h2>
<ul>
<li><p>Le organizzazioni criminali (OC) infiltrano l’economia legale per riciclare denaro, perseguire ulteriori fonti di profitto e ricercare consenso sociale.</p></li>
<li><p>Le imprese create dalle OC possono essere utilizzate per attività criminali, per ottenere vantaggi competitivi, o per creare connessioni politiche.</p></li>
</ul>
</section>
<section id="misure-di-contrasto" class="level2">
<h2 class="anchored" data-anchor-id="misure-di-contrasto"><strong>Misure di Contrasto:</strong></h2>
<ul>
<li><p>Le normative antiriciclaggio vengono continuamente aggiornate per includere le attività suscettibili di essere utilizzate per il riciclaggio.</p></li>
<li><p>La collaborazione tra le FIU è essenziale per lo scambio di informazioni e il contrasto del riciclaggio a livello internazionale.</p></li>
<li><p>L’adeguata verifica della clientela è un obbligo fondamentale per tutti i soggetti coinvolti nel sistema finanziario.</p></li>
<li><p>L’uso di tecnologie come gli smart contract può essere utile per intercettare le operazioni anomale nella finanza decentralizzata.</p></li>
</ul>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>AI</category>
  <category>Banche</category>
  <category>Risk</category>
  <category>Bankit</category>
  <category>Lavoro</category>
  <guid>https://paolovolterra.com/posts/2507_Rischio/Rischio.html</guid>
  <pubDate>Sat, 11 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Registro Nazionale degli Aiuti di Stato</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2508_RNA/RNA.html</link>
  <description><![CDATA[ 




<section id="obiettivi-dello-studio" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> Obiettivi dello studio</h1>
<ul>
<li>manipolazione dei parquet file</li>
<li>applicazione di SQL in Python</li>
</ul>
<hr>
<p>Il <a href="https://www.rna.gov.it/"><strong>Registro Nazionale degli Aiuti di Stato</strong></a> #RNA è uno strumento gestito dal Ministero delle Imprese e del Made in Italy (ex Ministero dello Sviluppo Economico - MiSE), che permette di raccogliere, monitorare e pubblicare informazioni relative agli aiuti di Stato concessi alle imprese e agli enti in Italia.</p>
<p><img src="https://paolovolterra.com/posts/2508_RNA/media/01.png" class="img-fluid"></p>
</section>
<section id="obiettivi-principali" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> Obiettivi principali:</h1>
<ol type="1">
<li><strong>Trasparenza</strong>: Pubblicare i dettagli degli aiuti concessi, garantendo che le informazioni siano accessibili a cittadini e imprese.</li>
<li><strong>Monitoraggio</strong>: Assicurare che i limiti sugli aiuti stabiliti dalla normativa europea siano rispettati.</li>
<li><strong>Controllo</strong>: Evitare il superamento delle soglie del regime “de minimis” e la concessione di aiuti incompatibili con le regole dell’Unione Europea.</li>
</ol>
</section>
<section id="la-realizzazione" class="level1" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> La realizzazione</h1>
<p>Il #RNA è stato realizzato come parte di un’importante azione di sistema cofinanziata dall’Unione Europea. In particolare, il progetto ha beneficiato di risorse pari a <strong>17.715.920,01 euro</strong>, assegnate nell’ambito del <strong>Programma Operativo Complementare al PON Governance e Capacità Istituzionale 2014-2020</strong>.</p>
<p>La progettazione e la realizzazione di una prima versione prototipale del Registro sono state completate nel 2016, con un investimento di <strong>2.652.236,00 euro</strong>.</p>
<p>Il #RNA è operativo dal 12 agosto 2017 e rappresenta uno strumento fondamentale per garantire la trasparenza e il controllo degli aiuti di Stato concessi in Italia.</p>
</section>
<section id="informazioni-contenute-nel-registro" class="level1" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> Informazioni contenute nel Registro:</h1>
<p>Il #RNA include informazioni come: - Identità del beneficiario (nome, partita IVA, codice fiscale). - Tipo di aiuto concesso (contributo a fondo perduto, credito d’imposta, agevolazione fiscale, ecc.). - Importo e intensità dell’aiuto. - Riferimenti alla normativa e al regime di aiuti in base al quale è stato concesso. - Ente erogatore.</p>
</section>
<section id="normativa-di-riferimento" class="level1" data-number="5">
<h1 data-number="5"><span class="header-section-number">5</span> Normativa di riferimento:</h1>
<p>Il #RNA è disciplinato dal <strong>Decreto Legge n.&nbsp;123/2017</strong>, che stabilisce obblighi per le amministrazioni pubbliche e i soggetti che gestiscono misure di aiuto. L’obiettivo è garantire che tutti gli aiuti siano comunicati e registrati.</p>
</section>
<section id="accesso-al-registro" class="level1" data-number="6">
<h1 data-number="6"><span class="header-section-number">6</span> Accesso al Registro:</h1>
<p>Il #RNA è consultabile tramite una piattaforma online, accessibile sia dagli enti pubblici che dagli operatori economici.</p>
<p>Alcune informazioni, per motivi di riservatezza, potrebbero essere soggette a limitazioni.</p>
</section>
<section id="controlli-sul-de-minimis" class="level1" data-number="7">
<h1 data-number="7"><span class="header-section-number">7</span> Controlli sul “de minimis”:</h1>
<p>Il #RNA permette di verificare se un’impresa ha superato la soglia prevista dal regime “de minimis” (200.000 euro nell’arco di tre esercizi finanziari, salvo eccezioni per alcuni settori).</p>
<hr>
<p>Oltre all’interrogazione online, #RNA permette il <a href="https://www.rna.gov.it/open-data/aiuti">download degli #opendata</a></p>
<p><img src="https://paolovolterra.com/posts/2508_RNA/media/04.png" class="img-fluid"></p>
</section>
<section id="gli-opendata-rna-in-xml" class="level1" data-number="8">
<h1 data-number="8"><span class="header-section-number">8</span> Gli opendata RNA in xml</h1>
<p>#RNA aggiorna costantemente il proprio DB conn le segnalazioni dovute dai mittenti normativamente previsti.</p>
<p>Le date degli <a href="https://www.rna.gov.it/open-data/aiuti">opendata XML messi a disposizione</a> corrispondono al mese della variabile “DATA_CONCESSIONE” contenuta in ognuno di loro</p>
<p>RNA riceve però anche informazioni datate e quindi aggiorna tutto.</p>
<p>Potenzialmente, quindi, <strong>tutti</strong> gli XML andrebbero riscaricati …</p>
<p>Di seguito, ad esempio, gli ultimi 3 file parquet del 2024 da me realizzati, la data di mia aggiornamento e i df.shape</p>
<section id="opendata_aiuti_2024_12.parquet" class="level2" data-number="8.1">
<h2 data-number="8.1" class="anchored" data-anchor-id="opendata_aiuti_2024_12.parquet"><span class="header-section-number">8.1</span> OpenData_Aiuti_2024_12.parquet</h2>
<ul>
<li>20250111 (107273, 21)</li>
<li>20250105 (105454, 21)</li>
<li>20250101 (100270, 21)</li>
<li>20241221 (91504, 21)</li>
<li>20241214 (36363, 21)</li>
<li>20241207 (16243, 21)</li>
</ul>
</section>
<section id="opendata_aiuti_2024_11.parquet" class="level2" data-number="8.2">
<h2 data-number="8.2" class="anchored" data-anchor-id="opendata_aiuti_2024_11.parquet"><span class="header-section-number">8.2</span> OpenData_Aiuti_2024_11.parquet</h2>
<ul>
<li>20250111 (141510, 21)</li>
<li>20250107 (141523, 21)</li>
<li>20241201 (136061, 21)</li>
<li>20241130 (115693, 21)</li>
<li>20241124 (115693, 21)</li>
<li>20241117 (19701, 21)</li>
<li>20241110 (19701, 21)</li>
</ul>
</section>
<section id="opendata_aiuti_2024_10.parquet" class="level2" data-number="8.3">
<h2 data-number="8.3" class="anchored" data-anchor-id="opendata_aiuti_2024_10.parquet"><span class="header-section-number">8.3</span> OpenData_Aiuti_2024_10.parquet</h2>
<ul>
<li>20250107 (238465, 21)</li>
<li>20241110 (238076, 21)</li>
<li>20241101 (122656, 21)</li>
<li>20241029 (122656, 21)</li>
<li>20241026 (59146, 21)</li>
<li>20241019 (59146, 21)</li>
</ul>
<p>Non ho ancora verificato se la data è quella di concessione o quella di registrazione in RNA</p>
</section>
</section>
<section id="analisi-sullxml-più-recente" class="level1" data-number="9">
<h1 data-number="9"><span class="header-section-number">9</span> Analisi sull’xml più recente</h1>
<p>Appresso riporto alcune sintesi dell’ultimo XML -&gt; parquet da me prodotto</p>
<section id="quanti-aiuti-contiene" class="level2" data-number="9.1">
<h2 data-number="9.1" class="anchored" data-anchor-id="quanti-aiuti-contiene"><span class="header-section-number">9.1</span> Quanti aiuti contiene</h2>
<div id="3ac853ec" class="cell" data-execution_count="2">
<div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT count(distinct(CF)), count((CF)), count(distinct(CAR)),count(distinct(CONCEDENTE)), sum(cast(NOMINALE as integer)), sum(cast(AIUTO as integer)) FROM 'OpenData_Aiuti_2025_01.parquet'"</span>).df()</span>
<span id="cb1-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="2">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">count(DISTINCT CF)</th>
<th data-quarto-table-cell-role="th">count(CF)</th>
<th data-quarto-table-cell-role="th">count(DISTINCT CAR)</th>
<th data-quarto-table-cell-role="th">count(DISTINCT CONCEDENTE)</th>
<th data-quarto-table-cell-role="th">sum(CAST(NOMINALE AS INTEGER))</th>
<th data-quarto-table-cell-role="th">sum(CAST(AIUTO AS INTEGER))</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>227772</td>
<td>288480</td>
<td>478</td>
<td>375</td>
<td>4,198,060,832.0</td>
<td>2,169,603,080.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="quali-misure-hanno-più-aiuti" class="level2" data-number="9.2">
<h2 data-number="9.2" class="anchored" data-anchor-id="quali-misure-hanno-più-aiuti"><span class="header-section-number">9.2</span> Quali misure hanno più aiuti</h2>
<div id="1daa823a" class="cell" data-execution_count="3">
<div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT upper(misura) MISURA, count(CAR) CONCESSIONI, sum(cast(NOMINALE as integer)) NOMINALE, sum(cast(AIUTO as integer)) AIUTI FROM 'OpenData_Aiuti_2025_01.parquet' group by 1 order by 2 desc limit 20"</span>).df()</span>
<span id="cb2-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="3">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">MISURA</th>
<th data-quarto-table-cell-role="th">CONCESSIONI</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
<th data-quarto-table-cell-role="th">AIUTI</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>ESONERO DAL VERSAMENTO DEI CONTRIBUTI PREVIDENZIALI PER NUOVE ASSUNZIONI/TRASFORMAZIONI A TEMPO INDETERMINATO NEL BIENNIO 2021 - 2022 (ART. 1 COMMI 10 - 15 L. 178/2020)</td>
<td>118427</td>
<td>881,173,792.0</td>
<td>881,173,792.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>ESONERO DAL VERSAMENTO DEI CONTRIBUTI PREVIDENZIALI PER L'ASSUNZIONE DI GIOVANI LAVORATORI ( ART. 1 COMMA 10-15 L. 178/2020 - ART. 1 COMMA 297 L. 197/2022)</td>
<td>75758</td>
<td>393,090,967.0</td>
<td>393,090,967.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>ESONERO DAL VERSAMENTO DEI CONTRIBUTI PREVIDENZIALI PER ASSUNZIONI DI DONNE LAVORATRICI DAL 1 LUGLIO 2022 ( ART. 1 , COMMI 16-19 L.178/2020 -ART. 1 COMMA 298 L.197/2022)</td>
<td>33952</td>
<td>97,152,474.0</td>
<td>97,152,474.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>ESONERO DAL VERSAMENTO DEI CONTRIBUTI PREVIDENZIALI PER ASSUNZIONI DI DONNE LAVORATRICI NEL BIENNIO 2021 - 2022 (ART. 1 COMMI 16 - 19 L. 178/2020)</td>
<td>26226</td>
<td>55,388,921.0</td>
<td>55,388,921.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>FONDO DI GARANZIA PER LE PICCOLE E MEDIE IMPRESE</td>
<td>14840</td>
<td>1,933,831,009.0</td>
<td>127,456,523.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>REGOLAMENTO PER I FONDI INTERPROFESSIONALI PER LA FORMAZIONE CONTINUA PER LA CONCESSIONI DI AIUTI DI STATO ESENTATI AI SENSI DEL REGOLAMENTO CE N.651/2014 E IN REGIME DE MINIMIS AI SENSI DEL REGOLAMENTO CE N.1407/2013</td>
<td>6093</td>
<td>30,887,740.0</td>
<td>30,476,607.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>NUOVA SABATINI - FINANZIAMENTI PER L'ACQUISTO DI NUOVI MACCHINARI, IMPIANTI E ATTREZZATURE DA PARTE DELLE PICCOLE E MEDIE IMPRESE - VERSIONE MODIFICATA DA CODICE CE SA.47180</td>
<td>2502</td>
<td>36,229,375.0</td>
<td>36,229,375.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>VOUCHER DIGITALIZZAZIONE 2024</td>
<td>536</td>
<td>8,670,819.0</td>
<td>8,670,819.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>PROGETTI INTEGRATI DI FILIERA 2023-2025</td>
<td>449</td>
<td>14,386,187.0</td>
<td>14,386,187.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>AVVISO PUBBLICO PER L’ASSEGNAZIONE DI VOUCHER AZIENDALI A CATALOGO PER INTERVENTI DI FORMAZIONE CONTINUA – SECONDA EDIZIONE</td>
<td>332</td>
<td>1,051,790.0</td>
<td>1,051,790.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">10</td>
<td>BANDO FIERE INTERNAZIONALI - ANNO 2024 (24FI)</td>
<td>249</td>
<td>505,600.0</td>
<td>505,600.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">11</td>
<td>FVG – DGR 1987/2022 - CRITERI E MODALITÀ PER CONCESSIONE DI GARANZIE E CONTRIBUZIONI INTEGRATIVE A FAVORE DELLE IMPRESE COLPITE DALL'AUMENTO DEI PREZZI DEL GAS E DELL'ENERGIA ELETTRICA IN ATTUAZIONE DELL'ART 2, CC 6, 7, 8 E 9, DELLA LR 15/2022</td>
<td>227</td>
<td>225,537.0</td>
<td>123,646.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">12</td>
<td>[TITOLO II - CAPO 1, 2, 3, 4, 5, 6] REGOLAMENTO REGIONALE DELLA PUGLIA PER GLI AIUTI IN ESENZIONE (REG. REGIONALE N. 17 DEL 30/09/2014-BURP 06/10/2014) - AIUTI A FINALITÀ REGIONALE</td>
<td>224</td>
<td>20,505,184.0</td>
<td>20,505,184.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">13</td>
<td>AIUTI AI CENTRI DI TRASFERIMENTO TECNOLOGICO</td>
<td>222</td>
<td>6,244,068.0</td>
<td>4,332,494.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">14</td>
<td>PIÙ ARTIGIANATO</td>
<td>200</td>
<td>5,752,767.0</td>
<td>4,018,773.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">15</td>
<td>APPROVAZIONE AVVISO BANDO DOTE IMPRESA COLLOCAMENTO MIRATO - FONDO 2022</td>
<td>170</td>
<td>1,327,263.0</td>
<td>1,327,263.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">16</td>
<td>BANDO “DIGITAL EXPORT 2024-2025”</td>
<td>152</td>
<td>2,167,102.0</td>
<td>2,167,102.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">17</td>
<td>GARANZIE DEI CONFIDI ALLE PMI</td>
<td>143</td>
<td>11,759,800.0</td>
<td>327,910.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">18</td>
<td>RER - DGR 412/2024 - ISTITUZIONE DEL REGIME DI AIUTI DI IMPORTANZA MINORE («DE MINIMIS») PER FORMAZIONE RIVOLTA ALLE IMPRESE OPERANTI NEL TERRITORIO DELLA REGIONE EMILIA-ROMAGNA AI SENSI DEL REGOLAMENTO (UE) 2023/2831 APPROVAZIONE DISPOSIZIONI</td>
<td>134</td>
<td>143,824.0</td>
<td>143,824.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">19</td>
<td>BANDO “FRESCO LAZIO - MISURE A SOSTEGNO DELLE ATTIVITÀ DI RISTORAZIONE, TRASFORMAZIONE E DEL COMMERCIO ALIMENTARE CHE UTILIZZANO E/O SOMMINISTRANO LATTE FRESCO DEL LAZIO”</td>
<td>132</td>
<td>471,542.0</td>
<td>471,542.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="quali-concedenti-hanno-più-aiuti" class="level2" data-number="9.3">
<h2 data-number="9.3" class="anchored" data-anchor-id="quali-concedenti-hanno-più-aiuti"><span class="header-section-number">9.3</span> Quali concedenti hanno più aiuti</h2>
<p>purtroppo il nome del concedente è scritto in modi diversi</p>
<div id="39f97862" class="cell" data-execution_count="4">
<div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT upper(concedente) CONCEDENTE, count(CAR) CONCESSIONI, sum(cast(NOMINALE as integer)) NOMINALE, sum(cast(AIUTO as integer)) AIUTI FROM 'OpenData_Aiuti_2025_01.parquet' group by 1 order by 2 desc limit 10"</span>).df()</span>
<span id="cb3-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="4">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">CONCEDENTE</th>
<th data-quarto-table-cell-role="th">CONCESSIONI</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
<th data-quarto-table-cell-role="th">AIUTI</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>INPS</td>
<td>254432</td>
<td>1,427,160,166.0</td>
<td>1,427,160,166.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>BANCA DEL MEZZOGIORNO MEDIOCREDITO CENTRALE S.P.A.</td>
<td>14914</td>
<td>1,934,188,400.0</td>
<td>127,813,914.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>MINISTERO DELLE IMPRESE E DEL MADE IN ITALY - DIPARTIMENTO PER LE POLITICHE PER LE IMPRESE - DIREZIONE GENERALE PER GLI INCENTIVI ALLE IMPRESE</td>
<td>2796</td>
<td>125,965,619.0</td>
<td>89,876,791.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>FONARCOM</td>
<td>1529</td>
<td>2,752,960.0</td>
<td>2,752,960.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>FONDER</td>
<td>1117</td>
<td>1,710,921.0</td>
<td>1,618,699.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>FONDO FOR.TE</td>
<td>768</td>
<td>4,851,253.0</td>
<td>4,851,253.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>FONDOPROFESSIONI</td>
<td>606</td>
<td>579,084.0</td>
<td>575,934.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>UNIONE REGIONALE DELLE CAMERE DI COMMERCIO INDUSTRIA ARTIGIANATO AGRICOLTURA DEL PIEMONTE</td>
<td>560</td>
<td>8,765,133.0</td>
<td>8,765,133.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>FONDIMPRESA</td>
<td>552</td>
<td>7,712,030.0</td>
<td>7,712,030.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>FONCOOP</td>
<td>531</td>
<td>5,685,118.0</td>
<td>5,685,118.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="gli-aiuti-in-ordine-di-valore-nominale" class="level2" data-number="9.4">
<h2 data-number="9.4" class="anchored" data-anchor-id="gli-aiuti-in-ordine-di-valore-nominale"><span class="header-section-number">9.4</span> Gli aiuti in ordine di valore nominale €</h2>
<div id="0c8a8ee4" class="cell" data-execution_count="5">
<div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT upper(concedente) CONCEDENTE, count(CAR) CONCESSIONI, sum(cast(NOMINALE as integer)) NOMINALE, sum(cast(AIUTO as integer)) AIUTI FROM 'OpenData_Aiuti_2025_01.parquet' group by 1 order by 3 desc limit 10"</span>).df()</span>
<span id="cb4-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="5">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">CONCEDENTE</th>
<th data-quarto-table-cell-role="th">CONCESSIONI</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
<th data-quarto-table-cell-role="th">AIUTI</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>BANCA DEL MEZZOGIORNO MEDIOCREDITO CENTRALE S.P.A.</td>
<td>14914</td>
<td>1,934,188,400.0</td>
<td>127,813,914.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>INPS</td>
<td>254432</td>
<td>1,427,160,166.0</td>
<td>1,427,160,166.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>48</td>
<td>192,359,736.0</td>
<td>152,555,160.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>MINISTERO DELLE IMPRESE E DEL MADE IN ITALY - DIPARTIMENTO PER LE POLITICHE PER LE IMPRESE - DIREZIONE GENERALE PER GLI INCENTIVI ALLE IMPRESE</td>
<td>2796</td>
<td>125,965,619.0</td>
<td>89,876,791.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE DEGLI INVESTIMENTI E LO SVILUPPO D'IMPRESA S.P.A.</td>
<td>299</td>
<td>102,743,941.0</td>
<td>78,368,900.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>REGIONE PUGLIA - DIPARTIMENTO SVILUPPO ECONOMICO</td>
<td>224</td>
<td>20,505,184.0</td>
<td>20,505,184.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>REGIONE AUTONOMA FRIULI VENEZIA GIULIA - DIREZIONE CENTRALE ATTIVITÀ PRODUTTIVE</td>
<td>66</td>
<td>18,257,297.0</td>
<td>3,121,015.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>INAIL - DIREZIONE CENTRALE PREVENZIONE</td>
<td>195</td>
<td>17,095,554.0</td>
<td>13,841,898.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>REGIONE PIEMONTE - DIREZIONE COORDINAMENTO POLITICHE E FONDI EUROPEI</td>
<td>449</td>
<td>14,386,187.0</td>
<td>14,386,187.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>REGIONE PIEMONTE - DIREZIONE AGRICOLTURA E CIBO</td>
<td>21</td>
<td>14,261,705.0</td>
<td>370,163.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="valori-raggruppati-per-data" class="level2" data-number="9.5">
<h2 data-number="9.5" class="anchored" data-anchor-id="valori-raggruppati-per-data"><span class="header-section-number">9.5</span> valori raggruppati per data</h2>
<div id="dec0a739" class="cell" data-execution_count="6">
<div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT CONCESSIONE, count(CAR) CONCESSIONI, sum(cast(NOMINALE as integer)) NOMINALE, sum(cast(AIUTO as integer)) AIUTI FROM 'OpenData_Aiuti_2025_01.parquet' group by 1 order by 1 desc"</span>).df()</span>
<span id="cb5-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="6">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">CONCESSIONE</th>
<th data-quarto-table-cell-role="th">CONCESSIONI</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
<th data-quarto-table-cell-role="th">AIUTI</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>2025-01-31</td>
<td>45421</td>
<td>561,196,693.0</td>
<td>278,277,081.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>2025-01-30</td>
<td>36476</td>
<td>208,556,936.0</td>
<td>202,515,587.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>2025-01-29</td>
<td>35686</td>
<td>132,254,858.0</td>
<td>128,777,052.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>2025-01-28</td>
<td>11855</td>
<td>369,797,160.0</td>
<td>125,641,874.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>2025-01-27</td>
<td>43586</td>
<td>350,755,398.0</td>
<td>343,786,019.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>2025-01-26</td>
<td>9</td>
<td>2,704.0</td>
<td>2,704.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>2025-01-25</td>
<td>44938</td>
<td>365,476,683.0</td>
<td>365,425,043.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>2025-01-24</td>
<td>40995</td>
<td>561,494,057.0</td>
<td>264,903,743.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>2025-01-23</td>
<td>12281</td>
<td>82,569,511.0</td>
<td>54,672,683.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>2025-01-22</td>
<td>630</td>
<td>28,215,232.0</td>
<td>23,393,064.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">10</td>
<td>2025-01-21</td>
<td>2774</td>
<td>333,887,613.0</td>
<td>39,562,598.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">11</td>
<td>2025-01-20</td>
<td>571</td>
<td>27,672,794.0</td>
<td>21,213,848.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">12</td>
<td>2025-01-19</td>
<td>8</td>
<td>367,150.0</td>
<td>352,471.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">13</td>
<td>2025-01-18</td>
<td>1</td>
<td>591.0</td>
<td>591.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">14</td>
<td>2025-01-17</td>
<td>3523</td>
<td>311,049,601.0</td>
<td>48,535,073.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">15</td>
<td>2025-01-16</td>
<td>645</td>
<td>34,591,334.0</td>
<td>21,170,260.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">16</td>
<td>2025-01-15</td>
<td>925</td>
<td>16,099,176.0</td>
<td>9,931,627.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">17</td>
<td>2025-01-14</td>
<td>2752</td>
<td>314,929,229.0</td>
<td>45,374,544.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">18</td>
<td>2025-01-13</td>
<td>447</td>
<td>88,345,912.0</td>
<td>74,084,195.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">19</td>
<td>2025-01-11</td>
<td>40</td>
<td>1,580,484.0</td>
<td>1,245,577.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">20</td>
<td>2025-01-10</td>
<td>2081</td>
<td>234,354,686.0</td>
<td>24,063,820.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">21</td>
<td>2025-01-09</td>
<td>1214</td>
<td>30,778,080.0</td>
<td>22,413,430.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">22</td>
<td>2025-01-08</td>
<td>374</td>
<td>14,845,848.0</td>
<td>12,419,061.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">23</td>
<td>2025-01-07</td>
<td>976</td>
<td>86,815,547.0</td>
<td>36,432,887.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">24</td>
<td>2025-01-06</td>
<td>5</td>
<td>50,002.0</td>
<td>50,002.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">25</td>
<td>2025-01-05</td>
<td>1</td>
<td>14,493.0</td>
<td>14,493.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">26</td>
<td>2025-01-04</td>
<td>23</td>
<td>520,966.0</td>
<td>520,966.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">27</td>
<td>2025-01-03</td>
<td>119</td>
<td>2,474,278.0</td>
<td>2,401,855.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">28</td>
<td>2025-01-02</td>
<td>124</td>
<td>39,363,816.0</td>
<td>22,420,932.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<section id="valori-raggruppati-per-regione" class="level3" data-number="9.5.1">
<h3 data-number="9.5.1" class="anchored" data-anchor-id="valori-raggruppati-per-regione"><span class="header-section-number">9.5.1</span> valori raggruppati per regione</h3>
<div id="f64df947" class="cell" data-execution_count="7">
<div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT upper(REGIONE) REGIONE, count(CAR), sum(cast(NOMINALE as integer)), sum(cast(AIUTO as integer)) FROM 'OpenData_Aiuti_2025_01.parquet' group by 1 order by 3 desc limit 10"</span>).df()</span>
<span id="cb6-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="7">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">REGIONE</th>
<th data-quarto-table-cell-role="th">count(CAR)</th>
<th data-quarto-table-cell-role="th">sum(CAST(NOMINALE AS INTEGER))</th>
<th data-quarto-table-cell-role="th">sum(CAST(AIUTO AS INTEGER))</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>LOMBARDIA</td>
<td>49892</td>
<td>873,593,711.0</td>
<td>545,073,929.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>CAMPANIA</td>
<td>31179</td>
<td>392,387,204.0</td>
<td>172,188,255.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>VENETO</td>
<td>24454</td>
<td>372,076,854.0</td>
<td>179,851,953.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>PIEMONTE</td>
<td>17998</td>
<td>326,266,290.0</td>
<td>151,577,391.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>LAZIO</td>
<td>22051</td>
<td>316,076,119.0</td>
<td>163,111,372.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>EMILIA-ROMAGNA</td>
<td>20436</td>
<td>295,503,890.0</td>
<td>168,523,740.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>PUGLIA</td>
<td>21462</td>
<td>275,952,282.0</td>
<td>128,651,247.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>SICILIA</td>
<td>24128</td>
<td>258,160,221.0</td>
<td>113,920,615.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>TOSCANA</td>
<td>16063</td>
<td>224,343,793.0</td>
<td>106,355,032.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>FRIULI-VENEZIA GIULIA</td>
<td>6176</td>
<td>127,429,098.0</td>
<td>80,238,575.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="valori-raggruppati-per-ateco" class="level3" data-number="9.5.2">
<h3 data-number="9.5.2" class="anchored" data-anchor-id="valori-raggruppati-per-ateco"><span class="header-section-number">9.5.2</span> valori raggruppati per ATECO</h3>
<div id="c09a377a" class="cell" data-execution_count="8">
<div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT upper(SETTORE_ATTIVITA) SETTORE_ATTIVITA, count(CAR), sum(cast(NOMINALE as integer)), sum(cast(AIUTO as integer)) FROM 'OpenData_Aiuti_2025_01.parquet' group by 1 order by 3 desc limit 10"</span>).df()</span>
<span id="cb7-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="8">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">SETTORE_ATTIVITA</th>
<th data-quarto-table-cell-role="th">count(CAR)</th>
<th data-quarto-table-cell-role="th">sum(CAST(NOMINALE AS INTEGER))</th>
<th data-quarto-table-cell-role="th">sum(CAST(AIUTO AS INTEGER))</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>F.41.2</td>
<td>9287</td>
<td>163,293,794.0</td>
<td>48,573,220.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>D.35.1</td>
<td>523</td>
<td>148,851,639.0</td>
<td>80,323,869.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>I.56.1</td>
<td>20292</td>
<td>144,082,919.0</td>
<td>82,794,010.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>F.43.2</td>
<td>10835</td>
<td>126,596,444.0</td>
<td>59,673,120.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>J.62.0</td>
<td>6811</td>
<td>117,881,630.0</td>
<td>83,690,826.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>H.49.4</td>
<td>5105</td>
<td>117,519,650.0</td>
<td>35,566,283.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>G.47.7</td>
<td>13507</td>
<td>97,903,520.0</td>
<td>57,478,971.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>D.35.2</td>
<td>97</td>
<td>94,972,219.0</td>
<td>90,234,671.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>G.46.4</td>
<td>4646</td>
<td>94,557,197.0</td>
<td>27,224,214.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>I.55.1</td>
<td>3550</td>
<td>88,270,063.0</td>
<td>36,006,125.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="valori-raggruppati-per-strumento" class="level3" data-number="9.5.3">
<h3 data-number="9.5.3" class="anchored" data-anchor-id="valori-raggruppati-per-strumento"><span class="header-section-number">9.5.3</span> valori raggruppati per strumento</h3>
<div id="17e79564" class="cell" data-execution_count="9">
<div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT upper(DES_STRUMENTO) STRUMENTO, count(CAR), sum(cast(NOMINALE as integer)), sum(cast(AIUTO as integer)) FROM 'OpenData_Aiuti_2025_01.parquet' group by 1 order by 2 desc limit 10"</span>).df()</span>
<span id="cb8-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="9">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">STRUMENTO</th>
<th data-quarto-table-cell-role="th">count(CAR)</th>
<th data-quarto-table-cell-role="th">sum(CAST(NOMINALE AS INTEGER))</th>
<th data-quarto-table-cell-role="th">sum(CAST(AIUTO AS INTEGER))</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>AGEVOLAZIONE FISCALE O ESENZIONE FISCALE</td>
<td>254746</td>
<td>1,442,732,051.0</td>
<td>1,442,123,047.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>SOVVENZIONE/CONTRIBUTO IN CONTO INTERESSI</td>
<td>16696</td>
<td>544,531,517.0</td>
<td>449,595,824.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>GARANZIA (SE DEL CASO CON UN RIFERIMENTO ALLA DECISIONE DELLA COMMISSIONE (10))</td>
<td>15473</td>
<td>1,976,479,946.0</td>
<td>129,662,953.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>PRESTITO/ANTICIPO RIMBORSABILE</td>
<td>495</td>
<td>106,765,282.0</td>
<td>26,157,762.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>SCONTO PER PARTECIPAZIONE A INIZIATIVE PROGRAMMATE (CATEGORIA: SOVVENZIONE/CONTRIBUTO IN CONTO INTERESSI)</td>
<td>449</td>
<td>14,386,187.0</td>
<td>14,386,187.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>EROGAZIONE SERVIZI (CATEGORIA: SOVVENZIONE/CONTRIBUTO IN CONTO INTERESSI)</td>
<td>188</td>
<td>2,729,160.0</td>
<td>2,176,276.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>MISURA PER IL FINANZIAMENTO DEL RISCHIO</td>
<td>103</td>
<td>9,039,541.0</td>
<td>7,376,896.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>CONTO CAPITALE A FONDO PERDUTO (CATEGORIA: MISURA PER IL FINANZIAMENTO DEL RISCHIO)</td>
<td>71</td>
<td>6,646,324.0</td>
<td>5,209,815.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>CONTRIBUTO A FONDO PERDUTO (CATEGORIA: SOVVENZIONE/CONTRIBUTO IN CONTO INTERESSI)</td>
<td>62</td>
<td>4,285,651.0</td>
<td>3,004,296.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>SCONTO SUL CANONE DI CONNETTIVITÀ (CATEGORIA: SOVVENZIONE/CONTRIBUTO IN CONTO INTERESSI)</td>
<td>45</td>
<td>70,750.0</td>
<td>70,750.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="gli-importi-più-grandi" class="level3" data-number="9.5.4">
<h3 data-number="9.5.4" class="anchored" data-anchor-id="gli-importi-più-grandi"><span class="header-section-number">9.5.4</span> gli importi più grandi</h3>
<div id="67b5b250" class="cell" data-execution_count="10">
<div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT IMPRESA, REGIONE, CONCEDENTE, MISURA, NOMINALE, AIUTO FROM 'OpenData_Aiuti_2025_01.parquet' order by 5 desc limit 20"</span>).df()</span>
<span id="cb9-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="10">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">IMPRESA</th>
<th data-quarto-table-cell-role="th">REGIONE</th>
<th data-quarto-table-cell-role="th">CONCEDENTE</th>
<th data-quarto-table-cell-role="th">MISURA</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
<th data-quarto-table-cell-role="th">AIUTO</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>BIOWASTE CH4 LEGNANO S.R.L.</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Decreto 2 marzo 2018: Promozione dell’uso del biometano e degli altri biocarburanti avanzati nel settore dei trasporti (GU n.65 del 19/3/2018)</td>
<td>32,489,271.33</td>
<td>32,489,271.33</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>ENIBIOCH4IN QUADRUVIUM - S.R.L. SOCIETA' AGRICOLA</td>
<td>Friuli-Venezia Giulia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Decreto 2 marzo 2018: Promozione dell’uso del biometano e degli altri biocarburanti avanzati nel settore dei trasporti (GU n.65 del 19/3/2018)</td>
<td>27,020,243.99</td>
<td>27,020,243.99</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>AMBIENTE &amp; RISORSE SRL</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Decreto 2 marzo 2018: Promozione dell’uso del biometano e degli altri biocarburanti avanzati nel settore dei trasporti (GU n.65 del 19/3/2018)</td>
<td>25,720,673.14</td>
<td>25,720,673.14</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>ENGIE SERVIZI S.P.A.</td>
<td>Lazio</td>
<td>REGIONE LAZIO</td>
<td>Regime di aiuti agli investimenti per la produzione di idrogeno rinnovabile in aree industriali dismesse – PNRR M2C2 Investimento 3.1</td>
<td>12,000,000.0</td>
<td>12,000,000.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>SOCIETA' AGRICOLA LORENZO S.S. DI ODETTO ALEX E LUCA</td>
<td>Piemonte</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>10,122,866.0</td>
<td>5,568,880.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>RANDSTAD ITALIA S.P.A.</td>
<td>Lombardia</td>
<td>INPS</td>
<td>Esonero dal versamento dei contributi previdenziali per nuove assunzioni/trasformazioni a tempo indeterminato nel biennio 2021 - 2022 (art. 1 commi 10 - 15 L. 178/2020)</td>
<td>9,490,693.25</td>
<td>9,490,693.25</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>BELLINI ANTONIO E FACCHI ANNA SOCIETA' AGRICOLA S.S.</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>8,859,626.0</td>
<td>4,873,935.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>AZ.AGRIC. CORTAZZA DI RIBONI GIOVANNI E LUIGI SOCIETA' AGRICOLA S S.</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>8,859,626.0</td>
<td>4,873,935.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>SAN GIORGIO DI CONTI GIORGIO &amp; C. S.S. SOCIETA' AGRICOLA</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>8,859,626.0</td>
<td>4,873,935.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>SOCIETA' AGRICOLA LE GAZZE</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>8,859,626.0</td>
<td>4,873,935.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">10</td>
<td>SOCIETA' AGRICOLA LANFREDI SOCIETA' SEMPLICE</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>8,859,626.0</td>
<td>4,775,453.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">11</td>
<td>SECCAMANI GIOVANNI, CRISTOFORO E ANTONIO SOCIETA' AGRICOLA S.S.</td>
<td>Lombardia</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>8,401,979.0</td>
<td>4,622,170.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">12</td>
<td>SISTEMI ENERGETICI S.P.A.</td>
<td>Puglia</td>
<td>REGIONE PUGLIA</td>
<td>Regime di aiuti agli investimenti per la produzione di idrogeno rinnovabile in aree industriali dismesse – PNRR M2C2 Investimento 3.1</td>
<td>8,000,000.0</td>
<td>8,000,000.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">13</td>
<td>POSTE ITALIANE - SOCIETA' PER AZIONI</td>
<td>Lazio</td>
<td>INPS</td>
<td>Esonero dal versamento dei contributi previdenziali per nuove assunzioni/trasformazioni a tempo indeterminato nel biennio 2021 - 2022 (art. 1 commi 10 - 15 L. 178/2020)</td>
<td>7,898,565.89</td>
<td>7,898,565.89</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">14</td>
<td>SCOGLIO DELLA GALEA</td>
<td>Calabria</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE DEGLI INVESTIMENTI E LO SVILUPPO D'IMPRESA S.P.A.</td>
<td>Contratti di sviluppo di cui all'articolo 43 del decreto-legge 25 giugno 2008, n.112, convertito dalla legge 6 agosto 2008, n. 133 (adeguamento GBER e proroga 2026)</td>
<td>7,100,824.97</td>
<td>7,100,824.97</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">15</td>
<td>MACCHIORLATTI VIGNAT F.LLI SOCIETA' SEMPLICE AGRICOLA</td>
<td>Piemonte</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>6,201,739.0</td>
<td>3,342,817.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">16</td>
<td>AZIMUT - BENETTI S.P.A.</td>
<td>Liguria, Piemonte, Toscana</td>
<td>MINISTERO DELLE IMPRESE E DEL MADE IN ITALY - DIPARTIMENTO PER LE POLITICHE PER LE IMPRESE - DIREZIONE GENERALE PER GLI INCENTIVI ALLE IMPRESE</td>
<td>Green New Deal</td>
<td>6,108,075.0</td>
<td>871,919.6</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">17</td>
<td>AZIMUT - BENETTI S.P.A.</td>
<td>Liguria, Piemonte, Toscana</td>
<td>MINISTERO DELLE IMPRESE E DEL MADE IN ITALY - DIPARTIMENTO PER LE POLITICHE PER LE IMPRESE - DIREZIONE GENERALE PER GLI INCENTIVI ALLE IMPRESE</td>
<td>Green New Deal</td>
<td>5,891,925.0</td>
<td>954,225.64</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">18</td>
<td>CASEIFICI GRANTERRE</td>
<td>Emilia-Romagna</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE DEGLI INVESTIMENTI E LO SVILUPPO D'IMPRESA S.P.A.</td>
<td>Contratti di sviluppo agroindustriali - 2023</td>
<td>5,659,164.0</td>
<td>5,659,164.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">19</td>
<td>CAMPIDANO AGROZOOTECNICA SOCIETA' AGRICOLA A R.L.</td>
<td>Sardegna</td>
<td>GSE - GESTORE SERVIZI ENERGETICI S.P.A.</td>
<td>Incentivazione dell'energia prodotta da impianti a biogas da reflui e materie derivanti dalle aziende agricole realizzatrici</td>
<td>5,408,350.0</td>
<td>3,005,000.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<hr>
</section>
</section>
<section id="analisi-per-concedente" class="level2" data-number="9.6">
<h2 data-number="9.6" class="anchored" data-anchor-id="analisi-per-concedente"><span class="header-section-number">9.6</span> Analisi per concedente</h2>
<p>Il nome del concedente viene scritto in modi diversi; non c’ il suo codice fiscale o la sua P.IVA</p>
<section id="un-esempio-gli-aiuti-concessi-da-invitalia" class="level3" data-number="9.6.1">
<h3 data-number="9.6.1" class="anchored" data-anchor-id="un-esempio-gli-aiuti-concessi-da-invitalia"><span class="header-section-number">9.6.1</span> Un esempio: gli aiuti concessi da Invitalia</h3>
<ul>
<li>INVITALIA - AGENZIA NAZIONALE PER L’ATTRAZIONE DEGLI INVESTIMENTI E LO SVILUPPO D’IMPRESA S.P.A.</li>
<li>AGENZIA NAZIONALE PER L’ATTRAZIONE DEGLI INVESTIMENTI E LO SVILUPPO D’IMPRESA SPA - INVITALIA (05678721001)</li>
</ul>
<div id="f1fef703" class="cell" data-execution_count="11">
<div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT upper(misura) MISURA, count(CAR) CONCESSIONI, sum(cast(NOMINALE as integer)) NOMINALE, sum(cast(AIUTO as integer)) AIUTI FROM 'OpenData_Aiuti_2025_01.parquet' where concedente like '%INVI%' group by 1 order by 3 desc limit 10"</span>).df()</span>
<span id="cb10-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="11">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">MISURA</th>
<th data-quarto-table-cell-role="th">CONCESSIONI</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
<th data-quarto-table-cell-role="th">AIUTI</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>INVESTIMENTI SOSTENIBILI 4.0 (PN RIC 2021-2027)</td>
<td>68</td>
<td>50,350,162.0</td>
<td>32,502,255.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>CONTRATTI DI SVILUPPO DI CUI ALL'ARTICOLO 43 DEL DECRETO-LEGGE 25 GIUGNO 2008, N.112, CONVERTITO DALLA LEGGE 6 AGOSTO 2008, N. 133 (ADEGUAMENTO GBER E PROROGA 2026)</td>
<td>6</td>
<td>18,240,078.0</td>
<td>18,240,078.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>FONDO PER IL SOSTEGNO ALLA TRANSIZIONE INDUSTRIALE</td>
<td>10</td>
<td>12,759,588.0</td>
<td>12,759,588.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>4:2:5 FONDO ROTATIVO IMPRESE (FRI) PER IL SOSTEGNO ALLE IMPRESE E GLI INVESTIMENTI DI SVILUPPO</td>
<td>39</td>
<td>8,856,020.0</td>
<td>8,144,283.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>NIT0 - NUOVE IMPRESE A TASSO ZERO</td>
<td>60</td>
<td>7,021,985.0</td>
<td>3,466,904.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>CONTRATTI DI SVILUPPO AGROINDUSTRIALI - 2023</td>
<td>1</td>
<td>5,659,164.0</td>
<td>5,659,164.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>PNRR, M1C3 INVESTIMENTI 4.2.1; 4.2.2 AVVISO PUBBLICO EX ARTT. 1 E 4 DL 152/2021</td>
<td>79</td>
<td>5,176,411.0</td>
<td>4,636,411.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>SMART&amp;START - RIORDINO DEGLI INTERVENTI DI SOSTEGNO ALLA NASCITA E ALLO SVILUPPO DI START-UP INNOVATIVE IN TUTTO IL TERRITORIO NAZIONALE - VERSIONE MODIFICATA DAL CODICE CE SA.55753</td>
<td>13</td>
<td>4,243,242.0</td>
<td>2,056,740.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>RESTO AL SUD</td>
<td>84</td>
<td>2,654,480.0</td>
<td>2,612,698.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>MAGGIORAZIONE DEL CONTRIBUTO PER L'ACQUISTO DI VEICOLI DI CATEGORIA M1 DA PARTE DEI TITOLARI DI LICENZE DI TAXI E DI SOGGETTI AUTORIZZATI ALL'ESERCIZIO DEL SERVIZIO DI NOLEGGIO CON CONDUCENTE ("ECOBONUS TAXI")</td>
<td>29</td>
<td>963,429.0</td>
<td>358,000.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="valori-raggruppati-per-data-1" class="level3" data-number="9.6.2">
<h3 data-number="9.6.2" class="anchored" data-anchor-id="valori-raggruppati-per-data-1"><span class="header-section-number">9.6.2</span> valori raggruppati per data</h3>
<div id="36cd87ca" class="cell" data-execution_count="12">
<div class="sourceCode cell-code" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb11-1">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT CONCESSIONE, count(CAR) CONCESSIONI, sum(cast(NOMINALE as integer)) NOMINALE, sum(cast(AIUTO as integer)) AIUTI FROM 'OpenData_Aiuti_2025_01.parquet' where concedente like '%INVI%' group by 1 order by 1 desc"</span>).df()</span>
<span id="cb11-2">df</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="12">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">CONCESSIONE</th>
<th data-quarto-table-cell-role="th">CONCESSIONI</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
<th data-quarto-table-cell-role="th">AIUTI</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>2025-01-31</td>
<td>32</td>
<td>12,053,460.0</td>
<td>9,138,731.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>2025-01-30</td>
<td>31</td>
<td>2,126,257.0</td>
<td>1,895,920.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>2025-01-29</td>
<td>2</td>
<td>18,000.0</td>
<td>18,000.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>2025-01-28</td>
<td>46</td>
<td>21,511,981.0</td>
<td>13,967,487.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>2025-01-24</td>
<td>22</td>
<td>3,362,163.0</td>
<td>3,357,630.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>2025-01-23</td>
<td>8</td>
<td>1,808,445.0</td>
<td>1,699,898.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>2025-01-22</td>
<td>47</td>
<td>18,047,651.0</td>
<td>16,968,552.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>2025-01-21</td>
<td>13</td>
<td>5,512,491.0</td>
<td>5,046,747.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>2025-01-20</td>
<td>1</td>
<td>28,465.0</td>
<td>22,772.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>2025-01-17</td>
<td>6</td>
<td>6,713,997.0</td>
<td>6,601,489.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">10</td>
<td>2025-01-16</td>
<td>10</td>
<td>647,664.0</td>
<td>452,834.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">11</td>
<td>2025-01-15</td>
<td>16</td>
<td>407,978.0</td>
<td>401,896.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">12</td>
<td>2025-01-14</td>
<td>11</td>
<td>516,138.0</td>
<td>383,999.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">13</td>
<td>2025-01-13</td>
<td>20</td>
<td>3,642,972.0</td>
<td>2,804,801.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">14</td>
<td>2025-01-10</td>
<td>20</td>
<td>631,420.0</td>
<td>495,439.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">15</td>
<td>2025-01-09</td>
<td>2</td>
<td>309,576.0</td>
<td>204,666.0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">16</td>
<td>2025-01-08</td>
<td>14</td>
<td>4,021,859.0</td>
<td>3,656,132.0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">17</td>
<td>2025-01-07</td>
<td>116</td>
<td>35,415,855.0</td>
<td>24,032,601.0</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>


</section>
</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Agevolazioni</category>
  <category>Invitalia</category>
  <category>Python</category>
  <category>RNA</category>
  <category>Opendata</category>
  <guid>https://paolovolterra.com/posts/2508_RNA/RNA.html</guid>
  <pubDate>Sat, 11 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Come Pubblicare su un sito Github</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2506_Github/PubblicareSuGithub.html</link>
  <description><![CDATA[ 




<p><em>Premessa: un immenso grazie a Chatgpt</em></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2506_Github/immagini/1_CWFkh5z8oa6dZfn5_gkKKQ.jpg" class="img-fluid figure-img"></p>
<figcaption>cover</figcaption>
</figure>
</div>
<p>si lavora con molti tipi di files: yaml, qmd, css, …</p>
<p><strong>devono essere precedentemente configurati</strong> :</p>
<ul>
<li>git</li>
<li>github</li>
</ul>
<p>un esempio impattante:</p>
<ul>
<li>sposto il progetto in un’altra cartella locale</li>
</ul>
<hr>
<section id="i-comandi-basilari" class="level2">
<h2 class="anchored" data-anchor-id="i-comandi-basilari">I comandi basilari</h2>
<p>Non è necessario specificare manualmente il file <code>.qmd</code> in tutti i comandi, ma devi farlo nei comandi <code>quarto render</code> o <code>quarto preview</code>. Gli altri comandi possono lavorare con un approccio più generico, come <code>git add .</code>, per includere tutte le modifiche.</p>
<ol type="1">
<li><p>quarto preview d:/paolovolterra.github.io/posts/202508_RNA/RNA.qmd</p></li>
<li><p>quarto render d:/paolovolterra.github.io/posts/202508_RNA/RNA.qmd</p></li>
<li><p>git add d:/paolovolterra.github.io/docs/posts/202508_RNA/RNA.html</p></li>
<li><p>git add . (se hai rilevato altre modifiche e le voi introitare)</p></li>
<li><p>git status</p></li>
<li><p>git commit -m “Aggiornata la pagina: RNA”</p></li>
<li><p>git pull origin main –rebase</p></li>
<li><p>git push origin main</p></li>
<li><p>git log</p></li>
</ol>
<section id="flusso-di-lavoro-ottimizzato" class="level3">
<h3 class="anchored" data-anchor-id="flusso-di-lavoro-ottimizzato">Flusso di lavoro ottimizzato</h3>
<p>Se modifichi un solo file <code>.qmd</code> (ad esempio, <code>RNA.qmd</code>), puoi seguire questo flusso semplificato:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">quarto</span> render d:/paolovolterra.github.io/posts/202508_RNA/RNA.qmd</span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> add d:/paolovolterra.github.io/docs/posts/202508_RNA/RNA.html</span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> commit <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-m</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Aggiornata la pagina: RNA"</span></span>
<span id="cb1-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> pull origin main <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--rebase</span></span>
<span id="cb1-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> push origin main</span></code></pre></div></div>
<ol type="1">
<li>Genera l’output dal file modificato</li>
<li>Aggiungi i file modificati</li>
<li>Crea il commit</li>
<li>Sincronizza con il repository remoto</li>
</ol>
</section>
<section id="se-ci-sono-altri-file-modificati" class="level3">
<h3 class="anchored" data-anchor-id="se-ci-sono-altri-file-modificati">Se ci sono altri file modificati</h3>
<p>(es. <code>posts.html</code>, <code>sitemap.xml</code>), questi potrebbero essere stati rigenerati automaticamente da Quarto. Per gestire anche questi file:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> add .</span>
<span id="cb2-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> commit <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-m</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Aggiornati file generati automaticamente"</span></span>
<span id="cb2-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> push origin main</span></code></pre></div></div>
<p>Se vuoi evitare di eseguire manualmente questi comandi per ogni file, puoi creare uno script Bash o Batch.</p>
</section>
</section>
<section id="riferimenti" class="level2">
<h2 class="anchored" data-anchor-id="riferimenti">Riferimenti</h2>
<ul>
<li><a href="https://aborruso.github.io/til/un-sito-in-quarto/">Il mio primo blog post</a>con Quarto [[Il mio primo blog post – aborruso’s website]]</li>
<li><a href="https://ucsb-meds.github.io/creating-quarto-websites/">Creating your personal website using Quarto</a> con Quarto [[Creating your personal website using Quarto]]</li>
<li><a href="https://quarto.org/docs/websites/">Creating a Website (dal sito ufficiale)</a></li>
<li><a href="https://quarto.org/docs/websites/website-blog.html">Creating a Blog (dal sito ufficiale)</a></li>
<li><a href="https://ucsb-meds.github.io/MEDS-installation-guide/">MEDS Computing Requirements &amp; Software Installation Guide</a> con RStudio</li>
</ul>
</section>
<section id="bibtex" class="level2">
<h2 class="anchored" data-anchor-id="bibtex">Bibtex</h2>
<p>https://www.getbibtex.com/</p>
<p><span class="citation" data-cites="misc">@misc</span>{aborrusoPrimoBlog, author = {Andrea Borruso}, title = {{I}l mio primo blog post – aborruso’s website — aborruso.github.io}, howpublished = {}, year = {}, note = {[Accessed 11-01-2025]}, }</p>
<p><span class="citation" data-cites="misc">@misc</span>{marvinschmittCreateYour, author = {Marvin Schmitt}, title = {{C}reate {Y}our {W}ebsite with {Q}uarto: {C}omplete {T}utorial and {T}emplate — marvinschmitt.com}, howpublished = {}, year = {}, note = {[Accessed 11-01-2025]}, }</p>
<p><span class="citation" data-cites="misc">@misc</span>{adtariePersonalWebsite, author = {A.A. Wijaya}, title = {{P}ersonal {W}ebsite using {J}upyter {N}otebook and {Q}uarto – {F}oreland of {T}houghts — adtarie.net}, howpublished = {}, year = {}, note = {[Accessed 11-01-2025]}, }</p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Github</category>
  <category>Quarto</category>
  <category>Python</category>
  <guid>https://paolovolterra.com/posts/2506_Github/PubblicareSuGithub.html</guid>
  <pubDate>Fri, 10 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Il tech in banca</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html</link>
  <description><![CDATA[ 




<p><img src="https://paolovolterra.com/posts/2506_IAInBanca/immagini/efb2edd4-f277-47ab-9f65-b8ca97181251.webp" class="img-fluid"></p>
<p>Un <a href="https://www.bloomberg.com/news/articles/2025-01-09/wall-street-expected-to-shed-200-000-jobs-as-ai-erodes-roles?srnd=technology-ai">report</a> di Bloomberg Intelligence prevede che l’intelligenza artificiale causerà la riduzione di circa 200.000 posti di lavoro nel settore bancario globale nei prossimi 3-5 anni <span class="citation" data-cites="wall_street_job_losses_ai">(Bloomberg News, 2025)</span>.</p>
<p><img src="https://paolovolterra.com/posts/2506_IAInBanca/immagini/Screenshot 2025-01-10 150944.png" class="img-fluid"></p>
<p>Nel marzo del 2023, Goldman Sachs aveva pubblicato una ricerca secondo la quale nei successivi 10 anni si sarebbero persi 300 milioni di posti di lavoro.</p>
<p>Secondo <a href="https://www.bcg.com/press/6september2023-lutilizzo-di-strumenti-di-genai-riduce-i-tempi-di-lavoro-del-50-per-singola-attivita">BCG</a> l’utilizzo di strumenti di GenAI ridurrà i tempi di lavoro del 50% per singola attività.</p>
<p>Questo cambiamento riguarderà soprattutto mansioni ripetitive del back office e di assistenza clienti, ma porterà anche a un aumento della produttività e dei profitti per le banche, stimato tra il 12% e il 17%.</p>
<p>Sebbene molti posti di lavoro siano a rischio di automazione, si assisterà più a una trasformazione dei ruoli che a una sostituzione totale, con la creazione di nuove posizioni legate allo sviluppo e alla gestione dell’AI.</p>
<p>In un precedente articolo (Il Sole 24 Ore Mercoledì 4 Dicembre 2024) si discuteva dell’impatto della #GenAI evidenziando una mancanza di preparazione significativa da parte delle istituzioni.</p>
<p><img src="https://paolovolterra.com/posts/2506_IAInBanca/immagini/DALL·E 2025-01-10 19.55.20 - A futuristic depiction of AI technologies automating repetitive manual tasks in a banking environment. The image includes robotic arms sorting paperwo.webp" class="img-fluid"></p>
<p>Mentre molte banche si concentrano sul taglio dei costi tramite la GenAI (63% degli istituti secondo BCG), il successo delle strategie dipende soprattutto dal fattore umano (70%), attraverso la riqualificazione del personale e la trasformazione organizzativa.</p>
<p>Studi di Banca d’Italia confermano l’alta esposizione del settore finanziario alla sostituzione automatizzata di posti di lavoro, sottolineando la necessità di investimenti significativi in formazione e upskilling per evitare conseguenze negative.</p>
<p>Secondo il report #Bankit <a href="https://www.bancaditalia.it/pubblicazioni/qef/2024-0878/index.html">An assessment of occupational exposure to artificial intelligence in Italy</a>, l’#IA è già presente e il suo impatto crescerà esponenzialmente.</p>
<p>C’è però scarsezza di piani specifici per lo sviluppo delle competenze in GenAI nel settore bancario a livello globale (solo il 5% delle banche ne ha uno).</p>
<section id="le-tech" class="level2">
<h2 class="anchored" data-anchor-id="le-tech">Le “Tech”</h2>
<p><img src="https://paolovolterra.com/posts/2506_IAInBanca/immagini/DALL·E 2025-01-10 09.11.44 - A futuristic virtual environment featuring a steampunk-style robot dressed as a 19th-century banker. The robot wears a formal suit with a top hat and .webp" class="img-fluid"></p>
<p>Molte delle ultime tecnologie utilizzano l’<strong>intelligenza artificiale #IA</strong> e, in alcuni casi, <strong>robot</strong> (sia fisici che software) per migliorare i servizi bancari e finanziari:</p>
<p>L’<strong>Intelligenza Artificiale (IA)</strong> è ampiamente utilizzata in quasi tutte le tecnologie per migliorare l’efficienza, personalizzare i servizi, analizzare grandi quantità di dati e rafforzare la sicurezza. I <strong>Robot Software</strong>, come i chatbot e i processi automatizzati (RPA), sono comuni in <strong>AI/ML in Banking</strong>, <strong>RegTech</strong>, <strong>WealthTech</strong> e altre aree per automatizzare le interazioni con i clienti e i processi interni. I <strong>Robot Fisici</strong>, meno comuni nel settore bancario, possono essere utilizzati in <strong>filiali sperimentali</strong> per migliorare l’esperienza del cliente o in ambito <strong>IoT</strong>, come ATM intelligenti.</p>
</section>
<section id="tabella-delle-tech" class="level2">
<h2 class="anchored" data-anchor-id="tabella-delle-tech">Tabella delle Tech</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th><strong>Tecnologia</strong></th>
<th><strong>Descrizione</strong></th>
<th><strong>Esempi</strong></th>
<th><strong>Lavori Ripetitivi Sostituibili</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>AI/ML in Banking</strong></td>
<td>Intelligenza artificiale per automazione, prevenzione frodi e analisi.</td>
<td>Chatbot bancari, rilevamento frodi con AI.</td>
<td>Gestione delle richieste di base dei clienti, monitoraggio delle transazioni, analisi dei dati.</td>
</tr>
<tr class="even">
<td><strong>Biometric Banking</strong></td>
<td>Tecnologie biometriche per autenticazione sicura.</td>
<td>Riconoscimento facciale, impronte digitali, scansione dell’iride.</td>
<td>Verifica dell’identità manuale, controllo accessi fisici.</td>
</tr>
<tr class="odd">
<td><strong>Cloud Banking Technology</strong></td>
<td>Infrastrutture cloud per maggiore agilità, scalabilità e riduzione dei costi.</td>
<td>AWS, Microsoft Azure per servizi bancari.</td>
<td>Gestione manuale di infrastrutture IT e backup.</td>
</tr>
<tr class="even">
<td><strong>CryptoTech</strong></td>
<td>Tecnologie basate su blockchain e criptovalute.</td>
<td>Binance, Coinbase, wallet digitali.</td>
<td>Esecuzione manuale di transazioni ripetitive.</td>
</tr>
<tr class="odd">
<td><strong>CyberTech</strong></td>
<td>Soluzioni di cybersecurity per proteggere da attacchi e violazioni.</td>
<td>Autenticazione biometrica, crittografia avanzata.</td>
<td>Monitoraggio manuale della sicurezza, risposta a minacce.</td>
</tr>
<tr class="even">
<td><strong>DataTech</strong></td>
<td>Analisi dei Big Data per decisioni strategiche e personalizzazione.</td>
<td>CRM avanzati, strumenti di data visualization.</td>
<td>Elaborazione manuale di report e analisi dati.</td>
</tr>
<tr class="odd">
<td><strong>FinTech</strong></td>
<td>Innovazioni nei servizi finanziari tradizionali.</td>
<td>PayPal, Stripe, Revolut, N26.</td>
<td>Elaborazione di pagamenti, apertura conti, riconciliazioni manuali.</td>
</tr>
<tr class="even">
<td><strong>Green Finance Technology</strong></td>
<td>Soluzioni per gestire finanziamenti sostenibili e monitorare l’impatto ambientale.</td>
<td>Piattaforme ESG per il monitoraggio ambientale.</td>
<td>Raccolta manuale di dati ESG, preparazione di report ambientali.</td>
</tr>
<tr class="odd">
<td><strong>InsurTech</strong></td>
<td>Tecnologie per migliorare i processi assicurativi.</td>
<td>Lemonade, Trov.</td>
<td>Elaborazione manuale di richieste di sinistri, valutazione rischi di base.</td>
</tr>
<tr class="even">
<td><strong>IoT in Banking</strong></td>
<td>Dispositivi connessi per migliorare l’esperienza bancaria.</td>
<td>Wearable per pagamenti contactless, ATM intelligenti.</td>
<td>Operazioni di cassa fisica, interazioni di base con i clienti.</td>
</tr>
<tr class="odd">
<td><strong>LendTech</strong></td>
<td>Tecnologie per il prestito e valutazioni del credito.</td>
<td>LendingClub, Funding Circle.</td>
<td>Valutazioni manuali del credito, gestione delle pratiche di prestito.</td>
</tr>
<tr class="even">
<td><strong>Open Banking Technology</strong></td>
<td>API per condividere dati finanziari con terze parti in modo sicuro.</td>
<td>Soluzioni basate su PSD2 in Europa.</td>
<td>Raccolta e condivisione manuale di dati con terze parti.</td>
</tr>
<tr class="odd">
<td><strong>PayTech</strong></td>
<td>Tecnologie per pagamenti digitali.</td>
<td>Google Pay, Apple Pay, SumUp.</td>
<td>Elaborazione manuale dei pagamenti, riconciliazione transazioni.</td>
</tr>
<tr class="even">
<td><strong>PropTech</strong></td>
<td>Tecnologie per il settore immobiliare.</td>
<td>Zillow, Casavo, piattaforme per la valutazione immobiliare.</td>
<td>Valutazioni immobiliari manuali, raccolta dati di mercato.</td>
</tr>
<tr class="odd">
<td><strong>RegTech</strong></td>
<td>Tecnologie per la conformità normativa.</td>
<td>Piattaforme di compliance automatizzata, analisi normativa con AI.</td>
<td>Controllo manuale della conformità normativa, generazione report di audit.</td>
</tr>
<tr class="even">
<td><strong>WealthTech</strong></td>
<td>Soluzioni per la gestione del patrimonio e investimenti.</td>
<td>Betterment, eToro, Moneyfarm.</td>
<td>Analisi patrimoniale di base, consulenza finanziaria ripetitiva.</td>
</tr>
</tbody>
</table>
</section>
<section id="riferimenti-bibliografici" class="level1">
<h1>Riferimenti Bibliografici</h1>
<ol type="1">
<li>Wall Street potrebbe perdere oltre 200.000 posti di lavoro a causa dell’IA <span class="citation" data-cites="wall_street_job_losses_ai">(Bloomberg News, 2025)</span>.</li>
<li>L’IA sostituirà 200.000 dipendenti nel settore bancario <span class="citation" data-cites="banche_ai_200k_dipendenti_ilsole24ore">(Il Sole 24 Ore, 2025)</span>.</li>
<li>L’IA manderà in ‘pensione’ molti lavoratori bancari <span class="citation" data-cites="banche_ai_200k_dipendenti_italiaoggi">(Italia Oggi, 2025)</span>.</li>
<li>JPMorgan utilizza l’IA per aumentare i posti di lavoro anziché sostituirli <span class="citation" data-cites="jpmorgan_ai_rollout_jobs">(Bloomberg News, 2024b)</span>.</li>
<li>Citi ritiene che l’IA sostituirà più lavori nel settore bancario rispetto ad altri settori <span class="citation" data-cites="citi_ai_displacing_jobs">(Bloomberg News, 2024a)</span>.</li>
<li>Dimon vede l’IA offrire una settimana lavorativa di 3 giorni e mezzo per le generazioni future <span class="citation" data-cites="dimon_ai_shorter_workweek">(Bloomberg News, 2023)</span>.</li>
</ol>



</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">Referenze</h2><div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0" data-line-spacing="2">
<div id="ref-dimon_ai_shorter_workweek" class="csl-entry">
Bloomberg News. (2023). Dimon vede l’intelligenza artificiale offrire una settimana lavorativa di 3 giorni e mezzo alla prossima generazione. <em>Bloomberg</em>. <a href="https://www.bloomberg.com/news/articles/2023-10-02/dimon-sees-ai-giving-a-3-1-2-day-workweek-to-the-next-generation">https://www.bloomberg.com/news/articles/2023-10-02/dimon-sees-ai-giving-a-3-1-2-day-workweek-to-the-next-generation</a>
</div>
<div id="ref-citi_ai_displacing_jobs" class="csl-entry">
Bloomberg News. (2024a). Citi ritiene che l’intelligenza artificiale sostituirà più posti di lavoro bancari rispetto a qualsiasi altro settore. <em>Bloomberg</em>. <a href="https://www.bloomberg.com/news/articles/2024-06-19/citi-sees-ai-displacing-more-finance-jobs-than-any-other-sector">https://www.bloomberg.com/news/articles/2024-06-19/citi-sees-ai-displacing-more-finance-jobs-than-any-other-sector</a>
</div>
<div id="ref-jpmorgan_ai_rollout_jobs" class="csl-entry">
Bloomberg News. (2024b). Il lancio dell’intelligenza artificiale di JPMorgan sta aumentando i posti di lavoro, non li sostituisce. <em>Bloomberg</em>. <a href="https://www.bloomberg.com/news/articles/2024-11-21/jpmorgan-s-ai-rollout-is-augmenting-jobs-not-replacing-them">https://www.bloomberg.com/news/articles/2024-11-21/jpmorgan-s-ai-rollout-is-augmenting-jobs-not-replacing-them</a>
</div>
<div id="ref-wall_street_job_losses_ai" class="csl-entry">
Bloomberg News. (2025). Wall Street Job Losses May Top 200,000 as AI Replaces Roles. <em>Bloomberg</em>. <a href="https://www.bloomberg.com/news/articles/2025-01-09/wall-street-expected-to-shed-200-000-jobs-as-ai-erodes-roles?embedded-checkout=true&amp;leadSource=uverify%20wall">https://www.bloomberg.com/news/articles/2025-01-09/wall-street-expected-to-shed-200-000-jobs-as-ai-erodes-roles?embedded-checkout=true&amp;leadSource=uverify%20wall</a>
</div>
<div id="ref-banche_ai_200k_dipendenti_ilsole24ore" class="csl-entry">
Il Sole 24 Ore. (2025). Banche, l’intelligenza artificiale pronta a sostituire 200mila dipendenti. <em>Il Sole 24 Ore</em>. <a href="https://www.ilsole24ore.com/art/banche-l-intelligenza-artificiale-pronta-sostituire-200mila-dipendenti-AG0Gp0CC">https://www.ilsole24ore.com/art/banche-l-intelligenza-artificiale-pronta-sostituire-200mila-dipendenti-AG0Gp0CC</a>
</div>
<div id="ref-banche_ai_200k_dipendenti_italiaoggi" class="csl-entry">
Italia Oggi. (2025). Banche, così l’intelligenza artificiale manderà in <span>«pensione»</span> 200mila dipendenti. <em>Italia Oggi</em>. <a href="https://www.italiaoggi.it/economia-e-politica/economia-e-finanza/banche-cosi-lintelligenza-artificiale-mandera-in-pensione-200mila-dipendenti-lax1rpus">https://www.italiaoggi.it/economia-e-politica/economia-e-finanza/banche-cosi-lintelligenza-artificiale-mandera-in-pensione-200mila-dipendenti-lax1rpus</a>
</div>
</div></section></div> ]]></description>
  <category>AI</category>
  <category>Tech</category>
  <category>Banche</category>
  <category>Bankit</category>
  <category>Lavoro</category>
  <guid>https://paolovolterra.com/posts/2506_IAInBanca/IaBanca.html</guid>
  <pubDate>Thu, 09 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Fondo transizione industriale</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2504_FTI/FTI.html</link>
  <description><![CDATA[ 




<div id="cell-2" class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pyarrow.parquet <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pq</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> duckdb</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb1-5">os.chdir(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'D:/duckdb/files/RNA2/'</span>)</span>
<span id="cb1-6"></span>
<span id="cb1-7">con <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> duckdb.<span class="ex" style="color: null;
background-color: null;
font-style: inherit;">connect</span>()</span>
<span id="cb1-8">con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRAGMA threads=8"</span>)</span>
<span id="cb1-9">con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRAGMA enable_object_cache"</span>) </span>
<span id="cb1-10">pd.options.display.float_format <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{:,}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'</span>.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">format</span></span>
<span id="cb1-11">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(con.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SELECT * FROM '*.parquet' where CAR = '27929' order by concessione desc"</span>).df())</span></code></pre></div></div>
</div>
<div id="cell-3" class="cell" data-execution_count="17">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'NOMINALE'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000000</span></span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="17">
<pre><code>37.66737432000001</code></pre>
</div>
</div>
<div id="cell-4" class="cell" data-execution_count="15">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">df.head()</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="15">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">CAR</th>
<th data-quarto-table-cell-role="th">MISURA</th>
<th data-quarto-table-cell-role="th">COD_CE_MISURA</th>
<th data-quarto-table-cell-role="th">BASE_GIURIDICA_NAZIONALE</th>
<th data-quarto-table-cell-role="th">CONCEDENTE</th>
<th data-quarto-table-cell-role="th">COR</th>
<th data-quarto-table-cell-role="th">TITOLO_PROGETTO</th>
<th data-quarto-table-cell-role="th">DESCRIZIONE_PROGETTO</th>
<th data-quarto-table-cell-role="th">CONCESSIONE</th>
<th data-quarto-table-cell-role="th">ATTO_CONCESSIONE</th>
<th data-quarto-table-cell-role="th">...</th>
<th data-quarto-table-cell-role="th">CF</th>
<th data-quarto-table-cell-role="th">DES_TIPO_BENEFICIARIO</th>
<th data-quarto-table-cell-role="th">REGIONE</th>
<th data-quarto-table-cell-role="th">ID_COMPONENTE_AIUTO</th>
<th data-quarto-table-cell-role="th">DES_PROCEDIMENTO</th>
<th data-quarto-table-cell-role="th">DESSETTORE_ATTIVITA_OBIETTIVO</th>
<th data-quarto-table-cell-role="th">SETTORE_ATTIVITA</th>
<th data-quarto-table-cell-role="th">DES_STRUMENTO</th>
<th data-quarto-table-cell-role="th">AIUTO</th>
<th data-quarto-table-cell-role="th">NOMINALE</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<th data-quarto-table-cell-role="th">0</th>
<td>27929</td>
<td>Fondo per il sostegno alla transizione industr...</td>
<td>SA.110221</td>
<td>Decreto interministeriale 21 ottobre 2022 - Fo...</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE...</td>
<td>23265345</td>
<td>ENERGY CONSUMPTION SAVINGS</td>
<td>Il progetto si compone dei seguenti interventi...</td>
<td>2025-01-21</td>
<td>Delibera</td>
<td>...</td>
<td>00717800247</td>
<td>Grande impresa</td>
<td>Toscana</td>
<td>25852888</td>
<td>Esenzione</td>
<td>Aiuti per la tutela dell'ambiente | Aiuti agli...</td>
<td>C.23.1</td>
<td>Sovvenzione/Contributo in conto interessi</td>
<td>1,764,900.0</td>
<td>1,764,900.0</td>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">1</th>
<td>27929</td>
<td>Fondo per il sostegno alla transizione industr...</td>
<td>SA.110221</td>
<td>Decreto interministeriale 21 ottobre 2022 - Fo...</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE...</td>
<td>23265345</td>
<td>ENERGY CONSUMPTION SAVINGS</td>
<td>Il progetto si compone dei seguenti interventi...</td>
<td>2025-01-21</td>
<td>Delibera</td>
<td>...</td>
<td>00717800247</td>
<td>Grande impresa</td>
<td>Toscana</td>
<td>25852887</td>
<td>Esenzione</td>
<td>Aiuti per la tutela dell'ambiente | Aiuti agli...</td>
<td>C.23.1</td>
<td>Sovvenzione/Contributo in conto interessi</td>
<td>1,667,738.0</td>
<td>1,667,738.0</td>
</tr>
<tr class="odd">
<th data-quarto-table-cell-role="th">2</th>
<td>27929</td>
<td>Fondo per il sostegno alla transizione industr...</td>
<td>SA.110221</td>
<td>Decreto interministeriale 21 ottobre 2022 - Fo...</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE...</td>
<td>23265342</td>
<td>WATER CONSUMPTION SAVINGS</td>
<td>Il progetto prevede la realizzazione di una va...</td>
<td>2025-01-21</td>
<td>Delibera</td>
<td>...</td>
<td>00717800247</td>
<td>Grande impresa</td>
<td>Toscana</td>
<td>25852886</td>
<td>Esenzione</td>
<td>Aiuti per la tutela dell'ambiente | Aiuti agli...</td>
<td>C.23.1</td>
<td>Sovvenzione/Contributo in conto interessi</td>
<td>1,092,383.6</td>
<td>1,092,383.6</td>
</tr>
<tr class="even">
<th data-quarto-table-cell-role="th">3</th>
<td>27929</td>
<td>Fondo per il sostegno alla transizione industr...</td>
<td>SA.110221</td>
<td>Decreto interministeriale 21 ottobre 2022 - Fo...</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE...</td>
<td>23257872</td>
<td>Progetto efficentamento energetico</td>
<td>Progetto costituito da tre interventi per la ...</td>
<td>2025-01-08</td>
<td>Delibera</td>
<td>...</td>
<td>00712180165</td>
<td>Grande impresa</td>
<td>Lombardia</td>
<td>25843691</td>
<td>Esenzione</td>
<td>Aiuti per la tutela dell'ambiente | Aiuti agli...</td>
<td>C.21.1</td>
<td>Sovvenzione/Contributo in conto interessi</td>
<td>1,072,542.6</td>
<td>1,072,542.6</td>
</tr>
<tr class="odd">
<th data-quarto-table-cell-role="th">4</th>
<td>27929</td>
<td>Fondo per il sostegno alla transizione industr...</td>
<td>SA.110221</td>
<td>Decreto interministeriale 21 ottobre 2022 - Fo...</td>
<td>INVITALIA - AGENZIA NAZIONALE PER L'ATTRAZIONE...</td>
<td>23257872</td>
<td>Progetto efficentamento energetico</td>
<td>Progetto costituito da tre interventi per la ...</td>
<td>2025-01-08</td>
<td>Delibera</td>
<td>...</td>
<td>00712180165</td>
<td>Grande impresa</td>
<td>Lombardia</td>
<td>25843689</td>
<td>Esenzione</td>
<td>Aiuti per la tutela dell'ambiente | Aiuti agli...</td>
<td>C.21.1</td>
<td>Sovvenzione/Contributo in conto interessi</td>
<td>1,145,144.7</td>
<td>1,145,144.7</td>
</tr>
</tbody>
</table>

<p>5 rows × 21 columns</p>
</div>
</div>
</div>
<div id="cell-5" class="cell" data-execution_count="10">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>Requirement already satisfied: pyperclip in c:\users\pvolterr\appdata\local\programs\python\python311\lib\site-packages (1.8.2)Note: you may need to restart the kernel to use updated packages.
</code></pre>
</div>
</div>
<div id="cell-6" class="cell" data-execution_count="12">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># pip install pyperclip</span></span>
<span id="cb7-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pyperclip</span>
<span id="cb7-3"></span>
<span id="cb7-4"></span>
<span id="cb7-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Generare la descrizione statistica</span></span>
<span id="cb7-6">desc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df.describe()</span>
<span id="cb7-7"></span>
<span id="cb7-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Convertire in Markdown</span></span>
<span id="cb7-9">markdown_table <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> desc.to_markdown()</span>
<span id="cb7-10"></span>
<span id="cb7-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Copiare negli appunti</span></span>
<span id="cb7-12">desc.to_clipboard(excel<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb7-13"></span>
<span id="cb7-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Stampare l'output Markdown (opzionale)</span></span>
<span id="cb7-15"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(markdown_table)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>|       | CONCESSIONE                |            AIUTO |         NOMINALE |
|:------|:---------------------------|-----------------:|-----------------:|
| count | 42                         |     42           |     42           |
| mean  | 2024-12-15 04:34:17.142857 | 896842           | 896842           |
| min   | 2024-11-21 00:00:00        |   6654           |   6654           |
| 25%   | 2024-12-05 06:00:00        | 324975           | 324975           |
| 50%   | 2024-12-10 00:00:00        | 719529           | 719529           |
| 75%   | 2024-12-21 00:00:00        |      1.28083e+06 |      1.28083e+06 |
| max   | 2025-01-21 00:00:00        |      3.58136e+06 |      3.58136e+06 |
| std   | nan                        | 777162           | 777162           |</code></pre>
</div>
</div>
<div id="cell-7" class="cell" data-execution_count="13">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'NOMINALE'</span>].hist()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2504_FTI/FTI_files/figure-html/cell-7-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
<div id="cell-8" class="cell" data-execution_count="14">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1">df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'NOMINALE'</span>].describe()</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="14">
<pre><code>count                 42.0
mean    896,842.2457142859
std      777,161.938712291
min                6,654.0
25%              324,975.0
50%            719,529.175
75%         1,280,833.2475
max           3,581,357.84
Name: NOMINALE, dtype: float64</code></pre>
</div>
</div>
<div id="cell-9" class="cell" data-execution_count="18">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb12-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> seaborn <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> sns</span>
<span id="cb12-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb12-3"></span>
<span id="cb12-4"></span>
<span id="cb12-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Creare l'istogramma con Seaborn</span></span>
<span id="cb12-6">sns.set_style(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"whitegrid"</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Stile estetico</span></span>
<span id="cb12-7">plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>))  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Dimensione del grafico</span></span>
<span id="cb12-8">sns.histplot(df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NOMINALE"</span>], bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, kde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"royalblue"</span>)</span>
<span id="cb12-9"></span>
<span id="cb12-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Titoli e etichette</span></span>
<span id="cb12-11">plt.title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Distribuzione della variabile NOMINALE"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>)</span>
<span id="cb12-12">plt.xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Valori di NOMINALE"</span>)</span>
<span id="cb12-13">plt.ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Frequenza"</span>)</span>
<span id="cb12-14"></span>
<span id="cb12-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostrare il grafico</span></span>
<span id="cb12-16">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>C:\Users\PVolterr\AppData\Roaming\Python\Python311\site-packages\seaborn\_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.
  with pd.option_context('mode.use_inf_as_na', True):</code></pre>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2504_FTI/FTI_files/figure-html/cell-9-output-2.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
<div id="cell-10" class="cell" data-execution_count="19">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb14-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Creare il grafico</span></span>
<span id="cb14-2">sns.set_style(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"whitegrid"</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Stile estetico</span></span>
<span id="cb14-3">fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>))  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Dimensione del grafico</span></span>
<span id="cb14-4"></span>
<span id="cb14-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Istogramma con colore personalizzato</span></span>
<span id="cb14-6">sns.histplot(df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"NOMINALE"</span>], bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, kde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#007a53"</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.5</span>, ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax)</span>
<span id="cb14-7"></span>
<span id="cb14-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Titoli e etichette</span></span>
<span id="cb14-9">ax.set_title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Distribuzione della variabile NOMINALE"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>)</span>
<span id="cb14-10">ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Valori di NOMINALE"</span>)</span>
<span id="cb14-11">ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Frequenza"</span>)</span>
<span id="cb14-12"></span>
<span id="cb14-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostrare il grafico</span></span>
<span id="cb14-14">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>C:\Users\PVolterr\AppData\Roaming\Python\Python311\site-packages\seaborn\_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.
  with pd.option_context('mode.use_inf_as_na', True):</code></pre>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2504_FTI/FTI_files/figure-html/cell-10-output-2.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
<div id="cell-11" class="cell" data-execution_count="21">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb16-1"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'IMPRESA'</span>].unique().tolist())</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="21">
<pre><code>['ACCIAIERIE DI VERONA S.P.A.',
 'BARILLA G. E R. FRATELLI - SOCIETA&amp;#39; PER AZIONI',
 'BOTTO GIUSEPPE E FIGLI - S.P.A.',
 'BUZZI UNICEM S.R.L.',
 'CARTIERA DEL VIGNALETTO S.R.L.',
 'FA.IN.PLAST. - FARAOTTI INDUSTRIE PLASTICHE - S.R.L. PIU&amp;#39; BREVEMENTE FAINPLAST S.R.L.',
 'FINCHIMICA S.P.A.',
 'IN.AL.PI. S.P.A.',
 'INDENA SPA',
 'ITALCHIMICA S.R.L.',
 'MANUCOR S.P.A.',
 'MODINE CIS ITALY S.R.L.',
 'OCV ITALIA S.R.L.',
 'RIFINIZIONE*S. STEFANO S.P.A.',
 'SKF INDUSTRIE  S.P.A.',
 'SKF INDUSTRIE S.P.A.',
 'TEKSID ALUMINUM S.R.L.',
 'VINAVIL SPA',
 'ZIGNAGO VETRO S.P.A. CON LA SIGLA Z.V. S.P.A.']</code></pre>
</div>
</div>
<div id="cell-12" class="cell" data-execution_count="24">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb18-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Estrarre i valori unici, ordinarli e scriverli di seguito</span></span>
<span id="cb18-2">impresa_str <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">", "</span>.join(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sorted</span>(df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'IMPRESA'</span>].dropna().unique().tolist()))</span>
<span id="cb18-3"></span>
<span id="cb18-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Stampare il risultato</span></span>
<span id="cb18-5"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(impresa_str)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>ACCIAIERIE DI VERONA S.P.A., BARILLA G. E R. FRATELLI - SOCIETA' PER AZIONI, BOTTO GIUSEPPE E FIGLI - S.P.A., BUZZI UNICEM S.R.L., CARTIERA DEL VIGNALETTO S.R.L., FA.IN.PLAST. - FARAOTTI INDUSTRIE PLASTICHE - S.R.L. PIU' BREVEMENTE FAINPLAST S.R.L., FINCHIMICA S.P.A., IN.AL.PI. S.P.A., INDENA SPA, ITALCHIMICA S.R.L., MANUCOR S.P.A., MODINE CIS ITALY S.R.L., OCV ITALIA S.R.L., RIFINIZIONE*S. STEFANO S.P.A., SKF INDUSTRIE  S.P.A., SKF INDUSTRIE S.P.A., TEKSID ALUMINUM S.R.L., VINAVIL SPA, ZIGNAGO VETRO S.P.A. CON LA SIGLA Z.V. S.P.A.</code></pre>
</div>
</div>

 ]]></description>
  <category>Invitalia</category>
  <category>Agevolazioni</category>
  <category>Imprese</category>
  <category>PNRR</category>
  <guid>https://paolovolterra.com/posts/2504_FTI/FTI.html</guid>
  <pubDate>Wed, 08 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Bonus colonnine domestiche</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2401_Colonnine/Colonnine.html</link>
  <description><![CDATA[ 




<p><img src="https://paolovolterra.com/posts/2401_Colonnine/media/bonus_colonnine_elettriche.jpg" class="img-fluid"></p>
<section id="obiettivi-dello-studio" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> obiettivi dello studio</h1>
<ul>
<li>estrazione dati da PDF</li>
<li>elaborazione grandi file #opendata</li>
<li>gestione dati geografici (#shapefile)</li>
</ul>
<p><em>Contributo a privati e condomini per l’acquisto e l’installazione di infrastrutture per la ricarica dei veicoli alimentati ad energia elettrica</em></p>
<p>Analisi realizzata con #opendata di <a href="https://www.mimit.gov.it/it/incentivi/bonus-colonnine-domestiche">MIMIT</a>, ISTAT e Opencup</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/media/bonus_colonnine_elettriche.jpg" class="img-fluid figure-img"></p>
<figcaption>immagine</figcaption>
</figure>
</div>
<p>Il bonus colonnine domestiche è un contributo pari all’80% del prezzo di acquisto e posa delle infrastrutture per la ricarica dei veicoli alimentati ad energia elettrica (come ad esempio colonnine o wall box).</p>
<p>Il limite massimo del contributo è di 1.500 euro per gli utenti privati e fino a 8.000 euro in caso di installazione sulle parti comuni degli edifici condominiali.</p>
<p>Possono beneficiare del contributo le persone fisiche residenti in Italia e i condomìni.</p>
<p>Le risorse a disposizione sono pari a:</p>
<ul>
<li>40 milioni per 2022</li>
<li>40 milioni per 2023</li>
<li>20 milioni per 2024</li>
</ul>
<table class="caption-top table">
<thead>
<tr class="header">
<th>file</th>
<th>numeri</th>
<th>righe</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><a href="https://www.mimit.gov.it/it/normativa/decreti-direttoriali/decreto-direttoriale-20-novembre-2023-bonus-colonnine-domestiche-erogazione-contributi-2022">Allegato_A_Decreto_di_concessione_annualita_2022_bcd.pdf</a></td>
<td>561</td>
<td>545</td>
</tr>
<tr class="even">
<td><a href="https://www.mimit.gov.it/it/normativa/decreti-direttoriali/decreto-direttoriale-6-dicembre-2023-bonus-colonnine-domestiche-erogazione-contributi-2023">Allegato_Decreto_di_concessione_annualità_2023.pdf</a></td>
<td>4992</td>
<td>4901</td>
</tr>
<tr class="odd">
<td><a href="https://www.mimit.gov.it/it/normativa/decreti-direttoriali/decreto-direttoriale-9-maggio-2024-bonus-colonnine-domestiche-erogazione-contributi-nuova-riapertura-2023">Allegato_A_Decreto_di_concessione_nuova_apertura_2023.pdf</a></td>
<td>939</td>
<td>939</td>
</tr>
<tr class="even">
<td><a href="https://www.mimit.gov.it/it/normativa/decreti-direttoriali/decreto-direttoriale-del-9-dicembre-2024-bonus-colonnine-domestiche-erogazione-contributi-2024">Allegato_A_EM_Decreto_di_concessione_annualita_2024.pdf</a></td>
<td>11485</td>
<td>11485</td>
</tr>
</tbody>
</table>
</section>
<section id="analisi" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> Analisi</h1>
<div id="60bd0da9" class="cell" data-execution_count="1">
<div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> seaborn <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> sns</span>
<span id="cb1-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-6"></span>
<span id="cb1-7">pd.set_option(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'display.float_format'</span>, <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%.2f</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> x)</span></code></pre></div>
</div>
<section id="spese-ad-oggi-ammesse-e-contributi-complessivi-concessi" class="level2" data-number="2.1">
<h2 data-number="2.1" class="anchored" data-anchor-id="spese-ad-oggi-ammesse-e-contributi-complessivi-concessi"><span class="header-section-number">2.1</span> Spese ad oggi ammesse e contributi complessivi concessi</h2>
<div id="7946c7d3" class="cell" data-execution_count="2">
<div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">os.chdir(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'D:</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">files</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">csv</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">Colonnine_elettriche'</span>)</span>
<span id="cb2-2">date_column <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Data e ora presentazione domanda'</span>]</span>
<span id="cb2-3">combined_df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>  pd.read_csv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'combined.csv'</span>, parse_dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>date_column, dayfirst<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb2-4">combined_df[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Spese Ammesse (€)'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>]].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>()</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="2">
<pre><code>Spese Ammesse (€)         30368778.47
Contributo Concesso (€)   21095793.24
dtype: float64</code></pre>
</div>
</div>
<div id="4a4586e2" class="cell" data-execution_count="3">
<div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">combined_df.describe()</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="3">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Unnamed: 0</th>
<th data-quarto-table-cell-role="th">N.</th>
<th data-quarto-table-cell-role="th">Data e ora presentazione domanda</th>
<th data-quarto-table-cell-role="th">Spese Ammesse (€)</th>
<th data-quarto-table-cell-role="th">Contributo Concesso (€)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">count</td>
<td>17951.00</td>
<td>17951.00</td>
<td>17951</td>
<td>17951.00</td>
<td>17951.00</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">mean</td>
<td>8975.00</td>
<td>3735.90</td>
<td>2024-05-25 20:51:53.760013568</td>
<td>1691.76</td>
<td>1175.19</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">min</td>
<td>0.00</td>
<td>1.00</td>
<td>2023-10-19 10:10:05</td>
<td>120.00</td>
<td>96.00</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">25%</td>
<td>4487.50</td>
<td>130.50</td>
<td>2023-11-21 19:45:54.500000</td>
<td>1222.45</td>
<td>977.96</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">50%</td>
<td>8975.00</td>
<td>2509.00</td>
<td>2024-07-09 19:55:35</td>
<td>1500.00</td>
<td>1200.00</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">75%</td>
<td>13462.50</td>
<td>6997.50</td>
<td>2024-09-24 10:50:55</td>
<td>1800.00</td>
<td>1440.00</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">max</td>
<td>17950.00</td>
<td>11485.00</td>
<td>2024-11-22 10:58:59</td>
<td>1664545.00</td>
<td>8000.00</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">std</td>
<td>5182.15</td>
<td>3770.14</td>
<td>NaN</td>
<td>12470.89</td>
<td>403.01</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
<section id="boxplot-contributi-concessi" class="level2" data-number="2.2">
<h2 data-number="2.2" class="anchored" data-anchor-id="boxplot-contributi-concessi"><span class="header-section-number">2.2</span> Boxplot contributi concessi</h2>
<div id="06fdb8dc" class="cell" data-execution_count="4">
<div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Rimuovi eventuali simboli di valuta e converti in numerico</span></span>
<span id="cb5-2">combined_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> combined_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>].replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'[€,]'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>, regex<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>).astype(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>)</span>
<span id="cb5-3"></span>
<span id="cb5-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Rimuovi eventuali valori NaN</span></span>
<span id="cb5-5">combined_df_clean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> combined_df.dropna(subset<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>])</span>
<span id="cb5-6"></span>
<span id="cb5-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Genera il boxplot</span></span>
<span id="cb5-8">plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>))</span>
<span id="cb5-9">combined_df_clean[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>].plot(kind<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'box'</span>)</span>
<span id="cb5-10">plt.title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Boxplot dei Contributi Concessi (€)'</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>)</span>
<span id="cb5-11">plt.ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributi Concessi (€)'</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb5-12">plt.grid(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'y'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>)</span>
<span id="cb5-13">plt.show()</span></code></pre></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-5-output-1.png" width="827" height="508" class="figure-img"></p>
</figure>
</div>
</div>
</div>
</section>
<section id="histplot" class="level2" data-number="2.3">
<h2 data-number="2.3" class="anchored" data-anchor-id="histplot"><span class="header-section-number">2.3</span> Histplot</h2>
<div id="30db9412" class="cell" data-execution_count="5">
<div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Funzione per generare il grafico e calcolare i dati dinamicamente</span></span>
<span id="cb6-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> plot_histogram_with_bins(data, column, bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>):</span>
<span id="cb6-3">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Rimuovi eventuali simboli di valuta e converti in numerico</span></span>
<span id="cb6-4">    data[column] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data[column].replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'[€,]'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>, regex<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>).astype(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>)</span>
<span id="cb6-5">    data_clean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data.dropna(subset<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[column])</span>
<span id="cb6-6">    </span>
<span id="cb6-7">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcola l'istogramma con il numero di bin specificato</span></span>
<span id="cb6-8">    counts, bin_edges <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.histogram(data_clean[column], bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>bins)</span>
<span id="cb6-9">    </span>
<span id="cb6-10">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Trova il bin con il conteggio maggiore</span></span>
<span id="cb6-11">    max_bin_index <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> counts.argmax()</span>
<span id="cb6-12">    max_bin_range <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (bin_edges[max_bin_index], bin_edges[max_bin_index <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])</span>
<span id="cb6-13">    max_bin_center <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (max_bin_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> max_bin_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb6-14">    </span>
<span id="cb6-15">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Stampa i risultati</span></span>
<span id="cb6-16">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Numero di bin: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>bins<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb6-17">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Il bin con il conteggio massimo è tra </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>max_bin_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:,.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> e </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>max_bin_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:,.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">."</span>)</span>
<span id="cb6-18">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Il valore centrale di questo bin è: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>max_bin_center<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:,.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">."</span>)</span>
<span id="cb6-19">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Il conteggio massimo è di </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>counts[max_bin_index]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">."</span>)</span>
<span id="cb6-20">    </span>
<span id="cb6-21">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Genera l'istogramma</span></span>
<span id="cb6-22">    plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>))</span>
<span id="cb6-23">    sns.histplot(data<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>data_clean, x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>column, kde<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>bins)</span>
<span id="cb6-24">    plt.title(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f'Distribuzione di </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>column<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> - </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>bins<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> Bin'</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>)</span>
<span id="cb6-25">    plt.xlabel(column, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb6-26">    plt.ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Frequenza'</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb6-27">    plt.grid(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'y'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>)</span>
<span id="cb6-28">    </span>
<span id="cb6-29">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Evidenzia il bin con il conteggio maggiore</span></span>
<span id="cb6-30">    plt.axvspan(max_bin_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], max_bin_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>], color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'orange'</span>, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Bin con conteggio massimo'</span>)</span>
<span id="cb6-31">    plt.axvline(max_bin_center, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'red'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f'Valore centrale: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>max_bin_center<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:,.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">'</span>)</span>
<span id="cb6-32">    plt.legend()</span>
<span id="cb6-33">    plt.show()</span>
<span id="cb6-34"></span>
<span id="cb6-35"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Esempio di utilizzo</span></span>
<span id="cb6-36">plot_histogram_with_bins(combined_df, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>, bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>)</span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre><code>Numero di bin: 50
Il bin con il conteggio massimo è tra 1,360.64 e 1,518.72.
Il valore centrale di questo bin è: 1,439.68.
Il conteggio massimo è di 5563.</code></pre>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-6-output-2.png" width="827" height="528" class="figure-img"></p>
</figure>
</div>
</div>
</div>
</section>
<section id="merge-con-opencup-localizzazione" class="level2" data-number="2.4">
<h2 data-number="2.4" class="anchored" data-anchor-id="merge-con-opencup-localizzazione"><span class="header-section-number">2.4</span> merge con Opencup localizzazione</h2>
<div id="31cf89ff" class="cell" data-execution_count="6">
<div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb8-2">os.chdir(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'D:/duckdb/files/Opencup'</span>)</span>
<span id="cb8-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> duckdb</span>
<span id="cb8-4">conn <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> duckdb.<span class="ex" style="color: null;
background-color: null;
font-style: inherit;">connect</span>()</span>
<span id="cb8-5"></span>
<span id="cb8-6"></span>
<span id="cb8-7">conn.execute(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CREATE TABLE OpenCup_Localizzazione AS SELECT * FROM 'OpenCup_Localizzazione.parquet';"</span>)</span>
<span id="cb8-8"></span>
<span id="cb8-9">conn.register(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'df2'</span>, combined_df)</span>
<span id="cb8-10"></span>
<span id="cb8-11">query <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"""SELECT a.*, b.* FROM  df2 a LEFT JOIN OpenCup_Localizzazione b ON a.CUP = b.CUP ;"""</span></span>
<span id="cb8-12">result2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> conn.execute(query).df()</span>
<span id="cb8-13"></span>
<span id="cb8-14">result2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CUP'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CODICE_REGIONE'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'REGIONE'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'SIGLA_PROVINCIA'</span>,  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'N.'</span>,</span>
<span id="cb8-15">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'ID Domanda'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Data e ora presentazione domanda'</span>,</span>
<span id="cb8-16">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Soggetto richiedente'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Codice fiscale'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Spese Ammesse (€)'</span>,</span>
<span id="cb8-17">       <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>]]</span>
<span id="cb8-18"></span>
<span id="cb8-19">result2.head()</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="6">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">CUP</th>
<th data-quarto-table-cell-role="th">CODICE_REGIONE</th>
<th data-quarto-table-cell-role="th">REGIONE</th>
<th data-quarto-table-cell-role="th">SIGLA_PROVINCIA</th>
<th data-quarto-table-cell-role="th">COMUNE</th>
<th data-quarto-table-cell-role="th">N.</th>
<th data-quarto-table-cell-role="th">ID Domanda</th>
<th data-quarto-table-cell-role="th">Data e ora presentazione domanda</th>
<th data-quarto-table-cell-role="th">Soggetto richiedente</th>
<th data-quarto-table-cell-role="th">Codice fiscale</th>
<th data-quarto-table-cell-role="th">Spese Ammesse (€)</th>
<th data-quarto-table-cell-role="th">Contributo Concesso (€)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>C42E23004680008</td>
<td>3</td>
<td>LOMBARDIA</td>
<td>MB</td>
<td>DESIO</td>
<td>2.17</td>
<td>BCDS2300002234</td>
<td>2023-11-14 15:56:45</td>
<td>M... C... G...</td>
<td>G.......................794R</td>
<td>2150.00</td>
<td>1500.00</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>B42E24043420008</td>
<td>12</td>
<td>LAZIO</td>
<td>FR</td>
<td>ATINA</td>
<td>2982.00</td>
<td>BCDBS2400003002</td>
<td>2024-07-11 15:45:00</td>
<td>F... S...</td>
<td>S...............838C</td>
<td>1727.27</td>
<td>1381.82</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>C42E23004900008</td>
<td>3</td>
<td>LOMBARDIA</td>
<td>MI</td>
<td>MILANO</td>
<td>2.69</td>
<td>BCDS2300002775</td>
<td>2023-11-16 21:03:10</td>
<td>L... P...</td>
<td>P.......................205F</td>
<td>2000.00</td>
<td>1500.00</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>B42E24047920008</td>
<td>3</td>
<td>LOMBARDIA</td>
<td>MI</td>
<td>MILANO</td>
<td>6531.00</td>
<td>BCDBS2400006566</td>
<td>2024-09-12 08:36:09</td>
<td>S... B...</td>
<td>B...............205T</td>
<td>3870.09</td>
<td>1500.00</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>B92E24043830008</td>
<td>6</td>
<td>FRIULI-VENEZIA GIULIA</td>
<td>UD</td>
<td>MANZANO</td>
<td>2318.00</td>
<td>BCDBS2400002337</td>
<td>2024-07-09 12:09:56</td>
<td>G... S...</td>
<td>S...............758D</td>
<td>2100.00</td>
<td>1500.00</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<section id="per-regione" class="level3" data-number="2.4.1">
<h3 data-number="2.4.1" class="anchored" data-anchor-id="per-regione"><span class="header-section-number">2.4.1</span> per regione</h3>
<div id="4e863adc" class="cell" data-execution_count="7">
<div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">result2[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'REGIONE'</span>].count()</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="7">
<pre><code>17951</code></pre>
</div>
</div>
<div id="ef306067" class="cell" data-execution_count="8">
<div class="sourceCode cell-code" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb11-1">result2_grouped <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'REGIONE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CODICE_REGIONE'</span>]).size().reset_index(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COUNT'</span>) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa per REGIONE e seleziona CODICE_REGIONE</span></span>
<span id="cb11-2">result2_grouped_sorted <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2_grouped.sort_values(by<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CODICE_REGIONE'</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Ordina per CODICE_REGIONE (non per COUNT)</span></span>
<span id="cb11-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(result2_grouped_sorted[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'REGIONE'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COUNT'</span>]]) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra il risultato</span></span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre><code>                  REGIONE  COUNT
11               PIEMONTE   1261
18          VALLE D'AOSTA     77
8               LOMBARDIA   4868
16    TRENTINO-ALTO ADIGE    535
19                 VENETO   2338
5   FRIULI-VENEZIA GIULIA    696
7                 LIGURIA    221
4          EMILIA-ROMAGNA   1777
15                TOSCANA    872
17                 UMBRIA    230
9                  MARCHE    493
6                   LAZIO   1900
0                 ABRUZZO    278
10                 MOLISE     47
3                CAMPANIA    618
12                 PUGLIA    595
1              BASILICATA     87
2                CALABRIA    203
14                SICILIA    581
13               SARDEGNA    274</code></pre>
</div>
</div>
<div id="51b3f9cd" class="cell" data-execution_count="9">
<div class="sourceCode cell-code" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb13-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa i dati per COMUNE e conta le occorrenze</span></span>
<span id="cb13-2">comuni_count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>).size()</span>
<span id="cb13-3"></span>
<span id="cb13-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcola le frequenze: quanti comuni hanno lo stesso numero di occorrenze</span></span>
<span id="cb13-5">frequenza_comuni <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_count.value_counts().sort_index()</span>
<span id="cb13-6"></span>
<span id="cb13-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Converte in DataFrame</span></span>
<span id="cb13-8">frequenza_comuni_df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> frequenza_comuni.reset_index()</span>
<span id="cb13-9">frequenza_comuni_df.columns <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Numero di Comuni'</span>]</span>
<span id="cb13-10"></span>
<span id="cb13-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa per intervalli di occorrenze (opzionale, per esempio in gruppi di 10)</span></span>
<span id="cb13-12">frequenza_comuni_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.cut(frequenza_comuni_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>], bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, frequenza_comuni_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), right<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb13-13"></span>
<span id="cb13-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa per intervalli (se applicabile)</span></span>
<span id="cb13-15">raggruppati <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> frequenza_comuni_df.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Numero di Comuni'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>().reset_index()</span>
<span id="cb13-16"></span>
<span id="cb13-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra il risultato</span></span>
<span id="cb13-18">raggruppati</span></code></pre></div>
<div class="cell-output cell-output-stderr">
<pre><code>C:\Users\paolo\AppData\Local\Temp\ipykernel_24916\338649489.py:15: FutureWarning:

The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
</code></pre>
</div>
<div class="cell-output cell-output-display" data-execution_count="9">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Intervalli</th>
<th data-quarto-table-cell-role="th">Numero di Comuni</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>[0, 10)</td>
<td>3478</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>[10, 20)</td>
<td>232</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>[20, 30)</td>
<td>60</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>[30, 40)</td>
<td>16</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>[40, 50)</td>
<td>9</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">...</td>
<td>...</td>
<td>...</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">103</td>
<td>[1030, 1040)</td>
<td>0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">104</td>
<td>[1040, 1050)</td>
<td>0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">105</td>
<td>[1050, 1060)</td>
<td>0</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">106</td>
<td>[1060, 1070)</td>
<td>0</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">107</td>
<td>[1070, 1080)</td>
<td>1</td>
</tr>
</tbody>
</table>

<p>108 rows × 2 columns</p>
</div>
</div>
</div>
<div id="a2c1bb7c" class="cell" data-execution_count="10">
<div class="sourceCode cell-code" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb15-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb15-2"></span>
<span id="cb15-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa i dati per COMUNE e conta le occorrenze</span></span>
<span id="cb15-4">comuni_count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>).size()</span>
<span id="cb15-5"></span>
<span id="cb15-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcola le frequenze: quanti comuni hanno lo stesso numero di occorrenze</span></span>
<span id="cb15-7">frequenza_comuni <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_count.value_counts().sort_index()</span>
<span id="cb15-8"></span>
<span id="cb15-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Converte in DataFrame</span></span>
<span id="cb15-10">frequenza_comuni_df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> frequenza_comuni.reset_index()</span>
<span id="cb15-11">frequenza_comuni_df.columns <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Numero di Comuni'</span>]</span>
<span id="cb15-12"></span>
<span id="cb15-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa per intervalli di occorrenze</span></span>
<span id="cb15-14">frequenza_comuni_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.cut(frequenza_comuni_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>], </span>
<span id="cb15-15">                                           bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, frequenza_comuni_df[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), </span>
<span id="cb15-16">                                           right<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb15-17"></span>
<span id="cb15-18"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># raggruppati = frequenza_comuni_df.groupby('Intervalli')['Numero di Comuni'].sum().reset_index()</span></span>
<span id="cb15-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># raggruppati = raggruppati[raggruppati['Numero di Comuni'] &gt; 0]</span></span></code></pre></div>
</div>
<div id="ace9fad3" class="cell" data-execution_count="11">
<div class="sourceCode cell-code" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb16-1">raggruppati <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> frequenza_comuni_df.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>, observed<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Numero di Comuni'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>().reset_index()</span>
<span id="cb16-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(raggruppati)</span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre><code>      Intervalli  Numero di Comuni
0        [0, 10)              3478
1       [10, 20)               232
2       [20, 30)                60
3       [30, 40)                16
4       [40, 50)                 9
5       [50, 60)                 6
6       [60, 70)                 2
7       [70, 80)                 3
8       [80, 90)                 1
9      [90, 100)                 1
10    [100, 110)                 4
11    [110, 120)                 2
12    [120, 130)                 1
13    [650, 660)                 1
14  [1070, 1080)                 1</code></pre>
</div>
</div>
<div id="3d4769bc" class="cell" data-execution_count="12">
<div class="sourceCode cell-code" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb18-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb18-2"></span>
<span id="cb18-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Crea il grafico a barre</span></span>
<span id="cb18-4">plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>))</span>
<span id="cb18-5">plt.bar(raggruppati[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>].astype(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>), raggruppati[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Numero di Comuni'</span>])</span>
<span id="cb18-6"></span>
<span id="cb18-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Personalizza il grafico</span></span>
<span id="cb18-8">plt.title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Distribuzione dei Comuni per Intervalli di Occorrenze'</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>)</span>
<span id="cb18-9">plt.xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli di Occorrenze'</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb18-10">plt.ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Numero di Comuni'</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)</span>
<span id="cb18-11">plt.xticks(rotation<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">45</span>, ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'right'</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Ruota le etichette sull'asse x per leggibilità</span></span>
<span id="cb18-12">plt.grid(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'y'</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>)</span>
<span id="cb18-13"></span>
<span id="cb18-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra il grafico</span></span>
<span id="cb18-15">plt.tight_layout()</span>
<span id="cb18-16">plt.show()</span></code></pre></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-13-output-1.png" width="951" height="567" class="figure-img"></p>
</figure>
</div>
</div>
</div>
<div id="75fe0867" class="cell" data-execution_count="13">
<div class="sourceCode cell-code" id="cb19" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb19-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa i dati per COMUNE e conta le occorrenze</span></span>
<span id="cb19-2">comuni_count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>).size()</span>
<span id="cb19-3"></span>
<span id="cb19-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Filtra i comuni con un numero di occorrenze inferiore o uguale a 10</span></span>
<span id="cb19-5">comuni_max_10 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_count[comuni_count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>].index.unique()</span>
<span id="cb19-6"></span>
<span id="cb19-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra i comuni unici</span></span>
<span id="cb19-8"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(comuni_max_10)</span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre><code>Index(['MILANO', 'ROMA'], dtype='object', name='COMUNE')</code></pre>
</div>
</div>
<div id="c279d10f" class="cell" data-execution_count="14">
<div class="sourceCode cell-code" id="cb21" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb21-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcola il numero di occorrenze per ogni comune</span></span>
<span id="cb21-2">comuni_count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>).size().reset_index()</span>
<span id="cb21-3">comuni_count.columns <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>]</span>
<span id="cb21-4"></span>
<span id="cb21-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiungi una colonna per gli intervalli</span></span>
<span id="cb21-6">comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.cut(comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>], </span>
<span id="cb21-7">                                    bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), </span>
<span id="cb21-8">                                    right<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb21-9"></span>
<span id="cb21-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa i comuni per intervalli</span></span>
<span id="cb21-11">comuni_per_intervallo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_count.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].unique().reset_index()</span>
<span id="cb21-12"></span>
<span id="cb21-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra il risultato</span></span>
<span id="cb21-14"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(comuni_per_intervallo)</span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre><code>       Intervalli                                             COMUNE
0         [0, 10)  [ABBADIA LARIANA, ACATE, ACERRA, ACI BONACCORS...
1        [10, 20)  [ABANO TERME, ABBIATEGRASSO, AGRIGENTO, ALBA, ...
2        [20, 30)  [AGEROLA, ALBIGNASEGO, ALESSANDRIA, ANZIO, ARE...
3        [30, 40)  [ANCONA, CARPI, FIUMICINO, GUIDONIA MONTECELIO...
4        [40, 50)  [BARI, BUSTO ARSIZIO, CAGLIARI, CESENA, FORLI'...
..            ...                                                ...
103  [1030, 1040)                                                 []
104  [1040, 1050)                                                 []
105  [1050, 1060)                                                 []
106  [1060, 1070)                                                 []
107  [1070, 1080)                                             [ROMA]

[108 rows x 2 columns]</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>C:\Users\paolo\AppData\Local\Temp\ipykernel_24916\1272126017.py:11: FutureWarning:

The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
</code></pre>
</div>
</div>
<div id="63c4511b" class="cell" data-execution_count="15">
<div class="sourceCode cell-code" id="cb24" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb24-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcola il numero di occorrenze per ogni comune</span></span>
<span id="cb24-2">comuni_count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>).size().reset_index()</span>
<span id="cb24-3">comuni_count.columns <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>]</span>
<span id="cb24-4"></span>
<span id="cb24-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiungi una colonna per gli intervalli</span></span>
<span id="cb24-6">comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.cut(comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>], </span>
<span id="cb24-7">                                    bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), </span>
<span id="cb24-8">                                    right<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb24-9"></span>
<span id="cb24-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa i comuni per intervalli, escludendo i raggruppamenti con valore 0</span></span>
<span id="cb24-11">comuni_per_intervallo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_count.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">filter</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb24-12"></span>
<span id="cb24-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa nuovamente per intervalli e ottieni i comuni unici</span></span>
<span id="cb24-14">comuni_per_intervallo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_per_intervallo.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].unique().reset_index()</span>
<span id="cb24-15"></span>
<span id="cb24-16"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra il risultato</span></span>
<span id="cb24-17">(comuni_per_intervallo)</span></code></pre></div>
<div class="cell-output cell-output-stderr">
<pre><code>C:\Users\paolo\AppData\Local\Temp\ipykernel_24916\1766664538.py:11: FutureWarning:

The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.

C:\Users\paolo\AppData\Local\Temp\ipykernel_24916\1766664538.py:14: FutureWarning:

The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
</code></pre>
</div>
<div class="cell-output cell-output-display" data-execution_count="15">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Intervalli</th>
<th data-quarto-table-cell-role="th">COMUNE</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>[0, 10)</td>
<td>[ABBADIA LARIANA, ACATE, ACERRA, ACI BONACCORS...</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>[10, 20)</td>
<td>[ABANO TERME, ABBIATEGRASSO, AGRIGENTO, ALBA, ...</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>[20, 30)</td>
<td>[AGEROLA, ALBIGNASEGO, ALESSANDRIA, ANZIO, ARE...</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>[30, 40)</td>
<td>[ANCONA, CARPI, FIUMICINO, GUIDONIA MONTECELIO...</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>[40, 50)</td>
<td>[BARI, BUSTO ARSIZIO, CAGLIARI, CESENA, FORLI'...</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">...</td>
<td>...</td>
<td>...</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">103</td>
<td>[1030, 1040)</td>
<td>[]</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">104</td>
<td>[1040, 1050)</td>
<td>[]</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">105</td>
<td>[1050, 1060)</td>
<td>[]</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">106</td>
<td>[1060, 1070)</td>
<td>[]</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">107</td>
<td>[1070, 1080)</td>
<td>[ROMA]</td>
</tr>
</tbody>
</table>

<p>108 rows × 2 columns</p>
</div>
</div>
</div>
<div id="1af29525" class="cell" data-execution_count="16">
<div class="sourceCode cell-code" id="cb26" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb26-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Importa le librerie necessarie</span></span>
<span id="cb26-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb26-3"></span>
<span id="cb26-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calcola il numero di occorrenze per ogni comune</span></span>
<span id="cb26-5">comuni_count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>).size().reset_index()</span>
<span id="cb26-6">comuni_count.columns <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>]</span>
<span id="cb26-7"></span>
<span id="cb26-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiungi una colonna per gli intervalli</span></span>
<span id="cb26-9">comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.cut(comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>], </span>
<span id="cb26-10">                                    bins<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, comuni_count[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Occorrenze'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>), </span>
<span id="cb26-11">                                    right<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb26-12"></span>
<span id="cb26-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raggruppa per intervalli e ottieni i comuni unici</span></span>
<span id="cb26-14">comuni_per_intervallo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_count.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Intervalli'</span>, observed<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].unique().reset_index()</span>
<span id="cb26-15"></span>
<span id="cb26-16"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Filtra per rimuovere intervalli con liste vuote</span></span>
<span id="cb26-17">comuni_per_intervallo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> comuni_per_intervallo[comuni_per_intervallo[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb26-18"></span>
<span id="cb26-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra il risultato</span></span>
<span id="cb26-20">(comuni_per_intervallo)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="16">
<div>


<table class="dataframe caption-top table table-sm table-striped small" data-quarto-postprocess="true" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Intervalli</th>
<th data-quarto-table-cell-role="th">COMUNE</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-quarto-table-cell-role="th">0</td>
<td>[0, 10)</td>
<td>[ABBADIA LARIANA, ACATE, ACERRA, ACI BONACCORS...</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">1</td>
<td>[10, 20)</td>
<td>[ABANO TERME, ABBIATEGRASSO, AGRIGENTO, ALBA, ...</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">2</td>
<td>[20, 30)</td>
<td>[AGEROLA, ALBIGNASEGO, ALESSANDRIA, ANZIO, ARE...</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">3</td>
<td>[30, 40)</td>
<td>[ANCONA, CARPI, FIUMICINO, GUIDONIA MONTECELIO...</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">4</td>
<td>[40, 50)</td>
<td>[BARI, BUSTO ARSIZIO, CAGLIARI, CESENA, FORLI'...</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">5</td>
<td>[50, 60)</td>
<td>[COMO, FERRARA, LATINA, PERUGIA, RAVENNA, VICE...</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">6</td>
<td>[60, 70)</td>
<td>[FIRENZE, UDINE]</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">7</td>
<td>[70, 80)</td>
<td>[BERGAMO, MONZA, VENEZIA]</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">8</td>
<td>[80, 90)</td>
<td>[REGGIO NELL'EMILIA]</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">9</td>
<td>[90, 100)</td>
<td>[BOLOGNA]</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">10</td>
<td>[100, 110)</td>
<td>[BRESCIA, PARMA, TRENTO, VERONA]</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">11</td>
<td>[110, 120)</td>
<td>[MODENA, TORINO]</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">12</td>
<td>[120, 130)</td>
<td>[PADOVA]</td>
</tr>
<tr class="even">
<td data-quarto-table-cell-role="th">65</td>
<td>[650, 660)</td>
<td>[MILANO]</td>
</tr>
<tr class="odd">
<td data-quarto-table-cell-role="th">107</td>
<td>[1070, 1080)</td>
<td>[ROMA]</td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
</section>
</section>
<section id="mappa-italia" class="level2" data-number="2.5">
<h2 data-number="2.5" class="anchored" data-anchor-id="mappa-italia"><span class="header-section-number">2.5</span> mappa Italia</h2>
<div id="604d971e" class="cell" data-execution_count="17">
<div class="sourceCode cell-code" id="cb27" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb27-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> geopandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> gpd</span></code></pre></div>
</div>
<div id="71abc5ee" class="cell" data-execution_count="18">
<div class="sourceCode cell-code" id="cb28" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb28-1">comuni <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].count().reset_index(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>)</span>
<span id="cb28-2">df1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'D:/files/csv/Shapefile/Limiti01012023_g/Com01012023_g/Com01012023_g_WGS84.shp'</span>)</span>
<span id="cb28-3">df1[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df1[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>.upper()</span>
<span id="cb28-4">merged_gdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df1.merge(comuni, left_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'inner'</span>)</span>
<span id="cb28-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># merged_gdf.to_csv('D:\\files\\csv\\Colonnine_elettriche\\merged.csv', sep='|', index = False)</span></span></code></pre></div>
</div>
<div id="ea5c747c" class="cell" data-execution_count="19">
<div class="sourceCode cell-code" id="cb29" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb29-1">ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> merged_gdf.plot(</span>
<span id="cb29-2">    column<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Usa la colonna 'count' per definire i colori</span></span>
<span id="cb29-3">    cmap<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'tab10'</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Scegli una mappa di colori</span></span>
<span id="cb29-4">    figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>),  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Imposta la dimensione</span></span>
<span id="cb29-5">    legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra la legenda</span></span>
<span id="cb29-6">)</span>
<span id="cb29-7">ax.axis(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'off'</span>)</span>
<span id="cb29-8">plt.savefig(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"D:/Italia.png"</span>, dpi<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span>, bbox_inches<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'tight'</span>, pad_inches<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>)</span>
<span id="cb29-9">plt.show()</span></code></pre></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-20-output-1.png" width="791" height="906" class="figure-img"></p>
</figure>
</div>
</div>
</div>
<div id="4213e936" class="cell" data-execution_count="20">
<div class="sourceCode cell-code" id="cb30" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb30-1">comuni <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].count().reset_index(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>)</span>
<span id="cb30-2">df1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'D:/files/csv/Shapefile/Limiti01012023_g/Com01012023_g/Com01012023_g_WGS84.shp'</span>)</span>
<span id="cb30-3">df1[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df1[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>.upper()</span>
<span id="cb30-4">merged_gdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df1.merge(comuni, left_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'left'</span>)</span></code></pre></div>
</div>
</section>
<section id="singole-regioni" class="level2" data-number="2.6">
<h2 data-number="2.6" class="anchored" data-anchor-id="singole-regioni"><span class="header-section-number">2.6</span> singole regioni</h2>
<div id="3b122fd4" class="cell" data-execution_count="21">
<div class="sourceCode cell-code" id="cb31" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb31-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">21</span>):</span>
<span id="cb31-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Filtra temporaneamente il DataFrame per ogni valore di COD_REG</span></span>
<span id="cb31-3">    temp_gdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> merged_gdf.query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COD_REG == @i'</span>)</span>
<span id="cb31-4">    </span>
<span id="cb31-5">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Crea una nuova figura per ogni grafico</span></span>
<span id="cb31-6">    fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>))</span>
<span id="cb31-7">    </span>
<span id="cb31-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Traccia il confine (opzionale, usa temp_gdf o merged_gdf per i bordi)</span></span>
<span id="cb31-9">    temp_gdf.plot(ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)</span>
<span id="cb31-10">    </span>
<span id="cb31-11">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Traccia la mappa colorata in base alla colonna 'count'</span></span>
<span id="cb31-12">    temp_gdf.plot(column<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>, cmap<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Reds'</span>, ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax, legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>, missing_kwds<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{</span>
<span id="cb31-13">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"color"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"white"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Colore per i NaN</span></span>
<span id="cb31-14">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"edgecolor"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Contorno nero</span></span>
<span id="cb31-15">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"linewidth"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb31-16">        })</span>
<span id="cb31-17">    </span>
<span id="cb31-18">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiungi titolo e dettagli</span></span>
<span id="cb31-19">    ax.set_title(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Regione COD_REG = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>)</span>
<span id="cb31-20">    ax.axis(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'off'</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mantieni gli assi visibili (è già il comportamento predefinito)</span></span>
<span id="cb31-21">    </span>
<span id="cb31-22">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra la figura</span></span>
<span id="cb31-23">    plt.show()</span></code></pre></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-1.png" width="584" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-2.png" width="763" height="525" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-3.png" width="763" height="746" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-4.png" width="755" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-5.png" width="697" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-6.png" width="763" height="710" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-7.png" width="763" height="401" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-8.png" width="763" height="439" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-9.png" width="670" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-10.png" width="618" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-11.png" width="763" height="763" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-12.png" width="743" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-13.png" width="763" height="726" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-14.png" width="763" height="626" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-15.png" width="763" height="721" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-16.png" width="763" height="630" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-17.png" width="740" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-18.png" width="410" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-19.png" width="643" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-22-output-20.png" width="408" height="783" class="figure-img"></p>
</figure>
</div>
</div>
</div>
</section>
<section id="in-azzurro-con-legenda-range" class="level2" data-number="2.7">
<h2 data-number="2.7" class="anchored" data-anchor-id="in-azzurro-con-legenda-range"><span class="header-section-number">2.7</span> in azzurro con legenda range</h2>
<div id="ee993920" class="cell" data-execution_count="22">
<div class="sourceCode cell-code" id="cb32" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb32-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb32-2"></span>
<span id="cb32-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">21</span>):</span>
<span id="cb32-4">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Filtra temporaneamente il DataFrame per ogni valore di COD_REG</span></span>
<span id="cb32-5">    temp_gdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> merged_gdf.query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COD_REG == @i'</span>)</span>
<span id="cb32-6">    </span>
<span id="cb32-7">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Crea una nuova figura per ogni grafico</span></span>
<span id="cb32-8">    fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>))</span>
<span id="cb32-9">    </span>
<span id="cb32-10">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Traccia la mappa colorata in base alla colonna 'count'</span></span>
<span id="cb32-11">    temp_gdf.plot(</span>
<span id="cb32-12">        column<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>,</span>
<span id="cb32-13">        cmap<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Blues'</span>,</span>
<span id="cb32-14">        ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax,</span>
<span id="cb32-15">        legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>,</span>
<span id="cb32-16">        edgecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grey"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Colore del contorno</span></span>
<span id="cb32-17">        linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Spessore del contorno</span></span>
<span id="cb32-18">        missing_kwds<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{</span>
<span id="cb32-19">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"color"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"white"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Colore per i NaN</span></span>
<span id="cb32-20">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"edgecolor"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grey"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Contorno nero per i NaN</span></span>
<span id="cb32-21">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"linewidth"</span>: <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Spessore coerente anche per i NaN</span></span>
<span id="cb32-22">        }</span>
<span id="cb32-23">    )</span>
<span id="cb32-24">    </span>
<span id="cb32-25">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiungi titolo e dettagli</span></span>
<span id="cb32-26">    ax.set_title(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Regione COD_REG = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>)</span>
<span id="cb32-27">    ax.axis(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'off'</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Rimuovi assi per un aspetto più pulito</span></span>
<span id="cb32-28">    </span>
<span id="cb32-29">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mostra la figura</span></span>
<span id="cb32-30">    plt.show()</span></code></pre></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-1.png" width="693" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-2.png" width="715" height="763" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-3.png" width="723" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-4.png" width="723" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-5.png" width="723" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-6.png" width="715" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-7.png" width="715" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-8.png" width="723" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-9.png" width="715" height="763" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-10.png" width="715" height="780" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-11.png" width="715" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-12.png" width="732" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-13.png" width="715" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-14.png" width="728" height="763" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-15.png" width="715" height="758" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-16.png" width="715" height="763" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-17.png" width="715" height="763" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-18.png" width="510" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-19.png" width="715" height="766" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-23-output-20.png" width="509" height="783" class="figure-img"></p>
</figure>
</div>
</div>
</div>
</section>
<section id="comuni-presenti-in-verde-o-assenti" class="level2" data-number="2.8">
<h2 data-number="2.8" class="anchored" data-anchor-id="comuni-presenti-in-verde-o-assenti"><span class="header-section-number">2.8</span> comuni presenti (in verde) o assenti</h2>
<div id="64f7e828" class="cell" data-execution_count="23">
<div class="sourceCode cell-code" id="cb33" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb33-1">comuni <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> result2.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].count().reset_index(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>)</span>
<span id="cb33-2">df1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gpd.read_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'D:/files/csv/Shapefile/Limiti01012023_g/Com01012023_g/Com01012023_g_WGS84.shp'</span>)</span>
<span id="cb33-3">df1[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df1[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>.upper()</span>
<span id="cb33-4">merged_gdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df1.merge(comuni, left_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'left'</span>)</span>
<span id="cb33-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># merged_gdf.to_csv('D:\\files\\csv\\20241212_Colonnine elettriche\\merged.csv', sep='|', index = False)</span></span>
<span id="cb33-6"></span>
<span id="cb33-7"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">21</span>):</span>
<span id="cb33-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Filtra temporaneamente il DataFrame per ogni valore di COD_REG</span></span>
<span id="cb33-9">    temp_gdf <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> merged_gdf.query(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COD_REG == @i'</span>)</span>
<span id="cb33-10">    </span>
<span id="cb33-11">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Crea una nuova figura per ogni grafico</span></span>
<span id="cb33-12">    fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>))</span>
<span id="cb33-13">    </span>
<span id="cb33-14">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Poligoni con valori NaN (bianco con contorno nero)</span></span>
<span id="cb33-15">    temp_gdf[temp_gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>].isna()].plot(</span>
<span id="cb33-16">        ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax,</span>
<span id="cb33-17">        color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'white'</span>,       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Colore interno bianco</span></span>
<span id="cb33-18">        edgecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>,   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Contorno nero</span></span>
<span id="cb33-19">        linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Spessore contorno uniforme</span></span>
<span id="cb33-20">    )</span>
<span id="cb33-21">    </span>
<span id="cb33-22">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Poligoni con valori validi (verde con contorno nero)</span></span>
<span id="cb33-23">    temp_gdf[temp_gdf[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'count'</span>].notna()].plot(</span>
<span id="cb33-24">        ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax,</span>
<span id="cb33-25">        color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'green'</span>,       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Colore interno verde</span></span>
<span id="cb33-26">        edgecolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>,   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Contorno nero</span></span>
<span id="cb33-27">        linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Spessore contorno uniforme</span></span>
<span id="cb33-28">    )</span>
<span id="cb33-29">    </span>
<span id="cb33-30">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Aggiungi titolo e dettagli</span></span>
<span id="cb33-31">    ax.set_title(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Regione COD_REG = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>)</span>
<span id="cb33-32">    ax.axis(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'off'</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Rimuovi gli assi per un aspetto più pulito</span></span>
<span id="cb33-33">    </span>
<span id="cb33-34">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Salva l'immagine con il nome del valore COD_REG</span></span>
<span id="cb33-35">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># plt.savefig(f"D:/cod_reg_{i}.png", dpi=300, bbox_inches='tight')</span></span>
<span id="cb33-36">    </span>
<span id="cb33-37">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Chiudi la figura per liberare memoria</span></span>
<span id="cb33-38">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># plt.close(fig)</span></span>
<span id="cb33-39">    plt.show()</span></code></pre></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-1.png" width="584" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-2.png" width="763" height="525" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-3.png" width="763" height="746" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-4.png" width="755" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-5.png" width="697" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-6.png" width="763" height="710" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-7.png" width="763" height="401" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-8.png" width="763" height="439" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-9.png" width="670" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-10.png" width="618" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-11.png" width="763" height="763" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-12.png" width="743" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-13.png" width="763" height="726" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-14.png" width="763" height="626" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-15.png" width="763" height="721" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-16.png" width="763" height="630" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-17.png" width="740" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-18.png" width="410" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-19.png" width="643" height="783" class="figure-img"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2401_Colonnine/Colonnine_files/figure-html/cell-24-output-20.png" width="408" height="783" class="figure-img"></p>
</figure>
</div>
</div>
</div>
</section>
<section id="inquiry" class="level2" data-number="2.9">
<h2 data-number="2.9" class="anchored" data-anchor-id="inquiry"><span class="header-section-number">2.9</span> Inquiry</h2>
<div id="b3c3f35f" class="cell" data-execution_count="24">
<div class="sourceCode cell-code" id="cb34" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb34-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> itables <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> init_notebook_mode</span>
<span id="cb34-2">init_notebook_mode(all_interactive<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb34-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> itables <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> show</span>
<span id="cb34-4"></span>
<span id="cb34-5">show(</span>
<span id="cb34-6">    result2[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CUP'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'REGIONE'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'SIGLA_PROVINCIA'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'COMUNE'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Data e ora presentazione domanda'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Spese Ammesse (€)'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Contributo Concesso (€)'</span>]],</span>
<span id="cb34-7">    layout<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top1"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"searchPanes"</span>},</span>
<span id="cb34-8">    searchPanes<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"layout"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"columns-3"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cascadePanes"</span>: <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"columns"</span>: [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]},</span>
<span id="cb34-9">)</span>
<span id="cb34-10"></span>
<span id="cb34-11"></span>
<span id="cb34-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># result2.query('SIGLA_PROVINCIA=="ME"').sort_values(by='Data e ora presentazione domanda')</span></span></code></pre></div>
<div class="cell-output cell-output-display">
<script>
    let is_dark_theme = function () {
        // Jupyter Lab
        if ('jpThemeLight' in document.body.dataset)
            return (document.body.dataset.jpThemeLight === "false");

        // VS Code
        if ('vscodeThemeKind' in document.body.dataset)
            return document.body.dataset.vscodeThemeKind.includes('dark');

        // Jupyter Book
        if ('theme' in document.documentElement.dataset)
            return document.documentElement.dataset.theme.includes('dark');

        // Default
        return window.matchMedia('(prefers-color-scheme: dark)').matches;
    }

    if (is_dark_theme()) {
        document.documentElement.classList.add('dark');
    }
    else {
        document.documentElement.classList.remove('dark');
    }
</script>
</div>
<div class="cell-output cell-output-display">
<style>:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0,0,0,.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0,0,0,.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:#ffffff80}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:#ffffff80;border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0!important;padding-top:0!important;padding-bottom:0!important;border-top-width:0px!important;border-bottom-width:0px!important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0!important;overflow:hidden!important}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before{position:absolute;display:block;bottom:50%;content:"\25b2";content:"\25b2"/""}table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{position:absolute;display:block;top:50%;content:"\25bc";content:"\25bc"/""}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>th.dt-ordering-asc,table.dataTable thead>tr>th.dt-ordering-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc,table.dataTable thead>tr>td.dt-ordering-asc,table.dataTable thead>tr>td.dt-ordering-desc{position:relative;padding-right:30px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order{position:absolute;right:12px;top:0;bottom:0;width:12px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0,0,0,.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled span.dt-column-order:before,table.dataTable thead>tr>td.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled span.dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255,255,255,.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:#0d6efd;background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0,1,1,0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0)}to{transform:translate(24px)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th,table.dataTable td{box-sizing:border-box}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable th.dt-empty,table.dataTable td.dt-empty{text-align:center;vertical-align:top}table.dataTable th.dt-type-numeric,table.dataTable th.dt-type-date,table.dataTable td.dt-type-numeric,table.dataTable td.dt-type-date{text-align:right}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td,table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:700}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0,0,0,.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{border-top:1px solid rgba(0,0,0,.3);padding:10px 10px 6px}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr:first-child>*{border-top:none}table.dataTable>tbody>tr:last-child>*{border-bottom:none}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.9);color:#fff;color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:#090a0b;color:rgb(var(--dt-row-selected-link))}table.dataTable>tbody>tr>th,table.dataTable>tbody>tr>td{padding:8px 10px}table.dataTable.row-border>tbody>tr>*,table.dataTable.display>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15)}table.dataTable.row-border>tbody>tr:first-child>*,table.dataTable.display>tbody>tr:first-child>*{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}table.dataTable.cell-border>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15);border-right:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr>*:first-child{border-left:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr:first-child>*{border-top:1px solid rgba(0,0,0,.3)}table.dataTable.stripe>tbody>tr:nth-child(odd)>*,table.dataTable.display>tbody>tr:nth-child(odd)>*{box-shadow:inset 0 0 0 9999px #00000006;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe),.023)}table.dataTable.stripe>tbody>tr:nth-child(odd).selected>*,table.dataTable.display>tbody>tr:nth-child(odd).selected>*{box-shadow:inset 0 0 0 9999px #0d6efdeb;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px #00000009;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd!important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),1)!important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_1{box-shadow:inset 0 0 0 9999px #0000000e;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.054)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_2{box-shadow:inset 0 0 0 9999px #0000000c;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.047)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_3{box-shadow:inset 0 0 0 9999px #0000000a;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.039)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdf3;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.954)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf1;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.947)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdef;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px #00000003;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px #00000001;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efde8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px #00000015;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px #00000013;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px #00000010;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdfa;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdf5;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.962)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}div.dt-container div.dt-layout-row{display:flex;justify-content:space-between;align-items:center;width:100%;margin:.75em 0}div.dt-container div.dt-layout-row div.dt-layout-cell{display:flex;justify-content:space-between;align-items:center}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-start{justify-content:flex-start;margin-right:auto}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-end{justify-content:flex-end;margin-left:auto}div.dt-container div.dt-layout-row div.dt-layout-cell:empty{display:none}@media screen and (max-width: 767px){div.dt-container div.dt-layout-row:not(.dt-layout-table){display:block}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell{display:block;text-align:center}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell>*{margin:.5em 0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-start{margin-right:0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-end{margin-left:0}}div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:1em}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:1em}div.dt-container div.dt-layout-full{width:100%}div.dt-container div.dt-layout-full>*:only-child{margin-left:auto;margin-right:auto}div.dt-container div.dt-layout-table>div{display:block!important}@media screen and (max-width: 767px){div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:0}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:0}}div.dt-container{position:relative;clear:both}div.dt-container .dt-search input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}div.dt-container .dt-input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit}div.dt-container select.dt-input{padding:4px}div.dt-container .dt-paging .dt-paging-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none!important;cursor:pointer;color:inherit!important;border:1px solid transparent;border-radius:2px;background:transparent}div.dt-container .dt-paging .dt-paging-button.current,div.dt-container .dt-paging .dt-paging-button.current:hover{color:inherit!important;border:1px solid rgba(0,0,0,.3);background-color:#0000000d;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(230,230,230,.05)),color-stop(100%,rgba(0,0,0,.05)));background:-webkit-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-moz-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-ms-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-o-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:linear-gradient(to bottom,#e6e6e60d,#0000000d)}div.dt-container .dt-paging .dt-paging-button.disabled,div.dt-container .dt-paging .dt-paging-button.disabled:hover,div.dt-container .dt-paging .dt-paging-button.disabled:active{cursor:default;color:#00000080!important;border:1px solid transparent;background:transparent;box-shadow:none}div.dt-container .dt-paging .dt-paging-button:hover{color:#fff!important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0%,#111 100%);background:-moz-linear-gradient(top,#585858 0%,#111 100%);background:-ms-linear-gradient(top,#585858 0%,#111 100%);background:-o-linear-gradient(top,#585858 0%,#111 100%);background:linear-gradient(to bottom,#585858,#111)}div.dt-container .dt-paging .dt-paging-button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b,#0c0c0c);box-shadow:inset 0 0 3px #111}div.dt-container .dt-paging .ellipsis{padding:0 1em}div.dt-container .dt-length,div.dt-container .dt-search,div.dt-container .dt-info,div.dt-container .dt-processing,div.dt-container .dt-paging{color:inherit}div.dt-container .dataTables_scroll{clear:both}div.dt-container .dataTables_scroll div.dt-scroll-body{-webkit-overflow-scrolling:touch}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td{vertical-align:middle}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0!important;padding:0!important}div.dt-container.dt-empty-footer tbody>tr:last-child>*{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body tbody>tr:last-child>*{border-bottom:none}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89,91,94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89,91,94)}html.dark table.dataTable.row-border>tbody>tr>*,html.dark table.dataTable.display>tbody>tr>*{border-top:1px solid rgb(64,67,70)}html.dark table.dataTable.row-border>tbody>tr:first-child>*,html.dark table.dataTable.display>tbody>tr:first-child>*{border-top:none}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64,67,70);border-right:1px solid rgb(64,67,70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64,67,70)}html.dark .dt-container.dt-empty-footer table.dataTable{border-bottom:1px solid rgb(89,91,94)}html.dark .dt-container .dt-search input,html.dark .dt-container .dt-length select{border:1px solid rgba(255,255,255,.2);background-color:var(--dt-html-background)}html.dark .dt-container .dt-paging .dt-paging-button.current,html.dark .dt-container .dt-paging .dt-paging-button.current:hover{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark .dt-container .dt-paging .dt-paging-button.disabled,html.dark .dt-container .dt-paging .dt-paging-button.disabled:hover,html.dark .dt-container .dt-paging .dt-paging-button.disabled:active{color:#666!important}html.dark .dt-container .dt-paging .dt-paging-button:hover{border:1px solid rgb(53,53,53);background:#353535}html.dark .dt-container .dt-paging .dt-paging-button:active{background:#3a3a3a}*[dir=rtl] table.dataTable thead th,*[dir=rtl] table.dataTable thead td,*[dir=rtl] table.dataTable tfoot th,*[dir=rtl] table.dataTable tfoot td{text-align:right}*[dir=rtl] table.dataTable th.dt-type-numeric,*[dir=rtl] table.dataTable th.dt-type-date,*[dir=rtl] table.dataTable td.dt-type-numeric,*[dir=rtl] table.dataTable td.dt-type-date{text-align:left}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-start{text-align:right}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-end{text-align:left}*[dir=rtl] div.dt-container div.dt-search input{margin:0 3px 0 0}@keyframes dtb-spinner{to{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{to{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{to{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dataTables_wrapper{position:relative}div.dt-buttons{position:initial}div.dt-buttons .dt-button{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:#fff;border-radius:.75em;box-shadow:3px 4px 10px 1px #000c;text-align:center;z-index:2003;overflow:hidden}div.dt-button-info h2{padding:2rem 2rem 1rem;margin:0;font-weight:400}div.dt-button-info>div{padding:1em 2em 2em}div.dtb-popover-close{position:absolute;top:6px;right:6px;width:22px;height:22px;text-align:center;border-radius:3px;cursor:pointer;z-index:2003}button.dtb-hide-drop{display:none!important}div.dt-button-collection-title{text-align:center;padding:.3em .5em .5em;margin-left:.5em;margin-right:.5em;font-size:.9em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}div.dt-button-collection-title:empty{display:none}span.dt-button-spacer{display:inline-block;margin:.5em;white-space:nowrap}span.dt-button-spacer.bar{border-left:1px solid rgba(0,0,0,.3);vertical-align:middle;padding-left:.5em}span.dt-button-spacer.bar:empty{height:1em;width:1px;padding-left:0}div.dt-button-collection .dt-button-active{padding-right:3em}div.dt-button-collection .dt-button-active:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection .dt-button-active.dt-button-split{padding-right:0}div.dt-button-collection .dt-button-active.dt-button-split:after{display:none}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child{padding-right:3em}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection .dt-button-active-a a{padding-right:3em}div.dt-button-collection .dt-button-active-a a:after{position:absolute;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection span.dt-button-spacer{width:100%;font-size:.9em;text-align:center;margin:.5em 0}div.dt-button-collection span.dt-button-spacer:empty{height:0;width:100%}div.dt-button-collection span.dt-button-spacer.bar{border-left:none;border-bottom:1px solid rgba(0,0,0,.1);padding-left:0}@media print{table.dataTable tr>*{box-shadow:none!important}}html.dark div.dt-button-info{background-color:var(--dt-html-background);border:1px solid rgba(255,255,255,.15)}div.dt-buttons>.dt-button,div.dt-buttons>div.dt-button-split .dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-left:.167em;margin-right:.167em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(230, 230, 230, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dt-buttons>.dt-button:first-child,div.dt-buttons>div.dt-button-split .dt-button:first-child{margin-left:0}div.dt-buttons>.dt-button.disabled,div.dt-buttons>div.dt-button-split .dt-button.disabled{cursor:default;opacity:.4}div.dt-buttons>.dt-button.dt-button-active:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background-color:#0000001a;background:linear-gradient(to bottom,#b3b3b31a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(179, 179, 179, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)");box-shadow:inset 1px 1px 3px #999}div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:#0000001a;background:linear-gradient(to bottom,#8080801a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(128, 128, 128, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)")}div.dt-buttons>.dt-button:hover,div.dt-buttons>div.dt-button-split .dt-button:hover{text-decoration:none}div.dt-buttons>.dt-button:hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){border:1px solid #666;background-color:#0000001a;background:linear-gradient(to bottom,#9999991a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(153, 153, 153, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)")}div.dt-buttons>.dt-button:focus:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(53,132,228)}div.dt-buttons>.dt-button embed,div.dt-buttons>div.dt-button-split .dt-button embed{outline:none}div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(0,0,0,.15);border-top-right-radius:0;border-bottom-right-radius:0}div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid #666}div.dt-buttons>div.dt-button-split .dt-button:last-child{border-left:1px solid transparent;border-top-left-radius:0;border-bottom-left-radius:0}div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid #666}div.dt-buttons span.dt-button-down-arrow{position:relative;top:-2px;font-size:10px;padding-left:10px;line-height:1em;opacity:.6}div.dt-buttons div.dt-button-split{display:inline-block}div.dt-buttons div.dt-button-split .dt-button:first-child{margin-right:0}div.dt-buttons div.dt-button-split .dt-button:last-child{margin-left:-1px;padding-left:.75em;padding-right:.75em;z-index:2}div.dt-buttons div.dt-button-split .dt-button:last-child span{padding-left:0}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;margin-bottom:3px;padding:.75em 0;border:1px solid rgba(0,0,0,.4);background-color:#fff;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 4px 10px 1px #0000004d;box-sizing:border-box}div.dt-button-collection .dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;background:none;margin:0;padding:.5em 1em;border:none;text-align:left;cursor:pointer;color:inherit}div.dt-button-collection .dt-button.dt-button-active{background:none;box-shadow:none}div.dt-button-collection .dt-button.disabled{cursor:default;opacity:.4}div.dt-button-collection .dt-button:hover:not(.disabled){border:none;background:#9999991a;box-shadow:none}div.dt-button-collection div.dt-button-split{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}div.dt-button-collection div.dt-button-split button.dt-button{margin:0;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px}div.dt-button-collection div.dt-button-split button.dt-button-split-drop{min-width:33px;flex:0}div.dt-button-collection.fixed .dt-button{border-radius:.25em;background:#ffffff1a}div.dt-button-collection.fixed{position:fixed;display:block;top:50%;left:50%;margin-left:-75px;border-radius:5px;background-color:#fff;padding:.5em}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection.fixed.columns{margin-left:-409px}@media screen and (max-width: 1024px){div.dt-button-collection.fixed.columns{margin-left:-308px}}@media screen and (max-width: 640px){div.dt-button-collection.fixed.columns{margin-left:-203px}}@media screen and (max-width: 460px){div.dt-button-collection.fixed.columns{margin-left:-100px}}div.dt-button-collection.fixed>:last-child{max-height:100vh;overflow:auto}div.dt-button-collection.two-column>:last-child,div.dt-button-collection.three-column>:last-child,div.dt-button-collection.four-column>:last-child{display:block!important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.two-column>:last-child>*,div.dt-button-collection.three-column>:last-child>*,div.dt-button-collection.four-column>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.columns{width:auto}div.dt-button-collection.columns>:last-child{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:6px;width:818px;padding-bottom:1px}div.dt-button-collection.columns>:last-child .dt-button{min-width:200px;flex:0 1;margin:0}div.dt-button-collection.columns.dtb-b3>:last-child,div.dt-button-collection.columns.dtb-b2>:last-child,div.dt-button-collection.columns.dtb-b1>:last-child{justify-content:space-between}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:1 1 32%}div.dt-button-collection.columns.dtb-b2 .dt-button{flex:1 1 48%}div.dt-button-collection.columns.dtb-b1 .dt-button{flex:1 1 100%}@media screen and (max-width: 1024px){div.dt-button-collection.columns>:last-child{width:612px}}@media screen and (max-width: 640px){div.dt-button-collection.columns>:last-child{width:406px}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:0 1 32%}}@media screen and (max-width: 460px){div.dt-button-collection.columns>:last-child{width:200px}}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;background:radial-gradient(ellipse farthest-corner at center,#0000004d,#000000b3);z-index:2001}.dt-button.processing{color:#0003}.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid rgb(40,40,40);border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1.5s infinite linear;-o-animation:dtb-spinner 1.5s infinite linear;-ms-animation:dtb-spinner 1.5s infinite linear;-webkit-animation:dtb-spinner 1.5s infinite linear;-moz-animation:dtb-spinner 1.5s infinite linear}@media screen and (max-width: 640px){div.dt-buttons{float:none!important;text-align:center}}html.dark div.dt-buttons>.dt-button,html.dark div.dt-buttons>div.dt-button-split .dt-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background:#b3b3b326;box-shadow:inset 1px 1px 2px #000}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){background:#80808026;box-shadow:inset 1px 1px 3px #000}html.dark div.dt-buttons>.dt-button:hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){background:#b3b3b326}html.dark div.dt-buttons>.dt-button:focus:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(110,168,254)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(255,255,255,.1)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid rgb(89,91,94)}html.dark div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid rgb(89,91,94)}html.dark div.dt-button-collection{border:1px solid rgba(255,255,255,.15);background-color:#212529;box-shadow:3px 4px 10px 1px #000c}table.dataTable thead tr>.dtfc-fixed-start,table.dataTable thead tr>.dtfc-fixed-end,table.dataTable tfoot tr>.dtfc-fixed-start,table.dataTable tfoot tr>.dtfc-fixed-end{top:0;bottom:0;z-index:3;background-color:#fff}table.dataTable tbody tr>.dtfc-fixed-start,table.dataTable tbody tr>.dtfc-fixed-end{z-index:1;background-color:#fff}table.dataTable tr>.dtfc-fixed-left:after,table.dataTable tr>.dtfc-fixed-right:after{position:absolute;top:0;bottom:0;width:10px;transition:box-shadow .3s;content:"";pointer-events:none}table.dataTable tr>.dtfc-fixed-left:after{right:0;transform:translate(100%)}table.dataTable tr>.dtfc-fixed-right:after{left:0;transform:translate(-80%)}table.dataTable.dtfc-scrolling-left tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}div.dt-scroll,div.dtfh-floatingparent{position:relative}div.dt-scroll div.dtfc-top-blocker,div.dt-scroll div.dtfc-bottom-blocker,div.dtfh-floatingparent div.dtfc-top-blocker,div.dtfh-floatingparent div.dtfc-bottom-blocker{position:absolute;background-color:#fff}html.dark table.dataTable thead tr>.dtfc-fixed-start,html.dark table.dataTable thead tr>.dtfc-fixed-end,html.dark table.dataTable tfoot tr>.dtfc-fixed-start,html.dark table.dataTable tfoot tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable tbody tr>.dtfc-fixed-start,html.dark table.dataTable tbody tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable.dtfc-scrolling-left tbody>tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}html.dark div.dtfc-top-blocker,html.dark div.dtfc-bottom-blocker{background-color:var(--dt-html-background)}table.dataTable tbody th.focus,table.dataTable tbody td.focus{outline:2px solid #36f;outline-offset:-2px}table.dataTable tbody tr.selected th.focus,table.dataTable tbody tr.selected td.focus{outline-color:#03c}div.dtk-focus-alt table.dataTable tbody th.focus,div.dtk-focus-alt table.dataTable tbody td.focus{outline:2px solid #ff8b33;outline-offset:-2px}html.dark table.dataTable tbody th.focus,html.dark table.dataTable tbody td.focus{outline-color:#0d6efd}html.dark table.dataTable tbody tr.selected th.focus,html.dark table.dataTable tbody tr.selected td.focus{outline-color:#0143a3}html.dark div.dtk-focus-alt table.dataTable tbody th.focus,html.dark div.dtk-focus-alt table.dataTable tbody td.focus{outline-color:#ff8b33}table.dataTable tr.dtrg-group th{background-color:#0000001a;text-align:left}table.dataTable tr.dtrg-group.dtrg-level-0 th{font-weight:700}table.dataTable tr.dtrg-group.dtrg-level-1 th,table.dataTable tr.dtrg-group.dtrg-level-2 th,table.dataTable tr.dtrg-group.dtrg-level-3 th,table.dataTable tr.dtrg-group.dtrg-level-4 th,table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#0000000d;padding-top:.25em;padding-bottom:.25em;padding-left:2em;font-size:.9em}table.dataTable tr.dtrg-group.dtrg-level-2 th{background-color:#00000003;padding-left:2.5em}table.dataTable tr.dtrg-group.dtrg-level-3 th{background-color:#00000003;padding-left:3em}table.dataTable tr.dtrg-group.dtrg-level-4 th{background-color:#00000003;padding-left:3.5em}table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#00000003;padding-left:4em}html.dark table.dataTable tr.dtrg-group th{background-color:#ffffff1a}html.dark table.dataTable tr.dtrg-group.dtrg-level-1 th{background-color:#ffffff0d}html.dark table.dataTable tr.dtrg-group.dtrg-level-2 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-3 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-4 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#ffffff03}div.dt-datetime{position:absolute;background-color:#fff;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px #00000080;padding:6px 20px;width:275px;border-radius:5px}div.dt-datetime.inline{position:relative;box-shadow:none}div.dt-datetime div.dt-datetime-title{text-align:center;padding:5px 0 3px}div.dt-datetime div.dt-datetime-buttons{text-align:center}div.dt-datetime div.dt-datetime-buttons a{display:inline-block;padding:0 .5em .5em;margin:0;font-size:.9em}div.dt-datetime div.dt-datetime-buttons a:hover{text-decoration:underline}div.dt-datetime table{border-spacing:0;margin:12px 0;width:100%}div.dt-datetime table.dt-datetime-table-nospace{margin-top:-12px}div.dt-datetime table th{font-size:.8em;color:#777;font-weight:400;width:14.285714286%;padding:0 0 4px;text-align:center}div.dt-datetime table td{font-size:.9em;color:#444;padding:0}div.dt-datetime table td.selectable{text-align:center;background:#f5f5f5}div.dt-datetime table td.selectable.disabled,div.dt-datetime table td.selectable.disabled button:hover{color:#aaa;background:#fff}div.dt-datetime table td.selectable.now{background-color:#ddd}div.dt-datetime table td.selectable.now button{font-weight:700}div.dt-datetime table td.selectable.selected button{background:#4e6ca3;color:#fff;border-radius:2px}div.dt-datetime table td.selectable button:hover{background:#ff8000;color:#fff;border-radius:2px}div.dt-datetime table td.dt-datetime-week{font-size:.7em}div.dt-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:center;padding:4px 0;cursor:pointer;margin:0}div.dt-datetime table button span{display:inline-block;min-width:14px;text-align:right}div.dt-datetime table.weekNumber th{width:12.5%}div.dt-datetime div.dt-datetime-calendar table{margin-top:0}div.dt-datetime div.dt-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.dt-datetime div.dt-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.dt-datetime div.dt-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0}div.dt-datetime.horizontal{width:550px}div.dt-datetime.horizontal div.dt-datetime-date,div.dt-datetime.horizontal div.dt-datetime-time{width:48%}div.dt-datetime.horizontal div.dt-datetime-time{margin-left:4%}div.dt-datetime div.dt-datetime-date{position:relative;float:left;width:100%}div.dt-datetime div.dt-datetime-time{position:relative;float:left;width:100%;text-align:center}div.dt-datetime div.dt-datetime-time>span{vertical-align:middle}div.dt-datetime div.dt-datetime-time th{text-align:left}div.dt-datetime div.dt-datetime-time div.dt-datetime-timeblock{display:inline-block;vertical-align:middle}div.dt-datetime div.dt-datetime-iconLeft,div.dt-datetime div.dt-datetime-iconRight{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:.3;overflow:hidden;box-sizing:border-box;border:1px solid transparent}div.dt-datetime div.dt-datetime-iconLeft:hover,div.dt-datetime div.dt-datetime-iconRight:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:.6}div.dt-datetime div.dt-datetime-iconLeft button,div.dt-datetime div.dt-datetime-iconRight button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.dt-datetime div.dt-datetime-iconLeft{position:absolute;top:5px;left:5px}div.dt-datetime div.dt-datetime-iconLeft button{position:relative;z-index:1}div.dt-datetime div.dt-datetime-iconLeft:after{position:absolute;top:7px;left:10px;display:block;content:"";border-top:7px solid transparent;border-right:7px solid black;border-bottom:7px solid transparent}div.dt-datetime div.dt-datetime-iconRight{position:absolute;top:5px;right:5px}div.dt-datetime div.dt-datetime-iconRight button{position:relative;z-index:1}div.dt-datetime div.dt-datetime-iconRight:after{position:absolute;top:7px;left:12px;display:block;content:"";border-top:7px solid transparent;border-left:7px solid black;border-bottom:7px solid transparent}div.dt-datetime-error{clear:both;padding:0 1em;max-width:240px;font-size:11px;line-height:1.25em;text-align:center;color:#b11f1f}html.dark input.dt-datetime{color-scheme:dark}html.dark div.dt-datetime{border:1px solid #595b5e;background-color:#212529;box-shadow:3px 4px 10px 1px #000c}html.dark div.dt-datetime table th{color:#ccc}html.dark div.dt-datetime table td{color:#eee}html.dark div.dt-datetime table td.selectable{background:#373c41}html.dark div.dt-datetime table td.selectable.disabled,html.dark div.dt-datetime table td.selectable.disabled button:hover{color:#aaa;background:#171b1f}html.dark div.dt-datetime table td.selectable.now{background:#4b5055}html.dark div.dt-datetime table td.selectable.selected button{background:#6ea8fe;color:#000}html.dark div.dt-datetime table td.selectable button:hover{background:#ff8000;color:#000}html.dark div.dt-datetime div.dt-datetime-label:hover,html.dark div.dt-datetime div.dt-datetime-iconLeft:hover,html.dark div.dt-datetime div.dt-datetime-iconRight:hover,html.dark div.dt-datetime div.dt-datetime-iconUp:hover,html.dark div.dt-datetime div.dt-datetime-iconDown:hover{border:1px solid transparent;background-color:#ffffff1a}html.dark div.dt-datetime div.dt-datetime-iconLeft:after{border-right-color:#fff}html.dark div.dt-datetime div.dt-datetime-iconRight:after{border-left-color:#fff}html.dark div.dt-datetime select{color-scheme:dark}html.dark div.dt-datetime-error{color:#b11f1f}div.dt-button-collection{overflow:visible!important;z-index:2002!important}div.dt-button-collection div.dtsb-searchBuilder{padding-left:1em!important;padding-right:1em!important}div.dt-button-collection.dtb-collection-closeable div.dtsb-titleRow{padding-right:40px}.dtsb-greyscale{border:1px solid #cecece!important}div.dtsb-logicContainer .dtsb-greyscale{border:none!important}div.dtsb-searchBuilder{justify-content:space-evenly;cursor:default;margin-bottom:1em;text-align:left;width:100%}div.dtsb-searchBuilder button.dtsb-button,div.dtsb-searchBuilder select{font-size:1em}div.dtsb-searchBuilder div.dtsb-titleRow{justify-content:space-evenly;margin-bottom:.5em}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title{display:inline-block;padding-top:14px}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title:empty{display:inline}div.dtsb-searchBuilder div.dtsb-titleRow button.dtsb-clearAll{float:right;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-vertical .dtsb-value,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-data,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-condition{display:block}div.dtsb-searchBuilder div.dtsb-group{position:relative;clear:both;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-group button.dtsb-search{float:right}div.dtsb-searchBuilder div.dtsb-group button.dtsb-clearGroup{margin:2px;text-align:center;padding:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);position:absolute;margin-top:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{margin-bottom:.8em;display:flex;justify-content:start;flex-flow:row wrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{padding:.4em;margin-right:.8em;min-width:5em;max-width:20em;color:inherit;font-size:1em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown option.dtsb-notItalic,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input option.dtsb-notItalic{font-style:normal}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-italic{font-style:italic}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{flex:1;white-space:nowrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont span.dtsb-joiner{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input.dtsb-value{width:33%}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont select,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input{height:100%;box-sizing:border-box}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{margin-left:auto;display:inline-block}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left:last-child{margin-right:0}@media screen and (max-width: 550px){div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{display:flex;flex-flow:none;flex-direction:column;justify-content:start;padding-right:calc(35px + .8em);margin-bottom:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:first-child),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:nth-child(2)),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:last-child){padding-top:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:first-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:nth-child(2),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:last-child{padding-top:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{max-width:none;width:100%;margin-bottom:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{position:absolute;width:35px;display:flex;flex-wrap:wrap-reverse;right:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button{margin-right:0!important}}div.dtsb-searchBuilder button,div.dtsb-searchBuilder select.dtsb-dropDown,div.dtsb-searchBuilder input{background-color:#f9f9f9}div.dtsb-searchBuilder button.dtsb-button{position:relative;display:inline-block;box-sizing:border-box;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dtsb-searchBuilder button.dtsb-button:hover{background-color:#cecece;cursor:pointer}div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgba(0,0,0,.3);background-color:#0000001a;background:linear-gradient(to right,#e6e6e61a,#0000001a)}div.dtsb-searchBuilder div.dtsb-logicContainer button{border:1px solid transparent;background:transparent}div.dtsb-searchBuilder button.dtsb-clearGroup{min-width:2em;padding:0}div.dtsb-searchBuilder button.dtsb-iptbtn{min-width:100px;text-align:left}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{border:1px solid;border-color:#cecece;border-radius:3px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-logic{border:none;border-radius:0;flex-grow:1;flex-shrink:0;flex-basis:3em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-clearGroup{border:none;border-radius:0;width:2em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{border:1px solid;border-radius:3px}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-condition{border-color:#48b13c}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-data{border-color:#e70f00}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-value,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-value{border-color:#0069ba}html.dark div.dtsb-searchBuilder button.dtsb-button,html.dark div.dtsb-searchBuilder select.dtsb-dropDown,html.dark div.dtsb-searchBuilder input.dtsb-input{background-color:#424549!important;color-scheme:dark}html.dark div.dtsb-searchBuilder button.dtsb-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dtsb-searchBuilder button.dtsb-button:hover{background:#b3b3b326}html.dark div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgb(89,91,94)}html.dark div.dtsb-searchBuilder .dtsb-greyscale{border-color:#fff3!important}div.dtsp-topRow{display:flex;flex-direction:row;flex-wrap:nowrap;border:2px solid rgba(0,0,0,0);border-radius:3px;justify-content:space-around;align-content:flex-start;align-items:flex-start}div.dtsp-topRow input.dtsp-search{text-overflow:ellipsis;min-width:50px;flex-basis:90px;max-width:none}div.dtsp-topRow input.dtsp-search::placeholder{color:inherit}div.dtsp-topRow div.dtsp-subRow1{display:flex;flex-direction:row;flex-wrap:nowrap;flex:1 1 auto}div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont{position:relative;width:100%}div.dtsp-topRow div.dtsp-subRow1 input{padding-right:2em;width:100%!important;box-sizing:border-box;font-size:1em}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{background-color:transparent;border:none;cursor:initial;box-shadow:none;padding-bottom:0;padding-top:0;min-height:1em;height:fit-content;box-sizing:content-box}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]::placeholder{color:initial;opacity:1}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon{position:absolute;top:0;right:0;bottom:0}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAABbmlDQ1BpY2MAACiRdZE7SwNBFIU/EyWikRRaiFhsoWKhEBREO42FTZAQFYza7G5eQhKX3QQJtoKNhWAh2vgq/AfaCrYKgqAIIhb+Al+NhPVOEkiQZJbZ+3FmzmXmDHjCGTPrtAYhm8vb0bmQthxb0Xzv+PHRxRSabjrWTCQSpun4eaRF1YdR1av5voajM55wTGhpF54wLTsvPC0c3sxbineFe8y0Hhc+ER6x5YDCt0o3KvymOFXhL8X2YnQWPKqnlqpjo47NtJ0VHhYeyGYKZvU86ib+RG5pQWqfzH4coswRQsOgwDoZ8oxKzUlmjX3Bsm+eDfGY8rcoYosjRVq8I6IWpGtCalL0hHwZiir3/3k6yfGxSnd/CNpeXfdzEHz7UNpz3d9T1y2dgfcFrnM1/4bkNPkt+l5NGziGwDZc3tQ04wCudqD32dJtvSx5ZXqSSfi4gK4YdN9Dx2olq+o650+wuCVPdAeHRzAk+wNrfw8JaBFXEnV+AAAACXBIWXMAAA9hAAAPYQGoP6dpAAABMUlEQVQoU6XRr0vDQRjH8akoM4iIjqGoOIZ5oIjB5XWxajaYDGLSIhhNYjcPRDSJwbQNw+L+BNGgYYo/5pT5/shz8vDlBgMPXux7z3N3z+25VOofYyCyd4ZYCavI4gXPsRp9LqiDdrEMH+8wv8Vh8gBfWclFPOEUN3hAHjlMoRa7wTzBS5xgKLFglPkZLjDic6HyDsEMNvGR2Nxifoci3tEI+X770JU0XmPXIlax+LTPh83fFox1X6kxyzdjm9UcdXi9S+Vti6svfyNULhNR9TVsYNhW6Ff9KKCNR7/Zv6eeaQ+6+qcdpu9BqGlp1HFgud+FYdzzUcUExu0Q/cdzHGEFetIlXKPjK/sbqYoOftMiS+j9jzEJPd1Wt+5+kdR/9EM9ucIC5jCbyPc01Q32kfsBppYz3hYFcCwAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:12px}div.dtsp-topRow div.dtsp-subRow2{white-space:nowrap;flex:0 0 auto}div.dtsp-topRow button>span{display:inline-block;height:100%;width:100%}div.dtsp-topRow button.dtsp-nameButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAK2SURBVFgJ7ZY9j41BFICvryCExrJBQ6HyEYVEIREaUZDQIRoR2ViJKCioxV+gkVXYTVZEQiEUhG2EQnxUCh0FKolY4ut5XnM2cyfva3Pt5m7EPcmzZ2bemTNnzjkzd1utnvQi0IvAfxiBy5z5FoxO89kPY+8mbMjtzs47RXs5/WVpbAG6bWExt5PuIibvhVkwmC+ck3eK9ln6/fAddFojYzBVuYSBpcnIEvRaqOw2RcaN18FPuJH0JvRUxbT3wWf4ltiKPgfVidWlbGZgPozDFfgAC+EA/K2EI4cwcAJ+gPaeQ+VQU2SOMMGcPgPl/m/V2p50rrbRsRgt9Iv5h6xtpP22Bz7Ce1C+gFFxfKzOmShcU+Qmyh2w3w8rIJfddHTck66EukL/xPhj+JM8rHNmFys0Pg4v0up3aFNlwR9NYyodd3OL/C64zpsymcTFcf6ElM4YzjAWKYrJkaq8kE/yUYNP4BoYvS1QRo+hNtF5xfkTUjoTheukSFFMjlTFm6PjceOca/SMpKfeCR1L6Uzk/y2WIkVhNFJlJAZhP+hYns7b9D3IPuhY5mYrIv8OrQJvR5NYyNaW4jsU8pSGNySiVx4o5tXq3JkoXE/mg5R/M8dGJCJpKhaDcjBRdbI/Rm8g69c122om33BHmj2CHoV5qa9jUXBraJ+G1fAVjIBO1klc87ro1K4JZ/K35SWW3TwcyDd6TecqnAEd8cGq2+w84xvBm1n3vS0izKkkwh5XNC/GmFPqqAtPF89AOScKuemaNzoTV1SD5dtSbmLf1/RV+tC0WTgcj6R7HEtrVGWaqu/lYDZ/2pvxQ/kIyw/gFByHC9AHw910hv1aUUumyd8yy0QfhmEkfiNod0Xusct68J1qc8Tdux0Z97Q+hsDb+AYGYEbF/4Guw2Q/qDPqZG/zXgT+3Qj8AtKnfWhFwmuAAAAAAElFTkSuQmCC)!important;background-repeat:no-repeat;background-position:center;background-size:23px;vertical-align:bottom}div.dtsp-topRow button.dtsp-countButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAG5SURBVEgN3VU9LwVBFF0fiYhofUSlEQkKhU7z/oBCQkIiGr9BgUbhVzy9BAnhFyjV/AYFiU5ICM7ZN+c5Zud5dm3lJmfmzrkz9+7cu3c3y/6jjOBSF8CxXS7FmTkbwqIJjDpJvTcmsJ4K3KPZUpyZsx0sxoB9J6mnAkyC7wGuuCFIipNtEcpcWExgXpOBc78vgj6N+QO4NVsjwdFM59tUIDxDrHMBOeIQ34C5ZDregXuAQm4YcI68nN9B3wr2PcwPAIPkN2EqtJH6b+QZm1ajjTx7BqwAr26Lb+C2Kvpbt0Mb2HAJ7NrGFGfmXO3DeA4UshDfQAVmH0gaUFg852TTTDvlxwBlCtxy9zXyBhQFaq0wMmIdRebrfgosA3zb2hKnqG0oqchp4QbuR8X0TjzABhbdOT8jnQ/atcgqpnfwOA7yqZyTU587ZkIGdesLTt2EkynOnbreMUUKMI/dA4B/QVOcO13CQh+5wWCgDwo/75u59odB/wjmfhbgvACcAOyZPHihMWAoIwxyCLgf1oxfgjzVbgBXSTzIN+f0pg6s5DkcesLMRpsBrgE2XO3CN64JFP7JtUeKHX4CKtRRXFZ+7dEAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:18px;vertical-align:bottom}div.dtsp-topRow button.dtsp-collapseButton span.dtsp-caret{position:relative;top:9px;display:inline-block}div.dtsp-topRow button.dtsp-collapseButton.dtsp-rotated{transform:rotate(180deg)}div.dtsp-searchPane table thead th,div.dtsp-searchPane table thead td{width:100%!important}div.dt-button-collection{z-index:2002}div.dt-button-collection.dtb-collection-closeable div.dtsp-titleRow{padding-right:25px}div.dtsp-columns-1{max-width:100%;min-width:100%;margin:0!important}div.dtsp-columns-2{max-width:49%;min-width:49%;margin:0!important}div.dtsp-columns-3{max-width:32%;min-width:32%;margin:0!important}div.dtsp-columns-4{max-width:24%;min-width:24%;margin:0!important}div.dtsp-columns-5{max-width:19%;min-width:19%;margin:0!important}div.dtsp-columns-6{max-width:16%;min-width:16%;margin:0!important}div.dtsp-columns-7{max-width:14%;min-width:14%;margin:0!important}div.dtsp-columns-8{max-width:12%;min-width:12%;margin:0!important}div.dtsp-columns-9{max-width:10.5%;min-width:10.5%;margin:0!important}div.dtsp-narrow{flex-direction:column!important}div.dtsp-narrow div.dtsp-subRow1,div.dtsp-narrow div.dtsp-subRow2{width:100%}div.dtsp-narrow div.dtsp-subRow2 button{margin:0!important;width:25%!important}div.dt-button-collection div.dtsp-panesContainer{padding-left:1em;padding-right:1em;margin-bottom:0}div.dtsp-panesContainer{margin-bottom:1em}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{width:100%}div.dtsp-searchPane div.dt-container div.dataTables_layout_cell,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_layout_cell{padding:0}div.dtsp-searchPane div.dt-container div.dt-scroll-head,div.dtsp-searchPane div.dt-container div.dataTables_scrollHead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-head,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollHead{display:none!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#fff!important;border:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body thead,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody thead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body thead,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody thead{display:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>td{padding:5px 10px}div.dtsp-searchPane div.dt-container div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody td.dtsp-nameColumn{width:100%!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{cursor:default}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name{text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:middle;white-space:nowrap;flex-grow:1;text-align:left}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{display:inline-block;background-color:#cfcfcf;text-align:center;border-radius:10px;width:auto;min-width:30px;color:#000;font-size:.9em;padding:0 4px}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty{display:none}div.dtsp-panesContainer{clear:both;padding-left:0;padding-right:0;text-align:center}div.dtsp-panesContainer div.dtsp-searchPanes{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-content:flex-start;align-items:stretch;clear:both;text-align:left}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane{flex-grow:1;flex-shrink:0;font-size:.9em;margin-top:15px!important}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper{flex:1;box-sizing:border-box}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dataTables_filter,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dataTables_filter{display:none}div.dtsp-panesContainer div.dtsp-title{float:left;padding:10px 0}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{float:right}div.dtsp-hidden{display:none!important}html.dark div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder,html[data-bs-theme=dark] div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder{color:#fff}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{border:1px solid #f0f0f0;border-radius:4px;overflow:hidden}div.dtsp-searchPane div.dt-container:hover,div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid #cfcfcf}div.dtsp-searchPane div.dt-container div.dt-scroll,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll{margin:-5px 0}div.dtsp-searchPane div.dt-container table.dataTable,div.dtsp-searchPane div.dataTables_wrapper table.dataTable{border-bottom:none!important}div.dtsp-searchPane div.dtsp-topRow{border:1px solid transparent}div.dtsp-searchPane div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{padding-bottom:5px}div.dtsp-searchPane div.dtsp-topRow div.dtsp-searchCont input.dtsp-search{border:none;padding-left:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered{border:1px solid #f0f0f0;border-radius:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered:hover{background-color:#f0f0f0}div.dtsp-searchPane input.dtsp-paneInputButton,div.dtsp-searchPane button.dtsp-paneButton{height:35px;width:35px;min-width:0;display:inline-block;margin:2px 2px 0;border:0px solid transparent;background-color:transparent}div.dtsp-searchPane input.dtsp-paneInputButton:hover,div.dtsp-searchPane button.dtsp-paneButton:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-searchPane button.dtsp-paneButton{vertical-align:middle;opacity:.6}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{border:1px solid transparent;background-color:transparent}div.dtsp-panesContainer button.dtsp-clearAll:hover,div.dtsp-panesContainer button.dtsp-collapseAll:hover,div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-panesContainer button.dtsp-disabledButton{cursor:default!important;color:#7c7c7c}div.dtsp-panesContainer button.dtsp-disabledButton:hover{background-color:transparent}div.dtsp-panesContainer button.dtsp-disabledButton:focus{outline:none}@media screen and (max-width: 767px){div.dtsp-columns-4,div.dtsp-columns-5,div.dtsp-columns-6{max-width:31%!important;min-width:31%!important}}@media screen and (max-width: 640px){div.dtsp-searchPanes{flex-direction:column!important}div.dtsp-searchPane{max-width:98%!important;min-width:98%!important}}html.dark div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span,html.dark div.dtsp-topRow button.dtsp-nameButton span,html.dark div.dtsp-topRow button.dtsp-countButton span{filter:invert(1)}html.dark div.dtsp-topRow input.dtsp-paneInputButton,html.dark div.dtsp-topRow button.dtsp-paneButton{color:inherit}html.dark div.dtsp-topRow input.dtsp-paneInputButton:hover,html.dark div.dtsp-topRow button.dtsp-paneButton:hover{background-color:#404549}html.dark div.dtsp-topRow.dtsp-bordered{border:1px solid rgba(255,255,255,.2);background:#2f3438!important}html.dark div.dtsp-topRow.dtsp-bordered:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-panesContainer button.dtsp-clearAll,html.dark div.dtsp-panesContainer button.dtsp-collapseAll,html.dark div.dtsp-panesContainer button.dtsp-showAll{color:inherit}html.dark div.dtsp-panesContainer button.dtsp-clearAll:hover,html.dark div.dtsp-panesContainer button.dtsp-collapseAll:hover,html.dark div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#404549}html.dark div.dtsp-panesContainer button.dtsp-disabledButton{color:#7c7c7c}html.dark div.dtsp-searchPane div.dt-container,html.dark div.dtsp-searchPane div.dataTables_wrapper{border:1px solid rgba(255,255,255,.2)}html.dark div.dtsp-searchPane div.dt-container:hover,html.dark div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#2f3438!important}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{background-color:#212529;color:inherit}table.dataTable>tbody>tr>.selected{background-color:#0d6efde6;color:#fff}table.dataTable>tbody>tr>.dt-select{text-align:center;vertical-align:middle}table.dataTable>thead>tr>.dt-select{text-align:center}table.dataTable input.dt-select-checkbox{appearance:none;position:relative;display:inline-block;width:12px;height:12px;border:1px solid;border-radius:3px;vertical-align:middle;margin-top:1px;color:inherit;font-size:20px;line-height:1em}table.dataTable input.dt-select-checkbox:checked:after{display:block;content:"\2713";margin-top:-8px}table.dataTable input.dt-select-checkbox:indeterminate:after{display:block;position:absolute;content:" ";top:3px;left:3px;height:4px;width:4px;background-color:#000;border-radius:2px}table.dataTable>tbody>tr.selected input.dt-select-checkbox:checked{border:1px solid}table.dataTable>tbody>tr>td.select-checkbox,table.dataTable>tbody>tr>th.select-checkbox{position:relative}table.dataTable>tbody>tr>td.select-checkbox:before,table.dataTable>tbody>tr>th.select-checkbox:before{display:block;position:absolute;top:50%;left:50%;width:12px;height:12px;box-sizing:border-box;content:" ";margin-top:-6px;margin-left:-6px;border:1px solid;border-radius:3px}table.dataTable>tbody>tr.selected>td.select-checkbox:before,table.dataTable>tbody>tr.selected>th.select-checkbox:before{border:1px solid;content:"\2713";font-size:20px;line-height:6px;text-align:center}table.dataTable.compact>tbody>tr>td.select-checkbox:before,table.dataTable.compact>tbody>tr>th.select-checkbox:before{margin-top:-12px}table.dataTable.compact>tbody>tr.selected>td.select-checkbox:after,table.dataTable.compact>tbody>tr.selected>th.select-checkbox:after{margin-top:-16px}div.dt-container span.select-info,div.dt-container span.select-item{margin-left:.5em}html.dark table.dataTable input.dt-select-checkbox:indeterminate:after,html[data-bs-theme=dark] table.dataTable input.dt-select-checkbox:indeterminate:after{background-color:#fff}@media screen and (max-width: 640px){div.dt-container span.select-info,div.dt-container span.select-item{margin-left:0;display:block}}div.dt-container{max-width:100%}div.dt-layout-table>div{overflow:auto;max-width:100%}
</style>
<div style="vertical-align:middle; text-align:left">
<script>
window._datatables_src_for_itables_2_2_3 = "data:text/javascript;base64,dmFyIHFvPU9iamVjdC5jcmVhdGU7dmFyIE5hPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgWW89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyICRvPU9iamVjdC5nZXRQcm90b3R5cGVPZixabz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBabj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbbl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KTt2YXIgT2E9KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKTt2YXIgS289KHQsZSxuLHIpPT57aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QifHx0eXBlb2YgZT09ImZ1bmN0aW9uIilmb3IobGV0IHMgb2YgWW8oZSkpIVpvLmNhbGwodCxzKSYmcyE9PW4mJk5hKHQscyx7Z2V0OigpPT5lW3NdLGVudW1lcmFibGU6IShyPVhvKGUscykpfHxyLmVudW1lcmFibGV9KTtyZXR1cm4gdH07dmFyIGllPSh0LGUsbik9PihuPXQhPW51bGw/cW8oJG8odCkpOnt9LEtvKGV8fCF0fHwhdC5fX2VzTW9kdWxlP05hKG4sImRlZmF1bHQiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITB9KTpuLHQpKTt2YXIgUmE9T2EoKEVhLHBpKT0+eyhmdW5jdGlvbih0KXt0eXBlb2YgRWE9PSJvYmplY3QiJiZ0eXBlb2YgcGk8InUiP3BpLmV4cG9ydHM9dCgpOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHQpOih0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnRoaXMpLkpTWmlwPXQoKX0pKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLHIpe2Z1bmN0aW9uIHModSxwKXtpZighblt1XSl7aWYoIWVbdV0pe3ZhciBiPXR5cGVvZiBabj09ImZ1bmN0aW9uIiYmWm47aWYoIXAmJmIpcmV0dXJuIGIodSwhMCk7aWYoaSlyZXR1cm4gaSh1LCEwKTt2YXIgZz1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIit1KyInIik7dGhyb3cgZy5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixnfXZhciBtPW5bdV09e2V4cG9ydHM6e319O2VbdV1bMF0uY2FsbChtLmV4cG9ydHMsZnVuY3Rpb24oQyl7dmFyIHk9ZVt1XVsxXVtDXTtyZXR1cm4gcyh5fHxDKX0sbSxtLmV4cG9ydHMsdCxlLG4scil9cmV0dXJuIG5bdV0uZXhwb3J0c31mb3IodmFyIGk9dHlwZW9mIFpuPT0iZnVuY3Rpb24iJiZabixvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi91dGlscyIpLHM9dCgiLi9zdXBwb3J0IiksaT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iO24uZW5jb2RlPWZ1bmN0aW9uKG8pe2Zvcih2YXIgdSxwLGIsZyxtLEMseSxUPVtdLFA9MCxjPW8ubGVuZ3RoLGw9YyxoPXIuZ2V0VHlwZU9mKG8pIT09InN0cmluZyI7UDxvLmxlbmd0aDspbD1jLVAsYj1oPyh1PW9bUCsrXSxwPVA8Yz9vW1ArK106MCxQPGM/b1tQKytdOjApOih1PW8uY2hhckNvZGVBdChQKyspLHA9UDxjP28uY2hhckNvZGVBdChQKyspOjAsUDxjP28uY2hhckNvZGVBdChQKyspOjApLGc9dT4+MixtPSgzJnUpPDw0fHA+PjQsQz0xPGw/KDE1JnApPDwyfGI+PjY6NjQseT0yPGw/NjMmYjo2NCxULnB1c2goaS5jaGFyQXQoZykraS5jaGFyQXQobSkraS5jaGFyQXQoQykraS5jaGFyQXQoeSkpO3JldHVybiBULmpvaW4oIiIpfSxuLmRlY29kZT1mdW5jdGlvbihvKXt2YXIgdSxwLGIsZyxtLEMseT0wLFQ9MCxQPSJkYXRhOiI7aWYoby5zdWJzdHIoMCxQLmxlbmd0aCk9PT1QKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGl0IGxvb2tzIGxpa2UgYSBkYXRhIHVybC4iKTt2YXIgYyxsPTMqKG89by5yZXBsYWNlKC9bXkEtWmEtejAtOSsvPV0vZywiIikpLmxlbmd0aC80O2lmKG8uY2hhckF0KG8ubGVuZ3RoLTEpPT09aS5jaGFyQXQoNjQpJiZsLS0sby5jaGFyQXQoby5sZW5ndGgtMik9PT1pLmNoYXJBdCg2NCkmJmwtLSxsJTEhPTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGJhc2U2NCBpbnB1dCwgYmFkIGNvbnRlbnQgbGVuZ3RoLiIpO2ZvcihjPXMudWludDhhcnJheT9uZXcgVWludDhBcnJheSgwfGwpOm5ldyBBcnJheSgwfGwpO3k8by5sZW5ndGg7KXU9aS5pbmRleE9mKG8uY2hhckF0KHkrKykpPDwyfChnPWkuaW5kZXhPZihvLmNoYXJBdCh5KyspKSk+PjQscD0oMTUmZyk8PDR8KG09aS5pbmRleE9mKG8uY2hhckF0KHkrKykpKT4+MixiPSgzJm0pPDw2fChDPWkuaW5kZXhPZihvLmNoYXJBdCh5KyspKSksY1tUKytdPXUsbSE9PTY0JiYoY1tUKytdPXApLEMhPT02NCYmKGNbVCsrXT1iKTtyZXR1cm4gY319LHsiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwyOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vZXh0ZXJuYWwiKSxzPXQoIi4vc3RyZWFtL0RhdGFXb3JrZXIiKSxpPXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxvPXQoIi4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZSIpO2Z1bmN0aW9uIHUocCxiLGcsbSxDKXt0aGlzLmNvbXByZXNzZWRTaXplPXAsdGhpcy51bmNvbXByZXNzZWRTaXplPWIsdGhpcy5jcmMzMj1nLHRoaXMuY29tcHJlc3Npb249bSx0aGlzLmNvbXByZXNzZWRDb250ZW50PUN9dS5wcm90b3R5cGU9e2dldENvbnRlbnRXb3JrZXI6ZnVuY3Rpb24oKXt2YXIgcD1uZXcgcyhyLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSkucGlwZShuZXcgbygiZGF0YV9sZW5ndGgiKSksYj10aGlzO3JldHVybiBwLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aWYodGhpcy5zdHJlYW1JbmZvLmRhdGFfbGVuZ3RoIT09Yi51bmNvbXByZXNzZWRTaXplKXRocm93IG5ldyBFcnJvcigiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaCIpfSkscH0sZ2V0Q29tcHJlc3NlZFdvcmtlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgcyhyLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkud2l0aFN0cmVhbUluZm8oImNvbXByZXNzZWRTaXplIix0aGlzLmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygidW5jb21wcmVzc2VkU2l6ZSIsdGhpcy51bmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygiY3JjMzIiLHRoaXMuY3JjMzIpLndpdGhTdHJlYW1JbmZvKCJjb21wcmVzc2lvbiIsdGhpcy5jb21wcmVzc2lvbil9fSx1LmNyZWF0ZVdvcmtlckZyb209ZnVuY3Rpb24ocCxiLGcpe3JldHVybiBwLnBpcGUobmV3IGkpLnBpcGUobmV3IG8oInVuY29tcHJlc3NlZFNpemUiKSkucGlwZShiLmNvbXByZXNzV29ya2VyKGcpKS5waXBlKG5ldyBvKCJjb21wcmVzc2VkU2l6ZSIpKS53aXRoU3RyZWFtSW5mbygiY29tcHJlc3Npb24iLGIpfSxlLmV4cG9ydHM9dX0seyIuL2V4dGVybmFsIjo2LCIuL3N0cmVhbS9DcmMzMlByb2JlIjoyNSwiLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlIjoyNiwiLi9zdHJlYW0vRGF0YVdvcmtlciI6Mjd9XSwzOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtuLlNUT1JFPXttYWdpYzoiXDBcMCIsY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoIlNUT1JFIGNvbXByZXNzaW9uIil9LHVuY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoIlNUT1JFIGRlY29tcHJlc3Npb24iKX19LG4uREVGTEFURT10KCIuL2ZsYXRlIil9LHsiLi9mbGF0ZSI6NywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6Mjh9XSw0OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vdXRpbHMiKSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBpLG89W10sdT0wO3U8MjU2O3UrKyl7aT11O2Zvcih2YXIgcD0wO3A8ODtwKyspaT0xJmk/Mzk4ODI5MjM4NF5pPj4+MTppPj4+MTtvW3VdPWl9cmV0dXJuIG99KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGksbyl7cmV0dXJuIGkhPT12b2lkIDAmJmkubGVuZ3RoP3IuZ2V0VHlwZU9mKGkpIT09InN0cmluZyI/ZnVuY3Rpb24odSxwLGIsZyl7dmFyIG09cyxDPWcrYjt1Xj0tMTtmb3IodmFyIHk9Zzt5PEM7eSsrKXU9dT4+PjhebVsyNTUmKHVecFt5XSldO3JldHVybi0xXnV9KDB8byxpLGkubGVuZ3RoLDApOmZ1bmN0aW9uKHUscCxiLGcpe3ZhciBtPXMsQz1nK2I7dV49LTE7Zm9yKHZhciB5PWc7eTxDO3krKyl1PXU+Pj44Xm1bMjU1Jih1XnAuY2hhckNvZGVBdCh5KSldO3JldHVybi0xXnV9KDB8byxpLGkubGVuZ3RoLDApOjB9fSx7Ii4vdXRpbHMiOjMyfV0sNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmJhc2U2ND0hMSxuLmJpbmFyeT0hMSxuLmRpcj0hMSxuLmNyZWF0ZUZvbGRlcnM9ITAsbi5kYXRlPW51bGwsbi5jb21wcmVzc2lvbj1udWxsLG4uY29tcHJlc3Npb25PcHRpb25zPW51bGwsbi5jb21tZW50PW51bGwsbi51bml4UGVybWlzc2lvbnM9bnVsbCxuLmRvc1Blcm1pc3Npb25zPW51bGx9LHt9XSw2OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW51bGw7cj10eXBlb2YgUHJvbWlzZTwidSI/UHJvbWlzZTp0KCJsaWUiKSxlLmV4cG9ydHM9e1Byb21pc2U6cn19LHtsaWU6Mzd9XSw3OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXR5cGVvZiBVaW50OEFycmF5PCJ1IiYmdHlwZW9mIFVpbnQxNkFycmF5PCJ1IiYmdHlwZW9mIFVpbnQzMkFycmF5PCJ1IixzPXQoInBha28iKSxpPXQoIi4vdXRpbHMiKSxvPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSx1PXI/InVpbnQ4YXJyYXkiOiJhcnJheSI7ZnVuY3Rpb24gcChiLGcpe28uY2FsbCh0aGlzLCJGbGF0ZVdvcmtlci8iK2IpLHRoaXMuX3Bha289bnVsbCx0aGlzLl9wYWtvQWN0aW9uPWIsdGhpcy5fcGFrb09wdGlvbnM9Zyx0aGlzLm1ldGE9e319bi5tYWdpYz0iXGJcMCIsaS5pbmhlcml0cyhwLG8pLHAucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihiKXt0aGlzLm1ldGE9Yi5tZXRhLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKGkudHJhbnNmb3JtVG8odSxiLmRhdGEpLCExKX0scC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtvLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKFtdLCEwKX0scC5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe28ucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLl9wYWtvPW51bGx9LHAucHJvdG90eXBlLl9jcmVhdGVQYWtvPWZ1bmN0aW9uKCl7dGhpcy5fcGFrbz1uZXcgc1t0aGlzLl9wYWtvQWN0aW9uXSh7cmF3OiEwLGxldmVsOnRoaXMuX3Bha29PcHRpb25zLmxldmVsfHwtMX0pO3ZhciBiPXRoaXM7dGhpcy5fcGFrby5vbkRhdGE9ZnVuY3Rpb24oZyl7Yi5wdXNoKHtkYXRhOmcsbWV0YTpiLm1ldGF9KX19LG4uY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBwKCJEZWZsYXRlIixiKX0sbi51bmNvbXByZXNzV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwKCJJbmZsYXRlIix7fSl9fSx7Ii4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3V0aWxzIjozMixwYWtvOjM4fV0sODpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKG0sQyl7dmFyIHksVD0iIjtmb3IoeT0wO3k8Qzt5KyspVCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmbSksbT4+Pj04O3JldHVybiBUfWZ1bmN0aW9uIHMobSxDLHksVCxQLGMpe3ZhciBsLGgsXz1tLmZpbGUsRj1tLmNvbXByZXNzaW9uLE89YyE9PXUudXRmOGVuY29kZSxmPWkudHJhbnNmb3JtVG8oInN0cmluZyIsYyhfLm5hbWUpKSxVPWkudHJhbnNmb3JtVG8oInN0cmluZyIsdS51dGY4ZW5jb2RlKF8ubmFtZSkpLFg9Xy5jb21tZW50LFE9aS50cmFuc2Zvcm1Ubygic3RyaW5nIixjKFgpKSxFPWkudHJhbnNmb3JtVG8oInN0cmluZyIsdS51dGY4ZW5jb2RlKFgpKSwkPVUubGVuZ3RoIT09Xy5uYW1lLmxlbmd0aCx3PUUubGVuZ3RoIT09WC5sZW5ndGgsaz0iIixTPSIiLEI9IiIsTD1fLmRpcixSPV8uZGF0ZSxxPXtjcmMzMjowLGNvbXByZXNzZWRTaXplOjAsdW5jb21wcmVzc2VkU2l6ZTowfTtDJiYheXx8KHEuY3JjMzI9bS5jcmMzMixxLmNvbXByZXNzZWRTaXplPW0uY29tcHJlc3NlZFNpemUscS51bmNvbXByZXNzZWRTaXplPW0udW5jb21wcmVzc2VkU2l6ZSk7dmFyIHo9MDtDJiYoenw9OCksT3x8ISQmJiF3fHwoenw9MjA0OCk7dmFyIEc9MCxudD0wO0wmJihHfD0xNiksUD09PSJVTklYIj8obnQ9Nzk4LEd8PWZ1bmN0aW9uKGV0LHd0KXt2YXIgU3Q9ZXQ7cmV0dXJuIGV0fHwoU3Q9d3Q/MTY4OTM6MzMyMDQpLCg2NTUzNSZTdCk8PDE2fShfLnVuaXhQZXJtaXNzaW9ucyxMKSk6KG50PTIwLEd8PWZ1bmN0aW9uKGV0KXtyZXR1cm4gNjMmKGV0fHwwKX0oXy5kb3NQZXJtaXNzaW9ucykpLGw9Ui5nZXRVVENIb3VycygpLGw8PD02LGx8PVIuZ2V0VVRDTWludXRlcygpLGw8PD01LGx8PVIuZ2V0VVRDU2Vjb25kcygpLzIsaD1SLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCxoPDw9NCxofD1SLmdldFVUQ01vbnRoKCkrMSxoPDw9NSxofD1SLmdldFVUQ0RhdGUoKSwkJiYoUz1yKDEsMSkrcihwKGYpLDQpK1Usays9InVwIityKFMubGVuZ3RoLDIpK1MpLHcmJihCPXIoMSwxKStyKHAoUSksNCkrRSxrKz0idWMiK3IoQi5sZW5ndGgsMikrQik7dmFyIHR0PSIiO3JldHVybiB0dCs9YApcMGAsdHQrPXIoeiwyKSx0dCs9Ri5tYWdpYyx0dCs9cihsLDIpLHR0Kz1yKGgsMiksdHQrPXIocS5jcmMzMiw0KSx0dCs9cihxLmNvbXByZXNzZWRTaXplLDQpLHR0Kz1yKHEudW5jb21wcmVzc2VkU2l6ZSw0KSx0dCs9cihmLmxlbmd0aCwyKSx0dCs9cihrLmxlbmd0aCwyKSx7ZmlsZVJlY29yZDpiLkxPQ0FMX0ZJTEVfSEVBREVSK3R0K2YrayxkaXJSZWNvcmQ6Yi5DRU5UUkFMX0ZJTEVfSEVBREVSK3IobnQsMikrdHQrcihRLmxlbmd0aCwyKSsiXDBcMFwwXDAiK3IoRyw0KStyKFQsNCkrZitrK1F9fXZhciBpPXQoIi4uL3V0aWxzIiksbz10KCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9dCgiLi4vdXRmOCIpLHA9dCgiLi4vY3JjMzIiKSxiPXQoIi4uL3NpZ25hdHVyZSIpO2Z1bmN0aW9uIGcobSxDLHksVCl7by5jYWxsKHRoaXMsIlppcEZpbGVXb3JrZXIiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD1DLHRoaXMuemlwUGxhdGZvcm09eSx0aGlzLmVuY29kZUZpbGVOYW1lPVQsdGhpcy5zdHJlYW1GaWxlcz1tLHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119aS5pbmhlcml0cyhnLG8pLGcucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24obSl7dmFyIEM9bS5tZXRhLnBlcmNlbnR8fDAseT10aGlzLmVudHJpZXNDb3VudCxUPXRoaXMuX3NvdXJjZXMubGVuZ3RoO3RoaXMuYWNjdW11bGF0ZT90aGlzLmNvbnRlbnRCdWZmZXIucHVzaChtKToodGhpcy5ieXRlc1dyaXR0ZW4rPW0uZGF0YS5sZW5ndGgsby5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMse2RhdGE6bS5kYXRhLG1ldGE6e2N1cnJlbnRGaWxlOnRoaXMuY3VycmVudEZpbGUscGVyY2VudDp5PyhDKzEwMCooeS1ULTEpKS95OjEwMH19KSl9LGcucHJvdG90eXBlLm9wZW5lZFNvdXJjZT1mdW5jdGlvbihtKXt0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQ9dGhpcy5ieXRlc1dyaXR0ZW4sdGhpcy5jdXJyZW50RmlsZT1tLmZpbGUubmFtZTt2YXIgQz10aGlzLnN0cmVhbUZpbGVzJiYhbS5maWxlLmRpcjtpZihDKXt2YXIgeT1zKG0sQywhMSx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6eS5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KX1lbHNlIHRoaXMuYWNjdW11bGF0ZT0hMH0sZy5wcm90b3R5cGUuY2xvc2VkU291cmNlPWZ1bmN0aW9uKG0pe3RoaXMuYWNjdW11bGF0ZT0hMTt2YXIgQz10aGlzLnN0cmVhbUZpbGVzJiYhbS5maWxlLmRpcix5PXMobSxDLCEwLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCx0aGlzLnppcFBsYXRmb3JtLHRoaXMuZW5jb2RlRmlsZU5hbWUpO2lmKHRoaXMuZGlyUmVjb3Jkcy5wdXNoKHkuZGlyUmVjb3JkKSxDKXRoaXMucHVzaCh7ZGF0YTpmdW5jdGlvbihUKXtyZXR1cm4gYi5EQVRBX0RFU0NSSVBUT1IrcihULmNyYzMyLDQpK3IoVC5jb21wcmVzc2VkU2l6ZSw0KStyKFQudW5jb21wcmVzc2VkU2l6ZSw0KX0obSksbWV0YTp7cGVyY2VudDoxMDB9fSk7ZWxzZSBmb3IodGhpcy5wdXNoKHtkYXRhOnkuZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSk7dGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aDspdGhpcy5wdXNoKHRoaXMuY29udGVudEJ1ZmZlci5zaGlmdCgpKTt0aGlzLmN1cnJlbnRGaWxlPW51bGx9LGcucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBtPXRoaXMuYnl0ZXNXcml0dGVuLEM9MDtDPHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGg7QysrKXRoaXMucHVzaCh7ZGF0YTp0aGlzLmRpclJlY29yZHNbQ10sbWV0YTp7cGVyY2VudDoxMDB9fSk7dmFyIHk9dGhpcy5ieXRlc1dyaXR0ZW4tbSxUPWZ1bmN0aW9uKFAsYyxsLGgsXyl7dmFyIEY9aS50cmFuc2Zvcm1Ubygic3RyaW5nIixfKGgpKTtyZXR1cm4gYi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQrIlwwXDBcMFwwIityKFAsMikrcihQLDIpK3IoYyw0KStyKGwsNCkrcihGLmxlbmd0aCwyKStGfSh0aGlzLmRpclJlY29yZHMubGVuZ3RoLHksbSx0aGlzLnppcENvbW1lbnQsdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOlQsbWV0YTp7cGVyY2VudDoxMDB9fSl9LGcucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlPWZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLl9zb3VyY2VzLnNoaWZ0KCksdGhpcy5vcGVuZWRTb3VyY2UodGhpcy5wcmV2aW91cy5zdHJlYW1JbmZvKSx0aGlzLmlzUGF1c2VkP3RoaXMucHJldmlvdXMucGF1c2UoKTp0aGlzLnByZXZpb3VzLnJlc3VtZSgpfSxnLnByb3RvdHlwZS5yZWdpc3RlclByZXZpb3VzPWZ1bmN0aW9uKG0pe3RoaXMuX3NvdXJjZXMucHVzaChtKTt2YXIgQz10aGlzO3JldHVybiBtLm9uKCJkYXRhIixmdW5jdGlvbih5KXtDLnByb2Nlc3NDaHVuayh5KX0pLG0ub24oImVuZCIsZnVuY3Rpb24oKXtDLmNsb3NlZFNvdXJjZShDLnByZXZpb3VzLnN0cmVhbUluZm8pLEMuX3NvdXJjZXMubGVuZ3RoP0MucHJlcGFyZU5leHRTb3VyY2UoKTpDLmVuZCgpfSksbS5vbigiZXJyb3IiLGZ1bmN0aW9uKHkpe0MuZXJyb3IoeSl9KSx0aGlzfSxnLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIW8ucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMucHJldmlvdXMmJnRoaXMuX3NvdXJjZXMubGVuZ3RoPyh0aGlzLnByZXBhcmVOZXh0U291cmNlKCksITApOnRoaXMucHJldmlvdXN8fHRoaXMuX3NvdXJjZXMubGVuZ3RofHx0aGlzLmdlbmVyYXRlZEVycm9yP3ZvaWQgMDoodGhpcy5lbmQoKSwhMCkpfSxnLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihtKXt2YXIgQz10aGlzLl9zb3VyY2VzO2lmKCFvLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsbSkpcmV0dXJuITE7Zm9yKHZhciB5PTA7eTxDLmxlbmd0aDt5KyspdHJ5e0NbeV0uZXJyb3IobSl9Y2F0Y2h7fXJldHVybiEwfSxnLnByb3RvdHlwZS5sb2NrPWZ1bmN0aW9uKCl7by5wcm90b3R5cGUubG9jay5jYWxsKHRoaXMpO2Zvcih2YXIgbT10aGlzLl9zb3VyY2VzLEM9MDtDPG0ubGVuZ3RoO0MrKyltW0NdLmxvY2soKX0sZS5leHBvcnRzPWd9LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4uL3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vY29tcHJlc3Npb25zIikscz10KCIuL1ppcEZpbGVXb3JrZXIiKTtuLmdlbmVyYXRlV29ya2VyPWZ1bmN0aW9uKGksbyx1KXt2YXIgcD1uZXcgcyhvLnN0cmVhbUZpbGVzLHUsby5wbGF0Zm9ybSxvLmVuY29kZUZpbGVOYW1lKSxiPTA7dHJ5e2kuZm9yRWFjaChmdW5jdGlvbihnLG0pe2IrKzt2YXIgQz1mdW5jdGlvbihjLGwpe3ZhciBoPWN8fGwsXz1yW2hdO2lmKCFfKXRocm93IG5ldyBFcnJvcihoKyIgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbWV0aG9kICEiKTtyZXR1cm4gX30obS5vcHRpb25zLmNvbXByZXNzaW9uLG8uY29tcHJlc3Npb24pLHk9bS5vcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc3x8by5jb21wcmVzc2lvbk9wdGlvbnN8fHt9LFQ9bS5kaXIsUD1tLmRhdGU7bS5fY29tcHJlc3NXb3JrZXIoQyx5KS53aXRoU3RyZWFtSW5mbygiZmlsZSIse25hbWU6ZyxkaXI6VCxkYXRlOlAsY29tbWVudDptLmNvbW1lbnR8fCIiLHVuaXhQZXJtaXNzaW9uczptLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczptLmRvc1Blcm1pc3Npb25zfSkucGlwZShwKX0pLHAuZW50cmllc0NvdW50PWJ9Y2F0Y2goZyl7cC5lcnJvcihnKX1yZXR1cm4gcH19LHsiLi4vY29tcHJlc3Npb25zIjozLCIuL1ppcEZpbGVXb3JrZXIiOjh9XSwxMDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByO2lmKGFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7dGhpcy5maWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbWVudD1udWxsLHRoaXMucm9vdD0iIix0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHM9bmV3IHI7Zm9yKHZhciBpIGluIHRoaXMpdHlwZW9mIHRoaXNbaV0hPSJmdW5jdGlvbiImJihzW2ldPXRoaXNbaV0pO3JldHVybiBzfX0oci5wcm90b3R5cGU9dCgiLi9vYmplY3QiKSkubG9hZEFzeW5jPXQoIi4vbG9hZCIpLHIuc3VwcG9ydD10KCIuL3N1cHBvcnQiKSxyLmRlZmF1bHRzPXQoIi4vZGVmYXVsdHMiKSxyLnZlcnNpb249IjMuMTAuMSIsci5sb2FkQXN5bmM9ZnVuY3Rpb24ocyxpKXtyZXR1cm4gbmV3IHIoKS5sb2FkQXN5bmMocyxpKX0sci5leHRlcm5hbD10KCIuL2V4dGVybmFsIiksZS5leHBvcnRzPXJ9LHsiLi9kZWZhdWx0cyI6NSwiLi9leHRlcm5hbCI6NiwiLi9sb2FkIjoxMSwiLi9vYmplY3QiOjE1LCIuL3N1cHBvcnQiOjMwfV0sMTE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi91dGlscyIpLHM9dCgiLi9leHRlcm5hbCIpLGk9dCgiLi91dGY4Iiksbz10KCIuL3ppcEVudHJpZXMiKSx1PXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxwPXQoIi4vbm9kZWpzVXRpbHMiKTtmdW5jdGlvbiBiKGcpe3JldHVybiBuZXcgcy5Qcm9taXNlKGZ1bmN0aW9uKG0sQyl7dmFyIHk9Zy5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IHUpO3kub24oImVycm9yIixmdW5jdGlvbihUKXtDKFQpfSkub24oImVuZCIsZnVuY3Rpb24oKXt5LnN0cmVhbUluZm8uY3JjMzIhPT1nLmRlY29tcHJlc3NlZC5jcmMzMj9DKG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCA6IENSQzMyIG1pc21hdGNoIikpOm0oKX0pLnJlc3VtZSgpfSl9ZS5leHBvcnRzPWZ1bmN0aW9uKGcsbSl7dmFyIEM9dGhpcztyZXR1cm4gbT1yLmV4dGVuZChtfHx7fSx7YmFzZTY0OiExLGNoZWNrQ1JDMzI6ITEsb3B0aW1pemVkQmluYXJ5U3RyaW5nOiExLGNyZWF0ZUZvbGRlcnM6ITEsZGVjb2RlRmlsZU5hbWU6aS51dGY4ZGVjb2RlfSkscC5pc05vZGUmJnAuaXNTdHJlYW0oZyk/cy5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS4iKSk6ci5wcmVwYXJlQ29udGVudCgidGhlIGxvYWRlZCB6aXAgZmlsZSIsZywhMCxtLm9wdGltaXplZEJpbmFyeVN0cmluZyxtLmJhc2U2NCkudGhlbihmdW5jdGlvbih5KXt2YXIgVD1uZXcgbyhtKTtyZXR1cm4gVC5sb2FkKHkpLFR9KS50aGVuKGZ1bmN0aW9uKHkpe3ZhciBUPVtzLlByb21pc2UucmVzb2x2ZSh5KV0sUD15LmZpbGVzO2lmKG0uY2hlY2tDUkMzMilmb3IodmFyIGM9MDtjPFAubGVuZ3RoO2MrKylULnB1c2goYihQW2NdKSk7cmV0dXJuIHMuUHJvbWlzZS5hbGwoVCl9KS50aGVuKGZ1bmN0aW9uKHkpe2Zvcih2YXIgVD15LnNoaWZ0KCksUD1ULmZpbGVzLGM9MDtjPFAubGVuZ3RoO2MrKyl7dmFyIGw9UFtjXSxoPWwuZmlsZU5hbWVTdHIsXz1yLnJlc29sdmUobC5maWxlTmFtZVN0cik7Qy5maWxlKF8sbC5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTpsLmRhdGUsZGlyOmwuZGlyLGNvbW1lbnQ6bC5maWxlQ29tbWVudFN0ci5sZW5ndGg/bC5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczpsLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpsLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6bS5jcmVhdGVGb2xkZXJzfSksbC5kaXJ8fChDLmZpbGUoXykudW5zYWZlT3JpZ2luYWxOYW1lPWgpfXJldHVybiBULnppcENvbW1lbnQubGVuZ3RoJiYoQy5jb21tZW50PVQuemlwQ29tbWVudCksQ30pfX0seyIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vQ3JjMzJQcm9iZSI6MjUsIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcEVudHJpZXMiOjMzfV0sMTI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIik7ZnVuY3Rpb24gaShvLHUpe3MuY2FsbCh0aGlzLCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yICIrbyksdGhpcy5fdXBzdHJlYW1FbmRlZD0hMSx0aGlzLl9iaW5kU3RyZWFtKHUpfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5fYmluZFN0cmVhbT1mdW5jdGlvbihvKXt2YXIgdT10aGlzOyh0aGlzLl9zdHJlYW09bykucGF1c2UoKSxvLm9uKCJkYXRhIixmdW5jdGlvbihwKXt1LnB1c2goe2RhdGE6cCxtZXRhOntwZXJjZW50OjB9fSl9KS5vbigiZXJyb3IiLGZ1bmN0aW9uKHApe3UuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1wOnUuZXJyb3IocCl9KS5vbigiZW5kIixmdW5jdGlvbigpe3UuaXNQYXVzZWQ/dS5fdXBzdHJlYW1FbmRlZD0hMDp1LmVuZCgpfSl9LGkucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuISFzLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpJiYodGhpcy5fc3RyZWFtLnBhdXNlKCksITApfSxpLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYodGhpcy5fdXBzdHJlYW1FbmRlZD90aGlzLmVuZCgpOnRoaXMuX3N0cmVhbS5yZXN1bWUoKSwhMCl9LGUuZXhwb3J0cz1pfSx7Ii4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRpbHMiOjMyfV0sMTM6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGU7ZnVuY3Rpb24gcyhpLG8sdSl7ci5jYWxsKHRoaXMsbyksdGhpcy5faGVscGVyPWk7dmFyIHA9dGhpcztpLm9uKCJkYXRhIixmdW5jdGlvbihiLGcpe3AucHVzaChiKXx8cC5faGVscGVyLnBhdXNlKCksdSYmdShnKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oYil7cC5lbWl0KCJlcnJvciIsYil9KS5vbigiZW5kIixmdW5jdGlvbigpe3AucHVzaChudWxsKX0pfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMocyxyKSxzLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbigpe3RoaXMuX2hlbHBlci5yZXN1bWUoKX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMTQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtpc05vZGU6dHlwZW9mIEJ1ZmZlcjwidSIsbmV3QnVmZmVyRnJvbTpmdW5jdGlvbihyLHMpe2lmKEJ1ZmZlci5mcm9tJiZCdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSlyZXR1cm4gQnVmZmVyLmZyb20ocixzKTtpZih0eXBlb2Ygcj09Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuIG5ldyBCdWZmZXIocixzKX0sYWxsb2NCdWZmZXI6ZnVuY3Rpb24ocil7aWYoQnVmZmVyLmFsbG9jKXJldHVybiBCdWZmZXIuYWxsb2Mocik7dmFyIHM9bmV3IEJ1ZmZlcihyKTtyZXR1cm4gcy5maWxsKDApLHN9LGlzQnVmZmVyOmZ1bmN0aW9uKHIpe3JldHVybiBCdWZmZXIuaXNCdWZmZXIocil9LGlzU3RyZWFtOmZ1bmN0aW9uKHIpe3JldHVybiByJiZ0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIiYmdHlwZW9mIHIucGF1c2U9PSJmdW5jdGlvbiImJnR5cGVvZiByLnJlc3VtZT09ImZ1bmN0aW9uIn19fSx7fV0sMTU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihfLEYsTyl7dmFyIGYsVT1pLmdldFR5cGVPZihGKSxYPWkuZXh0ZW5kKE98fHt9LHApO1guZGF0ZT1YLmRhdGV8fG5ldyBEYXRlLFguY29tcHJlc3Npb24hPT1udWxsJiYoWC5jb21wcmVzc2lvbj1YLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCkpLHR5cGVvZiBYLnVuaXhQZXJtaXNzaW9ucz09InN0cmluZyImJihYLnVuaXhQZXJtaXNzaW9ucz1wYXJzZUludChYLnVuaXhQZXJtaXNzaW9ucyw4KSksWC51bml4UGVybWlzc2lvbnMmJjE2Mzg0JlgudW5peFBlcm1pc3Npb25zJiYoWC5kaXI9ITApLFguZG9zUGVybWlzc2lvbnMmJjE2JlguZG9zUGVybWlzc2lvbnMmJihYLmRpcj0hMCksWC5kaXImJihfPVAoXykpLFguY3JlYXRlRm9sZGVycyYmKGY9VChfKSkmJmMuY2FsbCh0aGlzLGYsITApO3ZhciBRPVU9PT0ic3RyaW5nIiYmWC5iaW5hcnk9PT0hMSYmWC5iYXNlNjQ9PT0hMTtPJiZPLmJpbmFyeSE9PXZvaWQgMHx8KFguYmluYXJ5PSFRKSwoRiBpbnN0YW5jZW9mIGImJkYudW5jb21wcmVzc2VkU2l6ZT09PTB8fFguZGlyfHwhRnx8Ri5sZW5ndGg9PT0wKSYmKFguYmFzZTY0PSExLFguYmluYXJ5PSEwLEY9IiIsWC5jb21wcmVzc2lvbj0iU1RPUkUiLFU9InN0cmluZyIpO3ZhciBFPW51bGw7RT1GIGluc3RhbmNlb2YgYnx8RiBpbnN0YW5jZW9mIG8/RjpDLmlzTm9kZSYmQy5pc1N0cmVhbShGKT9uZXcgeShfLEYpOmkucHJlcGFyZUNvbnRlbnQoXyxGLFguYmluYXJ5LFgub3B0aW1pemVkQmluYXJ5U3RyaW5nLFguYmFzZTY0KTt2YXIgJD1uZXcgZyhfLEUsWCk7dGhpcy5maWxlc1tfXT0kfXZhciBzPXQoIi4vdXRmOCIpLGk9dCgiLi91dGlscyIpLG89dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9dCgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIikscD10KCIuL2RlZmF1bHRzIiksYj10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxnPXQoIi4vemlwT2JqZWN0IiksbT10KCIuL2dlbmVyYXRlIiksQz10KCIuL25vZGVqc1V0aWxzIikseT10KCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIiKSxUPWZ1bmN0aW9uKF8pe18uc2xpY2UoLTEpPT09Ii8iJiYoXz1fLnN1YnN0cmluZygwLF8ubGVuZ3RoLTEpKTt2YXIgRj1fLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIDA8Rj9fLnN1YnN0cmluZygwLEYpOiIifSxQPWZ1bmN0aW9uKF8pe3JldHVybiBfLnNsaWNlKC0xKSE9PSIvIiYmKF8rPSIvIiksX30sYz1mdW5jdGlvbihfLEYpe3JldHVybiBGPUYhPT12b2lkIDA/RjpwLmNyZWF0ZUZvbGRlcnMsXz1QKF8pLHRoaXMuZmlsZXNbX118fHIuY2FsbCh0aGlzLF8sbnVsbCx7ZGlyOiEwLGNyZWF0ZUZvbGRlcnM6Rn0pLHRoaXMuZmlsZXNbX119O2Z1bmN0aW9uIGwoXyl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfKT09PSJbb2JqZWN0IFJlZ0V4cF0ifXZhciBoPXtsb2FkOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSxmb3JFYWNoOmZ1bmN0aW9uKF8pe3ZhciBGLE8sZjtmb3IoRiBpbiB0aGlzLmZpbGVzKWY9dGhpcy5maWxlc1tGXSwoTz1GLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsRi5sZW5ndGgpKSYmRi5zbGljZSgwLHRoaXMucm9vdC5sZW5ndGgpPT09dGhpcy5yb290JiZfKE8sZil9LGZpbHRlcjpmdW5jdGlvbihfKXt2YXIgRj1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKE8sZil7XyhPLGYpJiZGLnB1c2goZil9KSxGfSxmaWxlOmZ1bmN0aW9uKF8sRixPKXtpZihhcmd1bWVudHMubGVuZ3RoIT09MSlyZXR1cm4gXz10aGlzLnJvb3QrXyxyLmNhbGwodGhpcyxfLEYsTyksdGhpcztpZihsKF8pKXt2YXIgZj1fO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihYLFEpe3JldHVybiFRLmRpciYmZi50ZXN0KFgpfSl9dmFyIFU9dGhpcy5maWxlc1t0aGlzLnJvb3QrX107cmV0dXJuIFUmJiFVLmRpcj9VOm51bGx9LGZvbGRlcjpmdW5jdGlvbihfKXtpZighXylyZXR1cm4gdGhpcztpZihsKF8pKXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihVLFgpe3JldHVybiBYLmRpciYmXy50ZXN0KFUpfSk7dmFyIEY9dGhpcy5yb290K18sTz1jLmNhbGwodGhpcyxGKSxmPXRoaXMuY2xvbmUoKTtyZXR1cm4gZi5yb290PU8ubmFtZSxmfSxyZW1vdmU6ZnVuY3Rpb24oXyl7Xz10aGlzLnJvb3QrXzt2YXIgRj10aGlzLmZpbGVzW19dO2lmKEZ8fChfLnNsaWNlKC0xKSE9PSIvIiYmKF8rPSIvIiksRj10aGlzLmZpbGVzW19dKSxGJiYhRi5kaXIpZGVsZXRlIHRoaXMuZmlsZXNbX107ZWxzZSBmb3IodmFyIE89dGhpcy5maWx0ZXIoZnVuY3Rpb24oVSxYKXtyZXR1cm4gWC5uYW1lLnNsaWNlKDAsXy5sZW5ndGgpPT09X30pLGY9MDtmPE8ubGVuZ3RoO2YrKylkZWxldGUgdGhpcy5maWxlc1tPW2ZdLm5hbWVdO3JldHVybiB0aGlzfSxnZW5lcmF0ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS4iKX0sZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbTpmdW5jdGlvbihfKXt2YXIgRixPPXt9O3RyeXtpZigoTz1pLmV4dGVuZChffHx7fSx7c3RyZWFtRmlsZXM6ITEsY29tcHJlc3Npb246IlNUT1JFIixjb21wcmVzc2lvbk9wdGlvbnM6bnVsbCx0eXBlOiIiLHBsYXRmb3JtOiJET1MiLGNvbW1lbnQ6bnVsbCxtaW1lVHlwZToiYXBwbGljYXRpb24vemlwIixlbmNvZGVGaWxlTmFtZTpzLnV0ZjhlbmNvZGV9KSkudHlwZT1PLnR5cGUudG9Mb3dlckNhc2UoKSxPLmNvbXByZXNzaW9uPU8uY29tcHJlc3Npb24udG9VcHBlckNhc2UoKSxPLnR5cGU9PT0iYmluYXJ5c3RyaW5nIiYmKE8udHlwZT0ic3RyaW5nIiksIU8udHlwZSl0aHJvdyBuZXcgRXJyb3IoIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC4iKTtpLmNoZWNrU3VwcG9ydChPLnR5cGUpLE8ucGxhdGZvcm0hPT0iZGFyd2luIiYmTy5wbGF0Zm9ybSE9PSJmcmVlYnNkIiYmTy5wbGF0Zm9ybSE9PSJsaW51eCImJk8ucGxhdGZvcm0hPT0ic3Vub3MifHwoTy5wbGF0Zm9ybT0iVU5JWCIpLE8ucGxhdGZvcm09PT0id2luMzIiJiYoTy5wbGF0Zm9ybT0iRE9TIik7dmFyIGY9Ty5jb21tZW50fHx0aGlzLmNvbW1lbnR8fCIiO0Y9bS5nZW5lcmF0ZVdvcmtlcih0aGlzLE8sZil9Y2F0Y2goVSl7KEY9bmV3IG8oImVycm9yIikpLmVycm9yKFUpfXJldHVybiBuZXcgdShGLE8udHlwZXx8InN0cmluZyIsTy5taW1lVHlwZSl9LGdlbmVyYXRlQXN5bmM6ZnVuY3Rpb24oXyxGKXtyZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKF8pLmFjY3VtdWxhdGUoRil9LGdlbmVyYXRlTm9kZVN0cmVhbTpmdW5jdGlvbihfLEYpe3JldHVybihfPV98fHt9KS50eXBlfHwoXy50eXBlPSJub2RlYnVmZmVyIiksdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKF8pLnRvTm9kZWpzU3RyZWFtKEYpfX07ZS5leHBvcnRzPWh9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2RlZmF1bHRzIjo1LCIuL2dlbmVyYXRlIjo5LCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIiOjEyLCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3RyZWFtL1N0cmVhbUhlbHBlciI6MjksIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcE9iamVjdCI6MzV9XSwxNjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgic3RyZWFtIil9LHtzdHJlYW06dm9pZCAwfV0sMTc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9EYXRhUmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKTtmb3IodmFyIG89MDtvPHRoaXMuZGF0YS5sZW5ndGg7bysrKWlbb109MjU1Jmlbb119dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLHIpLHMucHJvdG90eXBlLmJ5dGVBdD1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5kYXRhW3RoaXMuemVybytpXX0scy5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmU9ZnVuY3Rpb24oaSl7Zm9yKHZhciBvPWkuY2hhckNvZGVBdCgwKSx1PWkuY2hhckNvZGVBdCgxKSxwPWkuY2hhckNvZGVBdCgyKSxiPWkuY2hhckNvZGVBdCgzKSxnPXRoaXMubGVuZ3RoLTQ7MDw9ZzstLWcpaWYodGhpcy5kYXRhW2ddPT09byYmdGhpcy5kYXRhW2crMV09PT11JiZ0aGlzLmRhdGFbZysyXT09PXAmJnRoaXMuZGF0YVtnKzNdPT09YilyZXR1cm4gZy10aGlzLnplcm87cmV0dXJuLTF9LHMucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZT1mdW5jdGlvbihpKXt2YXIgbz1pLmNoYXJDb2RlQXQoMCksdT1pLmNoYXJDb2RlQXQoMSkscD1pLmNoYXJDb2RlQXQoMiksYj1pLmNoYXJDb2RlQXQoMyksZz10aGlzLnJlYWREYXRhKDQpO3JldHVybiBvPT09Z1swXSYmdT09PWdbMV0mJnA9PT1nWzJdJiZiPT09Z1szXX0scy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7aWYodGhpcy5jaGVja09mZnNldChpKSxpPT09MClyZXR1cm5bXTt2YXIgbz10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgraSk7cmV0dXJuIHRoaXMuaW5kZXgrPWksb30sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMTg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKTtmdW5jdGlvbiBzKGkpe3RoaXMuZGF0YT1pLHRoaXMubGVuZ3RoPWkubGVuZ3RoLHRoaXMuaW5kZXg9MCx0aGlzLnplcm89MH1zLnByb3RvdHlwZT17Y2hlY2tPZmZzZXQ6ZnVuY3Rpb24oaSl7dGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXgraSl9LGNoZWNrSW5kZXg6ZnVuY3Rpb24oaSl7aWYodGhpcy5sZW5ndGg8dGhpcy56ZXJvK2l8fGk8MCl0aHJvdyBuZXcgRXJyb3IoIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gIit0aGlzLmxlbmd0aCsiLCBhc2tlZCBpbmRleCA9ICIraSsiKS4gQ29ycnVwdGVkIHppcCA/Iil9LHNldEluZGV4OmZ1bmN0aW9uKGkpe3RoaXMuY2hlY2tJbmRleChpKSx0aGlzLmluZGV4PWl9LHNraXA6ZnVuY3Rpb24oaSl7dGhpcy5zZXRJbmRleCh0aGlzLmluZGV4K2kpfSxieXRlQXQ6ZnVuY3Rpb24oKXt9LHJlYWRJbnQ6ZnVuY3Rpb24oaSl7dmFyIG8sdT0wO2Zvcih0aGlzLmNoZWNrT2Zmc2V0KGkpLG89dGhpcy5pbmRleCtpLTE7bz49dGhpcy5pbmRleDtvLS0pdT0odTw8OCkrdGhpcy5ieXRlQXQobyk7cmV0dXJuIHRoaXMuaW5kZXgrPWksdX0scmVhZFN0cmluZzpmdW5jdGlvbihpKXtyZXR1cm4gci50cmFuc2Zvcm1Ubygic3RyaW5nIix0aGlzLnJlYWREYXRhKGkpKX0scmVhZERhdGE6ZnVuY3Rpb24oKXt9LGxhc3RJbmRleE9mU2lnbmF0dXJlOmZ1bmN0aW9uKCl7fSxyZWFkQW5kQ2hlY2tTaWduYXR1cmU6ZnVuY3Rpb24oKXt9LHJlYWREYXRlOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5yZWFkSW50KDQpO3JldHVybiBuZXcgRGF0ZShEYXRlLlVUQygxOTgwKyhpPj4yNSYxMjcpLChpPj4yMSYxNSktMSxpPj4xNiYzMSxpPj4xMSYzMSxpPj41JjYzLCgzMSZpKTw8MSkpfX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyfV0sMTk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9VaW50OEFycmF5UmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7dGhpcy5jaGVja09mZnNldChpKTt2YXIgbz10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgraSk7cmV0dXJuIHRoaXMuaW5kZXgrPWksb30sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL1VpbnQ4QXJyYXlSZWFkZXIiOjIxfV0sMjA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9EYXRhUmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUuYnl0ZUF0PWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnplcm8raSl9LHMucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2YoaSktdGhpcy56ZXJvfSxzLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmU9ZnVuY3Rpb24oaSl7cmV0dXJuIGk9PT10aGlzLnJlYWREYXRhKDQpfSxzLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihpKXt0aGlzLmNoZWNrT2Zmc2V0KGkpO3ZhciBvPXRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCtpKTtyZXR1cm4gdGhpcy5pbmRleCs9aSxvfSxlLmV4cG9ydHM9c30seyIuLi91dGlscyI6MzIsIi4vRGF0YVJlYWRlciI6MTh9XSwyMTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0FycmF5UmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7aWYodGhpcy5jaGVja09mZnNldChpKSxpPT09MClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7dmFyIG89dGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2kpO3JldHVybiB0aGlzLmluZGV4Kz1pLG99LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMiwiLi9BcnJheVJlYWRlciI6MTd9XSwyMjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuLi91dGlscyIpLHM9dCgiLi4vc3VwcG9ydCIpLGk9dCgiLi9BcnJheVJlYWRlciIpLG89dCgiLi9TdHJpbmdSZWFkZXIiKSx1PXQoIi4vTm9kZUJ1ZmZlclJlYWRlciIpLHA9dCgiLi9VaW50OEFycmF5UmVhZGVyIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGIpe3ZhciBnPXIuZ2V0VHlwZU9mKGIpO3JldHVybiByLmNoZWNrU3VwcG9ydChnKSxnIT09InN0cmluZyJ8fHMudWludDhhcnJheT9nPT09Im5vZGVidWZmZXIiP25ldyB1KGIpOnMudWludDhhcnJheT9uZXcgcChyLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5IixiKSk6bmV3IGkoci50cmFuc2Zvcm1UbygiYXJyYXkiLGIpKTpuZXcgbyhiKX19LHsiLi4vc3VwcG9ydCI6MzAsIi4uL3V0aWxzIjozMiwiLi9BcnJheVJlYWRlciI6MTcsIi4vTm9kZUJ1ZmZlclJlYWRlciI6MTksIi4vU3RyaW5nUmVhZGVyIjoyMCwiLi9VaW50OEFycmF5UmVhZGVyIjoyMX1dLDIzOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uTE9DQUxfRklMRV9IRUFERVI9IlBLAwQiLG4uQ0VOVFJBTF9GSUxFX0hFQURFUj0iUEsBAiIsbi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9IlBLBQYiLG4uWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUj0iUEsGXHgwNyIsbi5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9IlBLBgYiLG4uREFUQV9ERVNDUklQVE9SPSJQS1x4MDdcYiJ9LHt9XSwyNDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0dlbmVyaWNXb3JrZXIiKSxzPXQoIi4uL3V0aWxzIik7ZnVuY3Rpb24gaShvKXtyLmNhbGwodGhpcywiQ29udmVydFdvcmtlciB0byAiK28pLHRoaXMuZGVzdFR5cGU9b31zLmluaGVyaXRzKGksciksaS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKG8pe3RoaXMucHVzaCh7ZGF0YTpzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsby5kYXRhKSxtZXRhOm8ubWV0YX0pfSxlLmV4cG9ydHM9aX0seyIuLi91dGlscyI6MzIsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwyNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0dlbmVyaWNXb3JrZXIiKSxzPXQoIi4uL2NyYzMyIik7ZnVuY3Rpb24gaSgpe3IuY2FsbCh0aGlzLCJDcmMzMlByb2JlIiksdGhpcy53aXRoU3RyZWFtSW5mbygiY3JjMzIiLDApfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMoaSxyKSxpLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24obyl7dGhpcy5zdHJlYW1JbmZvLmNyYzMyPXMoby5kYXRhLHRoaXMuc3RyZWFtSW5mby5jcmMzMnx8MCksdGhpcy5wdXNoKG8pfSxlLmV4cG9ydHM9aX0seyIuLi9jcmMzMiI6NCwiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vR2VuZXJpY1dvcmtlciIpO2Z1bmN0aW9uIGkobyl7cy5jYWxsKHRoaXMsIkRhdGFMZW5ndGhQcm9iZSBmb3IgIitvKSx0aGlzLnByb3BOYW1lPW8sdGhpcy53aXRoU3RyZWFtSW5mbyhvLDApfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24obyl7aWYobyl7dmFyIHU9dGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdfHwwO3RoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXT11K28uZGF0YS5sZW5ndGh9cy5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcyxvKX0sZS5leHBvcnRzPWl9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vR2VuZXJpY1dvcmtlciIpO2Z1bmN0aW9uIGkobyl7cy5jYWxsKHRoaXMsIkRhdGFXb3JrZXIiKTt2YXIgdT10aGlzO3RoaXMuZGF0YUlzUmVhZHk9ITEsdGhpcy5pbmRleD0wLHRoaXMubWF4PTAsdGhpcy5kYXRhPW51bGwsdGhpcy50eXBlPSIiLHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsby50aGVuKGZ1bmN0aW9uKHApe3UuZGF0YUlzUmVhZHk9ITAsdS5kYXRhPXAsdS5tYXg9cCYmcC5sZW5ndGh8fDAsdS50eXBlPXIuZ2V0VHlwZU9mKHApLHUuaXNQYXVzZWR8fHUuX3RpY2tBbmRSZXBlYXQoKX0sZnVuY3Rpb24ocCl7dS5lcnJvcihwKX0pfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5jbGVhblVwPWZ1bmN0aW9uKCl7cy5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpLHRoaXMuZGF0YT1udWxsfSxpLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMuX3RpY2tTY2hlZHVsZWQmJnRoaXMuZGF0YUlzUmVhZHkmJih0aGlzLl90aWNrU2NoZWR1bGVkPSEwLHIuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSksITApfSxpLnByb3RvdHlwZS5fdGlja0FuZFJlcGVhdD1mdW5jdGlvbigpe3RoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsdGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkfHwodGhpcy5fdGljaygpLHRoaXMuaXNGaW5pc2hlZHx8KHIuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSx0aGlzLl90aWNrU2NoZWR1bGVkPSEwKSl9LGkucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3ZhciBvPW51bGwsdT1NYXRoLm1pbih0aGlzLm1heCx0aGlzLmluZGV4KzE2Mzg0KTtpZih0aGlzLmluZGV4Pj10aGlzLm1heClyZXR1cm4gdGhpcy5lbmQoKTtzd2l0Y2godGhpcy50eXBlKXtjYXNlInN0cmluZyI6bz10aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsdSk7YnJlYWs7Y2FzZSJ1aW50OGFycmF5IjpvPXRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LHUpO2JyZWFrO2Nhc2UiYXJyYXkiOmNhc2Uibm9kZWJ1ZmZlciI6bz10aGlzLmRhdGEuc2xpY2UodGhpcy5pbmRleCx1KX1yZXR1cm4gdGhpcy5pbmRleD11LHRoaXMucHVzaCh7ZGF0YTpvLG1ldGE6e3BlcmNlbnQ6dGhpcy5tYXg/dGhpcy5pbmRleC90aGlzLm1heCoxMDA6MH19KX0sZS5leHBvcnRzPWl9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihzKXt0aGlzLm5hbWU9c3x8ImRlZmF1bHQiLHRoaXMuc3RyZWFtSW5mbz17fSx0aGlzLmdlbmVyYXRlZEVycm9yPW51bGwsdGhpcy5leHRyYVN0cmVhbUluZm89e30sdGhpcy5pc1BhdXNlZD0hMCx0aGlzLmlzRmluaXNoZWQ9ITEsdGhpcy5pc0xvY2tlZD0hMSx0aGlzLl9saXN0ZW5lcnM9e2RhdGE6W10sZW5kOltdLGVycm9yOltdfSx0aGlzLnByZXZpb3VzPW51bGx9ci5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24ocyl7dGhpcy5lbWl0KCJkYXRhIixzKX0sZW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3RoaXMuZmx1c2goKTt0cnl7dGhpcy5lbWl0KCJlbmQiKSx0aGlzLmNsZWFuVXAoKSx0aGlzLmlzRmluaXNoZWQ9ITB9Y2F0Y2gocyl7dGhpcy5lbWl0KCJlcnJvciIscyl9cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKHMpe3JldHVybiF0aGlzLmlzRmluaXNoZWQmJih0aGlzLmlzUGF1c2VkP3RoaXMuZ2VuZXJhdGVkRXJyb3I9czoodGhpcy5pc0ZpbmlzaGVkPSEwLHRoaXMuZW1pdCgiZXJyb3IiLHMpLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMuZXJyb3IocyksdGhpcy5jbGVhblVwKCkpLCEwKX0sb246ZnVuY3Rpb24ocyxpKXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzW3NdLnB1c2goaSksdGhpc30sY2xlYW5VcDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtSW5mbz10aGlzLmdlbmVyYXRlZEVycm9yPXRoaXMuZXh0cmFTdHJlYW1JbmZvPW51bGwsdGhpcy5fbGlzdGVuZXJzPVtdfSxlbWl0OmZ1bmN0aW9uKHMsaSl7aWYodGhpcy5fbGlzdGVuZXJzW3NdKWZvcih2YXIgbz0wO288dGhpcy5fbGlzdGVuZXJzW3NdLmxlbmd0aDtvKyspdGhpcy5fbGlzdGVuZXJzW3NdW29dLmNhbGwodGhpcyxpKX0scGlwZTpmdW5jdGlvbihzKXtyZXR1cm4gcy5yZWdpc3RlclByZXZpb3VzKHRoaXMpfSxyZWdpc3RlclByZXZpb3VzOmZ1bmN0aW9uKHMpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciK3RoaXMrIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIpO3RoaXMuc3RyZWFtSW5mbz1zLnN0cmVhbUluZm8sdGhpcy5tZXJnZVN0cmVhbUluZm8oKSx0aGlzLnByZXZpb3VzPXM7dmFyIGk9dGhpcztyZXR1cm4gcy5vbigiZGF0YSIsZnVuY3Rpb24obyl7aS5wcm9jZXNzQ2h1bmsobyl9KSxzLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aS5lbmQoKX0pLHMub24oImVycm9yIixmdW5jdGlvbihvKXtpLmVycm9yKG8pfSksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc1BhdXNlZCYmIXRoaXMuaXNGaW5pc2hlZCYmKHRoaXMuaXNQYXVzZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5wYXVzZSgpLCEwKX0scmVzdW1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNQYXVzZWR8fHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt2YXIgcz10aGlzLmlzUGF1c2VkPSExO3JldHVybiB0aGlzLmdlbmVyYXRlZEVycm9yJiYodGhpcy5lcnJvcih0aGlzLmdlbmVyYXRlZEVycm9yKSxzPSEwKSx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLnJlc3VtZSgpLCFzfSxmbHVzaDpmdW5jdGlvbigpe30scHJvY2Vzc0NodW5rOmZ1bmN0aW9uKHMpe3RoaXMucHVzaChzKX0sd2l0aFN0cmVhbUluZm86ZnVuY3Rpb24ocyxpKXtyZXR1cm4gdGhpcy5leHRyYVN0cmVhbUluZm9bc109aSx0aGlzLm1lcmdlU3RyZWFtSW5mbygpLHRoaXN9LG1lcmdlU3RyZWFtSW5mbzpmdW5jdGlvbigpe2Zvcih2YXIgcyBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5leHRyYVN0cmVhbUluZm8scykmJih0aGlzLnN0cmVhbUluZm9bc109dGhpcy5leHRyYVN0cmVhbUluZm9bc10pfSxsb2NrOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0xvY2tlZCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzdHJlYW0gJyIrdGhpcysiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuIik7dGhpcy5pc0xvY2tlZD0hMCx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLmxvY2soKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgcz0iV29ya2VyICIrdGhpcy5uYW1lO3JldHVybiB0aGlzLnByZXZpb3VzP3RoaXMucHJldmlvdXMrIiAtPiAiK3M6c319LGUuZXhwb3J0cz1yfSx7fV0sMjk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vQ29udmVydFdvcmtlciIpLGk9dCgiLi9HZW5lcmljV29ya2VyIiksbz10KCIuLi9iYXNlNjQiKSx1PXQoIi4uL3N1cHBvcnQiKSxwPXQoIi4uL2V4dGVybmFsIiksYj1udWxsO2lmKHUubm9kZXN0cmVhbSl0cnl7Yj10KCIuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciIpfWNhdGNoe31mdW5jdGlvbiBnKEMseSl7cmV0dXJuIG5ldyBwLlByb21pc2UoZnVuY3Rpb24oVCxQKXt2YXIgYz1bXSxsPUMuX2ludGVybmFsVHlwZSxoPUMuX291dHB1dFR5cGUsXz1DLl9taW1lVHlwZTtDLm9uKCJkYXRhIixmdW5jdGlvbihGLE8pe2MucHVzaChGKSx5JiZ5KE8pfSkub24oImVycm9yIixmdW5jdGlvbihGKXtjPVtdLFAoRil9KS5vbigiZW5kIixmdW5jdGlvbigpe3RyeXt2YXIgRj1mdW5jdGlvbihPLGYsVSl7c3dpdGNoKE8pe2Nhc2UiYmxvYiI6cmV0dXJuIHIubmV3QmxvYihyLnRyYW5zZm9ybVRvKCJhcnJheWJ1ZmZlciIsZiksVSk7Y2FzZSJiYXNlNjQiOnJldHVybiBvLmVuY29kZShmKTtkZWZhdWx0OnJldHVybiByLnRyYW5zZm9ybVRvKE8sZil9fShoLGZ1bmN0aW9uKE8sZil7dmFyIFUsWD0wLFE9bnVsbCxFPTA7Zm9yKFU9MDtVPGYubGVuZ3RoO1UrKylFKz1mW1VdLmxlbmd0aDtzd2l0Y2goTyl7Y2FzZSJzdHJpbmciOnJldHVybiBmLmpvaW4oIiIpO2Nhc2UiYXJyYXkiOnJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGYpO2Nhc2UidWludDhhcnJheSI6Zm9yKFE9bmV3IFVpbnQ4QXJyYXkoRSksVT0wO1U8Zi5sZW5ndGg7VSsrKVEuc2V0KGZbVV0sWCksWCs9ZltVXS5sZW5ndGg7cmV0dXJuIFE7Y2FzZSJub2RlYnVmZmVyIjpyZXR1cm4gQnVmZmVyLmNvbmNhdChmKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnIitPKyInIil9fShsLGMpLF8pO1QoRil9Y2F0Y2goTyl7UChPKX1jPVtdfSkucmVzdW1lKCl9KX1mdW5jdGlvbiBtKEMseSxUKXt2YXIgUD15O3N3aXRjaCh5KXtjYXNlImJsb2IiOmNhc2UiYXJyYXlidWZmZXIiOlA9InVpbnQ4YXJyYXkiO2JyZWFrO2Nhc2UiYmFzZTY0IjpQPSJzdHJpbmcifXRyeXt0aGlzLl9pbnRlcm5hbFR5cGU9UCx0aGlzLl9vdXRwdXRUeXBlPXksdGhpcy5fbWltZVR5cGU9VCxyLmNoZWNrU3VwcG9ydChQKSx0aGlzLl93b3JrZXI9Qy5waXBlKG5ldyBzKFApKSxDLmxvY2soKX1jYXRjaChjKXt0aGlzLl93b3JrZXI9bmV3IGkoImVycm9yIiksdGhpcy5fd29ya2VyLmVycm9yKGMpfX1tLnByb3RvdHlwZT17YWNjdW11bGF0ZTpmdW5jdGlvbihDKXtyZXR1cm4gZyh0aGlzLEMpfSxvbjpmdW5jdGlvbihDLHkpe3ZhciBUPXRoaXM7cmV0dXJuIEM9PT0iZGF0YSI/dGhpcy5fd29ya2VyLm9uKEMsZnVuY3Rpb24oUCl7eS5jYWxsKFQsUC5kYXRhLFAubWV0YSl9KTp0aGlzLl93b3JrZXIub24oQyxmdW5jdGlvbigpe3IuZGVsYXkoeSxhcmd1bWVudHMsVCl9KSx0aGlzfSxyZXN1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLFtdLHRoaXMuX3dvcmtlciksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd29ya2VyLnBhdXNlKCksdGhpc30sdG9Ob2RlanNTdHJlYW06ZnVuY3Rpb24oQyl7aWYoci5jaGVja1N1cHBvcnQoIm5vZGVzdHJlYW0iKSx0aGlzLl9vdXRwdXRUeXBlIT09Im5vZGVidWZmZXIiKXRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRUeXBlKyIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZCIpO3JldHVybiBuZXcgYih0aGlzLHtvYmplY3RNb2RlOnRoaXMuX291dHB1dFR5cGUhPT0ibm9kZWJ1ZmZlciJ9LEMpfX0sZS5leHBvcnRzPW19LHsiLi4vYmFzZTY0IjoxLCIuLi9leHRlcm5hbCI6NiwiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiOjEzLCIuLi9zdXBwb3J0IjozMCwiLi4vdXRpbHMiOjMyLCIuL0NvbnZlcnRXb3JrZXIiOjI0LCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMzA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7aWYobi5iYXNlNjQ9ITAsbi5hcnJheT0hMCxuLnN0cmluZz0hMCxuLmFycmF5YnVmZmVyPXR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJnR5cGVvZiBVaW50OEFycmF5PCJ1IixuLm5vZGVidWZmZXI9dHlwZW9mIEJ1ZmZlcjwidSIsbi51aW50OGFycmF5PXR5cGVvZiBVaW50OEFycmF5PCJ1Iix0eXBlb2YgQXJyYXlCdWZmZXI+InUiKW4uYmxvYj0hMTtlbHNle3ZhciByPW5ldyBBcnJheUJ1ZmZlcigwKTt0cnl7bi5ibG9iPW5ldyBCbG9iKFtyXSx7dHlwZToiYXBwbGljYXRpb24vemlwIn0pLnNpemU9PT0wfWNhdGNoe3RyeXt2YXIgcz1uZXcoc2VsZi5CbG9iQnVpbGRlcnx8c2VsZi5XZWJLaXRCbG9iQnVpbGRlcnx8c2VsZi5Nb3pCbG9iQnVpbGRlcnx8c2VsZi5NU0Jsb2JCdWlsZGVyKTtzLmFwcGVuZChyKSxuLmJsb2I9cy5nZXRCbG9iKCJhcHBsaWNhdGlvbi96aXAiKS5zaXplPT09MH1jYXRjaHtuLmJsb2I9ITF9fX10cnl7bi5ub2Rlc3RyZWFtPSEhdCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGV9Y2F0Y2h7bi5ub2Rlc3RyZWFtPSExfX0seyJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMzE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7Zm9yKHZhciByPXQoIi4vdXRpbHMiKSxzPXQoIi4vc3VwcG9ydCIpLGk9dCgiLi9ub2RlanNVdGlscyIpLG89dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9bmV3IEFycmF5KDI1NikscD0wO3A8MjU2O3ArKyl1W3BdPTI1Mjw9cD82OjI0ODw9cD81OjI0MDw9cD80OjIyNDw9cD8zOjE5Mjw9cD8yOjE7dVsyNTRdPXVbMjU0XT0xO2Z1bmN0aW9uIGIoKXtvLmNhbGwodGhpcywidXRmLTggZGVjb2RlIiksdGhpcy5sZWZ0T3Zlcj1udWxsfWZ1bmN0aW9uIGcoKXtvLmNhbGwodGhpcywidXRmLTggZW5jb2RlIil9bi51dGY4ZW5jb2RlPWZ1bmN0aW9uKG0pe3JldHVybiBzLm5vZGVidWZmZXI/aS5uZXdCdWZmZXJGcm9tKG0sInV0Zi04Iik6ZnVuY3Rpb24oQyl7dmFyIHksVCxQLGMsbCxoPUMubGVuZ3RoLF89MDtmb3IoYz0wO2M8aDtjKyspKDY0NTEyJihUPUMuY2hhckNvZGVBdChjKSkpPT01NTI5NiYmYysxPGgmJig2NDUxMiYoUD1DLmNoYXJDb2RlQXQoYysxKSkpPT01NjMyMCYmKFQ9NjU1MzYrKFQtNTUyOTY8PDEwKSsoUC01NjMyMCksYysrKSxfKz1UPDEyOD8xOlQ8MjA0OD8yOlQ8NjU1MzY/Mzo0O2Zvcih5PXMudWludDhhcnJheT9uZXcgVWludDhBcnJheShfKTpuZXcgQXJyYXkoXyksYz1sPTA7bDxfO2MrKykoNjQ1MTImKFQ9Qy5jaGFyQ29kZUF0KGMpKSk9PTU1Mjk2JiZjKzE8aCYmKDY0NTEyJihQPUMuY2hhckNvZGVBdChjKzEpKSk9PTU2MzIwJiYoVD02NTUzNisoVC01NTI5Njw8MTApKyhQLTU2MzIwKSxjKyspLFQ8MTI4P3lbbCsrXT1UOihUPDIwNDg/eVtsKytdPTE5MnxUPj4+NjooVDw2NTUzNj95W2wrK109MjI0fFQ+Pj4xMjooeVtsKytdPTI0MHxUPj4+MTgseVtsKytdPTEyOHxUPj4+MTImNjMpLHlbbCsrXT0xMjh8VD4+PjYmNjMpLHlbbCsrXT0xMjh8NjMmVCk7cmV0dXJuIHl9KG0pfSxuLnV0ZjhkZWNvZGU9ZnVuY3Rpb24obSl7cmV0dXJuIHMubm9kZWJ1ZmZlcj9yLnRyYW5zZm9ybVRvKCJub2RlYnVmZmVyIixtKS50b1N0cmluZygidXRmLTgiKTpmdW5jdGlvbihDKXt2YXIgeSxULFAsYyxsPUMubGVuZ3RoLGg9bmV3IEFycmF5KDIqbCk7Zm9yKHk9VD0wO3k8bDspaWYoKFA9Q1t5KytdKTwxMjgpaFtUKytdPVA7ZWxzZSBpZig0PChjPXVbUF0pKWhbVCsrXT02NTUzMyx5Kz1jLTE7ZWxzZXtmb3IoUCY9Yz09PTI/MzE6Yz09PTM/MTU6NzsxPGMmJnk8bDspUD1QPDw2fDYzJkNbeSsrXSxjLS07MTxjP2hbVCsrXT02NTUzMzpQPDY1NTM2P2hbVCsrXT1QOihQLT02NTUzNixoW1QrK109NTUyOTZ8UD4+MTAmMTAyMyxoW1QrK109NTYzMjB8MTAyMyZQKX1yZXR1cm4gaC5sZW5ndGghPT1UJiYoaC5zdWJhcnJheT9oPWguc3ViYXJyYXkoMCxUKTpoLmxlbmd0aD1UKSxyLmFwcGx5RnJvbUNoYXJDb2RlKGgpfShtPXIudHJhbnNmb3JtVG8ocy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLG0pKX0sci5pbmhlcml0cyhiLG8pLGIucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihtKXt2YXIgQz1yLnRyYW5zZm9ybVRvKHMudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixtLmRhdGEpO2lmKHRoaXMubGVmdE92ZXImJnRoaXMubGVmdE92ZXIubGVuZ3RoKXtpZihzLnVpbnQ4YXJyYXkpe3ZhciB5PUM7KEM9bmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgrdGhpcy5sZWZ0T3Zlci5sZW5ndGgpKS5zZXQodGhpcy5sZWZ0T3ZlciwwKSxDLnNldCh5LHRoaXMubGVmdE92ZXIubGVuZ3RoKX1lbHNlIEM9dGhpcy5sZWZ0T3Zlci5jb25jYXQoQyk7dGhpcy5sZWZ0T3Zlcj1udWxsfXZhciBUPWZ1bmN0aW9uKGMsbCl7dmFyIGg7Zm9yKChsPWx8fGMubGVuZ3RoKT5jLmxlbmd0aCYmKGw9Yy5sZW5ndGgpLGg9bC0xOzA8PWgmJigxOTImY1toXSk9PTEyODspaC0tO3JldHVybiBoPDB8fGg9PT0wP2w6aCt1W2NbaF1dPmw/aDpsfShDKSxQPUM7VCE9PUMubGVuZ3RoJiYocy51aW50OGFycmF5PyhQPUMuc3ViYXJyYXkoMCxUKSx0aGlzLmxlZnRPdmVyPUMuc3ViYXJyYXkoVCxDLmxlbmd0aCkpOihQPUMuc2xpY2UoMCxUKSx0aGlzLmxlZnRPdmVyPUMuc2xpY2UoVCxDLmxlbmd0aCkpKSx0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKFApLG1ldGE6bS5tZXRhfSl9LGIucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7dGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgmJih0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLG1ldGE6e319KSx0aGlzLmxlZnRPdmVyPW51bGwpfSxuLlV0ZjhEZWNvZGVXb3JrZXI9YixyLmluaGVyaXRzKGcsbyksZy5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKG0pe3RoaXMucHVzaCh7ZGF0YTpuLnV0ZjhlbmNvZGUobS5kYXRhKSxtZXRhOm0ubWV0YX0pfSxuLlV0ZjhFbmNvZGVXb3JrZXI9Z30seyIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3VwcG9ydCI6MzAsIi4vdXRpbHMiOjMyfV0sMzI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9zdXBwb3J0Iikscz10KCIuL2Jhc2U2NCIpLGk9dCgiLi9ub2RlanNVdGlscyIpLG89dCgiLi9leHRlcm5hbCIpO2Z1bmN0aW9uIHUoeSl7cmV0dXJuIHl9ZnVuY3Rpb24gcCh5LFQpe2Zvcih2YXIgUD0wO1A8eS5sZW5ndGg7KytQKVRbUF09MjU1JnkuY2hhckNvZGVBdChQKTtyZXR1cm4gVH10KCJzZXRpbW1lZGlhdGUiKSxuLm5ld0Jsb2I9ZnVuY3Rpb24oeSxUKXtuLmNoZWNrU3VwcG9ydCgiYmxvYiIpO3RyeXtyZXR1cm4gbmV3IEJsb2IoW3ldLHt0eXBlOlR9KX1jYXRjaHt0cnl7dmFyIFA9bmV3KHNlbGYuQmxvYkJ1aWxkZXJ8fHNlbGYuV2ViS2l0QmxvYkJ1aWxkZXJ8fHNlbGYuTW96QmxvYkJ1aWxkZXJ8fHNlbGYuTVNCbG9iQnVpbGRlcik7cmV0dXJuIFAuYXBwZW5kKHkpLFAuZ2V0QmxvYihUKX1jYXRjaHt0aHJvdyBuZXcgRXJyb3IoIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi4iKX19fTt2YXIgYj17c3RyaW5naWZ5QnlDaHVuazpmdW5jdGlvbih5LFQsUCl7dmFyIGM9W10sbD0wLGg9eS5sZW5ndGg7aWYoaDw9UClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHkpO2Zvcig7bDxoOylUPT09ImFycmF5Inx8VD09PSJub2RlYnVmZmVyIj9jLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHkuc2xpY2UobCxNYXRoLm1pbihsK1AsaCkpKSk6Yy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCx5LnN1YmFycmF5KGwsTWF0aC5taW4obCtQLGgpKSkpLGwrPVA7cmV0dXJuIGMuam9pbigiIil9LHN0cmluZ2lmeUJ5Q2hhcjpmdW5jdGlvbih5KXtmb3IodmFyIFQ9IiIsUD0wO1A8eS5sZW5ndGg7UCsrKVQrPVN0cmluZy5mcm9tQ2hhckNvZGUoeVtQXSk7cmV0dXJuIFR9LGFwcGx5Q2FuQmVVc2VkOnt1aW50OGFycmF5OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiByLnVpbnQ4YXJyYXkmJlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoPT09MX1jYXRjaHtyZXR1cm4hMX19KCksbm9kZWJ1ZmZlcjpmdW5jdGlvbigpe3RyeXtyZXR1cm4gci5ub2RlYnVmZmVyJiZTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsaS5hbGxvY0J1ZmZlcigxKSkubGVuZ3RoPT09MX1jYXRjaHtyZXR1cm4hMX19KCl9fTtmdW5jdGlvbiBnKHkpe3ZhciBUPTY1NTM2LFA9bi5nZXRUeXBlT2YoeSksYz0hMDtpZihQPT09InVpbnQ4YXJyYXkiP2M9Yi5hcHBseUNhbkJlVXNlZC51aW50OGFycmF5OlA9PT0ibm9kZWJ1ZmZlciImJihjPWIuYXBwbHlDYW5CZVVzZWQubm9kZWJ1ZmZlciksYylmb3IoOzE8VDspdHJ5e3JldHVybiBiLnN0cmluZ2lmeUJ5Q2h1bmsoeSxQLFQpfWNhdGNoe1Q9TWF0aC5mbG9vcihULzIpfXJldHVybiBiLnN0cmluZ2lmeUJ5Q2hhcih5KX1mdW5jdGlvbiBtKHksVCl7Zm9yKHZhciBQPTA7UDx5Lmxlbmd0aDtQKyspVFtQXT15W1BdO3JldHVybiBUfW4uYXBwbHlGcm9tQ2hhckNvZGU9Zzt2YXIgQz17fTtDLnN0cmluZz17c3RyaW5nOnUsYXJyYXk6ZnVuY3Rpb24oeSl7cmV0dXJuIHAoeSxuZXcgQXJyYXkoeS5sZW5ndGgpKX0sYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIEMuc3RyaW5nLnVpbnQ4YXJyYXkoeSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBwKHksbmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gcCh5LGkuYWxsb2NCdWZmZXIoeS5sZW5ndGgpKX19LEMuYXJyYXk9e3N0cmluZzpnLGFycmF5OnUsYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHkpLmJ1ZmZlcn0sdWludDhhcnJheTpmdW5jdGlvbih5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeSl9LG5vZGVidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIGkubmV3QnVmZmVyRnJvbSh5KX19LEMuYXJyYXlidWZmZXI9e3N0cmluZzpmdW5jdGlvbih5KXtyZXR1cm4gZyhuZXcgVWludDhBcnJheSh5KSl9LGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBtKG5ldyBVaW50OEFycmF5KHkpLG5ldyBBcnJheSh5LmJ5dGVMZW5ndGgpKX0sYXJyYXlidWZmZXI6dSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBuZXcgVWludDhBcnJheSh5KX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gaS5uZXdCdWZmZXJGcm9tKG5ldyBVaW50OEFycmF5KHkpKX19LEMudWludDhhcnJheT17c3RyaW5nOmcsYXJyYXk6ZnVuY3Rpb24oeSl7cmV0dXJuIG0oeSxuZXcgQXJyYXkoeS5sZW5ndGgpKX0sYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIHkuYnVmZmVyfSx1aW50OGFycmF5OnUsbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gaS5uZXdCdWZmZXJGcm9tKHkpfX0sQy5ub2RlYnVmZmVyPXtzdHJpbmc6ZyxhcnJheTpmdW5jdGlvbih5KXtyZXR1cm4gbSh5LG5ldyBBcnJheSh5Lmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gQy5ub2RlYnVmZmVyLnVpbnQ4YXJyYXkoeSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBtKHksbmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKX0sbm9kZWJ1ZmZlcjp1fSxuLnRyYW5zZm9ybVRvPWZ1bmN0aW9uKHksVCl7aWYoVD1UfHwiIiwheSlyZXR1cm4gVDtuLmNoZWNrU3VwcG9ydCh5KTt2YXIgUD1uLmdldFR5cGVPZihUKTtyZXR1cm4gQ1tQXVt5XShUKX0sbi5yZXNvbHZlPWZ1bmN0aW9uKHkpe2Zvcih2YXIgVD15LnNwbGl0KCIvIiksUD1bXSxjPTA7YzxULmxlbmd0aDtjKyspe3ZhciBsPVRbY107bD09PSIuInx8bD09PSIiJiZjIT09MCYmYyE9PVQubGVuZ3RoLTF8fChsPT09Ii4uIj9QLnBvcCgpOlAucHVzaChsKSl9cmV0dXJuIFAuam9pbigiLyIpfSxuLmdldFR5cGVPZj1mdW5jdGlvbih5KXtyZXR1cm4gdHlwZW9mIHk9PSJzdHJpbmciPyJzdHJpbmciOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5XSI/ImFycmF5IjpyLm5vZGVidWZmZXImJmkuaXNCdWZmZXIoeSk/Im5vZGVidWZmZXIiOnIudWludDhhcnJheSYmeSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/InVpbnQ4YXJyYXkiOnIuYXJyYXlidWZmZXImJnkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj8iYXJyYXlidWZmZXIiOnZvaWQgMH0sbi5jaGVja1N1cHBvcnQ9ZnVuY3Rpb24oeSl7aWYoIXJbeS50b0xvd2VyQ2FzZSgpXSl0aHJvdyBuZXcgRXJyb3IoeSsiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybSIpfSxuLk1BWF9WQUxVRV8xNkJJVFM9NjU1MzUsbi5NQVhfVkFMVUVfMzJCSVRTPS0xLG4ucHJldHR5PWZ1bmN0aW9uKHkpe3ZhciBULFAsYz0iIjtmb3IoUD0wO1A8KHl8fCIiKS5sZW5ndGg7UCsrKWMrPSJcXHgiKygoVD15LmNoYXJDb2RlQXQoUCkpPDE2PyIwIjoiIikrVC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtyZXR1cm4gY30sbi5kZWxheT1mdW5jdGlvbih5LFQsUCl7c2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCl7eS5hcHBseShQfHxudWxsLFR8fFtdKX0pfSxuLmluaGVyaXRzPWZ1bmN0aW9uKHksVCl7ZnVuY3Rpb24gUCgpe31QLnByb3RvdHlwZT1ULnByb3RvdHlwZSx5LnByb3RvdHlwZT1uZXcgUH0sbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgeSxULFA9e307Zm9yKHk9MDt5PGFyZ3VtZW50cy5sZW5ndGg7eSsrKWZvcihUIGluIGFyZ3VtZW50c1t5XSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW3ldLFQpJiZQW1RdPT09dm9pZCAwJiYoUFtUXT1hcmd1bWVudHNbeV1bVF0pO3JldHVybiBQfSxuLnByZXBhcmVDb250ZW50PWZ1bmN0aW9uKHksVCxQLGMsbCl7cmV0dXJuIG8uUHJvbWlzZS5yZXNvbHZlKFQpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIHIuYmxvYiYmKGggaW5zdGFuY2VvZiBCbG9ifHxbIltvYmplY3QgRmlsZV0iLCJbb2JqZWN0IEJsb2JdIl0uaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaCkpIT09LTEpJiZ0eXBlb2YgRmlsZVJlYWRlcjwidSI/bmV3IG8uUHJvbWlzZShmdW5jdGlvbihfLEYpe3ZhciBPPW5ldyBGaWxlUmVhZGVyO08ub25sb2FkPWZ1bmN0aW9uKGYpe18oZi50YXJnZXQucmVzdWx0KX0sTy5vbmVycm9yPWZ1bmN0aW9uKGYpe0YoZi50YXJnZXQuZXJyb3IpfSxPLnJlYWRBc0FycmF5QnVmZmVyKGgpfSk6aH0pLnRoZW4oZnVuY3Rpb24oaCl7dmFyIF89bi5nZXRUeXBlT2YoaCk7cmV0dXJuIF8/KF89PT0iYXJyYXlidWZmZXIiP2g9bi50cmFuc2Zvcm1UbygidWludDhhcnJheSIsaCk6Xz09PSJzdHJpbmciJiYobD9oPXMuZGVjb2RlKGgpOlAmJmMhPT0hMCYmKGg9ZnVuY3Rpb24oRil7cmV0dXJuIHAoRixyLnVpbnQ4YXJyYXk/bmV3IFVpbnQ4QXJyYXkoRi5sZW5ndGgpOm5ldyBBcnJheShGLmxlbmd0aCkpfShoKSkpLGgpOm8uUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDYW4ndCByZWFkIHRoZSBkYXRhIG9mICciK3krIicuIElzIGl0IGluIGEgc3VwcG9ydGVkIEphdmFTY3JpcHQgdHlwZSAoU3RyaW5nLCBCbG9iLCBBcnJheUJ1ZmZlciwgZXRjKSA/IikpfSl9fSx7Ii4vYmFzZTY0IjoxLCIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdXBwb3J0IjozMCxzZXRpbW1lZGlhdGU6NTR9XSwzMzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL3JlYWRlci9yZWFkZXJGb3IiKSxzPXQoIi4vdXRpbHMiKSxpPXQoIi4vc2lnbmF0dXJlIiksbz10KCIuL3ppcEVudHJ5IiksdT10KCIuL3N1cHBvcnQiKTtmdW5jdGlvbiBwKGIpe3RoaXMuZmlsZXM9W10sdGhpcy5sb2FkT3B0aW9ucz1ifXAucHJvdG90eXBlPXtjaGVja1NpZ25hdHVyZTpmdW5jdGlvbihiKXtpZighdGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKGIpKXt0aGlzLnJlYWRlci5pbmRleC09NDt2YXIgZz10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO3Rocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCBvciBidWc6IHVuZXhwZWN0ZWQgc2lnbmF0dXJlICgiK3MucHJldHR5KGcpKyIsIGV4cGVjdGVkICIrcy5wcmV0dHkoYikrIikiKX19LGlzU2lnbmF0dXJlOmZ1bmN0aW9uKGIsZyl7dmFyIG09dGhpcy5yZWFkZXIuaW5kZXg7dGhpcy5yZWFkZXIuc2V0SW5kZXgoYik7dmFyIEM9dGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KT09PWc7cmV0dXJuIHRoaXMucmVhZGVyLnNldEluZGV4KG0pLEN9LHJlYWRCbG9ja0VuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3RoaXMuZGlza051bWJlcj10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHM9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJTaXplPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5jZW50cmFsRGlyT2Zmc2V0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy56aXBDb21tZW50TGVuZ3RoPXRoaXMucmVhZGVyLnJlYWRJbnQoMik7dmFyIGI9dGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKSxnPXUudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixtPXMudHJhbnNmb3JtVG8oZyxiKTt0aGlzLnppcENvbW1lbnQ9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShtKX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMucmVhZGVyLnNraXAoNCksdGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDQpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGE9e307Zm9yKHZhciBiLGcsbSxDPXRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplLTQ0OzA8QzspYj10aGlzLnJlYWRlci5yZWFkSW50KDIpLGc9dGhpcy5yZWFkZXIucmVhZEludCg0KSxtPXRoaXMucmVhZGVyLnJlYWREYXRhKGcpLHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YVtiXT17aWQ6YixsZW5ndGg6Zyx2YWx1ZTptfX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yOmZ1bmN0aW9uKCl7aWYodGhpcy5kaXNrV2l0aFppcDY0Q2VudHJhbERpclN0YXJ0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5kaXNrc0NvdW50PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksMTx0aGlzLmRpc2tzQ291bnQpdGhyb3cgbmV3IEVycm9yKCJNdWx0aS12b2x1bWVzIHppcCBhcmUgbm90IHN1cHBvcnRlZCIpfSxyZWFkTG9jYWxGaWxlczpmdW5jdGlvbigpe3ZhciBiLGc7Zm9yKGI9MDtiPHRoaXMuZmlsZXMubGVuZ3RoO2IrKylnPXRoaXMuZmlsZXNbYl0sdGhpcy5yZWFkZXIuc2V0SW5kZXgoZy5sb2NhbEhlYWRlck9mZnNldCksdGhpcy5jaGVja1NpZ25hdHVyZShpLkxPQ0FMX0ZJTEVfSEVBREVSKSxnLnJlYWRMb2NhbFBhcnQodGhpcy5yZWFkZXIpLGcuaGFuZGxlVVRGOCgpLGcucHJvY2Vzc0F0dHJpYnV0ZXMoKX0scmVhZENlbnRyYWxEaXI6ZnVuY3Rpb24oKXt2YXIgYjtmb3IodGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5jZW50cmFsRGlyT2Zmc2V0KTt0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoaS5DRU5UUkFMX0ZJTEVfSEVBREVSKTspKGI9bmV3IG8oe3ppcDY0OnRoaXMuemlwNjR9LHRoaXMubG9hZE9wdGlvbnMpKS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpLHRoaXMuZmlsZXMucHVzaChiKTtpZih0aGlzLmNlbnRyYWxEaXJSZWNvcmRzIT09dGhpcy5maWxlcy5sZW5ndGgmJnRoaXMuY2VudHJhbERpclJlY29yZHMhPT0wJiZ0aGlzLmZpbGVzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgIit0aGlzLmNlbnRyYWxEaXJSZWNvcmRzKyIgcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICIrdGhpcy5maWxlcy5sZW5ndGgpfSxyZWFkRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoaS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO2lmKGI8MCl0aHJvdyB0aGlzLmlzU2lnbmF0dXJlKDAsaS5MT0NBTF9GSUxFX0hFQURFUik/bmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIpOm5ldyBFcnJvcigiQ2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgOiBpcyB0aGlzIGEgemlwIGZpbGUgPyBJZiBpdCBpcywgc2VlIGh0dHBzOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sIik7dGhpcy5yZWFkZXIuc2V0SW5kZXgoYik7dmFyIGc9YjtpZih0aGlzLmNoZWNrU2lnbmF0dXJlKGkuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSx0aGlzLnJlYWRCbG9ja0VuZE9mQ2VudHJhbCgpLHRoaXMuZGlza051bWJlcj09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2s9PT1zLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuY2VudHJhbERpclJlY29yZHM9PT1zLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuY2VudHJhbERpclNpemU9PT1zLk1BWF9WQUxVRV8zMkJJVFN8fHRoaXMuY2VudHJhbERpck9mZnNldD09PXMuTUFYX1ZBTFVFXzMyQklUUyl7aWYodGhpcy56aXA2ND0hMCwoYj10aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShpLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpKTwwKXRocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IiKTtpZih0aGlzLnJlYWRlci5zZXRJbmRleChiKSx0aGlzLmNoZWNrU2lnbmF0dXJlKGkuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKSwhdGhpcy5pc1NpZ25hdHVyZSh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIsaS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpJiYodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKGkuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSx0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI8MCkpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiKTt0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIpLHRoaXMuY2hlY2tTaWduYXR1cmUoaS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWwoKX12YXIgbT10aGlzLmNlbnRyYWxEaXJPZmZzZXQrdGhpcy5jZW50cmFsRGlyU2l6ZTt0aGlzLnppcDY0JiYobSs9MjAsbSs9MTIrdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUpO3ZhciBDPWctbTtpZigwPEMpdGhpcy5pc1NpZ25hdHVyZShnLGkuQ0VOVFJBTF9GSUxFX0hFQURFUil8fCh0aGlzLnJlYWRlci56ZXJvPUMpO2Vsc2UgaWYoQzwwKXRocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcDogbWlzc2luZyAiK01hdGguYWJzKEMpKyIgYnl0ZXMuIil9LHByZXBhcmVSZWFkZXI6ZnVuY3Rpb24oYil7dGhpcy5yZWFkZXI9cihiKX0sbG9hZDpmdW5jdGlvbihiKXt0aGlzLnByZXBhcmVSZWFkZXIoYiksdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCksdGhpcy5yZWFkQ2VudHJhbERpcigpLHRoaXMucmVhZExvY2FsRmlsZXMoKX19LGUuZXhwb3J0cz1wfSx7Ii4vcmVhZGVyL3JlYWRlckZvciI6MjIsIi4vc2lnbmF0dXJlIjoyMywiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzIsIi4vemlwRW50cnkiOjM0fV0sMzQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9yZWFkZXIvcmVhZGVyRm9yIikscz10KCIuL3V0aWxzIiksaT10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxvPXQoIi4vY3JjMzIiKSx1PXQoIi4vdXRmOCIpLHA9dCgiLi9jb21wcmVzc2lvbnMiKSxiPXQoIi4vc3VwcG9ydCIpO2Z1bmN0aW9uIGcobSxDKXt0aGlzLm9wdGlvbnM9bSx0aGlzLmxvYWRPcHRpb25zPUN9Zy5wcm90b3R5cGU9e2lzRW5jcnlwdGVkOmZ1bmN0aW9uKCl7cmV0dXJuKDEmdGhpcy5iaXRGbGFnKT09MX0sdXNlVVRGODpmdW5jdGlvbigpe3JldHVybigyMDQ4JnRoaXMuYml0RmxhZyk9PTIwNDh9LHJlYWRMb2NhbFBhcnQ6ZnVuY3Rpb24obSl7dmFyIEMseTtpZihtLnNraXAoMjIpLHRoaXMuZmlsZU5hbWVMZW5ndGg9bS5yZWFkSW50KDIpLHk9bS5yZWFkSW50KDIpLHRoaXMuZmlsZU5hbWU9bS5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKSxtLnNraXAoeSksdGhpcy5jb21wcmVzc2VkU2l6ZT09PS0xfHx0aGlzLnVuY29tcHJlc3NlZFNpemU9PT0tMSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSkiKTtpZigoQz1mdW5jdGlvbihUKXtmb3IodmFyIFAgaW4gcClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCxQKSYmcFtQXS5tYWdpYz09PVQpcmV0dXJuIHBbUF07cmV0dXJuIG51bGx9KHRoaXMuY29tcHJlc3Npb25NZXRob2QpKT09PW51bGwpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gIitzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSsiIHVua25vd24gKGlubmVyIGZpbGUgOiAiK3MudHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5maWxlTmFtZSkrIikiKTt0aGlzLmRlY29tcHJlc3NlZD1uZXcgaSh0aGlzLmNvbXByZXNzZWRTaXplLHRoaXMudW5jb21wcmVzc2VkU2l6ZSx0aGlzLmNyYzMyLEMsbS5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSl9LHJlYWRDZW50cmFsUGFydDpmdW5jdGlvbihtKXt0aGlzLnZlcnNpb25NYWRlQnk9bS5yZWFkSW50KDIpLG0uc2tpcCgyKSx0aGlzLmJpdEZsYWc9bS5yZWFkSW50KDIpLHRoaXMuY29tcHJlc3Npb25NZXRob2Q9bS5yZWFkU3RyaW5nKDIpLHRoaXMuZGF0ZT1tLnJlYWREYXRlKCksdGhpcy5jcmMzMj1tLnJlYWRJbnQoNCksdGhpcy5jb21wcmVzc2VkU2l6ZT1tLnJlYWRJbnQoNCksdGhpcy51bmNvbXByZXNzZWRTaXplPW0ucmVhZEludCg0KTt2YXIgQz1tLnJlYWRJbnQoMik7aWYodGhpcy5leHRyYUZpZWxkc0xlbmd0aD1tLnJlYWRJbnQoMiksdGhpcy5maWxlQ29tbWVudExlbmd0aD1tLnJlYWRJbnQoMiksdGhpcy5kaXNrTnVtYmVyU3RhcnQ9bS5yZWFkSW50KDIpLHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1tLnJlYWRJbnQoMiksdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPW0ucmVhZEludCg0KSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PW0ucmVhZEludCg0KSx0aGlzLmlzRW5jcnlwdGVkKCkpdGhyb3cgbmV3IEVycm9yKCJFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkIik7bS5za2lwKEMpLHRoaXMucmVhZEV4dHJhRmllbGRzKG0pLHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQobSksdGhpcy5maWxlQ29tbWVudD1tLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpfSxwcm9jZXNzQXR0cmlidXRlczpmdW5jdGlvbigpe3RoaXMudW5peFBlcm1pc3Npb25zPW51bGwsdGhpcy5kb3NQZXJtaXNzaW9ucz1udWxsO3ZhciBtPXRoaXMudmVyc2lvbk1hZGVCeT4+ODt0aGlzLmRpcj0hISgxNiZ0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpLG09PTAmJih0aGlzLmRvc1Blcm1pc3Npb25zPTYzJnRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyksbT09MyYmKHRoaXMudW5peFBlcm1pc3Npb25zPXRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz4+MTYmNjU1MzUpLHRoaXMuZGlyfHx0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSE9PSIvInx8KHRoaXMuZGlyPSEwKX0scGFyc2VaSVA2NEV4dHJhRmllbGQ6ZnVuY3Rpb24oKXtpZih0aGlzLmV4dHJhRmllbGRzWzFdKXt2YXIgbT1yKHRoaXMuZXh0cmFGaWVsZHNbMV0udmFsdWUpO3RoaXMudW5jb21wcmVzc2VkU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMudW5jb21wcmVzc2VkU2l6ZT1tLnJlYWRJbnQoOCkpLHRoaXMuY29tcHJlc3NlZFNpemU9PT1zLk1BWF9WQUxVRV8zMkJJVFMmJih0aGlzLmNvbXByZXNzZWRTaXplPW0ucmVhZEludCg4KSksdGhpcy5sb2NhbEhlYWRlck9mZnNldD09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMubG9jYWxIZWFkZXJPZmZzZXQ9bS5yZWFkSW50KDgpKSx0aGlzLmRpc2tOdW1iZXJTdGFydD09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuZGlza051bWJlclN0YXJ0PW0ucmVhZEludCg0KSl9fSxyZWFkRXh0cmFGaWVsZHM6ZnVuY3Rpb24obSl7dmFyIEMseSxULFA9bS5pbmRleCt0aGlzLmV4dHJhRmllbGRzTGVuZ3RoO2Zvcih0aGlzLmV4dHJhRmllbGRzfHwodGhpcy5leHRyYUZpZWxkcz17fSk7bS5pbmRleCs0PFA7KUM9bS5yZWFkSW50KDIpLHk9bS5yZWFkSW50KDIpLFQ9bS5yZWFkRGF0YSh5KSx0aGlzLmV4dHJhRmllbGRzW0NdPXtpZDpDLGxlbmd0aDp5LHZhbHVlOlR9O20uc2V0SW5kZXgoUCl9LGhhbmRsZVVURjg6ZnVuY3Rpb24oKXt2YXIgbT1iLnVpbnQ4YXJyYXk/InVpbnQ4YXJyYXkiOiJhcnJheSI7aWYodGhpcy51c2VVVEY4KCkpdGhpcy5maWxlTmFtZVN0cj11LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSksdGhpcy5maWxlQ29tbWVudFN0cj11LnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7ZWxzZXt2YXIgQz10aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtpZihDIT09bnVsbCl0aGlzLmZpbGVOYW1lU3RyPUM7ZWxzZXt2YXIgeT1zLnRyYW5zZm9ybVRvKG0sdGhpcy5maWxlTmFtZSk7dGhpcy5maWxlTmFtZVN0cj10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKHkpfXZhciBUPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO2lmKFQhPT1udWxsKXRoaXMuZmlsZUNvbW1lbnRTdHI9VDtlbHNle3ZhciBQPXMudHJhbnNmb3JtVG8obSx0aGlzLmZpbGVDb21tZW50KTt0aGlzLmZpbGVDb21tZW50U3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoUCl9fX0sZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDpmdW5jdGlvbigpe3ZhciBtPXRoaXMuZXh0cmFGaWVsZHNbMjg3ODldO2lmKG0pe3ZhciBDPXIobS52YWx1ZSk7cmV0dXJuIEMucmVhZEludCgxKSE9PTF8fG8odGhpcy5maWxlTmFtZSkhPT1DLnJlYWRJbnQoNCk/bnVsbDp1LnV0ZjhkZWNvZGUoQy5yZWFkRGF0YShtLmxlbmd0aC01KSl9cmV0dXJuIG51bGx9LGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6ZnVuY3Rpb24oKXt2YXIgbT10aGlzLmV4dHJhRmllbGRzWzI1NDYxXTtpZihtKXt2YXIgQz1yKG0udmFsdWUpO3JldHVybiBDLnJlYWRJbnQoMSkhPT0xfHxvKHRoaXMuZmlsZUNvbW1lbnQpIT09Qy5yZWFkSW50KDQpP251bGw6dS51dGY4ZGVjb2RlKEMucmVhZERhdGEobS5sZW5ndGgtNSkpfXJldHVybiBudWxsfX0sZS5leHBvcnRzPWd9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2NvbXByZXNzaW9ucyI6MywiLi9jcmMzMiI6NCwiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zdXBwb3J0IjozMCwiLi91dGY4IjozMSwiLi91dGlscyI6MzJ9XSwzNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKEMseSxUKXt0aGlzLm5hbWU9Qyx0aGlzLmRpcj1ULmRpcix0aGlzLmRhdGU9VC5kYXRlLHRoaXMuY29tbWVudD1ULmNvbW1lbnQsdGhpcy51bml4UGVybWlzc2lvbnM9VC51bml4UGVybWlzc2lvbnMsdGhpcy5kb3NQZXJtaXNzaW9ucz1ULmRvc1Blcm1pc3Npb25zLHRoaXMuX2RhdGE9eSx0aGlzLl9kYXRhQmluYXJ5PVQuYmluYXJ5LHRoaXMub3B0aW9ucz17Y29tcHJlc3Npb246VC5jb21wcmVzc2lvbixjb21wcmVzc2lvbk9wdGlvbnM6VC5jb21wcmVzc2lvbk9wdGlvbnN9fXZhciBzPXQoIi4vc3RyZWFtL1N0cmVhbUhlbHBlciIpLGk9dCgiLi9zdHJlYW0vRGF0YVdvcmtlciIpLG89dCgiLi91dGY4IiksdT10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxwPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtyLnByb3RvdHlwZT17aW50ZXJuYWxTdHJlYW06ZnVuY3Rpb24oQyl7dmFyIHk9bnVsbCxUPSJzdHJpbmciO3RyeXtpZighQyl0aHJvdyBuZXcgRXJyb3IoIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC4iKTt2YXIgUD0oVD1DLnRvTG93ZXJDYXNlKCkpPT09InN0cmluZyJ8fFQ9PT0idGV4dCI7VCE9PSJiaW5hcnlzdHJpbmciJiZUIT09InRleHQifHwoVD0ic3RyaW5nIikseT10aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7dmFyIGM9IXRoaXMuX2RhdGFCaW5hcnk7YyYmIVAmJih5PXkucGlwZShuZXcgby5VdGY4RW5jb2RlV29ya2VyKSksIWMmJlAmJih5PXkucGlwZShuZXcgby5VdGY4RGVjb2RlV29ya2VyKSl9Y2F0Y2gobCl7KHk9bmV3IHAoImVycm9yIikpLmVycm9yKGwpfXJldHVybiBuZXcgcyh5LFQsIiIpfSxhc3luYzpmdW5jdGlvbihDLHkpe3JldHVybiB0aGlzLmludGVybmFsU3RyZWFtKEMpLmFjY3VtdWxhdGUoeSl9LG5vZGVTdHJlYW06ZnVuY3Rpb24oQyx5KXtyZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbShDfHwibm9kZWJ1ZmZlciIpLnRvTm9kZWpzU3RyZWFtKHkpfSxfY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oQyx5KXtpZih0aGlzLl9kYXRhIGluc3RhbmNlb2YgdSYmdGhpcy5fZGF0YS5jb21wcmVzc2lvbi5tYWdpYz09PUMubWFnaWMpcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO3ZhciBUPXRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtyZXR1cm4gdGhpcy5fZGF0YUJpbmFyeXx8KFQ9VC5waXBlKG5ldyBvLlV0ZjhFbmNvZGVXb3JrZXIpKSx1LmNyZWF0ZVdvcmtlckZyb20oVCxDLHkpfSxfZGVjb21wcmVzc1dvcmtlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhIGluc3RhbmNlb2YgdT90aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTp0aGlzLl9kYXRhIGluc3RhbmNlb2YgcD90aGlzLl9kYXRhOm5ldyBpKHRoaXMuX2RhdGEpfX07Zm9yKHZhciBiPVsiYXNUZXh0IiwiYXNCaW5hcnkiLCJhc05vZGVCdWZmZXIiLCJhc1VpbnQ4QXJyYXkiLCJhc0FycmF5QnVmZmVyIl0sZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS4iKX0sbT0wO208Yi5sZW5ndGg7bSsrKXIucHJvdG90eXBlW2JbbV1dPWc7ZS5leHBvcnRzPXJ9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL3N0cmVhbS9EYXRhV29ya2VyIjoyNywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3RyZWFtL1N0cmVhbUhlbHBlciI6MjksIi4vdXRmOCI6MzF9XSwzNjpbZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihyKXsidXNlIHN0cmljdCI7dmFyIHMsaSxvPXIuTXV0YXRpb25PYnNlcnZlcnx8ci5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO2lmKG8pe3ZhciB1PTAscD1uZXcgbyhDKSxiPXIuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO3Aub2JzZXJ2ZShiLHtjaGFyYWN0ZXJEYXRhOiEwfSkscz1mdW5jdGlvbigpe2IuZGF0YT11PSsrdSUyfX1lbHNlIGlmKHIuc2V0SW1tZWRpYXRlfHxyLk1lc3NhZ2VDaGFubmVsPT09dm9pZCAwKXM9ImRvY3VtZW50ImluIHImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gci5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT9mdW5jdGlvbigpe3ZhciB5PXIuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7eS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtDKCkseS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCx5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeSkseT1udWxsfSxyLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh5KX06ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KEMsMCl9O2Vsc2V7dmFyIGc9bmV3IHIuTWVzc2FnZUNoYW5uZWw7Zy5wb3J0MS5vbm1lc3NhZ2U9QyxzPWZ1bmN0aW9uKCl7Zy5wb3J0Mi5wb3N0TWVzc2FnZSgwKX19dmFyIG09W107ZnVuY3Rpb24gQygpe3ZhciB5LFQ7aT0hMDtmb3IodmFyIFA9bS5sZW5ndGg7UDspe2ZvcihUPW0sbT1bXSx5PS0xOysreTxQOylUW3ldKCk7UD1tLmxlbmd0aH1pPSExfWUuZXhwb3J0cz1mdW5jdGlvbih5KXttLnB1c2goeSkhPT0xfHxpfHxzKCl9fSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6e30pfSx7fV0sMzc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiaW1tZWRpYXRlIik7ZnVuY3Rpb24gcygpe312YXIgaT17fSxvPVsiUkVKRUNURUQiXSx1PVsiRlVMRklMTEVEIl0scD1bIlBFTkRJTkciXTtmdW5jdGlvbiBiKFApe2lmKHR5cGVvZiBQIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoInJlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3RoaXMuc3RhdGU9cCx0aGlzLnF1ZXVlPVtdLHRoaXMub3V0Y29tZT12b2lkIDAsUCE9PXMmJnkodGhpcyxQKX1mdW5jdGlvbiBnKFAsYyxsKXt0aGlzLnByb21pc2U9UCx0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKHRoaXMub25GdWxmaWxsZWQ9Yyx0aGlzLmNhbGxGdWxmaWxsZWQ9dGhpcy5vdGhlckNhbGxGdWxmaWxsZWQpLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiYodGhpcy5vblJlamVjdGVkPWwsdGhpcy5jYWxsUmVqZWN0ZWQ9dGhpcy5vdGhlckNhbGxSZWplY3RlZCl9ZnVuY3Rpb24gbShQLGMsbCl7cihmdW5jdGlvbigpe3ZhciBoO3RyeXtoPWMobCl9Y2F0Y2goXyl7cmV0dXJuIGkucmVqZWN0KFAsXyl9aD09PVA/aS5yZWplY3QoUCxuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVzb2x2ZSBwcm9taXNlIHdpdGggaXRzZWxmIikpOmkucmVzb2x2ZShQLGgpfSl9ZnVuY3Rpb24gQyhQKXt2YXIgYz1QJiZQLnRoZW47aWYoUCYmKHR5cGVvZiBQPT0ib2JqZWN0Inx8dHlwZW9mIFA9PSJmdW5jdGlvbiIpJiZ0eXBlb2YgYz09ImZ1bmN0aW9uIilyZXR1cm4gZnVuY3Rpb24oKXtjLmFwcGx5KFAsYXJndW1lbnRzKX19ZnVuY3Rpb24geShQLGMpe3ZhciBsPSExO2Z1bmN0aW9uIGgoTyl7bHx8KGw9ITAsaS5yZWplY3QoUCxPKSl9ZnVuY3Rpb24gXyhPKXtsfHwobD0hMCxpLnJlc29sdmUoUCxPKSl9dmFyIEY9VChmdW5jdGlvbigpe2MoXyxoKX0pO0Yuc3RhdHVzPT09ImVycm9yIiYmaChGLnZhbHVlKX1mdW5jdGlvbiBUKFAsYyl7dmFyIGw9e307dHJ5e2wudmFsdWU9UChjKSxsLnN0YXR1cz0ic3VjY2VzcyJ9Y2F0Y2goaCl7bC5zdGF0dXM9ImVycm9yIixsLnZhbHVlPWh9cmV0dXJuIGx9KGUuZXhwb3J0cz1iKS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbihQKXtpZih0eXBlb2YgUCE9ImZ1bmN0aW9uIilyZXR1cm4gdGhpczt2YXIgYz10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24obCl7cmV0dXJuIGMucmVzb2x2ZShQKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gbH0pfSxmdW5jdGlvbihsKXtyZXR1cm4gYy5yZXNvbHZlKFAoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IGx9KX0pfSxiLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihQKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsUCl9LGIucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oUCxjKXtpZih0eXBlb2YgUCE9ImZ1bmN0aW9uIiYmdGhpcy5zdGF0ZT09PXV8fHR5cGVvZiBjIT0iZnVuY3Rpb24iJiZ0aGlzLnN0YXRlPT09bylyZXR1cm4gdGhpczt2YXIgbD1uZXcgdGhpcy5jb25zdHJ1Y3RvcihzKTtyZXR1cm4gdGhpcy5zdGF0ZSE9PXA/bShsLHRoaXMuc3RhdGU9PT11P1A6Yyx0aGlzLm91dGNvbWUpOnRoaXMucXVldWUucHVzaChuZXcgZyhsLFAsYykpLGx9LGcucHJvdG90eXBlLmNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oUCl7aS5yZXNvbHZlKHRoaXMucHJvbWlzZSxQKX0sZy5wcm90b3R5cGUub3RoZXJDYWxsRnVsZmlsbGVkPWZ1bmN0aW9uKFApe20odGhpcy5wcm9taXNlLHRoaXMub25GdWxmaWxsZWQsUCl9LGcucHJvdG90eXBlLmNhbGxSZWplY3RlZD1mdW5jdGlvbihQKXtpLnJlamVjdCh0aGlzLnByb21pc2UsUCl9LGcucHJvdG90eXBlLm90aGVyQ2FsbFJlamVjdGVkPWZ1bmN0aW9uKFApe20odGhpcy5wcm9taXNlLHRoaXMub25SZWplY3RlZCxQKX0saS5yZXNvbHZlPWZ1bmN0aW9uKFAsYyl7dmFyIGw9VChDLGMpO2lmKGwuc3RhdHVzPT09ImVycm9yIilyZXR1cm4gaS5yZWplY3QoUCxsLnZhbHVlKTt2YXIgaD1sLnZhbHVlO2lmKGgpeShQLGgpO2Vsc2V7UC5zdGF0ZT11LFAub3V0Y29tZT1jO2Zvcih2YXIgXz0tMSxGPVAucXVldWUubGVuZ3RoOysrXzxGOylQLnF1ZXVlW19dLmNhbGxGdWxmaWxsZWQoYyl9cmV0dXJuIFB9LGkucmVqZWN0PWZ1bmN0aW9uKFAsYyl7UC5zdGF0ZT1vLFAub3V0Y29tZT1jO2Zvcih2YXIgbD0tMSxoPVAucXVldWUubGVuZ3RoOysrbDxoOylQLnF1ZXVlW2xdLmNhbGxSZWplY3RlZChjKTtyZXR1cm4gUH0sYi5yZXNvbHZlPWZ1bmN0aW9uKFApe3JldHVybiBQIGluc3RhbmNlb2YgdGhpcz9QOmkucmVzb2x2ZShuZXcgdGhpcyhzKSxQKX0sYi5yZWplY3Q9ZnVuY3Rpb24oUCl7dmFyIGM9bmV3IHRoaXMocyk7cmV0dXJuIGkucmVqZWN0KGMsUCl9LGIuYWxsPWZ1bmN0aW9uKFApe3ZhciBjPXRoaXM7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFApIT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgbD1QLmxlbmd0aCxoPSExO2lmKCFsKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgXz1uZXcgQXJyYXkobCksRj0wLE89LTEsZj1uZXcgdGhpcyhzKTsrK088bDspVShQW09dLE8pO3JldHVybiBmO2Z1bmN0aW9uIFUoWCxRKXtjLnJlc29sdmUoWCkudGhlbihmdW5jdGlvbihFKXtfW1FdPUUsKytGIT09bHx8aHx8KGg9ITAsaS5yZXNvbHZlKGYsXykpfSxmdW5jdGlvbihFKXtofHwoaD0hMCxpLnJlamVjdChmLEUpKX0pfX0sYi5yYWNlPWZ1bmN0aW9uKFApe3ZhciBjPXRoaXM7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFApIT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgbD1QLmxlbmd0aCxoPSExO2lmKCFsKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgXz0tMSxGPW5ldyB0aGlzKHMpOysrXzxsOylPPVBbX10sYy5yZXNvbHZlKE8pLnRoZW4oZnVuY3Rpb24oZil7aHx8KGg9ITAsaS5yZXNvbHZlKEYsZikpfSxmdW5jdGlvbihmKXtofHwoaD0hMCxpLnJlamVjdChGLGYpKX0pO3ZhciBPO3JldHVybiBGfX0se2ltbWVkaWF0ZTozNn1dLDM4OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9OygwLHQoIi4vbGliL3V0aWxzL2NvbW1vbiIpLmFzc2lnbikocix0KCIuL2xpYi9kZWZsYXRlIiksdCgiLi9saWIvaW5mbGF0ZSIpLHQoIi4vbGliL3psaWIvY29uc3RhbnRzIikpLGUuZXhwb3J0cz1yfSx7Ii4vbGliL2RlZmxhdGUiOjM5LCIuL2xpYi9pbmZsYXRlIjo0MCwiLi9saWIvdXRpbHMvY29tbW9uIjo0MSwiLi9saWIvemxpYi9jb25zdGFudHMiOjQ0fV0sMzk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi96bGliL2RlZmxhdGUiKSxzPXQoIi4vdXRpbHMvY29tbW9uIiksaT10KCIuL3V0aWxzL3N0cmluZ3MiKSxvPXQoIi4vemxpYi9tZXNzYWdlcyIpLHU9dCgiLi96bGliL3pzdHJlYW0iKSxwPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYj0wLGc9LTEsbT0wLEM9ODtmdW5jdGlvbiB5KFApe2lmKCEodGhpcyBpbnN0YW5jZW9mIHkpKXJldHVybiBuZXcgeShQKTt0aGlzLm9wdGlvbnM9cy5hc3NpZ24oe2xldmVsOmcsbWV0aG9kOkMsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTptLHRvOiIifSxQfHx7fSk7dmFyIGM9dGhpcy5vcHRpb25zO2MucmF3JiYwPGMud2luZG93Qml0cz9jLndpbmRvd0JpdHM9LWMud2luZG93Qml0czpjLmd6aXAmJjA8Yy53aW5kb3dCaXRzJiZjLndpbmRvd0JpdHM8MTYmJihjLndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyB1LHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbD1yLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sYy5sZXZlbCxjLm1ldGhvZCxjLndpbmRvd0JpdHMsYy5tZW1MZXZlbCxjLnN0cmF0ZWd5KTtpZihsIT09Yil0aHJvdyBuZXcgRXJyb3Iob1tsXSk7aWYoYy5oZWFkZXImJnIuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sYy5oZWFkZXIpLGMuZGljdGlvbmFyeSl7dmFyIGg7aWYoaD10eXBlb2YgYy5kaWN0aW9uYXJ5PT0ic3RyaW5nIj9pLnN0cmluZzJidWYoYy5kaWN0aW9uYXJ5KTpwLmNhbGwoYy5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bmV3IFVpbnQ4QXJyYXkoYy5kaWN0aW9uYXJ5KTpjLmRpY3Rpb25hcnksKGw9ci5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0saCkpIT09Yil0aHJvdyBuZXcgRXJyb3Iob1tsXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIFQoUCxjKXt2YXIgbD1uZXcgeShjKTtpZihsLnB1c2goUCwhMCksbC5lcnIpdGhyb3cgbC5tc2d8fG9bbC5lcnJdO3JldHVybiBsLnJlc3VsdH15LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKFAsYyl7dmFyIGwsaCxfPXRoaXMuc3RybSxGPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtoPWM9PT1+fmM/YzpjPT09ITA/NDowLHR5cGVvZiBQPT0ic3RyaW5nIj9fLmlucHV0PWkuc3RyaW5nMmJ1ZihQKTpwLmNhbGwoUCk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP18uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoUCk6Xy5pbnB1dD1QLF8ubmV4dF9pbj0wLF8uYXZhaWxfaW49Xy5pbnB1dC5sZW5ndGg7ZG97aWYoXy5hdmFpbF9vdXQ9PT0wJiYoXy5vdXRwdXQ9bmV3IHMuQnVmOChGKSxfLm5leHRfb3V0PTAsXy5hdmFpbF9vdXQ9RiksKGw9ci5kZWZsYXRlKF8saCkpIT09MSYmbCE9PWIpcmV0dXJuIHRoaXMub25FbmQobCksISh0aGlzLmVuZGVkPSEwKTtfLmF2YWlsX291dCE9PTAmJihfLmF2YWlsX2luIT09MHx8aCE9PTQmJmghPT0yKXx8KHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMub25EYXRhKGkuYnVmMmJpbnN0cmluZyhzLnNocmlua0J1ZihfLm91dHB1dCxfLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKHMuc2hyaW5rQnVmKF8ub3V0cHV0LF8ubmV4dF9vdXQpKSl9d2hpbGUoKDA8Xy5hdmFpbF9pbnx8Xy5hdmFpbF9vdXQ9PT0wKSYmbCE9PTEpO3JldHVybiBoPT09ND8obD1yLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGwpLHRoaXMuZW5kZWQ9ITAsbD09PWIpOmghPT0yfHwodGhpcy5vbkVuZChiKSwhKF8uYXZhaWxfb3V0PTApKX0seS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKFApe3RoaXMuY2h1bmtzLnB1c2goUCl9LHkucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKFApe1A9PT1iJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9cy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9UCx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfSxuLkRlZmxhdGU9eSxuLmRlZmxhdGU9VCxuLmRlZmxhdGVSYXc9ZnVuY3Rpb24oUCxjKXtyZXR1cm4oYz1jfHx7fSkucmF3PSEwLFQoUCxjKX0sbi5nemlwPWZ1bmN0aW9uKFAsYyl7cmV0dXJuKGM9Y3x8e30pLmd6aXA9ITAsVChQLGMpfX0seyIuL3V0aWxzL2NvbW1vbiI6NDEsIi4vdXRpbHMvc3RyaW5ncyI6NDIsIi4vemxpYi9kZWZsYXRlIjo0NiwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi96bGliL2luZmxhdGUiKSxzPXQoIi4vdXRpbHMvY29tbW9uIiksaT10KCIuL3V0aWxzL3N0cmluZ3MiKSxvPXQoIi4vemxpYi9jb25zdGFudHMiKSx1PXQoIi4vemxpYi9tZXNzYWdlcyIpLHA9dCgiLi96bGliL3pzdHJlYW0iKSxiPXQoIi4vemxpYi9nemhlYWRlciIpLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBtKHkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG0pKXJldHVybiBuZXcgbSh5KTt0aGlzLm9wdGlvbnM9cy5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LHl8fHt9KTt2YXIgVD10aGlzLm9wdGlvbnM7VC5yYXcmJjA8PVQud2luZG93Qml0cyYmVC53aW5kb3dCaXRzPDE2JiYoVC53aW5kb3dCaXRzPS1ULndpbmRvd0JpdHMsVC53aW5kb3dCaXRzPT09MCYmKFQud2luZG93Qml0cz0tMTUpKSwhKDA8PVQud2luZG93Qml0cyYmVC53aW5kb3dCaXRzPDE2KXx8eSYmeS53aW5kb3dCaXRzfHwoVC53aW5kb3dCaXRzKz0zMiksMTU8VC53aW5kb3dCaXRzJiZULndpbmRvd0JpdHM8NDgmJiEoMTUmVC53aW5kb3dCaXRzKSYmKFQud2luZG93Qml0c3w9MTUpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IHAsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBQPXIuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSxULndpbmRvd0JpdHMpO2lmKFAhPT1vLlpfT0spdGhyb3cgbmV3IEVycm9yKHVbUF0pO3RoaXMuaGVhZGVyPW5ldyBiLHIuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpfWZ1bmN0aW9uIEMoeSxUKXt2YXIgUD1uZXcgbShUKTtpZihQLnB1c2goeSwhMCksUC5lcnIpdGhyb3cgUC5tc2d8fHVbUC5lcnJdO3JldHVybiBQLnJlc3VsdH1tLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHksVCl7dmFyIFAsYyxsLGgsXyxGLE89dGhpcy5zdHJtLGY9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxVPXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LFg9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtjPVQ9PT1+flQ/VDpUPT09ITA/by5aX0ZJTklTSDpvLlpfTk9fRkxVU0gsdHlwZW9mIHk9PSJzdHJpbmciP08uaW5wdXQ9aS5iaW5zdHJpbmcyYnVmKHkpOmcuY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/Ty5pbnB1dD1uZXcgVWludDhBcnJheSh5KTpPLmlucHV0PXksTy5uZXh0X2luPTAsTy5hdmFpbF9pbj1PLmlucHV0Lmxlbmd0aDtkb3tpZihPLmF2YWlsX291dD09PTAmJihPLm91dHB1dD1uZXcgcy5CdWY4KGYpLE8ubmV4dF9vdXQ9MCxPLmF2YWlsX291dD1mKSwoUD1yLmluZmxhdGUoTyxvLlpfTk9fRkxVU0gpKT09PW8uWl9ORUVEX0RJQ1QmJlUmJihGPXR5cGVvZiBVPT0ic3RyaW5nIj9pLnN0cmluZzJidWYoVSk6Zy5jYWxsKFUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9uZXcgVWludDhBcnJheShVKTpVLFA9ci5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sRikpLFA9PT1vLlpfQlVGX0VSUk9SJiZYPT09ITAmJihQPW8uWl9PSyxYPSExKSxQIT09by5aX1NUUkVBTV9FTkQmJlAhPT1vLlpfT0spcmV0dXJuIHRoaXMub25FbmQoUCksISh0aGlzLmVuZGVkPSEwKTtPLm5leHRfb3V0JiYoTy5hdmFpbF9vdXQhPT0wJiZQIT09by5aX1NUUkVBTV9FTkQmJihPLmF2YWlsX2luIT09MHx8YyE9PW8uWl9GSU5JU0gmJmMhPT1vLlpfU1lOQ19GTFVTSCl8fCh0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj8obD1pLnV0Zjhib3JkZXIoTy5vdXRwdXQsTy5uZXh0X291dCksaD1PLm5leHRfb3V0LWwsXz1pLmJ1ZjJzdHJpbmcoTy5vdXRwdXQsbCksTy5uZXh0X291dD1oLE8uYXZhaWxfb3V0PWYtaCxoJiZzLmFycmF5U2V0KE8ub3V0cHV0LE8ub3V0cHV0LGwsaCwwKSx0aGlzLm9uRGF0YShfKSk6dGhpcy5vbkRhdGEocy5zaHJpbmtCdWYoTy5vdXRwdXQsTy5uZXh0X291dCkpKSksTy5hdmFpbF9pbj09PTAmJk8uYXZhaWxfb3V0PT09MCYmKFg9ITApfXdoaWxlKCgwPE8uYXZhaWxfaW58fE8uYXZhaWxfb3V0PT09MCkmJlAhPT1vLlpfU1RSRUFNX0VORCk7cmV0dXJuIFA9PT1vLlpfU1RSRUFNX0VORCYmKGM9by5aX0ZJTklTSCksYz09PW8uWl9GSU5JU0g/KFA9ci5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChQKSx0aGlzLmVuZGVkPSEwLFA9PT1vLlpfT0spOmMhPT1vLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQoby5aX09LKSwhKE8uYXZhaWxfb3V0PTApKX0sbS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHkpe3RoaXMuY2h1bmtzLnB1c2goeSl9LG0ucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKHkpe3k9PT1vLlpfT0smJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1zLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj15LHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LG4uSW5mbGF0ZT1tLG4uaW5mbGF0ZT1DLG4uaW5mbGF0ZVJhdz1mdW5jdGlvbih5LFQpe3JldHVybihUPVR8fHt9KS5yYXc9ITAsQyh5LFQpfSxuLnVuZ3ppcD1DfSx7Ii4vdXRpbHMvY29tbW9uIjo0MSwiLi91dGlscy9zdHJpbmdzIjo0MiwiLi96bGliL2NvbnN0YW50cyI6NDQsIi4vemxpYi9nemhlYWRlciI6NDcsIi4vemxpYi9pbmZsYXRlIjo0OSwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZ0eXBlb2YgVWludDE2QXJyYXk8InUiJiZ0eXBlb2YgSW50MzJBcnJheTwidSI7bi5hc3NpZ249ZnVuY3Rpb24obyl7Zm9yKHZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTt1Lmxlbmd0aDspe3ZhciBwPXUuc2hpZnQoKTtpZihwKXtpZih0eXBlb2YgcCE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcihwKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIGIgaW4gcClwLmhhc093blByb3BlcnR5KGIpJiYob1tiXT1wW2JdKX19cmV0dXJuIG99LG4uc2hyaW5rQnVmPWZ1bmN0aW9uKG8sdSl7cmV0dXJuIG8ubGVuZ3RoPT09dT9vOm8uc3ViYXJyYXk/by5zdWJhcnJheSgwLHUpOihvLmxlbmd0aD11LG8pfTt2YXIgcz17YXJyYXlTZXQ6ZnVuY3Rpb24obyx1LHAsYixnKXtpZih1LnN1YmFycmF5JiZvLnN1YmFycmF5KW8uc2V0KHUuc3ViYXJyYXkocCxwK2IpLGcpO2Vsc2UgZm9yKHZhciBtPTA7bTxiO20rKylvW2crbV09dVtwK21dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKG8pe3ZhciB1LHAsYixnLG0sQztmb3IodT1iPTAscD1vLmxlbmd0aDt1PHA7dSsrKWIrPW9bdV0ubGVuZ3RoO2ZvcihDPW5ldyBVaW50OEFycmF5KGIpLHU9Zz0wLHA9by5sZW5ndGg7dTxwO3UrKyltPW9bdV0sQy5zZXQobSxnKSxnKz1tLmxlbmd0aDtyZXR1cm4gQ319LGk9e2FycmF5U2V0OmZ1bmN0aW9uKG8sdSxwLGIsZyl7Zm9yKHZhciBtPTA7bTxiO20rKylvW2crbV09dVtwK21dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKG8pe3JldHVybltdLmNvbmNhdC5hcHBseShbXSxvKX19O24uc2V0VHlwZWQ9ZnVuY3Rpb24obyl7bz8obi5CdWY4PVVpbnQ4QXJyYXksbi5CdWYxNj1VaW50MTZBcnJheSxuLkJ1ZjMyPUludDMyQXJyYXksbi5hc3NpZ24obixzKSk6KG4uQnVmOD1BcnJheSxuLkJ1ZjE2PUFycmF5LG4uQnVmMzI9QXJyYXksbi5hc3NpZ24obixpKSl9LG4uc2V0VHlwZWQocil9LHt9XSw0MjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL2NvbW1vbiIpLHM9ITAsaT0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2h7cz0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaHtpPSExfWZvcih2YXIgbz1uZXcgci5CdWY4KDI1NiksdT0wO3U8MjU2O3UrKylvW3VdPTI1Mjw9dT82OjI0ODw9dT81OjI0MDw9dT80OjIyNDw9dT8zOjE5Mjw9dT8yOjE7ZnVuY3Rpb24gcChiLGcpe2lmKGc8NjU1MzcmJihiLnN1YmFycmF5JiZpfHwhYi5zdWJhcnJheSYmcykpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxyLnNocmlua0J1ZihiLGcpKTtmb3IodmFyIG09IiIsQz0wO0M8ZztDKyspbSs9U3RyaW5nLmZyb21DaGFyQ29kZShiW0NdKTtyZXR1cm4gbX1vWzI1NF09b1syNTRdPTEsbi5zdHJpbmcyYnVmPWZ1bmN0aW9uKGIpe3ZhciBnLG0sQyx5LFQsUD1iLmxlbmd0aCxjPTA7Zm9yKHk9MDt5PFA7eSsrKSg2NDUxMiYobT1iLmNoYXJDb2RlQXQoeSkpKT09NTUyOTYmJnkrMTxQJiYoNjQ1MTImKEM9Yi5jaGFyQ29kZUF0KHkrMSkpKT09NTYzMjAmJihtPTY1NTM2KyhtLTU1Mjk2PDwxMCkrKEMtNTYzMjApLHkrKyksYys9bTwxMjg/MTptPDIwNDg/MjptPDY1NTM2PzM6NDtmb3IoZz1uZXcgci5CdWY4KGMpLHk9VD0wO1Q8Yzt5KyspKDY0NTEyJihtPWIuY2hhckNvZGVBdCh5KSkpPT01NTI5NiYmeSsxPFAmJig2NDUxMiYoQz1iLmNoYXJDb2RlQXQoeSsxKSkpPT01NjMyMCYmKG09NjU1MzYrKG0tNTUyOTY8PDEwKSsoQy01NjMyMCkseSsrKSxtPDEyOD9nW1QrK109bToobTwyMDQ4P2dbVCsrXT0xOTJ8bT4+PjY6KG08NjU1MzY/Z1tUKytdPTIyNHxtPj4+MTI6KGdbVCsrXT0yNDB8bT4+PjE4LGdbVCsrXT0xMjh8bT4+PjEyJjYzKSxnW1QrK109MTI4fG0+Pj42JjYzKSxnW1QrK109MTI4fDYzJm0pO3JldHVybiBnfSxuLmJ1ZjJiaW5zdHJpbmc9ZnVuY3Rpb24oYil7cmV0dXJuIHAoYixiLmxlbmd0aCl9LG4uYmluc3RyaW5nMmJ1Zj1mdW5jdGlvbihiKXtmb3IodmFyIGc9bmV3IHIuQnVmOChiLmxlbmd0aCksbT0wLEM9Zy5sZW5ndGg7bTxDO20rKylnW21dPWIuY2hhckNvZGVBdChtKTtyZXR1cm4gZ30sbi5idWYyc3RyaW5nPWZ1bmN0aW9uKGIsZyl7dmFyIG0sQyx5LFQsUD1nfHxiLmxlbmd0aCxjPW5ldyBBcnJheSgyKlApO2ZvcihtPUM9MDttPFA7KWlmKCh5PWJbbSsrXSk8MTI4KWNbQysrXT15O2Vsc2UgaWYoNDwoVD1vW3ldKSljW0MrK109NjU1MzMsbSs9VC0xO2Vsc2V7Zm9yKHkmPVQ9PT0yPzMxOlQ9PT0zPzE1Ojc7MTxUJiZtPFA7KXk9eTw8Nnw2MyZiW20rK10sVC0tOzE8VD9jW0MrK109NjU1MzM6eTw2NTUzNj9jW0MrK109eTooeS09NjU1MzYsY1tDKytdPTU1Mjk2fHk+PjEwJjEwMjMsY1tDKytdPTU2MzIwfDEwMjMmeSl9cmV0dXJuIHAoYyxDKX0sbi51dGY4Ym9yZGVyPWZ1bmN0aW9uKGIsZyl7dmFyIG07Zm9yKChnPWd8fGIubGVuZ3RoKT5iLmxlbmd0aCYmKGc9Yi5sZW5ndGgpLG09Zy0xOzA8PW0mJigxOTImYlttXSk9PTEyODspbS0tO3JldHVybiBtPDB8fG09PT0wP2c6bStvW2JbbV1dPmc/bTpnfX0seyIuL2NvbW1vbiI6NDF9XSw0MzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24ocixzLGksbyl7Zm9yKHZhciB1PTY1NTM1JnJ8MCxwPXI+Pj4xNiY2NTUzNXwwLGI9MDtpIT09MDspe2ZvcihpLT1iPTJlMzxpPzJlMzppO3A9cCsodT11K3NbbysrXXwwKXwwLC0tYjspO3UlPTY1NTIxLHAlPTY1NTIxfXJldHVybiB1fHA8PDE2fDB9fSx7fV0sNDQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9fSx7fV0sNDU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oKXtmb3IodmFyIHMsaT1bXSxvPTA7bzwyNTY7bysrKXtzPW87Zm9yKHZhciB1PTA7dTw4O3UrKylzPTEmcz8zOTg4MjkyMzg0XnM+Pj4xOnM+Pj4xO2lbb109c31yZXR1cm4gaX0oKTtlLmV4cG9ydHM9ZnVuY3Rpb24ocyxpLG8sdSl7dmFyIHA9cixiPXUrbztzXj0tMTtmb3IodmFyIGc9dTtnPGI7ZysrKXM9cz4+PjhecFsyNTUmKHNeaVtnXSldO3JldHVybi0xXnN9fSx7fV0sNDY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIscz10KCIuLi91dGlscy9jb21tb24iKSxpPXQoIi4vdHJlZXMiKSxvPXQoIi4vYWRsZXIzMiIpLHU9dCgiLi9jcmMzMiIpLHA9dCgiLi9tZXNzYWdlcyIpLGI9MCxnPTQsbT0wLEM9LTIseT0tMSxUPTQsUD0yLGM9OCxsPTksaD0yODYsXz0zMCxGPTE5LE89MipoKzEsZj0xNSxVPTMsWD0yNTgsUT1YK1UrMSxFPTQyLCQ9MTEzLHc9MSxrPTIsUz0zLEI9NDtmdW5jdGlvbiBMKEQsdXQpe3JldHVybiBELm1zZz1wW3V0XSx1dH1mdW5jdGlvbiBSKEQpe3JldHVybihEPDwxKS0oNDxEPzk6MCl9ZnVuY3Rpb24gcShEKXtmb3IodmFyIHV0PUQubGVuZ3RoOzA8PS0tdXQ7KURbdXRdPTB9ZnVuY3Rpb24geihEKXt2YXIgdXQ9RC5zdGF0ZSxvdD11dC5wZW5kaW5nO290PkQuYXZhaWxfb3V0JiYob3Q9RC5hdmFpbF9vdXQpLG90IT09MCYmKHMuYXJyYXlTZXQoRC5vdXRwdXQsdXQucGVuZGluZ19idWYsdXQucGVuZGluZ19vdXQsb3QsRC5uZXh0X291dCksRC5uZXh0X291dCs9b3QsdXQucGVuZGluZ19vdXQrPW90LEQudG90YWxfb3V0Kz1vdCxELmF2YWlsX291dC09b3QsdXQucGVuZGluZy09b3QsdXQucGVuZGluZz09PTAmJih1dC5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gRyhELHV0KXtpLl90cl9mbHVzaF9ibG9jayhELDA8PUQuYmxvY2tfc3RhcnQ/RC5ibG9ja19zdGFydDotMSxELnN0cnN0YXJ0LUQuYmxvY2tfc3RhcnQsdXQpLEQuYmxvY2tfc3RhcnQ9RC5zdHJzdGFydCx6KEQuc3RybSl9ZnVuY3Rpb24gbnQoRCx1dCl7RC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109dXR9ZnVuY3Rpb24gdHQoRCx1dCl7RC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109dXQ+Pj44JjI1NSxELnBlbmRpbmdfYnVmW0QucGVuZGluZysrXT0yNTUmdXR9ZnVuY3Rpb24gZXQoRCx1dCl7dmFyIG90LFYsaj1ELm1heF9jaGFpbl9sZW5ndGgsSz1ELnN0cnN0YXJ0LHB0PUQucHJldl9sZW5ndGgsdnQ9RC5uaWNlX21hdGNoLHJ0PUQuc3Ryc3RhcnQ+RC53X3NpemUtUT9ELnN0cnN0YXJ0LShELndfc2l6ZS1RKTowLGd0PUQud2luZG93LEN0PUQud19tYXNrLHh0PUQucHJldixtdD1ELnN0cnN0YXJ0K1gsenQ9Z3RbSytwdC0xXSxHdD1ndFtLK3B0XTtELnByZXZfbGVuZ3RoPj1ELmdvb2RfbWF0Y2gmJihqPj49MiksdnQ+RC5sb29rYWhlYWQmJih2dD1ELmxvb2thaGVhZCk7ZG8gaWYoZ3RbKG90PXV0KStwdF09PT1HdCYmZ3Rbb3QrcHQtMV09PT16dCYmZ3Rbb3RdPT09Z3RbS10mJmd0Wysrb3RdPT09Z3RbSysxXSl7Sys9MixvdCsrO2RvO3doaWxlKGd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZndFsrK0tdPT09Z3RbKytvdF0mJmd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZndFsrK0tdPT09Z3RbKytvdF0mJmd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZLPG10KTtpZihWPVgtKG10LUspLEs9bXQtWCxwdDxWKXtpZihELm1hdGNoX3N0YXJ0PXV0LHZ0PD0ocHQ9VikpYnJlYWs7enQ9Z3RbSytwdC0xXSxHdD1ndFtLK3B0XX19d2hpbGUoKHV0PXh0W3V0JkN0XSk+cnQmJi0taiE9MCk7cmV0dXJuIHB0PD1ELmxvb2thaGVhZD9wdDpELmxvb2thaGVhZH1mdW5jdGlvbiB3dChEKXt2YXIgdXQsb3QsVixqLEsscHQsdnQscnQsZ3QsQ3QseHQ9RC53X3NpemU7ZG97aWYoaj1ELndpbmRvd19zaXplLUQubG9va2FoZWFkLUQuc3Ryc3RhcnQsRC5zdHJzdGFydD49eHQrKHh0LVEpKXtmb3Iocy5hcnJheVNldChELndpbmRvdyxELndpbmRvdyx4dCx4dCwwKSxELm1hdGNoX3N0YXJ0LT14dCxELnN0cnN0YXJ0LT14dCxELmJsb2NrX3N0YXJ0LT14dCx1dD1vdD1ELmhhc2hfc2l6ZTtWPUQuaGVhZFstLXV0XSxELmhlYWRbdXRdPXh0PD1WP1YteHQ6MCwtLW90Oyk7Zm9yKHV0PW90PXh0O1Y9RC5wcmV2Wy0tdXRdLEQucHJldlt1dF09eHQ8PVY/Vi14dDowLC0tb3Q7KTtqKz14dH1pZihELnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHB0PUQuc3RybSx2dD1ELndpbmRvdyxydD1ELnN0cnN0YXJ0K0QubG9va2FoZWFkLGd0PWosQ3Q9dm9pZCAwLEN0PXB0LmF2YWlsX2luLGd0PEN0JiYoQ3Q9Z3QpLG90PUN0PT09MD8wOihwdC5hdmFpbF9pbi09Q3Qscy5hcnJheVNldCh2dCxwdC5pbnB1dCxwdC5uZXh0X2luLEN0LHJ0KSxwdC5zdGF0ZS53cmFwPT09MT9wdC5hZGxlcj1vKHB0LmFkbGVyLHZ0LEN0LHJ0KTpwdC5zdGF0ZS53cmFwPT09MiYmKHB0LmFkbGVyPXUocHQuYWRsZXIsdnQsQ3QscnQpKSxwdC5uZXh0X2luKz1DdCxwdC50b3RhbF9pbis9Q3QsQ3QpLEQubG9va2FoZWFkKz1vdCxELmxvb2thaGVhZCtELmluc2VydD49VSlmb3IoSz1ELnN0cnN0YXJ0LUQuaW5zZXJ0LEQuaW5zX2g9RC53aW5kb3dbS10sRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0srMV0pJkQuaGFzaF9tYXNrO0QuaW5zZXJ0JiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0srVS0xXSkmRC5oYXNoX21hc2ssRC5wcmV2W0smRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09SyxLKyssRC5pbnNlcnQtLSwhKEQubG9va2FoZWFkK0QuaW5zZXJ0PFUpKTspO313aGlsZShELmxvb2thaGVhZDxRJiZELnN0cm0uYXZhaWxfaW4hPT0wKX1mdW5jdGlvbiBTdChELHV0KXtmb3IodmFyIG90LFY7Oyl7aWYoRC5sb29rYWhlYWQ8USl7aWYod3QoRCksRC5sb29rYWhlYWQ8USYmdXQ9PT1iKXJldHVybiB3O2lmKEQubG9va2FoZWFkPT09MClicmVha31pZihvdD0wLEQubG9va2FoZWFkPj1VJiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0Quc3Ryc3RhcnQrVS0xXSkmRC5oYXNoX21hc2ssb3Q9RC5wcmV2W0Quc3Ryc3RhcnQmRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09RC5zdHJzdGFydCksb3QhPT0wJiZELnN0cnN0YXJ0LW90PD1ELndfc2l6ZS1RJiYoRC5tYXRjaF9sZW5ndGg9ZXQoRCxvdCkpLEQubWF0Y2hfbGVuZ3RoPj1VKWlmKFY9aS5fdHJfdGFsbHkoRCxELnN0cnN0YXJ0LUQubWF0Y2hfc3RhcnQsRC5tYXRjaF9sZW5ndGgtVSksRC5sb29rYWhlYWQtPUQubWF0Y2hfbGVuZ3RoLEQubWF0Y2hfbGVuZ3RoPD1ELm1heF9sYXp5X21hdGNoJiZELmxvb2thaGVhZD49VSl7Zm9yKEQubWF0Y2hfbGVuZ3RoLS07RC5zdHJzdGFydCsrLEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQsLS1ELm1hdGNoX2xlbmd0aCE9MDspO0Quc3Ryc3RhcnQrK31lbHNlIEQuc3Ryc3RhcnQrPUQubWF0Y2hfbGVuZ3RoLEQubWF0Y2hfbGVuZ3RoPTAsRC5pbnNfaD1ELndpbmRvd1tELnN0cnN0YXJ0XSxELmluc19oPShELmluc19oPDxELmhhc2hfc2hpZnReRC53aW5kb3dbRC5zdHJzdGFydCsxXSkmRC5oYXNoX21hc2s7ZWxzZSBWPWkuX3RyX3RhbGx5KEQsMCxELndpbmRvd1tELnN0cnN0YXJ0XSksRC5sb29rYWhlYWQtLSxELnN0cnN0YXJ0Kys7aWYoViYmKEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB3fXJldHVybiBELmluc2VydD1ELnN0cnN0YXJ0PFUtMT9ELnN0cnN0YXJ0OlUtMSx1dD09PWc/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTpELmxhc3RfbGl0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCk/dzprfWZ1bmN0aW9uIFR0KEQsdXQpe2Zvcih2YXIgb3QsVixqOzspe2lmKEQubG9va2FoZWFkPFEpe2lmKHd0KEQpLEQubG9va2FoZWFkPFEmJnV0PT09YilyZXR1cm4gdztpZihELmxvb2thaGVhZD09PTApYnJlYWt9aWYob3Q9MCxELmxvb2thaGVhZD49VSYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLEQucHJldl9sZW5ndGg9RC5tYXRjaF9sZW5ndGgsRC5wcmV2X21hdGNoPUQubWF0Y2hfc3RhcnQsRC5tYXRjaF9sZW5ndGg9VS0xLG90IT09MCYmRC5wcmV2X2xlbmd0aDxELm1heF9sYXp5X21hdGNoJiZELnN0cnN0YXJ0LW90PD1ELndfc2l6ZS1RJiYoRC5tYXRjaF9sZW5ndGg9ZXQoRCxvdCksRC5tYXRjaF9sZW5ndGg8PTUmJihELnN0cmF0ZWd5PT09MXx8RC5tYXRjaF9sZW5ndGg9PT1VJiY0MDk2PEQuc3Ryc3RhcnQtRC5tYXRjaF9zdGFydCkmJihELm1hdGNoX2xlbmd0aD1VLTEpKSxELnByZXZfbGVuZ3RoPj1VJiZELm1hdGNoX2xlbmd0aDw9RC5wcmV2X2xlbmd0aCl7Zm9yKGo9RC5zdHJzdGFydCtELmxvb2thaGVhZC1VLFY9aS5fdHJfdGFsbHkoRCxELnN0cnN0YXJ0LTEtRC5wcmV2X21hdGNoLEQucHJldl9sZW5ndGgtVSksRC5sb29rYWhlYWQtPUQucHJldl9sZW5ndGgtMSxELnByZXZfbGVuZ3RoLT0yOysrRC5zdHJzdGFydDw9aiYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLC0tRC5wcmV2X2xlbmd0aCE9MDspO2lmKEQubWF0Y2hfYXZhaWxhYmxlPTAsRC5tYXRjaF9sZW5ndGg9VS0xLEQuc3Ryc3RhcnQrKyxWJiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHd9ZWxzZSBpZihELm1hdGNoX2F2YWlsYWJsZSl7aWYoKFY9aS5fdHJfdGFsbHkoRCwwLEQud2luZG93W0Quc3Ryc3RhcnQtMV0pKSYmRyhELCExKSxELnN0cnN0YXJ0KyssRC5sb29rYWhlYWQtLSxELnN0cm0uYXZhaWxfb3V0PT09MClyZXR1cm4gd31lbHNlIEQubWF0Y2hfYXZhaWxhYmxlPTEsRC5zdHJzdGFydCsrLEQubG9va2FoZWFkLS19cmV0dXJuIEQubWF0Y2hfYXZhaWxhYmxlJiYoVj1pLl90cl90YWxseShELDAsRC53aW5kb3dbRC5zdHJzdGFydC0xXSksRC5tYXRjaF9hdmFpbGFibGU9MCksRC5pbnNlcnQ9RC5zdHJzdGFydDxVLTE/RC5zdHJzdGFydDpVLTEsdXQ9PT1nPyhHKEQsITApLEQuc3RybS5hdmFpbF9vdXQ9PT0wP1M6Qik6RC5sYXN0X2xpdCYmKEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApP3c6a31mdW5jdGlvbiBrdChELHV0LG90LFYsail7dGhpcy5nb29kX2xlbmd0aD1ELHRoaXMubWF4X2xhenk9dXQsdGhpcy5uaWNlX2xlbmd0aD1vdCx0aGlzLm1heF9jaGFpbj1WLHRoaXMuZnVuYz1qfWZ1bmN0aW9uIEx0KCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9Yyx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgcy5CdWYxNigyKk8pLHRoaXMuZHluX2R0cmVlPW5ldyBzLkJ1ZjE2KDIqKDIqXysxKSksdGhpcy5ibF90cmVlPW5ldyBzLkJ1ZjE2KDIqKDIqRisxKSkscSh0aGlzLmR5bl9sdHJlZSkscSh0aGlzLmR5bl9kdHJlZSkscSh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBzLkJ1ZjE2KGYrMSksdGhpcy5oZWFwPW5ldyBzLkJ1ZjE2KDIqaCsxKSxxKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBzLkJ1ZjE2KDIqaCsxKSxxKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIEJ0KEQpe3ZhciB1dDtyZXR1cm4gRCYmRC5zdGF0ZT8oRC50b3RhbF9pbj1ELnRvdGFsX291dD0wLEQuZGF0YV90eXBlPVAsKHV0PUQuc3RhdGUpLnBlbmRpbmc9MCx1dC5wZW5kaW5nX291dD0wLHV0LndyYXA8MCYmKHV0LndyYXA9LXV0LndyYXApLHV0LnN0YXR1cz11dC53cmFwP0U6JCxELmFkbGVyPXV0LndyYXA9PT0yPzA6MSx1dC5sYXN0X2ZsdXNoPWIsaS5fdHJfaW5pdCh1dCksbSk6TChELEMpfWZ1bmN0aW9uICR0KEQpe3ZhciB1dD1CdChEKTtyZXR1cm4gdXQ9PT1tJiZmdW5jdGlvbihvdCl7b3Qud2luZG93X3NpemU9MipvdC53X3NpemUscShvdC5oZWFkKSxvdC5tYXhfbGF6eV9tYXRjaD1yW290LmxldmVsXS5tYXhfbGF6eSxvdC5nb29kX21hdGNoPXJbb3QubGV2ZWxdLmdvb2RfbGVuZ3RoLG90Lm5pY2VfbWF0Y2g9cltvdC5sZXZlbF0ubmljZV9sZW5ndGgsb3QubWF4X2NoYWluX2xlbmd0aD1yW290LmxldmVsXS5tYXhfY2hhaW4sb3Quc3Ryc3RhcnQ9MCxvdC5ibG9ja19zdGFydD0wLG90Lmxvb2thaGVhZD0wLG90Lmluc2VydD0wLG90Lm1hdGNoX2xlbmd0aD1vdC5wcmV2X2xlbmd0aD1VLTEsb3QubWF0Y2hfYXZhaWxhYmxlPTAsb3QuaW5zX2g9MH0oRC5zdGF0ZSksdXR9ZnVuY3Rpb24gS3QoRCx1dCxvdCxWLGosSyl7aWYoIUQpcmV0dXJuIEM7dmFyIHB0PTE7aWYodXQ9PT15JiYodXQ9NiksVjwwPyhwdD0wLFY9LVYpOjE1PFYmJihwdD0yLFYtPTE2KSxqPDF8fGw8anx8b3QhPT1jfHxWPDh8fDE1PFZ8fHV0PDB8fDk8dXR8fEs8MHx8VDxLKXJldHVybiBMKEQsQyk7Vj09PTgmJihWPTkpO3ZhciB2dD1uZXcgTHQ7cmV0dXJuKEQuc3RhdGU9dnQpLnN0cm09RCx2dC53cmFwPXB0LHZ0Lmd6aGVhZD1udWxsLHZ0LndfYml0cz1WLHZ0Lndfc2l6ZT0xPDx2dC53X2JpdHMsdnQud19tYXNrPXZ0Lndfc2l6ZS0xLHZ0Lmhhc2hfYml0cz1qKzcsdnQuaGFzaF9zaXplPTE8PHZ0Lmhhc2hfYml0cyx2dC5oYXNoX21hc2s9dnQuaGFzaF9zaXplLTEsdnQuaGFzaF9zaGlmdD1+figodnQuaGFzaF9iaXRzK1UtMSkvVSksdnQud2luZG93PW5ldyBzLkJ1ZjgoMip2dC53X3NpemUpLHZ0LmhlYWQ9bmV3IHMuQnVmMTYodnQuaGFzaF9zaXplKSx2dC5wcmV2PW5ldyBzLkJ1ZjE2KHZ0Lndfc2l6ZSksdnQubGl0X2J1ZnNpemU9MTw8ais2LHZ0LnBlbmRpbmdfYnVmX3NpemU9NCp2dC5saXRfYnVmc2l6ZSx2dC5wZW5kaW5nX2J1Zj1uZXcgcy5CdWY4KHZ0LnBlbmRpbmdfYnVmX3NpemUpLHZ0LmRfYnVmPTEqdnQubGl0X2J1ZnNpemUsdnQubF9idWY9Myp2dC5saXRfYnVmc2l6ZSx2dC5sZXZlbD11dCx2dC5zdHJhdGVneT1LLHZ0Lm1ldGhvZD1vdCwkdChEKX1yPVtuZXcga3QoMCwwLDAsMCxmdW5jdGlvbihELHV0KXt2YXIgb3Q9NjU1MzU7Zm9yKG90PkQucGVuZGluZ19idWZfc2l6ZS01JiYob3Q9RC5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKEQubG9va2FoZWFkPD0xKXtpZih3dChEKSxELmxvb2thaGVhZD09PTAmJnV0PT09YilyZXR1cm4gdztpZihELmxvb2thaGVhZD09PTApYnJlYWt9RC5zdHJzdGFydCs9RC5sb29rYWhlYWQsRC5sb29rYWhlYWQ9MDt2YXIgVj1ELmJsb2NrX3N0YXJ0K290O2lmKChELnN0cnN0YXJ0PT09MHx8RC5zdHJzdGFydD49VikmJihELmxvb2thaGVhZD1ELnN0cnN0YXJ0LVYsRC5zdHJzdGFydD1WLEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApfHxELnN0cnN0YXJ0LUQuYmxvY2tfc3RhcnQ+PUQud19zaXplLVEmJihHKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gd31yZXR1cm4gRC5pbnNlcnQ9MCx1dD09PWc/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTooRC5zdHJzdGFydD5ELmJsb2NrX3N0YXJ0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0KSx3KX0pLG5ldyBrdCg0LDQsOCw0LFN0KSxuZXcga3QoNCw1LDE2LDgsU3QpLG5ldyBrdCg0LDYsMzIsMzIsU3QpLG5ldyBrdCg0LDQsMTYsMTYsVHQpLG5ldyBrdCg4LDE2LDMyLDMyLFR0KSxuZXcga3QoOCwxNiwxMjgsMTI4LFR0KSxuZXcga3QoOCwzMiwxMjgsMjU2LFR0KSxuZXcga3QoMzIsMTI4LDI1OCwxMDI0LFR0KSxuZXcga3QoMzIsMjU4LDI1OCw0MDk2LFR0KV0sbi5kZWZsYXRlSW5pdD1mdW5jdGlvbihELHV0KXtyZXR1cm4gS3QoRCx1dCxjLDE1LDgsMCl9LG4uZGVmbGF0ZUluaXQyPUt0LG4uZGVmbGF0ZVJlc2V0PSR0LG4uZGVmbGF0ZVJlc2V0S2VlcD1CdCxuLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24oRCx1dCl7cmV0dXJuIEQmJkQuc3RhdGU/RC5zdGF0ZS53cmFwIT09Mj9DOihELnN0YXRlLmd6aGVhZD11dCxtKTpDfSxuLmRlZmxhdGU9ZnVuY3Rpb24oRCx1dCl7dmFyIG90LFYsaixLO2lmKCFEfHwhRC5zdGF0ZXx8NTx1dHx8dXQ8MClyZXR1cm4gRD9MKEQsQyk6QztpZihWPUQuc3RhdGUsIUQub3V0cHV0fHwhRC5pbnB1dCYmRC5hdmFpbF9pbiE9PTB8fFYuc3RhdHVzPT09NjY2JiZ1dCE9PWcpcmV0dXJuIEwoRCxELmF2YWlsX291dD09PTA/LTU6Qyk7aWYoVi5zdHJtPUQsb3Q9Vi5sYXN0X2ZsdXNoLFYubGFzdF9mbHVzaD11dCxWLnN0YXR1cz09PUUpaWYoVi53cmFwPT09MilELmFkbGVyPTAsbnQoViwzMSksbnQoViwxMzkpLG50KFYsOCksVi5nemhlYWQ/KG50KFYsKFYuZ3poZWFkLnRleHQ/MTowKSsoVi5nemhlYWQuaGNyYz8yOjApKyhWLmd6aGVhZC5leHRyYT80OjApKyhWLmd6aGVhZC5uYW1lPzg6MCkrKFYuZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLG50KFYsMjU1JlYuZ3poZWFkLnRpbWUpLG50KFYsVi5nemhlYWQudGltZT4+OCYyNTUpLG50KFYsVi5nemhlYWQudGltZT4+MTYmMjU1KSxudChWLFYuZ3poZWFkLnRpbWU+PjI0JjI1NSksbnQoVixWLmxldmVsPT09OT8yOjI8PVYuc3RyYXRlZ3l8fFYubGV2ZWw8Mj80OjApLG50KFYsMjU1JlYuZ3poZWFkLm9zKSxWLmd6aGVhZC5leHRyYSYmVi5nemhlYWQuZXh0cmEubGVuZ3RoJiYobnQoViwyNTUmVi5nemhlYWQuZXh0cmEubGVuZ3RoKSxudChWLFYuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxWLmd6aGVhZC5oY3JjJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmcsMCkpLFYuZ3ppbmRleD0wLFYuc3RhdHVzPTY5KToobnQoViwwKSxudChWLDApLG50KFYsMCksbnQoViwwKSxudChWLDApLG50KFYsVi5sZXZlbD09PTk/MjoyPD1WLnN0cmF0ZWd5fHxWLmxldmVsPDI/NDowKSxudChWLDMpLFYuc3RhdHVzPSQpO2Vsc2V7dmFyIHB0PWMrKFYud19iaXRzLTg8PDQpPDw4O3B0fD0oMjw9Vi5zdHJhdGVneXx8Vi5sZXZlbDwyPzA6Vi5sZXZlbDw2PzE6Vi5sZXZlbD09PTY/MjozKTw8NixWLnN0cnN0YXJ0IT09MCYmKHB0fD0zMikscHQrPTMxLXB0JTMxLFYuc3RhdHVzPSQsdHQoVixwdCksVi5zdHJzdGFydCE9PTAmJih0dChWLEQuYWRsZXI+Pj4xNiksdHQoViw2NTUzNSZELmFkbGVyKSksRC5hZGxlcj0xfWlmKFYuc3RhdHVzPT09NjkpaWYoVi5nemhlYWQuZXh0cmEpe2ZvcihqPVYucGVuZGluZztWLmd6aW5kZXg8KDY1NTM1JlYuZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihWLnBlbmRpbmchPT1WLnBlbmRpbmdfYnVmX3NpemV8fChWLmd6aGVhZC5oY3JjJiZWLnBlbmRpbmc+aiYmKEQuYWRsZXI9dShELmFkbGVyLFYucGVuZGluZ19idWYsVi5wZW5kaW5nLWosaikpLHooRCksaj1WLnBlbmRpbmcsVi5wZW5kaW5nIT09Vi5wZW5kaW5nX2J1Zl9zaXplKSk7KW50KFYsMjU1JlYuZ3poZWFkLmV4dHJhW1YuZ3ppbmRleF0pLFYuZ3ppbmRleCsrO1YuZ3poZWFkLmhjcmMmJlYucGVuZGluZz5qJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmctaixqKSksVi5nemluZGV4PT09Vi5nemhlYWQuZXh0cmEubGVuZ3RoJiYoVi5nemluZGV4PTAsVi5zdGF0dXM9NzMpfWVsc2UgVi5zdGF0dXM9NzM7aWYoVi5zdGF0dXM9PT03MylpZihWLmd6aGVhZC5uYW1lKXtqPVYucGVuZGluZztkb3tpZihWLnBlbmRpbmc9PT1WLnBlbmRpbmdfYnVmX3NpemUmJihWLmd6aGVhZC5oY3JjJiZWLnBlbmRpbmc+aiYmKEQuYWRsZXI9dShELmFkbGVyLFYucGVuZGluZ19idWYsVi5wZW5kaW5nLWosaikpLHooRCksaj1WLnBlbmRpbmcsVi5wZW5kaW5nPT09Vi5wZW5kaW5nX2J1Zl9zaXplKSl7Sz0xO2JyZWFrfUs9Vi5nemluZGV4PFYuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZWLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoVi5nemluZGV4KyspOjAsbnQoVixLKX13aGlsZShLIT09MCk7Vi5nemhlYWQuaGNyYyYmVi5wZW5kaW5nPmomJihELmFkbGVyPXUoRC5hZGxlcixWLnBlbmRpbmdfYnVmLFYucGVuZGluZy1qLGopKSxLPT09MCYmKFYuZ3ppbmRleD0wLFYuc3RhdHVzPTkxKX1lbHNlIFYuc3RhdHVzPTkxO2lmKFYuc3RhdHVzPT09OTEpaWYoVi5nemhlYWQuY29tbWVudCl7aj1WLnBlbmRpbmc7ZG97aWYoVi5wZW5kaW5nPT09Vi5wZW5kaW5nX2J1Zl9zaXplJiYoVi5nemhlYWQuaGNyYyYmVi5wZW5kaW5nPmomJihELmFkbGVyPXUoRC5hZGxlcixWLnBlbmRpbmdfYnVmLFYucGVuZGluZy1qLGopKSx6KEQpLGo9Vi5wZW5kaW5nLFYucGVuZGluZz09PVYucGVuZGluZ19idWZfc2l6ZSkpe0s9MTticmVha31LPVYuZ3ppbmRleDxWLmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmVi5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KFYuZ3ppbmRleCsrKTowLG50KFYsSyl9d2hpbGUoSyE9PTApO1YuZ3poZWFkLmhjcmMmJlYucGVuZGluZz5qJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmctaixqKSksSz09PTAmJihWLnN0YXR1cz0xMDMpfWVsc2UgVi5zdGF0dXM9MTAzO2lmKFYuc3RhdHVzPT09MTAzJiYoVi5nemhlYWQuaGNyYz8oVi5wZW5kaW5nKzI+Vi5wZW5kaW5nX2J1Zl9zaXplJiZ6KEQpLFYucGVuZGluZysyPD1WLnBlbmRpbmdfYnVmX3NpemUmJihudChWLDI1NSZELmFkbGVyKSxudChWLEQuYWRsZXI+PjgmMjU1KSxELmFkbGVyPTAsVi5zdGF0dXM9JCkpOlYuc3RhdHVzPSQpLFYucGVuZGluZyE9PTApe2lmKHooRCksRC5hdmFpbF9vdXQ9PT0wKXJldHVybiBWLmxhc3RfZmx1c2g9LTEsbX1lbHNlIGlmKEQuYXZhaWxfaW49PT0wJiZSKHV0KTw9UihvdCkmJnV0IT09ZylyZXR1cm4gTChELC01KTtpZihWLnN0YXR1cz09PTY2NiYmRC5hdmFpbF9pbiE9PTApcmV0dXJuIEwoRCwtNSk7aWYoRC5hdmFpbF9pbiE9PTB8fFYubG9va2FoZWFkIT09MHx8dXQhPT1iJiZWLnN0YXR1cyE9PTY2Nil7dmFyIHZ0PVYuc3RyYXRlZ3k9PT0yP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0Ozspe2lmKHJ0Lmxvb2thaGVhZD09PTAmJih3dChydCkscnQubG9va2FoZWFkPT09MCkpe2lmKGd0PT09YilyZXR1cm4gdzticmVha31pZihydC5tYXRjaF9sZW5ndGg9MCxDdD1pLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyssQ3QmJihHKHJ0LCExKSxydC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB3fXJldHVybiBydC5pbnNlcnQ9MCxndD09PWc/KEcocnQsITApLHJ0LnN0cm0uYXZhaWxfb3V0PT09MD9TOkIpOnJ0Lmxhc3RfbGl0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKT93Omt9KFYsdXQpOlYuc3RyYXRlZ3k9PT0zP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0LHh0LG10LHp0LEd0PXJ0LndpbmRvdzs7KXtpZihydC5sb29rYWhlYWQ8PVgpe2lmKHd0KHJ0KSxydC5sb29rYWhlYWQ8PVgmJmd0PT09YilyZXR1cm4gdztpZihydC5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKHJ0Lm1hdGNoX2xlbmd0aD0wLHJ0Lmxvb2thaGVhZD49VSYmMDxydC5zdHJzdGFydCYmKHh0PUd0W210PXJ0LnN0cnN0YXJ0LTFdKT09PUd0WysrbXRdJiZ4dD09PUd0WysrbXRdJiZ4dD09PUd0WysrbXRdKXt6dD1ydC5zdHJzdGFydCtYO2RvO3doaWxlKHh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJm10PHp0KTtydC5tYXRjaF9sZW5ndGg9WC0oenQtbXQpLHJ0Lm1hdGNoX2xlbmd0aD5ydC5sb29rYWhlYWQmJihydC5tYXRjaF9sZW5ndGg9cnQubG9va2FoZWFkKX1pZihydC5tYXRjaF9sZW5ndGg+PVU/KEN0PWkuX3RyX3RhbGx5KHJ0LDEscnQubWF0Y2hfbGVuZ3RoLVUpLHJ0Lmxvb2thaGVhZC09cnQubWF0Y2hfbGVuZ3RoLHJ0LnN0cnN0YXJ0Kz1ydC5tYXRjaF9sZW5ndGgscnQubWF0Y2hfbGVuZ3RoPTApOihDdD1pLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyspLEN0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gd31yZXR1cm4gcnQuaW5zZXJ0PTAsZ3Q9PT1nPyhHKHJ0LCEwKSxydC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTpydC5sYXN0X2xpdCYmKEcocnQsITEpLHJ0LnN0cm0uYXZhaWxfb3V0PT09MCk/dzprfShWLHV0KTpyW1YubGV2ZWxdLmZ1bmMoVix1dCk7aWYodnQhPT1TJiZ2dCE9PUJ8fChWLnN0YXR1cz02NjYpLHZ0PT09d3x8dnQ9PT1TKXJldHVybiBELmF2YWlsX291dD09PTAmJihWLmxhc3RfZmx1c2g9LTEpLG07aWYodnQ9PT1rJiYodXQ9PT0xP2kuX3RyX2FsaWduKFYpOnV0IT09NSYmKGkuX3RyX3N0b3JlZF9ibG9jayhWLDAsMCwhMSksdXQ9PT0zJiYocShWLmhlYWQpLFYubG9va2FoZWFkPT09MCYmKFYuc3Ryc3RhcnQ9MCxWLmJsb2NrX3N0YXJ0PTAsVi5pbnNlcnQ9MCkpKSx6KEQpLEQuYXZhaWxfb3V0PT09MCkpcmV0dXJuIFYubGFzdF9mbHVzaD0tMSxtfXJldHVybiB1dCE9PWc/bTpWLndyYXA8PTA/MTooVi53cmFwPT09Mj8obnQoViwyNTUmRC5hZGxlciksbnQoVixELmFkbGVyPj44JjI1NSksbnQoVixELmFkbGVyPj4xNiYyNTUpLG50KFYsRC5hZGxlcj4+MjQmMjU1KSxudChWLDI1NSZELnRvdGFsX2luKSxudChWLEQudG90YWxfaW4+PjgmMjU1KSxudChWLEQudG90YWxfaW4+PjE2JjI1NSksbnQoVixELnRvdGFsX2luPj4yNCYyNTUpKToodHQoVixELmFkbGVyPj4+MTYpLHR0KFYsNjU1MzUmRC5hZGxlcikpLHooRCksMDxWLndyYXAmJihWLndyYXA9LVYud3JhcCksVi5wZW5kaW5nIT09MD9tOjEpfSxuLmRlZmxhdGVFbmQ9ZnVuY3Rpb24oRCl7dmFyIHV0O3JldHVybiBEJiZELnN0YXRlPyh1dD1ELnN0YXRlLnN0YXR1cykhPT1FJiZ1dCE9PTY5JiZ1dCE9PTczJiZ1dCE9PTkxJiZ1dCE9PTEwMyYmdXQhPT0kJiZ1dCE9PTY2Nj9MKEQsQyk6KEQuc3RhdGU9bnVsbCx1dD09PSQ/TChELC0zKTptKTpDfSxuLmRlZmxhdGVTZXREaWN0aW9uYXJ5PWZ1bmN0aW9uKEQsdXQpe3ZhciBvdCxWLGosSyxwdCx2dCxydCxndCxDdD11dC5sZW5ndGg7aWYoIUR8fCFELnN0YXRlfHwoSz0ob3Q9RC5zdGF0ZSkud3JhcCk9PT0yfHxLPT09MSYmb3Quc3RhdHVzIT09RXx8b3QubG9va2FoZWFkKXJldHVybiBDO2ZvcihLPT09MSYmKEQuYWRsZXI9byhELmFkbGVyLHV0LEN0LDApKSxvdC53cmFwPTAsQ3Q+PW90Lndfc2l6ZSYmKEs9PT0wJiYocShvdC5oZWFkKSxvdC5zdHJzdGFydD0wLG90LmJsb2NrX3N0YXJ0PTAsb3QuaW5zZXJ0PTApLGd0PW5ldyBzLkJ1Zjgob3Qud19zaXplKSxzLmFycmF5U2V0KGd0LHV0LEN0LW90Lndfc2l6ZSxvdC53X3NpemUsMCksdXQ9Z3QsQ3Q9b3Qud19zaXplKSxwdD1ELmF2YWlsX2luLHZ0PUQubmV4dF9pbixydD1ELmlucHV0LEQuYXZhaWxfaW49Q3QsRC5uZXh0X2luPTAsRC5pbnB1dD11dCx3dChvdCk7b3QubG9va2FoZWFkPj1VOyl7Zm9yKFY9b3Quc3Ryc3RhcnQsaj1vdC5sb29rYWhlYWQtKFUtMSk7b3QuaW5zX2g9KG90Lmluc19oPDxvdC5oYXNoX3NoaWZ0Xm90LndpbmRvd1tWK1UtMV0pJm90Lmhhc2hfbWFzayxvdC5wcmV2W1Ymb3Qud19tYXNrXT1vdC5oZWFkW290Lmluc19oXSxvdC5oZWFkW290Lmluc19oXT1WLFYrKywtLWo7KTtvdC5zdHJzdGFydD1WLG90Lmxvb2thaGVhZD1VLTEsd3Qob3QpfXJldHVybiBvdC5zdHJzdGFydCs9b3QubG9va2FoZWFkLG90LmJsb2NrX3N0YXJ0PW90LnN0cnN0YXJ0LG90Lmluc2VydD1vdC5sb29rYWhlYWQsb3QubG9va2FoZWFkPTAsb3QubWF0Y2hfbGVuZ3RoPW90LnByZXZfbGVuZ3RoPVUtMSxvdC5tYXRjaF9hdmFpbGFibGU9MCxELm5leHRfaW49dnQsRC5pbnB1dD1ydCxELmF2YWlsX2luPXB0LG90LndyYXA9SyxtfSxuLmRlZmxhdGVJbmZvPSJwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIn0seyIuLi91dGlscy9jb21tb24iOjQxLCIuL2FkbGVyMzIiOjQzLCIuL2NyYzMyIjo0NSwiLi9tZXNzYWdlcyI6NTEsIi4vdHJlZXMiOjUyfV0sNDc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9fSx7fV0sNDg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKHIscyl7dmFyIGksbyx1LHAsYixnLG0sQyx5LFQsUCxjLGwsaCxfLEYsTyxmLFUsWCxRLEUsJCx3LGs7aT1yLnN0YXRlLG89ci5uZXh0X2luLHc9ci5pbnB1dCx1PW8rKHIuYXZhaWxfaW4tNSkscD1yLm5leHRfb3V0LGs9ci5vdXRwdXQsYj1wLShzLXIuYXZhaWxfb3V0KSxnPXArKHIuYXZhaWxfb3V0LTI1NyksbT1pLmRtYXgsQz1pLndzaXplLHk9aS53aGF2ZSxUPWkud25leHQsUD1pLndpbmRvdyxjPWkuaG9sZCxsPWkuYml0cyxoPWkubGVuY29kZSxfPWkuZGlzdGNvZGUsRj0oMTw8aS5sZW5iaXRzKS0xLE89KDE8PGkuZGlzdGJpdHMpLTE7dDpkb3tsPDE1JiYoYys9d1tvKytdPDxsLGwrPTgsYys9d1tvKytdPDxsLGwrPTgpLGY9aFtjJkZdO2U6Zm9yKDs7KXtpZihjPj4+PVU9Zj4+PjI0LGwtPVUsKFU9Zj4+PjE2JjI1NSk9PT0wKWtbcCsrXT02NTUzNSZmO2Vsc2V7aWYoISgxNiZVKSl7aWYoISg2NCZVKSl7Zj1oWyg2NTUzNSZmKSsoYyYoMTw8VSktMSldO2NvbnRpbnVlIGV9aWYoMzImVSl7aS5tb2RlPTEyO2JyZWFrIHR9ci5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsaS5tb2RlPTMwO2JyZWFrIHR9WD02NTUzNSZmLChVJj0xNSkmJihsPFUmJihjKz13W28rK108PGwsbCs9OCksWCs9YyYoMTw8VSktMSxjPj4+PVUsbC09VSksbDwxNSYmKGMrPXdbbysrXTw8bCxsKz04LGMrPXdbbysrXTw8bCxsKz04KSxmPV9bYyZPXTtuOmZvcig7Oyl7aWYoYz4+Pj1VPWY+Pj4yNCxsLT1VLCEoMTYmKFU9Zj4+PjE2JjI1NSkpKXtpZighKDY0JlUpKXtmPV9bKDY1NTM1JmYpKyhjJigxPDxVKS0xKV07Y29udGludWUgbn1yLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixpLm1vZGU9MzA7YnJlYWsgdH1pZihRPTY1NTM1JmYsbDwoVSY9MTUpJiYoYys9d1tvKytdPDxsLChsKz04KTxVJiYoYys9d1tvKytdPDxsLGwrPTgpKSxtPChRKz1jJigxPDxVKS0xKSl7ci5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixpLm1vZGU9MzA7YnJlYWsgdH1pZihjPj4+PVUsbC09VSwoVT1wLWIpPFEpe2lmKHk8KFU9US1VKSYmaS5zYW5lKXtyLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGkubW9kZT0zMDticmVhayB0fWlmKCQ9UCwoRT0wKT09PVQpe2lmKEUrPUMtVSxVPFgpe2ZvcihYLT1VO2tbcCsrXT1QW0UrK10sLS1VOyk7RT1wLVEsJD1rfX1lbHNlIGlmKFQ8VSl7aWYoRSs9QytULVUsKFUtPVQpPFgpe2ZvcihYLT1VO2tbcCsrXT1QW0UrK10sLS1VOyk7aWYoRT0wLFQ8WCl7Zm9yKFgtPVU9VDtrW3ArK109UFtFKytdLC0tVTspO0U9cC1RLCQ9a319fWVsc2UgaWYoRSs9VC1VLFU8WCl7Zm9yKFgtPVU7a1twKytdPVBbRSsrXSwtLVU7KTtFPXAtUSwkPWt9Zm9yKDsyPFg7KWtbcCsrXT0kW0UrK10sa1twKytdPSRbRSsrXSxrW3ArK109JFtFKytdLFgtPTM7WCYmKGtbcCsrXT0kW0UrK10sMTxYJiYoa1twKytdPSRbRSsrXSkpfWVsc2V7Zm9yKEU9cC1RO2tbcCsrXT1rW0UrK10sa1twKytdPWtbRSsrXSxrW3ArK109a1tFKytdLDI8KFgtPTMpOyk7WCYmKGtbcCsrXT1rW0UrK10sMTxYJiYoa1twKytdPWtbRSsrXSkpfWJyZWFrfX1icmVha319d2hpbGUobzx1JiZwPGcpO28tPVg9bD4+MyxjJj0oMTw8KGwtPVg8PDMpKS0xLHIubmV4dF9pbj1vLHIubmV4dF9vdXQ9cCxyLmF2YWlsX2luPW88dT91LW8rNTo1LShvLXUpLHIuYXZhaWxfb3V0PXA8Zz9nLXArMjU3OjI1Ny0ocC1nKSxpLmhvbGQ9YyxpLmJpdHM9bH19LHt9XSw0OTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuLi91dGlscy9jb21tb24iKSxzPXQoIi4vYWRsZXIzMiIpLGk9dCgiLi9jcmMzMiIpLG89dCgiLi9pbmZmYXN0IiksdT10KCIuL2luZnRyZWVzIikscD0xLGI9MixnPTAsbT0tMixDPTEseT04NTIsVD01OTI7ZnVuY3Rpb24gUChFKXtyZXR1cm4oRT4+PjI0JjI1NSkrKEU+Pj44JjY1MjgwKSsoKDY1MjgwJkUpPDw4KSsoKDI1NSZFKTw8MjQpfWZ1bmN0aW9uIGMoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IHIuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IHIuQnVmMTYoMjg4KSx0aGlzLmxlbmR5bj1udWxsLHRoaXMuZGlzdGR5bj1udWxsLHRoaXMuc2FuZT0wLHRoaXMuYmFjaz0wLHRoaXMud2FzPTB9ZnVuY3Rpb24gbChFKXt2YXIgJDtyZXR1cm4gRSYmRS5zdGF0ZT8oJD1FLnN0YXRlLEUudG90YWxfaW49RS50b3RhbF9vdXQ9JC50b3RhbD0wLEUubXNnPSIiLCQud3JhcCYmKEUuYWRsZXI9MSYkLndyYXApLCQubW9kZT1DLCQubGFzdD0wLCQuaGF2ZWRpY3Q9MCwkLmRtYXg9MzI3NjgsJC5oZWFkPW51bGwsJC5ob2xkPTAsJC5iaXRzPTAsJC5sZW5jb2RlPSQubGVuZHluPW5ldyByLkJ1ZjMyKHkpLCQuZGlzdGNvZGU9JC5kaXN0ZHluPW5ldyByLkJ1ZjMyKFQpLCQuc2FuZT0xLCQuYmFjaz0tMSxnKTptfWZ1bmN0aW9uIGgoRSl7dmFyICQ7cmV0dXJuIEUmJkUuc3RhdGU/KCgkPUUuc3RhdGUpLndzaXplPTAsJC53aGF2ZT0wLCQud25leHQ9MCxsKEUpKTptfWZ1bmN0aW9uIF8oRSwkKXt2YXIgdyxrO3JldHVybiBFJiZFLnN0YXRlPyhrPUUuc3RhdGUsJDwwPyh3PTAsJD0tJCk6KHc9MSsoJD4+NCksJDw0OCYmKCQmPTE1KSksJCYmKCQ8OHx8MTU8JCk/bTooay53aW5kb3chPT1udWxsJiZrLndiaXRzIT09JCYmKGsud2luZG93PW51bGwpLGsud3JhcD13LGsud2JpdHM9JCxoKEUpKSk6bX1mdW5jdGlvbiBGKEUsJCl7dmFyIHcsaztyZXR1cm4gRT8oaz1uZXcgYywoRS5zdGF0ZT1rKS53aW5kb3c9bnVsbCwodz1fKEUsJCkpIT09ZyYmKEUuc3RhdGU9bnVsbCksdyk6bX12YXIgTyxmLFU9ITA7ZnVuY3Rpb24gWChFKXtpZihVKXt2YXIgJDtmb3IoTz1uZXcgci5CdWYzMig1MTIpLGY9bmV3IHIuQnVmMzIoMzIpLCQ9MDskPDE0NDspRS5sZW5zWyQrK109ODtmb3IoOyQ8MjU2OylFLmxlbnNbJCsrXT05O2Zvcig7JDwyODA7KUUubGVuc1skKytdPTc7Zm9yKDskPDI4ODspRS5sZW5zWyQrK109ODtmb3IodShwLEUubGVucywwLDI4OCxPLDAsRS53b3JrLHtiaXRzOjl9KSwkPTA7JDwzMjspRS5sZW5zWyQrK109NTt1KGIsRS5sZW5zLDAsMzIsZiwwLEUud29yayx7Yml0czo1fSksVT0hMX1FLmxlbmNvZGU9TyxFLmxlbmJpdHM9OSxFLmRpc3Rjb2RlPWYsRS5kaXN0Yml0cz01fWZ1bmN0aW9uIFEoRSwkLHcsayl7dmFyIFMsQj1FLnN0YXRlO3JldHVybiBCLndpbmRvdz09PW51bGwmJihCLndzaXplPTE8PEIud2JpdHMsQi53bmV4dD0wLEIud2hhdmU9MCxCLndpbmRvdz1uZXcgci5CdWY4KEIud3NpemUpKSxrPj1CLndzaXplPyhyLmFycmF5U2V0KEIud2luZG93LCQsdy1CLndzaXplLEIud3NpemUsMCksQi53bmV4dD0wLEIud2hhdmU9Qi53c2l6ZSk6KGs8KFM9Qi53c2l6ZS1CLnduZXh0KSYmKFM9ayksci5hcnJheVNldChCLndpbmRvdywkLHctayxTLEIud25leHQpLChrLT1TKT8oci5hcnJheVNldChCLndpbmRvdywkLHctayxrLDApLEIud25leHQ9ayxCLndoYXZlPUIud3NpemUpOihCLnduZXh0Kz1TLEIud25leHQ9PT1CLndzaXplJiYoQi53bmV4dD0wKSxCLndoYXZlPEIud3NpemUmJihCLndoYXZlKz1TKSkpLDB9bi5pbmZsYXRlUmVzZXQ9aCxuLmluZmxhdGVSZXNldDI9XyxuLmluZmxhdGVSZXNldEtlZXA9bCxuLmluZmxhdGVJbml0PWZ1bmN0aW9uKEUpe3JldHVybiBGKEUsMTUpfSxuLmluZmxhdGVJbml0Mj1GLG4uaW5mbGF0ZT1mdW5jdGlvbihFLCQpe3ZhciB3LGssUyxCLEwsUixxLHosRyxudCx0dCxldCx3dCxTdCxUdCxrdCxMdCxCdCwkdCxLdCxELHV0LG90LFYsaj0wLEs9bmV3IHIuQnVmOCg0KSxwdD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIUV8fCFFLnN0YXRlfHwhRS5vdXRwdXR8fCFFLmlucHV0JiZFLmF2YWlsX2luIT09MClyZXR1cm4gbTsodz1FLnN0YXRlKS5tb2RlPT09MTImJih3Lm1vZGU9MTMpLEw9RS5uZXh0X291dCxTPUUub3V0cHV0LHE9RS5hdmFpbF9vdXQsQj1FLm5leHRfaW4saz1FLmlucHV0LFI9RS5hdmFpbF9pbix6PXcuaG9sZCxHPXcuYml0cyxudD1SLHR0PXEsdXQ9Zzt0OmZvcig7Oylzd2l0Y2gody5tb2RlKXtjYXNlIEM6aWYody53cmFwPT09MCl7dy5tb2RlPTEzO2JyZWFrfWZvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKDImdy53cmFwJiZ6PT09MzU2MTUpe0tbdy5jaGVjaz0wXT0yNTUmeixLWzFdPXo+Pj44JjI1NSx3LmNoZWNrPWkody5jaGVjayxLLDIsMCksRz16PTAsdy5tb2RlPTI7YnJlYWt9aWYody5mbGFncz0wLHcuaGVhZCYmKHcuaGVhZC5kb25lPSExKSwhKDEmdy53cmFwKXx8KCgoMjU1JnopPDw4KSsoej4+OCkpJTMxKXtFLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfWlmKCgxNSZ6KSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix3Lm1vZGU9MzA7YnJlYWt9aWYoRy09NCxEPTgrKDE1Jih6Pj4+PTQpKSx3LndiaXRzPT09MCl3LndiaXRzPUQ7ZWxzZSBpZihEPncud2JpdHMpe0UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIix3Lm1vZGU9MzA7YnJlYWt9dy5kbWF4PTE8PEQsRS5hZGxlcj13LmNoZWNrPTEsdy5tb2RlPTUxMiZ6PzEwOjEyLEc9ej0wO2JyZWFrO2Nhc2UgMjpmb3IoO0c8MTY7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZih3LmZsYWdzPXosKDI1NSZ3LmZsYWdzKSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix3Lm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmdy5mbGFncyl7RS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsdy5tb2RlPTMwO2JyZWFrfXcuaGVhZCYmKHcuaGVhZC50ZXh0PXo+PjgmMSksNTEyJncuZmxhZ3MmJihLWzBdPTI1NSZ6LEtbMV09ej4+PjgmMjU1LHcuY2hlY2s9aSh3LmNoZWNrLEssMiwwKSksRz16PTAsdy5tb2RlPTM7Y2FzZSAzOmZvcig7RzwzMjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcuaGVhZCYmKHcuaGVhZC50aW1lPXopLDUxMiZ3LmZsYWdzJiYoS1swXT0yNTUmeixLWzFdPXo+Pj44JjI1NSxLWzJdPXo+Pj4xNiYyNTUsS1szXT16Pj4+MjQmMjU1LHcuY2hlY2s9aSh3LmNoZWNrLEssNCwwKSksRz16PTAsdy5tb2RlPTQ7Y2FzZSA0OmZvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcuaGVhZCYmKHcuaGVhZC54ZmxhZ3M9MjU1Jnosdy5oZWFkLm9zPXo+PjgpLDUxMiZ3LmZsYWdzJiYoS1swXT0yNTUmeixLWzFdPXo+Pj44JjI1NSx3LmNoZWNrPWkody5jaGVjayxLLDIsMCkpLEc9ej0wLHcubW9kZT01O2Nhc2UgNTppZigxMDI0JncuZmxhZ3Mpe2Zvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcubGVuZ3RoPXosdy5oZWFkJiYody5oZWFkLmV4dHJhX2xlbj16KSw1MTImdy5mbGFncyYmKEtbMF09MjU1JnosS1sxXT16Pj4+OCYyNTUsdy5jaGVjaz1pKHcuY2hlY2ssSywyLDApKSxHPXo9MH1lbHNlIHcuaGVhZCYmKHcuaGVhZC5leHRyYT1udWxsKTt3Lm1vZGU9NjtjYXNlIDY6aWYoMTAyNCZ3LmZsYWdzJiYoUjwoZXQ9dy5sZW5ndGgpJiYoZXQ9UiksZXQmJih3LmhlYWQmJihEPXcuaGVhZC5leHRyYV9sZW4tdy5sZW5ndGgsdy5oZWFkLmV4dHJhfHwody5oZWFkLmV4dHJhPW5ldyBBcnJheSh3LmhlYWQuZXh0cmFfbGVuKSksci5hcnJheVNldCh3LmhlYWQuZXh0cmEsayxCLGV0LEQpKSw1MTImdy5mbGFncyYmKHcuY2hlY2s9aSh3LmNoZWNrLGssZXQsQikpLFItPWV0LEIrPWV0LHcubGVuZ3RoLT1ldCksdy5sZW5ndGgpKWJyZWFrIHQ7dy5sZW5ndGg9MCx3Lm1vZGU9NztjYXNlIDc6aWYoMjA0OCZ3LmZsYWdzKXtpZihSPT09MClicmVhayB0O2ZvcihldD0wO0Q9a1tCK2V0KytdLHcuaGVhZCYmRCYmdy5sZW5ndGg8NjU1MzYmJih3LmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmZXQ8UjspO2lmKDUxMiZ3LmZsYWdzJiYody5jaGVjaz1pKHcuY2hlY2ssayxldCxCKSksUi09ZXQsQis9ZXQsRClicmVhayB0fWVsc2Ugdy5oZWFkJiYody5oZWFkLm5hbWU9bnVsbCk7dy5sZW5ndGg9MCx3Lm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZ3LmZsYWdzKXtpZihSPT09MClicmVhayB0O2ZvcihldD0wO0Q9a1tCK2V0KytdLHcuaGVhZCYmRCYmdy5sZW5ndGg8NjU1MzYmJih3LmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmZXQ8UjspO2lmKDUxMiZ3LmZsYWdzJiYody5jaGVjaz1pKHcuY2hlY2ssayxldCxCKSksUi09ZXQsQis9ZXQsRClicmVhayB0fWVsc2Ugdy5oZWFkJiYody5oZWFkLmNvbW1lbnQ9bnVsbCk7dy5tb2RlPTk7Y2FzZSA5OmlmKDUxMiZ3LmZsYWdzKXtmb3IoO0c8MTY7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZih6IT09KDY1NTM1JncuY2hlY2spKXtFLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcuaGVhZCYmKHcuaGVhZC5oY3JjPXcuZmxhZ3M+PjkmMSx3LmhlYWQuZG9uZT0hMCksRS5hZGxlcj13LmNoZWNrPTAsdy5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9RS5hZGxlcj13LmNoZWNrPVAoeiksRz16PTAsdy5tb2RlPTExO2Nhc2UgMTE6aWYody5oYXZlZGljdD09PTApcmV0dXJuIEUubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9RywyO0UuYWRsZXI9dy5jaGVjaz0xLHcubW9kZT0xMjtjYXNlIDEyOmlmKCQ9PT01fHwkPT09NilicmVhayB0O2Nhc2UgMTM6aWYody5sYXN0KXt6Pj4+PTcmRyxHLT03Jkcsdy5tb2RlPTI3O2JyZWFrfWZvcig7RzwzOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9c3dpdGNoKHcubGFzdD0xJnosRy09MSwzJih6Pj4+PTEpKXtjYXNlIDA6dy5tb2RlPTE0O2JyZWFrO2Nhc2UgMTppZihYKHcpLHcubW9kZT0yMCwkIT09NilicmVhazt6Pj4+PTIsRy09MjticmVhayB0O2Nhc2UgMjp3Lm1vZGU9MTc7YnJlYWs7Y2FzZSAzOkUubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLHcubW9kZT0zMH16Pj4+PTIsRy09MjticmVhaztjYXNlIDE0OmZvcih6Pj4+PTcmRyxHLT03Jkc7RzwzMjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKCg2NTUzNSZ6KSE9KHo+Pj4xNl42NTUzNSkpe0UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIix3Lm1vZGU9MzA7YnJlYWt9aWYody5sZW5ndGg9NjU1MzUmeixHPXo9MCx3Lm1vZGU9MTUsJD09PTYpYnJlYWsgdDtjYXNlIDE1OncubW9kZT0xNjtjYXNlIDE2OmlmKGV0PXcubGVuZ3RoKXtpZihSPGV0JiYoZXQ9UikscTxldCYmKGV0PXEpLGV0PT09MClicmVhayB0O3IuYXJyYXlTZXQoUyxrLEIsZXQsTCksUi09ZXQsQis9ZXQscS09ZXQsTCs9ZXQsdy5sZW5ndGgtPWV0O2JyZWFrfXcubW9kZT0xMjticmVhaztjYXNlIDE3OmZvcig7RzwxNDspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKHcubmxlbj0yNTcrKDMxJnopLHo+Pj49NSxHLT01LHcubmRpc3Q9MSsoMzEmeiksej4+Pj01LEctPTUsdy5uY29kZT00KygxNSZ6KSx6Pj4+PTQsRy09NCwyODY8dy5ubGVufHwzMDx3Lm5kaXN0KXtFLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLHcubW9kZT0zMDticmVha313LmhhdmU9MCx3Lm1vZGU9MTg7Y2FzZSAxODpmb3IoO3cuaGF2ZTx3Lm5jb2RlOyl7Zm9yKDtHPDM7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH13LmxlbnNbcHRbdy5oYXZlKytdXT03Jnosej4+Pj0zLEctPTN9Zm9yKDt3LmhhdmU8MTk7KXcubGVuc1twdFt3LmhhdmUrK11dPTA7aWYody5sZW5jb2RlPXcubGVuZHluLHcubGVuYml0cz03LG90PXtiaXRzOncubGVuYml0c30sdXQ9dSgwLHcubGVucywwLDE5LHcubGVuY29kZSwwLHcud29yayxvdCksdy5sZW5iaXRzPW90LmJpdHMsdXQpe0UubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLHcubW9kZT0zMDticmVha313LmhhdmU9MCx3Lm1vZGU9MTk7Y2FzZSAxOTpmb3IoO3cuaGF2ZTx3Lm5sZW4rdy5uZGlzdDspe2Zvcig7a3Q9KGo9dy5sZW5jb2RlW3omKDE8PHcubGVuYml0cyktMV0pPj4+MTYmMjU1LEx0PTY1NTM1JmosISgoVHQ9aj4+PjI0KTw9Ryk7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZihMdDwxNil6Pj4+PVR0LEctPVR0LHcubGVuc1t3LmhhdmUrK109THQ7ZWxzZXtpZihMdD09PTE2KXtmb3IoVj1UdCsyO0c8Vjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKHo+Pj49VHQsRy09VHQsdy5oYXZlPT09MCl7RS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLHcubW9kZT0zMDticmVha31EPXcubGVuc1t3LmhhdmUtMV0sZXQ9MysoMyZ6KSx6Pj4+PTIsRy09Mn1lbHNlIGlmKEx0PT09MTcpe2ZvcihWPVR0KzM7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9Ry09VHQsRD0wLGV0PTMrKDcmKHo+Pj49VHQpKSx6Pj4+PTMsRy09M31lbHNle2ZvcihWPVR0Kzc7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9Ry09VHQsRD0wLGV0PTExKygxMjcmKHo+Pj49VHQpKSx6Pj4+PTcsRy09N31pZih3LmhhdmUrZXQ+dy5ubGVuK3cubmRpc3Qpe0UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0Iix3Lm1vZGU9MzA7YnJlYWt9Zm9yKDtldC0tOyl3LmxlbnNbdy5oYXZlKytdPUR9fWlmKHcubW9kZT09PTMwKWJyZWFrO2lmKHcubGVuc1syNTZdPT09MCl7RS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsdy5tb2RlPTMwO2JyZWFrfWlmKHcubGVuYml0cz05LG90PXtiaXRzOncubGVuYml0c30sdXQ9dShwLHcubGVucywwLHcubmxlbix3LmxlbmNvZGUsMCx3Lndvcmssb3QpLHcubGVuYml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0Iix3Lm1vZGU9MzA7YnJlYWt9aWYody5kaXN0Yml0cz02LHcuZGlzdGNvZGU9dy5kaXN0ZHluLG90PXtiaXRzOncuZGlzdGJpdHN9LHV0PXUoYix3LmxlbnMsdy5ubGVuLHcubmRpc3Qsdy5kaXN0Y29kZSwwLHcud29yayxvdCksdy5kaXN0Yml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0Iix3Lm1vZGU9MzA7YnJlYWt9aWYody5tb2RlPTIwLCQ9PT02KWJyZWFrIHQ7Y2FzZSAyMDp3Lm1vZGU9MjE7Y2FzZSAyMTppZig2PD1SJiYyNTg8PXEpe0UubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9RyxvKEUsdHQpLEw9RS5uZXh0X291dCxTPUUub3V0cHV0LHE9RS5hdmFpbF9vdXQsQj1FLm5leHRfaW4saz1FLmlucHV0LFI9RS5hdmFpbF9pbix6PXcuaG9sZCxHPXcuYml0cyx3Lm1vZGU9PT0xMiYmKHcuYmFjaz0tMSk7YnJlYWt9Zm9yKHcuYmFjaz0wO2t0PShqPXcubGVuY29kZVt6JigxPDx3LmxlbmJpdHMpLTFdKT4+PjE2JjI1NSxMdD02NTUzNSZqLCEoKFR0PWo+Pj4yNCk8PUcpOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9aWYoa3QmJiEoMjQwJmt0KSl7Zm9yKEJ0PVR0LCR0PWt0LEt0PUx0O2t0PShqPXcubGVuY29kZVtLdCsoKHomKDE8PEJ0KyR0KS0xKT4+QnQpXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmaiwhKEJ0KyhUdD1qPj4+MjQpPD1HKTspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXo+Pj49QnQsRy09QnQsdy5iYWNrKz1CdH1pZih6Pj4+PVR0LEctPVR0LHcuYmFjays9VHQsdy5sZW5ndGg9THQsa3Q9PT0wKXt3Lm1vZGU9MjY7YnJlYWt9aWYoMzIma3Qpe3cuYmFjaz0tMSx3Lm1vZGU9MTI7YnJlYWt9aWYoNjQma3Qpe0UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLHcubW9kZT0zMDticmVha313LmV4dHJhPTE1Jmt0LHcubW9kZT0yMjtjYXNlIDIyOmlmKHcuZXh0cmEpe2ZvcihWPXcuZXh0cmE7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9dy5sZW5ndGgrPXomKDE8PHcuZXh0cmEpLTEsej4+Pj13LmV4dHJhLEctPXcuZXh0cmEsdy5iYWNrKz13LmV4dHJhfXcud2FzPXcubGVuZ3RoLHcubW9kZT0yMztjYXNlIDIzOmZvcig7a3Q9KGo9dy5kaXN0Y29kZVt6JigxPDx3LmRpc3RiaXRzKS0xXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmaiwhKChUdD1qPj4+MjQpPD1HKTspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKCEoMjQwJmt0KSl7Zm9yKEJ0PVR0LCR0PWt0LEt0PUx0O2t0PShqPXcuZGlzdGNvZGVbS3QrKCh6JigxPDxCdCskdCktMSk+PkJ0KV0pPj4+MTYmMjU1LEx0PTY1NTM1JmosIShCdCsoVHQ9aj4+PjI0KTw9Ryk7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH16Pj4+PUJ0LEctPUJ0LHcuYmFjays9QnR9aWYoej4+Pj1UdCxHLT1UdCx3LmJhY2srPVR0LDY0Jmt0KXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIix3Lm1vZGU9MzA7YnJlYWt9dy5vZmZzZXQ9THQsdy5leHRyYT0xNSZrdCx3Lm1vZGU9MjQ7Y2FzZSAyNDppZih3LmV4dHJhKXtmb3IoVj13LmV4dHJhO0c8Vjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcub2Zmc2V0Kz16JigxPDx3LmV4dHJhKS0xLHo+Pj49dy5leHRyYSxHLT13LmV4dHJhLHcuYmFjays9dy5leHRyYX1pZih3Lm9mZnNldD53LmRtYXgpe0UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsdy5tb2RlPTMwO2JyZWFrfXcubW9kZT0yNTtjYXNlIDI1OmlmKHE9PT0wKWJyZWFrIHQ7aWYoZXQ9dHQtcSx3Lm9mZnNldD5ldCl7aWYoKGV0PXcub2Zmc2V0LWV0KT53LndoYXZlJiZ3LnNhbmUpe0UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsdy5tb2RlPTMwO2JyZWFrfXd0PWV0Pncud25leHQ/KGV0LT13LnduZXh0LHcud3NpemUtZXQpOncud25leHQtZXQsZXQ+dy5sZW5ndGgmJihldD13Lmxlbmd0aCksU3Q9dy53aW5kb3d9ZWxzZSBTdD1TLHd0PUwtdy5vZmZzZXQsZXQ9dy5sZW5ndGg7Zm9yKHE8ZXQmJihldD1xKSxxLT1ldCx3Lmxlbmd0aC09ZXQ7U1tMKytdPVN0W3d0KytdLC0tZXQ7KTt3Lmxlbmd0aD09PTAmJih3Lm1vZGU9MjEpO2JyZWFrO2Nhc2UgMjY6aWYocT09PTApYnJlYWsgdDtTW0wrK109dy5sZW5ndGgscS0tLHcubW9kZT0yMTticmVhaztjYXNlIDI3OmlmKHcud3JhcCl7Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0senw9a1tCKytdPDxHLEcrPTh9aWYodHQtPXEsRS50b3RhbF9vdXQrPXR0LHcudG90YWwrPXR0LHR0JiYoRS5hZGxlcj13LmNoZWNrPXcuZmxhZ3M/aSh3LmNoZWNrLFMsdHQsTC10dCk6cyh3LmNoZWNrLFMsdHQsTC10dCkpLHR0PXEsKHcuZmxhZ3M/ejpQKHopKSE9PXcuY2hlY2spe0UubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcubW9kZT0yODtjYXNlIDI4OmlmKHcud3JhcCYmdy5mbGFncyl7Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9aWYoeiE9PSg0Mjk0OTY3Mjk1JncudG90YWwpKXtFLm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcubW9kZT0yOTtjYXNlIDI5OnV0PTE7YnJlYWsgdDtjYXNlIDMwOnV0PS0zO2JyZWFrIHQ7Y2FzZSAzMTpyZXR1cm4tNDtjYXNlIDMyOmRlZmF1bHQ6cmV0dXJuIG19cmV0dXJuIEUubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9Rywody53c2l6ZXx8dHQhPT1FLmF2YWlsX291dCYmdy5tb2RlPDMwJiYody5tb2RlPDI3fHwkIT09NCkpJiZRKEUsRS5vdXRwdXQsRS5uZXh0X291dCx0dC1FLmF2YWlsX291dCk/KHcubW9kZT0zMSwtNCk6KG50LT1FLmF2YWlsX2luLHR0LT1FLmF2YWlsX291dCxFLnRvdGFsX2luKz1udCxFLnRvdGFsX291dCs9dHQsdy50b3RhbCs9dHQsdy53cmFwJiZ0dCYmKEUuYWRsZXI9dy5jaGVjaz13LmZsYWdzP2kody5jaGVjayxTLHR0LEUubmV4dF9vdXQtdHQpOnMody5jaGVjayxTLHR0LEUubmV4dF9vdXQtdHQpKSxFLmRhdGFfdHlwZT13LmJpdHMrKHcubGFzdD82NDowKSsody5tb2RlPT09MTI/MTI4OjApKyh3Lm1vZGU9PT0yMHx8dy5tb2RlPT09MTU/MjU2OjApLChudD09MCYmdHQ9PT0wfHwkPT09NCkmJnV0PT09ZyYmKHV0PS01KSx1dCl9LG4uaW5mbGF0ZUVuZD1mdW5jdGlvbihFKXtpZighRXx8IUUuc3RhdGUpcmV0dXJuIG07dmFyICQ9RS5zdGF0ZTtyZXR1cm4gJC53aW5kb3cmJigkLndpbmRvdz1udWxsKSxFLnN0YXRlPW51bGwsZ30sbi5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKEUsJCl7dmFyIHc7cmV0dXJuIEUmJkUuc3RhdGUmJjImKHc9RS5zdGF0ZSkud3JhcD8oKHcuaGVhZD0kKS5kb25lPSExLGcpOm19LG4uaW5mbGF0ZVNldERpY3Rpb25hcnk9ZnVuY3Rpb24oRSwkKXt2YXIgdyxrPSQubGVuZ3RoO3JldHVybiBFJiZFLnN0YXRlPyh3PUUuc3RhdGUpLndyYXAhPT0wJiZ3Lm1vZGUhPT0xMT9tOncubW9kZT09PTExJiZzKDEsJCxrLDApIT09dy5jaGVjaz8tMzpRKEUsJCxrLGspPyh3Lm1vZGU9MzEsLTQpOih3LmhhdmVkaWN0PTEsZyk6bX0sbi5pbmZsYXRlSW5mbz0icGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LHsiLi4vdXRpbHMvY29tbW9uIjo0MSwiLi9hZGxlcjMyIjo0MywiLi9jcmMzMiI6NDUsIi4vaW5mZmFzdCI6NDgsIi4vaW5mdHJlZXMiOjUwfV0sNTA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMvY29tbW9uIikscz1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLGk9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxvPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSx1PVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF07ZS5leHBvcnRzPWZ1bmN0aW9uKHAsYixnLG0sQyx5LFQsUCl7dmFyIGMsbCxoLF8sRixPLGYsVSxYLFE9UC5iaXRzLEU9MCwkPTAsdz0wLGs9MCxTPTAsQj0wLEw9MCxSPTAscT0wLHo9MCxHPW51bGwsbnQ9MCx0dD1uZXcgci5CdWYxNigxNiksZXQ9bmV3IHIuQnVmMTYoMTYpLHd0PW51bGwsU3Q9MDtmb3IoRT0wO0U8PTE1O0UrKyl0dFtFXT0wO2ZvcigkPTA7JDxtOyQrKyl0dFtiW2crJF1dKys7Zm9yKFM9USxrPTE1OzE8PWsmJnR0W2tdPT09MDtrLS0pO2lmKGs8UyYmKFM9ayksaz09PTApcmV0dXJuIENbeSsrXT0yMDk3MTUyMCxDW3krK109MjA5NzE1MjAsUC5iaXRzPTEsMDtmb3Iodz0xO3c8ayYmdHRbd109PT0wO3crKyk7Zm9yKFM8dyYmKFM9dyksRT1SPTE7RTw9MTU7RSsrKWlmKFI8PD0xLChSLT10dFtFXSk8MClyZXR1cm4tMTtpZigwPFImJihwPT09MHx8ayE9PTEpKXJldHVybi0xO2ZvcihldFsxXT0wLEU9MTtFPDE1O0UrKylldFtFKzFdPWV0W0VdK3R0W0VdO2ZvcigkPTA7JDxtOyQrKyliW2crJF0hPT0wJiYoVFtldFtiW2crJF1dKytdPSQpO2lmKE89cD09PTA/KEc9d3Q9VCwxOSk6cD09PTE/KEc9cyxudC09MjU3LHd0PWksU3QtPTI1NywyNTYpOihHPW8sd3Q9dSwtMSksRT13LEY9eSxMPSQ9ej0wLGg9LTEsXz0ocT0xPDwoQj1TKSktMSxwPT09MSYmODUyPHF8fHA9PT0yJiY1OTI8cSlyZXR1cm4gMTtmb3IoOzspe2ZvcihmPUUtTCxYPVRbJF08Tz8oVT0wLFRbJF0pOlRbJF0+Tz8oVT13dFtTdCtUWyRdXSxHW250K1RbJF1dKTooVT05NiwwKSxjPTE8PEUtTCx3PWw9MTw8QjtDW0YrKHo+PkwpKyhsLT1jKV09Zjw8MjR8VTw8MTZ8WHwwLGwhPT0wOyk7Zm9yKGM9MTw8RS0xO3omYzspYz4+PTE7aWYoYyE9PTA/KHomPWMtMSx6Kz1jKTp6PTAsJCsrLC0tdHRbRV09PTApe2lmKEU9PT1rKWJyZWFrO0U9YltnK1RbJF1dfWlmKFM8RSYmKHomXykhPT1oKXtmb3IoTD09PTAmJihMPVMpLEYrPXcsUj0xPDwoQj1FLUwpO0IrTDxrJiYhKChSLT10dFtCK0xdKTw9MCk7KUIrKyxSPDw9MTtpZihxKz0xPDxCLHA9PT0xJiY4NTI8cXx8cD09PTImJjU5MjxxKXJldHVybiAxO0NbaD16Jl9dPVM8PDI0fEI8PDE2fEYteXwwfX1yZXR1cm4geiE9PTAmJihDW0Yrel09RS1MPDwyNHw2NDw8MTZ8MCksUC5iaXRzPVMsMH19LHsiLi4vdXRpbHMvY29tbW9uIjo0MX1dLDUxOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9fSx7fV0sNTI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMvY29tbW9uIikscz0wLGk9MTtmdW5jdGlvbiBvKGope2Zvcih2YXIgSz1qLmxlbmd0aDswPD0tLUs7KWpbS109MH12YXIgdT0wLHA9MjksYj0yNTYsZz1iKzErcCxtPTMwLEM9MTkseT0yKmcrMSxUPTE1LFA9MTYsYz03LGw9MjU2LGg9MTYsXz0xNyxGPTE4LE89WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sZj1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sVT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sWD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sUT1uZXcgQXJyYXkoMiooZysyKSk7byhRKTt2YXIgRT1uZXcgQXJyYXkoMiptKTtvKEUpO3ZhciAkPW5ldyBBcnJheSg1MTIpO28oJCk7dmFyIHc9bmV3IEFycmF5KDI1Nik7byh3KTt2YXIgaz1uZXcgQXJyYXkocCk7byhrKTt2YXIgUyxCLEwsUj1uZXcgQXJyYXkobSk7ZnVuY3Rpb24gcShqLEsscHQsdnQscnQpe3RoaXMuc3RhdGljX3RyZWU9aix0aGlzLmV4dHJhX2JpdHM9Syx0aGlzLmV4dHJhX2Jhc2U9cHQsdGhpcy5lbGVtcz12dCx0aGlzLm1heF9sZW5ndGg9cnQsdGhpcy5oYXNfc3RyZWU9aiYmai5sZW5ndGh9ZnVuY3Rpb24geihqLEspe3RoaXMuZHluX3RyZWU9aix0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9S31mdW5jdGlvbiBHKGope3JldHVybiBqPDI1Nj8kW2pdOiRbMjU2KyhqPj4+NyldfWZ1bmN0aW9uIG50KGosSyl7ai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109MjU1Jkssai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109Sz4+PjgmMjU1fWZ1bmN0aW9uIHR0KGosSyxwdCl7ai5iaV92YWxpZD5QLXB0PyhqLmJpX2J1Znw9Szw8ai5iaV92YWxpZCY2NTUzNSxudChqLGouYmlfYnVmKSxqLmJpX2J1Zj1LPj5QLWouYmlfdmFsaWQsai5iaV92YWxpZCs9cHQtUCk6KGouYmlfYnVmfD1LPDxqLmJpX3ZhbGlkJjY1NTM1LGouYmlfdmFsaWQrPXB0KX1mdW5jdGlvbiBldChqLEsscHQpe3R0KGoscHRbMipLXSxwdFsyKksrMV0pfWZ1bmN0aW9uIHd0KGosSyl7Zm9yKHZhciBwdD0wO3B0fD0xJmosaj4+Pj0xLHB0PDw9MSwwPC0tSzspO3JldHVybiBwdD4+PjF9ZnVuY3Rpb24gU3QoaixLLHB0KXt2YXIgdnQscnQsZ3Q9bmV3IEFycmF5KFQrMSksQ3Q9MDtmb3IodnQ9MTt2dDw9VDt2dCsrKWd0W3Z0XT1DdD1DdCtwdFt2dC0xXTw8MTtmb3IocnQ9MDtydDw9SztydCsrKXt2YXIgeHQ9alsyKnJ0KzFdO3h0IT09MCYmKGpbMipydF09d3QoZ3RbeHRdKysseHQpKX19ZnVuY3Rpb24gVHQoail7dmFyIEs7Zm9yKEs9MDtLPGc7SysrKWouZHluX2x0cmVlWzIqS109MDtmb3IoSz0wO0s8bTtLKyspai5keW5fZHRyZWVbMipLXT0wO2ZvcihLPTA7SzxDO0srKylqLmJsX3RyZWVbMipLXT0wO2ouZHluX2x0cmVlWzIqbF09MSxqLm9wdF9sZW49ai5zdGF0aWNfbGVuPTAsai5sYXN0X2xpdD1qLm1hdGNoZXM9MH1mdW5jdGlvbiBrdChqKXs4PGouYmlfdmFsaWQ/bnQoaixqLmJpX2J1Zik6MDxqLmJpX3ZhbGlkJiYoai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109ai5iaV9idWYpLGouYmlfYnVmPTAsai5iaV92YWxpZD0wfWZ1bmN0aW9uIEx0KGosSyxwdCx2dCl7dmFyIHJ0PTIqSyxndD0yKnB0O3JldHVybiBqW3J0XTxqW2d0XXx8altydF09PT1qW2d0XSYmdnRbS108PXZ0W3B0XX1mdW5jdGlvbiBCdChqLEsscHQpe2Zvcih2YXIgdnQ9ai5oZWFwW3B0XSxydD1wdDw8MTtydDw9ai5oZWFwX2xlbiYmKHJ0PGouaGVhcF9sZW4mJkx0KEssai5oZWFwW3J0KzFdLGouaGVhcFtydF0sai5kZXB0aCkmJnJ0KyssIUx0KEssdnQsai5oZWFwW3J0XSxqLmRlcHRoKSk7KWouaGVhcFtwdF09ai5oZWFwW3J0XSxwdD1ydCxydDw8PTE7ai5oZWFwW3B0XT12dH1mdW5jdGlvbiAkdChqLEsscHQpe3ZhciB2dCxydCxndCxDdCx4dD0wO2lmKGoubGFzdF9saXQhPT0wKWZvcig7dnQ9ai5wZW5kaW5nX2J1ZltqLmRfYnVmKzIqeHRdPDw4fGoucGVuZGluZ19idWZbai5kX2J1ZisyKnh0KzFdLHJ0PWoucGVuZGluZ19idWZbai5sX2J1Zit4dF0seHQrKyx2dD09PTA/ZXQoaixydCxLKTooZXQoaiwoZ3Q9d1tydF0pK2IrMSxLKSwoQ3Q9T1tndF0pIT09MCYmdHQoaixydC09a1tndF0sQ3QpLGV0KGosZ3Q9RygtLXZ0KSxwdCksKEN0PWZbZ3RdKSE9PTAmJnR0KGosdnQtPVJbZ3RdLEN0KSkseHQ8ai5sYXN0X2xpdDspO2V0KGosbCxLKX1mdW5jdGlvbiBLdChqLEspe3ZhciBwdCx2dCxydCxndD1LLmR5bl90cmVlLEN0PUsuc3RhdF9kZXNjLnN0YXRpY190cmVlLHh0PUsuc3RhdF9kZXNjLmhhc19zdHJlZSxtdD1LLnN0YXRfZGVzYy5lbGVtcyx6dD0tMTtmb3Ioai5oZWFwX2xlbj0wLGouaGVhcF9tYXg9eSxwdD0wO3B0PG10O3B0KyspZ3RbMipwdF0hPT0wPyhqLmhlYXBbKytqLmhlYXBfbGVuXT16dD1wdCxqLmRlcHRoW3B0XT0wKTpndFsyKnB0KzFdPTA7Zm9yKDtqLmhlYXBfbGVuPDI7KWd0WzIqKHJ0PWouaGVhcFsrK2ouaGVhcF9sZW5dPXp0PDI/Kyt6dDowKV09MSxqLmRlcHRoW3J0XT0wLGoub3B0X2xlbi0tLHh0JiYoai5zdGF0aWNfbGVuLT1DdFsyKnJ0KzFdKTtmb3IoSy5tYXhfY29kZT16dCxwdD1qLmhlYXBfbGVuPj4xOzE8PXB0O3B0LS0pQnQoaixndCxwdCk7Zm9yKHJ0PW10O3B0PWouaGVhcFsxXSxqLmhlYXBbMV09ai5oZWFwW2ouaGVhcF9sZW4tLV0sQnQoaixndCwxKSx2dD1qLmhlYXBbMV0sai5oZWFwWy0tai5oZWFwX21heF09cHQsai5oZWFwWy0tai5oZWFwX21heF09dnQsZ3RbMipydF09Z3RbMipwdF0rZ3RbMip2dF0sai5kZXB0aFtydF09KGouZGVwdGhbcHRdPj1qLmRlcHRoW3Z0XT9qLmRlcHRoW3B0XTpqLmRlcHRoW3Z0XSkrMSxndFsyKnB0KzFdPWd0WzIqdnQrMV09cnQsai5oZWFwWzFdPXJ0KyssQnQoaixndCwxKSwyPD1qLmhlYXBfbGVuOyk7ai5oZWFwWy0tai5oZWFwX21heF09ai5oZWFwWzFdLGZ1bmN0aW9uKEd0LHZlKXt2YXIgZm4sVGUsdG4sZWUsZ2UsamUsZmU9dmUuZHluX3RyZWUsZHI9dmUubWF4X2NvZGUsVG49dmUuc3RhdF9kZXNjLnN0YXRpY190cmVlLHVyPXZlLnN0YXRfZGVzYy5oYXNfc3RyZWUsY3I9dmUuc3RhdF9kZXNjLmV4dHJhX2JpdHMsZnI9dmUuc3RhdF9kZXNjLmV4dHJhX2Jhc2UsQWU9dmUuc3RhdF9kZXNjLm1heF9sZW5ndGgsV2U9MDtmb3IoZWU9MDtlZTw9VDtlZSsrKUd0LmJsX2NvdW50W2VlXT0wO2ZvcihmZVsyKkd0LmhlYXBbR3QuaGVhcF9tYXhdKzFdPTAsZm49R3QuaGVhcF9tYXgrMTtmbjx5O2ZuKyspQWU8KGVlPWZlWzIqZmVbMiooVGU9R3QuaGVhcFtmbl0pKzFdKzFdKzEpJiYoZWU9QWUsV2UrKyksZmVbMipUZSsxXT1lZSxkcjxUZXx8KEd0LmJsX2NvdW50W2VlXSsrLGdlPTAsZnI8PVRlJiYoZ2U9Y3JbVGUtZnJdKSxqZT1mZVsyKlRlXSxHdC5vcHRfbGVuKz1qZSooZWUrZ2UpLHVyJiYoR3Quc3RhdGljX2xlbis9amUqKFRuWzIqVGUrMV0rZ2UpKSk7aWYoV2UhPT0wKXtkb3tmb3IoZWU9QWUtMTtHdC5ibF9jb3VudFtlZV09PT0wOyllZS0tO0d0LmJsX2NvdW50W2VlXS0tLEd0LmJsX2NvdW50W2VlKzFdKz0yLEd0LmJsX2NvdW50W0FlXS0tLFdlLT0yfXdoaWxlKDA8V2UpO2ZvcihlZT1BZTtlZSE9PTA7ZWUtLSlmb3IoVGU9R3QuYmxfY291bnRbZWVdO1RlIT09MDspZHI8KHRuPUd0LmhlYXBbLS1mbl0pfHwoZmVbMip0bisxXSE9PWVlJiYoR3Qub3B0X2xlbis9KGVlLWZlWzIqdG4rMV0pKmZlWzIqdG5dLGZlWzIqdG4rMV09ZWUpLFRlLS0pfX0oaixLKSxTdChndCx6dCxqLmJsX2NvdW50KX1mdW5jdGlvbiBEKGosSyxwdCl7dmFyIHZ0LHJ0LGd0PS0xLEN0PUtbMV0seHQ9MCxtdD03LHp0PTQ7Zm9yKEN0PT09MCYmKG10PTEzOCx6dD0zKSxLWzIqKHB0KzEpKzFdPTY1NTM1LHZ0PTA7dnQ8PXB0O3Z0KyspcnQ9Q3QsQ3Q9S1syKih2dCsxKSsxXSwrK3h0PG10JiZydD09PUN0fHwoeHQ8enQ/ai5ibF90cmVlWzIqcnRdKz14dDpydCE9PTA/KHJ0IT09Z3QmJmouYmxfdHJlZVsyKnJ0XSsrLGouYmxfdHJlZVsyKmhdKyspOnh0PD0xMD9qLmJsX3RyZWVbMipfXSsrOmouYmxfdHJlZVsyKkZdKyssZ3Q9cnQsenQ9KHh0PTApPT09Q3Q/KG10PTEzOCwzKTpydD09PUN0PyhtdD02LDMpOihtdD03LDQpKX1mdW5jdGlvbiB1dChqLEsscHQpe3ZhciB2dCxydCxndD0tMSxDdD1LWzFdLHh0PTAsbXQ9Nyx6dD00O2ZvcihDdD09PTAmJihtdD0xMzgsenQ9MyksdnQ9MDt2dDw9cHQ7dnQrKylpZihydD1DdCxDdD1LWzIqKHZ0KzEpKzFdLCEoKyt4dDxtdCYmcnQ9PT1DdCkpe2lmKHh0PHp0KWZvcig7ZXQoaixydCxqLmJsX3RyZWUpLC0teHQhPTA7KTtlbHNlIHJ0IT09MD8ocnQhPT1ndCYmKGV0KGoscnQsai5ibF90cmVlKSx4dC0tKSxldChqLGgsai5ibF90cmVlKSx0dChqLHh0LTMsMikpOnh0PD0xMD8oZXQoaixfLGouYmxfdHJlZSksdHQoaix4dC0zLDMpKTooZXQoaixGLGouYmxfdHJlZSksdHQoaix4dC0xMSw3KSk7Z3Q9cnQsenQ9KHh0PTApPT09Q3Q/KG10PTEzOCwzKTpydD09PUN0PyhtdD02LDMpOihtdD03LDQpfX1vKFIpO3ZhciBvdD0hMTtmdW5jdGlvbiBWKGosSyxwdCx2dCl7dHQoaiwodTw8MSkrKHZ0PzE6MCksMyksZnVuY3Rpb24ocnQsZ3QsQ3QseHQpe2t0KHJ0KSx4dCYmKG50KHJ0LEN0KSxudChydCx+Q3QpKSxyLmFycmF5U2V0KHJ0LnBlbmRpbmdfYnVmLHJ0LndpbmRvdyxndCxDdCxydC5wZW5kaW5nKSxydC5wZW5kaW5nKz1DdH0oaixLLHB0LCEwKX1uLl90cl9pbml0PWZ1bmN0aW9uKGope290fHwoZnVuY3Rpb24oKXt2YXIgSyxwdCx2dCxydCxndCxDdD1uZXcgQXJyYXkoVCsxKTtmb3IocnQ9dnQ9MDtydDxwLTE7cnQrKylmb3Ioa1tydF09dnQsSz0wO0s8MTw8T1tydF07SysrKXdbdnQrK109cnQ7Zm9yKHdbdnQtMV09cnQscnQ9Z3Q9MDtydDwxNjtydCsrKWZvcihSW3J0XT1ndCxLPTA7SzwxPDxmW3J0XTtLKyspJFtndCsrXT1ydDtmb3IoZ3Q+Pj03O3J0PG07cnQrKylmb3IoUltydF09Z3Q8PDcsSz0wO0s8MTw8ZltydF0tNztLKyspJFsyNTYrZ3QrK109cnQ7Zm9yKHB0PTA7cHQ8PVQ7cHQrKylDdFtwdF09MDtmb3IoSz0wO0s8PTE0MzspUVsyKksrMV09OCxLKyssQ3RbOF0rKztmb3IoO0s8PTI1NTspUVsyKksrMV09OSxLKyssQ3RbOV0rKztmb3IoO0s8PTI3OTspUVsyKksrMV09NyxLKyssQ3RbN10rKztmb3IoO0s8PTI4NzspUVsyKksrMV09OCxLKyssQ3RbOF0rKztmb3IoU3QoUSxnKzEsQ3QpLEs9MDtLPG07SysrKUVbMipLKzFdPTUsRVsyKktdPXd0KEssNSk7Uz1uZXcgcShRLE8sYisxLGcsVCksQj1uZXcgcShFLGYsMCxtLFQpLEw9bmV3IHEobmV3IEFycmF5KDApLFUsMCxDLGMpfSgpLG90PSEwKSxqLmxfZGVzYz1uZXcgeihqLmR5bl9sdHJlZSxTKSxqLmRfZGVzYz1uZXcgeihqLmR5bl9kdHJlZSxCKSxqLmJsX2Rlc2M9bmV3IHooai5ibF90cmVlLEwpLGouYmlfYnVmPTAsai5iaV92YWxpZD0wLFR0KGopfSxuLl90cl9zdG9yZWRfYmxvY2s9VixuLl90cl9mbHVzaF9ibG9jaz1mdW5jdGlvbihqLEsscHQsdnQpe3ZhciBydCxndCxDdD0wOzA8ai5sZXZlbD8oai5zdHJtLmRhdGFfdHlwZT09PTImJihqLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKHh0KXt2YXIgbXQsenQ9NDA5MzYyNDQ0Nztmb3IobXQ9MDttdDw9MzE7bXQrKyx6dD4+Pj0xKWlmKDEmenQmJnh0LmR5bl9sdHJlZVsyKm10XSE9PTApcmV0dXJuIHM7aWYoeHQuZHluX2x0cmVlWzE4XSE9PTB8fHh0LmR5bl9sdHJlZVsyMF0hPT0wfHx4dC5keW5fbHRyZWVbMjZdIT09MClyZXR1cm4gaTtmb3IobXQ9MzI7bXQ8YjttdCsrKWlmKHh0LmR5bl9sdHJlZVsyKm10XSE9PTApcmV0dXJuIGk7cmV0dXJuIHN9KGopKSxLdChqLGoubF9kZXNjKSxLdChqLGouZF9kZXNjKSxDdD1mdW5jdGlvbih4dCl7dmFyIG10O2ZvcihEKHh0LHh0LmR5bl9sdHJlZSx4dC5sX2Rlc2MubWF4X2NvZGUpLEQoeHQseHQuZHluX2R0cmVlLHh0LmRfZGVzYy5tYXhfY29kZSksS3QoeHQseHQuYmxfZGVzYyksbXQ9Qy0xOzM8PW10JiZ4dC5ibF90cmVlWzIqWFttdF0rMV09PT0wO210LS0pO3JldHVybiB4dC5vcHRfbGVuKz0zKihtdCsxKSs1KzUrNCxtdH0oaikscnQ9ai5vcHRfbGVuKzMrNz4+PjMsKGd0PWouc3RhdGljX2xlbiszKzc+Pj4zKTw9cnQmJihydD1ndCkpOnJ0PWd0PXB0KzUscHQrNDw9cnQmJkshPT0tMT9WKGosSyxwdCx2dCk6ai5zdHJhdGVneT09PTR8fGd0PT09cnQ/KHR0KGosMisodnQ/MTowKSwzKSwkdChqLFEsRSkpOih0dChqLDQrKHZ0PzE6MCksMyksZnVuY3Rpb24oeHQsbXQsenQsR3Qpe3ZhciB2ZTtmb3IodHQoeHQsbXQtMjU3LDUpLHR0KHh0LHp0LTEsNSksdHQoeHQsR3QtNCw0KSx2ZT0wO3ZlPEd0O3ZlKyspdHQoeHQseHQuYmxfdHJlZVsyKlhbdmVdKzFdLDMpO3V0KHh0LHh0LmR5bl9sdHJlZSxtdC0xKSx1dCh4dCx4dC5keW5fZHRyZWUsenQtMSl9KGosai5sX2Rlc2MubWF4X2NvZGUrMSxqLmRfZGVzYy5tYXhfY29kZSsxLEN0KzEpLCR0KGosai5keW5fbHRyZWUsai5keW5fZHRyZWUpKSxUdChqKSx2dCYma3Qoail9LG4uX3RyX3RhbGx5PWZ1bmN0aW9uKGosSyxwdCl7cmV0dXJuIGoucGVuZGluZ19idWZbai5kX2J1ZisyKmoubGFzdF9saXRdPUs+Pj44JjI1NSxqLnBlbmRpbmdfYnVmW2ouZF9idWYrMipqLmxhc3RfbGl0KzFdPTI1NSZLLGoucGVuZGluZ19idWZbai5sX2J1ZitqLmxhc3RfbGl0XT0yNTUmcHQsai5sYXN0X2xpdCsrLEs9PT0wP2ouZHluX2x0cmVlWzIqcHRdKys6KGoubWF0Y2hlcysrLEstLSxqLmR5bl9sdHJlZVsyKih3W3B0XStiKzEpXSsrLGouZHluX2R0cmVlWzIqRyhLKV0rKyksai5sYXN0X2xpdD09PWoubGl0X2J1ZnNpemUtMX0sbi5fdHJfYWxpZ249ZnVuY3Rpb24oail7dHQoaiwyLDMpLGV0KGosbCxRKSxmdW5jdGlvbihLKXtLLmJpX3ZhbGlkPT09MTY/KG50KEssSy5iaV9idWYpLEsuYmlfYnVmPTAsSy5iaV92YWxpZD0wKTo4PD1LLmJpX3ZhbGlkJiYoSy5wZW5kaW5nX2J1ZltLLnBlbmRpbmcrK109MjU1JksuYmlfYnVmLEsuYmlfYnVmPj49OCxLLmJpX3ZhbGlkLT04KX0oail9fSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDF9XSw1MzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfX0se31dLDU0OltmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHIpeyhmdW5jdGlvbihzLGkpeyJ1c2Ugc3RyaWN0IjtpZighcy5zZXRJbW1lZGlhdGUpe3ZhciBvLHUscCxiLGc9MSxtPXt9LEM9ITEseT1zLmRvY3VtZW50LFQ9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2Yocyk7VD1UJiZULnNldFRpbWVvdXQ/VDpzLG89e30udG9TdHJpbmcuY2FsbChzLnByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iP2Z1bmN0aW9uKGgpe3Byb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKXtjKGgpfSl9OmZ1bmN0aW9uKCl7aWYocy5wb3N0TWVzc2FnZSYmIXMuaW1wb3J0U2NyaXB0cyl7dmFyIGg9ITAsXz1zLm9ubWVzc2FnZTtyZXR1cm4gcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtoPSExfSxzLnBvc3RNZXNzYWdlKCIiLCIqIikscy5vbm1lc3NhZ2U9XyxofX0oKT8oYj0ic2V0SW1tZWRpYXRlJCIrTWF0aC5yYW5kb20oKSsiJCIscy5hZGRFdmVudExpc3RlbmVyP3MuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbCwhMSk6cy5hdHRhY2hFdmVudCgib25tZXNzYWdlIixsKSxmdW5jdGlvbihoKXtzLnBvc3RNZXNzYWdlKGIraCwiKiIpfSk6cy5NZXNzYWdlQ2hhbm5lbD8oKHA9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oaCl7YyhoLmRhdGEpfSxmdW5jdGlvbihoKXtwLnBvcnQyLnBvc3RNZXNzYWdlKGgpfSk6eSYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiB5LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyh1PXkuZG9jdW1lbnRFbGVtZW50LGZ1bmN0aW9uKGgpe3ZhciBfPXkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Xy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtjKGgpLF8ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsdS5yZW1vdmVDaGlsZChfKSxfPW51bGx9LHUuYXBwZW5kQ2hpbGQoXyl9KTpmdW5jdGlvbihoKXtzZXRUaW1lb3V0KGMsMCxoKX0sVC5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oaCl7dHlwZW9mIGghPSJmdW5jdGlvbiImJihoPW5ldyBGdW5jdGlvbigiIitoKSk7Zm9yKHZhciBfPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLEY9MDtGPF8ubGVuZ3RoO0YrKylfW0ZdPWFyZ3VtZW50c1tGKzFdO3ZhciBPPXtjYWxsYmFjazpoLGFyZ3M6X307cmV0dXJuIG1bZ109TyxvKGcpLGcrK30sVC5jbGVhckltbWVkaWF0ZT1QfWZ1bmN0aW9uIFAoaCl7ZGVsZXRlIG1baF19ZnVuY3Rpb24gYyhoKXtpZihDKXNldFRpbWVvdXQoYywwLGgpO2Vsc2V7dmFyIF89bVtoXTtpZihfKXtDPSEwO3RyeXsoZnVuY3Rpb24oRil7dmFyIE89Ri5jYWxsYmFjayxmPUYuYXJncztzd2l0Y2goZi5sZW5ndGgpe2Nhc2UgMDpPKCk7YnJlYWs7Y2FzZSAxOk8oZlswXSk7YnJlYWs7Y2FzZSAyOk8oZlswXSxmWzFdKTticmVhaztjYXNlIDM6TyhmWzBdLGZbMV0sZlsyXSk7YnJlYWs7ZGVmYXVsdDpPLmFwcGx5KGksZil9fSkoXyl9ZmluYWxseXtQKGgpLEM9ITF9fX19ZnVuY3Rpb24gbChoKXtoLnNvdXJjZT09PXMmJnR5cGVvZiBoLmRhdGE9PSJzdHJpbmciJiZoLmRhdGEuaW5kZXhPZihiKT09PTAmJmMoK2guZGF0YS5zbGljZShiLmxlbmd0aCkpfX0pKHR5cGVvZiBzZWxmPiJ1Ij9yPT09dm9pZCAwP3RoaXM6cjpzZWxmKX0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Ont9KX0se31dfSx7fSxbMTBdKSgxMCl9KX0pO3ZhciBhZT1PYSgoTGEseHIpPT57KGZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO3R5cGVvZiB4cj09Im9iamVjdCImJnR5cGVvZiB4ci5leHBvcnRzPT0ib2JqZWN0Ij94ci5leHBvcnRzPXQuZG9jdW1lbnQ/ZSh0LCEwKTpmdW5jdGlvbihuKXtpZighbi5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gZShuKX06ZSh0KX0pKHR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzpMYSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPW4uc2xpY2UsaT1uLmZsYXQ/ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZmxhdC5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gbi5jb25jYXQuYXBwbHkoW10sYSl9LG89bi5wdXNoLHU9bi5pbmRleE9mLHA9e30sYj1wLnRvU3RyaW5nLGc9cC5oYXNPd25Qcm9wZXJ0eSxtPWcudG9TdHJpbmcsQz1tLmNhbGwoT2JqZWN0KSx5PXt9LFQ9ZnVuY3Rpb24oZCl7cmV0dXJuIHR5cGVvZiBkPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZC5ub2RlVHlwZSE9Im51bWJlciImJnR5cGVvZiBkLml0ZW0hPSJmdW5jdGlvbiJ9LFA9ZnVuY3Rpb24oZCl7cmV0dXJuIGQhPW51bGwmJmQ9PT1kLndpbmRvd30sYz10LmRvY3VtZW50LGw9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBoKGEsZCx2KXt2PXZ8fGM7dmFyIHgsQSxJPXYuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoSS50ZXh0PWEsZClmb3IoeCBpbiBsKUE9ZFt4XXx8ZC5nZXRBdHRyaWJ1dGUmJmQuZ2V0QXR0cmlidXRlKHgpLEEmJkkuc2V0QXR0cmlidXRlKHgsQSk7di5oZWFkLmFwcGVuZENoaWxkKEkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoSSl9ZnVuY3Rpb24gXyhhKXtyZXR1cm4gYT09bnVsbD9hKyIiOnR5cGVvZiBhPT0ib2JqZWN0Inx8dHlwZW9mIGE9PSJmdW5jdGlvbiI/cFtiLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX12YXIgRj0iMy43LjEiLE89L0hUTUwkL2ksZj1mdW5jdGlvbihhLGQpe3JldHVybiBuZXcgZi5mbi5pbml0KGEsZCl9O2YuZm49Zi5wcm90b3R5cGU9e2pxdWVyeTpGLGNvbnN0cnVjdG9yOmYsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBzLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9zLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBkPWYubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBkLnByZXZPYmplY3Q9dGhpcyxkfSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiBmLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLm1hcCh0aGlzLGZ1bmN0aW9uKGQsdil7cmV0dXJuIGEuY2FsbChkLHYsZCl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHMuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLmdyZXAodGhpcyxmdW5jdGlvbihhLGQpe3JldHVybihkKzEpJTJ9KSl9LG9kZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLmdyZXAodGhpcyxmdW5jdGlvbihhLGQpe3JldHVybiBkJTJ9KSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMubGVuZ3RoLHY9K2ErKGE8MD9kOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayh2Pj0wJiZ2PGQ/W3RoaXNbdl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOm8sc29ydDpuLnNvcnQsc3BsaWNlOm4uc3BsaWNlfSxmLmV4dGVuZD1mLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGQsdix4LEEsSSxOPWFyZ3VtZW50c1swXXx8e30sWT0xLFc9YXJndW1lbnRzLmxlbmd0aCxKPSExO2Zvcih0eXBlb2YgTj09ImJvb2xlYW4iJiYoSj1OLE49YXJndW1lbnRzW1ldfHx7fSxZKyspLHR5cGVvZiBOIT0ib2JqZWN0IiYmIVQoTikmJihOPXt9KSxZPT09VyYmKE49dGhpcyxZLS0pO1k8VztZKyspaWYoKGE9YXJndW1lbnRzW1ldKSE9bnVsbClmb3IoZCBpbiBhKXg9YVtkXSwhKGQ9PT0iX19wcm90b19fInx8Tj09PXgpJiYoSiYmeCYmKGYuaXNQbGFpbk9iamVjdCh4KXx8KEE9QXJyYXkuaXNBcnJheSh4KSkpPyh2PU5bZF0sQSYmIUFycmF5LmlzQXJyYXkodik/ST1bXTohQSYmIWYuaXNQbGFpbk9iamVjdCh2KT9JPXt9Okk9dixBPSExLE5bZF09Zi5leHRlbmQoSixJLHgpKTp4IT09dm9pZCAwJiYoTltkXT14KSk7cmV0dXJuIE59LGYuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhGK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBkLHY7cmV0dXJuIWF8fGIuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0iPyExOihkPXIoYSksZD8odj1nLmNhbGwoZCwiY29uc3RydWN0b3IiKSYmZC5jb25zdHJ1Y3Rvcix0eXBlb2Ygdj09ImZ1bmN0aW9uIiYmbS5jYWxsKHYpPT09Qyk6ITApfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBkO2ZvcihkIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYSxkLHYpe2goYSx7bm9uY2U6ZCYmZC5ub25jZX0sdil9LGVhY2g6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTA7aWYoVShhKSlmb3Iodj1hLmxlbmd0aDt4PHYmJmQuY2FsbChhW3hdLHgsYVt4XSkhPT0hMTt4KyspO2Vsc2UgZm9yKHggaW4gYSlpZihkLmNhbGwoYVt4XSx4LGFbeF0pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGQsdj0iIix4PTAsQT1hLm5vZGVUeXBlO2lmKCFBKWZvcig7ZD1hW3grK107KXYrPWYudGV4dChkKTtyZXR1cm4gQT09PTF8fEE9PT0xMT9hLnRleHRDb250ZW50OkE9PT05P2EuZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50OkE9PT0zfHxBPT09ND9hLm5vZGVWYWx1ZTp2fSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxkKXt2YXIgdj1kfHxbXTtyZXR1cm4gYSE9bnVsbCYmKFUoT2JqZWN0KGEpKT9mLm1lcmdlKHYsdHlwZW9mIGE9PSJzdHJpbmciP1thXTphKTpvLmNhbGwodixhKSksdn0saW5BcnJheTpmdW5jdGlvbihhLGQsdil7cmV0dXJuIGQ9PW51bGw/LTE6dS5jYWxsKGQsYSx2KX0saXNYTUxEb2M6ZnVuY3Rpb24oYSl7dmFyIGQ9YSYmYS5uYW1lc3BhY2VVUkksdj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIU8udGVzdChkfHx2JiZ2Lm5vZGVOYW1lfHwiSFRNTCIpfSxtZXJnZTpmdW5jdGlvbihhLGQpe2Zvcih2YXIgdj0rZC5sZW5ndGgseD0wLEE9YS5sZW5ndGg7eDx2O3grKylhW0ErK109ZFt4XTtyZXR1cm4gYS5sZW5ndGg9QSxhfSxncmVwOmZ1bmN0aW9uKGEsZCx2KXtmb3IodmFyIHgsQT1bXSxJPTAsTj1hLmxlbmd0aCxZPSF2O0k8TjtJKyspeD0hZChhW0ldLEkpLHghPT1ZJiZBLnB1c2goYVtJXSk7cmV0dXJuIEF9LG1hcDpmdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJPTAsTj1bXTtpZihVKGEpKWZvcih4PWEubGVuZ3RoO0k8eDtJKyspQT1kKGFbSV0sSSx2KSxBIT1udWxsJiZOLnB1c2goQSk7ZWxzZSBmb3IoSSBpbiBhKUE9ZChhW0ldLEksdiksQSE9bnVsbCYmTi5wdXNoKEEpO3JldHVybiBpKE4pfSxndWlkOjEsc3VwcG9ydDp5fSksdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmKGYuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLGYuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxkKXtwWyJbb2JqZWN0ICIrZCsiXSJdPWQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIFUoYSl7dmFyIGQ9ISFhJiYibGVuZ3RoImluIGEmJmEubGVuZ3RoLHY9XyhhKTtyZXR1cm4gVChhKXx8UChhKT8hMTp2PT09ImFycmF5Inx8ZD09PTB8fHR5cGVvZiBkPT0ibnVtYmVyIiYmZD4wJiZkLTEgaW4gYX1mdW5jdGlvbiBYKGEsZCl7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWQudG9Mb3dlckNhc2UoKX12YXIgUT1uLnBvcCxFPW4uc29ydCwkPW4uc3BsaWNlLHc9IltcXHgyMFxcdFxcclxcblxcZl0iLGs9bmV3IFJlZ0V4cCgiXiIrdysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIit3KyIrJCIsImciKTtmLmNvbnRhaW5zPWZ1bmN0aW9uKGEsZCl7dmFyIHY9ZCYmZC5wYXJlbnROb2RlO3JldHVybiBhPT09dnx8ISEodiYmdi5ub2RlVHlwZT09PTEmJihhLmNvbnRhaW5zP2EuY29udGFpbnModik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih2KSYxNikpfTt2YXIgUz0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlx4ODAtXHVGRkZGXHctXS9nO2Z1bmN0aW9uIEIoYSxkKXtyZXR1cm4gZD9hPT09IlwwIj8iXHVGRkZEIjphLnNsaWNlKDAsLTEpKyJcXCIrYS5jaGFyQ29kZUF0KGEubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIithfWYuZXNjYXBlU2VsZWN0b3I9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoUyxCKX07dmFyIEw9YyxSPW87KGZ1bmN0aW9uKCl7dmFyIGEsZCx2LHgsQSxJPVIsTixZLFcsSixkdCxmdD1mLmV4cGFuZG8sc3Q9MCx5dD0wLE90PXZyKCksWHQ9dnIoKSxWdD12cigpLHVlPXZyKCksb2U9ZnVuY3Rpb24oTSxaKXtyZXR1cm4gTT09PVomJihBPSEwKSwwfSxHZT0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLHFlPSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrdysiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixxdD0iXFxbIit3KyIqKCIrcWUrIikoPzoiK3crIiooWypeJHwhfl0/PSkiK3crYCooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3wiKCg/OlxcXFwufFteXFxcXCJdKSopInwoYCtxZSsiKSl8KSIrdysiKlxcXSIsYm49IjooIitxZStgKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8IigoPzpcXFxcLnxbXlxcXFwiXSkqKSIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfGArcXQrIikqKXwuKilcXCl8KSIsWXQ9bmV3IFJlZ0V4cCh3KyIrIiwiZyIpLHJlPW5ldyBSZWdFeHAoIl4iK3crIiosIit3KyIqIiksWG49bmV3IFJlZ0V4cCgiXiIrdysiKihbPit+XXwiK3crIikiK3crIioiKSxvaT1uZXcgUmVnRXhwKHcrInw+IiksWGU9bmV3IFJlZ0V4cChibiksWW49bmV3IFJlZ0V4cCgiXiIrcWUrIiQiKSxZZT17SUQ6bmV3IFJlZ0V4cCgiXiMoIitxZSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitxZSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrcWUrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitxdCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK2JuKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK3crIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK3crIiooPzooWystXXwpIit3KyIqKFxcZCspfCkpIit3KyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitHZSsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK3crIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrdysiKigoPzotXFxkKT9cXGQqKSIrdysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sZW49L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxubj0vXmhcZCQvaSxQZT0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGxpPS9bK35dLyxKZT1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrdysiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIiksUWU9ZnVuY3Rpb24oTSxaKXt2YXIgaXQ9IjB4IitNLnNsaWNlKDEpLTY1NTM2O3JldHVybiBafHwoaXQ8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKGl0KzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGl0Pj4xMHw1NTI5NixpdCYxMDIzfDU2MzIwKSl9LGpvPWZ1bmN0aW9uKCl7cm4oKX0sTW89eXIoZnVuY3Rpb24oTSl7cmV0dXJuIE0uZGlzYWJsZWQ9PT0hMCYmWChNLCJmaWVsZHNldCIpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7ZnVuY3Rpb24gVm8oKXt0cnl7cmV0dXJuIE4uYWN0aXZlRWxlbWVudH1jYXRjaHt9fXRyeXtJLmFwcGx5KG49cy5jYWxsKEwuY2hpbGROb2RlcyksTC5jaGlsZE5vZGVzKSxuW0wuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoe0k9e2FwcGx5OmZ1bmN0aW9uKFosaXQpe1IuYXBwbHkoWixzLmNhbGwoaXQpKX0sY2FsbDpmdW5jdGlvbihaKXtSLmFwcGx5KFoscy5jYWxsKGFyZ3VtZW50cywxKSl9fX1mdW5jdGlvbiBKdChNLFosaXQsbHQpe3ZhciBjdCxfdCxEdCxQdCxBdCxIdCxOdCxSdD1aJiZaLm93bmVyRG9jdW1lbnQsVXQ9Wj9aLm5vZGVUeXBlOjk7aWYoaXQ9aXR8fFtdLHR5cGVvZiBNIT0ic3RyaW5nInx8IU18fFV0IT09MSYmVXQhPT05JiZVdCE9PTExKXJldHVybiBpdDtpZighbHQmJihybihaKSxaPVp8fE4sVykpe2lmKFV0IT09MTEmJihBdD1QZS5leGVjKE0pKSlpZihjdD1BdFsxXSl7aWYoVXQ9PT05KWlmKER0PVouZ2V0RWxlbWVudEJ5SWQoY3QpKXtpZihEdC5pZD09PWN0KXJldHVybiBJLmNhbGwoaXQsRHQpLGl0fWVsc2UgcmV0dXJuIGl0O2Vsc2UgaWYoUnQmJihEdD1SdC5nZXRFbGVtZW50QnlJZChjdCkpJiZKdC5jb250YWlucyhaLER0KSYmRHQuaWQ9PT1jdClyZXR1cm4gSS5jYWxsKGl0LER0KSxpdH1lbHNle2lmKEF0WzJdKXJldHVybiBJLmFwcGx5KGl0LFouZ2V0RWxlbWVudHNCeVRhZ05hbWUoTSkpLGl0O2lmKChjdD1BdFszXSkmJlouZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSS5hcHBseShpdCxaLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY3QpKSxpdH1pZighdWVbTSsiICJdJiYoIUp8fCFKLnRlc3QoTSkpKXtpZihOdD1NLFJ0PVosVXQ9PT0xJiYob2kudGVzdChNKXx8WG4udGVzdChNKSkpe2ZvcihSdD1saS50ZXN0KE0pJiZkaShaLnBhcmVudE5vZGUpfHxaLChSdCE9Wnx8IXkuc2NvcGUpJiYoKFB0PVouZ2V0QXR0cmlidXRlKCJpZCIpKT9QdD1mLmVzY2FwZVNlbGVjdG9yKFB0KTpaLnNldEF0dHJpYnV0ZSgiaWQiLFB0PWZ0KSksSHQ9JG4oTSksX3Q9SHQubGVuZ3RoO190LS07KUh0W190XT0oUHQ/IiMiK1B0OiI6c2NvcGUiKSsiICIrZ3IoSHRbX3RdKTtOdD1IdC5qb2luKCIsIil9dHJ5e3JldHVybiBJLmFwcGx5KGl0LFJ0LnF1ZXJ5U2VsZWN0b3JBbGwoTnQpKSxpdH1jYXRjaHt1ZShNLCEwKX1maW5hbGx5e1B0PT09ZnQmJloucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIEJhKE0ucmVwbGFjZShrLCIkMSIpLFosaXQsbHQpfWZ1bmN0aW9uIHZyKCl7dmFyIE09W107ZnVuY3Rpb24gWihpdCxsdCl7cmV0dXJuIE0ucHVzaChpdCsiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBaW00uc2hpZnQoKV0sWltpdCsiICJdPWx0fXJldHVybiBafWZ1bmN0aW9uIFZlKE0pe3JldHVybiBNW2Z0XT0hMCxNfWZ1bmN0aW9uIEluKE0pe3ZhciBaPU4uY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFNKFopfWNhdGNoe3JldHVybiExfWZpbmFsbHl7Wi5wYXJlbnROb2RlJiZaLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWiksWj1udWxsfX1mdW5jdGlvbiBIbyhNKXtyZXR1cm4gZnVuY3Rpb24oWil7cmV0dXJuIFgoWiwiaW5wdXQiKSYmWi50eXBlPT09TX19ZnVuY3Rpb24gVW8oTSl7cmV0dXJuIGZ1bmN0aW9uKFope3JldHVybihYKFosImlucHV0Iil8fFgoWiwiYnV0dG9uIikpJiZaLnR5cGU9PT1NfX1mdW5jdGlvbiBQYShNKXtyZXR1cm4gZnVuY3Rpb24oWil7cmV0dXJuImZvcm0iaW4gWj9aLnBhcmVudE5vZGUmJlouZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gWj8ibGFiZWwiaW4gWi5wYXJlbnROb2RlP1oucGFyZW50Tm9kZS5kaXNhYmxlZD09PU06Wi5kaXNhYmxlZD09PU06Wi5pc0Rpc2FibGVkPT09TXx8Wi5pc0Rpc2FibGVkIT09IU0mJk1vKFopPT09TTpaLmRpc2FibGVkPT09TToibGFiZWwiaW4gWj9aLmRpc2FibGVkPT09TTohMX19ZnVuY3Rpb24gbW4oTSl7cmV0dXJuIFZlKGZ1bmN0aW9uKFope3JldHVybiBaPStaLFZlKGZ1bmN0aW9uKGl0LGx0KXtmb3IodmFyIGN0LF90PU0oW10saXQubGVuZ3RoLFopLER0PV90Lmxlbmd0aDtEdC0tOylpdFtjdD1fdFtEdF1dJiYoaXRbY3RdPSEobHRbY3RdPWl0W2N0XSkpfSl9KX1mdW5jdGlvbiBkaShNKXtyZXR1cm4gTSYmdHlwZW9mIE0uZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiJiZNfWZ1bmN0aW9uIHJuKE0pe3ZhciBaLGl0PU0/TS5vd25lckRvY3VtZW50fHxNOkw7cmV0dXJuIGl0PT1OfHxpdC5ub2RlVHlwZSE9PTl8fCFpdC5kb2N1bWVudEVsZW1lbnR8fChOPWl0LFk9Ti5kb2N1bWVudEVsZW1lbnQsVz0hZi5pc1hNTERvYyhOKSxkdD1ZLm1hdGNoZXN8fFkud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxZLm1zTWF0Y2hlc1NlbGVjdG9yLFkubXNNYXRjaGVzU2VsZWN0b3ImJkwhPU4mJihaPU4uZGVmYXVsdFZpZXcpJiZaLnRvcCE9PVomJlouYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixqbykseS5nZXRCeUlkPUluKGZ1bmN0aW9uKGx0KXtyZXR1cm4gWS5hcHBlbmRDaGlsZChsdCkuaWQ9Zi5leHBhbmRvLCFOLmdldEVsZW1lbnRzQnlOYW1lfHwhTi5nZXRFbGVtZW50c0J5TmFtZShmLmV4cGFuZG8pLmxlbmd0aH0pLHkuZGlzY29ubmVjdGVkTWF0Y2g9SW4oZnVuY3Rpb24obHQpe3JldHVybiBkdC5jYWxsKGx0LCIqIil9KSx5LnNjb3BlPUluKGZ1bmN0aW9uKCl7cmV0dXJuIE4ucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIil9KSx5LmNzc0hhcz1JbihmdW5jdGlvbigpe3RyeXtyZXR1cm4gTi5xdWVyeVNlbGVjdG9yKCI6aGFzKCosOmpxZmFrZSkiKSwhMX1jYXRjaHtyZXR1cm4hMH19KSx5LmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGx0KXt2YXIgY3Q9bHQucmVwbGFjZShKZSxRZSk7cmV0dXJuIGZ1bmN0aW9uKF90KXtyZXR1cm4gX3QuZ2V0QXR0cmlidXRlKCJpZCIpPT09Y3R9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24obHQsY3Qpe2lmKHR5cGVvZiBjdC5nZXRFbGVtZW50QnlJZDwidSImJlcpe3ZhciBfdD1jdC5nZXRFbGVtZW50QnlJZChsdCk7cmV0dXJuIF90P1tfdF06W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGx0KXt2YXIgY3Q9bHQucmVwbGFjZShKZSxRZSk7cmV0dXJuIGZ1bmN0aW9uKF90KXt2YXIgRHQ9dHlwZW9mIF90LmdldEF0dHJpYnV0ZU5vZGU8InUiJiZfdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBEdCYmRHQudmFsdWU9PT1jdH19LGQuZmluZC5JRD1mdW5jdGlvbihsdCxjdCl7aWYodHlwZW9mIGN0LmdldEVsZW1lbnRCeUlkPCJ1IiYmVyl7dmFyIF90LER0LFB0LEF0PWN0LmdldEVsZW1lbnRCeUlkKGx0KTtpZihBdCl7aWYoX3Q9QXQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSxfdCYmX3QudmFsdWU9PT1sdClyZXR1cm5bQXRdO2ZvcihQdD1jdC5nZXRFbGVtZW50c0J5TmFtZShsdCksRHQ9MDtBdD1QdFtEdCsrXTspaWYoX3Q9QXQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSxfdCYmX3QudmFsdWU9PT1sdClyZXR1cm5bQXRdfXJldHVybltdfX0pLGQuZmluZC5UQUc9ZnVuY3Rpb24obHQsY3Qpe3JldHVybiB0eXBlb2YgY3QuZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiP2N0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGx0KTpjdC5xdWVyeVNlbGVjdG9yQWxsKGx0KX0sZC5maW5kLkNMQVNTPWZ1bmN0aW9uKGx0LGN0KXtpZih0eXBlb2YgY3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZTwidSImJlcpcmV0dXJuIGN0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobHQpfSxKPVtdLEluKGZ1bmN0aW9uKGx0KXt2YXIgY3Q7WS5hcHBlbmRDaGlsZChsdCkuaW5uZXJIVE1MPSI8YSBpZD0nIitmdCsiJyBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgaWQ9JyIrZnQrIi1cclxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixsdC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxKLnB1c2goIlxcWyIrdysiKig/OnZhbHVlfCIrR2UrIikiKSxsdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrZnQrIi1dIikubGVuZ3RofHxKLnB1c2goIn49IiksbHQucXVlcnlTZWxlY3RvckFsbCgiYSMiK2Z0KyIrKiIpLmxlbmd0aHx8Si5wdXNoKCIuIy4rWyt+XSIpLGx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxKLnB1c2goIjpjaGVja2VkIiksY3Q9Ti5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGN0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGx0LmFwcGVuZENoaWxkKGN0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksWS5hcHBlbmRDaGlsZChsdCkuZGlzYWJsZWQ9ITAsbHQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoIT09MiYmSi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGN0PU4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCIiKSxsdC5hcHBlbmRDaGlsZChjdCksbHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9JyddIikubGVuZ3RofHxKLnB1c2goIlxcWyIrdysiKm5hbWUiK3crIio9Iit3K2AqKD86Jyd8IiIpYCl9KSx5LmNzc0hhc3x8Si5wdXNoKCI6aGFzIiksSj1KLmxlbmd0aCYmbmV3IFJlZ0V4cChKLmpvaW4oInwiKSksb2U9ZnVuY3Rpb24obHQsY3Qpe2lmKGx0PT09Y3QpcmV0dXJuIEE9ITAsMDt2YXIgX3Q9IWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFjdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gX3R8fChfdD0obHQub3duZXJEb2N1bWVudHx8bHQpPT0oY3Qub3duZXJEb2N1bWVudHx8Y3QpP2x0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGN0KToxLF90JjF8fCF5LnNvcnREZXRhY2hlZCYmY3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24obHQpPT09X3Q/bHQ9PT1OfHxsdC5vd25lckRvY3VtZW50PT1MJiZKdC5jb250YWlucyhMLGx0KT8tMTpjdD09PU58fGN0Lm93bmVyRG9jdW1lbnQ9PUwmJkp0LmNvbnRhaW5zKEwsY3QpPzE6eD91LmNhbGwoeCxsdCktdS5jYWxsKHgsY3QpOjA6X3QmND8tMToxKX0pLE59SnQubWF0Y2hlcz1mdW5jdGlvbihNLFope3JldHVybiBKdChNLG51bGwsbnVsbCxaKX0sSnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKE0sWil7aWYocm4oTSksVyYmIXVlW1orIiAiXSYmKCFKfHwhSi50ZXN0KFopKSl0cnl7dmFyIGl0PWR0LmNhbGwoTSxaKTtpZihpdHx8eS5kaXNjb25uZWN0ZWRNYXRjaHx8TS5kb2N1bWVudCYmTS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBpdH1jYXRjaHt1ZShaLCEwKX1yZXR1cm4gSnQoWixOLG51bGwsW01dKS5sZW5ndGg+MH0sSnQuY29udGFpbnM9ZnVuY3Rpb24oTSxaKXtyZXR1cm4oTS5vd25lckRvY3VtZW50fHxNKSE9TiYmcm4oTSksZi5jb250YWlucyhNLFopfSxKdC5hdHRyPWZ1bmN0aW9uKE0sWil7KE0ub3duZXJEb2N1bWVudHx8TSkhPU4mJnJuKE0pO3ZhciBpdD1kLmF0dHJIYW5kbGVbWi50b0xvd2VyQ2FzZSgpXSxsdD1pdCYmZy5jYWxsKGQuYXR0ckhhbmRsZSxaLnRvTG93ZXJDYXNlKCkpP2l0KE0sWiwhVyk6dm9pZCAwO3JldHVybiBsdCE9PXZvaWQgMD9sdDpNLmdldEF0dHJpYnV0ZShaKX0sSnQuZXJyb3I9ZnVuY3Rpb24oTSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK00pfSxmLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oTSl7dmFyIFosaXQ9W10sbHQ9MCxjdD0wO2lmKEE9IXkuc29ydFN0YWJsZSx4PSF5LnNvcnRTdGFibGUmJnMuY2FsbChNLDApLEUuY2FsbChNLG9lKSxBKXtmb3IoO1o9TVtjdCsrXTspWj09PU1bY3RdJiYobHQ9aXQucHVzaChjdCkpO2Zvcig7bHQtLTspJC5jYWxsKE0saXRbbHRdLDEpfXJldHVybiB4PW51bGwsTX0sZi5mbi51bmlxdWVTb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYudW5pcXVlU29ydChzLmFwcGx5KHRoaXMpKSl9LGQ9Zi5leHByPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86VmUsbWF0Y2g6WWUsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKE0pe3JldHVybiBNWzFdPU1bMV0ucmVwbGFjZShKZSxRZSksTVszXT0oTVszXXx8TVs0XXx8TVs1XXx8IiIpLnJlcGxhY2UoSmUsUWUpLE1bMl09PT0ifj0iJiYoTVszXT0iICIrTVszXSsiICIpLE0uc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oTSl7cmV0dXJuIE1bMV09TVsxXS50b0xvd2VyQ2FzZSgpLE1bMV0uc2xpY2UoMCwzKT09PSJudGgiPyhNWzNdfHxKdC5lcnJvcihNWzBdKSxNWzRdPSsoTVs0XT9NWzVdKyhNWzZdfHwxKToyKihNWzNdPT09ImV2ZW4ifHxNWzNdPT09Im9kZCIpKSxNWzVdPSsoTVs3XStNWzhdfHxNWzNdPT09Im9kZCIpKTpNWzNdJiZKdC5lcnJvcihNWzBdKSxNfSxQU0VVRE86ZnVuY3Rpb24oTSl7dmFyIFosaXQ9IU1bNl0mJk1bMl07cmV0dXJuIFllLkNISUxELnRlc3QoTVswXSk/bnVsbDooTVszXT9NWzJdPU1bNF18fE1bNV18fCIiOml0JiZYZS50ZXN0KGl0KSYmKFo9JG4oaXQsITApKSYmKFo9aXQuaW5kZXhPZigiKSIsaXQubGVuZ3RoLVopLWl0Lmxlbmd0aCkmJihNWzBdPU1bMF0uc2xpY2UoMCxaKSxNWzJdPWl0LnNsaWNlKDAsWikpLE0uc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihNKXt2YXIgWj1NLnJlcGxhY2UoSmUsUWUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIE09PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oaXQpe3JldHVybiBYKGl0LFopfX0sQ0xBU1M6ZnVuY3Rpb24oTSl7dmFyIFo9T3RbTSsiICJdO3JldHVybiBafHwoWj1uZXcgUmVnRXhwKCIoXnwiK3crIikiK00rIigiK3crInwkKSIpKSYmT3QoTSxmdW5jdGlvbihpdCl7cmV0dXJuIFoudGVzdCh0eXBlb2YgaXQuY2xhc3NOYW1lPT0ic3RyaW5nIiYmaXQuY2xhc3NOYW1lfHx0eXBlb2YgaXQuZ2V0QXR0cmlidXRlPCJ1IiYmaXQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihNLFosaXQpe3JldHVybiBmdW5jdGlvbihsdCl7dmFyIGN0PUp0LmF0dHIobHQsTSk7cmV0dXJuIGN0PT1udWxsP1o9PT0iIT0iOlo/KGN0Kz0iIixaPT09Ij0iP2N0PT09aXQ6Wj09PSIhPSI/Y3QhPT1pdDpaPT09Il49Ij9pdCYmY3QuaW5kZXhPZihpdCk9PT0wOlo9PT0iKj0iP2l0JiZjdC5pbmRleE9mKGl0KT4tMTpaPT09IiQ9Ij9pdCYmY3Quc2xpY2UoLWl0Lmxlbmd0aCk9PT1pdDpaPT09In49Ij8oIiAiK2N0LnJlcGxhY2UoWXQsIiAiKSsiICIpLmluZGV4T2YoaXQpPi0xOlo9PT0ifD0iP2N0PT09aXR8fGN0LnNsaWNlKDAsaXQubGVuZ3RoKzEpPT09aXQrIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKE0sWixpdCxsdCxjdCl7dmFyIF90PU0uc2xpY2UoMCwzKSE9PSJudGgiLER0PU0uc2xpY2UoLTQpIT09Imxhc3QiLFB0PVo9PT0ib2YtdHlwZSI7cmV0dXJuIGx0PT09MSYmY3Q9PT0wP2Z1bmN0aW9uKEF0KXtyZXR1cm4hIUF0LnBhcmVudE5vZGV9OmZ1bmN0aW9uKEF0LEh0LE50KXt2YXIgUnQsVXQsRnQsbmUseGUsaGU9X3QhPT1EdD8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLEZlPUF0LnBhcmVudE5vZGUsJGU9UHQmJkF0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksUG49IU50JiYhUHQscGU9ITE7aWYoRmUpe2lmKF90KXtmb3IoO2hlOyl7Zm9yKEZ0PUF0O0Z0PUZ0W2hlXTspaWYoUHQ/WChGdCwkZSk6RnQubm9kZVR5cGU9PT0xKXJldHVybiExO3hlPWhlPU09PT0ib25seSImJiF4ZSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih4ZT1bRHQ/RmUuZmlyc3RDaGlsZDpGZS5sYXN0Q2hpbGRdLER0JiZQbil7Zm9yKFV0PUZlW2Z0XXx8KEZlW2Z0XT17fSksUnQ9VXRbTV18fFtdLG5lPVJ0WzBdPT09c3QmJlJ0WzFdLHBlPW5lJiZSdFsyXSxGdD1uZSYmRmUuY2hpbGROb2Rlc1tuZV07RnQ9KytuZSYmRnQmJkZ0W2hlXXx8KHBlPW5lPTApfHx4ZS5wb3AoKTspaWYoRnQubm9kZVR5cGU9PT0xJiYrK3BlJiZGdD09PUF0KXtVdFtNXT1bc3QsbmUscGVdO2JyZWFrfX1lbHNlIGlmKFBuJiYoVXQ9QXRbZnRdfHwoQXRbZnRdPXt9KSxSdD1VdFtNXXx8W10sbmU9UnRbMF09PT1zdCYmUnRbMV0scGU9bmUpLHBlPT09ITEpZm9yKDsoRnQ9KytuZSYmRnQmJkZ0W2hlXXx8KHBlPW5lPTApfHx4ZS5wb3AoKSkmJiEoKFB0P1goRnQsJGUpOkZ0Lm5vZGVUeXBlPT09MSkmJisrcGUmJihQbiYmKFV0PUZ0W2Z0XXx8KEZ0W2Z0XT17fSksVXRbTV09W3N0LHBlXSksRnQ9PT1BdCkpOyk7cmV0dXJuIHBlLT1jdCxwZT09PWx0fHxwZSVsdD09PTAmJnBlL2x0Pj0wfX19LFBTRVVETzpmdW5jdGlvbihNLFope3ZhciBpdCxsdD1kLnBzZXVkb3NbTV18fGQuc2V0RmlsdGVyc1tNLnRvTG93ZXJDYXNlKCldfHxKdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK00pO3JldHVybiBsdFtmdF0/bHQoWik6bHQubGVuZ3RoPjE/KGl0PVtNLE0sIiIsWl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KE0udG9Mb3dlckNhc2UoKSk/VmUoZnVuY3Rpb24oY3QsX3Qpe2Zvcih2YXIgRHQsUHQ9bHQoY3QsWiksQXQ9UHQubGVuZ3RoO0F0LS07KUR0PXUuY2FsbChjdCxQdFtBdF0pLGN0W0R0XT0hKF90W0R0XT1QdFtBdF0pfSk6ZnVuY3Rpb24oY3Qpe3JldHVybiBsdChjdCwwLGl0KX0pOmx0fX0scHNldWRvczp7bm90OlZlKGZ1bmN0aW9uKE0pe3ZhciBaPVtdLGl0PVtdLGx0PWhpKE0ucmVwbGFjZShrLCIkMSIpKTtyZXR1cm4gbHRbZnRdP1ZlKGZ1bmN0aW9uKGN0LF90LER0LFB0KXtmb3IodmFyIEF0LEh0PWx0KGN0LG51bGwsUHQsW10pLE50PWN0Lmxlbmd0aDtOdC0tOykoQXQ9SHRbTnRdKSYmKGN0W050XT0hKF90W050XT1BdCkpfSk6ZnVuY3Rpb24oY3QsX3QsRHQpe3JldHVybiBaWzBdPWN0LGx0KFosbnVsbCxEdCxpdCksWlswXT1udWxsLCFpdC5wb3AoKX19KSxoYXM6VmUoZnVuY3Rpb24oTSl7cmV0dXJuIGZ1bmN0aW9uKFope3JldHVybiBKdChNLFopLmxlbmd0aD4wfX0pLGNvbnRhaW5zOlZlKGZ1bmN0aW9uKE0pe3JldHVybiBNPU0ucmVwbGFjZShKZSxRZSksZnVuY3Rpb24oWil7cmV0dXJuKFoudGV4dENvbnRlbnR8fGYudGV4dChaKSkuaW5kZXhPZihNKT4tMX19KSxsYW5nOlZlKGZ1bmN0aW9uKE0pe3JldHVybiBZbi50ZXN0KE18fCIiKXx8SnQuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrTSksTT1NLnJlcGxhY2UoSmUsUWUpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oWil7dmFyIGl0O2RvIGlmKGl0PVc/Wi5sYW5nOlouZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxaLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBpdD1pdC50b0xvd2VyQ2FzZSgpLGl0PT09TXx8aXQuaW5kZXhPZihNKyItIik9PT0wO3doaWxlKChaPVoucGFyZW50Tm9kZSkmJloubm9kZVR5cGU9PT0xKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oTSl7dmFyIFo9dC5sb2NhdGlvbiYmdC5sb2NhdGlvbi5oYXNoO3JldHVybiBaJiZaLnNsaWNlKDEpPT09TS5pZH0scm9vdDpmdW5jdGlvbihNKXtyZXR1cm4gTT09PVl9LGZvY3VzOmZ1bmN0aW9uKE0pe3JldHVybiBNPT09Vm8oKSYmTi5oYXNGb2N1cygpJiYhIShNLnR5cGV8fE0uaHJlZnx8fk0udGFiSW5kZXgpfSxlbmFibGVkOlBhKCExKSxkaXNhYmxlZDpQYSghMCksY2hlY2tlZDpmdW5jdGlvbihNKXtyZXR1cm4gWChNLCJpbnB1dCIpJiYhIU0uY2hlY2tlZHx8WChNLCJvcHRpb24iKSYmISFNLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihNKXtyZXR1cm4gTS5wYXJlbnROb2RlJiZNLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxNLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKE0pe2ZvcihNPU0uZmlyc3RDaGlsZDtNO009TS5uZXh0U2libGluZylpZihNLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihNKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KE0pfSxoZWFkZXI6ZnVuY3Rpb24oTSl7cmV0dXJuIG5uLnRlc3QoTS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKE0pe3JldHVybiBlbi50ZXN0KE0ubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oTSl7cmV0dXJuIFgoTSwiaW5wdXQiKSYmTS50eXBlPT09ImJ1dHRvbiJ8fFgoTSwiYnV0dG9uIil9LHRleHQ6ZnVuY3Rpb24oTSl7dmFyIFo7cmV0dXJuIFgoTSwiaW5wdXQiKSYmTS50eXBlPT09InRleHQiJiYoKFo9TS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fFoudG9Mb3dlckNhc2UoKT09PSJ0ZXh0Iil9LGZpcnN0Om1uKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDptbihmdW5jdGlvbihNLFope3JldHVybltaLTFdfSksZXE6bW4oZnVuY3Rpb24oTSxaLGl0KXtyZXR1cm5baXQ8MD9pdCtaOml0XX0pLGV2ZW46bW4oZnVuY3Rpb24oTSxaKXtmb3IodmFyIGl0PTA7aXQ8WjtpdCs9MilNLnB1c2goaXQpO3JldHVybiBNfSksb2RkOm1uKGZ1bmN0aW9uKE0sWil7Zm9yKHZhciBpdD0xO2l0PFo7aXQrPTIpTS5wdXNoKGl0KTtyZXR1cm4gTX0pLGx0Om1uKGZ1bmN0aW9uKE0sWixpdCl7dmFyIGx0O2ZvcihpdDwwP2x0PWl0K1o6aXQ+Wj9sdD1aOmx0PWl0Oy0tbHQ+PTA7KU0ucHVzaChsdCk7cmV0dXJuIE19KSxndDptbihmdW5jdGlvbihNLFosaXQpe2Zvcih2YXIgbHQ9aXQ8MD9pdCtaOml0OysrbHQ8WjspTS5wdXNoKGx0KTtyZXR1cm4gTX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGEgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2FdPUhvKGEpO2ZvcihhIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2FdPVVvKGEpO2Z1bmN0aW9uIEZhKCl7fUZhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgRmE7ZnVuY3Rpb24gJG4oTSxaKXt2YXIgaXQsbHQsY3QsX3QsRHQsUHQsQXQsSHQ9WHRbTSsiICJdO2lmKEh0KXJldHVybiBaPzA6SHQuc2xpY2UoMCk7Zm9yKER0PU0sUHQ9W10sQXQ9ZC5wcmVGaWx0ZXI7RHQ7KXsoIWl0fHwobHQ9cmUuZXhlYyhEdCkpKSYmKGx0JiYoRHQ9RHQuc2xpY2UobHRbMF0ubGVuZ3RoKXx8RHQpLFB0LnB1c2goY3Q9W10pKSxpdD0hMSwobHQ9WG4uZXhlYyhEdCkpJiYoaXQ9bHQuc2hpZnQoKSxjdC5wdXNoKHt2YWx1ZTppdCx0eXBlOmx0WzBdLnJlcGxhY2UoaywiICIpfSksRHQ9RHQuc2xpY2UoaXQubGVuZ3RoKSk7Zm9yKF90IGluIGQuZmlsdGVyKShsdD1ZZVtfdF0uZXhlYyhEdCkpJiYoIUF0W190XXx8KGx0PUF0W190XShsdCkpKSYmKGl0PWx0LnNoaWZ0KCksY3QucHVzaCh7dmFsdWU6aXQsdHlwZTpfdCxtYXRjaGVzOmx0fSksRHQ9RHQuc2xpY2UoaXQubGVuZ3RoKSk7aWYoIWl0KWJyZWFrfXJldHVybiBaP0R0Lmxlbmd0aDpEdD9KdC5lcnJvcihNKTpYdChNLFB0KS5zbGljZSgwKX1mdW5jdGlvbiBncihNKXtmb3IodmFyIFo9MCxpdD1NLmxlbmd0aCxsdD0iIjtaPGl0O1orKylsdCs9TVtaXS52YWx1ZTtyZXR1cm4gbHR9ZnVuY3Rpb24geXIoTSxaLGl0KXt2YXIgbHQ9Wi5kaXIsY3Q9Wi5uZXh0LF90PWN0fHxsdCxEdD1pdCYmX3Q9PT0icGFyZW50Tm9kZSIsUHQ9eXQrKztyZXR1cm4gWi5maXJzdD9mdW5jdGlvbihBdCxIdCxOdCl7Zm9yKDtBdD1BdFtsdF07KWlmKEF0Lm5vZGVUeXBlPT09MXx8RHQpcmV0dXJuIE0oQXQsSHQsTnQpO3JldHVybiExfTpmdW5jdGlvbihBdCxIdCxOdCl7dmFyIFJ0LFV0LEZ0PVtzdCxQdF07aWYoTnQpe2Zvcig7QXQ9QXRbbHRdOylpZigoQXQubm9kZVR5cGU9PT0xfHxEdCkmJk0oQXQsSHQsTnQpKXJldHVybiEwfWVsc2UgZm9yKDtBdD1BdFtsdF07KWlmKEF0Lm5vZGVUeXBlPT09MXx8RHQpaWYoVXQ9QXRbZnRdfHwoQXRbZnRdPXt9KSxjdCYmWChBdCxjdCkpQXQ9QXRbbHRdfHxBdDtlbHNle2lmKChSdD1VdFtfdF0pJiZSdFswXT09PXN0JiZSdFsxXT09PVB0KXJldHVybiBGdFsyXT1SdFsyXTtpZihVdFtfdF09RnQsRnRbMl09TShBdCxIdCxOdCkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHVpKE0pe3JldHVybiBNLmxlbmd0aD4xP2Z1bmN0aW9uKFosaXQsbHQpe2Zvcih2YXIgY3Q9TS5sZW5ndGg7Y3QtLTspaWYoIU1bY3RdKFosaXQsbHQpKXJldHVybiExO3JldHVybiEwfTpNWzBdfWZ1bmN0aW9uIFdvKE0sWixpdCl7Zm9yKHZhciBsdD0wLGN0PVoubGVuZ3RoO2x0PGN0O2x0KyspSnQoTSxaW2x0XSxpdCk7cmV0dXJuIGl0fWZ1bmN0aW9uIHdyKE0sWixpdCxsdCxjdCl7Zm9yKHZhciBfdCxEdD1bXSxQdD0wLEF0PU0ubGVuZ3RoLEh0PVohPW51bGw7UHQ8QXQ7UHQrKykoX3Q9TVtQdF0pJiYoIWl0fHxpdChfdCxsdCxjdCkpJiYoRHQucHVzaChfdCksSHQmJloucHVzaChQdCkpO3JldHVybiBEdH1mdW5jdGlvbiBjaShNLFosaXQsbHQsY3QsX3Qpe3JldHVybiBsdCYmIWx0W2Z0XSYmKGx0PWNpKGx0KSksY3QmJiFjdFtmdF0mJihjdD1jaShjdCxfdCkpLFZlKGZ1bmN0aW9uKER0LFB0LEF0LEh0KXt2YXIgTnQsUnQsVXQsRnQsbmU9W10seGU9W10saGU9UHQubGVuZ3RoLEZlPUR0fHxXbyhafHwiKiIsQXQubm9kZVR5cGU/W0F0XTpBdCxbXSksJGU9TSYmKER0fHwhWik/d3IoRmUsbmUsTSxBdCxIdCk6RmU7aWYoaXQ/KEZ0PWN0fHwoRHQ/TTpoZXx8bHQpP1tdOlB0LGl0KCRlLEZ0LEF0LEh0KSk6RnQ9JGUsbHQpZm9yKE50PXdyKEZ0LHhlKSxsdChOdCxbXSxBdCxIdCksUnQ9TnQubGVuZ3RoO1J0LS07KShVdD1OdFtSdF0pJiYoRnRbeGVbUnRdXT0hKCRlW3hlW1J0XV09VXQpKTtpZihEdCl7aWYoY3R8fE0pe2lmKGN0KXtmb3IoTnQ9W10sUnQ9RnQubGVuZ3RoO1J0LS07KShVdD1GdFtSdF0pJiZOdC5wdXNoKCRlW1J0XT1VdCk7Y3QobnVsbCxGdD1bXSxOdCxIdCl9Zm9yKFJ0PUZ0Lmxlbmd0aDtSdC0tOykoVXQ9RnRbUnRdKSYmKE50PWN0P3UuY2FsbChEdCxVdCk6bmVbUnRdKT4tMSYmKER0W050XT0hKFB0W050XT1VdCkpfX1lbHNlIEZ0PXdyKEZ0PT09UHQ/RnQuc3BsaWNlKGhlLEZ0Lmxlbmd0aCk6RnQpLGN0P2N0KG51bGwsUHQsRnQsSHQpOkkuYXBwbHkoUHQsRnQpfSl9ZnVuY3Rpb24gZmkoTSl7Zm9yKHZhciBaLGl0LGx0LGN0PU0ubGVuZ3RoLF90PWQucmVsYXRpdmVbTVswXS50eXBlXSxEdD1fdHx8ZC5yZWxhdGl2ZVsiICJdLFB0PV90PzE6MCxBdD15cihmdW5jdGlvbihSdCl7cmV0dXJuIFJ0PT09Wn0sRHQsITApLEh0PXlyKGZ1bmN0aW9uKFJ0KXtyZXR1cm4gdS5jYWxsKFosUnQpPi0xfSxEdCwhMCksTnQ9W2Z1bmN0aW9uKFJ0LFV0LEZ0KXt2YXIgbmU9IV90JiYoRnR8fFV0IT12KXx8KChaPVV0KS5ub2RlVHlwZT9BdChSdCxVdCxGdCk6SHQoUnQsVXQsRnQpKTtyZXR1cm4gWj1udWxsLG5lfV07UHQ8Y3Q7UHQrKylpZihpdD1kLnJlbGF0aXZlW01bUHRdLnR5cGVdKU50PVt5cih1aShOdCksaXQpXTtlbHNle2lmKGl0PWQuZmlsdGVyW01bUHRdLnR5cGVdLmFwcGx5KG51bGwsTVtQdF0ubWF0Y2hlcyksaXRbZnRdKXtmb3IobHQ9KytQdDtsdDxjdCYmIWQucmVsYXRpdmVbTVtsdF0udHlwZV07bHQrKyk7cmV0dXJuIGNpKFB0PjEmJnVpKE50KSxQdD4xJiZncihNLnNsaWNlKDAsUHQtMSkuY29uY2F0KHt2YWx1ZTpNW1B0LTJdLnR5cGU9PT0iICI/IioiOiIifSkpLnJlcGxhY2UoaywiJDEiKSxpdCxQdDxsdCYmZmkoTS5zbGljZShQdCxsdCkpLGx0PGN0JiZmaShNPU0uc2xpY2UobHQpKSxsdDxjdCYmZ3IoTSkpfU50LnB1c2goaXQpfXJldHVybiB1aShOdCl9ZnVuY3Rpb24gR28oTSxaKXt2YXIgaXQ9Wi5sZW5ndGg+MCxsdD1NLmxlbmd0aD4wLGN0PWZ1bmN0aW9uKF90LER0LFB0LEF0LEh0KXt2YXIgTnQsUnQsVXQsRnQ9MCxuZT0iMCIseGU9X3QmJltdLGhlPVtdLEZlPXYsJGU9X3R8fGx0JiZkLmZpbmQuVEFHKCIqIixIdCksUG49c3QrPUZlPT1udWxsPzE6TWF0aC5yYW5kb20oKXx8LjEscGU9JGUubGVuZ3RoO2ZvcihIdCYmKHY9RHQ9PU58fER0fHxIdCk7bmUhPT1wZSYmKE50PSRlW25lXSkhPW51bGw7bmUrKyl7aWYobHQmJk50KXtmb3IoUnQ9MCwhRHQmJk50Lm93bmVyRG9jdW1lbnQhPU4mJihybihOdCksUHQ9IVcpO1V0PU1bUnQrK107KWlmKFV0KE50LER0fHxOLFB0KSl7SS5jYWxsKEF0LE50KTticmVha31IdCYmKHN0PVBuKX1pdCYmKChOdD0hVXQmJk50KSYmRnQtLSxfdCYmeGUucHVzaChOdCkpfWlmKEZ0Kz1uZSxpdCYmbmUhPT1GdCl7Zm9yKFJ0PTA7VXQ9WltSdCsrXTspVXQoeGUsaGUsRHQsUHQpO2lmKF90KXtpZihGdD4wKWZvcig7bmUtLTspeGVbbmVdfHxoZVtuZV18fChoZVtuZV09US5jYWxsKEF0KSk7aGU9d3IoaGUpfUkuYXBwbHkoQXQsaGUpLEh0JiYhX3QmJmhlLmxlbmd0aD4wJiZGdCtaLmxlbmd0aD4xJiZmLnVuaXF1ZVNvcnQoQXQpfXJldHVybiBIdCYmKHN0PVBuLHY9RmUpLHhlfTtyZXR1cm4gaXQ/VmUoY3QpOmN0fWZ1bmN0aW9uIGhpKE0sWil7dmFyIGl0LGx0PVtdLGN0PVtdLF90PVZ0W00rIiAiXTtpZighX3Qpe2ZvcihafHwoWj0kbihNKSksaXQ9Wi5sZW5ndGg7aXQtLTspX3Q9ZmkoWltpdF0pLF90W2Z0XT9sdC5wdXNoKF90KTpjdC5wdXNoKF90KTtfdD1WdChNLEdvKGN0LGx0KSksX3Quc2VsZWN0b3I9TX1yZXR1cm4gX3R9ZnVuY3Rpb24gQmEoTSxaLGl0LGx0KXt2YXIgY3QsX3QsRHQsUHQsQXQsSHQ9dHlwZW9mIE09PSJmdW5jdGlvbiImJk0sTnQ9IWx0JiYkbihNPUh0LnNlbGVjdG9yfHxNKTtpZihpdD1pdHx8W10sTnQubGVuZ3RoPT09MSl7aWYoX3Q9TnRbMF09TnRbMF0uc2xpY2UoMCksX3QubGVuZ3RoPjImJihEdD1fdFswXSkudHlwZT09PSJJRCImJloubm9kZVR5cGU9PT05JiZXJiZkLnJlbGF0aXZlW190WzFdLnR5cGVdKXtpZihaPShkLmZpbmQuSUQoRHQubWF0Y2hlc1swXS5yZXBsYWNlKEplLFFlKSxaKXx8W10pWzBdLFopSHQmJihaPVoucGFyZW50Tm9kZSk7ZWxzZSByZXR1cm4gaXQ7TT1NLnNsaWNlKF90LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoY3Q9WWUubmVlZHNDb250ZXh0LnRlc3QoTSk/MDpfdC5sZW5ndGg7Y3QtLSYmKER0PV90W2N0XSwhZC5yZWxhdGl2ZVtQdD1EdC50eXBlXSk7KWlmKChBdD1kLmZpbmRbUHRdKSYmKGx0PUF0KER0Lm1hdGNoZXNbMF0ucmVwbGFjZShKZSxRZSksbGkudGVzdChfdFswXS50eXBlKSYmZGkoWi5wYXJlbnROb2RlKXx8WikpKXtpZihfdC5zcGxpY2UoY3QsMSksTT1sdC5sZW5ndGgmJmdyKF90KSwhTSlyZXR1cm4gSS5hcHBseShpdCxsdCksaXQ7YnJlYWt9fXJldHVybihIdHx8aGkoTSxOdCkpKGx0LFosIVcsaXQsIVp8fGxpLnRlc3QoTSkmJmRpKFoucGFyZW50Tm9kZSl8fFopLGl0fXkuc29ydFN0YWJsZT1mdC5zcGxpdCgiIikuc29ydChvZSkuam9pbigiIik9PT1mdCxybigpLHkuc29ydERldGFjaGVkPUluKGZ1bmN0aW9uKE0pe3JldHVybiBNLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE4uY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSkmMX0pLGYuZmluZD1KdCxmLmV4cHJbIjoiXT1mLmV4cHIucHNldWRvcyxmLnVuaXF1ZT1mLnVuaXF1ZVNvcnQsSnQuY29tcGlsZT1oaSxKdC5zZWxlY3Q9QmEsSnQuc2V0RG9jdW1lbnQ9cm4sSnQudG9rZW5pemU9JG4sSnQuZXNjYXBlPWYuZXNjYXBlU2VsZWN0b3IsSnQuZ2V0VGV4dD1mLnRleHQsSnQuaXNYTUw9Zi5pc1hNTERvYyxKdC5zZWxlY3RvcnM9Zi5leHByLEp0LnN1cHBvcnQ9Zi5zdXBwb3J0LEp0LnVuaXF1ZVNvcnQ9Zi51bmlxdWVTb3J0fSkoKTt2YXIgcT1mdW5jdGlvbihhLGQsdil7Zm9yKHZhciB4PVtdLEE9diE9PXZvaWQgMDsoYT1hW2RdKSYmYS5ub2RlVHlwZSE9PTk7KWlmKGEubm9kZVR5cGU9PT0xKXtpZihBJiZmKGEpLmlzKHYpKWJyZWFrO3gucHVzaChhKX1yZXR1cm4geH0sej1mdW5jdGlvbihhLGQpe2Zvcih2YXIgdj1bXTthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWQmJnYucHVzaChhKTtyZXR1cm4gdn0sRz1mLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LG50PS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIHR0KGEsZCx2KXtyZXR1cm4gVChkKT9mLmdyZXAoYSxmdW5jdGlvbih4LEEpe3JldHVybiEhZC5jYWxsKHgsQSx4KSE9PXZ9KTpkLm5vZGVUeXBlP2YuZ3JlcChhLGZ1bmN0aW9uKHgpe3JldHVybiB4PT09ZCE9PXZ9KTp0eXBlb2YgZCE9InN0cmluZyI/Zi5ncmVwKGEsZnVuY3Rpb24oeCl7cmV0dXJuIHUuY2FsbChkLHgpPi0xIT09dn0pOmYuZmlsdGVyKGQsYSx2KX1mLmZpbHRlcj1mdW5jdGlvbihhLGQsdil7dmFyIHg9ZFswXTtyZXR1cm4gdiYmKGE9Ijpub3QoIithKyIpIiksZC5sZW5ndGg9PT0xJiZ4Lm5vZGVUeXBlPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHgsYSk/W3hdOltdOmYuZmluZC5tYXRjaGVzKGEsZi5ncmVwKGQsZnVuY3Rpb24oQSl7cmV0dXJuIEEubm9kZVR5cGU9PT0xfSkpfSxmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgZCx2LHg9dGhpcy5sZW5ndGgsQT10aGlzO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gdGhpcy5wdXNoU3RhY2soZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoZD0wO2Q8eDtkKyspaWYoZi5jb250YWlucyhBW2RdLHRoaXMpKXJldHVybiEwfSkpO2Zvcih2PXRoaXMucHVzaFN0YWNrKFtdKSxkPTA7ZDx4O2QrKylmLmZpbmQoYSxBW2RdLHYpO3JldHVybiB4PjE/Zi51bmlxdWVTb3J0KHYpOnZ9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodHQodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHR0KHRoaXMsYXx8W10sITApKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISF0dCh0aGlzLHR5cGVvZiBhPT0ic3RyaW5nIiYmRy50ZXN0KGEpP2YoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgZXQsd3Q9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLyxTdD1mLmZuLmluaXQ9ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEE7aWYoIWEpcmV0dXJuIHRoaXM7aWYodj12fHxldCx0eXBlb2YgYT09InN0cmluZyIpaWYoYVswXT09PSI8IiYmYVthLmxlbmd0aC0xXT09PSI+IiYmYS5sZW5ndGg+PTM/eD1bbnVsbCxhLG51bGxdOng9d3QuZXhlYyhhKSx4JiYoeFsxXXx8IWQpKWlmKHhbMV0pe2lmKGQ9ZCBpbnN0YW5jZW9mIGY/ZFswXTpkLGYubWVyZ2UodGhpcyxmLnBhcnNlSFRNTCh4WzFdLGQmJmQubm9kZVR5cGU/ZC5vd25lckRvY3VtZW50fHxkOmMsITApKSxudC50ZXN0KHhbMV0pJiZmLmlzUGxhaW5PYmplY3QoZCkpZm9yKHggaW4gZClUKHRoaXNbeF0pP3RoaXNbeF0oZFt4XSk6dGhpcy5hdHRyKHgsZFt4XSk7cmV0dXJuIHRoaXN9ZWxzZSByZXR1cm4gQT1jLmdldEVsZW1lbnRCeUlkKHhbMl0pLEEmJih0aGlzWzBdPUEsdGhpcy5sZW5ndGg9MSksdGhpcztlbHNlIHJldHVybiFkfHxkLmpxdWVyeT8oZHx8dikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSk7ZWxzZXtpZihhLm5vZGVUeXBlKXJldHVybiB0aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzO2lmKFQoYSkpcmV0dXJuIHYucmVhZHkhPT12b2lkIDA/di5yZWFkeShhKTphKGYpfXJldHVybiBmLm1ha2VBcnJheShhLHRoaXMpfTtTdC5wcm90b3R5cGU9Zi5mbixldD1mKGMpO3ZhciBUdD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxrdD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGEpe3ZhciBkPWYoYSx0aGlzKSx2PWQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgeD0wO3g8djt4KyspaWYoZi5jb250YWlucyh0aGlzLGRbeF0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTAsQT10aGlzLmxlbmd0aCxJPVtdLE49dHlwZW9mIGEhPSJzdHJpbmciJiZmKGEpO2lmKCFHLnRlc3QoYSkpe2Zvcig7eDxBO3grKylmb3Iodj10aGlzW3hdO3YmJnYhPT1kO3Y9di5wYXJlbnROb2RlKWlmKHYubm9kZVR5cGU8MTEmJihOP04uaW5kZXgodik+LTE6di5ub2RlVHlwZT09PTEmJmYuZmluZC5tYXRjaGVzU2VsZWN0b3IodixhKSkpe0kucHVzaCh2KTticmVha319cmV0dXJuIHRoaXMucHVzaFN0YWNrKEkubGVuZ3RoPjE/Zi51bmlxdWVTb3J0KEkpOkkpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT90eXBlb2YgYT09InN0cmluZyI/dS5jYWxsKGYoYSksdGhpc1swXSk6dS5jYWxsKHRoaXMsYS5qcXVlcnk/YVswXTphKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLnVuaXF1ZVNvcnQoZi5tZXJnZSh0aGlzLmdldCgpLGYoYSxkKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQoYT09bnVsbD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gTHQoYSxkKXtmb3IoOyhhPWFbZF0pJiZhLm5vZGVUeXBlIT09MTspO3JldHVybiBhfWYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBkPWEucGFyZW50Tm9kZTtyZXR1cm4gZCYmZC5ub2RlVHlwZSE9PTExP2Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gcShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHEoYSwicGFyZW50Tm9kZSIsdil9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEx0KGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEx0KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBxKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHEoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHEoYSwibmV4dFNpYmxpbmciLHYpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxkLHYpe3JldHVybiBxKGEsInByZXZpb3VzU2libGluZyIsdil9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiB6KChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4geihhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZW50RG9jdW1lbnQhPW51bGwmJnIoYS5jb250ZW50RG9jdW1lbnQpP2EuY29udGVudERvY3VtZW50OihYKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksZi5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsZCl7Zi5mblthXT1mdW5jdGlvbih2LHgpe3ZhciBBPWYubWFwKHRoaXMsZCx2KTtyZXR1cm4gYS5zbGljZSgtNSkhPT0iVW50aWwiJiYoeD12KSx4JiZ0eXBlb2YgeD09InN0cmluZyImJihBPWYuZmlsdGVyKHgsQSkpLHRoaXMubGVuZ3RoPjEmJihrdFthXXx8Zi51bmlxdWVTb3J0KEEpLFR0LnRlc3QoYSkmJkEucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhBKX19KTt2YXIgQnQ9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiAkdChhKXt2YXIgZD17fTtyZXR1cm4gZi5lYWNoKGEubWF0Y2goQnQpfHxbXSxmdW5jdGlvbih2LHgpe2RbeF09ITB9KSxkfWYuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9dHlwZW9mIGE9PSJzdHJpbmciPyR0KGEpOmYuZXh0ZW5kKHt9LGEpO3ZhciBkLHYseCxBLEk9W10sTj1bXSxZPS0xLFc9ZnVuY3Rpb24oKXtmb3IoQT1BfHxhLm9uY2UseD1kPSEwO04ubGVuZ3RoO1k9LTEpZm9yKHY9Ti5zaGlmdCgpOysrWTxJLmxlbmd0aDspSVtZXS5hcHBseSh2WzBdLHZbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihZPUkubGVuZ3RoLHY9ITEpO2EubWVtb3J5fHwodj0hMSksZD0hMSxBJiYodj9JPVtdOkk9IiIpfSxKPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gSSYmKHYmJiFkJiYoWT1JLmxlbmd0aC0xLE4ucHVzaCh2KSksZnVuY3Rpb24gZHQoZnQpe2YuZWFjaChmdCxmdW5jdGlvbihzdCx5dCl7VCh5dCk/KCFhLnVuaXF1ZXx8IUouaGFzKHl0KSkmJkkucHVzaCh5dCk6eXQmJnl0Lmxlbmd0aCYmXyh5dCkhPT0ic3RyaW5nIiYmZHQoeXQpfSl9KGFyZ3VtZW50cyksdiYmIWQmJlcoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZHQsZnQpe2Zvcih2YXIgc3Q7KHN0PWYuaW5BcnJheShmdCxJLHN0KSk+LTE7KUkuc3BsaWNlKHN0LDEpLHN0PD1ZJiZZLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZHQpe3JldHVybiBkdD9mLmluQXJyYXkoZHQsSSk+LTE6SS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gSSYmKEk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gQT1OPVtdLEk9dj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFJfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIEE9Tj1bXSwhdiYmIWQmJihJPXY9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhQX0sZmlyZVdpdGg6ZnVuY3Rpb24oZHQsZnQpe3JldHVybiBBfHwoZnQ9ZnR8fFtdLGZ0PVtkdCxmdC5zbGljZT9mdC5zbGljZSgpOmZ0XSxOLnB1c2goZnQpLGR8fFcoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBKLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEheH19O3JldHVybiBKfTtmdW5jdGlvbiBLdChhKXtyZXR1cm4gYX1mdW5jdGlvbiBEKGEpe3Rocm93IGF9ZnVuY3Rpb24gdXQoYSxkLHYseCl7dmFyIEE7dHJ5e2EmJlQoQT1hLnByb21pc2UpP0EuY2FsbChhKS5kb25lKGQpLmZhaWwodik6YSYmVChBPWEudGhlbik/QS5jYWxsKGEsZCx2KTpkLmFwcGx5KHZvaWQgMCxbYV0uc2xpY2UoeCkpfWNhdGNoKEkpe3YuYXBwbHkodm9pZCAwLFtJXSl9fWYuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgZD1bWyJub3RpZnkiLCJwcm9ncmVzcyIsZi5DYWxsYmFja3MoIm1lbW9yeSIpLGYuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0sdj0icGVuZGluZyIseD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIEEuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbihJKXtyZXR1cm4geC50aGVuKG51bGwsSSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgST1hcmd1bWVudHM7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oTil7Zi5lYWNoKGQsZnVuY3Rpb24oWSxXKXt2YXIgSj1UKElbV1s0XV0pJiZJW1dbNF1dO0FbV1sxXV0oZnVuY3Rpb24oKXt2YXIgZHQ9SiYmSi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZHQmJlQoZHQucHJvbWlzZSk/ZHQucHJvbWlzZSgpLnByb2dyZXNzKE4ubm90aWZ5KS5kb25lKE4ucmVzb2x2ZSkuZmFpbChOLnJlamVjdCk6TltXWzBdKyJXaXRoIl0odGhpcyxKP1tkdF06YXJndW1lbnRzKX0pfSksST1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKEksTixZKXt2YXIgVz0wO2Z1bmN0aW9uIEooZHQsZnQsc3QseXQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBPdD10aGlzLFh0PWFyZ3VtZW50cyxWdD1mdW5jdGlvbigpe3ZhciBvZSxHZTtpZighKGR0PFcpKXtpZihvZT1zdC5hcHBseShPdCxYdCksb2U9PT1mdC5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7R2U9b2UmJih0eXBlb2Ygb2U9PSJvYmplY3QifHx0eXBlb2Ygb2U9PSJmdW5jdGlvbiIpJiZvZS50aGVuLFQoR2UpP3l0P0dlLmNhbGwob2UsSihXLGZ0LEt0LHl0KSxKKFcsZnQsRCx5dCkpOihXKyssR2UuY2FsbChvZSxKKFcsZnQsS3QseXQpLEooVyxmdCxELHl0KSxKKFcsZnQsS3QsZnQubm90aWZ5V2l0aCkpKTooc3QhPT1LdCYmKE90PXZvaWQgMCxYdD1bb2VdKSwoeXR8fGZ0LnJlc29sdmVXaXRoKShPdCxYdCkpfX0sdWU9eXQ/VnQ6ZnVuY3Rpb24oKXt0cnl7VnQoKX1jYXRjaChvZSl7Zi5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZmLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sob2UsdWUuZXJyb3IpLGR0KzE+PVcmJihzdCE9PUQmJihPdD12b2lkIDAsWHQ9W29lXSksZnQucmVqZWN0V2l0aChPdCxYdCkpfX07ZHQ/dWUoKTooZi5EZWZlcnJlZC5nZXRFcnJvckhvb2s/dWUuZXJyb3I9Zi5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTpmLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHVlLmVycm9yPWYuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLHQuc2V0VGltZW91dCh1ZSkpfX1yZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkdCl7ZFswXVszXS5hZGQoSigwLGR0LFQoWSk/WTpLdCxkdC5ub3RpZnlXaXRoKSksZFsxXVszXS5hZGQoSigwLGR0LFQoSSk/STpLdCkpLGRbMl1bM10uYWRkKEooMCxkdCxUKE4pP046RCkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKEkpe3JldHVybiBJIT1udWxsP2YuZXh0ZW5kKEkseCk6eH19LEE9e307cmV0dXJuIGYuZWFjaChkLGZ1bmN0aW9uKEksTil7dmFyIFk9TlsyXSxXPU5bNV07eFtOWzFdXT1ZLmFkZCxXJiZZLmFkZChmdW5jdGlvbigpe3Y9V30sZFszLUldWzJdLmRpc2FibGUsZFszLUldWzNdLmRpc2FibGUsZFswXVsyXS5sb2NrLGRbMF1bM10ubG9jayksWS5hZGQoTlszXS5maXJlKSxBW05bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIEFbTlswXSsiV2l0aCJdKHRoaXM9PT1BP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sQVtOWzBdKyJXaXRoIl09WS5maXJlV2l0aH0pLHgucHJvbWlzZShBKSxhJiZhLmNhbGwoQSxBKSxBfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGgsdj1kLHg9QXJyYXkodiksQT1zLmNhbGwoYXJndW1lbnRzKSxJPWYuRGVmZXJyZWQoKSxOPWZ1bmN0aW9uKFkpe3JldHVybiBmdW5jdGlvbihXKXt4W1ldPXRoaXMsQVtZXT1hcmd1bWVudHMubGVuZ3RoPjE/cy5jYWxsKGFyZ3VtZW50cyk6VywtLWR8fEkucmVzb2x2ZVdpdGgoeCxBKX19O2lmKGQ8PTEmJih1dChhLEkuZG9uZShOKHYpKS5yZXNvbHZlLEkucmVqZWN0LCFkKSxJLnN0YXRlKCk9PT0icGVuZGluZyJ8fFQoQVt2XSYmQVt2XS50aGVuKSkpcmV0dXJuIEkudGhlbigpO2Zvcig7di0tOyl1dChBW3ZdLE4odiksSS5yZWplY3QpO3JldHVybiBJLnByb21pc2UoKX19KTt2YXIgb3Q9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Zi5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKGEsZCl7dC5jb25zb2xlJiZ0LmNvbnNvbGUud2FybiYmYSYmb3QudGVzdChhLm5hbWUpJiZ0LmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIithLm1lc3NhZ2UsYS5zdGFjayxkKX0sZi5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihhKXt0LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBhfSl9O3ZhciBWPWYuRGVmZXJyZWQoKTtmLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBWLnRoZW4oYSkuY2F0Y2goZnVuY3Rpb24oZCl7Zi5yZWFkeUV4Y2VwdGlvbihkKX0pLHRoaXN9LGYuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGEpeyhhPT09ITA/LS1mLnJlYWR5V2FpdDpmLmlzUmVhZHkpfHwoZi5pc1JlYWR5PSEwLCEoYSE9PSEwJiYtLWYucmVhZHlXYWl0PjApJiZWLnJlc29sdmVXaXRoKGMsW2ZdKSl9fSksZi5yZWFkeS50aGVuPVYudGhlbjtmdW5jdGlvbiBqKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixqKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLGopLGYucmVhZHkoKX1jLnJlYWR5U3RhdGU9PT0iY29tcGxldGUifHxjLnJlYWR5U3RhdGUhPT0ibG9hZGluZyImJiFjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD90LnNldFRpbWVvdXQoZi5yZWFkeSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsaiksdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixqKSk7dmFyIEs9ZnVuY3Rpb24oYSxkLHYseCxBLEksTil7dmFyIFk9MCxXPWEubGVuZ3RoLEo9dj09bnVsbDtpZihfKHYpPT09Im9iamVjdCIpe0E9ITA7Zm9yKFkgaW4gdilLKGEsZCxZLHZbWV0sITAsSSxOKX1lbHNlIGlmKHghPT12b2lkIDAmJihBPSEwLFQoeCl8fChOPSEwKSxKJiYoTj8oZC5jYWxsKGEseCksZD1udWxsKTooSj1kLGQ9ZnVuY3Rpb24oZHQsZnQsc3Qpe3JldHVybiBKLmNhbGwoZihkdCksc3QpfSkpLGQpKWZvcig7WTxXO1krKylkKGFbWV0sdixOP3g6eC5jYWxsKGFbWV0sWSxkKGFbWV0sdikpKTtyZXR1cm4gQT9hOko/ZC5jYWxsKGEpOlc/ZChhWzBdLHYpOkl9LHB0PS9eLW1zLS8sdnQ9Ly0oW2Etel0pL2c7ZnVuY3Rpb24gcnQoYSxkKXtyZXR1cm4gZC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIGd0KGEpe3JldHVybiBhLnJlcGxhY2UocHQsIm1zLSIpLnJlcGxhY2UodnQscnQpfXZhciBDdD1mdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT05fHwhK2Eubm9kZVR5cGV9O2Z1bmN0aW9uIHh0KCl7dGhpcy5leHBhbmRvPWYuZXhwYW5kbyt4dC51aWQrK314dC51aWQ9MSx4dC5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGEpe3ZhciBkPWFbdGhpcy5leHBhbmRvXTtyZXR1cm4gZHx8KGQ9e30sQ3QoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1kOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6ZCxjb25maWd1cmFibGU6ITB9KSkpLGR9LHNldDpmdW5jdGlvbihhLGQsdil7dmFyIHgsQT10aGlzLmNhY2hlKGEpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIilBW2d0KGQpXT12O2Vsc2UgZm9yKHggaW4gZClBW2d0KHgpXT1kW3hdO3JldHVybiBBfSxnZXQ6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZD09PXZvaWQgMD90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW2d0KGQpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZD09PXZvaWQgMHx8ZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiZ2PT09dm9pZCAwP3RoaXMuZ2V0KGEsZCk6KHRoaXMuc2V0KGEsZCx2KSx2IT09dm9pZCAwP3Y6ZCl9LHJlbW92ZTpmdW5jdGlvbihhLGQpe3ZhciB2LHg9YVt0aGlzLmV4cGFuZG9dO2lmKHghPT12b2lkIDApe2lmKGQhPT12b2lkIDApZm9yKEFycmF5LmlzQXJyYXkoZCk/ZD1kLm1hcChndCk6KGQ9Z3QoZCksZD1kIGluIHg/W2RdOmQubWF0Y2goQnQpfHxbXSksdj1kLmxlbmd0aDt2LS07KWRlbGV0ZSB4W2Rbdl1dOyhkPT09dm9pZCAwfHxmLmlzRW1wdHlPYmplY3QoeCkpJiYoYS5ub2RlVHlwZT9hW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBhW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihhKXt2YXIgZD1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGQhPT12b2lkIDAmJiFmLmlzRW1wdHlPYmplY3QoZCl9fTt2YXIgbXQ9bmV3IHh0LHp0PW5ldyB4dCxHdD0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLHZlPS9bQS1aXS9nO2Z1bmN0aW9uIGZuKGEpe3JldHVybiBhPT09InRydWUiPyEwOmE9PT0iZmFsc2UiPyExOmE9PT0ibnVsbCI/bnVsbDphPT09K2ErIiI/K2E6R3QudGVzdChhKT9KU09OLnBhcnNlKGEpOmF9ZnVuY3Rpb24gVGUoYSxkLHYpe3ZhciB4O2lmKHY9PT12b2lkIDAmJmEubm9kZVR5cGU9PT0xKWlmKHg9ImRhdGEtIitkLnJlcGxhY2UodmUsIi0kJiIpLnRvTG93ZXJDYXNlKCksdj1hLmdldEF0dHJpYnV0ZSh4KSx0eXBlb2Ygdj09InN0cmluZyIpe3RyeXt2PWZuKHYpfWNhdGNoe316dC5zZXQoYSxkLHYpfWVsc2Ugdj12b2lkIDA7cmV0dXJuIHZ9Zi5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHp0Lmhhc0RhdGEoYSl8fG10Lmhhc0RhdGEoYSl9LGRhdGE6ZnVuY3Rpb24oYSxkLHYpe3JldHVybiB6dC5hY2Nlc3MoYSxkLHYpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsZCl7enQucmVtb3ZlKGEsZCl9LF9kYXRhOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gbXQuYWNjZXNzKGEsZCx2KX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxkKXttdC5yZW1vdmUoYSxkKX19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGQpe3ZhciB2LHgsQSxJPXRoaXNbMF0sTj1JJiZJLmF0dHJpYnV0ZXM7aWYoYT09PXZvaWQgMCl7aWYodGhpcy5sZW5ndGgmJihBPXp0LmdldChJKSxJLm5vZGVUeXBlPT09MSYmIW10LmdldChJLCJoYXNEYXRhQXR0cnMiKSkpe2Zvcih2PU4ubGVuZ3RoO3YtLTspTlt2XSYmKHg9Tlt2XS5uYW1lLHguaW5kZXhPZigiZGF0YS0iKT09PTAmJih4PWd0KHguc2xpY2UoNSkpLFRlKEkseCxBW3hdKSkpO210LnNldChJLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gQX1yZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiP3RoaXMuZWFjaChmdW5jdGlvbigpe3p0LnNldCh0aGlzLGEpfSk6Syh0aGlzLGZ1bmN0aW9uKFkpe3ZhciBXO2lmKEkmJlk9PT12b2lkIDApcmV0dXJuIFc9enQuZ2V0KEksYSksVyE9PXZvaWQgMHx8KFc9VGUoSSxhKSxXIT09dm9pZCAwKT9XOnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXt6dC5zZXQodGhpcyxhLFkpfSl9LG51bGwsZCxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3p0LnJlbW92ZSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsZCx2KXt2YXIgeDtpZihhKXJldHVybiBkPShkfHwiZngiKSsicXVldWUiLHg9bXQuZ2V0KGEsZCksdiYmKCF4fHxBcnJheS5pc0FycmF5KHYpP3g9bXQuYWNjZXNzKGEsZCxmLm1ha2VBcnJheSh2KSk6eC5wdXNoKHYpKSx4fHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihhLGQpe2Q9ZHx8ImZ4Ijt2YXIgdj1mLnF1ZXVlKGEsZCkseD12Lmxlbmd0aCxBPXYuc2hpZnQoKSxJPWYuX3F1ZXVlSG9va3MoYSxkKSxOPWZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsZCl9O0E9PT0iaW5wcm9ncmVzcyImJihBPXYuc2hpZnQoKSx4LS0pLEEmJihkPT09ImZ4IiYmdi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIEkuc3RvcCxBLmNhbGwoYSxOLEkpKSwheCYmSSYmSS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsZCl7dmFyIHY9ZCsicXVldWVIb29rcyI7cmV0dXJuIG10LmdldChhLHYpfHxtdC5hY2Nlc3MoYSx2LHtlbXB0eTpmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXttdC5yZW1vdmUoYSxbZCsicXVldWUiLHZdKX0pfSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsZCl7dmFyIHY9MjtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoZD1hLGE9ImZ4Iix2LS0pLGFyZ3VtZW50cy5sZW5ndGg8dj9mLnF1ZXVlKHRoaXNbMF0sYSk6ZD09PXZvaWQgMD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB4PWYucXVldWUodGhpcyxhLGQpO2YuX3F1ZXVlSG9va3ModGhpcyxhKSxhPT09ImZ4IiYmeFswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGQpe3ZhciB2LHg9MSxBPWYuRGVmZXJyZWQoKSxJPXRoaXMsTj10aGlzLmxlbmd0aCxZPWZ1bmN0aW9uKCl7LS14fHxBLnJlc29sdmVXaXRoKEksW0ldKX07Zm9yKHR5cGVvZiBhIT0ic3RyaW5nIiYmKGQ9YSxhPXZvaWQgMCksYT1hfHwiZngiO04tLTspdj1tdC5nZXQoSVtOXSxhKyJxdWV1ZUhvb2tzIiksdiYmdi5lbXB0eSYmKHgrKyx2LmVtcHR5LmFkZChZKSk7cmV0dXJuIFkoKSxBLnByb21pc2UoZCl9fSk7dmFyIHRuPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGVlPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIit0bisiKShbYS16JV0qKSQiLCJpIiksZ2U9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxqZT1jLmRvY3VtZW50RWxlbWVudCxmZT1mdW5jdGlvbihhKXtyZXR1cm4gZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl9LGRyPXtjb21wb3NlZDohMH07amUuZ2V0Um9vdE5vZGUmJihmZT1mdW5jdGlvbihhKXtyZXR1cm4gZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fGEuZ2V0Um9vdE5vZGUoZHIpPT09YS5vd25lckRvY3VtZW50fSk7dmFyIFRuPWZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9ZHx8YSxhLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fGEuc3R5bGUuZGlzcGxheT09PSIiJiZmZShhKSYmZi5jc3MoYSwiZGlzcGxheSIpPT09Im5vbmUifTtmdW5jdGlvbiB1cihhLGQsdix4KXt2YXIgQSxJLE49MjAsWT14P2Z1bmN0aW9uKCl7cmV0dXJuIHguY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIGYuY3NzKGEsZCwiIil9LFc9WSgpLEo9diYmdlszXXx8KGYuY3NzTnVtYmVyW2RdPyIiOiJweCIpLGR0PWEubm9kZVR5cGUmJihmLmNzc051bWJlcltkXXx8SiE9PSJweCImJitXKSYmZWUuZXhlYyhmLmNzcyhhLGQpKTtpZihkdCYmZHRbM10hPT1KKXtmb3IoVz1XLzIsSj1KfHxkdFszXSxkdD0rV3x8MTtOLS07KWYuc3R5bGUoYSxkLGR0K0opLCgxLUkpKigxLShJPVkoKS9XfHwuNSkpPD0wJiYoTj0wKSxkdD1kdC9JO2R0PWR0KjIsZi5zdHlsZShhLGQsZHQrSiksdj12fHxbXX1yZXR1cm4gdiYmKGR0PStkdHx8K1d8fDAsQT12WzFdP2R0Kyh2WzFdKzEpKnZbMl06K3ZbMl0seCYmKHgudW5pdD1KLHguc3RhcnQ9ZHQseC5lbmQ9QSkpLEF9dmFyIGNyPXt9O2Z1bmN0aW9uIGZyKGEpe3ZhciBkLHY9YS5vd25lckRvY3VtZW50LHg9YS5ub2RlTmFtZSxBPWNyW3hdO3JldHVybiBBfHwoZD12LmJvZHkuYXBwZW5kQ2hpbGQodi5jcmVhdGVFbGVtZW50KHgpKSxBPWYuY3NzKGQsImRpc3BsYXkiKSxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksQT09PSJub25lIiYmKEE9ImJsb2NrIiksY3JbeF09QSxBKX1mdW5jdGlvbiBBZShhLGQpe2Zvcih2YXIgdix4LEE9W10sST0wLE49YS5sZW5ndGg7STxOO0krKyl4PWFbSV0seC5zdHlsZSYmKHY9eC5zdHlsZS5kaXNwbGF5LGQ/KHY9PT0ibm9uZSImJihBW0ldPW10LmdldCh4LCJkaXNwbGF5Iil8fG51bGwsQVtJXXx8KHguc3R5bGUuZGlzcGxheT0iIikpLHguc3R5bGUuZGlzcGxheT09PSIiJiZUbih4KSYmKEFbSV09ZnIoeCkpKTp2IT09Im5vbmUiJiYoQVtJXT0ibm9uZSIsbXQuc2V0KHgsImRpc3BsYXkiLHYpKSk7Zm9yKEk9MDtJPE47SSsrKUFbSV0hPW51bGwmJihhW0ldLnN0eWxlLmRpc3BsYXk9QVtJXSk7cmV0dXJuIGF9Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJib29sZWFuIj9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1RuKHRoaXMpP2YodGhpcykuc2hvdygpOmYodGhpcykuaGlkZSgpfSl9fSk7dmFyIFdlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHJhPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLGlhPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTsoZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxkPWEuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSksdj1jLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7di5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHYuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHYuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGQuYXBwZW5kQ2hpbGQodikseS5jaGVja0Nsb25lPWQuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGQuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhZC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsZC5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWQubGFzdENoaWxkfSkoKTt2YXIgSWU9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtJZS50Ym9keT1JZS50Zm9vdD1JZS5jb2xncm91cD1JZS5jYXB0aW9uPUllLnRoZWFkLEllLnRoPUllLnRkLHkub3B0aW9ufHwoSWUub3B0Z3JvdXA9SWUub3B0aW9uPVsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0pO2Z1bmN0aW9uIHllKGEsZCl7dmFyIHY7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPCJ1Ij92PWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZHx8IioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsPCJ1Ij92PWEucXVlcnlTZWxlY3RvckFsbChkfHwiKiIpOnY9W10sZD09PXZvaWQgMHx8ZCYmWChhLGQpP2YubWVyZ2UoW2FdLHYpOnZ9ZnVuY3Rpb24gWHIoYSxkKXtmb3IodmFyIHY9MCx4PWEubGVuZ3RoO3Y8eDt2KyspbXQuc2V0KGFbdl0sImdsb2JhbEV2YWwiLCFkfHxtdC5nZXQoZFt2XSwiZ2xvYmFsRXZhbCIpKX12YXIgaW89Lzx8JiM/XHcrOy87ZnVuY3Rpb24gYWEoYSxkLHYseCxBKXtmb3IodmFyIEksTixZLFcsSixkdCxmdD1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxzdD1bXSx5dD0wLE90PWEubGVuZ3RoO3l0PE90O3l0KyspaWYoST1hW3l0XSxJfHxJPT09MClpZihfKEkpPT09Im9iamVjdCIpZi5tZXJnZShzdCxJLm5vZGVUeXBlP1tJXTpJKTtlbHNlIGlmKCFpby50ZXN0KEkpKXN0LnB1c2goZC5jcmVhdGVUZXh0Tm9kZShJKSk7ZWxzZXtmb3IoTj1OfHxmdC5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxZPShyYS5leGVjKEkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLFc9SWVbWV18fEllLl9kZWZhdWx0LE4uaW5uZXJIVE1MPVdbMV0rZi5odG1sUHJlZmlsdGVyKEkpK1dbMl0sZHQ9V1swXTtkdC0tOylOPU4ubGFzdENoaWxkO2YubWVyZ2Uoc3QsTi5jaGlsZE5vZGVzKSxOPWZ0LmZpcnN0Q2hpbGQsTi50ZXh0Q29udGVudD0iIn1mb3IoZnQudGV4dENvbnRlbnQ9IiIseXQ9MDtJPXN0W3l0KytdOyl7aWYoeCYmZi5pbkFycmF5KEkseCk+LTEpe0EmJkEucHVzaChJKTtjb250aW51ZX1pZihKPWZlKEkpLE49eWUoZnQuYXBwZW5kQ2hpbGQoSSksInNjcmlwdCIpLEomJlhyKE4pLHYpZm9yKGR0PTA7ST1OW2R0KytdOylpYS50ZXN0KEkudHlwZXx8IiIpJiZ2LnB1c2goSSl9cmV0dXJuIGZ0fXZhciBzYT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24ga24oKXtyZXR1cm4hMH1mdW5jdGlvbiBTbigpe3JldHVybiExfWZ1bmN0aW9uIFlyKGEsZCx2LHgsQSxJKXt2YXIgTixZO2lmKHR5cGVvZiBkPT0ib2JqZWN0Iil7dHlwZW9mIHYhPSJzdHJpbmciJiYoeD14fHx2LHY9dm9pZCAwKTtmb3IoWSBpbiBkKVlyKGEsWSx2LHgsZFtZXSxJKTtyZXR1cm4gYX1pZih4PT1udWxsJiZBPT1udWxsPyhBPXYseD12PXZvaWQgMCk6QT09bnVsbCYmKHR5cGVvZiB2PT0ic3RyaW5nIj8oQT14LHg9dm9pZCAwKTooQT14LHg9dix2PXZvaWQgMCkpLEE9PT0hMSlBPVNuO2Vsc2UgaWYoIUEpcmV0dXJuIGE7cmV0dXJuIEk9PT0xJiYoTj1BLEE9ZnVuY3Rpb24oVyl7cmV0dXJuIGYoKS5vZmYoVyksTi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LEEuZ3VpZD1OLmd1aWR8fChOLmd1aWQ9Zi5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGQsQSx4LHYpfSl9Zi5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGQsdix4LEEpe3ZhciBJLE4sWSxXLEosZHQsZnQsc3QseXQsT3QsWHQsVnQ9bXQuZ2V0KGEpO2lmKEN0KGEpKWZvcih2LmhhbmRsZXImJihJPXYsdj1JLmhhbmRsZXIsQT1JLnNlbGVjdG9yKSxBJiZmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGplLEEpLHYuZ3VpZHx8KHYuZ3VpZD1mLmd1aWQrKyksKFc9VnQuZXZlbnRzKXx8KFc9VnQuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChOPVZ0LmhhbmRsZSl8fChOPVZ0LmhhbmRsZT1mdW5jdGlvbih1ZSl7cmV0dXJuIHR5cGVvZiBmPCJ1IiYmZi5ldmVudC50cmlnZ2VyZWQhPT11ZS50eXBlP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGQ9KGR8fCIiKS5tYXRjaChCdCl8fFsiIl0sSj1kLmxlbmd0aDtKLS07KVk9c2EuZXhlYyhkW0pdKXx8W10seXQ9WHQ9WVsxXSxPdD0oWVsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHl0JiYoZnQ9Zi5ldmVudC5zcGVjaWFsW3l0XXx8e30seXQ9KEE/ZnQuZGVsZWdhdGVUeXBlOmZ0LmJpbmRUeXBlKXx8eXQsZnQ9Zi5ldmVudC5zcGVjaWFsW3l0XXx8e30sZHQ9Zi5leHRlbmQoe3R5cGU6eXQsb3JpZ1R5cGU6WHQsZGF0YTp4LGhhbmRsZXI6dixndWlkOnYuZ3VpZCxzZWxlY3RvcjpBLG5lZWRzQ29udGV4dDpBJiZmLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoQSksbmFtZXNwYWNlOk90LmpvaW4oIi4iKX0sSSksKHN0PVdbeXRdKXx8KHN0PVdbeXRdPVtdLHN0LmRlbGVnYXRlQ291bnQ9MCwoIWZ0LnNldHVwfHxmdC5zZXR1cC5jYWxsKGEseCxPdCxOKT09PSExKSYmYS5hZGRFdmVudExpc3RlbmVyJiZhLmFkZEV2ZW50TGlzdGVuZXIoeXQsTikpLGZ0LmFkZCYmKGZ0LmFkZC5jYWxsKGEsZHQpLGR0LmhhbmRsZXIuZ3VpZHx8KGR0LmhhbmRsZXIuZ3VpZD12Lmd1aWQpKSxBP3N0LnNwbGljZShzdC5kZWxlZ2F0ZUNvdW50KyssMCxkdCk6c3QucHVzaChkdCksZi5ldmVudC5nbG9iYWxbeXRdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKGEsZCx2LHgsQSl7dmFyIEksTixZLFcsSixkdCxmdCxzdCx5dCxPdCxYdCxWdD1tdC5oYXNEYXRhKGEpJiZtdC5nZXQoYSk7aWYoISghVnR8fCEoVz1WdC5ldmVudHMpKSl7Zm9yKGQ9KGR8fCIiKS5tYXRjaChCdCl8fFsiIl0sSj1kLmxlbmd0aDtKLS07KXtpZihZPXNhLmV4ZWMoZFtKXSl8fFtdLHl0PVh0PVlbMV0sT3Q9KFlbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSwheXQpe2Zvcih5dCBpbiBXKWYuZXZlbnQucmVtb3ZlKGEseXQrZFtKXSx2LHgsITApO2NvbnRpbnVlfWZvcihmdD1mLmV2ZW50LnNwZWNpYWxbeXRdfHx7fSx5dD0oeD9mdC5kZWxlZ2F0ZVR5cGU6ZnQuYmluZFR5cGUpfHx5dCxzdD1XW3l0XXx8W10sWT1ZWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitPdC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxOPUk9c3QubGVuZ3RoO0ktLTspZHQ9c3RbSV0sKEF8fFh0PT09ZHQub3JpZ1R5cGUpJiYoIXZ8fHYuZ3VpZD09PWR0Lmd1aWQpJiYoIVl8fFkudGVzdChkdC5uYW1lc3BhY2UpKSYmKCF4fHx4PT09ZHQuc2VsZWN0b3J8fHg9PT0iKioiJiZkdC5zZWxlY3RvcikmJihzdC5zcGxpY2UoSSwxKSxkdC5zZWxlY3RvciYmc3QuZGVsZWdhdGVDb3VudC0tLGZ0LnJlbW92ZSYmZnQucmVtb3ZlLmNhbGwoYSxkdCkpO04mJiFzdC5sZW5ndGgmJigoIWZ0LnRlYXJkb3dufHxmdC50ZWFyZG93bi5jYWxsKGEsT3QsVnQuaGFuZGxlKT09PSExKSYmZi5yZW1vdmVFdmVudChhLHl0LFZ0LmhhbmRsZSksZGVsZXRlIFdbeXRdKX1mLmlzRW1wdHlPYmplY3QoVykmJm10LnJlbW92ZShhLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXt2YXIgZCx2LHgsQSxJLE4sWT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksVz1mLmV2ZW50LmZpeChhKSxKPShtdC5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW1cudHlwZV18fFtdLGR0PWYuZXZlbnQuc3BlY2lhbFtXLnR5cGVdfHx7fTtmb3IoWVswXT1XLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7ZCsrKVlbZF09YXJndW1lbnRzW2RdO2lmKFcuZGVsZWdhdGVUYXJnZXQ9dGhpcywhKGR0LnByZURpc3BhdGNoJiZkdC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsVyk9PT0hMSkpe2ZvcihOPWYuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLFcsSiksZD0wOyhBPU5bZCsrXSkmJiFXLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihXLmN1cnJlbnRUYXJnZXQ9QS5lbGVtLHY9MDsoST1BLmhhbmRsZXJzW3YrK10pJiYhVy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOykoIVcucm5hbWVzcGFjZXx8SS5uYW1lc3BhY2U9PT0hMXx8Vy5ybmFtZXNwYWNlLnRlc3QoSS5uYW1lc3BhY2UpKSYmKFcuaGFuZGxlT2JqPUksVy5kYXRhPUkuZGF0YSx4PSgoZi5ldmVudC5zcGVjaWFsW0kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxJLmhhbmRsZXIpLmFwcGx5KEEuZWxlbSxZKSx4IT09dm9pZCAwJiYoVy5yZXN1bHQ9eCk9PT0hMSYmKFcucHJldmVudERlZmF1bHQoKSxXLnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGR0LnBvc3REaXNwYXRjaCYmZHQucG9zdERpc3BhdGNoLmNhbGwodGhpcyxXKSxXLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsZCl7dmFyIHYseCxBLEksTixZPVtdLFc9ZC5kZWxlZ2F0ZUNvdW50LEo9YS50YXJnZXQ7aWYoVyYmSi5ub2RlVHlwZSYmIShhLnR5cGU9PT0iY2xpY2siJiZhLmJ1dHRvbj49MSkpe2Zvcig7SiE9PXRoaXM7Sj1KLnBhcmVudE5vZGV8fHRoaXMpaWYoSi5ub2RlVHlwZT09PTEmJiEoYS50eXBlPT09ImNsaWNrIiYmSi5kaXNhYmxlZD09PSEwKSl7Zm9yKEk9W10sTj17fSx2PTA7djxXO3YrKyl4PWRbdl0sQT14LnNlbGVjdG9yKyIgIixOW0FdPT09dm9pZCAwJiYoTltBXT14Lm5lZWRzQ29udGV4dD9mKEEsdGhpcykuaW5kZXgoSik+LTE6Zi5maW5kKEEsdGhpcyxudWxsLFtKXSkubGVuZ3RoKSxOW0FdJiZJLnB1c2goeCk7SS5sZW5ndGgmJlkucHVzaCh7ZWxlbTpKLGhhbmRsZXJzOkl9KX19cmV0dXJuIEo9dGhpcyxXPGQubGVuZ3RoJiZZLnB1c2goe2VsZW06SixoYW5kbGVyczpkLnNsaWNlKFcpfSksWX0sYWRkUHJvcDpmdW5jdGlvbihhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLkV2ZW50LnByb3RvdHlwZSxhLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6VChkKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZCh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W2FdfSxzZXQ6ZnVuY3Rpb24odil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dn0pfX0pfSxmaXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbZi5leHBhbmRvXT9hOm5ldyBmLkV2ZW50KGEpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXN8fGE7cmV0dXJuIFdlLnRlc3QoZC50eXBlKSYmZC5jbGljayYmWChkLCJpbnB1dCIpJiZocihkLCJjbGljayIsITApLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXN8fGE7cmV0dXJuIFdlLnRlc3QoZC50eXBlKSYmZC5jbGljayYmWChkLCJpbnB1dCIpJiZocihkLCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXt2YXIgZD1hLnRhcmdldDtyZXR1cm4gV2UudGVzdChkLnR5cGUpJiZkLmNsaWNrJiZYKGQsImlucHV0IikmJm10LmdldChkLCJjbGljayIpfHxYKGQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EucmVzdWx0IT09dm9pZCAwJiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fTtmdW5jdGlvbiBocihhLGQsdil7aWYoIXYpe210LmdldChhLGQpPT09dm9pZCAwJiZmLmV2ZW50LmFkZChhLGQsa24pO3JldHVybn1tdC5zZXQoYSxkLCExKSxmLmV2ZW50LmFkZChhLGQse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKHgpe3ZhciBBLEk9bXQuZ2V0KHRoaXMsZCk7aWYoeC5pc1RyaWdnZXImMSYmdGhpc1tkXSl7aWYoSSkoZi5ldmVudC5zcGVjaWFsW2RdfHx7fSkuZGVsZWdhdGVUeXBlJiZ4LnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoST1zLmNhbGwoYXJndW1lbnRzKSxtdC5zZXQodGhpcyxkLEkpLHRoaXNbZF0oKSxBPW10LmdldCh0aGlzLGQpLG10LnNldCh0aGlzLGQsITEpLEkhPT1BKXJldHVybiB4LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHgucHJldmVudERlZmF1bHQoKSxBfWVsc2UgSSYmKG10LnNldCh0aGlzLGQsZi5ldmVudC50cmlnZ2VyKElbMF0sSS5zbGljZSgxKSx0aGlzKSkseC5zdG9wUHJvcGFnYXRpb24oKSx4LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWtuKX19KX1mLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsZCx2KXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLHYpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsZCl7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsZCk7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5kZWZhdWx0UHJldmVudGVkPT09dm9pZCAwJiZhLnJldHVyblZhbHVlPT09ITE/a246U24sdGhpcy50YXJnZXQ9YS50YXJnZXQmJmEudGFyZ2V0Lm5vZGVUeXBlPT09Mz9hLnRhcmdldC5wYXJlbnROb2RlOmEudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1hLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWEsZCYmZi5leHRlbmQodGhpcyxkKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpmLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpTbixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpTbixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpTbixpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1rbixhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1rbixhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9a24sYSYmIXRoaXMuaXNTaW11bGF0ZWQmJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LGYuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxjaGFyOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ITB9LGYuZXZlbnQuYWRkUHJvcCksZi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIHYoeCl7aWYoYy5kb2N1bWVudE1vZGUpe3ZhciBBPW10LmdldCh0aGlzLCJoYW5kbGUiKSxJPWYuZXZlbnQuZml4KHgpO0kudHlwZT14LnR5cGU9PT0iZm9jdXNpbiI/ImZvY3VzIjoiYmx1ciIsSS5pc1NpbXVsYXRlZD0hMCxBKHgpLEkudGFyZ2V0PT09SS5jdXJyZW50VGFyZ2V0JiZBKEkpfWVsc2UgZi5ldmVudC5zaW11bGF0ZShkLHgudGFyZ2V0LGYuZXZlbnQuZml4KHgpKX1mLmV2ZW50LnNwZWNpYWxbYV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHg7aWYoaHIodGhpcyxhLCEwKSxjLmRvY3VtZW50TW9kZSl4PW10LmdldCh0aGlzLGQpLHh8fHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihkLHYpLG10LnNldCh0aGlzLGQsKHh8fDApKzEpO2Vsc2UgcmV0dXJuITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaHIodGhpcyxhKSwhMH0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgeDtpZihjLmRvY3VtZW50TW9kZSl4PW10LmdldCh0aGlzLGQpLTEseD9tdC5zZXQodGhpcyxkLHgpOih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx2KSxtdC5yZW1vdmUodGhpcyxkKSk7ZWxzZSByZXR1cm4hMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oeCl7cmV0dXJuIG10LmdldCh4LnRhcmdldCxhKX0sZGVsZWdhdGVUeXBlOmR9LGYuZXZlbnQuc3BlY2lhbFtkXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgeD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsQT1jLmRvY3VtZW50TW9kZT90aGlzOngsST1tdC5nZXQoQSxkKTtJfHwoYy5kb2N1bWVudE1vZGU/dGhpcy5hZGRFdmVudExpc3RlbmVyKGQsdik6eC5hZGRFdmVudExpc3RlbmVyKGEsdiwhMCkpLG10LnNldChBLGQsKEl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciB4PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyxBPWMuZG9jdW1lbnRNb2RlP3RoaXM6eCxJPW10LmdldChBLGQpLTE7ST9tdC5zZXQoQSxkLEkpOihjLmRvY3VtZW50TW9kZT90aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx2KTp4LnJlbW92ZUV2ZW50TGlzdGVuZXIoYSx2LCEwKSxtdC5yZW1vdmUoQSxkKSl9fX0pLGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxkKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpkLGJpbmRUeXBlOmQsaGFuZGxlOmZ1bmN0aW9uKHYpe3ZhciB4LEE9dGhpcyxJPXYucmVsYXRlZFRhcmdldCxOPXYuaGFuZGxlT2JqO3JldHVybighSXx8SSE9PUEmJiFmLmNvbnRhaW5zKEEsSSkpJiYodi50eXBlPU4ub3JpZ1R5cGUseD1OLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHYudHlwZT1kKSx4fX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxkLHYseCl7cmV0dXJuIFlyKHRoaXMsYSxkLHYseCl9LG9uZTpmdW5jdGlvbihhLGQsdix4KXtyZXR1cm4gWXIodGhpcyxhLGQsdix4LDEpfSxvZmY6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEE7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIHg9YS5oYW5kbGVPYmosZihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoeC5uYW1lc3BhY2U/eC5vcmlnVHlwZSsiLiIreC5uYW1lc3BhY2U6eC5vcmlnVHlwZSx4LnNlbGVjdG9yLHguaGFuZGxlciksdGhpcztpZih0eXBlb2YgYT09Im9iamVjdCIpe2ZvcihBIGluIGEpdGhpcy5vZmYoQSxkLGFbQV0pO3JldHVybiB0aGlzfXJldHVybihkPT09ITF8fHR5cGVvZiBkPT0iZnVuY3Rpb24iKSYmKHY9ZCxkPXZvaWQgMCksdj09PSExJiYodj1TbiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLHYsZCl9KX19KTt2YXIgYW89LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksc289L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb289L15ccyo8IVxbQ0RBVEFcW3xcXVxdPlxzKiQvZztmdW5jdGlvbiBvYShhLGQpe3JldHVybiBYKGEsInRhYmxlIikmJlgoZC5ub2RlVHlwZSE9PTExP2Q6ZC5maXJzdENoaWxkLCJ0ciIpJiZmKGEpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxhfWZ1bmN0aW9uIGxvKGEpe3JldHVybiBhLnR5cGU9KGEuZ2V0QXR0cmlidXRlKCJ0eXBlIikhPT1udWxsKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gdW8oYSl7cmV0dXJuKGEudHlwZXx8IiIpLnNsaWNlKDAsNSk9PT0idHJ1ZS8iP2EudHlwZT1hLnR5cGUuc2xpY2UoNSk6YS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxhfWZ1bmN0aW9uIGxhKGEsZCl7dmFyIHYseCxBLEksTixZLFc7aWYoZC5ub2RlVHlwZT09PTEpe2lmKG10Lmhhc0RhdGEoYSkmJihJPW10LmdldChhKSxXPUkuZXZlbnRzLFcpKXttdC5yZW1vdmUoZCwiaGFuZGxlIGV2ZW50cyIpO2ZvcihBIGluIFcpZm9yKHY9MCx4PVdbQV0ubGVuZ3RoO3Y8eDt2KyspZi5ldmVudC5hZGQoZCxBLFdbQV1bdl0pfXp0Lmhhc0RhdGEoYSkmJihOPXp0LmFjY2VzcyhhKSxZPWYuZXh0ZW5kKHt9LE4pLHp0LnNldChkLFkpKX19ZnVuY3Rpb24gY28oYSxkKXt2YXIgdj1kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7dj09PSJpbnB1dCImJldlLnRlc3QoYS50eXBlKT9kLmNoZWNrZWQ9YS5jaGVja2VkOih2PT09ImlucHV0Inx8dj09PSJ0ZXh0YXJlYSIpJiYoZC5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIERuKGEsZCx2LHgpe2Q9aShkKTt2YXIgQSxJLE4sWSxXLEosZHQ9MCxmdD1hLmxlbmd0aCxzdD1mdC0xLHl0PWRbMF0sT3Q9VCh5dCk7aWYoT3R8fGZ0PjEmJnR5cGVvZiB5dD09InN0cmluZyImJiF5LmNoZWNrQ2xvbmUmJnNvLnRlc3QoeXQpKXJldHVybiBhLmVhY2goZnVuY3Rpb24oWHQpe3ZhciBWdD1hLmVxKFh0KTtPdCYmKGRbMF09eXQuY2FsbCh0aGlzLFh0LFZ0Lmh0bWwoKSkpLERuKFZ0LGQsdix4KX0pO2lmKGZ0JiYoQT1hYShkLGFbMF0ub3duZXJEb2N1bWVudCwhMSxhLHgpLEk9QS5maXJzdENoaWxkLEEuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYoQT1JKSxJfHx4KSl7Zm9yKE49Zi5tYXAoeWUoQSwic2NyaXB0IiksbG8pLFk9Ti5sZW5ndGg7ZHQ8ZnQ7ZHQrKylXPUEsZHQhPT1zdCYmKFc9Zi5jbG9uZShXLCEwLCEwKSxZJiZmLm1lcmdlKE4seWUoVywic2NyaXB0IikpKSx2LmNhbGwoYVtkdF0sVyxkdCk7aWYoWSlmb3IoSj1OW04ubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsZi5tYXAoTix1byksZHQ9MDtkdDxZO2R0KyspVz1OW2R0XSxpYS50ZXN0KFcudHlwZXx8IiIpJiYhbXQuYWNjZXNzKFcsImdsb2JhbEV2YWwiKSYmZi5jb250YWlucyhKLFcpJiYoVy5zcmMmJihXLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpIT09Im1vZHVsZSI/Zi5fZXZhbFVybCYmIVcubm9Nb2R1bGUmJmYuX2V2YWxVcmwoVy5zcmMse25vbmNlOlcubm9uY2V8fFcuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxKKTpoKFcudGV4dENvbnRlbnQucmVwbGFjZShvbywiIiksVyxKKSl9cmV0dXJuIGF9ZnVuY3Rpb24gZGEoYSxkLHYpe2Zvcih2YXIgeCxBPWQ/Zi5maWx0ZXIoZCxhKTphLEk9MDsoeD1BW0ldKSE9bnVsbDtJKyspIXYmJngubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YSh5ZSh4KSkseC5wYXJlbnROb2RlJiYodiYmZmUoeCkmJlhyKHllKHgsInNjcmlwdCIpKSx4LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeCkpO3JldHVybiBhfWYuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJLE4sWT1hLmNsb25lTm9kZSghMCksVz1mZShhKTtpZigheS5ub0Nsb25lQ2hlY2tlZCYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSlmb3IoTj15ZShZKSxJPXllKGEpLHg9MCxBPUkubGVuZ3RoO3g8QTt4KyspY28oSVt4XSxOW3hdKTtpZihkKWlmKHYpZm9yKEk9SXx8eWUoYSksTj1OfHx5ZShZKSx4PTAsQT1JLmxlbmd0aDt4PEE7eCsrKWxhKElbeF0sTlt4XSk7ZWxzZSBsYShhLFkpO3JldHVybiBOPXllKFksInNjcmlwdCIpLE4ubGVuZ3RoPjAmJlhyKE4sIVcmJnllKGEsInNjcmlwdCIpKSxZfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkLHYseCxBPWYuZXZlbnQuc3BlY2lhbCxJPTA7KHY9YVtJXSkhPT12b2lkIDA7SSsrKWlmKEN0KHYpKXtpZihkPXZbbXQuZXhwYW5kb10pe2lmKGQuZXZlbnRzKWZvcih4IGluIGQuZXZlbnRzKUFbeF0/Zi5ldmVudC5yZW1vdmUodix4KTpmLnJlbW92ZUV2ZW50KHYseCxkLmhhbmRsZSk7dlttdC5leHBhbmRvXT12b2lkIDB9dlt6dC5leHBhbmRvXSYmKHZbenQuZXhwYW5kb109dm9pZCAwKX19fSksZi5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gZGEodGhpcyxhLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGEpe3JldHVybiBkYSh0aGlzLGEpfSx0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oZCl7cmV0dXJuIGQ9PT12b2lkIDA/Zi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTF8fHRoaXMubm9kZVR5cGU9PT05KSYmKHRoaXMudGV4dENvbnRlbnQ9ZCl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gRG4odGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlVHlwZT09PTF8fHRoaXMubm9kZVR5cGU9PT0xMXx8dGhpcy5ub2RlVHlwZT09PTkpe3ZhciBkPW9hKHRoaXMsYSk7ZC5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZih0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExfHx0aGlzLm5vZGVUeXBlPT09OSl7dmFyIGQ9b2EodGhpcyxhKTtkLmluc2VydEJlZm9yZShhLGQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxkPTA7KGE9dGhpc1tkXSkhPW51bGw7ZCsrKWEubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoeWUoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGQpe3JldHVybiBhPWE/PyExLGQ9ZD8/YSx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxkKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oZCl7dmFyIHY9dGhpc1swXXx8e30seD0wLEE9dGhpcy5sZW5ndGg7aWYoZD09PXZvaWQgMCYmdi5ub2RlVHlwZT09PTEpcmV0dXJuIHYuaW5uZXJIVE1MO2lmKHR5cGVvZiBkPT0ic3RyaW5nIiYmIWFvLnRlc3QoZCkmJiFJZVsocmEuZXhlYyhkKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2Q9Zi5odG1sUHJlZmlsdGVyKGQpO3RyeXtmb3IoO3g8QTt4Kyspdj10aGlzW3hdfHx7fSx2Lm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHllKHYsITEpKSx2LmlubmVySFRNTD1kKTt2PTB9Y2F0Y2h7fX12JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGQpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIERuKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGQpe3ZhciB2PXRoaXMucGFyZW50Tm9kZTtmLmluQXJyYXkodGhpcyxhKTwwJiYoZi5jbGVhbkRhdGEoeWUodGhpcykpLHYmJnYucmVwbGFjZUNoaWxkKGQsdGhpcykpfSxhKX19KSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGQpe2YuZm5bYV09ZnVuY3Rpb24odil7Zm9yKHZhciB4LEE9W10sST1mKHYpLE49SS5sZW5ndGgtMSxZPTA7WTw9TjtZKyspeD1ZPT09Tj90aGlzOnRoaXMuY2xvbmUoITApLGYoSVtZXSlbZF0oeCksby5hcHBseShBLHguZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhBKX19KTt2YXIgJHI9bmV3IFJlZ0V4cCgiXigiK3RuKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksWnI9L14tLS8scHI9ZnVuY3Rpb24oYSl7dmFyIGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybighZHx8IWQub3BlbmVyKSYmKGQ9dCksZC5nZXRDb21wdXRlZFN0eWxlKGEpfSx1YT1mdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJPXt9O2ZvcihBIGluIGQpSVtBXT1hLnN0eWxlW0FdLGEuc3R5bGVbQV09ZFtBXTt4PXYuY2FsbChhKTtmb3IoQSBpbiBkKWEuc3R5bGVbQV09SVtBXTtyZXR1cm4geH0sZm89bmV3IFJlZ0V4cChnZS5qb2luKCJ8IiksImkiKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7aWYoSil7Vy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixKLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGplLmFwcGVuZENoaWxkKFcpLmFwcGVuZENoaWxkKEopO3ZhciBkdD10LmdldENvbXB1dGVkU3R5bGUoSik7dj1kdC50b3AhPT0iMSUiLFk9ZChkdC5tYXJnaW5MZWZ0KT09PTEyLEouc3R5bGUucmlnaHQ9IjYwJSIsST1kKGR0LnJpZ2h0KT09PTM2LHg9ZChkdC53aWR0aCk9PT0zNixKLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsQT1kKEoub2Zmc2V0V2lkdGgvMyk9PT0xMixqZS5yZW1vdmVDaGlsZChXKSxKPW51bGx9fWZ1bmN0aW9uIGQoZHQpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZHQpKX12YXIgdix4LEEsSSxOLFksVz1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLEo9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTtKLnN0eWxlJiYoSi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLEouY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT1KLnN0eWxlLmJhY2tncm91bmRDbGlwPT09ImNvbnRlbnQtYm94IixmLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBhKCkseH0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLEl9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLHZ9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBhKCksWX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBhKCksQX0scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZHQsZnQsc3QseXQ7cmV0dXJuIE49PW51bGwmJihkdD1jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksZnQ9Yy5jcmVhdGVFbGVtZW50KCJ0ciIpLHN0PWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZHQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGUiLGZ0LnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyOjFweCBzb2xpZCIsZnQuc3R5bGUuaGVpZ2h0PSIxcHgiLHN0LnN0eWxlLmhlaWdodD0iOXB4IixzdC5zdHlsZS5kaXNwbGF5PSJibG9jayIsamUuYXBwZW5kQ2hpbGQoZHQpLmFwcGVuZENoaWxkKGZ0KS5hcHBlbmRDaGlsZChzdCkseXQ9dC5nZXRDb21wdXRlZFN0eWxlKGZ0KSxOPXBhcnNlSW50KHl0LmhlaWdodCwxMCkrcGFyc2VJbnQoeXQuYm9yZGVyVG9wV2lkdGgsMTApK3BhcnNlSW50KHl0LmJvcmRlckJvdHRvbVdpZHRoLDEwKT09PWZ0Lm9mZnNldEhlaWdodCxqZS5yZW1vdmVDaGlsZChkdCkpLE59fSkpfSkoKTtmdW5jdGlvbiBVbihhLGQsdil7dmFyIHgsQSxJLE4sWT1aci50ZXN0KGQpLFc9YS5zdHlsZTtyZXR1cm4gdj12fHxwcihhKSx2JiYoTj12LmdldFByb3BlcnR5VmFsdWUoZCl8fHZbZF0sWSYmTiYmKE49Ti5yZXBsYWNlKGssIiQxIil8fHZvaWQgMCksTj09PSIiJiYhZmUoYSkmJihOPWYuc3R5bGUoYSxkKSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmJHIudGVzdChOKSYmZm8udGVzdChkKSYmKHg9Vy53aWR0aCxBPVcubWluV2lkdGgsST1XLm1heFdpZHRoLFcubWluV2lkdGg9Vy5tYXhXaWR0aD1XLndpZHRoPU4sTj12LndpZHRoLFcud2lkdGg9eCxXLm1pbldpZHRoPUEsVy5tYXhXaWR0aD1JKSksTiE9PXZvaWQgMD9OKyIiOk59ZnVuY3Rpb24gY2EoYSxkKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoYSgpKXtkZWxldGUgdGhpcy5nZXQ7cmV0dXJufXJldHVybih0aGlzLmdldD1kKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgZmE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLGhhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscGE9e307ZnVuY3Rpb24gaG8oYSl7Zm9yKHZhciBkPWFbMF0udG9VcHBlckNhc2UoKSthLnNsaWNlKDEpLHY9ZmEubGVuZ3RoO3YtLTspaWYoYT1mYVt2XStkLGEgaW4gaGEpcmV0dXJuIGF9ZnVuY3Rpb24gS3IoYSl7dmFyIGQ9Zi5jc3NQcm9wc1thXXx8cGFbYV07cmV0dXJuIGR8fChhIGluIGhhP2E6cGFbYV09aG8oYSl8fGEpfXZhciBwbz0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sYm89e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiBtYShhLGQsdil7dmFyIHg9ZWUuZXhlYyhkKTtyZXR1cm4geD9NYXRoLm1heCgwLHhbMl0tKHZ8fDApKSsoeFszXXx8InB4Iik6ZH1mdW5jdGlvbiBKcihhLGQsdix4LEEsSSl7dmFyIE49ZD09PSJ3aWR0aCI/MTowLFk9MCxXPTAsSj0wO2lmKHY9PT0oeD8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7Tjw0O04rPTIpdj09PSJtYXJnaW4iJiYoSis9Zi5jc3MoYSx2K2dlW05dLCEwLEEpKSx4Pyh2PT09ImNvbnRlbnQiJiYoVy09Zi5jc3MoYSwicGFkZGluZyIrZ2VbTl0sITAsQSkpLHYhPT0ibWFyZ2luIiYmKFctPWYuY3NzKGEsImJvcmRlciIrZ2VbTl0rIldpZHRoIiwhMCxBKSkpOihXKz1mLmNzcyhhLCJwYWRkaW5nIitnZVtOXSwhMCxBKSx2IT09InBhZGRpbmciP1crPWYuY3NzKGEsImJvcmRlciIrZ2VbTl0rIldpZHRoIiwhMCxBKTpZKz1mLmNzcyhhLCJib3JkZXIiK2dlW05dKyJXaWR0aCIsITAsQSkpO3JldHVybiF4JiZJPj0wJiYoVys9TWF0aC5tYXgoMCxNYXRoLmNlaWwoYVsib2Zmc2V0IitkWzBdLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKV0tSS1XLVktLjUpKXx8MCksVytKfWZ1bmN0aW9uIHZhKGEsZCx2KXt2YXIgeD1wcihhKSxBPSF5LmJveFNpemluZ1JlbGlhYmxlKCl8fHYsST1BJiZmLmNzcyhhLCJib3hTaXppbmciLCExLHgpPT09ImJvcmRlci1ib3giLE49SSxZPVVuKGEsZCx4KSxXPSJvZmZzZXQiK2RbMF0udG9VcHBlckNhc2UoKStkLnNsaWNlKDEpO2lmKCRyLnRlc3QoWSkpe2lmKCF2KXJldHVybiBZO1k9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZJfHwheS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZYKGEsInRyIil8fFk9PT0iYXV0byJ8fCFwYXJzZUZsb2F0KFkpJiZmLmNzcyhhLCJkaXNwbGF5IiwhMSx4KT09PSJpbmxpbmUiKSYmYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKEk9Zi5jc3MoYSwiYm94U2l6aW5nIiwhMSx4KT09PSJib3JkZXItYm94IixOPVcgaW4gYSxOJiYoWT1hW1ddKSksWT1wYXJzZUZsb2F0KFkpfHwwLFkrSnIoYSxkLHZ8fChJPyJib3JkZXIiOiJjb250ZW50IiksTix4LFkpKyJweCJ9Zi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxkKXtpZihkKXt2YXIgdj1VbihhLCJvcGFjaXR5Iik7cmV0dXJuIHY9PT0iIj8iMSI6dn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGNvbHVtbkNvdW50OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsc2NhbGU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGEsZCx2LHgpe2lmKCEoIWF8fGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWEuc3R5bGUpKXt2YXIgQSxJLE4sWT1ndChkKSxXPVpyLnRlc3QoZCksSj1hLnN0eWxlO2lmKFd8fChkPUtyKFkpKSxOPWYuY3NzSG9va3NbZF18fGYuY3NzSG9va3NbWV0sdiE9PXZvaWQgMCl7aWYoST10eXBlb2YgdixJPT09InN0cmluZyImJihBPWVlLmV4ZWModikpJiZBWzFdJiYodj11cihhLGQsQSksST0ibnVtYmVyIiksdj09bnVsbHx8diE9PXYpcmV0dXJuO0k9PT0ibnVtYmVyIiYmIVcmJih2Kz1BJiZBWzNdfHwoZi5jc3NOdW1iZXJbWV0/IiI6InB4IikpLCF5LmNsZWFyQ2xvbmVTdHlsZSYmdj09PSIiJiZkLmluZGV4T2YoImJhY2tncm91bmQiKT09PTAmJihKW2RdPSJpbmhlcml0IiksKCFOfHwhKCJzZXQiaW4gTil8fCh2PU4uc2V0KGEsdix4KSkhPT12b2lkIDApJiYoVz9KLnNldFByb3BlcnR5KGQsdik6SltkXT12KX1lbHNlIHJldHVybiBOJiYiZ2V0ImluIE4mJihBPU4uZ2V0KGEsITEseCkpIT09dm9pZCAwP0E6SltkXX19LGNzczpmdW5jdGlvbihhLGQsdix4KXt2YXIgQSxJLE4sWT1ndChkKSxXPVpyLnRlc3QoZCk7cmV0dXJuIFd8fChkPUtyKFkpKSxOPWYuY3NzSG9va3NbZF18fGYuY3NzSG9va3NbWV0sTiYmImdldCJpbiBOJiYoQT1OLmdldChhLCEwLHYpKSxBPT09dm9pZCAwJiYoQT1VbihhLGQseCkpLEE9PT0ibm9ybWFsIiYmZCBpbiBiYSYmKEE9YmFbZF0pLHY9PT0iInx8dj8oST1wYXJzZUZsb2F0KEEpLHY9PT0hMHx8aXNGaW5pdGUoSSk/SXx8MDpBKTpBfX0pLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxkKXtmLmNzc0hvb2tzW2RdPXtnZXQ6ZnVuY3Rpb24odix4LEEpe2lmKHgpcmV0dXJuIHBvLnRlc3QoZi5jc3ModiwiZGlzcGxheSIpKSYmKCF2LmdldENsaWVudFJlY3RzKCkubGVuZ3RofHwhdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk/dWEodixibyxmdW5jdGlvbigpe3JldHVybiB2YSh2LGQsQSl9KTp2YSh2LGQsQSl9LHNldDpmdW5jdGlvbih2LHgsQSl7dmFyIEksTj1wcih2KSxZPSF5LnNjcm9sbGJveFNpemUoKSYmTi5wb3NpdGlvbj09PSJhYnNvbHV0ZSIsVz1ZfHxBLEo9VyYmZi5jc3ModiwiYm94U2l6aW5nIiwhMSxOKT09PSJib3JkZXItYm94IixkdD1BP0pyKHYsZCxBLEosTik6MDtyZXR1cm4gSiYmWSYmKGR0LT1NYXRoLmNlaWwodlsib2Zmc2V0IitkWzBdLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKV0tcGFyc2VGbG9hdChOW2RdKS1Kcih2LGQsImJvcmRlciIsITEsTiktLjUpKSxkdCYmKEk9ZWUuZXhlYyh4KSkmJihJWzNdfHwicHgiKSE9PSJweCImJih2LnN0eWxlW2RdPXgseD1mLmNzcyh2LGQpKSxtYSh2LHgsZHQpfX19KSxmLmNzc0hvb2tzLm1hcmdpbkxlZnQ9Y2EoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxkKXtpZihkKXJldHVybihwYXJzZUZsb2F0KFVuKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC11YShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksZi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxkKXtmLmNzc0hvb2tzW2ErZF09e2V4cGFuZDpmdW5jdGlvbih2KXtmb3IodmFyIHg9MCxBPXt9LEk9dHlwZW9mIHY9PSJzdHJpbmciP3Yuc3BsaXQoIiAiKTpbdl07eDw0O3grKylBW2ErZ2VbeF0rZF09SVt4XXx8SVt4LTJdfHxJWzBdO3JldHVybiBBfX0sYSE9PSJtYXJnaW4iJiYoZi5jc3NIb29rc1thK2RdLnNldD1tYSl9KSxmLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIEsodGhpcyxmdW5jdGlvbih2LHgsQSl7dmFyIEksTixZPXt9LFc9MDtpZihBcnJheS5pc0FycmF5KHgpKXtmb3IoST1wcih2KSxOPXgubGVuZ3RoO1c8TjtXKyspWVt4W1ddXT1mLmNzcyh2LHhbV10sITEsSSk7cmV0dXJuIFl9cmV0dXJuIEEhPT12b2lkIDA/Zi5zdHlsZSh2LHgsQSk6Zi5jc3Modix4KX0sYSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9fSk7ZnVuY3Rpb24gd2UoYSxkLHYseCxBKXtyZXR1cm4gbmV3IHdlLnByb3RvdHlwZS5pbml0KGEsZCx2LHgsQSl9Zi5Ud2Vlbj13ZSx3ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOndlLGluaXQ6ZnVuY3Rpb24oYSxkLHYseCxBLEkpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD12LHRoaXMuZWFzaW5nPUF8fGYuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1kLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD14LHRoaXMudW5pdD1JfHwoZi5jc3NOdW1iZXJbdl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPXdlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTp3ZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGQsdj13ZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWQ9Zi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZD1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpkK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLHYmJnYuc2V0P3Yuc2V0KHRoaXMpOndlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHdlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT13ZS5wcm90b3R5cGUsd2UucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkO3JldHVybiBhLmVsZW0ubm9kZVR5cGUhPT0xfHxhLmVsZW1bYS5wcm9wXSE9bnVsbCYmYS5lbGVtLnN0eWxlW2EucHJvcF09PW51bGw/YS5lbGVtW2EucHJvcF06KGQ9Zi5jc3MoYS5lbGVtLGEucHJvcCwiIiksIWR8fGQ9PT0iYXV0byI/MDpkKX0sc2V0OmZ1bmN0aW9uKGEpe2YuZnguc3RlcFthLnByb3BdP2YuZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5ub2RlVHlwZT09PTEmJihmLmNzc0hvb2tzW2EucHJvcF18fGEuZWxlbS5zdHlsZVtLcihhLnByb3ApXSE9bnVsbCk/Zi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sd2UucHJvcEhvb2tzLnNjcm9sbFRvcD13ZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxmLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4gLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxmLmZ4PXdlLnByb3RvdHlwZS5pbml0LGYuZnguc3RlcD17fTt2YXIgQW4sYnIsbW89L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHZvPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gUXIoKXticiYmKGMuaGlkZGVuPT09ITEmJnQucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3QucmVxdWVzdEFuaW1hdGlvbkZyYW1lKFFyKTp0LnNldFRpbWVvdXQoUXIsZi5meC5pbnRlcnZhbCksZi5meC50aWNrKCkpfWZ1bmN0aW9uIGdhKCl7cmV0dXJuIHQuc2V0VGltZW91dChmdW5jdGlvbigpe0FuPXZvaWQgMH0pLEFuPURhdGUubm93KCl9ZnVuY3Rpb24gbXIoYSxkKXt2YXIgdix4PTAsQT17aGVpZ2h0OmF9O2ZvcihkPWQ/MTowO3g8NDt4Kz0yLWQpdj1nZVt4XSxBWyJtYXJnaW4iK3ZdPUFbInBhZGRpbmciK3ZdPWE7cmV0dXJuIGQmJihBLm9wYWNpdHk9QS53aWR0aD1hKSxBfWZ1bmN0aW9uIHlhKGEsZCx2KXtmb3IodmFyIHgsQT0oTWUudHdlZW5lcnNbZF18fFtdKS5jb25jYXQoTWUudHdlZW5lcnNbIioiXSksST0wLE49QS5sZW5ndGg7STxOO0krKylpZih4PUFbSV0uY2FsbCh2LGQsYSkpcmV0dXJuIHh9ZnVuY3Rpb24gZ28oYSxkLHYpe3ZhciB4LEEsSSxOLFksVyxKLGR0LGZ0PSJ3aWR0aCJpbiBkfHwiaGVpZ2h0ImluIGQsc3Q9dGhpcyx5dD17fSxPdD1hLnN0eWxlLFh0PWEubm9kZVR5cGUmJlRuKGEpLFZ0PW10LmdldChhLCJmeHNob3ciKTt2LnF1ZXVlfHwoTj1mLl9xdWV1ZUhvb2tzKGEsImZ4IiksTi51bnF1ZXVlZD09bnVsbCYmKE4udW5xdWV1ZWQ9MCxZPU4uZW1wdHkuZmlyZSxOLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtOLnVucXVldWVkfHxZKCl9KSxOLnVucXVldWVkKyssc3QuYWx3YXlzKGZ1bmN0aW9uKCl7c3QuYWx3YXlzKGZ1bmN0aW9uKCl7Ti51bnF1ZXVlZC0tLGYucXVldWUoYSwiZngiKS5sZW5ndGh8fE4uZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHggaW4gZClpZihBPWRbeF0sbW8udGVzdChBKSl7aWYoZGVsZXRlIGRbeF0sST1JfHxBPT09InRvZ2dsZSIsQT09PShYdD8iaGlkZSI6InNob3ciKSlpZihBPT09InNob3ciJiZWdCYmVnRbeF0hPT12b2lkIDApWHQ9ITA7ZWxzZSBjb250aW51ZTt5dFt4XT1WdCYmVnRbeF18fGYuc3R5bGUoYSx4KX1pZihXPSFmLmlzRW1wdHlPYmplY3QoZCksISghVyYmZi5pc0VtcHR5T2JqZWN0KHl0KSkpe2Z0JiZhLm5vZGVUeXBlPT09MSYmKHYub3ZlcmZsb3c9W090Lm92ZXJmbG93LE90Lm92ZXJmbG93WCxPdC5vdmVyZmxvd1ldLEo9VnQmJlZ0LmRpc3BsYXksSj09bnVsbCYmKEo9bXQuZ2V0KGEsImRpc3BsYXkiKSksZHQ9Zi5jc3MoYSwiZGlzcGxheSIpLGR0PT09Im5vbmUiJiYoSj9kdD1KOihBZShbYV0sITApLEo9YS5zdHlsZS5kaXNwbGF5fHxKLGR0PWYuY3NzKGEsImRpc3BsYXkiKSxBZShbYV0pKSksKGR0PT09ImlubGluZSJ8fGR0PT09ImlubGluZS1ibG9jayImJkohPW51bGwpJiZmLmNzcyhhLCJmbG9hdCIpPT09Im5vbmUiJiYoV3x8KHN0LmRvbmUoZnVuY3Rpb24oKXtPdC5kaXNwbGF5PUp9KSxKPT1udWxsJiYoZHQ9T3QuZGlzcGxheSxKPWR0PT09Im5vbmUiPyIiOmR0KSksT3QuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLHYub3ZlcmZsb3cmJihPdC5vdmVyZmxvdz0iaGlkZGVuIixzdC5hbHdheXMoZnVuY3Rpb24oKXtPdC5vdmVyZmxvdz12Lm92ZXJmbG93WzBdLE90Lm92ZXJmbG93WD12Lm92ZXJmbG93WzFdLE90Lm92ZXJmbG93WT12Lm92ZXJmbG93WzJdfSkpLFc9ITE7Zm9yKHggaW4geXQpV3x8KFZ0PyJoaWRkZW4iaW4gVnQmJihYdD1WdC5oaWRkZW4pOlZ0PW10LmFjY2VzcyhhLCJmeHNob3ciLHtkaXNwbGF5Okp9KSxJJiYoVnQuaGlkZGVuPSFYdCksWHQmJkFlKFthXSwhMCksc3QuZG9uZShmdW5jdGlvbigpe1h0fHxBZShbYV0pLG10LnJlbW92ZShhLCJmeHNob3ciKTtmb3IoeCBpbiB5dClmLnN0eWxlKGEseCx5dFt4XSl9KSksVz15YShYdD9WdFt4XTowLHgsc3QpLHggaW4gVnR8fChWdFt4XT1XLnN0YXJ0LFh0JiYoVy5lbmQ9Vy5zdGFydCxXLnN0YXJ0PTApKX19ZnVuY3Rpb24geW8oYSxkKXt2YXIgdix4LEEsSSxOO2Zvcih2IGluIGEpaWYoeD1ndCh2KSxBPWRbeF0sST1hW3ZdLEFycmF5LmlzQXJyYXkoSSkmJihBPUlbMV0sST1hW3ZdPUlbMF0pLHYhPT14JiYoYVt4XT1JLGRlbGV0ZSBhW3ZdKSxOPWYuY3NzSG9va3NbeF0sTiYmImV4cGFuZCJpbiBOKXtJPU4uZXhwYW5kKEkpLGRlbGV0ZSBhW3hdO2Zvcih2IGluIEkpdiBpbiBhfHwoYVt2XT1JW3ZdLGRbdl09QSl9ZWxzZSBkW3hdPUF9ZnVuY3Rpb24gTWUoYSxkLHYpe3ZhciB4LEEsST0wLE49TWUucHJlZmlsdGVycy5sZW5ndGgsWT1mLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIFcuZWxlbX0pLFc9ZnVuY3Rpb24oKXtpZihBKXJldHVybiExO2Zvcih2YXIgZnQ9QW58fGdhKCksc3Q9TWF0aC5tYXgoMCxKLnN0YXJ0VGltZStKLmR1cmF0aW9uLWZ0KSx5dD1zdC9KLmR1cmF0aW9ufHwwLE90PTEteXQsWHQ9MCxWdD1KLnR3ZWVucy5sZW5ndGg7WHQ8VnQ7WHQrKylKLnR3ZWVuc1tYdF0ucnVuKE90KTtyZXR1cm4gWS5ub3RpZnlXaXRoKGEsW0osT3Qsc3RdKSxPdDwxJiZWdD9zdDooVnR8fFkubm90aWZ5V2l0aChhLFtKLDEsMF0pLFkucmVzb2x2ZVdpdGgoYSxbSl0pLCExKX0sSj1ZLnByb21pc2Uoe2VsZW06YSxwcm9wczpmLmV4dGVuZCh7fSxkKSxvcHRzOmYuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpmLmVhc2luZy5fZGVmYXVsdH0sdiksb3JpZ2luYWxQcm9wZXJ0aWVzOmQsb3JpZ2luYWxPcHRpb25zOnYsc3RhcnRUaW1lOkFufHxnYSgpLGR1cmF0aW9uOnYuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGZ0LHN0KXt2YXIgeXQ9Zi5Ud2VlbihhLEoub3B0cyxmdCxzdCxKLm9wdHMuc3BlY2lhbEVhc2luZ1tmdF18fEoub3B0cy5lYXNpbmcpO3JldHVybiBKLnR3ZWVucy5wdXNoKHl0KSx5dH0sc3RvcDpmdW5jdGlvbihmdCl7dmFyIHN0PTAseXQ9ZnQ/Si50d2VlbnMubGVuZ3RoOjA7aWYoQSlyZXR1cm4gdGhpcztmb3IoQT0hMDtzdDx5dDtzdCsrKUoudHdlZW5zW3N0XS5ydW4oMSk7cmV0dXJuIGZ0PyhZLm5vdGlmeVdpdGgoYSxbSiwxLDBdKSxZLnJlc29sdmVXaXRoKGEsW0osZnRdKSk6WS5yZWplY3RXaXRoKGEsW0osZnRdKSx0aGlzfX0pLGR0PUoucHJvcHM7Zm9yKHlvKGR0LEoub3B0cy5zcGVjaWFsRWFzaW5nKTtJPE47SSsrKWlmKHg9TWUucHJlZmlsdGVyc1tJXS5jYWxsKEosYSxkdCxKLm9wdHMpLHgpcmV0dXJuIFQoeC5zdG9wKSYmKGYuX3F1ZXVlSG9va3MoSi5lbGVtLEoub3B0cy5xdWV1ZSkuc3RvcD14LnN0b3AuYmluZCh4KSkseDtyZXR1cm4gZi5tYXAoZHQseWEsSiksVChKLm9wdHMuc3RhcnQpJiZKLm9wdHMuc3RhcnQuY2FsbChhLEopLEoucHJvZ3Jlc3MoSi5vcHRzLnByb2dyZXNzKS5kb25lKEoub3B0cy5kb25lLEoub3B0cy5jb21wbGV0ZSkuZmFpbChKLm9wdHMuZmFpbCkuYWx3YXlzKEoub3B0cy5hbHdheXMpLGYuZngudGltZXIoZi5leHRlbmQoVyx7ZWxlbTphLGFuaW06SixxdWV1ZTpKLm9wdHMucXVldWV9KSksSn1mLkFuaW1hdGlvbj1mLmV4dGVuZChNZSx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxkKXt2YXIgdj10aGlzLmNyZWF0ZVR3ZWVuKGEsZCk7cmV0dXJuIHVyKHYuZWxlbSxhLGVlLmV4ZWMoZCksdiksdn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsZCl7VChhKT8oZD1hLGE9WyIqIl0pOmE9YS5tYXRjaChCdCk7Zm9yKHZhciB2LHg9MCxBPWEubGVuZ3RoO3g8QTt4Kyspdj1hW3hdLE1lLnR3ZWVuZXJzW3ZdPU1lLnR3ZWVuZXJzW3ZdfHxbXSxNZS50d2VlbmVyc1t2XS51bnNoaWZ0KGQpfSxwcmVmaWx0ZXJzOltnb10scHJlZmlsdGVyOmZ1bmN0aW9uKGEsZCl7ZD9NZS5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6TWUucHJlZmlsdGVycy5wdXNoKGEpfX0pLGYuc3BlZWQ9ZnVuY3Rpb24oYSxkLHYpe3ZhciB4PWEmJnR5cGVvZiBhPT0ib2JqZWN0Ij9mLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6dnx8IXYmJmR8fFQoYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6diYmZHx8ZCYmIVQoZCkmJmR9O3JldHVybiBmLmZ4Lm9mZj94LmR1cmF0aW9uPTA6dHlwZW9mIHguZHVyYXRpb24hPSJudW1iZXIiJiYoeC5kdXJhdGlvbiBpbiBmLmZ4LnNwZWVkcz94LmR1cmF0aW9uPWYuZnguc3BlZWRzW3guZHVyYXRpb25dOnguZHVyYXRpb249Zi5meC5zcGVlZHMuX2RlZmF1bHQpLCh4LnF1ZXVlPT1udWxsfHx4LnF1ZXVlPT09ITApJiYoeC5xdWV1ZT0iZngiKSx4Lm9sZD14LmNvbXBsZXRlLHguY29tcGxldGU9ZnVuY3Rpb24oKXtUKHgub2xkKSYmeC5vbGQuY2FsbCh0aGlzKSx4LnF1ZXVlJiZmLmRlcXVldWUodGhpcyx4LnF1ZXVlKX0seH0sZi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGQsdix4KXtyZXR1cm4gdGhpcy5maWx0ZXIoVG4pLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZH0sYSx2LHgpfSxhbmltYXRlOmZ1bmN0aW9uKGEsZCx2LHgpe3ZhciBBPWYuaXNFbXB0eU9iamVjdChhKSxJPWYuc3BlZWQoZCx2LHgpLE49ZnVuY3Rpb24oKXt2YXIgWT1NZSh0aGlzLGYuZXh0ZW5kKHt9LGEpLEkpOyhBfHxtdC5nZXQodGhpcywiZmluaXNoIikpJiZZLnN0b3AoITApfTtyZXR1cm4gTi5maW5pc2g9TixBfHxJLnF1ZXVlPT09ITE/dGhpcy5lYWNoKE4pOnRoaXMucXVldWUoSS5xdWV1ZSxOKX0sc3RvcDpmdW5jdGlvbihhLGQsdil7dmFyIHg9ZnVuY3Rpb24oQSl7dmFyIEk9QS5zdG9wO2RlbGV0ZSBBLnN0b3AsSSh2KX07cmV0dXJuIHR5cGVvZiBhIT0ic3RyaW5nIiYmKHY9ZCxkPWEsYT12b2lkIDApLGQmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEE9ITAsST1hIT1udWxsJiZhKyJxdWV1ZUhvb2tzIixOPWYudGltZXJzLFk9bXQuZ2V0KHRoaXMpO2lmKEkpWVtJXSYmWVtJXS5zdG9wJiZ4KFlbSV0pO2Vsc2UgZm9yKEkgaW4gWSlZW0ldJiZZW0ldLnN0b3AmJnZvLnRlc3QoSSkmJngoWVtJXSk7Zm9yKEk9Ti5sZW5ndGg7SS0tOylOW0ldLmVsZW09PT10aGlzJiYoYT09bnVsbHx8TltJXS5xdWV1ZT09PWEpJiYoTltJXS5hbmltLnN0b3AodiksQT0hMSxOLnNwbGljZShJLDEpKTsoQXx8IXYpJiZmLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQsdj1tdC5nZXQodGhpcykseD12W2ErInF1ZXVlIl0sQT12W2ErInF1ZXVlSG9va3MiXSxJPWYudGltZXJzLE49eD94Lmxlbmd0aDowO2Zvcih2LmZpbmlzaD0hMCxmLnF1ZXVlKHRoaXMsYSxbXSksQSYmQS5zdG9wJiZBLnN0b3AuY2FsbCh0aGlzLCEwKSxkPUkubGVuZ3RoO2QtLTspSVtkXS5lbGVtPT09dGhpcyYmSVtkXS5xdWV1ZT09PWEmJihJW2RdLmFuaW0uc3RvcCghMCksSS5zcGxpY2UoZCwxKSk7Zm9yKGQ9MDtkPE47ZCsrKXhbZF0mJnhbZF0uZmluaXNoJiZ4W2RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSB2LmZpbmlzaH0pfX0pLGYuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oYSxkKXt2YXIgdj1mLmZuW2RdO2YuZm5bZF09ZnVuY3Rpb24oeCxBLEkpe3JldHVybiB4PT1udWxsfHx0eXBlb2YgeD09ImJvb2xlYW4iP3YuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShtcihkLCEwKSx4LEEsSSl9fSksZi5lYWNoKHtzbGlkZURvd246bXIoInNob3ciKSxzbGlkZVVwOm1yKCJoaWRlIiksc2xpZGVUb2dnbGU6bXIoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxkKXtmLmZuW2FdPWZ1bmN0aW9uKHYseCxBKXtyZXR1cm4gdGhpcy5hbmltYXRlKGQsdix4LEEpfX0pLGYudGltZXJzPVtdLGYuZngudGljaz1mdW5jdGlvbigpe3ZhciBhLGQ9MCx2PWYudGltZXJzO2ZvcihBbj1EYXRlLm5vdygpO2Q8di5sZW5ndGg7ZCsrKWE9dltkXSwhYSgpJiZ2W2RdPT09YSYmdi5zcGxpY2UoZC0tLDEpO3YubGVuZ3RofHxmLmZ4LnN0b3AoKSxBbj12b2lkIDB9LGYuZngudGltZXI9ZnVuY3Rpb24oYSl7Zi50aW1lcnMucHVzaChhKSxmLmZ4LnN0YXJ0KCl9LGYuZnguaW50ZXJ2YWw9MTMsZi5meC5zdGFydD1mdW5jdGlvbigpe2JyfHwoYnI9ITAsUXIoKSl9LGYuZnguc3RvcD1mdW5jdGlvbigpe2JyPW51bGx9LGYuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LGYuZm4uZGVsYXk9ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT1mLmZ4JiZmLmZ4LnNwZWVkc1thXXx8YSxkPWR8fCJmeCIsdGhpcy5xdWV1ZShkLGZ1bmN0aW9uKHYseCl7dmFyIEE9dC5zZXRUaW1lb3V0KHYsYSk7eC5zdG9wPWZ1bmN0aW9uKCl7dC5jbGVhclRpbWVvdXQoQSl9fSl9LGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGQ9Yy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSx2PWQuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7YS50eXBlPSJjaGVja2JveCIseS5jaGVja09uPWEudmFsdWUhPT0iIix5Lm9wdFNlbGVjdGVkPXYuc2VsZWN0ZWQsYT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS52YWx1ZT0idCIsYS50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPWEudmFsdWU9PT0idCJ9KCk7dmFyIHdhLFduPWYuZXhwci5hdHRySGFuZGxlO2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIEsodGhpcyxmLmF0dHIsYSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksZi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEEsST1hLm5vZGVUeXBlO2lmKCEoST09PTN8fEk9PT04fHxJPT09Mikpe2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT4idSIpcmV0dXJuIGYucHJvcChhLGQsdik7aWYoKEkhPT0xfHwhZi5pc1hNTERvYyhhKSkmJihBPWYuYXR0ckhvb2tzW2QudG9Mb3dlckNhc2UoKV18fChmLmV4cHIubWF0Y2guYm9vbC50ZXN0KGQpP3dhOnZvaWQgMCkpLHYhPT12b2lkIDApe2lmKHY9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxkKTtyZXR1cm59cmV0dXJuIEEmJiJzZXQiaW4gQSYmKHg9QS5zZXQoYSx2LGQpKSE9PXZvaWQgMD94OihhLnNldEF0dHJpYnV0ZShkLHYrIiIpLHYpfXJldHVybiBBJiYiZ2V0ImluIEEmJih4PUEuZ2V0KGEsZCkpIT09bnVsbD94Oih4PWYuZmluZC5hdHRyKGEsZCkseD8/dm9pZCAwKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsZCl7aWYoIXkucmFkaW9WYWx1ZSYmZD09PSJyYWRpbyImJlgoYSwiaW5wdXQiKSl7dmFyIHY9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGQpLHYmJihhLnZhbHVlPXYpLGR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTAsQT1kJiZkLm1hdGNoKEJ0KTtpZihBJiZhLm5vZGVUeXBlPT09MSlmb3IoO3Y9QVt4KytdOylhLnJlbW92ZUF0dHJpYnV0ZSh2KX19KSx3YT17c2V0OmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZD09PSExP2YucmVtb3ZlQXR0cihhLHYpOmEuc2V0QXR0cmlidXRlKHYsdiksdn19LGYuZWFjaChmLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGQpe3ZhciB2PVduW2RdfHxmLmZpbmQuYXR0cjtXbltkXT1mdW5jdGlvbih4LEEsSSl7dmFyIE4sWSxXPUEudG9Mb3dlckNhc2UoKTtyZXR1cm4gSXx8KFk9V25bV10sV25bV109TixOPXYoeCxBLEkpIT1udWxsP1c6bnVsbCxXbltXXT1ZKSxOfX0pO3ZhciB3bz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHhvPS9eKD86YXxhcmVhKSQvaTtmLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGQpe3JldHVybiBLKHRoaXMsZi5wcm9wLGEsZCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tmLnByb3BGaXhbYV18fGFdfSl9fSksZi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEEsST1hLm5vZGVUeXBlO2lmKCEoST09PTN8fEk9PT04fHxJPT09MikpcmV0dXJuKEkhPT0xfHwhZi5pc1hNTERvYyhhKSkmJihkPWYucHJvcEZpeFtkXXx8ZCxBPWYucHJvcEhvb2tzW2RdKSx2IT09dm9pZCAwP0EmJiJzZXQiaW4gQSYmKHg9QS5zZXQoYSx2LGQpKSE9PXZvaWQgMD94OmFbZF09djpBJiYiZ2V0ImluIEEmJih4PUEuZ2V0KGEsZCkpIT09bnVsbD94OmFbZF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgZD1mLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBkP3BhcnNlSW50KGQsMTApOndvLnRlc3QoYS5ub2RlTmFtZSl8fHhvLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5wYXJlbnROb2RlO3JldHVybiBkJiZkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihhKXt2YXIgZD1hLnBhcmVudE5vZGU7ZCYmKGQuc2VsZWN0ZWRJbmRleCxkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxmLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe2YucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KTtmdW5jdGlvbiBobihhKXt2YXIgZD1hLm1hdGNoKEJ0KXx8W107cmV0dXJuIGQuam9pbigiICIpfWZ1bmN0aW9uIHBuKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHRpKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpP2E6dHlwZW9mIGE9PSJzdHJpbmciP2EubWF0Y2goQnQpfHxbXTpbXX1mLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGQsdix4LEEsSSxOO3JldHVybiBUKGEpP3RoaXMuZWFjaChmdW5jdGlvbihZKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLFkscG4odGhpcykpKX0pOihkPXRpKGEpLGQubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHg9cG4odGhpcyksdj10aGlzLm5vZGVUeXBlPT09MSYmIiAiK2huKHgpKyIgIix2KXtmb3IoST0wO0k8ZC5sZW5ndGg7SSsrKUE9ZFtJXSx2LmluZGV4T2YoIiAiK0ErIiAiKTwwJiYodis9QSsiICIpO049aG4odikseCE9PU4mJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsTil9fSk6dGhpcyl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBkLHYseCxBLEksTjtyZXR1cm4gVChhKT90aGlzLmVhY2goZnVuY3Rpb24oWSl7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxZLHBuKHRoaXMpKSl9KTphcmd1bWVudHMubGVuZ3RoPyhkPXRpKGEpLGQubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHg9cG4odGhpcyksdj10aGlzLm5vZGVUeXBlPT09MSYmIiAiK2huKHgpKyIgIix2KXtmb3IoST0wO0k8ZC5sZW5ndGg7SSsrKWZvcihBPWRbSV07di5pbmRleE9mKCIgIitBKyIgIik+LTE7KXY9di5yZXBsYWNlKCIgIitBKyIgIiwiICIpO049aG4odikseCE9PU4mJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsTil9fSk6dGhpcyk6dGhpcy5hdHRyKCJjbGFzcyIsIiIpfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGQpe3ZhciB2LHgsQSxJLE49dHlwZW9mIGEsWT1OPT09InN0cmluZyJ8fEFycmF5LmlzQXJyYXkoYSk7cmV0dXJuIFQoYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKFcpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsVyxwbih0aGlzKSxkKSxkKX0pOnR5cGVvZiBkPT0iYm9vbGVhbiImJlk/ZD90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6KHY9dGkoYSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoWSlmb3IoST1mKHRoaXMpLEE9MDtBPHYubGVuZ3RoO0ErKyl4PXZbQV0sSS5oYXNDbGFzcyh4KT9JLnJlbW92ZUNsYXNzKHgpOkkuYWRkQ2xhc3MoeCk7ZWxzZShhPT09dm9pZCAwfHxOPT09ImJvb2xlYW4iKSYmKHg9cG4odGhpcykseCYmbXQuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHgpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHh8fGE9PT0hMT8iIjptdC5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSkpfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgZCx2LHg9MDtmb3IoZD0iICIrYSsiICI7dj10aGlzW3grK107KWlmKHYubm9kZVR5cGU9PT0xJiYoIiAiK2huKHBuKHYpKSsiICIpLmluZGV4T2YoZCk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIF9vPS9cci9nO2YuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGQsdix4LEE9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1UKGEpLHRoaXMuZWFjaChmdW5jdGlvbihJKXt2YXIgTjt0aGlzLm5vZGVUeXBlPT09MSYmKHg/Tj1hLmNhbGwodGhpcyxJLGYodGhpcykudmFsKCkpOk49YSxOPT1udWxsP049IiI6dHlwZW9mIE49PSJudW1iZXIiP04rPSIiOkFycmF5LmlzQXJyYXkoTikmJihOPWYubWFwKE4sZnVuY3Rpb24oWSl7cmV0dXJuIFk9PW51bGw/IiI6WSsiIn0pKSxkPWYudmFsSG9va3NbdGhpcy50eXBlXXx8Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLCghZHx8ISgic2V0ImluIGQpfHxkLnNldCh0aGlzLE4sInZhbHVlIik9PT12b2lkIDApJiYodGhpcy52YWx1ZT1OKSl9KSk6QT8oZD1mLnZhbEhvb2tzW0EudHlwZV18fGYudmFsSG9va3NbQS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxkJiYiZ2V0ImluIGQmJih2PWQuZ2V0KEEsInZhbHVlIikpIT09dm9pZCAwP3Y6KHY9QS52YWx1ZSx0eXBlb2Ygdj09InN0cmluZyI/di5yZXBsYWNlKF9vLCIiKTp2Pz8iIikpOnZvaWQgMH19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWYuZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIGQ/P2huKGYudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgZCx2LHgsQT1hLm9wdGlvbnMsST1hLnNlbGVjdGVkSW5kZXgsTj1hLnR5cGU9PT0ic2VsZWN0LW9uZSIsWT1OP251bGw6W10sVz1OP0krMTpBLmxlbmd0aDtmb3IoSTwwP3g9Vzp4PU4/STowO3g8Vzt4KyspaWYodj1BW3hdLCh2LnNlbGVjdGVkfHx4PT09SSkmJiF2LmRpc2FibGVkJiYoIXYucGFyZW50Tm9kZS5kaXNhYmxlZHx8IVgodi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZD1mKHYpLnZhbCgpLE4pcmV0dXJuIGQ7WS5wdXNoKGQpfXJldHVybiBZfSxzZXQ6ZnVuY3Rpb24oYSxkKXtmb3IodmFyIHYseCxBPWEub3B0aW9ucyxJPWYubWFrZUFycmF5KGQpLE49QS5sZW5ndGg7Ti0tOyl4PUFbTl0sKHguc2VsZWN0ZWQ9Zi5pbkFycmF5KGYudmFsSG9va3Mub3B0aW9uLmdldCh4KSxJKT4tMSkmJih2PSEwKTtyZXR1cm4gdnx8KGEuc2VsZWN0ZWRJbmRleD0tMSksSX19fX0pLGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGQpe2lmKEFycmF5LmlzQXJyYXkoZCkpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxkKT4tMX19LHkuY2hlY2tPbnx8KGYudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfSl9KTt2YXIgR249dC5sb2NhdGlvbix4YT17Z3VpZDpEYXRlLm5vdygpfSxlaT0vXD8vO2YucGFyc2VYTUw9ZnVuY3Rpb24oYSl7dmFyIGQsdjtpZighYXx8dHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXtkPW5ldyB0LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpfWNhdGNoe31yZXR1cm4gdj1kJiZkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpWzBdLCghZHx8dikmJmYuZXJyb3IoIkludmFsaWQgWE1MOiAiKyh2P2YubWFwKHYuY2hpbGROb2RlcyxmdW5jdGlvbih4KXtyZXR1cm4geC50ZXh0Q29udGVudH0pLmpvaW4oYApgKTphKSksZH07dmFyIF9hPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxDYT1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfTtmLmV4dGVuZChmLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKGEsZCx2LHgpe3ZhciBBLEksTixZLFcsSixkdCxmdCxzdD1bdnx8Y10seXQ9Zy5jYWxsKGEsInR5cGUiKT9hLnR5cGU6YSxPdD1nLmNhbGwoYSwibmFtZXNwYWNlIik/YS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihJPWZ0PU49dj12fHxjLCEodi5ub2RlVHlwZT09PTN8fHYubm9kZVR5cGU9PT04KSYmIV9hLnRlc3QoeXQrZi5ldmVudC50cmlnZ2VyZWQpJiYoeXQuaW5kZXhPZigiLiIpPi0xJiYoT3Q9eXQuc3BsaXQoIi4iKSx5dD1PdC5zaGlmdCgpLE90LnNvcnQoKSksVz15dC5pbmRleE9mKCI6Iik8MCYmIm9uIit5dCxhPWFbZi5leHBhbmRvXT9hOm5ldyBmLkV2ZW50KHl0LHR5cGVvZiBhPT0ib2JqZWN0IiYmYSksYS5pc1RyaWdnZXI9eD8yOjMsYS5uYW1lc3BhY2U9T3Quam9pbigiLiIpLGEucm5hbWVzcGFjZT1hLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitPdC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGEucmVzdWx0PXZvaWQgMCxhLnRhcmdldHx8KGEudGFyZ2V0PXYpLGQ9ZD09bnVsbD9bYV06Zi5tYWtlQXJyYXkoZCxbYV0pLGR0PWYuZXZlbnQuc3BlY2lhbFt5dF18fHt9LCEoIXgmJmR0LnRyaWdnZXImJmR0LnRyaWdnZXIuYXBwbHkodixkKT09PSExKSkpe2lmKCF4JiYhZHQubm9CdWJibGUmJiFQKHYpKXtmb3IoWT1kdC5kZWxlZ2F0ZVR5cGV8fHl0LF9hLnRlc3QoWSt5dCl8fChJPUkucGFyZW50Tm9kZSk7STtJPUkucGFyZW50Tm9kZSlzdC5wdXNoKEkpLE49STtOPT09KHYub3duZXJEb2N1bWVudHx8YykmJnN0LnB1c2goTi5kZWZhdWx0Vmlld3x8Ti5wYXJlbnRXaW5kb3d8fHQpfWZvcihBPTA7KEk9c3RbQSsrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZ0PUksYS50eXBlPUE+MT9ZOmR0LmJpbmRUeXBlfHx5dCxKPShtdC5nZXQoSSwiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2EudHlwZV0mJm10LmdldChJLCJoYW5kbGUiKSxKJiZKLmFwcGx5KEksZCksSj1XJiZJW1ddLEomJkouYXBwbHkmJkN0KEkpJiYoYS5yZXN1bHQ9Si5hcHBseShJLGQpLGEucmVzdWx0PT09ITEmJmEucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGEudHlwZT15dCwheCYmIWEuaXNEZWZhdWx0UHJldmVudGVkKCkmJighZHQuX2RlZmF1bHR8fGR0Ll9kZWZhdWx0LmFwcGx5KHN0LnBvcCgpLGQpPT09ITEpJiZDdCh2KSYmVyYmVCh2W3l0XSkmJiFQKHYpJiYoTj12W1ddLE4mJih2W1ddPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPXl0LGEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZnQuYWRkRXZlbnRMaXN0ZW5lcih5dCxDYSksdlt5dF0oKSxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoeXQsQ2EpLGYuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxOJiYodltXXT1OKSksYS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGQsdil7dmFyIHg9Zi5leHRlbmQobmV3IGYuRXZlbnQsdix7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7Zi5ldmVudC50cmlnZ2VyKHgsbnVsbCxkKX19KSxmLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxkLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsZCl7dmFyIHY9dGhpc1swXTtpZih2KXJldHVybiBmLmV2ZW50LnRyaWdnZXIoYSxkLHYsITApfX0pO3ZhciBDbz0vXFtcXSQvLFRhPS9ccj9cbi9nLFRvPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxrbz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gbmkoYSxkLHYseCl7dmFyIEE7aWYoQXJyYXkuaXNBcnJheShkKSlmLmVhY2goZCxmdW5jdGlvbihJLE4pe3Z8fENvLnRlc3QoYSk/eChhLE4pOm5pKGErIlsiKyh0eXBlb2YgTj09Im9iamVjdCImJk4hPW51bGw/SToiIikrIl0iLE4sdix4KX0pO2Vsc2UgaWYoIXYmJl8oZCk9PT0ib2JqZWN0Iilmb3IoQSBpbiBkKW5pKGErIlsiK0ErIl0iLGRbQV0sdix4KTtlbHNlIHgoYSxkKX1mLnBhcmFtPWZ1bmN0aW9uKGEsZCl7dmFyIHYseD1bXSxBPWZ1bmN0aW9uKEksTil7dmFyIFk9VChOKT9OKCk6Tjt4W3gubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoSSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChZPz8iIil9O2lmKGE9PW51bGwpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtBKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHYgaW4gYSluaSh2LGFbdl0sZCxBKTtyZXR1cm4geC5qb2luKCImIil9LGYuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPWYucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP2YubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIWYodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZrby50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVG8udGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVdlLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsZCl7dmFyIHY9Zih0aGlzKS52YWwoKTtyZXR1cm4gdj09bnVsbD9udWxsOkFycmF5LmlzQXJyYXkodik/Zi5tYXAodixmdW5jdGlvbih4KXtyZXR1cm57bmFtZTpkLm5hbWUsdmFsdWU6eC5yZXBsYWNlKFRhLGBccgpgKX19KTp7bmFtZTpkLm5hbWUsdmFsdWU6di5yZXBsYWNlKFRhLGBccgpgKX19KS5nZXQoKX19KTt2YXIgU289LyUyMC9nLERvPS8jLiokLyxBbz0vKFs/Jl0pXz1bXiZdKi8sSW89L14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZyxQbz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxGbz0vXig/OkdFVHxIRUFEKSQvLEJvPS9eXC9cLy8sa2E9e30scmk9e30sU2E9IiovIi5jb25jYXQoIioiKSxpaT1jLmNyZWF0ZUVsZW1lbnQoImEiKTtpaS5ocmVmPUduLmhyZWY7ZnVuY3Rpb24gRGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGQsdil7dHlwZW9mIGQhPSJzdHJpbmciJiYodj1kLGQ9IioiKTt2YXIgeCxBPTAsST1kLnRvTG93ZXJDYXNlKCkubWF0Y2goQnQpfHxbXTtpZihUKHYpKWZvcig7eD1JW0ErK107KXhbMF09PT0iKyI/KHg9eC5zbGljZSgxKXx8IioiLChhW3hdPWFbeF18fFtdKS51bnNoaWZ0KHYpKTooYVt4XT1hW3hdfHxbXSkucHVzaCh2KX19ZnVuY3Rpb24gQWEoYSxkLHYseCl7dmFyIEE9e30sST1hPT09cmk7ZnVuY3Rpb24gTihZKXt2YXIgVztyZXR1cm4gQVtZXT0hMCxmLmVhY2goYVtZXXx8W10sZnVuY3Rpb24oSixkdCl7dmFyIGZ0PWR0KGQsdix4KTtpZih0eXBlb2YgZnQ9PSJzdHJpbmciJiYhSSYmIUFbZnRdKXJldHVybiBkLmRhdGFUeXBlcy51bnNoaWZ0KGZ0KSxOKGZ0KSwhMTtpZihJKXJldHVybiEoVz1mdCl9KSxXfXJldHVybiBOKGQuZGF0YVR5cGVzWzBdKXx8IUFbIioiXSYmTigiKiIpfWZ1bmN0aW9uIGFpKGEsZCl7dmFyIHYseCxBPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IodiBpbiBkKWRbdl0hPT12b2lkIDAmJigoQVt2XT9hOnh8fCh4PXt9KSlbdl09ZFt2XSk7cmV0dXJuIHgmJmYuZXh0ZW5kKCEwLGEseCksYX1mdW5jdGlvbiBObyhhLGQsdil7Zm9yKHZhciB4LEEsSSxOLFk9YS5jb250ZW50cyxXPWEuZGF0YVR5cGVzO1dbMF09PT0iKiI7KVcuc2hpZnQoKSx4PT09dm9pZCAwJiYoeD1hLm1pbWVUeXBlfHxkLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYoeCl7Zm9yKEEgaW4gWSlpZihZW0FdJiZZW0FdLnRlc3QoeCkpe1cudW5zaGlmdChBKTticmVha319aWYoV1swXWluIHYpST1XWzBdO2Vsc2V7Zm9yKEEgaW4gdil7aWYoIVdbMF18fGEuY29udmVydGVyc1tBKyIgIitXWzBdXSl7ST1BO2JyZWFrfU58fChOPUEpfUk9SXx8Tn1pZihJKXJldHVybiBJIT09V1swXSYmVy51bnNoaWZ0KEkpLHZbSV19ZnVuY3Rpb24gT28oYSxkLHYseCl7dmFyIEEsSSxOLFksVyxKPXt9LGR0PWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoZHRbMV0pZm9yKE4gaW4gYS5jb252ZXJ0ZXJzKUpbTi50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbTl07Zm9yKEk9ZHQuc2hpZnQoKTtJOylpZihhLnJlc3BvbnNlRmllbGRzW0ldJiYodlthLnJlc3BvbnNlRmllbGRzW0ldXT1kKSwhVyYmeCYmYS5kYXRhRmlsdGVyJiYoZD1hLmRhdGFGaWx0ZXIoZCxhLmRhdGFUeXBlKSksVz1JLEk9ZHQuc2hpZnQoKSxJKXtpZihJPT09IioiKUk9VztlbHNlIGlmKFchPT0iKiImJlchPT1JKXtpZihOPUpbVysiICIrSV18fEpbIiogIitJXSwhTil7Zm9yKEEgaW4gSilpZihZPUEuc3BsaXQoIiAiKSxZWzFdPT09SSYmKE49SltXKyIgIitZWzBdXXx8SlsiKiAiK1lbMF1dLE4pKXtOPT09ITA/Tj1KW0FdOkpbQV0hPT0hMCYmKEk9WVswXSxkdC51bnNoaWZ0KFlbMV0pKTticmVha319aWYoTiE9PSEwKWlmKE4mJmEudGhyb3dzKWQ9TihkKTtlbHNlIHRyeXtkPU4oZCl9Y2F0Y2goZnQpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOk4/ZnQ6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK1crIiB0byAiK0l9fX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmR9fWYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpHbi5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDpQby50ZXN0KEduLnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOlNhLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpmLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZD9haShhaShhLGYuYWpheFNldHRpbmdzKSxkKTphaShmLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpEYShrYSksYWpheFRyYW5zcG9ydDpEYShyaSksYWpheDpmdW5jdGlvbihhLGQpe3R5cGVvZiBhPT0ib2JqZWN0IiYmKGQ9YSxhPXZvaWQgMCksZD1kfHx7fTt2YXIgdix4LEEsSSxOLFksVyxKLGR0LGZ0LHN0PWYuYWpheFNldHVwKHt9LGQpLHl0PXN0LmNvbnRleHR8fHN0LE90PXN0LmNvbnRleHQmJih5dC5ub2RlVHlwZXx8eXQuanF1ZXJ5KT9mKHl0KTpmLmV2ZW50LFh0PWYuRGVmZXJyZWQoKSxWdD1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1ZT1zdC5zdGF0dXNDb2RlfHx7fSxvZT17fSxHZT17fSxxZT0iY2FuY2VsZWQiLHF0PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oWXQpe3ZhciByZTtpZihXKXtpZighSSlmb3IoST17fTtyZT1Jby5leGVjKEEpOylJW3JlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oSVtyZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQocmVbMl0pO3JlPUlbWXQudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiByZT09bnVsbD9udWxsOnJlLmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBXP0E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihZdCxyZSl7cmV0dXJuIFc9PW51bGwmJihZdD1HZVtZdC50b0xvd2VyQ2FzZSgpXT1HZVtZdC50b0xvd2VyQ2FzZSgpXXx8WXQsb2VbWXRdPXJlKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKFl0KXtyZXR1cm4gVz09bnVsbCYmKHN0Lm1pbWVUeXBlPVl0KSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKFl0KXt2YXIgcmU7aWYoWXQpaWYoVylxdC5hbHdheXMoWXRbcXQuc3RhdHVzXSk7ZWxzZSBmb3IocmUgaW4gWXQpdWVbcmVdPVt1ZVtyZV0sWXRbcmVdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oWXQpe3ZhciByZT1ZdHx8cWU7cmV0dXJuIHYmJnYuYWJvcnQocmUpLGJuKDAscmUpLHRoaXN9fTtpZihYdC5wcm9taXNlKHF0KSxzdC51cmw9KChhfHxzdC51cmx8fEduLmhyZWYpKyIiKS5yZXBsYWNlKEJvLEduLnByb3RvY29sKyIvLyIpLHN0LnR5cGU9ZC5tZXRob2R8fGQudHlwZXx8c3QubWV0aG9kfHxzdC50eXBlLHN0LmRhdGFUeXBlcz0oc3QuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChCdCl8fFsiIl0sc3QuY3Jvc3NEb21haW49PW51bGwpe1k9Yy5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e1kuaHJlZj1zdC51cmwsWS5ocmVmPVkuaHJlZixzdC5jcm9zc0RvbWFpbj1paS5wcm90b2NvbCsiLy8iK2lpLmhvc3QhPVkucHJvdG9jb2wrIi8vIitZLmhvc3R9Y2F0Y2h7c3QuY3Jvc3NEb21haW49ITB9fWlmKHN0LmRhdGEmJnN0LnByb2Nlc3NEYXRhJiZ0eXBlb2Ygc3QuZGF0YSE9InN0cmluZyImJihzdC5kYXRhPWYucGFyYW0oc3QuZGF0YSxzdC50cmFkaXRpb25hbCkpLEFhKGthLHN0LGQscXQpLFcpcmV0dXJuIHF0O0o9Zi5ldmVudCYmc3QuZ2xvYmFsLEomJmYuYWN0aXZlKys9PT0wJiZmLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHN0LnR5cGU9c3QudHlwZS50b1VwcGVyQ2FzZSgpLHN0Lmhhc0NvbnRlbnQ9IUZvLnRlc3Qoc3QudHlwZSkseD1zdC51cmwucmVwbGFjZShEbywiIiksc3QuaGFzQ29udGVudD9zdC5kYXRhJiZzdC5wcm9jZXNzRGF0YSYmKHN0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik9PT0wJiYoc3QuZGF0YT1zdC5kYXRhLnJlcGxhY2UoU28sIisiKSk6KGZ0PXN0LnVybC5zbGljZSh4Lmxlbmd0aCksc3QuZGF0YSYmKHN0LnByb2Nlc3NEYXRhfHx0eXBlb2Ygc3QuZGF0YT09InN0cmluZyIpJiYoeCs9KGVpLnRlc3QoeCk/IiYiOiI/Iikrc3QuZGF0YSxkZWxldGUgc3QuZGF0YSksc3QuY2FjaGU9PT0hMSYmKHg9eC5yZXBsYWNlKEFvLCIkMSIpLGZ0PShlaS50ZXN0KHgpPyImIjoiPyIpKyJfPSIreGEuZ3VpZCsrK2Z0KSxzdC51cmw9eCtmdCksc3QuaWZNb2RpZmllZCYmKGYubGFzdE1vZGlmaWVkW3hdJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRbeF0pLGYuZXRhZ1t4XSYmcXQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW3hdKSksKHN0LmRhdGEmJnN0Lmhhc0NvbnRlbnQmJnN0LmNvbnRlbnRUeXBlIT09ITF8fGQuY29udGVudFR5cGUpJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHN0LmNvbnRlbnRUeXBlKSxxdC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHN0LmRhdGFUeXBlc1swXSYmc3QuYWNjZXB0c1tzdC5kYXRhVHlwZXNbMF1dP3N0LmFjY2VwdHNbc3QuZGF0YVR5cGVzWzBdXSsoc3QuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrU2ErIjsgcT0wLjAxIjoiIik6c3QuYWNjZXB0c1siKiJdKTtmb3IoZHQgaW4gc3QuaGVhZGVycylxdC5zZXRSZXF1ZXN0SGVhZGVyKGR0LHN0LmhlYWRlcnNbZHRdKTtpZihzdC5iZWZvcmVTZW5kJiYoc3QuYmVmb3JlU2VuZC5jYWxsKHl0LHF0LHN0KT09PSExfHxXKSlyZXR1cm4gcXQuYWJvcnQoKTtpZihxZT0iYWJvcnQiLFZ0LmFkZChzdC5jb21wbGV0ZSkscXQuZG9uZShzdC5zdWNjZXNzKSxxdC5mYWlsKHN0LmVycm9yKSx2PUFhKHJpLHN0LGQscXQpLCF2KWJuKC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle2lmKHF0LnJlYWR5U3RhdGU9MSxKJiZPdC50cmlnZ2VyKCJhamF4U2VuZCIsW3F0LHN0XSksVylyZXR1cm4gcXQ7c3QuYXN5bmMmJnN0LnRpbWVvdXQ+MCYmKE49dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cXQuYWJvcnQoInRpbWVvdXQiKX0sc3QudGltZW91dCkpO3RyeXtXPSExLHYuc2VuZChvZSxibil9Y2F0Y2goWXQpe2lmKFcpdGhyb3cgWXQ7Ym4oLTEsWXQpfX1mdW5jdGlvbiBibihZdCxyZSxYbixvaSl7dmFyIFhlLFluLFllLGVuLG5uLFBlPXJlO1d8fChXPSEwLE4mJnQuY2xlYXJUaW1lb3V0KE4pLHY9dm9pZCAwLEE9b2l8fCIiLHF0LnJlYWR5U3RhdGU9WXQ+MD80OjAsWGU9WXQ+PTIwMCYmWXQ8MzAwfHxZdD09PTMwNCxYbiYmKGVuPU5vKHN0LHF0LFhuKSksIVhlJiZmLmluQXJyYXkoInNjcmlwdCIsc3QuZGF0YVR5cGVzKT4tMSYmZi5pbkFycmF5KCJqc29uIixzdC5kYXRhVHlwZXMpPDAmJihzdC5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSksZW49T28oc3QsZW4scXQsWGUpLFhlPyhzdC5pZk1vZGlmaWVkJiYobm49cXQuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxubiYmKGYubGFzdE1vZGlmaWVkW3hdPW5uKSxubj1xdC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLG5uJiYoZi5ldGFnW3hdPW5uKSksWXQ9PT0yMDR8fHN0LnR5cGU9PT0iSEVBRCI/UGU9Im5vY29udGVudCI6WXQ9PT0zMDQ/UGU9Im5vdG1vZGlmaWVkIjooUGU9ZW4uc3RhdGUsWW49ZW4uZGF0YSxZZT1lbi5lcnJvcixYZT0hWWUpKTooWWU9UGUsKFl0fHwhUGUpJiYoUGU9ImVycm9yIixZdDwwJiYoWXQ9MCkpKSxxdC5zdGF0dXM9WXQscXQuc3RhdHVzVGV4dD0ocmV8fFBlKSsiIixYZT9YdC5yZXNvbHZlV2l0aCh5dCxbWW4sUGUscXRdKTpYdC5yZWplY3RXaXRoKHl0LFtxdCxQZSxZZV0pLHF0LnN0YXR1c0NvZGUodWUpLHVlPXZvaWQgMCxKJiZPdC50cmlnZ2VyKFhlPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3F0LHN0LFhlP1luOlllXSksVnQuZmlyZVdpdGgoeXQsW3F0LFBlXSksSiYmKE90LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3F0LHN0XSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHF0fSxnZXRKU09OOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZi5nZXQoYSxkLHYsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGYuZ2V0KGEsdm9pZCAwLGQsInNjcmlwdCIpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGQpe2ZbZF09ZnVuY3Rpb24odix4LEEsSSl7cmV0dXJuIFQoeCkmJihJPUl8fEEsQT14LHg9dm9pZCAwKSxmLmFqYXgoZi5leHRlbmQoe3VybDp2LHR5cGU6ZCxkYXRhVHlwZTpJLGRhdGE6eCxzdWNjZXNzOkF9LGYuaXNQbGFpbk9iamVjdCh2KSYmdikpfX0pLGYuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXt2YXIgZDtmb3IoZCBpbiBhLmhlYWRlcnMpZC50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSImJihhLmNvbnRlbnRUeXBlPWEuaGVhZGVyc1tkXXx8IiIpfSksZi5fZXZhbFVybD1mdW5jdGlvbihhLGQsdil7cmV0dXJuIGYuYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24oeCl7Zi5nbG9iYWxFdmFsKHgsZCx2KX19KX0sZi5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7dmFyIGQ7cmV0dXJuIHRoaXNbMF0mJihUKGEpJiYoYT1hLmNhbGwodGhpc1swXSkpLGQ9ZihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmZC5pbnNlcnRCZWZvcmUodGhpc1swXSksZC5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHY9dGhpczt2LmZpcnN0RWxlbWVudENoaWxkOyl2PXYuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIHZ9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gVChhKT90aGlzLmVhY2goZnVuY3Rpb24oZCl7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsZCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Zih0aGlzKSx2PWQuY29udGVudHMoKTt2Lmxlbmd0aD92LndyYXBBbGwoYSk6ZC5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgZD1UKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odil7Zih0aGlzKS53cmFwQWxsKGQ/YS5jYWxsKHRoaXMsdik6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxmLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LGYuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxmLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyB0LlhNTEh0dHBSZXF1ZXN0fWNhdGNoe319O3ZhciBFbz17MDoyMDAsMTIyMzoyMDR9LHFuPWYuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIXFuJiYid2l0aENyZWRlbnRpYWxzImluIHFuLHkuYWpheD1xbj0hIXFuLGYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXt2YXIgZCx2O2lmKHkuY29yc3x8cW4mJiFhLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKHgsQSl7dmFyIEksTj1hLnhocigpO2lmKE4ub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpLGEueGhyRmllbGRzKWZvcihJIGluIGEueGhyRmllbGRzKU5bSV09YS54aHJGaWVsZHNbSV07YS5taW1lVHlwZSYmTi5vdmVycmlkZU1pbWVUeXBlJiZOLm92ZXJyaWRlTWltZVR5cGUoYS5taW1lVHlwZSksIWEuY3Jvc3NEb21haW4mJiF4WyJYLVJlcXVlc3RlZC1XaXRoIl0mJih4WyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKEkgaW4geClOLnNldFJlcXVlc3RIZWFkZXIoSSx4W0ldKTtkPWZ1bmN0aW9uKFkpe3JldHVybiBmdW5jdGlvbigpe2QmJihkPXY9Ti5vbmxvYWQ9Ti5vbmVycm9yPU4ub25hYm9ydD1OLm9udGltZW91dD1OLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLFk9PT0iYWJvcnQiP04uYWJvcnQoKTpZPT09ImVycm9yIj90eXBlb2YgTi5zdGF0dXMhPSJudW1iZXIiP0EoMCwiZXJyb3IiKTpBKE4uc3RhdHVzLE4uc3RhdHVzVGV4dCk6QShFb1tOLnN0YXR1c118fE4uc3RhdHVzLE4uc3RhdHVzVGV4dCwoTi5yZXNwb25zZVR5cGV8fCJ0ZXh0IikhPT0idGV4dCJ8fHR5cGVvZiBOLnJlc3BvbnNlVGV4dCE9InN0cmluZyI/e2JpbmFyeTpOLnJlc3BvbnNlfTp7dGV4dDpOLnJlc3BvbnNlVGV4dH0sTi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sTi5vbmxvYWQ9ZCgpLHY9Ti5vbmVycm9yPU4ub250aW1lb3V0PWQoImVycm9yIiksTi5vbmFib3J0IT09dm9pZCAwP04ub25hYm9ydD12Ok4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Ti5yZWFkeVN0YXRlPT09NCYmdC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZCYmdigpfSl9LGQ9ZCgiYWJvcnQiKTt0cnl7Ti5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKX1jYXRjaChZKXtpZihkKXRocm93IFl9fSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoKX19fSksZi5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGEpe2EuY3Jvc3NEb21haW4mJihhLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxmLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtyZXR1cm4gZi5nbG9iYWxFdmFsKGEpLGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09dm9pZCAwJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIil9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbnx8YS5zY3JpcHRBdHRycyl7dmFyIGQsdjtyZXR1cm57c2VuZDpmdW5jdGlvbih4LEEpe2Q9ZigiPHNjcmlwdD4iKS5hdHRyKGEuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OmEuc2NyaXB0Q2hhcnNldCxzcmM6YS51cmx9KS5vbigibG9hZCBlcnJvciIsdj1mdW5jdGlvbihJKXtkLnJlbW92ZSgpLHY9bnVsbCxJJiZBKEkudHlwZT09PSJlcnJvciI/NDA0OjIwMCxJLnR5cGUpfSksYy5oZWFkLmFwcGVuZENoaWxkKGRbMF0pfSxhYm9ydDpmdW5jdGlvbigpe3YmJnYoKX19fX0pO3ZhciBJYT1bXSxzaT0vKD0pXD8oPz0mfCQpfFw/XD8vO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgYT1JYS5wb3AoKXx8Zi5leHBhbmRvKyJfIit4YS5ndWlkKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxmLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTj1hLmpzb25wIT09ITEmJihzaS50ZXN0KGEudXJsKT8idXJsIjp0eXBlb2YgYS5kYXRhPT0ic3RyaW5nIiYmKGEuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT09PTAmJnNpLnRlc3QoYS5kYXRhKSYmImRhdGEiKTtpZihOfHxhLmRhdGFUeXBlc1swXT09PSJqc29ucCIpcmV0dXJuIHg9YS5qc29ucENhbGxiYWNrPVQoYS5qc29ucENhbGxiYWNrKT9hLmpzb25wQ2FsbGJhY2soKTphLmpzb25wQ2FsbGJhY2ssTj9hW05dPWFbTl0ucmVwbGFjZShzaSwiJDEiK3gpOmEuanNvbnAhPT0hMSYmKGEudXJsKz0oZWkudGVzdChhLnVybCk/IiYiOiI/IikrYS5qc29ucCsiPSIreCksYS5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIEl8fGYuZXJyb3IoeCsiIHdhcyBub3QgY2FsbGVkIiksSVswXX0sYS5kYXRhVHlwZXNbMF09Impzb24iLEE9dFt4XSx0W3hdPWZ1bmN0aW9uKCl7ST1hcmd1bWVudHN9LHYuYWx3YXlzKGZ1bmN0aW9uKCl7QT09PXZvaWQgMD9mKHQpLnJlbW92ZVByb3AoeCk6dFt4XT1BLGFbeF0mJihhLmpzb25wQ2FsbGJhY2s9ZC5qc29ucENhbGxiYWNrLElhLnB1c2goeCkpLEkmJlQoQSkmJkEoSVswXSksST1BPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IixhLmNoaWxkTm9kZXMubGVuZ3RoPT09Mn0oKSxmLnBhcnNlSFRNTD1mdW5jdGlvbihhLGQsdil7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybltdO3R5cGVvZiBkPT0iYm9vbGVhbiImJih2PWQsZD0hMSk7dmFyIHgsQSxJO3JldHVybiBkfHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KGQ9Yy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLHg9ZC5jcmVhdGVFbGVtZW50KCJiYXNlIikseC5ocmVmPWMubG9jYXRpb24uaHJlZixkLmhlYWQuYXBwZW5kQ2hpbGQoeCkpOmQ9YyksQT1udC5leGVjKGEpLEk9IXYmJltdLEE/W2QuY3JlYXRlRWxlbWVudChBWzFdKV06KEE9YWEoW2FdLGQsSSksSSYmSS5sZW5ndGgmJmYoSSkucmVtb3ZlKCksZi5tZXJnZShbXSxBLmNoaWxkTm9kZXMpKX0sZi5mbi5sb2FkPWZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTj10aGlzLFk9YS5pbmRleE9mKCIgIik7cmV0dXJuIFk+LTEmJih4PWhuKGEuc2xpY2UoWSkpLGE9YS5zbGljZSgwLFkpKSxUKGQpPyh2PWQsZD12b2lkIDApOmQmJnR5cGVvZiBkPT0ib2JqZWN0IiYmKEE9IlBPU1QiKSxOLmxlbmd0aD4wJiZmLmFqYXgoe3VybDphLHR5cGU6QXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6ZH0pLmRvbmUoZnVuY3Rpb24oVyl7ST1hcmd1bWVudHMsTi5odG1sKHg/ZigiPGRpdj4iKS5hcHBlbmQoZi5wYXJzZUhUTUwoVykpLmZpbmQoeCk6Vyl9KS5hbHdheXModiYmZnVuY3Rpb24oVyxKKXtOLmVhY2goZnVuY3Rpb24oKXt2LmFwcGx5KHRoaXMsSXx8W1cucmVzcG9uc2VUZXh0LEosV10pfSl9KSx0aGlzfSxmLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGQpe3JldHVybiBhPT09ZC5lbGVtfSkubGVuZ3RofSxmLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTixZLFcsSixkdD1mLmNzcyhhLCJwb3NpdGlvbiIpLGZ0PWYoYSksc3Q9e307ZHQ9PT0ic3RhdGljIiYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksWT1mdC5vZmZzZXQoKSxJPWYuY3NzKGEsInRvcCIpLFc9Zi5jc3MoYSwibGVmdCIpLEo9KGR0PT09ImFic29sdXRlInx8ZHQ9PT0iZml4ZWQiKSYmKEkrVykuaW5kZXhPZigiYXV0byIpPi0xLEo/KHg9ZnQucG9zaXRpb24oKSxOPXgudG9wLEE9eC5sZWZ0KTooTj1wYXJzZUZsb2F0KEkpfHwwLEE9cGFyc2VGbG9hdChXKXx8MCksVChkKSYmKGQ9ZC5jYWxsKGEsdixmLmV4dGVuZCh7fSxZKSkpLGQudG9wIT1udWxsJiYoc3QudG9wPWQudG9wLVkudG9wK04pLGQubGVmdCE9bnVsbCYmKHN0LmxlZnQ9ZC5sZWZ0LVkubGVmdCtBKSwidXNpbmciaW4gZD9kLnVzaW5nLmNhbGwoYSxzdCk6ZnQuY3NzKHN0KX19LGYuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYT09PXZvaWQgMD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihBKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLEEpfSk7dmFyIGQsdix4PXRoaXNbMF07aWYoeClyZXR1cm4geC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9eC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZC50b3Ardi5wYWdlWU9mZnNldCxsZWZ0OmQubGVmdCt2LnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsZCx2LHg9dGhpc1swXSxBPXt0b3A6MCxsZWZ0OjB9O2lmKGYuY3NzKHgsInBvc2l0aW9uIik9PT0iZml4ZWQiKWQ9eC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2ZvcihkPXRoaXMub2Zmc2V0KCksdj14Lm93bmVyRG9jdW1lbnQsYT14Lm9mZnNldFBhcmVudHx8di5kb2N1bWVudEVsZW1lbnQ7YSYmKGE9PT12LmJvZHl8fGE9PT12LmRvY3VtZW50RWxlbWVudCkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIjspYT1hLnBhcmVudE5vZGU7YSYmYSE9PXgmJmEubm9kZVR5cGU9PT0xJiYoQT1mKGEpLm9mZnNldCgpLEEudG9wKz1mLmNzcyhhLCJib3JkZXJUb3BXaWR0aCIsITApLEEubGVmdCs9Zi5jc3MoYSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6ZC50b3AtQS50b3AtZi5jc3MoeCwibWFyZ2luVG9wIiwhMCksbGVmdDpkLmxlZnQtQS5sZWZ0LWYuY3NzKHgsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5vZmZzZXRQYXJlbnQ7YSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxqZX0pfX0pLGYuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGQpe3ZhciB2PWQ9PT0icGFnZVlPZmZzZXQiO2YuZm5bYV09ZnVuY3Rpb24oeCl7cmV0dXJuIEsodGhpcyxmdW5jdGlvbihBLEksTil7dmFyIFk7aWYoUChBKT9ZPUE6QS5ub2RlVHlwZT09PTkmJihZPUEuZGVmYXVsdFZpZXcpLE49PT12b2lkIDApcmV0dXJuIFk/WVtkXTpBW0ldO1k/WS5zY3JvbGxUbyh2P1kucGFnZVhPZmZzZXQ6Tix2P046WS5wYWdlWU9mZnNldCk6QVtJXT1OfSxhLHgsYXJndW1lbnRzLmxlbmd0aCl9fSksZi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsZCl7Zi5jc3NIb29rc1tkXT1jYSh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24odix4KXtpZih4KXJldHVybiB4PVVuKHYsZCksJHIudGVzdCh4KT9mKHYpLnBvc2l0aW9uKClbZF0rInB4Ijp4fSl9KSxmLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGQpe2YuZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpkLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24odix4KXtmLmZuW3hdPWZ1bmN0aW9uKEEsSSl7dmFyIE49YXJndW1lbnRzLmxlbmd0aCYmKHZ8fHR5cGVvZiBBIT0iYm9vbGVhbiIpLFk9dnx8KEE9PT0hMHx8ST09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gSyh0aGlzLGZ1bmN0aW9uKFcsSixkdCl7dmFyIGZ0O3JldHVybiBQKFcpP3guaW5kZXhPZigib3V0ZXIiKT09PTA/V1siaW5uZXIiK2FdOlcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOlcubm9kZVR5cGU9PT05PyhmdD1XLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChXLmJvZHlbInNjcm9sbCIrYV0sZnRbInNjcm9sbCIrYV0sVy5ib2R5WyJvZmZzZXQiK2FdLGZ0WyJvZmZzZXQiK2FdLGZ0WyJjbGllbnQiK2FdKSk6ZHQ9PT12b2lkIDA/Zi5jc3MoVyxKLFkpOmYuc3R5bGUoVyxKLGR0LFkpfSxkLE4/QTp2b2lkIDAsTil9fSl9KSxmLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGQpe2YuZm5bZF09ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMub24oZCx2KX19KSxmLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHRoaXMub24oYSxudWxsLGQsdil9LHVuYmluZDpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLm9mZihhLG51bGwsZCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsZCx2LHgpe3JldHVybiB0aGlzLm9uKGQsYSx2LHgpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihkLGF8fCIqKiIsdil9LGhvdmVyOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIHRoaXMub24oIm1vdXNlZW50ZXIiLGEpLm9uKCJtb3VzZWxlYXZlIixkfHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxkKXtmLmZuW2RdPWZ1bmN0aW9uKHYseCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGQsbnVsbCx2LHgpOnRoaXMudHJpZ2dlcihkKX19KTt2YXIgUm89L15bXHNcdUZFRkZceEEwXSt8KFteXHNcdUZFRkZceEEwXSlbXHNcdUZFRkZceEEwXSskL2c7Zi5wcm94eT1mdW5jdGlvbihhLGQpe3ZhciB2LHgsQTtpZih0eXBlb2YgZD09InN0cmluZyImJih2PWFbZF0sZD1hLGE9diksISFUKGEpKXJldHVybiB4PXMuY2FsbChhcmd1bWVudHMsMiksQT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGR8fHRoaXMseC5jb25jYXQocy5jYWxsKGFyZ3VtZW50cykpKX0sQS5ndWlkPWEuZ3VpZD1hLmd1aWR8fGYuZ3VpZCsrLEF9LGYuaG9sZFJlYWR5PWZ1bmN0aW9uKGEpe2E/Zi5yZWFkeVdhaXQrKzpmLnJlYWR5KCEwKX0sZi5pc0FycmF5PUFycmF5LmlzQXJyYXksZi5wYXJzZUpTT049SlNPTi5wYXJzZSxmLm5vZGVOYW1lPVgsZi5pc0Z1bmN0aW9uPVQsZi5pc1dpbmRvdz1QLGYuY2FtZWxDYXNlPWd0LGYudHlwZT1fLGYubm93PURhdGUubm93LGYuaXNOdW1lcmljPWZ1bmN0aW9uKGEpe3ZhciBkPWYudHlwZShhKTtyZXR1cm4oZD09PSJudW1iZXIifHxkPT09InN0cmluZyIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0sZi50cmltPWZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKFJvLCIkMSIpfSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZn0pO3ZhciBMbz10LmpRdWVyeSx6bz10LiQ7cmV0dXJuIGYubm9Db25mbGljdD1mdW5jdGlvbihhKXtyZXR1cm4gdC4kPT09ZiYmKHQuJD16byksYSYmdC5qUXVlcnk9PT1mJiYodC5qUXVlcnk9TG8pLGZ9LHR5cGVvZiBlPiJ1IiYmKHQualF1ZXJ5PXQuJD1mKSxmfSl9KTt2YXIgcm89aWUoUmEoKSksdWQ9aWUoYWUoKSk7dmFyIFVsPWllKGFlKCksMSk7dmFyIEthPWllKGFlKCksMSk7dmFyIEg9S2EuZGVmYXVsdCxidD1mdW5jdGlvbih0LGUpe2lmKGJ0LmZhY3RvcnkodCxlKSlyZXR1cm4gYnQ7aWYodGhpcyBpbnN0YW5jZW9mIGJ0KXJldHVybiBIKHQpLkRhdGFUYWJsZShlKTtlPXQ7dmFyIG49dGhpcyxyPWU9PT12b2lkIDAscz10aGlzLmxlbmd0aDtyZXR1cm4gciYmKGU9e30pLHRoaXMuYXBpPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXdCh0aGlzKX0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9e30sbz1zPjE/cWEoaSxlLCEwKTplLHU9MCxwLGI9dGhpcy5nZXRBdHRyaWJ1dGUoImlkIiksZz1idC5kZWZhdWx0cyxtPUgodGhpcyk7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0idGFibGUiKXtPZShudWxsLDAsIk5vbi10YWJsZSBub2RlIGluaXRpYWxpc2F0aW9uICgiK3RoaXMubm9kZU5hbWUrIikiLDIpO3JldHVybn1IKHRoaXMpLnRyaWdnZXIoIm9wdGlvbnMuZHQiLG8pLGphKGcpLGVzKGcuY29sdW1uKSxzbihnLGcsITApLHNuKGcuY29sdW1uLGcuY29sdW1uLCEwKSxzbihnLEguZXh0ZW5kKG8sbS5kYXRhKCkpLCEwKTt2YXIgQz1idC5zZXR0aW5ncztmb3IodT0wLHA9Qy5sZW5ndGg7dTxwO3UrKyl7dmFyIHk9Q1t1XTtpZih5Lm5UYWJsZT09dGhpc3x8eS5uVEhlYWQmJnkublRIZWFkLnBhcmVudE5vZGU9PXRoaXN8fHkublRGb290JiZ5Lm5URm9vdC5wYXJlbnROb2RlPT10aGlzKXt2YXIgVD1vLmJSZXRyaWV2ZSE9PXZvaWQgMD9vLmJSZXRyaWV2ZTpnLmJSZXRyaWV2ZSxQPW8uYkRlc3Ryb3khPT12b2lkIDA/by5iRGVzdHJveTpnLmJEZXN0cm95O2lmKHJ8fFQpcmV0dXJuIHkub0luc3RhbmNlO2lmKFApe25ldyBidC5BcGkoeSkuZGVzdHJveSgpO2JyZWFrfWVsc2V7T2UoeSwwLCJDYW5ub3QgcmVpbml0aWFsaXNlIERhdGFUYWJsZSIsMyk7cmV0dXJufX1pZih5LnNUYWJsZUlkPT10aGlzLmlkKXtDLnNwbGljZSh1LDEpO2JyZWFrfX0oYj09PW51bGx8fGI9PT0iIikmJihiPSJEYXRhVGFibGVzX1RhYmxlXyIrYnQuZXh0Ll91bmlxdWUrKyx0aGlzLmlkPWIpO3ZhciBjPUguZXh0ZW5kKCEwLHt9LGJ0Lm1vZGVscy5vU2V0dGluZ3Mse3NEZXN0cm95V2lkdGg6bVswXS5zdHlsZS53aWR0aCxzSW5zdGFuY2U6YixzVGFibGVJZDpiLGNvbGdyb3VwOkgoIjxjb2xncm91cD4iKS5wcmVwZW5kVG8odGhpcyksZmFzdERhdGE6ZnVuY3Rpb24oQixMLFIpe3JldHVybiBSZShjLEIsTCxSKX19KTtjLm5UYWJsZT10aGlzLGMub0luaXQ9byxDLnB1c2goYyksYy5hcGk9bmV3IFd0KGMpLGMub0luc3RhbmNlPW4ubGVuZ3RoPT09MT9uOm0uZGF0YVRhYmxlKCksamEobyksby5hTGVuZ3RoTWVudSYmIW8uaURpc3BsYXlMZW5ndGgmJihvLmlEaXNwbGF5TGVuZ3RoPUFycmF5LmlzQXJyYXkoby5hTGVuZ3RoTWVudVswXSk/by5hTGVuZ3RoTWVudVswXVswXTpILmlzUGxhaW5PYmplY3Qoby5hTGVuZ3RoTWVudVswXSk/by5hTGVuZ3RoTWVudVswXS52YWx1ZTpvLmFMZW5ndGhNZW51WzBdKSxvPXFhKEguZXh0ZW5kKCEwLHt9LGcpLG8pLGxuKGMub0ZlYXR1cmVzLG8sWyJiUGFnaW5hdGUiLCJiTGVuZ3RoQ2hhbmdlIiwiYkZpbHRlciIsImJTb3J0IiwiYlNvcnRNdWx0aSIsImJJbmZvIiwiYlByb2Nlc3NpbmciLCJiQXV0b1dpZHRoIiwiYlNvcnRDbGFzc2VzIiwiYlNlcnZlclNpZGUiLCJiRGVmZXJSZW5kZXIiXSksbG4oYyxvLFsiYWpheCIsImZuRm9ybWF0TnVtYmVyIiwic1NlcnZlck1ldGhvZCIsImFhU29ydGluZyIsImFhU29ydGluZ0ZpeGVkIiwiYUxlbmd0aE1lbnUiLCJzUGFnaW5hdGlvblR5cGUiLCJpU3RhdGVEdXJhdGlvbiIsImJTb3J0Q2VsbHNUb3AiLCJpVGFiSW5kZXgiLCJzRG9tIiwiZm5TdGF0ZUxvYWRDYWxsYmFjayIsImZuU3RhdGVTYXZlQ2FsbGJhY2siLCJyZW5kZXJlciIsInNlYXJjaERlbGF5Iiwicm93SWQiLCJjYXB0aW9uIiwibGF5b3V0Iiwib3JkZXJEZXNjUmV2ZXJzZSIsInR5cGVEZXRlY3QiLFsiaUNvb2tpZUR1cmF0aW9uIiwiaVN0YXRlRHVyYXRpb24iXSxbIm9TZWFyY2giLCJvUHJldmlvdXNTZWFyY2giXSxbImFvU2VhcmNoQ29scyIsImFvUHJlU2VhcmNoQ29scyJdLFsiaURpc3BsYXlMZW5ndGgiLCJfaURpc3BsYXlMZW5ndGgiXV0pLGxuKGMub1Njcm9sbCxvLFtbInNTY3JvbGxYIiwic1giXSxbInNTY3JvbGxYSW5uZXIiLCJzWElubmVyIl0sWyJzU2Nyb2xsWSIsInNZIl0sWyJiU2Nyb2xsQ29sbGFwc2UiLCJiQ29sbGFwc2UiXV0pLGxuKGMub0xhbmd1YWdlLG8sImZuSW5mb0NhbGxiYWNrIiksQmUoYywiYW9EcmF3Q2FsbGJhY2siLG8uZm5EcmF3Q2FsbGJhY2spLEJlKGMsImFvU3RhdGVTYXZlUGFyYW1zIixvLmZuU3RhdGVTYXZlUGFyYW1zKSxCZShjLCJhb1N0YXRlTG9hZFBhcmFtcyIsby5mblN0YXRlTG9hZFBhcmFtcyksQmUoYywiYW9TdGF0ZUxvYWRlZCIsby5mblN0YXRlTG9hZGVkKSxCZShjLCJhb1Jvd0NhbGxiYWNrIixvLmZuUm93Q2FsbGJhY2spLEJlKGMsImFvUm93Q3JlYXRlZENhbGxiYWNrIixvLmZuQ3JlYXRlZFJvdyksQmUoYywiYW9IZWFkZXJDYWxsYmFjayIsby5mbkhlYWRlckNhbGxiYWNrKSxCZShjLCJhb0Zvb3RlckNhbGxiYWNrIixvLmZuRm9vdGVyQ2FsbGJhY2spLEJlKGMsImFvSW5pdENvbXBsZXRlIixvLmZuSW5pdENvbXBsZXRlKSxCZShjLCJhb1ByZURyYXdDYWxsYmFjayIsby5mblByZURyYXdDYWxsYmFjayksYy5yb3dJZEZuPUVuKG8ucm93SWQpLHJsKGMpO3ZhciBsPWMub0NsYXNzZXM7SC5leHRlbmQobCxidC5leHQuY2xhc3NlcyxvLm9DbGFzc2VzKSxtLmFkZENsYXNzKGwudGFibGUpLGMub0ZlYXR1cmVzLmJQYWdpbmF0ZXx8KG8uaURpc3BsYXlTdGFydD0wKSxjLmlJbml0RGlzcGxheVN0YXJ0PT09dm9pZCAwJiYoYy5pSW5pdERpc3BsYXlTdGFydD1vLmlEaXNwbGF5U3RhcnQsYy5faURpc3BsYXlTdGFydD1vLmlEaXNwbGF5U3RhcnQpO3ZhciBoPW8uaURlZmVyTG9hZGluZztpZihoIT09bnVsbCl7Yy5kZWZlckxvYWRpbmc9ITA7dmFyIF89QXJyYXkuaXNBcnJheShoKTtjLl9pUmVjb3Jkc0Rpc3BsYXk9Xz9oWzBdOmgsYy5faVJlY29yZHNUb3RhbD1fP2hbMV06aH12YXIgRj1bXSxPPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoZWFkIiksZj1scyhjLE9bMF0pO2lmKG8uYW9Db2x1bW5zKUY9by5hb0NvbHVtbnM7ZWxzZSBpZihmLmxlbmd0aClmb3IodT0wLHA9ZlswXS5sZW5ndGg7dTxwO3UrKylGLnB1c2gobnVsbCk7Zm9yKHU9MCxwPUYubGVuZ3RoO3U8cDt1KyspbnMoYyk7c2woYyxvLmFvQ29sdW1uRGVmcyxGLGYsZnVuY3Rpb24oQixMKXt4aShjLEIsTCl9KTt2YXIgVT1tLmNoaWxkcmVuKCJ0Ym9keSIpLmZpbmQoInRyIikuZXEoMCk7aWYoVS5sZW5ndGgpe3ZhciBYPWZ1bmN0aW9uKEIsTCl7cmV0dXJuIEIuZ2V0QXR0cmlidXRlKCJkYXRhLSIrTCkhPT1udWxsP0w6bnVsbH07SChVWzBdKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbihCLEwpe3ZhciBSPWMuYW9Db2x1bW5zW0JdO2lmKFJ8fE9lKGMsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLFIubURhdGE9PT1CKXt2YXIgcT1YKEwsInNvcnQiKXx8WChMLCJvcmRlciIpLHo9WChMLCJmaWx0ZXIiKXx8WChMLCJzZWFyY2giKTsocSE9PW51bGx8fHohPT1udWxsKSYmKFIubURhdGE9e186QisiLmRpc3BsYXkiLHNvcnQ6cSE9PW51bGw/QisiLkBkYXRhLSIrcTp2b2lkIDAsdHlwZTpxIT09bnVsbD9CKyIuQGRhdGEtIitxOnZvaWQgMCxmaWx0ZXI6eiE9PW51bGw/QisiLkBkYXRhLSIrejp2b2lkIDB9LFIuX2lzQXJyYXlIb3N0PSEwLHhpKGMsQikpfX0pfUJlKGMsImFvRHJhd0NhbGxiYWNrIixqcik7dmFyIFE9Yy5vRmVhdHVyZXM7aWYoby5iU3RhdGVTYXZlJiYoUS5iU3RhdGVTYXZlPSEwKSxvLmFhU29ydGluZz09PXZvaWQgMCl7dmFyIEU9Yy5hYVNvcnRpbmc7Zm9yKHU9MCxwPUUubGVuZ3RoO3U8cDt1KyspRVt1XVsxXT1jLmFvQ29sdW1uc1t1XS5hc1NvcnRpbmdbMF19VGkoYyksQmUoYywiYW9EcmF3Q2FsbGJhY2siLGZ1bmN0aW9uKCl7KGMuYlNvcnRlZHx8RWUoYyk9PT0ic3NwInx8US5iRGVmZXJSZW5kZXIpJiZUaShjKX0pO3ZhciAkPW0uY2hpbGRyZW4oImNhcHRpb24iKTtjLmNhcHRpb24mJigkLmxlbmd0aD09PTAmJigkPUgoIjxjYXB0aW9uLz4iKS5hcHBlbmRUbyhtKSksJC5odG1sKGMuY2FwdGlvbikpLCQubGVuZ3RoJiYoJFswXS5fY2FwdGlvblNpZGU9JC5jc3MoImNhcHRpb24tc2lkZSIpLGMuY2FwdGlvbk5vZGU9JFswXSksTy5sZW5ndGg9PT0wJiYoTz1IKCI8dGhlYWQvPiIpLmFwcGVuZFRvKG0pKSxjLm5USGVhZD1PWzBdLEgoInRyIixPKS5hZGRDbGFzcyhsLnRoZWFkLnJvdyk7dmFyIHc9bS5jaGlsZHJlbigidGJvZHkiKTt3Lmxlbmd0aD09PTAmJih3PUgoIjx0Ym9keS8+IikuaW5zZXJ0QWZ0ZXIoTykpLGMublRCb2R5PXdbMF07dmFyIGs9bS5jaGlsZHJlbigidGZvb3QiKTtrLmxlbmd0aD09PTAmJihrPUgoIjx0Zm9vdC8+IikuYXBwZW5kVG8obSkpLGMublRGb290PWtbMF0sSCgidHIiLGspLmFkZENsYXNzKGwudGZvb3Qucm93KSxjLmFpRGlzcGxheT1jLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLGMuYkluaXRpYWxpc2VkPSEwO3ZhciBTPWMub0xhbmd1YWdlO0guZXh0ZW5kKCEwLFMsby5vTGFuZ3VhZ2UpLFMuc1VybD9ILmFqYXgoe2RhdGFUeXBlOiJqc29uIix1cmw6Uy5zVXJsLHN1Y2Nlc3M6ZnVuY3Rpb24oQil7c24oZy5vTGFuZ3VhZ2UsQiksSC5leHRlbmQoITAsUyxCLGMub0luaXQub0xhbmd1YWdlKSxadChjLG51bGwsImkxOG4iLFtjXSwhMCksa3IoYyl9LGVycm9yOmZ1bmN0aW9uKCl7T2UoYywwLCJpMThuIGZpbGUgbG9hZGluZyBlcnJvciIsMjEpLGtyKGMpfX0pOihadChjLG51bGwsImkxOG4iLFtjXSwhMCksa3IoYykpfSksbj1udWxsLHRoaXN9O2J0LmV4dD1sZT17YnV0dG9uczp7fSxjbGFzc2VzOnt9LGJ1aWxkZXI6Ii1zb3VyY2UtIixlcnJNb2RlOiJhbGVydCIsZmVhdHVyZTpbXSxmZWF0dXJlczp7fSxzZWFyY2g6W10sc2VsZWN0b3I6e2NlbGw6W10sY29sdW1uOltdLHJvdzpbXX0sbGVnYWN5OnthamF4Om51bGx9LHBhZ2VyOnt9LHJlbmRlcmVyOntwYWdlQnV0dG9uOnt9LGhlYWRlcjp7fX0sb3JkZXI6e30sdHlwZTp7Y2xhc3NOYW1lOnt9LGRldGVjdDpbXSxyZW5kZXI6e30sc2VhcmNoOnt9LG9yZGVyOnt9fSxfdW5pcXVlOjAsZm5WZXJzaW9uQ2hlY2s6YnQuZm5WZXJzaW9uQ2hlY2ssaUFwaUluZGV4OjAsc1ZlcnNpb246YnQudmVyc2lvbn07SC5leHRlbmQobGUse2FmbkZpbHRlcmluZzpsZS5zZWFyY2gsYVR5cGVzOmxlLnR5cGUuZGV0ZWN0LG9mblNlYXJjaDpsZS50eXBlLnNlYXJjaCxvU29ydDpsZS50eXBlLm9yZGVyLGFmblNvcnREYXRhOmxlLm9yZGVyLGFvRmVhdHVyZXM6bGUuZmVhdHVyZSxvU3RkQ2xhc3NlczpsZS5jbGFzc2VzLG9QYWdpbmF0aW9uOmxlLnBhZ2VyfSk7SC5leHRlbmQoYnQuZXh0LmNsYXNzZXMse2NvbnRhaW5lcjoiZHQtY29udGFpbmVyIixlbXB0eTp7cm93OiJkdC1lbXB0eSJ9LGluZm86e2NvbnRhaW5lcjoiZHQtaW5mbyJ9LGxheW91dDp7cm93OiJkdC1sYXlvdXQtcm93IixjZWxsOiJkdC1sYXlvdXQtY2VsbCIsdGFibGVSb3c6ImR0LWxheW91dC10YWJsZSIsdGFibGVDZWxsOiIiLHN0YXJ0OiJkdC1sYXlvdXQtc3RhcnQiLGVuZDoiZHQtbGF5b3V0LWVuZCIsZnVsbDoiZHQtbGF5b3V0LWZ1bGwifSxsZW5ndGg6e2NvbnRhaW5lcjoiZHQtbGVuZ3RoIixzZWxlY3Q6ImR0LWlucHV0In0sb3JkZXI6e2NhbkFzYzoiZHQtb3JkZXJhYmxlLWFzYyIsY2FuRGVzYzoiZHQtb3JkZXJhYmxlLWRlc2MiLGlzQXNjOiJkdC1vcmRlcmluZy1hc2MiLGlzRGVzYzoiZHQtb3JkZXJpbmctZGVzYyIsbm9uZToiZHQtb3JkZXJhYmxlLW5vbmUiLHBvc2l0aW9uOiJzb3J0aW5nXyJ9LHByb2Nlc3Npbmc6e2NvbnRhaW5lcjoiZHQtcHJvY2Vzc2luZyJ9LHNjcm9sbGluZzp7Ym9keToiZHQtc2Nyb2xsLWJvZHkiLGNvbnRhaW5lcjoiZHQtc2Nyb2xsIixmb290ZXI6e3NlbGY6ImR0LXNjcm9sbC1mb290Iixpbm5lcjoiZHQtc2Nyb2xsLWZvb3RJbm5lciJ9LGhlYWRlcjp7c2VsZjoiZHQtc2Nyb2xsLWhlYWQiLGlubmVyOiJkdC1zY3JvbGwtaGVhZElubmVyIn19LHNlYXJjaDp7Y29udGFpbmVyOiJkdC1zZWFyY2giLGlucHV0OiJkdC1pbnB1dCJ9LHRhYmxlOiJkYXRhVGFibGUiLHRib2R5OntjZWxsOiIiLHJvdzoiIn0sdGhlYWQ6e2NlbGw6IiIscm93OiIifSx0Zm9vdDp7Y2VsbDoiIixyb3c6IiJ9LHBhZ2luZzp7YWN0aXZlOiJjdXJyZW50IixidXR0b246ImR0LXBhZ2luZy1idXR0b24iLGNvbnRhaW5lcjoiZHQtcGFnaW5nIixkaXNhYmxlZDoiZGlzYWJsZWQiLG5hdjoiIn19KTt2YXIgbGUsV3QsSXQsUXQsYmk9e30sSm89L1tcclxuXHUyMDI4XS9nLFNpPS88KFtePl0qPikvZyxRbz1NYXRoLnBvdygyLDI4KSx6YT0vXlxkezIsNH1bLi8tXVxkezEsMn1bLi8tXVxkezEsMn0oW1QgXXsxfVxkezEsMn1bOi5dXGR7Mn0oWy46XVxkezJ9KT8pPyQvLHRsPW5ldyBSZWdFeHAoIihcXCIrWyIvIiwiLiIsIioiLCIrIiwiPyIsInwiLCIoIiwiKSIsIlsiLCJdIiwieyIsIn0iLCJcXCIsIiQiLCJeIiwiLSJdLmpvaW4oInxcXCIpKyIpIiwiZyIpLERpPS9bJ1x1MDBBMCwkwqPigqzCpSVcdTIwMDlcdTIwMkZcdTIwQkRcdTIwYTlcdTIwQkFyZmvJg86eXS9naSxIZT1mdW5jdGlvbih0KXtyZXR1cm4hdHx8dD09PSEwfHx0PT09Ii0ifSxKYT1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUludCh0LDEwKTtyZXR1cm4haXNOYU4oZSkmJmlzRmluaXRlKHQpP2U6bnVsbH0sUWE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYmlbZV18fChiaVtlXT1uZXcgUmVnRXhwKENpKGUpLCJnIikpLHR5cGVvZiB0PT0ic3RyaW5nIiYmZSE9PSIuIj90LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoYmlbZV0sIi4iKTp0fSxRbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgcz10eXBlb2YgdCxpPXM9PT0ic3RyaW5nIjtyZXR1cm4gcz09PSJudW1iZXIifHxzPT09ImJpZ2ludCJ8fHImJkhlKHQpPyEwOihlJiZpJiYodD1RYSh0LGUpKSxuJiZpJiYodD10LnJlcGxhY2UoRGksIiIpKSwhaXNOYU4ocGFyc2VGbG9hdCh0KSkmJmlzRmluaXRlKHQpKX0sZWw9ZnVuY3Rpb24odCl7cmV0dXJuIEhlKHQpfHx0eXBlb2YgdD09InN0cmluZyJ9LFNyPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHImJkhlKHQpKXJldHVybiEwO2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdC5tYXRjaCgvPChpbnB1dHxzZWxlY3QpL2kpKXJldHVybiBudWxsO3ZhciBzPWVsKHQpO3JldHVybiBzJiZRbihnbih0KSxlLG4scik/ITA6bnVsbH0sQ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVtdLHM9MCxpPXQubGVuZ3RoO2lmKG4hPT12b2lkIDApZm9yKDtzPGk7cysrKXRbc10mJnRbc11bZV0mJnIucHVzaCh0W3NdW2VdW25dKTtlbHNlIGZvcig7czxpO3MrKyl0W3NdJiZyLnB1c2godFtzXVtlXSk7cmV0dXJuIHJ9LGVyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPVtdLGk9MCxvPWUubGVuZ3RoO2lmKHIhPT12b2lkIDApZm9yKDtpPG87aSsrKXRbZVtpXV0mJnRbZVtpXV1bbl0mJnMucHVzaCh0W2VbaV1dW25dW3JdKTtlbHNlIGZvcig7aTxvO2krKyl0W2VbaV1dJiZzLnB1c2godFtlW2ldXVtuXSk7cmV0dXJuIHN9LGFuPWZ1bmN0aW9uKHQsZSl7dmFyIG49W10scjtlPT09dm9pZCAwPyhlPTAscj10KToocj1lLGU9dCk7Zm9yKHZhciBzPWU7czxyO3MrKyluLnB1c2gocyk7cmV0dXJuIG59LHRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXRbbl0mJmUucHVzaCh0W25dKTtyZXR1cm4gZX0sZ249ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtpZih0Lmxlbmd0aD5Rbyl0aHJvdyBuZXcgRXJyb3IoIkV4Y2VlZGVkIG1heCBzdHIgbGVuIik7dmFyIGU7dD10LnJlcGxhY2UoU2ksIiIpO2RvIGU9dCx0PXQucmVwbGFjZSgvPHNjcmlwdC9pLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIGV9LE5uPWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LmpvaW4oIiwiKSksdHlwZW9mIHQ9PSJzdHJpbmciP3QucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iik6dH0sRHI9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgdCE9InN0cmluZyIpcmV0dXJuIHQ7dmFyIG49dC5ub3JtYWxpemUoIk5GRCIpO3JldHVybiBuLmxlbmd0aCE9PXQubGVuZ3RoPyhlPT09ITA/dCsiICI6IiIpK24ucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csIiIpOm59LG5sPWZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPDIpcmV0dXJuITA7Zm9yKHZhciBlPXQuc2xpY2UoKS5zb3J0KCksbj1lWzBdLHI9MSxzPWUubGVuZ3RoO3I8cztyKyspe2lmKGVbcl09PT1uKXJldHVybiExO249ZVtyXX1yZXR1cm4hMH0seG49ZnVuY3Rpb24odCl7aWYoQXJyYXkuZnJvbSYmU2V0KXJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodCkpO2lmKG5sKHQpKXJldHVybiB0LnNsaWNlKCk7dmFyIGU9W10sbixyLHM9dC5sZW5ndGgsaSxvPTA7dDpmb3Iocj0wO3I8cztyKyspe2ZvcihuPXRbcl0saT0wO2k8bztpKyspaWYoZVtpXT09PW4pY29udGludWUgdDtlLnB1c2gobiksbysrfXJldHVybiBlfSxBaT1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspQWkodCxlW25dKTtlbHNlIHQucHVzaChlKTtyZXR1cm4gdH07ZnVuY3Rpb24gT24odCxlKXtlJiZlLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihuKXtuJiZ0LmNsYXNzTGlzdC5hZGQobil9KX1idC51dGlsPXtkaWFjcml0aWNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQ7aWYobiE9PSJmdW5jdGlvbiIpcmV0dXJuIERyKHQsZSk7RHI9dH0sZGVib3VuY2U6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLHM9YXJndW1lbnRzO2NsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmFwcGx5KHIscyl9LGV8fDI1MCl9fSx0aHJvdHRsZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUhPT12b2lkIDA/ZToyMDAscixzO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPXRoaXMsbz0rbmV3IERhdGUsdT1hcmd1bWVudHM7ciYmbzxyK24/KGNsZWFyVGltZW91dChzKSxzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyPXZvaWQgMCx0LmFwcGx5KGksdSl9LG4pKToocj1vLHQuYXBwbHkoaSx1KSl9fSxlc2NhcGVSZWdleDpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKHRsLCJcXCQxIil9LHNldDpmdW5jdGlvbih0KXtpZihILmlzUGxhaW5PYmplY3QodCkpcmV0dXJuIGJ0LnV0aWwuc2V0KHQuXyk7aWYodD09PW51bGwpcmV0dXJuIGZ1bmN0aW9uKCl7fTtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gZnVuY3Rpb24obixyLHMpe3Qobiwic2V0IixyLHMpfTtpZih0eXBlb2YgdD09InN0cmluZyImJih0LmluZGV4T2YoIi4iKSE9PS0xfHx0LmluZGV4T2YoIlsiKSE9PS0xfHx0LmluZGV4T2YoIigiKSE9PS0xKSl7dmFyIGU9ZnVuY3Rpb24obixyLHMpe2Zvcih2YXIgaT1WYShzKSxvLHU9aVtpLmxlbmd0aC0xXSxwLGIsZyxtLEM9MCx5PWkubGVuZ3RoLTE7Qzx5O0MrKyl7aWYoaVtDXT09PSJfX3Byb3RvX18ifHxpW0NdPT09ImNvbnN0cnVjdG9yIil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcHJvdG90eXBlIHZhbHVlcyIpO2lmKHA9aVtDXS5tYXRjaChLbiksYj1pW0NdLm1hdGNoKEZuKSxwKXtpZihpW0NdPWlbQ10ucmVwbGFjZShLbiwiIiksbltpW0NdXT1bXSxvPWkuc2xpY2UoKSxvLnNwbGljZSgwLEMrMSksbT1vLmpvaW4oIi4iKSxBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgVD0wLFA9ci5sZW5ndGg7VDxQO1QrKylnPXt9LGUoZyxyW1RdLG0pLG5baVtDXV0ucHVzaChnKTtlbHNlIG5baVtDXV09cjtyZXR1cm59ZWxzZSBiJiYoaVtDXT1pW0NdLnJlcGxhY2UoRm4sIiIpLG49bltpW0NdXShyKSk7KG5baVtDXV09PT1udWxsfHxuW2lbQ11dPT09dm9pZCAwKSYmKG5baVtDXV09e30pLG49bltpW0NdXX11Lm1hdGNoKEZuKT9uPW5bdS5yZXBsYWNlKEZuLCIiKV0ocik6blt1LnJlcGxhY2UoS24sIiIpXT1yfTtyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZShuLHIsdCl9fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKG4scil7blt0XT1yfX0sZ2V0OmZ1bmN0aW9uKHQpe2lmKEguaXNQbGFpbk9iamVjdCh0KSl7dmFyIGU9e307cmV0dXJuIEguZWFjaCh0LGZ1bmN0aW9uKHIscyl7cyYmKGVbcl09YnQudXRpbC5nZXQocykpfSksZnVuY3Rpb24ocixzLGksbyl7dmFyIHU9ZVtzXXx8ZS5fO3JldHVybiB1IT09dm9pZCAwP3UocixzLGksbyk6cn19ZWxzZXtpZih0PT09bnVsbClyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHJ9O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBmdW5jdGlvbihyLHMsaSxvKXtyZXR1cm4gdChyLHMsaSxvKX07aWYodHlwZW9mIHQ9PSJzdHJpbmciJiYodC5pbmRleE9mKCIuIikhPT0tMXx8dC5pbmRleE9mKCJbIikhPT0tMXx8dC5pbmRleE9mKCIoIikhPT0tMSkpe3ZhciBuPWZ1bmN0aW9uKHIscyxpKXt2YXIgbyx1LHAsYjtpZihpIT09IiIpZm9yKHZhciBnPVZhKGkpLG09MCxDPWcubGVuZ3RoO208QzttKyspe2lmKG89Z1ttXS5tYXRjaChLbiksdT1nW21dLm1hdGNoKEZuKSxvKXtpZihnW21dPWdbbV0ucmVwbGFjZShLbiwiIiksZ1ttXSE9PSIiJiYocj1yW2dbbV1dKSxwPVtdLGcuc3BsaWNlKDAsbSsxKSxiPWcuam9pbigiLiIpLEFycmF5LmlzQXJyYXkocikpZm9yKHZhciB5PTAsVD1yLmxlbmd0aDt5PFQ7eSsrKXAucHVzaChuKHJbeV0scyxiKSk7dmFyIFA9b1swXS5zdWJzdHJpbmcoMSxvWzBdLmxlbmd0aC0xKTtyPVA9PT0iIj9wOnAuam9pbihQKTticmVha31lbHNlIGlmKHUpe2dbbV09Z1ttXS5yZXBsYWNlKEZuLCIiKSxyPXJbZ1ttXV0oKTtjb250aW51ZX1pZihyPT09bnVsbHx8cltnW21dXT09PW51bGwpcmV0dXJuIG51bGw7aWYocj09PXZvaWQgMHx8cltnW21dXT09PXZvaWQgMClyZXR1cm47cj1yW2dbbV1dfXJldHVybiByfTtyZXR1cm4gZnVuY3Rpb24ocixzKXtyZXR1cm4gbihyLHMsdCl9fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiByW3RdfX19LHN0cmlwSHRtbDpmdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtpZihlPT09ImZ1bmN0aW9uIil7Z249dDtyZXR1cm59ZWxzZSBpZihlPT09InN0cmluZyIpcmV0dXJuIGduKHQpO3JldHVybiB0fSxlc2NhcGVIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O2lmKGU9PT0iZnVuY3Rpb24iKXtObj10O3JldHVybn1lbHNlIGlmKGU9PT0ic3RyaW5nInx8QXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gTm4odCk7cmV0dXJuIHR9LHVuaXF1ZTp4bn07ZnVuY3Rpb24gTnIodCl7dmFyIGU9ImEgYWEgYWkgYW8gYXMgYiBmbiBpIG0gbyBzICIsbixyLHM9e307SC5lYWNoKHQsZnVuY3Rpb24oaSl7bj1pLm1hdGNoKC9eKFteQS1aXSs/KShbQS1aXSkvKSxuJiZlLmluZGV4T2YoblsxXSsiICIpIT09LTEmJihyPWkucmVwbGFjZShuWzBdLG5bMl0udG9Mb3dlckNhc2UoKSksc1tyXT1pLG5bMV09PT0ibyImJk5yKHRbaV0pKX0pLHQuX2h1bmdhcmlhbk1hcD1zfWZ1bmN0aW9uIHNuKHQsZSxuKXt0Ll9odW5nYXJpYW5NYXB8fE5yKHQpO3ZhciByO0guZWFjaChlLGZ1bmN0aW9uKHMpe3I9dC5faHVuZ2FyaWFuTWFwW3NdLHIhPT12b2lkIDAmJihufHxlW3JdPT09dm9pZCAwKSYmKHIuY2hhckF0KDApPT09Im8iPyhlW3JdfHwoZVtyXT17fSksSC5leHRlbmQoITAsZVtyXSxlW3NdKSxzbih0W3JdLGVbcl0sbikpOmVbcl09ZVtzXSl9KX12YXIgX2U9ZnVuY3Rpb24odCxlLG4pe3RbZV0hPT12b2lkIDAmJih0W25dPXRbZV0pfTtmdW5jdGlvbiBqYSh0KXtfZSh0LCJvcmRlcmluZyIsImJTb3J0IiksX2UodCwib3JkZXJNdWx0aSIsImJTb3J0TXVsdGkiKSxfZSh0LCJvcmRlckNsYXNzZXMiLCJiU29ydENsYXNzZXMiKSxfZSh0LCJvcmRlckNlbGxzVG9wIiwiYlNvcnRDZWxsc1RvcCIpLF9lKHQsIm9yZGVyIiwiYWFTb3J0aW5nIiksX2UodCwib3JkZXJGaXhlZCIsImFhU29ydGluZ0ZpeGVkIiksX2UodCwicGFnaW5nIiwiYlBhZ2luYXRlIiksX2UodCwicGFnaW5nVHlwZSIsInNQYWdpbmF0aW9uVHlwZSIpLF9lKHQsInBhZ2VMZW5ndGgiLCJpRGlzcGxheUxlbmd0aCIpLF9lKHQsInNlYXJjaGluZyIsImJGaWx0ZXIiKSx0eXBlb2YgdC5zU2Nyb2xsWD09ImJvb2xlYW4iJiYodC5zU2Nyb2xsWD10LnNTY3JvbGxYPyIxMDAlIjoiIiksdHlwZW9mIHQuc2Nyb2xsWD09ImJvb2xlYW4iJiYodC5zY3JvbGxYPXQuc2Nyb2xsWD8iMTAwJSI6IiIpO3ZhciBlPXQuYW9TZWFyY2hDb2xzO2lmKGUpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0mJnNuKGJ0Lm1vZGVscy5vU2VhcmNoLGVbbl0pO3Quc2VydmVyU2lkZSYmIXQuc2VhcmNoRGVsYXkmJih0LnNlYXJjaERlbGF5PTQwMCl9ZnVuY3Rpb24gZXModCl7X2UodCwib3JkZXJhYmxlIiwiYlNvcnRhYmxlIiksX2UodCwib3JkZXJEYXRhIiwiYURhdGFTb3J0IiksX2UodCwib3JkZXJTZXF1ZW5jZSIsImFzU29ydGluZyIpLF9lKHQsIm9yZGVyRGF0YVR5cGUiLCJzb3J0RGF0YVR5cGUiKTt2YXIgZT10LmFEYXRhU29ydDt0eXBlb2YgZT09Im51bWJlciImJiFBcnJheS5pc0FycmF5KGUpJiYodC5hRGF0YVNvcnQ9W2VdKX1mdW5jdGlvbiBybCh0KXtpZighYnQuX19icm93c2VyKXt2YXIgZT17fTtidC5fX2Jyb3dzZXI9ZTt2YXIgbj1IKCI8ZGl2Lz4iKS5jc3Moe3Bvc2l0aW9uOiJmaXhlZCIsdG9wOjAsbGVmdDotMSp3aW5kb3cucGFnZVhPZmZzZXQsaGVpZ2h0OjEsd2lkdGg6MSxvdmVyZmxvdzoiaGlkZGVuIn0pLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjEsbGVmdDoxLHdpZHRoOjEwMCxvdmVyZmxvdzoic2Nyb2xsIn0pLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOiIxMDAlIixoZWlnaHQ6MTB9KSkpLmFwcGVuZFRvKCJib2R5Iikscj1uLmNoaWxkcmVuKCkscz1yLmNoaWxkcmVuKCk7ZS5iYXJXaWR0aD1yWzBdLm9mZnNldFdpZHRoLXJbMF0uY2xpZW50V2lkdGgsZS5iU2Nyb2xsYmFyTGVmdD1NYXRoLnJvdW5kKHMub2Zmc2V0KCkubGVmdCkhPT0xLG4ucmVtb3ZlKCl9SC5leHRlbmQodC5vQnJvd3NlcixidC5fX2Jyb3dzZXIpLHQub1Njcm9sbC5pQmFyV2lkdGg9YnQuX19icm93c2VyLmJhcldpZHRofWZ1bmN0aW9uIG5zKHQpe3ZhciBlPWJ0LmRlZmF1bHRzLmNvbHVtbixuPXQuYW9Db2x1bW5zLmxlbmd0aCxyPUguZXh0ZW5kKHt9LGJ0Lm1vZGVscy5vQ29sdW1uLGUse2FEYXRhU29ydDplLmFEYXRhU29ydD9lLmFEYXRhU29ydDpbbl0sbURhdGE6ZS5tRGF0YT9lLm1EYXRhOm4saWR4Om4sc2VhcmNoRml4ZWQ6e30sY29sRWw6SCgiPGNvbD4iKS5hdHRyKCJkYXRhLWR0LWNvbHVtbiIsbil9KTt0LmFvQ29sdW1ucy5wdXNoKHIpO3ZhciBzPXQuYW9QcmVTZWFyY2hDb2xzO3Nbbl09SC5leHRlbmQoe30sYnQubW9kZWxzLm9TZWFyY2gsc1tuXSl9ZnVuY3Rpb24geGkodCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zW2VdO2lmKG4hPW51bGwpe2VzKG4pLHNuKGJ0LmRlZmF1bHRzLmNvbHVtbixuLCEwKSxuLm1EYXRhUHJvcCE9PXZvaWQgMCYmIW4ubURhdGEmJihuLm1EYXRhPW4ubURhdGFQcm9wKSxuLnNUeXBlJiYoci5fc01hbnVhbFR5cGU9bi5zVHlwZSksbi5jbGFzc05hbWUmJiFuLnNDbGFzcyYmKG4uc0NsYXNzPW4uY2xhc3NOYW1lKTt2YXIgcz1yLnNDbGFzcztILmV4dGVuZChyLG4pLGxuKHIsbiwic1dpZHRoIiwic1dpZHRoT3JpZyIpLHMhPT1yLnNDbGFzcyYmKHIuc0NsYXNzPXMrIiAiK3Iuc0NsYXNzKSxuLmlEYXRhU29ydCE9PXZvaWQgMCYmKHIuYURhdGFTb3J0PVtuLmlEYXRhU29ydF0pLGxuKHIsbiwiYURhdGFTb3J0Iil9dmFyIGk9ci5tRGF0YSxvPUVuKGkpO2lmKHIubVJlbmRlciYmQXJyYXkuaXNBcnJheShyLm1SZW5kZXIpKXt2YXIgdT1yLm1SZW5kZXIuc2xpY2UoKSxwPXUuc2hpZnQoKTtyLm1SZW5kZXI9YnQucmVuZGVyW3BdLmFwcGx5KHdpbmRvdyx1KX1yLl9yZW5kZXI9ci5tUmVuZGVyP0VuKHIubVJlbmRlcik6bnVsbDt2YXIgYj1mdW5jdGlvbihnKXtyZXR1cm4gdHlwZW9mIGc9PSJzdHJpbmciJiZnLmluZGV4T2YoIkAiKSE9PS0xfTtyLl9iQXR0clNyYz1ILmlzUGxhaW5PYmplY3QoaSkmJihiKGkuc29ydCl8fGIoaS50eXBlKXx8YihpLmZpbHRlcikpLHIuX3NldHRlcj1udWxsLHIuZm5HZXREYXRhPWZ1bmN0aW9uKGcsbSxDKXt2YXIgeT1vKGcsbSx2b2lkIDAsQyk7cmV0dXJuIHIuX3JlbmRlciYmbT9yLl9yZW5kZXIoeSxtLGcsQyk6eX0sci5mblNldERhdGE9ZnVuY3Rpb24oZyxtLEMpe3JldHVybiB2bihpKShnLG0sQyl9LHR5cGVvZiBpIT0ibnVtYmVyIiYmIXIuX2lzQXJyYXlIb3N0JiYodC5fcm93UmVhZE9iamVjdD0hMCksdC5vRmVhdHVyZXMuYlNvcnR8fChyLmJTb3J0YWJsZT0hMSl9ZnVuY3Rpb24gT3IodCl7eGwodCksaWwodCk7dmFyIGU9dC5vU2Nyb2xsOyhlLnNZIT09IiJ8fGUuc1ghPT0iIikmJmZzKHQpLFp0KHQsbnVsbCwiY29sdW1uLXNpemluZyIsW3RdKX1mdW5jdGlvbiBpbCh0KXtmb3IodmFyIGU9dC5hb0NvbHVtbnMsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1ycyh0LFtuXSwhMSwhMSk7ZVtuXS5jb2xFbC5jc3MoIndpZHRoIixyKS5jc3MoIm1pbi13aWR0aCIscil9fWZ1bmN0aW9uIElpKHQsZSl7dmFyIG49UGkodCwiYlZpc2libGUiKTtyZXR1cm4gdHlwZW9mIG5bZV09PSJudW1iZXIiP25bZV06bnVsbH1mdW5jdGlvbiBucih0LGUpe3ZhciBuPVBpKHQsImJWaXNpYmxlIikscj1uLmluZGV4T2YoZSk7cmV0dXJuIHIhPT0tMT9yOm51bGx9ZnVuY3Rpb24gRXIodCl7dmFyIGU9dC5hb0hlYWRlcixuPXQuYW9Db2x1bW5zLHI9MDtpZihlLmxlbmd0aClmb3IodmFyIHM9MCxpPWVbMF0ubGVuZ3RoO3M8aTtzKyspbltzXS5iVmlzaWJsZSYmSChlWzBdW3NdLmNlbGwpLmNzcygiZGlzcGxheSIpIT09Im5vbmUiJiZyKys7cmV0dXJuIHJ9ZnVuY3Rpb24gUGkodCxlKXt2YXIgbj1bXTtyZXR1cm4gdC5hb0NvbHVtbnMubWFwKGZ1bmN0aW9uKHIscyl7cltlXSYmbi5wdXNoKHMpfSksbn1mdW5jdGlvbiBtaSh0LGUpe3JldHVybiBlPT09ITA/dC5uYW1lOmV9ZnVuY3Rpb24gRmkodCl7dmFyIGU9dC5hb0NvbHVtbnMsbj10LmFvRGF0YSxyPWJ0LmV4dC50eXBlLmRldGVjdCxzLGksbyx1LHAsYixnLG0sQztmb3Iocz0wLGk9ZS5sZW5ndGg7czxpO3MrKyl7aWYoZz1lW3NdLEM9W10sIWcuc1R5cGUmJmcuX3NNYW51YWxUeXBlKWcuc1R5cGU9Zy5fc01hbnVhbFR5cGU7ZWxzZSBpZighZy5zVHlwZSl7aWYoIXQudHlwZURldGVjdClyZXR1cm47Zm9yKG89MCx1PXIubGVuZ3RoO288dTtvKyspe3ZhciB5PXJbb10sVD15Lm9uZU9mLFA9eS5hbGxPZnx8eSxjPXkuaW5pdCxsPSExO2lmKG09bnVsbCxjJiYobT1taSh5LGModCxnLHMpKSxtKSl7Zy5zVHlwZT1tO2JyZWFrfWZvcihwPTAsYj1uLmxlbmd0aDtwPGImJiEobltwXSYmKENbcF09PT12b2lkIDAmJihDW3BdPVJlKHQscCxzLCJ0eXBlIikpLFQmJiFsJiYobD1taSh5LFQoQ1twXSx0KSkpLG09bWkoeSxQKENbcF0sdCkpLCFtJiZvIT09ci5sZW5ndGgtM3x8bT09PSJodG1sIiYmIUhlKENbcF0pKSk7cCsrKTtpZihUJiZsJiZtfHwhVCYmbSl7Zy5zVHlwZT1tO2JyZWFrfX1nLnNUeXBlfHwoZy5zVHlwZT0ic3RyaW5nIil9dmFyIGg9bGUudHlwZS5jbGFzc05hbWVbZy5zVHlwZV07aCYmKE1hKHQuYW9IZWFkZXIscyxoKSxNYSh0LmFvRm9vdGVyLHMsaCkpO3ZhciBfPWxlLnR5cGUucmVuZGVyW2cuc1R5cGVdO18mJiFnLl9yZW5kZXImJihnLl9yZW5kZXI9YnQudXRpbC5nZXQoXyksYWwodCxzKSl9fWZ1bmN0aW9uIGFsKHQsZSl7Zm9yKHZhciBuPXQuYW9EYXRhLHI9MDtyPG4ubGVuZ3RoO3IrKylpZihuW3JdLm5Ucil7dmFyIHM9UmUodCxyLGUsImRpc3BsYXkiKTtuW3JdLmRpc3BsYXlEYXRhW2VdPXMsQXIobltyXS5hbkNlbGxzW2VdLHMpfX1mdW5jdGlvbiBNYSh0LGUsbil7dC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbZV0mJnJbZV0udW5pcXVlJiZPbihyW2VdLmNlbGwsbil9KX1mdW5jdGlvbiBzbCh0LGUsbixyLHMpe3ZhciBpLG8sdSxwLGIsZyxtLEM9dC5hb0NvbHVtbnM7aWYobilmb3IoaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldJiZuW2ldLm5hbWUmJihDW2ldLnNOYW1lPW5baV0ubmFtZSk7aWYoZSlmb3IoaT1lLmxlbmd0aC0xO2k+PTA7aS0tKXttPWVbaV07dmFyIHk9bS50YXJnZXQhPT12b2lkIDA/bS50YXJnZXQ6bS50YXJnZXRzIT09dm9pZCAwP20udGFyZ2V0czptLmFUYXJnZXRzO2ZvcihBcnJheS5pc0FycmF5KHkpfHwoeT1beV0pLHU9MCxwPXkubGVuZ3RoO3U8cDt1Kyspe3ZhciBUPXlbdV07aWYodHlwZW9mIFQ9PSJudW1iZXIiJiZUPj0wKXtmb3IoO0MubGVuZ3RoPD1UOylucyh0KTtzKFQsbSl9ZWxzZSBpZih0eXBlb2YgVD09Im51bWJlciImJlQ8MClzKEMubGVuZ3RoK1QsbSk7ZWxzZSBpZih0eXBlb2YgVD09InN0cmluZyIpZm9yKGI9MCxnPUMubGVuZ3RoO2I8ZztiKyspVD09PSJfYWxsIj9zKGIsbSk6VC5pbmRleE9mKCI6bmFtZSIpIT09LTE/Q1tiXS5zTmFtZT09PVQucmVwbGFjZSgiOm5hbWUiLCIiKSYmcyhiLG0pOnIuZm9yRWFjaChmdW5jdGlvbihQKXtpZihQW2JdKXt2YXIgYz1IKFBbYl0uY2VsbCk7VC5tYXRjaCgvXlthLXpdW1x3LV0qJC9pKSYmKFQ9Ii4iK1QpLGMuaXMoVCkmJnMoYixtKX19KX19aWYobilmb3IoaT0wLG89bi5sZW5ndGg7aTxvO2krKylzKGksbltpXSl9ZnVuY3Rpb24gcnModCxlLG4scil7QXJyYXkuaXNBcnJheShlKXx8KGU9QmkoZSkpO2Zvcih2YXIgcz0wLGksbz10LmFvQ29sdW1ucyx1PTAscD1lLmxlbmd0aDt1PHA7dSsrKXt2YXIgYj1vW2VbdV1dLGc9bj9iLnNXaWR0aE9yaWc6Yi5zV2lkdGg7aWYoISghciYmYi5iVmlzaWJsZT09PSExKSl7aWYoZz09bnVsbClyZXR1cm4gbnVsbDtpZih0eXBlb2YgZz09Im51bWJlciIpaT0icHgiLHMrPWc7ZWxzZXt2YXIgbT1nLm1hdGNoKC8oW1xkXC5dKykoW15cZF0qKS8pO20mJihzKz1tWzFdKjEsaT1tLmxlbmd0aD09PTM/bVsyXToicHgiKX19fXJldHVybiBzK2l9ZnVuY3Rpb24gQmkodCl7dmFyIGU9SCh0KS5jbG9zZXN0KCJbZGF0YS1kdC1jb2x1bW5dIikuYXR0cigiZGF0YS1kdC1jb2x1bW4iKTtyZXR1cm4gZT9lLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuKjF9KTpbXX1mdW5jdGlvbiB5bih0LGUsbixyKXt2YXIgcz10LmFvRGF0YS5sZW5ndGgsaT1ILmV4dGVuZCghMCx7fSxidC5tb2RlbHMub1Jvdyx7c3JjOm4/ImRvbSI6ImRhdGEiLGlkeDpzfSk7aS5fYURhdGE9ZSx0LmFvRGF0YS5wdXNoKGkpO2Zvcih2YXIgbz10LmFvQ29sdW1ucyx1PTAscD1vLmxlbmd0aDt1PHA7dSsrKW9bdV0uc1R5cGU9bnVsbDt0LmFpRGlzcGxheU1hc3Rlci5wdXNoKHMpO3ZhciBiPXQucm93SWRGbihlKTtyZXR1cm4gYiE9PXZvaWQgMCYmKHQuYUlkc1tiXT1pKSwobnx8IXQub0ZlYXR1cmVzLmJEZWZlclJlbmRlcikmJmFzKHQscyxuLHIpLHN9ZnVuY3Rpb24gTmkodCxlKXt2YXIgbjtyZXR1cm4gZSBpbnN0YW5jZW9mIEh8fChlPUgoZSkpLGUubWFwKGZ1bmN0aW9uKHIscyl7cmV0dXJuIG49aXModCxzKSx5bih0LG4uZGF0YSxzLG4uY2VsbHMpfSl9ZnVuY3Rpb24gUmUodCxlLG4scil7cj09PSJzZWFyY2giP3I9ImZpbHRlciI6cj09PSJvcmRlciImJihyPSJzb3J0Iik7dmFyIHM9dC5hb0RhdGFbZV07aWYocyl7dmFyIGk9dC5pRHJhdyxvPXQuYW9Db2x1bW5zW25dLHU9cy5fYURhdGEscD1vLnNEZWZhdWx0Q29udGVudCxiPW8uZm5HZXREYXRhKHUscix7c2V0dGluZ3M6dCxyb3c6ZSxjb2w6bn0pO2lmKHIhPT0iZGlzcGxheSImJmImJnR5cGVvZiBiPT0ib2JqZWN0IiYmYi5ub2RlTmFtZSYmKGI9Yi5pbm5lckhUTUwpLGI9PT12b2lkIDApcmV0dXJuIHQuaURyYXdFcnJvciE9aSYmcD09PW51bGwmJihPZSh0LDAsIlJlcXVlc3RlZCB1bmtub3duIHBhcmFtZXRlciAiKyh0eXBlb2Ygby5tRGF0YT09ImZ1bmN0aW9uIj8ie2Z1bmN0aW9ufSI6IiciK28ubURhdGErIiciKSsiIGZvciByb3cgIitlKyIsIGNvbHVtbiAiK24sNCksdC5pRHJhd0Vycm9yPWkpLHA7aWYoKGI9PT11fHxiPT09bnVsbCkmJnAhPT1udWxsJiZyIT09dm9pZCAwKWI9cDtlbHNlIGlmKHR5cGVvZiBiPT0iZnVuY3Rpb24iKXJldHVybiBiLmNhbGwodSk7aWYoYj09PW51bGwmJnI9PT0iZGlzcGxheSIpcmV0dXJuIiI7aWYocj09PSJmaWx0ZXIiKXt2YXIgZz1idC5leHQudHlwZS5zZWFyY2g7Z1tvLnNUeXBlXSYmKGI9Z1tvLnNUeXBlXShiKSl9cmV0dXJuIGJ9fWZ1bmN0aW9uIG9sKHQsZSxuLHIpe3ZhciBzPXQuYW9Db2x1bW5zW25dLGk9dC5hb0RhdGFbZV0uX2FEYXRhO3MuZm5TZXREYXRhKGkscix7c2V0dGluZ3M6dCxyb3c6ZSxjb2w6bn0pfWZ1bmN0aW9uIEFyKHQsZSl7ZSYmdHlwZW9mIGU9PSJvYmplY3QiJiZlLm5vZGVOYW1lP0godCkuZW1wdHkoKS5hcHBlbmQoZSk6dC5pbm5lckhUTUw9ZX12YXIgS249L1xbLio/XF0kLyxGbj0vXChcKSQvO2Z1bmN0aW9uIFZhKHQpe3ZhciBlPXQubWF0Y2goLyhcXC58W14uXSkrL2cpfHxbIiJdO3JldHVybiBlLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9cXFwuL2csIi4iKX0pfXZhciBFbj1idC51dGlsLmdldCx2bj1idC51dGlsLnNldDtmdW5jdGlvbiBIYSh0KXtyZXR1cm4gQ2UodC5hb0RhdGEsIl9hRGF0YSIpfWZ1bmN0aW9uIE9pKHQpe3QuYW9EYXRhLmxlbmd0aD0wLHQuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aD0wLHQuYWlEaXNwbGF5Lmxlbmd0aD0wLHQuYUlkcz17fX1mdW5jdGlvbiBScih0LGUsbixyKXt2YXIgcz10LmFvRGF0YVtlXSxpLG87aWYocy5fYVNvcnREYXRhPW51bGwscy5fYUZpbHRlckRhdGE9bnVsbCxzLmRpc3BsYXlEYXRhPW51bGwsbj09PSJkb20ifHwoIW58fG49PT0iYXV0byIpJiZzLnNyYz09PSJkb20iKXMuX2FEYXRhPWlzKHQscyxyLHI9PT12b2lkIDA/dm9pZCAwOnMuX2FEYXRhKS5kYXRhO2Vsc2V7dmFyIHU9cy5hbkNlbGxzLHA9RWkodCxlKTtpZih1KWlmKHIhPT12b2lkIDApQXIodVtyXSxwW3JdKTtlbHNlIGZvcihpPTAsbz11Lmxlbmd0aDtpPG87aSsrKUFyKHVbaV0scFtpXSl9dmFyIGI9dC5hb0NvbHVtbnM7aWYociE9PXZvaWQgMCliW3JdLnNUeXBlPW51bGwsYltyXS5tYXhMZW5TdHJpbmc9bnVsbDtlbHNle2ZvcihpPTAsbz1iLmxlbmd0aDtpPG87aSsrKWJbaV0uc1R5cGU9bnVsbCxiW2ldLm1heExlblN0cmluZz1udWxsO3NzKHQscyl9fWZ1bmN0aW9uIGlzKHQsZSxuLHIpe3ZhciBzPVtdLGk9ZS5maXJzdENoaWxkLG8sdSxwPTAsYixnPXQuYW9Db2x1bW5zLG09dC5fcm93UmVhZE9iamVjdDtyPXIhPT12b2lkIDA/cjptP3t9OltdO3ZhciBDPWZ1bmN0aW9uKGgsXyl7aWYodHlwZW9mIGg9PSJzdHJpbmciKXt2YXIgRj1oLmluZGV4T2YoIkAiKTtpZihGIT09LTEpe3ZhciBPPWguc3Vic3RyaW5nKEYrMSksZj12bihoKTtmKHIsXy5nZXRBdHRyaWJ1dGUoTykpfX19LHk9ZnVuY3Rpb24oaCl7aWYobj09PXZvaWQgMHx8bj09PXApaWYodT1nW3BdLGI9aC5pbm5lckhUTUwudHJpbSgpLHUmJnUuX2JBdHRyU3JjKXt2YXIgXz12bih1Lm1EYXRhLl8pO18ocixiKSxDKHUubURhdGEuc29ydCxoKSxDKHUubURhdGEudHlwZSxoKSxDKHUubURhdGEuZmlsdGVyLGgpfWVsc2UgbT8odS5fc2V0dGVyfHwodS5fc2V0dGVyPXZuKHUubURhdGEpKSx1Ll9zZXR0ZXIocixiKSk6cltwXT1iO3ArK307aWYoaSlmb3IoO2k7KW89aS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpLChvPT0iVEQifHxvPT0iVEgiKSYmKHkoaSkscy5wdXNoKGkpKSxpPWkubmV4dFNpYmxpbmc7ZWxzZXtzPWUuYW5DZWxscztmb3IodmFyIFQ9MCxQPXMubGVuZ3RoO1Q8UDtUKyspeShzW1RdKX12YXIgYz1lLmZpcnN0Q2hpbGQ/ZTplLm5UcjtpZihjKXt2YXIgbD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtsJiZ2bih0LnJvd0lkKShyLGwpfXJldHVybntkYXRhOnIsY2VsbHM6c319ZnVuY3Rpb24gRWkodCxlKXtsZXQgbj10LmFvRGF0YVtlXSxyPXQuYW9Db2x1bW5zO2lmKCFuLmRpc3BsYXlEYXRhKXtuLmRpc3BsYXlEYXRhPVtdO2Zvcih2YXIgcz0wLGk9ci5sZW5ndGg7czxpO3MrKyluLmRpc3BsYXlEYXRhLnB1c2goUmUodCxlLHMsImRpc3BsYXkiKSl9cmV0dXJuIG4uZGlzcGxheURhdGF9ZnVuY3Rpb24gYXModCxlLG4scil7dmFyIHM9dC5hb0RhdGFbZV0saT1zLl9hRGF0YSxvPVtdLHUscCxiLGcsbSxDLHk9dC5vQ2xhc3Nlcy50Ym9keS5yb3c7aWYocy5uVHI9PT1udWxsKXtmb3IodT1ufHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLHMublRyPXUscy5hbkNlbGxzPW8sT24odSx5KSx1Ll9EVF9Sb3dJbmRleD1lLHNzKHQscyksZz0wLG09dC5hb0NvbHVtbnMubGVuZ3RoO2c8bTtnKyspe2I9dC5hb0NvbHVtbnNbZ10sQz0hKG4mJnJbZ10pLHA9Qz9kb2N1bWVudC5jcmVhdGVFbGVtZW50KGIuc0NlbGxUeXBlKTpyW2ddLHB8fE9lKHQsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLHAuX0RUX0NlbGxJbmRleD17cm93OmUsY29sdW1uOmd9LG8ucHVzaChwKTt2YXIgVD1FaSh0LGUpOyhDfHwoYi5tUmVuZGVyfHxiLm1EYXRhIT09ZykmJighSC5pc1BsYWluT2JqZWN0KGIubURhdGEpfHxiLm1EYXRhLl8hPT1nKyIuZGlzcGxheSIpKSYmQXIocCxUW2ddKSxPbihwLGIuc0NsYXNzKSxiLmJWaXNpYmxlJiZDP3UuYXBwZW5kQ2hpbGQocCk6IWIuYlZpc2libGUmJiFDJiZwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocCksYi5mbkNyZWF0ZWRDZWxsJiZiLmZuQ3JlYXRlZENlbGwuY2FsbCh0Lm9JbnN0YW5jZSxwLFJlKHQsZSxnKSxpLGUsZyl9WnQodCwiYW9Sb3dDcmVhdGVkQ2FsbGJhY2siLCJyb3ctY3JlYXRlZCIsW3UsaSxlLG9dKX1lbHNlIE9uKHMublRyLHkpfWZ1bmN0aW9uIHNzKHQsZSl7dmFyIG49ZS5uVHIscj1lLl9hRGF0YTtpZihuKXt2YXIgcz10LnJvd0lkRm4ocik7aWYocyYmKG4uaWQ9cyksci5EVF9Sb3dDbGFzcyl7dmFyIGk9ci5EVF9Sb3dDbGFzcy5zcGxpdCgiICIpO2UuX19yb3djPWUuX19yb3djP3huKGUuX19yb3djLmNvbmNhdChpKSk6aSxIKG4pLnJlbW92ZUNsYXNzKGUuX19yb3djLmpvaW4oIiAiKSkuYWRkQ2xhc3Moci5EVF9Sb3dDbGFzcyl9ci5EVF9Sb3dBdHRyJiZIKG4pLmF0dHIoci5EVF9Sb3dBdHRyKSxyLkRUX1Jvd0RhdGEmJkgobikuZGF0YShyLkRUX1Jvd0RhdGEpfX1mdW5jdGlvbiBVYSh0LGUpe3ZhciBuPXQub0NsYXNzZXMscj10LmFvQ29sdW1ucyxzLGksbyx1PWU9PT0iaGVhZGVyIj90Lm5USGVhZDp0Lm5URm9vdCxwPWU9PT0iaGVhZGVyIj8ic1RpdGxlIjplO2lmKHUpe2lmKChlPT09ImhlYWRlciJ8fENlKHQuYW9Db2x1bW5zLHApLmpvaW4oIiIpKSYmKG89SCgidHIiLHUpLG8ubGVuZ3RofHwobz1IKCI8dHIvPiIpLmFwcGVuZFRvKHUpKSxvLmxlbmd0aD09PTEpKXt2YXIgYj1IKCJ0ZCwgdGgiLG8pO2ZvcihzPWIubGVuZ3RoLGk9ci5sZW5ndGg7czxpO3MrKylIKCI8dGgvPiIpLmh0bWwocltzXVtwXXx8IiIpLmFwcGVuZFRvKG8pfXZhciBnPWxzKHQsdSwhMCk7ZT09PSJoZWFkZXIiP3QuYW9IZWFkZXI9Zzp0LmFvRm9vdGVyPWcsSCh1KS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93IiksSCh1KS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbigpe0ZyKHQsZSkodCxIKHRoaXMpLG4pfSl9fWZ1bmN0aW9uIG9zKHQsZSxuKXt2YXIgcixzLGksbz1bXSx1PVtdLHA9dC5hb0NvbHVtbnMsYj1wLmxlbmd0aCxnLG07aWYoZSl7Zm9yKG58fChuPWFuKGIpLmZpbHRlcihmdW5jdGlvbihUKXtyZXR1cm4gcFtUXS5iVmlzaWJsZX0pKSxyPTA7cjxlLmxlbmd0aDtyKyspb1tyXT1lW3JdLnNsaWNlKCkuZmlsdGVyKGZ1bmN0aW9uKFQsUCl7cmV0dXJuIG4uaW5jbHVkZXMoUCl9KSx1LnB1c2goW10pO2ZvcihyPTA7cjxvLmxlbmd0aDtyKyspZm9yKHM9MDtzPG9bcl0ubGVuZ3RoO3MrKylpZihnPTEsbT0xLHVbcl1bc109PT12b2lkIDApe2ZvcihpPW9bcl1bc10uY2VsbDtvW3IrZ10hPT12b2lkIDAmJm9bcl1bc10uY2VsbD09b1tyK2ddW3NdLmNlbGw7KXVbcitnXVtzXT1udWxsLGcrKztmb3IoO29bcl1bcyttXSE9PXZvaWQgMCYmb1tyXVtzXS5jZWxsPT1vW3JdW3MrbV0uY2VsbDspe2Zvcih2YXIgQz0wO0M8ZztDKyspdVtyK0NdW3MrbV09bnVsbDttKyt9dmFyIHk9SCgic3Bhbi5kdC1jb2x1bW4tdGl0bGUiLGkpO3Vbcl1bc109e2NlbGw6aSxjb2xzcGFuOm0scm93c3BhbjpnLHRpdGxlOnkubGVuZ3RoP3kuaHRtbCgpOkgoaSkuaHRtbCgpfX1yZXR1cm4gdX19ZnVuY3Rpb24gSXIodCxlKXtmb3IodmFyIG49b3ModCxlKSxyLHMsaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZihyPWVbaV0ucm93LHIpZm9yKDtzPXIuZmlyc3RDaGlsZDspci5yZW1vdmVDaGlsZChzKTtmb3IodmFyIG89MDtvPG5baV0ubGVuZ3RoO28rKyl7dmFyIHU9bltpXVtvXTt1JiZIKHUuY2VsbCkuYXBwZW5kVG8ocikuYXR0cigicm93c3BhbiIsdS5yb3dzcGFuKS5hdHRyKCJjb2xzcGFuIix1LmNvbHNwYW4pfX19ZnVuY3Rpb24gTG4odCxlKXtmbCh0KTt2YXIgbj1adCh0LCJhb1ByZURyYXdDYWxsYmFjayIsInByZURyYXciLFt0XSk7aWYobi5pbmRleE9mKCExKSE9PS0xKXtrZSh0LCExKTtyZXR1cm59dmFyIHI9W10scz0wLGk9RWUodCk9PSJzc3AiLG89dC5haURpc3BsYXksdT10Ll9pRGlzcGxheVN0YXJ0LHA9dC5mbkRpc3BsYXlFbmQoKSxiPXQuYW9Db2x1bW5zLGc9SCh0Lm5UQm9keSk7aWYodC5iRHJhd2luZz0hMCx0LmRlZmVyTG9hZGluZyl0LmRlZmVyTG9hZGluZz0hMSx0LmlEcmF3Kyssa2UodCwhMSk7ZWxzZSBpZighaSl0LmlEcmF3Kys7ZWxzZSBpZighdC5iRGVzdHJveWluZyYmIWUpe3QuaURyYXc9PT0wJiZnLmVtcHR5KCkuYXBwZW5kKFdhKHQpKSxobCh0KTtyZXR1cm59aWYoby5sZW5ndGghPT0wKWZvcih2YXIgbT1pPzA6dSxDPWk/dC5hb0RhdGEubGVuZ3RoOnAseT1tO3k8Qzt5Kyspe3ZhciBUPW9beV0sUD10LmFvRGF0YVtUXTtQLm5Ucj09PW51bGwmJmFzKHQsVCk7Zm9yKHZhciBjPVAublRyLGw9MDtsPGIubGVuZ3RoO2wrKyl7dmFyIGg9YltsXSxfPVAuYW5DZWxsc1tsXTtPbihfLGxlLnR5cGUuY2xhc3NOYW1lW2guc1R5cGVdKSxPbihfLHQub0NsYXNzZXMudGJvZHkuY2VsbCl9WnQodCwiYW9Sb3dDYWxsYmFjayIsbnVsbCxbYyxQLl9hRGF0YSxzLHksVF0pLHIucHVzaChjKSxzKyt9ZWxzZSByWzBdPVdhKHQpO1p0KHQsImFvSGVhZGVyQ2FsbGJhY2siLCJoZWFkZXIiLFtIKHQublRIZWFkKS5jaGlsZHJlbigidHIiKVswXSxIYSh0KSx1LHAsb10pLFp0KHQsImFvRm9vdGVyQ2FsbGJhY2siLCJmb290ZXIiLFtIKHQublRGb290KS5jaGlsZHJlbigidHIiKVswXSxIYSh0KSx1LHAsb10pLGdbMF0ucmVwbGFjZUNoaWxkcmVuP2dbMF0ucmVwbGFjZUNoaWxkcmVuLmFwcGx5KGdbMF0scik6KGcuY2hpbGRyZW4oKS5kZXRhY2goKSxnLmFwcGVuZChIKHIpKSksSCh0Lm5UYWJsZVdyYXBwZXIpLnRvZ2dsZUNsYXNzKCJkdC1lbXB0eS1mb290ZXIiLEgoInRyIix0Lm5URm9vdCkubGVuZ3RoPT09MCksWnQodCwiYW9EcmF3Q2FsbGJhY2siLCJkcmF3IixbdF0sITApLHQuYlNvcnRlZD0hMSx0LmJGaWx0ZXJlZD0hMSx0LmJEcmF3aW5nPSExfWZ1bmN0aW9uIFJuKHQsZSxuKXt2YXIgcj10Lm9GZWF0dXJlcyxzPXIuYlNvcnQsaT1yLmJGaWx0ZXI7KG49PT12b2lkIDB8fG49PT0hMCkmJihGaSh0KSxzJiZ6aSh0KSxpP3RyKHQsdC5vUHJldmlvdXNTZWFyY2gpOnQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCkpLGUhPT0hMCYmKHQuX2lEaXNwbGF5U3RhcnQ9MCksdC5fZHJhd0hvbGQ9ZSxMbih0KSx0Ll9kcmF3SG9sZD0hMX1mdW5jdGlvbiBXYSh0KXt2YXIgZT10Lm9MYW5ndWFnZSxuPWUuc1plcm9SZWNvcmRzLHI9RWUodCk7cmV0dXJuIHQuaURyYXc8MSYmcj09PSJzc3AifHx0LmlEcmF3PD0xJiZyPT09ImFqYXgiP249ZS5zTG9hZGluZ1JlY29yZHM6ZS5zRW1wdHlUYWJsZSYmdC5mblJlY29yZHNUb3RhbCgpPT09MCYmKG49ZS5zRW1wdHlUYWJsZSksSCgiPHRyLz4iKS5hcHBlbmQoSCgiPHRkIC8+Iix7Y29sU3BhbjpFcih0KSxjbGFzczp0Lm9DbGFzc2VzLmVtcHR5LnJvd30pLmh0bWwobikpWzBdfWZ1bmN0aW9uIF9pKHQsZSxuKXtpZihBcnJheS5pc0FycmF5KG4pKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylfaSh0LGUsbltyXSk7cmV0dXJufXZhciBzPXRbZV07SC5pc1BsYWluT2JqZWN0KG4pP24uZmVhdHVyZXM/KG4ucm93SWQmJih0LmlkPW4ucm93SWQpLG4ucm93Q2xhc3MmJih0LmNsYXNzTmFtZT1uLnJvd0NsYXNzKSxzLmlkPW4uaWQscy5jbGFzc05hbWU9bi5jbGFzc05hbWUsX2kodCxlLG4uZmVhdHVyZXMpKTpPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24oaSl7cy5jb250ZW50cy5wdXNoKHtmZWF0dXJlOmksb3B0czpuW2ldfSl9KTpzLmNvbnRlbnRzLnB1c2gobil9ZnVuY3Rpb24gbGwodCxlLG4pe2Zvcih2YXIgcixzPTA7czx0Lmxlbmd0aDtzKyspaWYocj10W3NdLHIucm93TnVtPT09ZSYmKG49PT0iZnVsbCImJnIuZnVsbHx8KG49PT0ic3RhcnQifHxuPT09ImVuZCIpJiYoci5zdGFydHx8ci5lbmQpKSlyZXR1cm4gcltuXXx8KHJbbl09e2NvbnRlbnRzOltdfSkscjtyZXR1cm4gcj17cm93TnVtOmV9LHJbbl09e2NvbnRlbnRzOltdfSx0LnB1c2gocikscn1mdW5jdGlvbiBHYSh0LGUsbil7dmFyIHI9W107SC5lYWNoKGUsZnVuY3Rpb24oaSxvKXtpZihvIT09bnVsbCl7dmFyIHU9aS5tYXRjaCgvXihbYS16XSspKFswLTldKikoW0EtWmEtel0qKSQvKSxwPXVbMl0/dVsyXSoxOjAsYj11WzNdP3VbM10udG9Mb3dlckNhc2UoKToiZnVsbCI7aWYodVsxXT09PW4pe3ZhciBnPWxsKHIscCxiKTtfaShnLGIsbyl9fX0pLHIuc29ydChmdW5jdGlvbihpLG8pe3ZhciB1PWkucm93TnVtLHA9by5yb3dOdW07aWYodT09PXApe3ZhciBiPWkuZnVsbCYmIW8uZnVsbD8tMToxO3JldHVybiBuPT09ImJvdHRvbSI/YiotMTpifXJldHVybiBwLXV9KSxuPT09ImJvdHRvbSImJnIucmV2ZXJzZSgpO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKWRlbGV0ZSByW3NdLnJvd051bSxkbCh0LHJbc10pO3JldHVybiByfWZ1bmN0aW9uIGRsKHQsZSl7dmFyIG49ZnVuY3Rpb24ocyxpKXtyZXR1cm4gbGUuZmVhdHVyZXNbc118fE9lKHQsMCwiVW5rbm93biBmZWF0dXJlOiAiK3MpLGxlLmZlYXR1cmVzW3NdLmFwcGx5KHRoaXMsW3QsaV0pfSxyPWZ1bmN0aW9uKHMpe2lmKGVbc10pZm9yKHZhciBpPWVbc10uY29udGVudHMsbz0wLHU9aS5sZW5ndGg7bzx1O28rKylpZihpW29dKXtpZih0eXBlb2YgaVtvXT09InN0cmluZyIpaVtvXT1uKGlbb10sbnVsbCk7ZWxzZSBpZihILmlzUGxhaW5PYmplY3QoaVtvXSkpaVtvXT1uKGlbb10uZmVhdHVyZSxpW29dLm9wdHMpO2Vsc2UgaWYodHlwZW9mIGlbb10ubm9kZT09ImZ1bmN0aW9uIilpW29dPWlbb10ubm9kZSh0KTtlbHNlIGlmKHR5cGVvZiBpW29dPT0iZnVuY3Rpb24iKXt2YXIgcD1pW29dKHQpO2lbb109dHlwZW9mIHAubm9kZT09ImZ1bmN0aW9uIj9wLm5vZGUoKTpwfX1lbHNlIGNvbnRpbnVlfTtyKCJzdGFydCIpLHIoImVuZCIpLHIoImZ1bGwiKX1mdW5jdGlvbiB1bCh0KXt2YXIgZT10Lm9DbGFzc2VzLG49SCh0Lm5UYWJsZSkscj1IKCI8ZGl2Lz4iKS5hdHRyKHtpZDp0LnNUYWJsZUlkKyJfd3JhcHBlciIsY2xhc3M6ZS5jb250YWluZXJ9KS5pbnNlcnRCZWZvcmUobik7aWYodC5uVGFibGVXcmFwcGVyPXJbMF0sdC5zRG9tKWNsKHQsdC5zRG9tLHIpO2Vsc2V7dmFyIHM9R2EodCx0LmxheW91dCwidG9wIiksaT1HYSh0LHQubGF5b3V0LCJib3R0b20iKSxvPUZyKHQsImxheW91dCIpO3MuZm9yRWFjaChmdW5jdGlvbih1KXtvKHQscix1KX0pLG8odCxyLHtmdWxsOnt0YWJsZTohMCxjb250ZW50czpbY3ModCldfX0pLGkuZm9yRWFjaChmdW5jdGlvbih1KXtvKHQscix1KX0pfXdsKHQpfWZ1bmN0aW9uIGNsKHQsZSxuKXtmb3IodmFyIHI9ZS5tYXRjaCgvKCIuKj8iKXwoJy4qPycpfC4vZykscyxpLG8sdSxwLGI9MDtiPHIubGVuZ3RoO2IrKyl7aWYocz1udWxsLGk9cltiXSxpPT0iPCIpe2lmKG89SCgiPGRpdi8+IiksdT1yW2IrMV0sdVswXT09IicifHx1WzBdPT0nIicpe3A9dS5yZXBsYWNlKC9bJyJdL2csIiIpO3ZhciBnPSIiLG07aWYocC5pbmRleE9mKCIuIikhPS0xKXt2YXIgQz1wLnNwbGl0KCIuIik7Zz1DWzBdLG09Q1sxXX1lbHNlIHBbMF09PSIjIj9nPXA6bT1wO28uYXR0cigiaWQiLGcuc3Vic3RyaW5nKDEpKS5hZGRDbGFzcyhtKSxiKyt9bi5hcHBlbmQobyksbj1vfWVsc2UgaT09Ij4iP249bi5wYXJlbnQoKTppPT0idCI/cz1jcyh0KTpidC5leHQuZmVhdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKHkpe2k9PXkuY0ZlYXR1cmUmJihzPXkuZm5Jbml0KHQpKX0pO3MmJm4uYXBwZW5kKHMpfX1mdW5jdGlvbiBscyh0LGUsbil7dmFyIHI9dC5hb0NvbHVtbnMscz1IKGUpLmNoaWxkcmVuKCJ0ciIpLGksbyx1LHAsYixnLG0sQyx5LFQsUD1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0idGhlYWQiLGM9W10sbCxoPWZ1bmN0aW9uKFUsWCxRKXtmb3IodmFyIEU9VVtYXTtFW1FdOylRKys7cmV0dXJuIFF9O2Zvcih1PTAsZz1zLmxlbmd0aDt1PGc7dSsrKWMucHVzaChbXSk7Zm9yKHU9MCxnPXMubGVuZ3RoO3U8Zzt1KyspZm9yKGk9c1t1XSxDPTAsbz1pLmZpcnN0Q2hpbGQ7bzspe2lmKG8ubm9kZU5hbWUudG9VcHBlckNhc2UoKT09IlREInx8by5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT0iVEgiKXt2YXIgXz1bXTtpZih5PW8uZ2V0QXR0cmlidXRlKCJjb2xzcGFuIikqMSxUPW8uZ2V0QXR0cmlidXRlKCJyb3dzcGFuIikqMSx5PSF5fHx5PT09MHx8eT09PTE/MTp5LFQ9IVR8fFQ9PT0wfHxUPT09MT8xOlQsbT1oKGMsdSxDKSxsPXk9PT0xLG4pe2lmKGwpe3hpKHQsbSxIKG8pLmRhdGEoKSk7dmFyIEY9clttXSxPPW8uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpfHxudWxsLGY9by5zdHlsZS53aWR0aC5tYXRjaCgvd2lkdGg6XHMqKFxkK1tweGVtJV0rKS8pO2YmJihPPWZbMV0pLEYuc1dpZHRoT3JpZz1GLnNXaWR0aHx8TyxQPyhGLnNUaXRsZSE9PW51bGwmJiFGLmF1dG9UaXRsZSYmKG8uaW5uZXJIVE1MPUYuc1RpdGxlKSwhRi5zVGl0bGUmJmwmJihGLnNUaXRsZT1nbihvLmlubmVySFRNTCksRi5hdXRvVGl0bGU9ITApKTpGLmZvb3RlciYmKG8uaW5uZXJIVE1MPUYuZm9vdGVyKSxGLmFyaWFUaXRsZXx8KEYuYXJpYVRpdGxlPUgobykuYXR0cigiYXJpYS1sYWJlbCIpfHxGLnNUaXRsZSksRi5jbGFzc05hbWUmJkgobykuYWRkQ2xhc3MoRi5jbGFzc05hbWUpfUgoInNwYW4uZHQtY29sdW1uLXRpdGxlIixvKS5sZW5ndGg9PT0wJiZIKCI8c3Bhbj4iKS5hZGRDbGFzcygiZHQtY29sdW1uLXRpdGxlIikuYXBwZW5kKG8uY2hpbGROb2RlcykuYXBwZW5kVG8obyksUCYmSCgic3Bhbi5kdC1jb2x1bW4tb3JkZXIiLG8pLmxlbmd0aD09PTAmJkgoIjxzcGFuPiIpLmFkZENsYXNzKCJkdC1jb2x1bW4tb3JkZXIiKS5hcHBlbmRUbyhvKX1mb3IoYj0wO2I8eTtiKyspe2ZvcihwPTA7cDxUO3ArKyljW3UrcF1bbStiXT17Y2VsbDpvLHVuaXF1ZTpsfSxjW3UrcF0ucm93PWk7Xy5wdXNoKG0rYil9by5zZXRBdHRyaWJ1dGUoImRhdGEtZHQtY29sdW1uIix4bihfKS5qb2luKCIsIikpfW89by5uZXh0U2libGluZ31yZXR1cm4gY31mdW5jdGlvbiBmbCh0KXt2YXIgZT1FZSh0KT09InNzcCIsbj10LmlJbml0RGlzcGxheVN0YXJ0O24hPT12b2lkIDAmJm4hPT0tMSYmKHQuX2lEaXNwbGF5U3RhcnQ9ZT9uOm4+PXQuZm5SZWNvcmRzRGlzcGxheSgpPzA6bix0LmlJbml0RGlzcGxheVN0YXJ0PS0xKX1mdW5jdGlvbiBSaSh0LGUsbil7dmFyIHIscz10LmFqYXgsaT10Lm9JbnN0YW5jZSxvPWZ1bmN0aW9uKGcpe3ZhciBtPXQuanFYSFI/dC5qcVhIUi5zdGF0dXM6bnVsbDsoZz09PW51bGx8fHR5cGVvZiBtPT0ibnVtYmVyIiYmbT09MjA0KSYmKGc9e30sTHIodCxnLFtdKSk7dmFyIEM9Zy5lcnJvcnx8Zy5zRXJyb3I7aWYoQyYmT2UodCwwLEMpLGcuZCYmdHlwZW9mIGcuZD09InN0cmluZyIpdHJ5e2c9SlNPTi5wYXJzZShnLmQpfWNhdGNoe310Lmpzb249ZyxadCh0LG51bGwsInhociIsW3QsZyx0LmpxWEhSXSwhMCksbihnKX07aWYoSC5pc1BsYWluT2JqZWN0KHMpJiZzLmRhdGEpe3I9cy5kYXRhO3ZhciB1PXR5cGVvZiByPT0iZnVuY3Rpb24iP3IoZSx0KTpyO2U9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnU/dTpILmV4dGVuZCghMCxlLHUpLGRlbGV0ZSBzLmRhdGF9dmFyIHA9e3VybDp0eXBlb2Ygcz09InN0cmluZyI/czoiIixkYXRhOmUsc3VjY2VzczpvLGRhdGFUeXBlOiJqc29uIixjYWNoZTohMSx0eXBlOnQuc1NlcnZlck1ldGhvZCxlcnJvcjpmdW5jdGlvbihnLG0pe3ZhciBDPVp0KHQsbnVsbCwieGhyIixbdCxudWxsLHQuanFYSFJdLCEwKTtDLmluZGV4T2YoITApPT09LTEmJihtPT0icGFyc2VyZXJyb3IiP09lKHQsMCwiSW52YWxpZCBKU09OIHJlc3BvbnNlIiwxKTpnLnJlYWR5U3RhdGU9PT00JiZPZSh0LDAsIkFqYXggZXJyb3IiLDcpKSxrZSh0LCExKX19O2lmKEguaXNQbGFpbk9iamVjdChzKSYmSC5leHRlbmQocCxzKSx0Lm9BamF4RGF0YT1lLFp0KHQsbnVsbCwicHJlWGhyIixbdCxlLHBdLCEwKSx0eXBlb2Ygcz09ImZ1bmN0aW9uIil0LmpxWEhSPXMuY2FsbChpLGUsbyx0KTtlbHNlIGlmKHMudXJsPT09IiIpe3ZhciBiPXt9O2J0LnV0aWwuc2V0KHMuZGF0YVNyYykoYixbXSksbyhiKX1lbHNlIHQuanFYSFI9SC5hamF4KHApO3ImJihzLmRhdGE9cil9ZnVuY3Rpb24gaGwodCl7dC5pRHJhdysrLGtlKHQsITApLFJpKHQscGwodCksZnVuY3Rpb24oZSl7YmwodCxlKX0pfWZ1bmN0aW9uIHBsKHQpe3ZhciBlPXQuYW9Db2x1bW5zLG49dC5vRmVhdHVyZXMscj10Lm9QcmV2aW91c1NlYXJjaCxzPXQuYW9QcmVTZWFyY2hDb2xzLGk9ZnVuY3Rpb24obyx1KXtyZXR1cm4gdHlwZW9mIGVbb11bdV09PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjplW29dW3VdfTtyZXR1cm57ZHJhdzp0LmlEcmF3LGNvbHVtbnM6ZS5tYXAoZnVuY3Rpb24obyx1KXtyZXR1cm57ZGF0YTppKHUsIm1EYXRhIiksbmFtZTpvLnNOYW1lLHNlYXJjaGFibGU6by5iU2VhcmNoYWJsZSxvcmRlcmFibGU6by5iU29ydGFibGUsc2VhcmNoOnt2YWx1ZTpzW3VdLnNlYXJjaCxyZWdleDpzW3VdLnJlZ2V4LGZpeGVkOk9iamVjdC5rZXlzKG8uc2VhcmNoRml4ZWQpLm1hcChmdW5jdGlvbihwKXtyZXR1cm57bmFtZTpwLHRlcm06by5zZWFyY2hGaXhlZFtwXS50b1N0cmluZygpfX0pfX19KSxvcmRlcjp6cih0KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJue2NvbHVtbjpvLmNvbCxkaXI6by5kaXIsbmFtZTppKG8uY29sLCJzTmFtZSIpfX0pLHN0YXJ0OnQuX2lEaXNwbGF5U3RhcnQsbGVuZ3RoOm4uYlBhZ2luYXRlP3QuX2lEaXNwbGF5TGVuZ3RoOi0xLHNlYXJjaDp7dmFsdWU6ci5zZWFyY2gscmVnZXg6ci5yZWdleCxmaXhlZDpPYmplY3Qua2V5cyh0LnNlYXJjaEZpeGVkKS5tYXAoZnVuY3Rpb24obyl7cmV0dXJue25hbWU6byx0ZXJtOnQuc2VhcmNoRml4ZWRbb10udG9TdHJpbmcoKX19KX19fWZ1bmN0aW9uIGJsKHQsZSl7dmFyIG49THIodCxlKSxyPXZpKHQsImRyYXciLGUpLHM9dmkodCwicmVjb3Jkc1RvdGFsIixlKSxpPXZpKHQsInJlY29yZHNGaWx0ZXJlZCIsZSk7aWYociE9PXZvaWQgMCl7aWYocioxPHQuaURyYXcpcmV0dXJuO3QuaURyYXc9cioxfW58fChuPVtdKSxPaSh0KSx0Ll9pUmVjb3Jkc1RvdGFsPXBhcnNlSW50KHMsMTApLHQuX2lSZWNvcmRzRGlzcGxheT1wYXJzZUludChpLDEwKTtmb3IodmFyIG89MCx1PW4ubGVuZ3RoO288dTtvKyspeW4odCxuW29dKTt0LmFpRGlzcGxheT10LmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLEZpKHQpLExuKHQsITApLFByKHQpLGtlKHQsITEpfWZ1bmN0aW9uIExyKHQsZSxuKXt2YXIgcj0iZGF0YSI7aWYoSC5pc1BsYWluT2JqZWN0KHQuYWpheCkmJnQuYWpheC5kYXRhU3JjIT09dm9pZCAwKXt2YXIgcz10LmFqYXguZGF0YVNyYzt0eXBlb2Ygcz09InN0cmluZyJ8fHR5cGVvZiBzPT0iZnVuY3Rpb24iP3I9czpzLmRhdGEhPT12b2lkIDAmJihyPXMuZGF0YSl9aWYoIW4pcmV0dXJuIHI9PT0iZGF0YSI/ZS5hYURhdGF8fGVbcl06ciE9PSIiP0VuKHIpKGUpOmU7dm4ocikoZSxuKX1mdW5jdGlvbiB2aSh0LGUsbil7dmFyIHI9SC5pc1BsYWluT2JqZWN0KHQuYWpheCk/dC5hamF4LmRhdGFTcmM6bnVsbDtpZihyJiZyW2VdKXJldHVybiBFbihyW2VdKShuKTt2YXIgcz0iIjtyZXR1cm4gZT09PSJkcmF3Ij9zPSJzRWNobyI6ZT09PSJyZWNvcmRzVG90YWwiP3M9ImlUb3RhbFJlY29yZHMiOmU9PT0icmVjb3Jkc0ZpbHRlcmVkIiYmKHM9ImlUb3RhbERpc3BsYXlSZWNvcmRzIiksbltzXSE9PXZvaWQgMD9uW3NdOm5bZV19ZnVuY3Rpb24gdHIodCxlKXt2YXIgbj10LmFvUHJlU2VhcmNoQ29scztpZihFZSh0KSE9InNzcCIpe3lsKHQpLHQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCksX3IodC5haURpc3BsYXksdCxlLnNlYXJjaCxlKSxILmVhY2godC5zZWFyY2hGaXhlZCxmdW5jdGlvbihpLG8pe19yKHQuYWlEaXNwbGF5LHQsbyx7fSl9KTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIHM9bltyXTtfcih0LmFpRGlzcGxheSx0LHMuc2VhcmNoLHMsciksSC5lYWNoKHQuYW9Db2x1bW5zW3JdLnNlYXJjaEZpeGVkLGZ1bmN0aW9uKGksbyl7X3IodC5haURpc3BsYXksdCxvLHt9LHIpfSl9bWwodCl9dC5iRmlsdGVyZWQ9ITAsWnQodCxudWxsLCJzZWFyY2giLFt0XSl9ZnVuY3Rpb24gbWwodCl7Zm9yKHZhciBlPWJ0LmV4dC5zZWFyY2gsbj10LmFpRGlzcGxheSxyLHMsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Zm9yKHZhciB1PVtdLHA9MCxiPW4ubGVuZ3RoO3A8YjtwKyspcz1uW3BdLHI9dC5hb0RhdGFbc10sZVtpXSh0LHIuX2FGaWx0ZXJEYXRhLHMsci5fYURhdGEscCkmJnUucHVzaChzKTtuLmxlbmd0aD0wLG4ucHVzaC5hcHBseShuLHUpfX1mdW5jdGlvbiBfcih0LGUsbixyLHMpe2lmKG4hPT0iIil7dmFyIGk9MCxvPVtdLHU9dHlwZW9mIG49PSJmdW5jdGlvbiI/bjpudWxsLHA9biBpbnN0YW5jZW9mIFJlZ0V4cD9uOnU/bnVsbDp2bChuLHIpO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBiPWUuYW9EYXRhW3RbaV1dLGc9cz09PXZvaWQgMD9iLl9zRmlsdGVyUm93OmIuX2FGaWx0ZXJEYXRhW3NdOyh1JiZ1KGcsYi5fYURhdGEsdFtpXSxzKXx8cCYmcC50ZXN0KGcpKSYmby5wdXNoKHRbaV0pfWZvcih0Lmxlbmd0aD1vLmxlbmd0aCxpPTA7aTxvLmxlbmd0aDtpKyspdFtpXT1vW2ldfX1mdW5jdGlvbiB2bCh0LGUpe3ZhciBuPVtdLHI9SC5leHRlbmQoe30se2JvdW5kYXJ5OiExLGNhc2VJbnNlbnNpdGl2ZTohMCxleGFjdDohMSxyZWdleDohMSxzbWFydDohMH0sZSk7aWYodHlwZW9mIHQhPSJzdHJpbmciJiYodD10LnRvU3RyaW5nKCkpLHQ9RHIodCksci5leGFjdClyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrQ2kodCkrIiQiLHIuY2FzZUluc2Vuc2l0aXZlPyJpIjoiIik7aWYodD1yLnJlZ2V4P3Q6Q2kodCksci5zbWFydCl7dmFyIHM9dC5tYXRjaCgvIT9bIlx1MjAxQ11bXiJcdTIwMURdK1siXHUyMDFEXXxbXiBdKy9nKXx8WyIiXSxpPXMubWFwKGZ1bmN0aW9uKHApe3ZhciBiPSExLGc7cmV0dXJuIHAuY2hhckF0KDApPT09IiEiJiYoYj0hMCxwPXAuc3Vic3RyaW5nKDEpKSxwLmNoYXJBdCgwKT09PSciJz8oZz1wLm1hdGNoKC9eIiguKikiJC8pLHA9Zz9nWzFdOnApOnAuY2hhckF0KDApPT09Ilx1MjAxQyImJihnPXAubWF0Y2goL15cdTIwMUMoLiopXHUyMDFEJC8pLHA9Zz9nWzFdOnApLGImJihwLmxlbmd0aD4xJiZuLnB1c2goIig/ISIrcCsiKSIpLHA9IiIpLHAucmVwbGFjZSgvIi9nLCIiKX0pLG89bi5sZW5ndGg/bi5qb2luKCIiKToiIix1PXIuYm91bmRhcnk/IlxcYiI6IiI7dD0iXig/PS4qPyIrdStpLmpvaW4oIikoPz0uKj8iK3UpKyIpKCIrbysiLikqJCJ9cmV0dXJuIG5ldyBSZWdFeHAodCxyLmNhc2VJbnNlbnNpdGl2ZT8iaSI6IiIpfXZhciBDaT1idC51dGlsLmVzY2FwZVJlZ2V4LFRyPUgoIjxkaXY+IilbMF0sZ2w9VHIudGV4dENvbnRlbnQhPT12b2lkIDA7ZnVuY3Rpb24geWwodCl7Zm9yKHZhciBlPXQuYW9Db2x1bW5zLG49dC5hb0RhdGEscixzLGksbyx1LHAsYj0hMSxnPTA7ZzxuLmxlbmd0aDtnKyspaWYobltnXSYmKHA9bltnXSwhcC5fYUZpbHRlckRhdGEpKXtmb3Iobz1bXSxzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXI9ZVtzXSxyLmJTZWFyY2hhYmxlPyh1PVJlKHQsZyxzLCJmaWx0ZXIiKSx1PT09bnVsbCYmKHU9IiIpLHR5cGVvZiB1IT0ic3RyaW5nIiYmdS50b1N0cmluZyYmKHU9dS50b1N0cmluZygpKSk6dT0iIix1LmluZGV4T2YmJnUuaW5kZXhPZigiJiIpIT09LTEmJihUci5pbm5lckhUTUw9dSx1PWdsP1RyLnRleHRDb250ZW50OlRyLmlubmVyVGV4dCksdS5yZXBsYWNlJiYodT11LnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIiKSksby5wdXNoKHUpO3AuX2FGaWx0ZXJEYXRhPW8scC5fc0ZpbHRlclJvdz1vLmpvaW4oIiAgIiksYj0hMH1yZXR1cm4gYn1mdW5jdGlvbiBrcih0KXt2YXIgZSxuPXQub0luaXQscj10LmRlZmVyTG9hZGluZyxzPUVlKHQpO2lmKCF0LmJJbml0aWFsaXNlZCl7c2V0VGltZW91dChmdW5jdGlvbigpe2tyKHQpfSwyMDApO3JldHVybn1VYSh0LCJoZWFkZXIiKSxVYSh0LCJmb290ZXIiKSxTbCh0LG4sZnVuY3Rpb24oKXtJcih0LHQuYW9IZWFkZXIpLElyKHQsdC5hb0Zvb3Rlcik7dmFyIGk9dC5pSW5pdERpc3BsYXlTdGFydDtpZihuLmFhRGF0YSlmb3IoZT0wO2U8bi5hYURhdGEubGVuZ3RoO2UrKyl5bih0LG4uYWFEYXRhW2VdKTtlbHNlKHJ8fHM9PSJkb20iKSYmTmkodCxIKHQublRCb2R5KS5jaGlsZHJlbigidHIiKSk7dC5haURpc3BsYXk9dC5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKSx1bCh0KSxDbCh0KSxocyh0KSxrZSh0LCEwKSxadCh0LG51bGwsInByZUluaXQiLFt0XSwhMCksUm4odCksKHMhPSJzc3AifHxyKSYmKHM9PSJhamF4Ij9SaSh0LHt9LGZ1bmN0aW9uKG8pe3ZhciB1PUxyKHQsbyk7Zm9yKGU9MDtlPHUubGVuZ3RoO2UrKyl5bih0LHVbZV0pO3QuaUluaXREaXNwbGF5U3RhcnQ9aSxSbih0KSxrZSh0LCExKSxQcih0KX0sdCk6KFByKHQpLGtlKHQsITEpKSl9KX1mdW5jdGlvbiBQcih0KXtpZighdC5fYkluaXRDb21wbGV0ZSl7dmFyIGU9W3QsdC5qc29uXTt0Ll9iSW5pdENvbXBsZXRlPSEwLE9yKHQpLFp0KHQsbnVsbCwicGx1Z2luLWluaXQiLGUsITApLFp0KHQsImFvSW5pdENvbXBsZXRlIiwiaW5pdCIsZSwhMCl9fWZ1bmN0aW9uIGRzKHQsZSl7dmFyIG49cGFyc2VJbnQoZSwxMCk7dC5faURpc3BsYXlMZW5ndGg9bix2cyh0KSxadCh0LG51bGwsImxlbmd0aCIsW3Qsbl0pfWZ1bmN0aW9uIExpKHQsZSxuKXt2YXIgcj10Ll9pRGlzcGxheVN0YXJ0LHM9dC5faURpc3BsYXlMZW5ndGgsaT10LmZuUmVjb3Jkc0Rpc3BsYXkoKTtpZihpPT09MHx8cz09PS0xKXI9MDtlbHNlIGlmKHR5cGVvZiBlPT0ibnVtYmVyIilyPWUqcyxyPmkmJihyPTApO2Vsc2UgaWYoZT09ImZpcnN0IilyPTA7ZWxzZSBpZihlPT0icHJldmlvdXMiKXI9cz49MD9yLXM6MCxyPDAmJihyPTApO2Vsc2UgaWYoZT09Im5leHQiKXIrczxpJiYocis9cyk7ZWxzZSBpZihlPT0ibGFzdCIpcj1NYXRoLmZsb29yKChpLTEpL3MpKnM7ZWxzZXtpZihlPT09ImVsbGlwc2lzIilyZXR1cm47T2UodCwwLCJVbmtub3duIHBhZ2luZyBhY3Rpb246ICIrZSw1KX12YXIgbz10Ll9pRGlzcGxheVN0YXJ0IT09cjtyZXR1cm4gdC5faURpc3BsYXlTdGFydD1yLFp0KHQsbnVsbCxvPyJwYWdlIjoicGFnZS1uYyIsW3RdKSxvJiZuJiZMbih0KSxvfWZ1bmN0aW9uIHdsKHQpe3ZhciBlPXQublRhYmxlLG49dC5vU2Nyb2xsLnNYIT09IiJ8fHQub1Njcm9sbC5zWSE9PSIiO2lmKHQub0ZlYXR1cmVzLmJQcm9jZXNzaW5nKXt2YXIgcj1IKCI8ZGl2Lz4iLHtpZDp0LnNUYWJsZUlkKyJfcHJvY2Vzc2luZyIsY2xhc3M6dC5vQ2xhc3Nlcy5wcm9jZXNzaW5nLmNvbnRhaW5lcixyb2xlOiJzdGF0dXMifSkuaHRtbCh0Lm9MYW5ndWFnZS5zUHJvY2Vzc2luZykuYXBwZW5kKCI8ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+Iik7bj9yLnByZXBlbmRUbyhIKCJkaXYuZHQtc2Nyb2xsIix0Lm5UYWJsZVdyYXBwZXIpKTpyLmluc2VydEJlZm9yZShlKSxIKGUpLm9uKCJwcm9jZXNzaW5nLmR0LkRUIixmdW5jdGlvbihzLGksbyl7ci5jc3MoImRpc3BsYXkiLG8/ImJsb2NrIjoibm9uZSIpfSl9fWZ1bmN0aW9uIGtlKHQsZSl7dC5iRHJhd2luZyYmZT09PSExfHxadCh0LG51bGwsInByb2Nlc3NpbmciLFt0LGVdKX1mdW5jdGlvbiB1cyh0LGUsbil7ZT8oa2UodCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe24oKSxrZSh0LCExKX0sMCkpOm4oKX1mdW5jdGlvbiBjcyh0KXt2YXIgZT1IKHQublRhYmxlKSxuPXQub1Njcm9sbDtpZihuLnNYPT09IiImJm4uc1k9PT0iIilyZXR1cm4gdC5uVGFibGU7dmFyIHI9bi5zWCxzPW4uc1ksaT10Lm9DbGFzc2VzLnNjcm9sbGluZyxvPXQuY2FwdGlvbk5vZGUsdT1vP28uX2NhcHRpb25TaWRlOm51bGwscD1IKGVbMF0uY2xvbmVOb2RlKCExKSksYj1IKGVbMF0uY2xvbmVOb2RlKCExKSksZz1lLmNoaWxkcmVuKCJ0Zm9vdCIpLG09IjxkaXYvPiIsQz1mdW5jdGlvbihoKXtyZXR1cm4gaD9vbihoKTpudWxsfTtnLmxlbmd0aHx8KGc9bnVsbCk7dmFyIHk9SChtLHtjbGFzczppLmNvbnRhaW5lcn0pLmFwcGVuZChIKG0se2NsYXNzOmkuaGVhZGVyLnNlbGZ9KS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYm9yZGVyOjAsd2lkdGg6cj9DKHIpOiIxMDAlIn0pLmFwcGVuZChIKG0se2NsYXNzOmkuaGVhZGVyLmlubmVyfSkuY3NzKHsiYm94LXNpemluZyI6ImNvbnRlbnQtYm94Iix3aWR0aDpuLnNYSW5uZXJ8fCIxMDAlIn0pLmFwcGVuZChwLnJlbW92ZUF0dHIoImlkIikuY3NzKCJtYXJnaW4tbGVmdCIsMCkuYXBwZW5kKHU9PT0idG9wIj9vOm51bGwpLmFwcGVuZChlLmNoaWxkcmVuKCJ0aGVhZCIpKSkpKS5hcHBlbmQoSChtLHtjbGFzczppLmJvZHl9KS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsb3ZlcmZsb3c6ImF1dG8iLHdpZHRoOkMocil9KS5hcHBlbmQoZSkpO2cmJnkuYXBwZW5kKEgobSx7Y2xhc3M6aS5mb290ZXIuc2VsZn0pLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiIsYm9yZGVyOjAsd2lkdGg6cj9DKHIpOiIxMDAlIn0pLmFwcGVuZChIKG0se2NsYXNzOmkuZm9vdGVyLmlubmVyfSkuYXBwZW5kKGIucmVtb3ZlQXR0cigiaWQiKS5jc3MoIm1hcmdpbi1sZWZ0IiwwKS5hcHBlbmQodT09PSJib3R0b20iP286bnVsbCkuYXBwZW5kKGUuY2hpbGRyZW4oInRmb290IikpKSkpO3ZhciBUPXkuY2hpbGRyZW4oKSxQPVRbMF0sYz1UWzFdLGw9Zz9UWzJdOm51bGw7cmV0dXJuIEgoYykub24oInNjcm9sbC5EVCIsZnVuY3Rpb24oKXt2YXIgaD10aGlzLnNjcm9sbExlZnQ7UC5zY3JvbGxMZWZ0PWgsZyYmKGwuc2Nyb2xsTGVmdD1oKX0pLEgoInRoLCB0ZCIsUCkub24oImZvY3VzIixmdW5jdGlvbigpe3ZhciBoPVAuc2Nyb2xsTGVmdDtjLnNjcm9sbExlZnQ9aCxnJiYoYy5zY3JvbGxMZWZ0PWgpfSksSChjKS5jc3MoIm1heC1oZWlnaHQiLHMpLG4uYkNvbGxhcHNlfHxIKGMpLmNzcygiaGVpZ2h0IixzKSx0Lm5TY3JvbGxIZWFkPVAsdC5uU2Nyb2xsQm9keT1jLHQublNjcm9sbEZvb3Q9bCx0LmFvRHJhd0NhbGxiYWNrLnB1c2goZnMpLHlbMF19ZnVuY3Rpb24gZnModCl7dmFyIGU9dC5vU2Nyb2xsLG49ZS5pQmFyV2lkdGgscj1IKHQublNjcm9sbEhlYWQpLHM9ci5jaGlsZHJlbigiZGl2IiksaT1zLmNoaWxkcmVuKCJ0YWJsZSIpLG89dC5uU2Nyb2xsQm9keSx1PUgobykscD1IKHQublNjcm9sbEZvb3QpLGI9cC5jaGlsZHJlbigiZGl2IiksZz1iLmNoaWxkcmVuKCJ0YWJsZSIpLG09SCh0Lm5USGVhZCksQz1IKHQublRhYmxlKSx5PXQublRGb290JiZIKCJ0aCwgdGQiLHQublRGb290KS5sZW5ndGg/SCh0Lm5URm9vdCk6bnVsbCxUPXQub0Jyb3dzZXIsUCxjLGw9by5zY3JvbGxIZWlnaHQ+by5jbGllbnRIZWlnaHQ7aWYodC5zY3JvbGxCYXJWaXMhPT1sJiZ0LnNjcm9sbEJhclZpcyE9PXZvaWQgMCl7dC5zY3JvbGxCYXJWaXM9bCxPcih0KTtyZXR1cm59ZWxzZSB0LnNjcm9sbEJhclZpcz1sO2lmKEMuY2hpbGRyZW4oInRoZWFkLCB0Zm9vdCIpLnJlbW92ZSgpLFA9bS5jbG9uZSgpLnByZXBlbmRUbyhDKSxQLmZpbmQoInRoLCB0ZCIpLnJlbW92ZUF0dHIoInRhYmluZGV4IiksUC5maW5kKCJbaWRdIikucmVtb3ZlQXR0cigiaWQiKSx5JiYoYz15LmNsb25lKCkucHJlcGVuZFRvKEMpLGMuZmluZCgiW2lkXSIpLnJlbW92ZUF0dHIoImlkIikpLHQuYWlEaXNwbGF5Lmxlbmd0aCl7dmFyIGg9bnVsbDtmb3IoZj0wO2Y8dC5haURpc3BsYXkubGVuZ3RoO2YrKyl7dmFyIF89dC5haURpc3BsYXlbZl0sRj10LmFvRGF0YVtfXS5uVHI7aWYoRil7aD1GO2JyZWFrfX1pZihoKWZvcih2YXIgTz1IKGgpLmNoaWxkcmVuKCJ0aCwgdGQiKS5tYXAoZnVuY3Rpb24odyl7cmV0dXJue2lkeDpJaSh0LHcpLHdpZHRoOkgodGhpcykub3V0ZXJXaWR0aCgpfX0pLGY9MDtmPE8ubGVuZ3RoO2YrKyl7dmFyIFU9dC5hb0NvbHVtbnNbT1tmXS5pZHhdLmNvbEVsWzBdLFg9VS5zdHlsZS53aWR0aC5yZXBsYWNlKCJweCIsIiIpO1ghPT1PW2ZdLndpZHRoJiYoVS5zdHlsZS53aWR0aD1PW2ZdLndpZHRoKyJweCIpfX1pLmZpbmQoImNvbGdyb3VwIikucmVtb3ZlKCksaS5hcHBlbmQodC5jb2xncm91cC5jbG9uZSgpKSx5JiYoZy5maW5kKCJjb2xncm91cCIpLnJlbW92ZSgpLGcuYXBwZW5kKHQuY29sZ3JvdXAuY2xvbmUoKSkpLEgoInRoLCB0ZCIsUCkuZWFjaChmdW5jdGlvbigpe0godGhpcy5jaGlsZE5vZGVzKS53cmFwQWxsKCc8ZGl2IGNsYXNzPSJkdC1zY3JvbGwtc2l6aW5nIj4nKX0pLHkmJkgoInRoLCB0ZCIsYykuZWFjaChmdW5jdGlvbigpe0godGhpcy5jaGlsZE5vZGVzKS53cmFwQWxsKCc8ZGl2IGNsYXNzPSJkdC1zY3JvbGwtc2l6aW5nIj4nKX0pO3ZhciBRPU1hdGguZmxvb3IoQy5oZWlnaHQoKSk+by5jbGllbnRIZWlnaHR8fHUuY3NzKCJvdmVyZmxvdy15Iik9PSJzY3JvbGwiLEU9InBhZGRpbmciKyhULmJTY3JvbGxiYXJMZWZ0PyJMZWZ0IjoiUmlnaHQiKSwkPUMub3V0ZXJXaWR0aCgpO2kuY3NzKCJ3aWR0aCIsb24oJCkpLHMuY3NzKCJ3aWR0aCIsb24oJCkpLmNzcyhFLFE/bisicHgiOiIwcHgiKSx5JiYoZy5jc3MoIndpZHRoIixvbigkKSksYi5jc3MoIndpZHRoIixvbigkKSkuY3NzKEUsUT9uKyJweCI6IjBweCIpKSxDLmNoaWxkcmVuKCJjb2xncm91cCIpLnByZXBlbmRUbyhDKSx1LnRyaWdnZXIoInNjcm9sbCIpLCh0LmJTb3J0ZWR8fHQuYkZpbHRlcmVkKSYmIXQuX2RyYXdIb2xkJiYoby5zY3JvbGxUb3A9MCl9ZnVuY3Rpb24geGwodCl7aWYodC5vRmVhdHVyZXMuYkF1dG9XaWR0aCl7dmFyIGU9dC5uVGFibGUsbj10LmFvQ29sdW1ucyxyPXQub1Njcm9sbCxzPXIuc1ksaT1yLnNYLG89ci5zWElubmVyLHU9UGkodCwiYlZpc2libGUiKSxwPWUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGI9ZS5wYXJlbnROb2RlLGcsbSxDLHk9ZS5zdHlsZS53aWR0aDsheSYmIXAmJihlLnN0eWxlLndpZHRoPSIxMDAlIix5PSIxMDAlIikseSYmeS5pbmRleE9mKCIlIikhPT0tMSYmKHA9eSksWnQodCxudWxsLCJjb2x1bW4tY2FsYyIse3Zpc2libGU6dX0sITEpO3ZhciBUPUgoZS5jbG9uZU5vZGUoKSkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikucmVtb3ZlQXR0cigiaWQiKTtULmFwcGVuZCgiPHRib2R5PiIpO3ZhciBQPUgoIjx0ci8+IikuYXBwZW5kVG8oVC5maW5kKCJ0Ym9keSIpKTtmb3IoVC5hcHBlbmQoSCh0Lm5USGVhZCkuY2xvbmUoKSkuYXBwZW5kKEgodC5uVEZvb3QpLmNsb25lKCkpLFQuZmluZCgidGZvb3QgdGgsIHRmb290IHRkIikuY3NzKCJ3aWR0aCIsIiIpLFQuZmluZCgidGhlYWQgdGgsIHRoZWFkIHRkIikuZWFjaChmdW5jdGlvbigpe3ZhciBRPXJzKHQsdGhpcywhMCwhMSk7UT8odGhpcy5zdHlsZS53aWR0aD1RLHRoaXMuc3R5bGUubWluV2lkdGg9USxpJiZIKHRoaXMpLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOlEsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjowLGhlaWdodDoxfSkpKTp0aGlzLnN0eWxlLndpZHRoPSIifSksZz0wO2c8dS5sZW5ndGg7ZysrKXtDPXVbZ10sbT1uW0NdO3ZhciBjPV9sKHQsQyksbD1sZS50eXBlLmNsYXNzTmFtZVttLnNUeXBlXSxoPWMrbS5zQ29udGVudFBhZGRpbmcsXz1jLmluZGV4T2YoIjwiKT09PS0xP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGgpOmg7SCgiPHRkLz4iKS5hZGRDbGFzcyhsKS5hZGRDbGFzcyhtLnNDbGFzcykuYXBwZW5kKF8pLmFwcGVuZFRvKFApfUgoIltuYW1lXSIsVCkucmVtb3ZlQXR0cigibmFtZSIpO3ZhciBGPUgoIjxkaXYvPiIpLmNzcyhpfHxzP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxoZWlnaHQ6MSxyaWdodDowLG92ZXJmbG93OiJoaWRkZW4ifTp7fSkuYXBwZW5kKFQpLmFwcGVuZFRvKGIpO2kmJm8/VC53aWR0aChvKTppPyhULmNzcygid2lkdGgiLCJhdXRvIiksVC5yZW1vdmVBdHRyKCJ3aWR0aCIpLFQud2lkdGgoKTxiLmNsaWVudFdpZHRoJiZwJiZULndpZHRoKGIuY2xpZW50V2lkdGgpKTpzP1Qud2lkdGgoYi5jbGllbnRXaWR0aCk6cCYmVC53aWR0aChwKTt2YXIgTz0wLGY9VC5maW5kKCJ0Ym9keSB0ciIpLmVxKDApLmNoaWxkcmVuKCk7Zm9yKGc9MDtnPHUubGVuZ3RoO2crKyl7dmFyIFU9ZltnXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtPKz1VLG5bdVtnXV0uc1dpZHRoPW9uKFUpfWlmKGUuc3R5bGUud2lkdGg9b24oTyksRi5yZW1vdmUoKSxwJiYoZS5zdHlsZS53aWR0aD1vbihwKSksKHB8fGkpJiYhdC5fcmVzekV2dCl7dmFyIFg9ZnVuY3Rpb24oKXtIKHdpbmRvdykub24oInJlc2l6ZS5EVC0iK3Quc0luc3RhbmNlLGJ0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXt0LmJEZXN0cm95aW5nfHxPcih0KX0pKX07WCgpLHQuX3Jlc3pFdnQ9ITB9fX1mdW5jdGlvbiBfbCh0LGUpe3ZhciBuPXQuYW9Db2x1bW5zW2VdO2lmKCFuLm1heExlblN0cmluZyl7Zm9yKHZhciByLHM9IiIsaT0tMSxvPTAsdT10LmFpRGlzcGxheU1hc3Rlci5sZW5ndGg7bzx1O28rKyl7dmFyIHA9dC5haURpc3BsYXlNYXN0ZXJbb10sYj1FaSh0LHApW2VdLGc9YiYmdHlwZW9mIGI9PSJvYmplY3QiJiZiLm5vZGVUeXBlP2IuaW5uZXJIVE1MOmIrIiI7Zz1nLnJlcGxhY2UoL2lkPSIuKj8iL2csIiIpLnJlcGxhY2UoL25hbWU9Ii4qPyIvZywiIikscj1nbihnKS5yZXBsYWNlKC8mbmJzcDsvZywiICIpLHIubGVuZ3RoPmkmJihzPWcsaT1yLmxlbmd0aCl9bi5tYXhMZW5TdHJpbmc9c31yZXR1cm4gbi5tYXhMZW5TdHJpbmd9ZnVuY3Rpb24gb24odCl7cmV0dXJuIHQ9PT1udWxsPyIwcHgiOnR5cGVvZiB0PT0ibnVtYmVyIj90PDA/IjBweCI6dCsicHgiOnQubWF0Y2goL1xkJC8pP3QrInB4Ijp0fWZ1bmN0aW9uIGhzKHQpe3ZhciBlPXQuYW9Db2x1bW5zO2Zvcih0LmNvbGdyb3VwLmVtcHR5KCksTmU9MDtOZTxlLmxlbmd0aDtOZSsrKWVbTmVdLmJWaXNpYmxlJiZ0LmNvbGdyb3VwLmFwcGVuZChlW05lXS5jb2xFbCl9ZnVuY3Rpb24gQ2wodCl7dmFyIGU9dC5uVEhlYWQsbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInRyIikscj10LmJTb3J0Q2VsbHNUb3Ascz0nOm5vdChbZGF0YS1kdC1vcmRlcj0iZGlzYWJsZSJdKTpub3QoW2RhdGEtZHQtb3JkZXI9Imljb24tb25seSJdKSc7cj09PSEwP2U9blswXTpyPT09ITEmJihlPW5bbi5sZW5ndGgtMV0pLHBzKHQsZSxlPT09dC5uVEhlYWQ/InRyIitzKyIgdGgiK3MrIiwgdHIiK3MrIiB0ZCIrczoidGgiK3MrIiwgdGQiK3MpO3ZhciBpPVtdO0puKHQsaSx0LmFhU29ydGluZyksdC5hYVNvcnRpbmc9aX1mdW5jdGlvbiBwcyh0LGUsbixyLHMpe21zKGUsbixmdW5jdGlvbihpKXt2YXIgbz0hMSx1PXI9PT12b2lkIDA/QmkoaS50YXJnZXQpOltyXTtpZih1Lmxlbmd0aCl7Zm9yKHZhciBwPTAsYj11Lmxlbmd0aDtwPGI7cCsrKXt2YXIgZz1UbCh0LHVbcF0scCxpLnNoaWZ0S2V5KTtpZihnIT09ITEmJihvPSEwKSx0LmFhU29ydGluZy5sZW5ndGg9PT0xJiZ0LmFhU29ydGluZ1swXVsxXT09PSIiKWJyZWFrfW8mJnVzKHQsITAsZnVuY3Rpb24oKXt6aSh0KSxicyh0LHQuYWlEaXNwbGF5KSxSbih0LCExLCExKSxzJiZzKCl9KX19KX1mdW5jdGlvbiBicyh0LGUpe2lmKCEoZS5sZW5ndGg8Mikpe3ZhciBuPXQuYWlEaXNwbGF5TWFzdGVyLHI9e30scz17fSxpO2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT1pO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspc1tlW2ldXT1yW2VbaV1dO2Uuc29ydChmdW5jdGlvbihvLHUpe3JldHVybiBzW29dLXNbdV19KX19ZnVuY3Rpb24gSm4odCxlLG4pe3ZhciByPWZ1bmN0aW9uKGkpe2lmKEguaXNQbGFpbk9iamVjdChpKSl7aWYoaS5pZHghPT12b2lkIDApZS5wdXNoKFtpLmlkeCxpLmRpcl0pO2Vsc2UgaWYoaS5uYW1lKXt2YXIgbz1DZSh0LmFvQ29sdW1ucywic05hbWUiKSx1PW8uaW5kZXhPZihpLm5hbWUpO3UhPT0tMSYmZS5wdXNoKFt1LGkuZGlyXSl9fWVsc2UgZS5wdXNoKGkpfTtpZihILmlzUGxhaW5PYmplY3QobikpcihuKTtlbHNlIGlmKG4ubGVuZ3RoJiZ0eXBlb2YgblswXT09Im51bWJlciIpcihuKTtlbHNlIGlmKG4ubGVuZ3RoKWZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXIobltzXSl9ZnVuY3Rpb24genIodCl7dmFyIGUsbixyLHM9W10saT1idC5leHQudHlwZS5vcmRlcixvPXQuYW9Db2x1bW5zLHUscCxiLGcsbT10LmFhU29ydGluZ0ZpeGVkLEM9SC5pc1BsYWluT2JqZWN0KG0pLHk9W107aWYoIXQub0ZlYXR1cmVzLmJTb3J0KXJldHVybiBzO2ZvcihBcnJheS5pc0FycmF5KG0pJiZKbih0LHksbSksQyYmbS5wcmUmJkpuKHQseSxtLnByZSksSm4odCx5LHQuYWFTb3J0aW5nKSxDJiZtLnBvc3QmJkpuKHQseSxtLnBvc3QpLGU9MDtlPHkubGVuZ3RoO2UrKylpZihnPXlbZV1bMF0sb1tnXSlmb3IodT1vW2ddLmFEYXRhU29ydCxuPTAscj11Lmxlbmd0aDtuPHI7bisrKXA9dVtuXSxiPW9bcF0uc1R5cGV8fCJzdHJpbmciLHlbZV0uX2lkeD09PXZvaWQgMCYmKHlbZV0uX2lkeD1vW3BdLmFzU29ydGluZy5pbmRleE9mKHlbZV1bMV0pKSx5W2VdWzFdJiZzLnB1c2goe3NyYzpnLGNvbDpwLGRpcjp5W2VdWzFdLGluZGV4OnlbZV0uX2lkeCx0eXBlOmIsZm9ybWF0dGVyOmlbYisiLXByZSJdLHNvcnRlcjppW2IrIi0iK3lbZV1bMV1dfSk7cmV0dXJuIHN9ZnVuY3Rpb24gemkodCxlLG4pe3ZhciByLHMsaSxvPVtdLHU9YnQuZXh0LnR5cGUub3JkZXIscD10LmFvRGF0YSxiLGc9dC5haURpc3BsYXlNYXN0ZXIsbTtpZihlIT09dm9pZCAwKXt2YXIgQz10LmFvQ29sdW1uc1tlXTttPVt7c3JjOmUsY29sOmUsZGlyOm4saW5kZXg6MCx0eXBlOkMuc1R5cGUsZm9ybWF0dGVyOnVbQy5zVHlwZSsiLXByZSJdLHNvcnRlcjp1W0Muc1R5cGUrIi0iK25dfV0sZz1nLnNsaWNlKCl9ZWxzZSBtPXpyKHQpO2ZvcihyPTAscz1tLmxlbmd0aDtyPHM7cisrKWI9bVtyXSxrbCh0LGIuY29sKTtpZihFZSh0KSE9InNzcCImJm0ubGVuZ3RoIT09MCl7Zm9yKHI9MCxpPWcubGVuZ3RoO3I8aTtyKyspb1tyXT1yO20ubGVuZ3RoJiZtWzBdLmRpcj09PSJkZXNjIiYmdC5vcmRlckRlc2NSZXZlcnNlJiZvLnJldmVyc2UoKSxnLnNvcnQoZnVuY3Rpb24oeSxUKXt2YXIgUCxjLGwsaCxfLEY9bS5sZW5ndGgsTz1wW3ldLl9hU29ydERhdGEsZj1wW1RdLl9hU29ydERhdGE7Zm9yKGw9MDtsPEY7bCsrKWlmKF89bVtsXSxQPU9bXy5jb2xdLGM9ZltfLmNvbF0sXy5zb3J0ZXIpe2lmKGg9Xy5zb3J0ZXIoUCxjKSxoIT09MClyZXR1cm4gaH1lbHNlIGlmKGg9UDxjPy0xOlA+Yz8xOjAsaCE9PTApcmV0dXJuIF8uZGlyPT09ImFzYyI/aDotaDtyZXR1cm4gUD1vW3ldLGM9b1tUXSxQPGM/LTE6UD5jPzE6MH0pfWVsc2UgbS5sZW5ndGg9PT0wJiZnLnNvcnQoZnVuY3Rpb24oeSxUKXtyZXR1cm4geTxUPy0xOnk+VD8xOjB9KTtyZXR1cm4gZT09PXZvaWQgMCYmKHQuYlNvcnRlZD0hMCx0LnNvcnREZXRhaWxzPW0sWnQodCxudWxsLCJvcmRlciIsW3QsbV0pKSxnfWZ1bmN0aW9uIFRsKHQsZSxuLHIpe3ZhciBzPXQuYW9Db2x1bW5zW2VdLGk9dC5hYVNvcnRpbmcsbz1zLmFzU29ydGluZyx1LHA9ZnVuY3Rpb24oZyxtKXt2YXIgQz1nLl9pZHg7cmV0dXJuIEM9PT12b2lkIDAmJihDPW8uaW5kZXhPZihnWzFdKSksQysxPG8ubGVuZ3RoP0MrMTptP251bGw6MH07aWYoIXMuYlNvcnRhYmxlKXJldHVybiExO2lmKHR5cGVvZiBpWzBdPT0ibnVtYmVyIiYmKGk9dC5hYVNvcnRpbmc9W2ldKSwocnx8bikmJnQub0ZlYXR1cmVzLmJTb3J0TXVsdGkpe3ZhciBiPUNlKGksIjAiKS5pbmRleE9mKGUpO2IhPT0tMT8odT1wKGlbYl0sITApLHU9PT1udWxsJiZpLmxlbmd0aD09PTEmJih1PTApLHU9PT1udWxsP2kuc3BsaWNlKGIsMSk6KGlbYl1bMV09b1t1XSxpW2JdLl9pZHg9dSkpOnI/KGkucHVzaChbZSxvWzBdLDBdKSxpW2kubGVuZ3RoLTFdLl9pZHg9MCk6KGkucHVzaChbZSxpWzBdWzFdLDBdKSxpW2kubGVuZ3RoLTFdLl9pZHg9MCl9ZWxzZSBpLmxlbmd0aCYmaVswXVswXT09ZT8odT1wKGlbMF0pLGkubGVuZ3RoPTEsaVswXVsxXT1vW3VdLGlbMF0uX2lkeD11KTooaS5sZW5ndGg9MCxpLnB1c2goW2Usb1swXV0pLGlbMF0uX2lkeD0wKX1mdW5jdGlvbiBUaSh0KXt2YXIgZT10LmFMYXN0U29ydCxuPXQub0NsYXNzZXMub3JkZXIucG9zaXRpb24scj16cih0KSxzPXQub0ZlYXR1cmVzLGksbyx1O2lmKHMuYlNvcnQmJnMuYlNvcnRDbGFzc2VzKXtmb3IoaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl1PWVbaV0uc3JjLEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5yZW1vdmVDbGFzcyhuKyhpPDI/aSsxOjMpKTtmb3IoaT0wLG89ci5sZW5ndGg7aTxvO2krKyl1PXJbaV0uc3JjLEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5hZGRDbGFzcyhuKyhpPDI/aSsxOjMpKX10LmFMYXN0U29ydD1yfWZ1bmN0aW9uIGtsKHQsZSl7dmFyIG49dC5hb0NvbHVtbnNbZV0scj1idC5leHQub3JkZXJbbi5zU29ydERhdGFUeXBlXSxzO3ImJihzPXIuY2FsbCh0Lm9JbnN0YW5jZSx0LGUsbnIodCxlKSkpO2Zvcih2YXIgaSxvLHU9YnQuZXh0LnR5cGUub3JkZXJbbi5zVHlwZSsiLXByZSJdLHA9dC5hb0RhdGEsYj0wO2I8cC5sZW5ndGg7YisrKXBbYl0mJihpPXBbYl0saS5fYVNvcnREYXRhfHwoaS5fYVNvcnREYXRhPVtdKSwoIWkuX2FTb3J0RGF0YVtlXXx8cikmJihvPXI/c1tiXTpSZSh0LGIsZSwic29ydCIpLGkuX2FTb3J0RGF0YVtlXT11P3Uobyx0KTpvKSl9ZnVuY3Rpb24ganIodCl7aWYoIXQuX2JMb2FkaW5nU3RhdGUpe3ZhciBlPXt0aW1lOituZXcgRGF0ZSxzdGFydDp0Ll9pRGlzcGxheVN0YXJ0LGxlbmd0aDp0Ll9pRGlzcGxheUxlbmd0aCxvcmRlcjpILmV4dGVuZCghMCxbXSx0LmFhU29ydGluZyksc2VhcmNoOkguZXh0ZW5kKHt9LHQub1ByZXZpb3VzU2VhcmNoKSxjb2x1bW5zOnQuYW9Db2x1bW5zLm1hcChmdW5jdGlvbihuLHIpe3JldHVybnt2aXNpYmxlOm4uYlZpc2libGUsc2VhcmNoOkguZXh0ZW5kKHt9LHQuYW9QcmVTZWFyY2hDb2xzW3JdKX19KX07dC5vU2F2ZWRTdGF0ZT1lLFp0KHQsImFvU3RhdGVTYXZlUGFyYW1zIiwic3RhdGVTYXZlUGFyYW1zIixbdCxlXSksdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSYmIXQuYkRlc3Ryb3lpbmcmJnQuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQsZSl9fWZ1bmN0aW9uIFNsKHQsZSxuKXtpZighdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSl7bigpO3JldHVybn12YXIgcj1mdW5jdGlvbihpKXtraSh0LGksbil9LHM9dC5mblN0YXRlTG9hZENhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxyKTtyZXR1cm4gcyE9PXZvaWQgMCYma2kodCxzLG4pLCEwfWZ1bmN0aW9uIGtpKHQsZSxuKXt2YXIgcixzLGk9dC5hb0NvbHVtbnM7dC5fYkxvYWRpbmdTdGF0ZT0hMDt2YXIgbz10Ll9iSW5pdENvbXBsZXRlP25ldyBidC5BcGkodCk6bnVsbDtpZighZXx8IWUudGltZSl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxuKCk7cmV0dXJufXZhciB1PXQuaVN0YXRlRHVyYXRpb247aWYodT4wJiZlLnRpbWU8K25ldyBEYXRlLXUqMWUzKXt0Ll9iTG9hZGluZ1N0YXRlPSExLG4oKTtyZXR1cm59dmFyIHA9WnQodCwiYW9TdGF0ZUxvYWRQYXJhbXMiLCJzdGF0ZUxvYWRQYXJhbXMiLFt0LGVdKTtpZihwLmluZGV4T2YoITEpIT09LTEpe3QuX2JMb2FkaW5nU3RhdGU9ITEsbigpO3JldHVybn1pZihlLmNvbHVtbnMmJmkubGVuZ3RoIT09ZS5jb2x1bW5zLmxlbmd0aCl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxuKCk7cmV0dXJufWlmKHQub0xvYWRlZFN0YXRlPUguZXh0ZW5kKCEwLHt9LGUpLFp0KHQsbnVsbCwic3RhdGVMb2FkSW5pdCIsW3QsZV0sITApLGUubGVuZ3RoIT09dm9pZCAwJiYobz9vLnBhZ2UubGVuKGUubGVuZ3RoKTp0Ll9pRGlzcGxheUxlbmd0aD1lLmxlbmd0aCksZS5zdGFydCE9PXZvaWQgMCYmKG89PT1udWxsPyh0Ll9pRGlzcGxheVN0YXJ0PWUuc3RhcnQsdC5pSW5pdERpc3BsYXlTdGFydD1lLnN0YXJ0KTpMaSh0LGUuc3RhcnQvdC5faURpc3BsYXlMZW5ndGgpKSxlLm9yZGVyIT09dm9pZCAwJiYodC5hYVNvcnRpbmc9W10sSC5lYWNoKGUub3JkZXIsZnVuY3Rpb24oZyxtKXt0LmFhU29ydGluZy5wdXNoKG1bMF0+PWkubGVuZ3RoP1swLG1bMV1dOm0pfSkpLGUuc2VhcmNoIT09dm9pZCAwJiZILmV4dGVuZCh0Lm9QcmV2aW91c1NlYXJjaCxlLnNlYXJjaCksZS5jb2x1bW5zKXtmb3Iocj0wLHM9ZS5jb2x1bW5zLmxlbmd0aDtyPHM7cisrKXt2YXIgYj1lLmNvbHVtbnNbcl07Yi52aXNpYmxlIT09dm9pZCAwJiYobz9vLmNvbHVtbihyKS52aXNpYmxlKGIudmlzaWJsZSwhMSk6aVtyXS5iVmlzaWJsZT1iLnZpc2libGUpLGIuc2VhcmNoIT09dm9pZCAwJiZILmV4dGVuZCh0LmFvUHJlU2VhcmNoQ29sc1tyXSxiLnNlYXJjaCl9byYmby5jb2x1bW5zLmFkanVzdCgpfXQuX2JMb2FkaW5nU3RhdGU9ITEsWnQodCwiYW9TdGF0ZUxvYWRlZCIsInN0YXRlTG9hZGVkIixbdCxlXSksbigpfWZ1bmN0aW9uIE9lKHQsZSxuLHIpe2lmKG49IkRhdGFUYWJsZXMgd2FybmluZzogIisodD8idGFibGUgaWQ9Iit0LnNUYWJsZUlkKyIgLSAiOiIiKStuLHImJihuKz0iLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVycm9yLCBwbGVhc2Ugc2VlIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vIityKSxlKXdpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2cobik7ZWxzZXt2YXIgcz1idC5leHQsaT1zLnNFcnJNb2RlfHxzLmVyck1vZGU7aWYodCYmWnQodCxudWxsLCJkdC1lcnJvciIsW3QscixuXSwhMCksaT09ImFsZXJ0IilhbGVydChuKTtlbHNle2lmKGk9PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKG4pO3R5cGVvZiBpPT0iZnVuY3Rpb24iJiZpKHQscixuKX19fWZ1bmN0aW9uIGxuKHQsZSxuLHIpe2lmKEFycmF5LmlzQXJyYXkobikpe0guZWFjaChuLGZ1bmN0aW9uKHMsaSl7QXJyYXkuaXNBcnJheShpKT9sbih0LGUsaVswXSxpWzFdKTpsbih0LGUsaSl9KTtyZXR1cm59cj09PXZvaWQgMCYmKHI9biksZVtuXSE9PXZvaWQgMCYmKHRbcl09ZVtuXSl9ZnVuY3Rpb24gcWEodCxlLG4pe3ZhciByO2Zvcih2YXIgcyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYocj1lW3NdLEguaXNQbGFpbk9iamVjdChyKT8oSC5pc1BsYWluT2JqZWN0KHRbc10pfHwodFtzXT17fSksSC5leHRlbmQoITAsdFtzXSxyKSk6biYmcyE9PSJkYXRhIiYmcyE9PSJhYURhdGEiJiZBcnJheS5pc0FycmF5KHIpP3Rbc109ci5zbGljZSgpOnRbc109cik7cmV0dXJuIHR9ZnVuY3Rpb24gbXModCxlLG4pe0godCkub24oImNsaWNrLkRUIixlLGZ1bmN0aW9uKHIpe24ocil9KS5vbigia2V5cHJlc3MuRFQiLGUsZnVuY3Rpb24ocil7ci53aGljaD09PTEzJiYoci5wcmV2ZW50RGVmYXVsdCgpLG4ocikpfSkub24oInNlbGVjdHN0YXJ0LkRUIixlLGZ1bmN0aW9uKCl7cmV0dXJuITF9KX1mdW5jdGlvbiBCZSh0LGUsbil7biYmdFtlXS5wdXNoKG4pfWZ1bmN0aW9uIFp0KHQsZSxuLHIscyl7dmFyIGk9W107aWYoZSYmKGk9dFtlXS5zbGljZSgpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHAuYXBwbHkodC5vSW5zdGFuY2Uscil9KSksbiE9PW51bGwpe3ZhciBvPUguRXZlbnQobisiLmR0IiksdT1IKHQublRhYmxlKTtvLmR0PXQuYXBpLHVbcz8idHJpZ2dlciI6InRyaWdnZXJIYW5kbGVyIl0obyxyKSxzJiZ1LnBhcmVudHMoImJvZHkiKS5sZW5ndGg9PT0wJiZIKCJib2R5IikudHJpZ2dlcihvLHIpLGkucHVzaChvLnJlc3VsdCl9cmV0dXJuIGl9ZnVuY3Rpb24gdnModCl7dmFyIGU9dC5faURpc3BsYXlTdGFydCxuPXQuZm5EaXNwbGF5RW5kKCkscj10Ll9pRGlzcGxheUxlbmd0aDtlPj1uJiYoZT1uLXIpLGUtPWUlciwocj09PS0xfHxlPDApJiYoZT0wKSx0Ll9pRGlzcGxheVN0YXJ0PWV9ZnVuY3Rpb24gRnIodCxlKXt2YXIgbj10LnJlbmRlcmVyLHI9YnQuZXh0LnJlbmRlcmVyW2VdO3JldHVybiBILmlzUGxhaW5PYmplY3QobikmJm5bZV0/cltuW2VdXXx8ci5fOnR5cGVvZiBuPT0ic3RyaW5nIiYmcltuXXx8ci5ffWZ1bmN0aW9uIEVlKHQpe3JldHVybiB0Lm9GZWF0dXJlcy5iU2VydmVyU2lkZT8ic3NwIjp0LmFqYXg/ImFqYXgiOiJkb20ifWZ1bmN0aW9uIGppKHQsZSxuKXt2YXIgcj10LmZuRm9ybWF0TnVtYmVyLHM9dC5faURpc3BsYXlTdGFydCsxLGk9dC5faURpc3BsYXlMZW5ndGgsbz10LmZuUmVjb3Jkc0Rpc3BsYXkoKSx1PXQuZm5SZWNvcmRzVG90YWwoKSxwPWk9PT0tMTtyZXR1cm4gZS5yZXBsYWNlKC9fU1RBUlRfL2csci5jYWxsKHQscykpLnJlcGxhY2UoL19FTkRfL2csci5jYWxsKHQsdC5mbkRpc3BsYXlFbmQoKSkpLnJlcGxhY2UoL19NQVhfL2csci5jYWxsKHQsdSkpLnJlcGxhY2UoL19UT1RBTF8vZyxyLmNhbGwodCxvKSkucmVwbGFjZSgvX1BBR0VfL2csci5jYWxsKHQscD8xOk1hdGguY2VpbChzL2kpKSkucmVwbGFjZSgvX1BBR0VTXy9nLHIuY2FsbCh0LHA/MTpNYXRoLmNlaWwoby9pKSkpLnJlcGxhY2UoL19FTlRSSUVTXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLG4pKS5yZXBsYWNlKC9fRU5UUklFUy1NQVhfL2csdC5hcGkuaTE4bigiZW50cmllcyIsIiIsdSkpLnJlcGxhY2UoL19FTlRSSUVTLVRPVEFMXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLG8pKX12YXIgTWk9W10sYmU9QXJyYXkucHJvdG90eXBlLERsPWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1idC5zZXR0aW5ncyxzPUNlKHIsIm5UYWJsZSIpO2lmKHQpe2lmKHQublRhYmxlJiZ0Lm9GZWF0dXJlcylyZXR1cm5bdF07aWYodC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRhYmxlIilyZXR1cm4gZT1zLmluZGV4T2YodCksZSE9PS0xP1tyW2VdXTpudWxsO2lmKHQmJnR5cGVvZiB0LnNldHRpbmdzPT0iZnVuY3Rpb24iKXJldHVybiB0LnNldHRpbmdzKCkudG9BcnJheSgpO3R5cGVvZiB0PT0ic3RyaW5nIj9uPUgodCkuZ2V0KCk6dCBpbnN0YW5jZW9mIEgmJihuPXQuZ2V0KCkpfWVsc2UgcmV0dXJuW107aWYobilyZXR1cm4gci5maWx0ZXIoZnVuY3Rpb24oaSxvKXtyZXR1cm4gbi5pbmNsdWRlcyhzW29dKX0pfTtXdD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFd0KSlyZXR1cm4gbmV3IFd0KHQsZSk7dmFyIG4scj1bXSxzPWZ1bmN0aW9uKGkpe3ZhciBvPURsKGkpO28mJnIucHVzaC5hcHBseShyLG8pfTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihuPTA7bjx0Lmxlbmd0aDtuKyspcyh0W25dKTtlbHNlIHModCk7aWYodGhpcy5jb250ZXh0PXIubGVuZ3RoPjE/eG4ocik6cixlKWlmKGUubGVuZ3RoPDFlNCl0aGlzLnB1c2guYXBwbHkodGhpcyxlKTtlbHNlIGZvcihuPTA7bjxlLmxlbmd0aDtuKyspdGhpcy5wdXNoKGVbbl0pO3RoaXMuc2VsZWN0b3I9e3Jvd3M6bnVsbCxjb2xzOm51bGwsb3B0czpudWxsfSxXdC5leHRlbmQodGhpcyx0aGlzLE1pKX07YnQuQXBpPVd0O0guZXh0ZW5kKFd0LnByb3RvdHlwZSx7YW55OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY291bnQoKSE9PTB9LGNvbnRleHQ6W10sY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbGF0dGVuKCkubGVuZ3RofSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5sZW5ndGg7ZTxuO2UrKyl0LmNhbGwodGhpcyx0aGlzW2VdLGUsdGhpcyk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dDtyZXR1cm4gZS5sZW5ndGg+dD9uZXcgV3QoZVt0XSx0aGlzW3RdKTpudWxsfSxmaWx0ZXI6ZnVuY3Rpb24odCl7dmFyIGU9YmUuZmlsdGVyLmNhbGwodGhpcyx0LHRoaXMpO3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LGUpfSxmbGF0dGVuOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsdC5jb25jYXQuYXBwbHkodCx0aGlzLnRvQXJyYXkoKSkpfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdF19LGpvaW46YmUuam9pbixpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbmRleE9mKHQpIT09LTF9LGluZGV4T2Y6YmUuaW5kZXhPZixpdGVyYXRvcjpmdW5jdGlvbih0LGUsbixyKXt2YXIgcz1bXSxpLG8sdSxwLGIsZz10aGlzLmNvbnRleHQsbSxDLHksVD10aGlzLnNlbGVjdG9yO2Zvcih0eXBlb2YgdD09InN0cmluZyImJihyPW4sbj1lLGU9dCx0PSExKSxvPTAsdT1nLmxlbmd0aDtvPHU7bysrKXt2YXIgUD1uZXcgV3QoZ1tvXSk7aWYoZT09PSJ0YWJsZSIpaT1uLmNhbGwoUCxnW29dLG8pLGkhPT12b2lkIDAmJnMucHVzaChpKTtlbHNlIGlmKGU9PT0iY29sdW1ucyJ8fGU9PT0icm93cyIpaT1uLmNhbGwoUCxnW29dLHRoaXNbb10sbyksaSE9PXZvaWQgMCYmcy5wdXNoKGkpO2Vsc2UgaWYoZT09PSJldmVyeSJ8fGU9PT0iY29sdW1uInx8ZT09PSJjb2x1bW4tcm93cyJ8fGU9PT0icm93Inx8ZT09PSJjZWxsIilmb3IoQz10aGlzW29dLGU9PT0iY29sdW1uLXJvd3MiJiYobT1NcihnW29dLFQub3B0cykpLHA9MCxiPUMubGVuZ3RoO3A8YjtwKyspeT1DW3BdLGU9PT0iY2VsbCI/aT1uLmNhbGwoUCxnW29dLHkucm93LHkuY29sdW1uLG8scCk6aT1uLmNhbGwoUCxnW29dLHksbyxwLG0pLGkhPT12b2lkIDAmJnMucHVzaChpKX1pZihzLmxlbmd0aHx8cil7dmFyIGM9bmV3IFd0KGcsdD9zLmNvbmNhdC5hcHBseShbXSxzKTpzKSxsPWMuc2VsZWN0b3I7cmV0dXJuIGwucm93cz1ULnJvd3MsbC5jb2xzPVQuY29scyxsLm9wdHM9VC5vcHRzLGN9cmV0dXJuIHRoaXN9LGxhc3RJbmRleE9mOmJlLmxhc3RJbmRleE9mLGxlbmd0aDowLG1hcDpmdW5jdGlvbih0KXt2YXIgZT1iZS5tYXAuY2FsbCh0aGlzLHQsdGhpcyk7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsZSl9LHBsdWNrOmZ1bmN0aW9uKHQpe3ZhciBlPWJ0LnV0aWwuZ2V0KHQpO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZShuKX0pfSxwb3A6YmUucG9wLHB1c2g6YmUucHVzaCxyZWR1Y2U6YmUucmVkdWNlLHJlZHVjZVJpZ2h0OmJlLnJlZHVjZVJpZ2h0LHJldmVyc2U6YmUucmV2ZXJzZSxzZWxlY3RvcjpudWxsLHNoaWZ0OmJlLnNoaWZ0LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsdGhpcyl9LHNvcnQ6YmUuc29ydCxzcGxpY2U6YmUuc3BsaWNlLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gYmUuc2xpY2UuY2FsbCh0aGlzKX0sdG8kOmZ1bmN0aW9uKCl7cmV0dXJuIEgodGhpcyl9LHRvSlF1ZXJ5OmZ1bmN0aW9uKCl7cmV0dXJuIEgodGhpcyl9LHVuaXF1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHhuKHRoaXMudG9BcnJheSgpKSl9LHVuc2hpZnQ6YmUudW5zaGlmdH0pO2Z1bmN0aW9uIEFsKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHR8fHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gV3QuZXh0ZW5kKHIscixuLm1ldGhvZEV4dCkscn19ZnVuY3Rpb24gSWwodCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYodFtuXS5uYW1lPT09ZSlyZXR1cm4gdFtuXTtyZXR1cm4gbnVsbH13aW5kb3cuX19hcGlTdHJ1Y3Q9TWk7V3QuZXh0ZW5kPWZ1bmN0aW9uKHQsZSxuKXtpZighKCFuLmxlbmd0aHx8IWV8fCEoZSBpbnN0YW5jZW9mIFd0KSYmIWUuX19kdF93cmFwcGVyKSl7dmFyIHIscyxpO2ZvcihyPTAscz1uLmxlbmd0aDtyPHM7cisrKWk9bltyXSxpLm5hbWUhPT0iX19wcm90b19fIiYmKGVbaS5uYW1lXT1pLnR5cGU9PT0iZnVuY3Rpb24iP0FsKHQsaS52YWwsaSk6aS50eXBlPT09Im9iamVjdCI/e306aS52YWwsZVtpLm5hbWVdLl9fZHRfd3JhcHBlcj0hMCxXdC5leHRlbmQodCxlW2kubmFtZV0saS5wcm9wRXh0KSl9fTtXdC5yZWdpc3Rlcj1JdD1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylXdC5yZWdpc3Rlcih0W25dLGUpO3JldHVybn12YXIgcyxpLG89dC5zcGxpdCgiLiIpLHU9TWkscCxiO2ZvcihzPTAsaT1vLmxlbmd0aDtzPGk7cysrKXtiPW9bc10uaW5kZXhPZigiKCkiKSE9PS0xLHA9Yj9vW3NdLnJlcGxhY2UoIigpIiwiIik6b1tzXTt2YXIgZz1JbCh1LHApO2d8fChnPXtuYW1lOnAsdmFsOnt9LG1ldGhvZEV4dDpbXSxwcm9wRXh0OltdLHR5cGU6Im9iamVjdCJ9LHUucHVzaChnKSkscz09PWktMT8oZy52YWw9ZSxnLnR5cGU9dHlwZW9mIGU9PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjpILmlzUGxhaW5PYmplY3QoZSk/Im9iamVjdCI6Im90aGVyIik6dT1iP2cubWV0aG9kRXh0OmcucHJvcEV4dH19O1d0LnJlZ2lzdGVyUGx1cmFsPVF0PWZ1bmN0aW9uKHQsZSxuKXtXdC5yZWdpc3Rlcih0LG4pLFd0LnJlZ2lzdGVyKGUsZnVuY3Rpb24oKXt2YXIgcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gcj09PXRoaXM/dGhpczpyIGluc3RhbmNlb2YgV3Q/ci5sZW5ndGg/QXJyYXkuaXNBcnJheShyWzBdKT9uZXcgV3Qoci5jb250ZXh0LHJbMF0pOnJbMF06dm9pZCAwOnJ9KX07dmFyIGdzPWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG49W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgaT1ncyhzLGUpO24ucHVzaC5hcHBseShuLGkpfSksbi5maWx0ZXIoZnVuY3Rpb24ocyl7cmV0dXJuIHN9KX1pZih0eXBlb2YgdD09Im51bWJlciIpcmV0dXJuW2VbdF1dO3ZhciByPWUubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLm5UYWJsZX0pO3JldHVybiBIKHIpLmZpbHRlcih0KS5tYXAoZnVuY3Rpb24oKXt2YXIgcz1yLmluZGV4T2YodGhpcyk7cmV0dXJuIGVbc119KS50b0FycmF5KCl9O0l0KCJ0YWJsZXMoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQhPW51bGw/bmV3IFd0KGdzKHQsdGhpcy5jb250ZXh0KSk6dGhpc30pO0l0KCJ0YWJsZSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLnRhYmxlcyh0KSxuPWUuY29udGV4dDtyZXR1cm4gbi5sZW5ndGg/bmV3IFd0KG5bMF0pOmV9KTtbWyJub2RlcyIsIm5vZGUiLCJuVGFibGUiXSxbImJvZHkiLCJib2R5IiwiblRCb2R5Il0sWyJoZWFkZXIiLCJoZWFkZXIiLCJuVEhlYWQiXSxbImZvb3RlciIsImZvb3RlciIsIm5URm9vdCJdXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1F0KCJ0YWJsZXMoKS4iK3RbMF0rIigpIiwidGFibGUoKS4iK3RbMV0rIigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7cmV0dXJuIGVbdFsyXV19LDEpfSl9KTtbWyJoZWFkZXIiLCJhb0hlYWRlciJdLFsiZm9vdGVyIiwiYW9Gb290ZXIiXV0uZm9yRWFjaChmdW5jdGlvbih0KXtJdCgidGFibGUoKS4iK3RbMF0rIi5zdHJ1Y3R1cmUoKSIsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5jb2x1bW5zKGUpLmluZGV4ZXMoKS5mbGF0dGVuKCkscj10aGlzLmNvbnRleHRbMF07cmV0dXJuIG9zKHIsclt0WzFdXSxuKX0pfSk7UXQoInRhYmxlcygpLmNvbnRhaW5lcnMoKSIsInRhYmxlKCkuY29udGFpbmVyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtyZXR1cm4gdC5uVGFibGVXcmFwcGVyfSwxKX0pO0l0KCJ0YWJsZXMoKS5ldmVyeSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obixyKXt0LmNhbGwoZS50YWJsZShyKSxyKX0pfSk7SXQoImNhcHRpb24oKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQ7aWYodD09PXZvaWQgMCl7dmFyIHI9blswXS5jYXB0aW9uTm9kZTtyZXR1cm4gciYmbi5sZW5ndGg/ci5pbm5lckhUTUw6bnVsbH1yZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHMpe3ZhciBpPUgocy5uVGFibGUpLG89SChzLmNhcHRpb25Ob2RlKSx1PUgocy5uVGFibGVXcmFwcGVyKTtpZihvLmxlbmd0aHx8KG89SCgiPGNhcHRpb24vPiIpLmh0bWwodCkscy5jYXB0aW9uTm9kZT1vWzBdLGV8fChpLnByZXBlbmQobyksZT1vLmNzcygiY2FwdGlvbi1zaWRlIikpKSxvLmh0bWwodCksZSYmKG8uY3NzKCJjYXB0aW9uLXNpZGUiLGUpLG9bMF0uX2NhcHRpb25TaWRlPWUpLHUuZmluZCgiZGl2LmRhdGFUYWJsZXNfc2Nyb2xsIikubGVuZ3RoKXt2YXIgcD1lPT09InRvcCI/IkhlYWQiOiJGb290Ijt1LmZpbmQoImRpdi5kYXRhVGFibGVzX3Njcm9sbCIrcCsiIHRhYmxlIikucHJlcGVuZChvKX1lbHNlIGkucHJlcGVuZChvKX0sMSl9KTtJdCgiY2FwdGlvbi5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aD90WzBdLmNhcHRpb25Ob2RlOm51bGx9KTtJdCgiZHJhdygpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3Q9PT0icGFnZSI/TG4oZSk6KHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9dCE9PSJmdWxsLWhvbGQiKSxSbihlLHQ9PT0hMSkpfSl9KTtJdCgicGFnZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLnBhZ2UuaW5mbygpLnBhZ2U6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe0xpKGUsdCl9KX0pO0l0KCJwYWdlLmluZm8oKSIsZnVuY3Rpb24oKXtpZih0aGlzLmNvbnRleHQubGVuZ3RoIT09MCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdLGU9dC5faURpc3BsYXlTdGFydCxuPXQub0ZlYXR1cmVzLmJQYWdpbmF0ZT90Ll9pRGlzcGxheUxlbmd0aDotMSxyPXQuZm5SZWNvcmRzRGlzcGxheSgpLHM9bj09PS0xO3JldHVybntwYWdlOnM/MDpNYXRoLmZsb29yKGUvbikscGFnZXM6cz8xOk1hdGguY2VpbChyL24pLHN0YXJ0OmUsZW5kOnQuZm5EaXNwbGF5RW5kKCksbGVuZ3RoOm4scmVjb3Jkc1RvdGFsOnQuZm5SZWNvcmRzVG90YWwoKSxyZWNvcmRzRGlzcGxheTpyLHNlcnZlclNpZGU6RWUodCk9PT0ic3NwIn19fSk7SXQoInBhZ2UubGVuKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dC5sZW5ndGghPT0wP3RoaXMuY29udGV4dFswXS5faURpc3BsYXlMZW5ndGg6dm9pZCAwOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtkcyhlLHQpfSl9KTt2YXIgeXM9ZnVuY3Rpb24odCxlLG4pe2lmKG4pe3ZhciByPW5ldyBXdCh0KTtyLm9uZSgiZHJhdyIsZnVuY3Rpb24oKXtuKHIuYWpheC5qc29uKCkpfSl9aWYoRWUodCk9PSJzc3AiKVJuKHQsZSk7ZWxzZXtrZSh0LCEwKTt2YXIgcz10LmpxWEhSO3MmJnMucmVhZHlTdGF0ZSE9PTQmJnMuYWJvcnQoKSxSaSh0LHt9LGZ1bmN0aW9uKGkpe09pKHQpO2Zvcih2YXIgbz1Mcih0LGkpLHU9MCxwPW8ubGVuZ3RoO3U8cDt1KyspeW4odCxvW3VdKTtSbih0LGUpLFByKHQpLGtlKHQsITEpfSl9fTtJdCgiYWpheC5qc29uKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O2lmKHQubGVuZ3RoPjApcmV0dXJuIHRbMF0uanNvbn0pO0l0KCJhamF4LnBhcmFtcygpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtpZih0Lmxlbmd0aD4wKXJldHVybiB0WzBdLm9BamF4RGF0YX0pO0l0KCJhamF4LnJlbG9hZCgpIixmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7eXMobixlPT09ITEsdCl9KX0pO0l0KCJhamF4LnVybCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIHQ9PT12b2lkIDA/ZS5sZW5ndGg9PT0wP3ZvaWQgMDooZT1lWzBdLEguaXNQbGFpbk9iamVjdChlLmFqYXgpP2UuYWpheC51cmw6ZS5hamF4KTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7SC5pc1BsYWluT2JqZWN0KG4uYWpheCk/bi5hamF4LnVybD10Om4uYWpheD10fSl9KTtJdCgiYWpheC51cmwoKS5sb2FkKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXt5cyhuLGU9PT0hMSx0KX0pfSk7dmFyIFZpPWZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9W10sbyx1LHAsYixnLG0sQz10eXBlb2YgZTtmb3IoKCFlfHxDPT09InN0cmluZyJ8fEM9PT0iZnVuY3Rpb24ifHxlLmxlbmd0aD09PXZvaWQgMCkmJihlPVtlXSkscD0wLGI9ZS5sZW5ndGg7cDxiO3ArKylmb3IodT1lW3BdJiZlW3BdLnNwbGl0JiYhZVtwXS5tYXRjaCgvW1soOl0vKT9lW3BdLnNwbGl0KCIsIik6W2VbcF1dLGc9MCxtPXUubGVuZ3RoO2c8bTtnKyspbz1uKHR5cGVvZiB1W2ddPT0ic3RyaW5nIj91W2ddLnRyaW0oKTp1W2ddKSxvPW8uZmlsdGVyKGZ1bmN0aW9uKFQpe3JldHVybiBUIT1udWxsfSksbyYmby5sZW5ndGgmJihpPWkuY29uY2F0KG8pKTt2YXIgeT1sZS5zZWxlY3Rvclt0XTtpZih5Lmxlbmd0aClmb3IocD0wLGI9eS5sZW5ndGg7cDxiO3ArKylpPXlbcF0ocixzLGkpO3JldHVybiB4bihpKX0sSGk9ZnVuY3Rpb24odCl7cmV0dXJuIHR8fCh0PXt9KSx0LmZpbHRlciYmdC5zZWFyY2g9PT12b2lkIDAmJih0LnNlYXJjaD10LmZpbHRlciksSC5leHRlbmQoe3NlYXJjaDoibm9uZSIsb3JkZXI6ImN1cnJlbnQiLHBhZ2U6ImFsbCJ9LHQpfSxVaT1mdW5jdGlvbih0KXtsZXQgZT1uZXcgV3QodC5jb250ZXh0WzBdKTtyZXR1cm4gdC5sZW5ndGgmJmUucHVzaCh0WzBdKSxlLnNlbGVjdG9yPXQuc2VsZWN0b3IsZS5sZW5ndGgmJmVbMF0ubGVuZ3RoPjEmJmVbMF0uc3BsaWNlKDEpLGV9LE1yPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixzLGk9W10sbz10LmFpRGlzcGxheSx1PXQuYWlEaXNwbGF5TWFzdGVyLHA9ZS5zZWFyY2gsYj1lLm9yZGVyLGc9ZS5wYWdlO2lmKEVlKHQpPT0ic3NwIilyZXR1cm4gcD09PSJyZW1vdmVkIj9bXTphbigwLHUubGVuZ3RoKTtpZihnPT0iY3VycmVudCIpZm9yKG49dC5faURpc3BsYXlTdGFydCxyPXQuZm5EaXNwbGF5RW5kKCk7bjxyO24rKylpLnB1c2gob1tuXSk7ZWxzZSBpZihiPT0iY3VycmVudCJ8fGI9PSJhcHBsaWVkIil7aWYocD09Im5vbmUiKWk9dS5zbGljZSgpO2Vsc2UgaWYocD09ImFwcGxpZWQiKWk9by5zbGljZSgpO2Vsc2UgaWYocD09InJlbW92ZWQiKXt2YXIgbT17fTtmb3Iobj0wLHI9by5sZW5ndGg7bjxyO24rKyltW29bbl1dPW51bGw7dS5mb3JFYWNoKGZ1bmN0aW9uKHkpe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtLHkpfHxpLnB1c2goeSl9KX19ZWxzZSBpZihiPT0iaW5kZXgifHxiPT0ib3JpZ2luYWwiKWZvcihuPTAscj10LmFvRGF0YS5sZW5ndGg7bjxyO24rKyl0LmFvRGF0YVtuXSYmKHA9PSJub25lIj9pLnB1c2gobik6KHM9by5pbmRleE9mKG4pLChzPT09LTEmJnA9PSJyZW1vdmVkInx8cz49MCYmcD09ImFwcGxpZWQiKSYmaS5wdXNoKG4pKSk7ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciIpe3ZhciBDPXppKHQsYiwiYXNjIik7aWYocD09PSJub25lIilpPUM7ZWxzZSBmb3Iobj0wO248Qy5sZW5ndGg7bisrKXM9by5pbmRleE9mKENbbl0pLChzPT09LTEmJnA9PSJyZW1vdmVkInx8cz49MCYmcD09ImFwcGxpZWQiKSYmaS5wdXNoKENbbl0pfXJldHVybiBpfSxQbD1mdW5jdGlvbih0LGUsbil7dmFyIHIscz1mdW5jdGlvbihvKXt2YXIgdT1KYShvKSxwPXQuYW9EYXRhO2lmKHUhPT1udWxsJiYhbilyZXR1cm5bdV07aWYocnx8KHI9TXIodCxuKSksdSE9PW51bGwmJnIuaW5kZXhPZih1KSE9PS0xKXJldHVyblt1XTtpZihvPT1udWxsfHxvPT09IiIpcmV0dXJuIHI7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpcmV0dXJuIHIubWFwKGZ1bmN0aW9uKFQpe3ZhciBQPXBbVF07cmV0dXJuIG8oVCxQLl9hRGF0YSxQLm5Ucik/VDpudWxsfSk7aWYoby5ub2RlTmFtZSl7dmFyIGI9by5fRFRfUm93SW5kZXgsZz1vLl9EVF9DZWxsSW5kZXg7aWYoYiE9PXZvaWQgMClyZXR1cm4gcFtiXSYmcFtiXS5uVHI9PT1vP1tiXTpbXTtpZihnKXJldHVybiBwW2cucm93XSYmcFtnLnJvd10ublRyPT09by5wYXJlbnROb2RlP1tnLnJvd106W107dmFyIG09SChvKS5jbG9zZXN0KCIqW2RhdGEtZHQtcm93XSIpO3JldHVybiBtLmxlbmd0aD9bbS5kYXRhKCJkdC1yb3ciKV06W119aWYodHlwZW9mIG89PSJzdHJpbmciJiZvLmNoYXJBdCgwKT09PSIjIil7dmFyIEM9dC5hSWRzW28ucmVwbGFjZSgvXiMvLCIiKV07aWYoQyE9PXZvaWQgMClyZXR1cm5bQy5pZHhdfXZhciB5PXRzKGVyKHQuYW9EYXRhLHIsIm5UciIpKTtyZXR1cm4gSCh5KS5maWx0ZXIobykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX0RUX1Jvd0luZGV4fSkudG9BcnJheSgpfSxpPVZpKCJyb3ciLGUscyx0LG4pO3JldHVybihuLm9yZGVyPT09ImN1cnJlbnQifHxuLm9yZGVyPT09ImFwcGxpZWQiKSYmYnModCxpKSxpfTtJdCgicm93cygpIixmdW5jdGlvbih0LGUpe3Q9PT12b2lkIDA/dD0iIjpILmlzUGxhaW5PYmplY3QodCkmJihlPXQsdD0iIiksZT1IaShlKTt2YXIgbj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cmV0dXJuIFBsKHIsdCxlKX0sMSk7cmV0dXJuIG4uc2VsZWN0b3Iucm93cz10LG4uc2VsZWN0b3Iub3B0cz1lLG59KTtJdCgicm93cygpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hb0RhdGFbZV0ublRyfHx2b2lkIDB9LDEpfSk7SXQoInJvd3MoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInJvd3MiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVyKHQuYW9EYXRhLGUsIl9hRGF0YSIpfSwxKX0pO1F0KCJyb3dzKCkuY2FjaGUoKSIsInJvdygpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0RhdGFbbl07cmV0dXJuIHQ9PT0ic2VhcmNoIj9yLl9hRmlsdGVyRGF0YTpyLl9hU29ydERhdGF9LDEpfSk7UXQoInJvd3MoKS5pbnZhbGlkYXRlKCkiLCJyb3coKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUsbil7UnIoZSxuLHQpfSl9KTtRdCgicm93cygpLmluZGV4ZXMoKSIsInJvdygpLmluZGV4KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0sMSl9KTtRdCgicm93cygpLmlkcygpIiwicm93KCkuaWQoKSIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dGhpcy5jb250ZXh0LHI9MCxzPW4ubGVuZ3RoO3I8cztyKyspZm9yKHZhciBpPTAsbz10aGlzW3JdLmxlbmd0aDtpPG87aSsrKXt2YXIgdT1uW3JdLnJvd0lkRm4obltyXS5hb0RhdGFbdGhpc1tyXVtpXV0uX2FEYXRhKTtlLnB1c2goKHQ9PT0hMD8iIyI6IiIpK3UpfXJldHVybiBuZXcgV3QobixlKX0pO1F0KCJyb3dzKCkucmVtb3ZlKCkiLCJyb3coKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbih0LGUpe3ZhciBuPXQuYW9EYXRhLHI9bltlXSxzPXQuYWlEaXNwbGF5TWFzdGVyLmluZGV4T2YoZSk7cyE9PS0xJiZ0LmFpRGlzcGxheU1hc3Rlci5zcGxpY2UocywxKSx0Ll9pUmVjb3Jkc0Rpc3BsYXk+MCYmdC5faVJlY29yZHNEaXNwbGF5LS0sdnModCk7dmFyIGk9dC5yb3dJZEZuKHIuX2FEYXRhKTtpIT09dm9pZCAwJiZkZWxldGUgdC5hSWRzW2ldLG5bZV09bnVsbH0pLHRoaXN9KTtJdCgicm93cy5hZGQoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIpe3ZhciBzLGksbyx1PVtdO2ZvcihpPTAsbz10Lmxlbmd0aDtpPG87aSsrKXM9dFtpXSxzLm5vZGVOYW1lJiZzLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iVFIiP3UucHVzaChOaShyLHMpWzBdKTp1LnB1c2goeW4ocixzKSk7cmV0dXJuIHV9LDEpLG49dGhpcy5yb3dzKC0xKTtyZXR1cm4gbi5wb3AoKSxuLnB1c2guYXBwbHkobixlKSxufSk7SXQoInJvdygpIixmdW5jdGlvbih0LGUpe3JldHVybiBVaSh0aGlzLnJvd3ModCxlKSl9KTtJdCgicm93KCkuZGF0YSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7aWYodD09PXZvaWQgMClyZXR1cm4gZS5sZW5ndGgmJnRoaXMubGVuZ3RoJiZ0aGlzWzBdLmxlbmd0aD9lWzBdLmFvRGF0YVt0aGlzWzBdXS5fYURhdGE6dm9pZCAwO3ZhciBuPWVbMF0uYW9EYXRhW3RoaXNbMF1dO3JldHVybiBuLl9hRGF0YT10LEFycmF5LmlzQXJyYXkodCkmJm4ublRyJiZuLm5Uci5pZCYmdm4oZVswXS5yb3dJZCkodCxuLm5Uci5pZCksUnIoZVswXSx0aGlzWzBdLCJkYXRhIiksdGhpc30pO0l0KCJyb3coKS5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O2lmKHQubGVuZ3RoJiZ0aGlzLmxlbmd0aCYmdGhpc1swXS5sZW5ndGgpe3ZhciBlPXRbMF0uYW9EYXRhW3RoaXNbMF1dO2lmKGUmJmUublRyKXJldHVybiBlLm5Ucn1yZXR1cm4gbnVsbH0pO0l0KCJyb3cuYWRkKCkiLGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBIJiZ0Lmxlbmd0aCYmKHQ9dFswXSk7dmFyIGU9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4pe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iVFIiP05pKG4sdClbMF06eW4obix0KX0pO3JldHVybiB0aGlzLnJvdyhlWzBdKX0pO0goZG9jdW1lbnQpLm9uKCJwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgV3QoZSk7bi5vbigic3RhdGVTYXZlUGFyYW1zLkRUIixmdW5jdGlvbihyLHMsaSl7Zm9yKHZhciBvPXMucm93SWRGbix1PXMuYWlEaXNwbGF5TWFzdGVyLHA9W10sYj0wO2I8dS5sZW5ndGg7YisrKXt2YXIgZz11W2JdLG09cy5hb0RhdGFbZ107bS5fZGV0YWlsc1Nob3cmJnAucHVzaCgiIyIrbyhtLl9hRGF0YSkpfWkuY2hpbGRSb3dzPXB9KSxuLm9uKCJzdGF0ZUxvYWRlZC5EVCIsZnVuY3Rpb24ocixzLGkpe1hhKG4saSl9KSxYYShuLG4uc3RhdGUubG9hZGVkKCkpfSk7dmFyIFhhPWZ1bmN0aW9uKHQsZSl7ZSYmZS5jaGlsZFJvd3MmJnQucm93cyhlLmNoaWxkUm93cy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvKFteOlxcXSooPzpcXC5bXjpcXF0qKSopOi9nLCIkMVxcOiIpfSkpLmV2ZXJ5KGZ1bmN0aW9uKCl7WnQodC5zZXR0aW5ncygpWzBdLG51bGwsInJlcXVlc3RDaGlsZCIsW3RoaXNdKX0pfSxGbD1mdW5jdGlvbih0LGUsbixyKXt2YXIgcz1bXSxpPWZ1bmN0aW9uKG8sdSl7aWYoQXJyYXkuaXNBcnJheShvKXx8byBpbnN0YW5jZW9mIEgpe2Zvcih2YXIgcD0wLGI9by5sZW5ndGg7cDxiO3ArKylpKG9bcF0sdSk7cmV0dXJufWlmKG8ubm9kZU5hbWUmJm8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciIpby5zZXRBdHRyaWJ1dGUoImRhdGEtZHQtcm93IixlLmlkeCkscy5wdXNoKG8pO2Vsc2V7dmFyIGc9SCgiPHRyPjx0ZD48L3RkPjwvdHI+IikuYXR0cigiZGF0YS1kdC1yb3ciLGUuaWR4KS5hZGRDbGFzcyh1KTtIKCJ0ZCIsZykuYWRkQ2xhc3ModSkuaHRtbChvKVswXS5jb2xTcGFuPUVyKHQpLHMucHVzaChnWzBdKX19O2kobixyKSxlLl9kZXRhaWxzJiZlLl9kZXRhaWxzLmRldGFjaCgpLGUuX2RldGFpbHM9SChzKSxlLl9kZXRhaWxzU2hvdyYmZS5fZGV0YWlscy5pbnNlcnRBZnRlcihlLm5Ucil9LHdzPWJ0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24odCl7anIodFswXSl9LDUwMCksV2k9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmNvbnRleHQ7aWYobi5sZW5ndGgpe3ZhciByPW5bMF0uYW9EYXRhW2UhPT12b2lkIDA/ZTp0WzBdXTtyJiZyLl9kZXRhaWxzJiYoci5fZGV0YWlscy5yZW1vdmUoKSxyLl9kZXRhaWxzU2hvdz12b2lkIDAsci5fZGV0YWlscz12b2lkIDAsSChyLm5UcikucmVtb3ZlQ2xhc3MoImR0LWhhc0NoaWxkIiksd3MobikpfX0seHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmNvbnRleHQ7aWYobi5sZW5ndGgmJnQubGVuZ3RoKXt2YXIgcj1uWzBdLmFvRGF0YVt0WzBdXTtyLl9kZXRhaWxzJiYoci5fZGV0YWlsc1Nob3c9ZSxlPyhyLl9kZXRhaWxzLmluc2VydEFmdGVyKHIublRyKSxIKHIublRyKS5hZGRDbGFzcygiZHQtaGFzQ2hpbGQiKSk6KHIuX2RldGFpbHMuZGV0YWNoKCksSChyLm5UcikucmVtb3ZlQ2xhc3MoImR0LWhhc0NoaWxkIikpLFp0KG5bMF0sbnVsbCwiY2hpbGRSb3ciLFtlLHQucm93KHRbMF0pXSksQmwoblswXSksd3MobikpfX0sQmw9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFd0KHQpLG49Ii5kdC5EVF9kZXRhaWxzIixyPSJkcmF3IituLHM9ImNvbHVtbi1zaXppbmciK24saT0iZGVzdHJveSIrbixvPXQuYW9EYXRhO2Uub2ZmKHIrIiAiK3MrIiAiK2kpLENlKG8sIl9kZXRhaWxzIikubGVuZ3RoPjAmJihlLm9uKHIsZnVuY3Rpb24odSxwKXt0PT09cCYmZS5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmVxKDApLmVhY2goZnVuY3Rpb24oYil7dmFyIGc9b1tiXTtnLl9kZXRhaWxzU2hvdyYmZy5fZGV0YWlscy5pbnNlcnRBZnRlcihnLm5Ucil9KX0pLGUub24ocyxmdW5jdGlvbih1LHApe2lmKHQ9PT1wKWZvcih2YXIgYixnPUVyKHApLG09MCxDPW8ubGVuZ3RoO208QzttKyspYj1vW21dLGImJmIuX2RldGFpbHMmJmIuX2RldGFpbHMuZWFjaChmdW5jdGlvbigpe3ZhciB5PUgodGhpcykuY2hpbGRyZW4oInRkIik7eS5sZW5ndGg9PTEmJnkuYXR0cigiY29sc3BhbiIsZyl9KX0pLGUub24oaSxmdW5jdGlvbih1LHApe2lmKHQ9PT1wKWZvcih2YXIgYj0wLGc9by5sZW5ndGg7YjxnO2IrKylvW2JdJiZvW2JdLl9kZXRhaWxzJiZXaShlLGIpfSkpfSxObD0iIixycj1ObCsicm93KCkuY2hpbGQiLFZyPXJyKyIoKSI7SXQoVnIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQ7cmV0dXJuIHQ9PT12b2lkIDA/bi5sZW5ndGgmJnRoaXMubGVuZ3RoJiZuWzBdLmFvRGF0YVt0aGlzWzBdXT9uWzBdLmFvRGF0YVt0aGlzWzBdXS5fZGV0YWlsczp2b2lkIDA6KHQ9PT0hMD90aGlzLmNoaWxkLnNob3coKTp0PT09ITE/V2kodGhpcyk6bi5sZW5ndGgmJnRoaXMubGVuZ3RoJiZGbChuWzBdLG5bMF0uYW9EYXRhW3RoaXNbMF1dLHQsZSksdGhpcyl9KTtJdChbcnIrIi5zaG93KCkiLFZyKyIuc2hvdygpIl0sZnVuY3Rpb24oKXtyZXR1cm4geHModGhpcywhMCksdGhpc30pO0l0KFtycisiLmhpZGUoKSIsVnIrIi5oaWRlKCkiXSxmdW5jdGlvbigpe3JldHVybiB4cyh0aGlzLCExKSx0aGlzfSk7SXQoW3JyKyIucmVtb3ZlKCkiLFZyKyIucmVtb3ZlKCkiXSxmdW5jdGlvbigpe3JldHVybiBXaSh0aGlzKSx0aGlzfSk7SXQocnIrIi5pc1Nob3duKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aCYmdGhpcy5sZW5ndGgmJnRbMF0uYW9EYXRhW3RoaXNbMF1dJiZ0WzBdLmFvRGF0YVt0aGlzWzBdXS5fZGV0YWlsc1Nob3d8fCExfSk7dmFyIE9sPS9eKFteOl0rKT86KG5hbWV8dGl0bGV8dmlzSWR4fHZpc2libGUpJC8sR2k9ZnVuY3Rpb24odCxlLG4scixzLGkpe2Zvcih2YXIgbz1bXSx1PTAscD1zLmxlbmd0aDt1PHA7dSsrKW8ucHVzaChSZSh0LHNbdV0sZSxpKSk7cmV0dXJuIG99LF9zPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmFvSGVhZGVyLHM9biE9PXZvaWQgMD9uOnQuYlNvcnRDZWxsc1RvcD8wOnIubGVuZ3RoLTE7cmV0dXJuIHJbc11bZV0uY2VsbH0sRWw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zLHM9Q2Uociwic05hbWUiKSxpPUNlKHIsInNUaXRsZSIpLG89YnQudXRpbC5nZXQoIltdLltdLmNlbGwiKSh0LmFvSGVhZGVyKSx1PXhuKEFpKFtdLG8pKSxwPWZ1bmN0aW9uKGIpe3ZhciBnPUphKGIpO2lmKGI9PT0iIilyZXR1cm4gYW4oci5sZW5ndGgpO2lmKGchPT1udWxsKXJldHVybltnPj0wP2c6ci5sZW5ndGgrZ107aWYodHlwZW9mIGI9PSJmdW5jdGlvbiIpe3ZhciBtPU1yKHQsbik7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGIoaCxHaSh0LGgsMCwwLG0pLF9zKHQsaCkpP2g6bnVsbH0pfXZhciBDPXR5cGVvZiBiPT0ic3RyaW5nIj9iLm1hdGNoKE9sKToiIjtpZihDKXN3aXRjaChDWzJdKXtjYXNlInZpc0lkeCI6Y2FzZSJ2aXNpYmxlIjppZihDWzFdJiZDWzFdLm1hdGNoKC9eXGQrJC8pKXt2YXIgeT1wYXJzZUludChDWzFdLDEwKTtpZih5PDApe3ZhciBUPXIubWFwKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuYlZpc2libGU/aDpudWxsfSk7cmV0dXJuW1RbVC5sZW5ndGgreV1dfXJldHVybltJaSh0LHkpXX1yZXR1cm4gci5tYXAoZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5iVmlzaWJsZT9DWzFdP0godVtoXSkuZmlsdGVyKENbMV0pLmxlbmd0aD4wP2g6bnVsbDpoOm51bGx9KTtjYXNlIm5hbWUiOnJldHVybiBzLm1hcChmdW5jdGlvbihsLGgpe3JldHVybiBsPT09Q1sxXT9oOm51bGx9KTtjYXNlInRpdGxlIjpyZXR1cm4gaS5tYXAoZnVuY3Rpb24obCxoKXtyZXR1cm4gbD09PUNbMV0/aDpudWxsfSk7ZGVmYXVsdDpyZXR1cm5bXX1pZihiLm5vZGVOYW1lJiZiLl9EVF9DZWxsSW5kZXgpcmV0dXJuW2IuX0RUX0NlbGxJbmRleC5jb2x1bW5dO3ZhciBQPUgodSkuZmlsdGVyKGIpLm1hcChmdW5jdGlvbigpe3JldHVybiBCaSh0aGlzKX0pLnRvQXJyYXkoKTtpZihQLmxlbmd0aHx8IWIubm9kZU5hbWUpcmV0dXJuIFA7dmFyIGM9SChiKS5jbG9zZXN0KCIqW2RhdGEtZHQtY29sdW1uXSIpO3JldHVybiBjLmxlbmd0aD9bYy5kYXRhKCJkdC1jb2x1bW4iKV06W119O3JldHVybiBWaSgiY29sdW1uIixlLHAsdCxuKX0sUmw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zLHM9cltlXSxpPXQuYW9EYXRhLG8sdSxwLGI7aWYobj09PXZvaWQgMClyZXR1cm4gcy5iVmlzaWJsZTtpZihzLmJWaXNpYmxlPT09bilyZXR1cm4hMTtpZihuKXt2YXIgZz1DZShyLCJiVmlzaWJsZSIpLmluZGV4T2YoITAsZSsxKTtmb3IodT0wLHA9aS5sZW5ndGg7dTxwO3UrKylpW3VdJiYoYj1pW3VdLm5UcixvPWlbdV0uYW5DZWxscyxiJiZiLmluc2VydEJlZm9yZShvW2VdLG9bZ118fG51bGwpKX1lbHNlIEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLGUpKS5kZXRhY2goKTtyZXR1cm4gcy5iVmlzaWJsZT1uLGhzKHQpLCEwfTtJdCgiY29sdW1ucygpIixmdW5jdGlvbih0LGUpe3Q9PT12b2lkIDA/dD0iIjpILmlzUGxhaW5PYmplY3QodCkmJihlPXQsdD0iIiksZT1IaShlKTt2YXIgbj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cmV0dXJuIEVsKHIsdCxlKX0sMSk7cmV0dXJuIG4uc2VsZWN0b3IuY29scz10LG4uc2VsZWN0b3Iub3B0cz1lLG59KTtRdCgiY29sdW1ucygpLmhlYWRlcigpIiwiY29sdW1uKCkuaGVhZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7cmV0dXJuIF9zKGUsbix0KX0sMSl9KTtRdCgiY29sdW1ucygpLmZvb3RlcigpIiwiY29sdW1uKCkuZm9vdGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0Zvb3RlcjtyZXR1cm4gci5sZW5ndGg/ZS5hb0Zvb3Rlclt0IT09dm9pZCAwP3Q6MF1bbl0uY2VsbDpudWxsfSwxKX0pO1F0KCJjb2x1bW5zKCkuZGF0YSgpIiwiY29sdW1uKCkuZGF0YSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsR2ksMSl9KTtRdCgiY29sdW1ucygpLnJlbmRlcigpIiwiY29sdW1uKCkucmVuZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxuLHIscyxpKXtyZXR1cm4gR2koZSxuLHIscyxpLHQpfSwxKX0pO1F0KCJjb2x1bW5zKCkuZGF0YVNyYygpIiwiY29sdW1uKCkuZGF0YVNyYygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdLm1EYXRhfSwxKX0pO1F0KCJjb2x1bW5zKCkuY2FjaGUoKSIsImNvbHVtbigpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxuLHIscyxpKXtyZXR1cm4gZXIoZS5hb0RhdGEsaSx0PT09InNlYXJjaCI/Il9hRmlsdGVyRGF0YSI6Il9hU29ydERhdGEiLG4pfSwxKX0pO1F0KCJjb2x1bW5zKCkuaW5pdCgpIiwiY29sdW1uKCkuaW5pdCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdfSwxKX0pO1F0KCJjb2x1bW5zKCkubm9kZXMoKSIsImNvbHVtbigpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixmdW5jdGlvbih0LGUsbixyLHMpe3JldHVybiBlcih0LmFvRGF0YSxzLCJhbkNlbGxzIixlKX0sMSl9KTtRdCgiY29sdW1ucygpLnRpdGxlcygpIiwiY29sdW1uKCkudGl0bGUoKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihuLHIpe3R5cGVvZiB0PT0ibnVtYmVyIiYmKGU9dCx0PXZvaWQgMCk7dmFyIHM9SCgic3Bhbi5kdC1jb2x1bW4tdGl0bGUiLHRoaXMuY29sdW1uKHIpLmhlYWRlcihlKSk7cmV0dXJuIHQhPT12b2lkIDA/KHMuaHRtbCh0KSx0aGlzKTpzLmh0bWwoKX0sMSl9KTtRdCgiY29sdW1ucygpLnR5cGVzKCkiLCJjb2x1bW4oKS50eXBlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odCxlKXt2YXIgbj10LmFvQ29sdW1uc1tlXS5zVHlwZTtyZXR1cm4gbnx8RmkodCksbn0sMSl9KTtRdCgiY29sdW1ucygpLnZpc2libGUoKSIsImNvbHVtbigpLnZpc2libGUoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9W10scz10aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGksbyl7aWYodD09PXZvaWQgMClyZXR1cm4gaS5hb0NvbHVtbnNbb10uYlZpc2libGU7UmwoaSxvLHQpJiZyLnB1c2gobyl9KTtyZXR1cm4gdCE9PXZvaWQgMCYmdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGkpe0lyKGksaS5hb0hlYWRlciksSXIoaSxpLmFvRm9vdGVyKSxpLmFpRGlzcGxheS5sZW5ndGh8fEgoaS5uVEJvZHkpLmZpbmQoInRkW2NvbHNwYW5dIikuYXR0cigiY29sc3BhbiIsRXIoaSkpLGpyKGkpLG4uaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24obyx1KXtyLmluY2x1ZGVzKHUpJiZadChvLG51bGwsImNvbHVtbi12aXNpYmlsaXR5Iixbbyx1LHQsZV0pfSksci5sZW5ndGgmJihlPT09dm9pZCAwfHxlKSYmbi5jb2x1bW5zLmFkanVzdCgpfSksc30pO1F0KCJjb2x1bW5zKCkud2lkdGhzKCkiLCJjb2x1bW4oKS53aWR0aCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29sdW1ucygiOnZpc2libGUiKS5jb3VudCgpLGU9SCgiPHRyPiIpLmh0bWwoIjx0ZD4iK0FycmF5KHQpLmpvaW4oIjwvdGQ+PHRkPiIpKyI8L3RkPiIpO0godGhpcy50YWJsZSgpLmJvZHkoKSkuYXBwZW5kKGUpO3ZhciBuPWUuY2hpbGRyZW4oKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gSCh0aGlzKS5vdXRlcldpZHRoKCl9KTtyZXR1cm4gZS5yZW1vdmUoKSx0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHIscyl7dmFyIGk9bnIocixzKTtyZXR1cm4gaSE9PW51bGw/bltpXTowfSwxKX0pO1F0KCJjb2x1bW5zKCkuaW5kZXhlcygpIiwiY29sdW1uKCkuaW5kZXgoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxuKXtyZXR1cm4gdD09PSJ2aXNpYmxlIj9ucihlLG4pOm59LDEpfSk7SXQoImNvbHVtbnMuYWRqdXN0KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtPcih0KX0sMSl9KTtJdCgiY29sdW1uLmluZGV4KCkiLGZ1bmN0aW9uKHQsZSl7aWYodGhpcy5jb250ZXh0Lmxlbmd0aCE9PTApe3ZhciBuPXRoaXMuY29udGV4dFswXTtpZih0PT09ImZyb21WaXNpYmxlInx8dD09PSJ0b0RhdGEiKXJldHVybiBJaShuLGUpO2lmKHQ9PT0iZnJvbURhdGEifHx0PT09InRvVmlzaWJsZSIpcmV0dXJuIG5yKG4sZSl9fSk7SXQoImNvbHVtbigpIixmdW5jdGlvbih0LGUpe3JldHVybiBVaSh0aGlzLmNvbHVtbnModCxlKSl9KTt2YXIgTGw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9EYXRhLHM9TXIodCxuKSxpPXRzKGVyKHIscywiYW5DZWxscyIpKSxvPUgoQWkoW10saSkpLHUscD10LmFvQ29sdW1ucy5sZW5ndGgsYixnLG0sQyx5LFQsUD1mdW5jdGlvbihjKXt2YXIgbD10eXBlb2YgYz09ImZ1bmN0aW9uIjtpZihjPT1udWxsfHxsKXtmb3IoYj1bXSxnPTAsbT1zLmxlbmd0aDtnPG07ZysrKWZvcih1PXNbZ10sQz0wO0M8cDtDKyspeT17cm93OnUsY29sdW1uOkN9LGw/KFQ9clt1XSxjKHksUmUodCx1LEMpLFQuYW5DZWxscz9ULmFuQ2VsbHNbQ106bnVsbCkmJmIucHVzaCh5KSk6Yi5wdXNoKHkpO3JldHVybiBifWlmKEguaXNQbGFpbk9iamVjdChjKSlyZXR1cm4gYy5jb2x1bW4hPT12b2lkIDAmJmMucm93IT09dm9pZCAwJiZzLmluZGV4T2YoYy5yb3cpIT09LTE/W2NdOltdO3ZhciBoPW8uZmlsdGVyKGMpLm1hcChmdW5jdGlvbihfLEYpe3JldHVybntyb3c6Ri5fRFRfQ2VsbEluZGV4LnJvdyxjb2x1bW46Ri5fRFRfQ2VsbEluZGV4LmNvbHVtbn19KS50b0FycmF5KCk7cmV0dXJuIGgubGVuZ3RofHwhYy5ub2RlTmFtZT9oOihUPUgoYykuY2xvc2VzdCgiKltkYXRhLWR0LXJvd10iKSxULmxlbmd0aD9be3JvdzpULmRhdGEoImR0LXJvdyIpLGNvbHVtbjpULmRhdGEoImR0LWNvbHVtbiIpfV06W10pfTtyZXR1cm4gVmkoImNlbGwiLGUsUCx0LG4pfTtJdCgiY2VsbHMoKSIsZnVuY3Rpb24odCxlLG4pe2lmKEguaXNQbGFpbk9iamVjdCh0KSYmKHQucm93PT09dm9pZCAwPyhuPXQsdD1udWxsKToobj1lLGU9bnVsbCkpLEguaXNQbGFpbk9iamVjdChlKSYmKG49ZSxlPW51bGwpLGU9PW51bGwpcmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihDKXtyZXR1cm4gTGwoQyx0LEhpKG4pKX0pO3ZhciByPW4/e3BhZ2U6bi5wYWdlLG9yZGVyOm4ub3JkZXIsc2VhcmNoOm4uc2VhcmNofTp7fSxzPXRoaXMuY29sdW1ucyhlLHIpLGk9dGhpcy5yb3dzKHQsciksbyx1LHAsYixnPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihDLHkpe3ZhciBUPVtdO2ZvcihvPTAsdT1pW3ldLmxlbmd0aDtvPHU7bysrKWZvcihwPTAsYj1zW3ldLmxlbmd0aDtwPGI7cCsrKVQucHVzaCh7cm93OmlbeV1bb10sY29sdW1uOnNbeV1bcF19KTtyZXR1cm4gVH0sMSksbT1uJiZuLnNlbGVjdGVkP3RoaXMuY2VsbHMoZyxuKTpnO3JldHVybiBILmV4dGVuZChtLnNlbGVjdG9yLHtjb2xzOmUscm93czp0LG9wdHM6bn0pLG19KTtRdCgiY2VsbHMoKS5ub2RlcygpIiwiY2VsbCgpLm5vZGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9EYXRhW2VdO3JldHVybiByJiZyLmFuQ2VsbHM/ci5hbkNlbGxzW25dOnZvaWQgMH0sMSl9KTtJdCgiY2VsbHMoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUmUodCxlLG4pfSwxKX0pO1F0KCJjZWxscygpLmNhY2hlKCkiLCJjZWxsKCkuY2FjaGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9dD09PSJzZWFyY2giPyJfYUZpbHRlckRhdGEiOiJfYVNvcnREYXRhIix0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLG4scil7cmV0dXJuIGUuYW9EYXRhW25dW3RdW3JdfSwxKX0pO1F0KCJjZWxscygpLnJlbmRlcigpIiwiY2VsbCgpLnJlbmRlcigpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiBSZShlLG4scix0KX0sMSl9KTtRdCgiY2VsbHMoKS5pbmRleGVzKCkiLCJjZWxsKCkuaW5kZXgoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLG4pe3JldHVybntyb3c6ZSxjb2x1bW46bixjb2x1bW5WaXNpYmxlOm5yKHQsbil9fSwxKX0pO1F0KCJjZWxscygpLmludmFsaWRhdGUoKSIsImNlbGwoKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLG4scil7UnIoZSxuLHQscil9KX0pO0l0KCJjZWxsKCkiLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVWkodGhpcy5jZWxscyh0LGUsbikpfSk7SXQoImNlbGwoKS5kYXRhKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dCxuPXRoaXNbMF07cmV0dXJuIHQ9PT12b2lkIDA/ZS5sZW5ndGgmJm4ubGVuZ3RoP1JlKGVbMF0sblswXS5yb3csblswXS5jb2x1bW4pOnZvaWQgMDoob2woZVswXSxuWzBdLnJvdyxuWzBdLmNvbHVtbix0KSxScihlWzBdLG5bMF0ucm93LCJkYXRhIixuWzBdLmNvbHVtbiksdGhpcyl9KTtJdCgib3JkZXIoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQscj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0PT09dm9pZCAwP24ubGVuZ3RoIT09MD9uWzBdLmFhU29ydGluZzp2b2lkIDA6KHR5cGVvZiB0PT0ibnVtYmVyIj90PVtbdCxlXV06ci5sZW5ndGg+MSYmKHQ9ciksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHMpe3MuYWFTb3J0aW5nPUFycmF5LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9KSl9KTtJdCgib3JkZXIubGlzdGVuZXIoKSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cHMocix0LHt9LGUsbil9KX0pO0l0KCJvcmRlci5maXhlZCgpIixmdW5jdGlvbih0KXtpZighdCl7dmFyIGU9dGhpcy5jb250ZXh0LG49ZS5sZW5ndGg/ZVswXS5hYVNvcnRpbmdGaXhlZDp2b2lkIDA7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/e3ByZTpufTpufXJldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7ci5hYVNvcnRpbmdGaXhlZD1ILmV4dGVuZCghMCx7fSx0KX0pfSk7SXQoWyJjb2x1bW5zKCkub3JkZXIoKSIsImNvbHVtbigpLm9yZGVyKCkiXSxmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0P3RoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuLHIpe24uYWFTb3J0aW5nPWVbcl0ubWFwKGZ1bmN0aW9uKHMpe3JldHVybltzLHRdfSl9KTp0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKG4scil7Zm9yKHZhciBzPXpyKG4pLGk9MCxvPXMubGVuZ3RoO2k8bztpKyspaWYoc1tpXS5jb2w9PT1yKXJldHVybiBzW2ldLmRpcjtyZXR1cm4gbnVsbH0sMSl9KTtRdCgiY29sdW1ucygpLm9yZGVyYWJsZSgpIiwiY29sdW1uKCkub3JkZXJhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0NvbHVtbnNbbl07cmV0dXJuIHQ/ci5hc1NvcnRpbmc6ci5iU29ydGFibGV9LDEpfSk7SXQoInByb2Nlc3NpbmcoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtrZShlLHQpfSl9KTtJdCgic2VhcmNoKCkiLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMuY29udGV4dDtyZXR1cm4gdD09PXZvaWQgMD9zLmxlbmd0aCE9PTA/c1swXS5vUHJldmlvdXNTZWFyY2guc2VhcmNoOnZvaWQgMDp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oaSl7aS5vRmVhdHVyZXMuYkZpbHRlciYmKHR5cGVvZiBlPT0ib2JqZWN0Ij90cihpLEguZXh0ZW5kKGkub1ByZXZpb3VzU2VhcmNoLGUse3NlYXJjaDp0fSkpOnRyKGksSC5leHRlbmQoaS5vUHJldmlvdXNTZWFyY2gse3NlYXJjaDp0LHJlZ2V4OmU9PT1udWxsPyExOmUsc21hcnQ6bj09PW51bGw/ITA6bixjYXNlSW5zZW5zaXRpdmU6cj09PW51bGw/ITA6cn0pKSl9KX0pO0l0KCJzZWFyY2guZml4ZWQoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLml0ZXJhdG9yKCEwLCJ0YWJsZSIsZnVuY3Rpb24ocil7dmFyIHM9ci5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBzW3RdO2U9PT1udWxsP2RlbGV0ZSBzW3RdOnNbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhzKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP25bMF06bn0pO1F0KCJjb2x1bW5zKCkuc2VhcmNoKCkiLCJjb2x1bW4oKS5zZWFyY2goKSIsZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24ocyxpKXt2YXIgbz1zLmFvUHJlU2VhcmNoQ29scztpZih0PT09dm9pZCAwKXJldHVybiBvW2ldLnNlYXJjaDtzLm9GZWF0dXJlcy5iRmlsdGVyJiYodHlwZW9mIGU9PSJvYmplY3QiP0guZXh0ZW5kKG9baV0sZSx7c2VhcmNoOnR9KTpILmV4dGVuZChvW2ldLHtzZWFyY2g6dCxyZWdleDplPT09bnVsbD8hMTplLHNtYXJ0Om49PT1udWxsPyEwOm4sY2FzZUluc2Vuc2l0aXZlOnI9PT1udWxsPyEwOnJ9KSx0cihzLHMub1ByZXZpb3VzU2VhcmNoKSl9KX0pO0l0KFsiY29sdW1ucygpLnNlYXJjaC5maXhlZCgpIiwiY29sdW1uKCkuc2VhcmNoLmZpeGVkKCkiXSxmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuaXRlcmF0b3IoITAsImNvbHVtbiIsZnVuY3Rpb24ocixzKXt2YXIgaT1yLmFvQ29sdW1uc1tzXS5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBpW3RdO2U9PT1udWxsP2RlbGV0ZSBpW3RdOmlbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhpKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP25bMF06bn0pO0l0KCJzdGF0ZSgpIixmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLmNvbnRleHQubGVuZ3RoP3RoaXMuY29udGV4dFswXS5vU2F2ZWRTdGF0ZTpudWxsO3ZhciBuPUguZXh0ZW5kKCEwLHt9LHQpO3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7ZSE9PSExJiYobi50aW1lPStuZXcgRGF0ZSsxMDApLGtpKHIsbixmdW5jdGlvbigpe30pfSl9KTtJdCgic3RhdGUuY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3QuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQse30pfSl9KTtJdCgic3RhdGUubG9hZGVkKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGg/dGhpcy5jb250ZXh0WzBdLm9Mb2FkZWRTdGF0ZTpudWxsfSk7SXQoInN0YXRlLnNhdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe2pyKHQpfSl9KTtidC51c2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdD09InN0cmluZyI/ZTp0LHI9dHlwZW9mIGU9PSJzdHJpbmciP2U6dDtpZihuPT09dm9pZCAwJiZ0eXBlb2Ygcj09InN0cmluZyIpc3dpdGNoKHIpe2Nhc2UibGliIjpjYXNlImpxIjpyZXR1cm4gSDtjYXNlIndpbiI6cmV0dXJuIHdpbmRvdztjYXNlImRhdGV0aW1lIjpyZXR1cm4gYnQuRGF0ZVRpbWU7Y2FzZSJsdXhvbiI6cmV0dXJuIGRuO2Nhc2UibW9tZW50IjpyZXR1cm4gd247ZGVmYXVsdDpyZXR1cm4gbnVsbH1yPT09ImxpYiJ8fHI9PT0ianEifHxuJiZuLmZuJiZuLmZuLmpxdWVyeT9IPW46cj09IndpbiJ8fG4mJm4uZG9jdW1lbnQ/KHdpbmRvdz1uLGRvY3VtZW50PW4uZG9jdW1lbnQpOnI9PT0iZGF0ZXRpbWUifHxuJiZuLnR5cGU9PT0iRGF0ZVRpbWUiP2J0LkRhdGVUaW1lPW46cj09PSJsdXhvbiJ8fG4mJm4uRml4ZWRPZmZzZXRab25lP2RuPW46KHI9PT0ibW9tZW50Inx8biYmbi5pc01vbWVudCkmJih3bj1uKX07YnQuZmFjdG9yeT1mdW5jdGlvbih0LGUpe3ZhciBuPSExO3JldHVybiB0JiZ0LmRvY3VtZW50JiYod2luZG93PXQsZG9jdW1lbnQ9dC5kb2N1bWVudCksZSYmZS5mbiYmZS5mbi5qcXVlcnkmJihIPWUsbj0hMCksbn07YnQudmVyc2lvbkNoZWNrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWU/ZS5zcGxpdCgiLiIpOmJ0LnZlcnNpb24uc3BsaXQoIi4iKSxyPXQuc3BsaXQoIi4iKSxzLGksbz0wLHU9ci5sZW5ndGg7bzx1O28rKylpZihzPXBhcnNlSW50KG5bb10sMTApfHwwLGk9cGFyc2VJbnQocltvXSwxMCl8fDAscyE9PWkpcmV0dXJuIHM+aTtyZXR1cm4hMH07YnQuaXNEYXRhVGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9SCh0KS5nZXQoMCksbj0hMTtyZXR1cm4gdCBpbnN0YW5jZW9mIGJ0LkFwaT8hMDooSC5lYWNoKGJ0LnNldHRpbmdzLGZ1bmN0aW9uKHIscyl7dmFyIGk9cy5uU2Nyb2xsSGVhZD9IKCJ0YWJsZSIscy5uU2Nyb2xsSGVhZClbMF06bnVsbCxvPXMublNjcm9sbEZvb3Q/SCgidGFibGUiLHMublNjcm9sbEZvb3QpWzBdOm51bGw7KHMublRhYmxlPT09ZXx8aT09PWV8fG89PT1lKSYmKG49ITApfSksbil9O2J0LnRhYmxlcz1mdW5jdGlvbih0KXt2YXIgZT0hMTtILmlzUGxhaW5PYmplY3QodCkmJihlPXQuYXBpLHQ9dC52aXNpYmxlKTt2YXIgbj1idC5zZXR0aW5ncy5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuISEoIXR8fHQmJkgoci5uVGFibGUpLmlzKCI6dmlzaWJsZSIpKX0pLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5uVGFibGV9KTtyZXR1cm4gZT9uZXcgV3Qobik6bn07YnQuY2FtZWxUb0h1bmdhcmlhbj1zbjtJdCgiJCgpIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucm93cyhlKS5ub2RlcygpLHI9SChuKTtyZXR1cm4gSChbXS5jb25jYXQoci5maWx0ZXIodCkudG9BcnJheSgpLHIuZmluZCh0KS50b0FycmF5KCkpKX0pO0guZWFjaChbIm9uIiwib25lIiwib2ZmIl0sZnVuY3Rpb24odCxlKXtJdChlKyIoKSIsZnVuY3Rpb24oKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO25bMF09blswXS5zcGxpdCgvXHMvKS5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuIHMubWF0Y2goL1wuZHRcYi8pP3M6cysiLmR0In0pLmpvaW4oIiAiKTt2YXIgcj1IKHRoaXMudGFibGVzKCkubm9kZXMoKSk7cmV0dXJuIHJbZV0uYXBwbHkocixuKSx0aGlzfSl9KTtJdCgiY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe09pKHQpfSl9KTtJdCgiZXJyb3IoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtPZShlLDAsdCl9KX0pO0l0KCJzZXR0aW5ncygpIixmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHRoaXMuY29udGV4dCl9KTtJdCgiaW5pdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGg/dFswXS5vSW5pdDpudWxsfSk7SXQoImRhdGEoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3JldHVybiBDZSh0LmFvRGF0YSwiX2FEYXRhIil9KS5mbGF0dGVuKCl9KTtJdCgidHJpZ2dlcigpIixmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyKXtyZXR1cm4gWnQocixudWxsLHQsZSxuKX0pLmZsYXR0ZW4oKX0pO0l0KCJyZWFkeSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIHQ/dGhpcy50YWJsZXMoKS5ldmVyeShmdW5jdGlvbigpe3RoaXMuY29udGV4dFswXS5fYkluaXRDb21wbGV0ZT90LmNhbGwodGhpcyk6dGhpcy5vbigiaW5pdCIsZnVuY3Rpb24oKXt0LmNhbGwodGhpcyl9KX0pOmUubGVuZ3RoP2VbMF0uX2JJbml0Q29tcGxldGV8fCExOm51bGx9KTtJdCgiZGVzdHJveSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD10fHwhMSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7dmFyIG49ZS5vQ2xhc3NlcyxyPWUublRhYmxlLHM9ZS5uVEJvZHksaT1lLm5USGVhZCxvPWUublRGb290LHU9SChyKSxwPUgocyksYj1IKGUublRhYmxlV3JhcHBlciksZz1lLmFvRGF0YS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGM/Yy5uVHI6bnVsbH0pLG09bi5vcmRlcjtlLmJEZXN0cm95aW5nPSEwLFp0KGUsImFvRGVzdHJveUNhbGxiYWNrIiwiZGVzdHJveSIsW2VdLCEwKSx0fHxuZXcgV3QoZSkuY29sdW1ucygpLnZpc2libGUoITApLGIub2ZmKCIuRFQiKS5maW5kKCI6bm90KHRib2R5ICopIikub2ZmKCIuRFQiKSxIKHdpbmRvdykub2ZmKCIuRFQtIitlLnNJbnN0YW5jZSksciE9aS5wYXJlbnROb2RlJiYodS5jaGlsZHJlbigidGhlYWQiKS5kZXRhY2goKSx1LmFwcGVuZChpKSksbyYmciE9by5wYXJlbnROb2RlJiYodS5jaGlsZHJlbigidGZvb3QiKS5kZXRhY2goKSx1LmFwcGVuZChvKSksZS5jb2xncm91cC5yZW1vdmUoKSxlLmFhU29ydGluZz1bXSxlLmFhU29ydGluZ0ZpeGVkPVtdLFRpKGUpLEgoInRoLCB0ZCIsaSkucmVtb3ZlQ2xhc3MobS5jYW5Bc2MrIiAiK20uY2FuRGVzYysiICIrbS5pc0FzYysiICIrbS5pc0Rlc2MpLmNzcygid2lkdGgiLCIiKSxwLmNoaWxkcmVuKCkuZGV0YWNoKCkscC5hcHBlbmQoZyk7dmFyIEM9ZS5uVGFibGVXcmFwcGVyLnBhcmVudE5vZGUseT1lLm5UYWJsZVdyYXBwZXIubmV4dFNpYmxpbmcsVD10PyJyZW1vdmUiOiJkZXRhY2giO3VbVF0oKSxiW1RdKCksIXQmJkMmJihDLmluc2VydEJlZm9yZShyLHkpLHUuY3NzKCJ3aWR0aCIsZS5zRGVzdHJveVdpZHRoKS5yZW1vdmVDbGFzcyhuLnRhYmxlKSk7dmFyIFA9YnQuc2V0dGluZ3MuaW5kZXhPZihlKTtQIT09LTEmJmJ0LnNldHRpbmdzLnNwbGljZShQLDEpfSl9KTtILmVhY2goWyJjb2x1bW4iLCJyb3ciLCJjZWxsIl0sZnVuY3Rpb24odCxlKXtJdChlKyJzKCkuZXZlcnkoKSIsZnVuY3Rpb24obil7dmFyIHI9dGhpcy5zZWxlY3Rvci5vcHRzLHM9dGhpcyxpLG89MDtyZXR1cm4gdGhpcy5pdGVyYXRvcigiZXZlcnkiLGZ1bmN0aW9uKHUscCxiKXtpPXNbZV0ocCxyKSxlPT09ImNlbGwiP24uY2FsbChpLGlbMF1bMF0ucm93LGlbMF1bMF0uY29sdW1uLGIsbyk6bi5jYWxsKGkscCxiLG8pLG8rK30pfSl9KTtJdCgiaTE4bigpIixmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5jb250ZXh0WzBdLHM9RW4odCkoci5vTGFuZ3VhZ2UpO3JldHVybiBzPT09dm9pZCAwJiYocz1lKSxILmlzUGxhaW5PYmplY3QocykmJihzPW4hPT12b2lkIDAmJnNbbl0hPT12b2lkIDA/c1tuXTpzLl8pLHR5cGVvZiBzPT0ic3RyaW5nIj9zLnJlcGxhY2UoIiVkIixuKTpzfSk7YnQudmVyc2lvbj0iMi4xLjYiO2J0LnNldHRpbmdzPVtdO2J0Lm1vZGVscz17fTtidC5tb2RlbHMub1NlYXJjaD17Y2FzZUluc2Vuc2l0aXZlOiEwLHNlYXJjaDoiIixyZWdleDohMSxzbWFydDohMCxyZXR1cm46ITF9O2J0Lm1vZGVscy5vUm93PXtuVHI6bnVsbCxhbkNlbGxzOm51bGwsX2FEYXRhOltdLF9hU29ydERhdGE6bnVsbCxfYUZpbHRlckRhdGE6bnVsbCxfc0ZpbHRlclJvdzpudWxsLHNyYzpudWxsLGlkeDotMSxkaXNwbGF5RGF0YTpudWxsfTtidC5tb2RlbHMub0NvbHVtbj17aWR4Om51bGwsYURhdGFTb3J0Om51bGwsYXNTb3J0aW5nOm51bGwsYlNlYXJjaGFibGU6bnVsbCxiU29ydGFibGU6bnVsbCxiVmlzaWJsZTpudWxsLF9zTWFudWFsVHlwZTpudWxsLF9iQXR0clNyYzohMSxmbkNyZWF0ZWRDZWxsOm51bGwsZm5HZXREYXRhOm51bGwsZm5TZXREYXRhOm51bGwsbURhdGE6bnVsbCxtUmVuZGVyOm51bGwsc0NsYXNzOm51bGwsc0NvbnRlbnRQYWRkaW5nOm51bGwsc0RlZmF1bHRDb250ZW50Om51bGwsc05hbWU6bnVsbCxzU29ydERhdGFUeXBlOiJzdGQiLHNTb3J0aW5nQ2xhc3M6bnVsbCxzVGl0bGU6bnVsbCxzVHlwZTpudWxsLHNXaWR0aDpudWxsLHNXaWR0aE9yaWc6bnVsbCxtYXhMZW5TdHJpbmc6bnVsbCxzZWFyY2hGaXhlZDpudWxsfTtidC5kZWZhdWx0cz17YWFEYXRhOm51bGwsYWFTb3J0aW5nOltbMCwiYXNjIl1dLGFhU29ydGluZ0ZpeGVkOltdLGFqYXg6bnVsbCxhTGVuZ3RoTWVudTpbMTAsMjUsNTAsMTAwXSxhb0NvbHVtbnM6bnVsbCxhb0NvbHVtbkRlZnM6bnVsbCxhb1NlYXJjaENvbHM6W10sYkF1dG9XaWR0aDohMCxiRGVmZXJSZW5kZXI6ITAsYkRlc3Ryb3k6ITEsYkZpbHRlcjohMCxiSW5mbzohMCxiTGVuZ3RoQ2hhbmdlOiEwLGJQYWdpbmF0ZTohMCxiUHJvY2Vzc2luZzohMSxiUmV0cmlldmU6ITEsYlNjcm9sbENvbGxhcHNlOiExLGJTZXJ2ZXJTaWRlOiExLGJTb3J0OiEwLGJTb3J0TXVsdGk6ITAsYlNvcnRDZWxsc1RvcDpudWxsLGJTb3J0Q2xhc3NlczohMCxiU3RhdGVTYXZlOiExLGZuQ3JlYXRlZFJvdzpudWxsLGZuRHJhd0NhbGxiYWNrOm51bGwsZm5Gb290ZXJDYWxsYmFjazpudWxsLGZuRm9ybWF0TnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyx0aGlzLm9MYW5ndWFnZS5zVGhvdXNhbmRzKX0sZm5IZWFkZXJDYWxsYmFjazpudWxsLGZuSW5mb0NhbGxiYWNrOm51bGwsZm5Jbml0Q29tcGxldGU6bnVsbCxmblByZURyYXdDYWxsYmFjazpudWxsLGZuUm93Q2FsbGJhY2s6bnVsbCxmblN0YXRlTG9hZENhbGxiYWNrOmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gSlNPTi5wYXJzZSgodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuZ2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSkpfWNhdGNoe3JldHVybnt9fX0sZm5TdGF0ZUxvYWRQYXJhbXM6bnVsbCxmblN0YXRlTG9hZGVkOm51bGwsZm5TdGF0ZVNhdmVDYWxsYmFjazpmdW5jdGlvbih0LGUpe3RyeXsodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuc2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSxKU09OLnN0cmluZ2lmeShlKSl9Y2F0Y2h7fX0sZm5TdGF0ZVNhdmVQYXJhbXM6bnVsbCxpU3RhdGVEdXJhdGlvbjo3MjAwLGlEaXNwbGF5TGVuZ3RoOjEwLGlEaXNwbGF5U3RhcnQ6MCxpVGFiSW5kZXg6MCxvQ2xhc3Nlczp7fSxvTGFuZ3VhZ2U6e29BcmlhOntvcmRlcmFibGU6IjogQWN0aXZhdGUgdG8gc29ydCIsb3JkZXJhYmxlUmV2ZXJzZToiOiBBY3RpdmF0ZSB0byBpbnZlcnQgc29ydGluZyIsb3JkZXJhYmxlUmVtb3ZlOiI6IEFjdGl2YXRlIHRvIHJlbW92ZSBzb3J0aW5nIixwYWdpbmF0ZTp7Zmlyc3Q6IkZpcnN0IixsYXN0OiJMYXN0IixuZXh0OiJOZXh0IixwcmV2aW91czoiUHJldmlvdXMiLG51bWJlcjoiIn19LG9QYWdpbmF0ZTp7c0ZpcnN0OiJceEFCIixzTGFzdDoiXHhCQiIsc05leHQ6Ilx1MjAzQSIsc1ByZXZpb3VzOiJcdTIwMzkifSxlbnRyaWVzOntfOiJlbnRyaWVzIiwxOiJlbnRyeSJ9LHNFbXB0eVRhYmxlOiJObyBkYXRhIGF2YWlsYWJsZSBpbiB0YWJsZSIsc0luZm86IlNob3dpbmcgX1NUQVJUXyB0byBfRU5EXyBvZiBfVE9UQUxfIF9FTlRSSUVTLVRPVEFMXyIsc0luZm9FbXB0eToiU2hvd2luZyAwIHRvIDAgb2YgMCBfRU5UUklFUy1UT1RBTF8iLHNJbmZvRmlsdGVyZWQ6IihmaWx0ZXJlZCBmcm9tIF9NQVhfIHRvdGFsIF9FTlRSSUVTLU1BWF8pIixzSW5mb1Bvc3RGaXg6IiIsc0RlY2ltYWw6IiIsc1Rob3VzYW5kczoiLCIsc0xlbmd0aE1lbnU6Il9NRU5VXyBfRU5UUklFU18gcGVyIHBhZ2UiLHNMb2FkaW5nUmVjb3JkczoiTG9hZGluZy4uLiIsc1Byb2Nlc3Npbmc6IiIsc1NlYXJjaDoiU2VhcmNoOiIsc1NlYXJjaFBsYWNlaG9sZGVyOiIiLHNVcmw6IiIsc1plcm9SZWNvcmRzOiJObyBtYXRjaGluZyByZWNvcmRzIGZvdW5kIn0sb3JkZXJEZXNjUmV2ZXJzZTohMCxvU2VhcmNoOkguZXh0ZW5kKHt9LGJ0Lm1vZGVscy5vU2VhcmNoKSxsYXlvdXQ6e3RvcFN0YXJ0OiJwYWdlTGVuZ3RoIix0b3BFbmQ6InNlYXJjaCIsYm90dG9tU3RhcnQ6ImluZm8iLGJvdHRvbUVuZDoicGFnaW5nIn0sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiIiLHNTY3JvbGxYOiIiLHNTY3JvbGxYSW5uZXI6IiIsc1Njcm9sbFk6IiIsc1NlcnZlck1ldGhvZDoiR0VUIixyZW5kZXJlcjpudWxsLHJvd0lkOiJEVF9Sb3dJZCIsY2FwdGlvbjpudWxsLGlEZWZlckxvYWRpbmc6bnVsbH07TnIoYnQuZGVmYXVsdHMpO2J0LmRlZmF1bHRzLmNvbHVtbj17YURhdGFTb3J0Om51bGwsaURhdGFTb3J0Oi0xLGFyaWFUaXRsZToiIixhc1NvcnRpbmc6WyJhc2MiLCJkZXNjIiwiIl0sYlNlYXJjaGFibGU6ITAsYlNvcnRhYmxlOiEwLGJWaXNpYmxlOiEwLGZuQ3JlYXRlZENlbGw6bnVsbCxtRGF0YTpudWxsLG1SZW5kZXI6bnVsbCxzQ2VsbFR5cGU6InRkIixzQ2xhc3M6IiIsc0NvbnRlbnRQYWRkaW5nOiIiLHNEZWZhdWx0Q29udGVudDpudWxsLHNOYW1lOiIiLHNTb3J0RGF0YVR5cGU6InN0ZCIsc1RpdGxlOm51bGwsc1R5cGU6bnVsbCxzV2lkdGg6bnVsbH07TnIoYnQuZGVmYXVsdHMuY29sdW1uKTtidC5tb2RlbHMub1NldHRpbmdzPXtvRmVhdHVyZXM6e2JBdXRvV2lkdGg6bnVsbCxiRGVmZXJSZW5kZXI6bnVsbCxiRmlsdGVyOm51bGwsYkluZm86ITAsYkxlbmd0aENoYW5nZTohMCxiUGFnaW5hdGU6bnVsbCxiUHJvY2Vzc2luZzpudWxsLGJTZXJ2ZXJTaWRlOm51bGwsYlNvcnQ6bnVsbCxiU29ydE11bHRpOm51bGwsYlNvcnRDbGFzc2VzOm51bGwsYlN0YXRlU2F2ZTpudWxsfSxvU2Nyb2xsOntiQ29sbGFwc2U6bnVsbCxpQmFyV2lkdGg6MCxzWDpudWxsLHNYSW5uZXI6bnVsbCxzWTpudWxsfSxvTGFuZ3VhZ2U6e2ZuSW5mb0NhbGxiYWNrOm51bGx9LG9Ccm93c2VyOntiU2Nyb2xsYmFyTGVmdDohMSxiYXJXaWR0aDowfSxhamF4Om51bGwsYWFuRmVhdHVyZXM6W10sYW9EYXRhOltdLGFpRGlzcGxheTpbXSxhaURpc3BsYXlNYXN0ZXI6W10sYUlkczp7fSxhb0NvbHVtbnM6W10sYW9IZWFkZXI6W10sYW9Gb290ZXI6W10sb1ByZXZpb3VzU2VhcmNoOnt9LHNlYXJjaEZpeGVkOnt9LGFvUHJlU2VhcmNoQ29sczpbXSxhYVNvcnRpbmc6bnVsbCxhYVNvcnRpbmdGaXhlZDpbXSxzRGVzdHJveVdpZHRoOjAsYW9Sb3dDYWxsYmFjazpbXSxhb0hlYWRlckNhbGxiYWNrOltdLGFvRm9vdGVyQ2FsbGJhY2s6W10sYW9EcmF3Q2FsbGJhY2s6W10sYW9Sb3dDcmVhdGVkQ2FsbGJhY2s6W10sYW9QcmVEcmF3Q2FsbGJhY2s6W10sYW9Jbml0Q29tcGxldGU6W10sYW9TdGF0ZVNhdmVQYXJhbXM6W10sYW9TdGF0ZUxvYWRQYXJhbXM6W10sYW9TdGF0ZUxvYWRlZDpbXSxzVGFibGVJZDoiIixuVGFibGU6bnVsbCxuVEhlYWQ6bnVsbCxuVEZvb3Q6bnVsbCxuVEJvZHk6bnVsbCxuVGFibGVXcmFwcGVyOm51bGwsYkluaXRpYWxpc2VkOiExLGFvT3BlblJvd3M6W10sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiJ0d29fYnV0dG9uIixwYWdpbmdDb250cm9sczowLGlTdGF0ZUR1cmF0aW9uOjAsYW9TdGF0ZVNhdmU6W10sYW9TdGF0ZUxvYWQ6W10sb1NhdmVkU3RhdGU6bnVsbCxvTG9hZGVkU3RhdGU6bnVsbCxiQWpheERhdGFHZXQ6ITAsanFYSFI6bnVsbCxqc29uOnZvaWQgMCxvQWpheERhdGE6dm9pZCAwLHNTZXJ2ZXJNZXRob2Q6bnVsbCxmbkZvcm1hdE51bWJlcjpudWxsLGFMZW5ndGhNZW51Om51bGwsaURyYXc6MCxiRHJhd2luZzohMSxpRHJhd0Vycm9yOi0xLF9pRGlzcGxheUxlbmd0aDoxMCxfaURpc3BsYXlTdGFydDowLF9pUmVjb3Jkc1RvdGFsOjAsX2lSZWNvcmRzRGlzcGxheTowLG9DbGFzc2VzOnt9LGJGaWx0ZXJlZDohMSxiU29ydGVkOiExLGJTb3J0Q2VsbHNUb3A6bnVsbCxvSW5pdDpudWxsLGFvRGVzdHJveUNhbGxiYWNrOltdLGZuUmVjb3Jkc1RvdGFsOmZ1bmN0aW9uKCl7cmV0dXJuIEVlKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc1RvdGFsKjE6dGhpcy5haURpc3BsYXlNYXN0ZXIubGVuZ3RofSxmblJlY29yZHNEaXNwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIEVlKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc0Rpc3BsYXkqMTp0aGlzLmFpRGlzcGxheS5sZW5ndGh9LGZuRGlzcGxheUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2lEaXNwbGF5TGVuZ3RoLGU9dGhpcy5faURpc3BsYXlTdGFydCxuPWUrdCxyPXRoaXMuYWlEaXNwbGF5Lmxlbmd0aCxzPXRoaXMub0ZlYXR1cmVzLGk9cy5iUGFnaW5hdGU7cmV0dXJuIHMuYlNlcnZlclNpZGU/aT09PSExfHx0PT09LTE/ZStyOk1hdGgubWluKGUrdCx0aGlzLl9pUmVjb3Jkc0Rpc3BsYXkpOiFpfHxuPnJ8fHQ9PT0tMT9yOm59LG9JbnN0YW5jZTpudWxsLHNJbnN0YW5jZTpudWxsLGlUYWJJbmRleDowLG5TY3JvbGxIZWFkOm51bGwsblNjcm9sbEZvb3Q6bnVsbCxhTGFzdFNvcnQ6W10sb1BsdWdpbnM6e30scm93SWRGbjpudWxsLHJvd0lkOm51bGwsY2FwdGlvbjoiIixjYXB0aW9uTm9kZTpudWxsLGNvbGdyb3VwOm51bGwsZGVmZXJMb2FkaW5nOm51bGwsdHlwZURldGVjdDohMH07dmFyIHpsPWJ0LmV4dC5wYWdlcjtILmV4dGVuZCh6bCx7c2ltcGxlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmV2aW91cyIsIm5leHQiXX0sZnVsbDpmdW5jdGlvbigpe3JldHVyblsiZmlyc3QiLCJwcmV2aW91cyIsIm5leHQiLCJsYXN0Il19LG51bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bIm51bWJlcnMiXX0sc2ltcGxlX251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiXX0sZnVsbF9udW1iZXJzOmZ1bmN0aW9uKCl7cmV0dXJuWyJmaXJzdCIsInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiLCJsYXN0Il19LGZpcnN0X2xhc3Q6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibGFzdCJdfSxmaXJzdF9sYXN0X251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibnVtYmVycyIsImxhc3QiXX0sX251bWJlcnM6U3MsbnVtYmVyc19sZW5ndGg6N30pO0guZXh0ZW5kKCEwLGJ0LmV4dC5yZW5kZXJlcix7cGFnaW5nQnV0dG9uOntfOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9dC5vQ2xhc3Nlcy5wYWdpbmcsbz1baS5idXR0b25dLHU7cmV0dXJuIHImJm8ucHVzaChpLmFjdGl2ZSkscyYmby5wdXNoKGkuZGlzYWJsZWQpLGU9PT0iZWxsaXBzaXMiP3U9SCgnPHNwYW4gY2xhc3M9ImVsbGlwc2lzIj48L3NwYW4+JykuaHRtbChuKVswXTp1PUgoIjxidXR0b24+Iix7Y2xhc3M6by5qb2luKCIgIikscm9sZToibGluayIsdHlwZToiYnV0dG9uIn0pLmh0bWwobikse2Rpc3BsYXk6dSxjbGlja2VyOnV9fX0scGFnaW5nQ29udGFpbmVyOntfOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9fX0pO3ZhciBpcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gSGUobil8fHR5cGVvZiBuIT0ic3RyaW5nInx8KG49bi5yZXBsYWNlKEpvLCIgIiksdCYmKG49Z24obikpLGUmJihuPURyKG4sITEpKSksbn19O2Z1bmN0aW9uIFlhKHQsZSxuLHIscyl7cmV0dXJuIHduP3RbZV0ocyk6ZG4/dFtuXShzKTpyP3Rbcl0ocyk6dH12YXIgJGE9ITEsZG4sd247ZnVuY3Rpb24gamwoKXt3aW5kb3cubHV4b24mJiFkbiYmKGRuPXdpbmRvdy5sdXhvbiksd2luZG93Lm1vbWVudCYmIXduJiYod249d2luZG93Lm1vbWVudCl9ZnVuY3Rpb24gQnIodCxlLG4pe3ZhciByO2lmKGpsKCksd24pe2lmKHI9d24udXRjKHQsZSxuLCEwKSwhci5pc1ZhbGlkKCkpcmV0dXJuIG51bGx9ZWxzZSBpZihkbil7aWYocj1lJiZ0eXBlb2YgdD09InN0cmluZyI/ZG4uRGF0ZVRpbWUuZnJvbUZvcm1hdCh0LGUpOmRuLkRhdGVUaW1lLmZyb21JU08odCksIXIuaXNWYWxpZClyZXR1cm4gbnVsbDtyLnNldExvY2FsZShuKX1lbHNlIGU/KCRhfHxhbGVydCgiRGF0YVRhYmxlcyB3YXJuaW5nOiBGb3JtYXR0ZWQgZGF0ZSB3aXRob3V0IE1vbWVudC5qcyBvciBMdXhvbiAtIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vMTciKSwkYT0hMCk6cj1uZXcgRGF0ZSh0KTtyZXR1cm4gcn1mdW5jdGlvbiBnaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIscyl7YXJndW1lbnRzLmxlbmd0aD09PTA/KHI9ImVuIixuPW51bGwsZT1udWxsKTphcmd1bWVudHMubGVuZ3RoPT09MT8ocj0iZW4iLG49ZSxlPW51bGwpOmFyZ3VtZW50cy5sZW5ndGg9PT0yJiYocj1uLG49ZSxlPW51bGwpO3ZhciBpPSJkYXRldGltZSIrKG4/Ii0iK246IiIpO3JldHVybiBidC5leHQudHlwZS5vcmRlcltpXXx8YnQudHlwZShpLHtkZXRlY3Q6ZnVuY3Rpb24obyl7cmV0dXJuIG89PT1pP2k6ITF9LG9yZGVyOntwcmU6ZnVuY3Rpb24obyl7cmV0dXJuIG8udmFsdWVPZigpfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KSxmdW5jdGlvbihvLHUpe2lmKG89PW51bGwpaWYocz09PSItLW5vdyIpe3ZhciBwPW5ldyBEYXRlO289bmV3IERhdGUoRGF0ZS5VVEMocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSxwLmdldERhdGUoKSxwLmdldEhvdXJzKCkscC5nZXRNaW51dGVzKCkscC5nZXRTZWNvbmRzKCkpKX1lbHNlIG89IiI7aWYodT09PSJ0eXBlIilyZXR1cm4gaTtpZihvPT09IiIpcmV0dXJuIHUhPT0ic29ydCI/IiI6QnIoIjAwMDAtMDEtMDEgMDA6MDA6MDAiLG51bGwscik7aWYobiE9PW51bGwmJmU9PT1uJiZ1IT09InNvcnQiJiZ1IT09InR5cGUiJiYhKG8gaW5zdGFuY2VvZiBEYXRlKSlyZXR1cm4gbzt2YXIgYj1CcihvLGUscik7aWYoYj09PW51bGwpcmV0dXJuIG87aWYodT09PSJzb3J0IilyZXR1cm4gYjt2YXIgZz1uPT09bnVsbD9ZYShiLCJ0b0RhdGUiLCJ0b0pTRGF0ZSIsIiIpW3RdKCk6WWEoYiwiZm9ybWF0IiwidG9Gb3JtYXQiLCJ0b0lTT1N0cmluZyIsbik7cmV0dXJuIHU9PT0iZGlzcGxheSI/Tm4oZyk6Z319fXZhciBDcz0iLCIsVHM9Ii4iO2lmKHdpbmRvdy5JbnRsIT09dm9pZCAwKXRyeXtmb3IoQm49bmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0VG9QYXJ0cygxMDAwMDAuMSksTmU9MDtOZTxCbi5sZW5ndGg7TmUrKylCbltOZV0udHlwZT09PSJncm91cCI/Q3M9Qm5bTmVdLnZhbHVlOkJuW05lXS50eXBlPT09ImRlY2ltYWwiJiYoVHM9Qm5bTmVdLnZhbHVlKX1jYXRjaHt9dmFyIEJuLE5lO2J0LmRhdGV0aW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG49ImRhdGV0aW1lLSIrdDtlfHwoZT0iZW4iKSxidC5leHQudHlwZS5vcmRlcltuXXx8YnQudHlwZShuLHtkZXRlY3Q6ZnVuY3Rpb24ocil7dmFyIHM9QnIocix0LGUpO3JldHVybiByPT09IiJ8fHM/bjohMX0sb3JkZXI6e3ByZTpmdW5jdGlvbihyKXtyZXR1cm4gQnIocix0LGUpfHwwfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KX07YnQucmVuZGVyPXtkYXRlOmdpKCJ0b0xvY2FsZURhdGVTdHJpbmciKSxkYXRldGltZTpnaSgidG9Mb2NhbGVTdHJpbmciKSx0aW1lOmdpKCJ0b0xvY2FsZVRpbWVTdHJpbmciKSxudW1iZXI6ZnVuY3Rpb24odCxlLG4scixzKXtyZXR1cm4gdD09bnVsbCYmKHQ9Q3MpLGU9PW51bGwmJihlPVRzKSx7ZGlzcGxheTpmdW5jdGlvbihpKXtpZih0eXBlb2YgaSE9Im51bWJlciImJnR5cGVvZiBpIT0ic3RyaW5nInx8aT09PSIifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgbz1pPDA/Ii0iOiIiLHU9cGFyc2VGbG9hdChpKSxwPU1hdGguYWJzKHUpO2lmKHA+PTFlMTF8fHA8MWUtNCYmcCE9PTApe3ZhciBiPXUudG9FeHBvbmVudGlhbChuKS5zcGxpdCgvZVwrPy8pO3JldHVybiBiWzBdKyIgeCAxMDxzdXA+IitiWzFdKyI8L3N1cD4ifWlmKGlzTmFOKHUpKXJldHVybiBObihpKTt1PXUudG9GaXhlZChuKSxpPU1hdGguYWJzKHUpO3ZhciBnPXBhcnNlSW50KGksMTApLG09bj9lKyhpLWcpLnRvRml4ZWQobikuc3Vic3RyaW5nKDIpOiIiO3JldHVybiBnPT09MCYmcGFyc2VGbG9hdChtKT09PTAmJihvPSIiKSxvKyhyfHwiIikrZy50b1N0cmluZygpLnJlcGxhY2UoL1xCKD89KFxkezN9KSsoPyFcZCkpL2csdCkrbSsoc3x8IiIpfX19LHRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZGlzcGxheTpObixmaWx0ZXI6Tm59fX07dmFyIG1lPWJ0LmV4dC50eXBlO2J0LnR5cGU9ZnVuY3Rpb24odCxlLG4pe2lmKCFlKXJldHVybntjbGFzc05hbWU6bWUuY2xhc3NOYW1lW3RdLGRldGVjdDptZS5kZXRlY3QuZmluZChmdW5jdGlvbihvKXtyZXR1cm4gby5uYW1lPT09dH0pLG9yZGVyOntwcmU6bWUub3JkZXJbdCsiLXByZSJdLGFzYzptZS5vcmRlclt0KyItYXNjIl0sZGVzYzptZS5vcmRlclt0KyItZGVzYyJdfSxyZW5kZXI6bWUucmVuZGVyW3RdLHNlYXJjaDptZS5zZWFyY2hbdF19O3ZhciByPWZ1bmN0aW9uKG8sdSl7bWVbb11bdF09dX0scz1mdW5jdGlvbihvKXtPYmplY3QuZGVmaW5lUHJvcGVydHkobywibmFtZSIse3ZhbHVlOnR9KTt2YXIgdT1tZS5kZXRlY3QuZmluZEluZGV4KGZ1bmN0aW9uKHApe3JldHVybiBwLm5hbWU9PT10fSk7dT09PS0xP21lLmRldGVjdC51bnNoaWZ0KG8pOm1lLmRldGVjdC5zcGxpY2UodSwxLG8pfSxpPWZ1bmN0aW9uKG8pe21lLm9yZGVyW3QrIi1wcmUiXT1vLnByZSxtZS5vcmRlclt0KyItYXNjIl09by5hc2MsbWUub3JkZXJbdCsiLWRlc2MiXT1vLmRlc2N9O249PT12b2lkIDAmJihuPWUsZT1udWxsKSxlPT09ImNsYXNzTmFtZSI/cigiY2xhc3NOYW1lIixuKTplPT09ImRldGVjdCI/cyhuKTplPT09Im9yZGVyIj9pKG4pOmU9PT0icmVuZGVyIj9yKCJyZW5kZXIiLG4pOmU9PT0ic2VhcmNoIj9yKCJzZWFyY2giLG4pOmV8fChuLmNsYXNzTmFtZSYmcigiY2xhc3NOYW1lIixuLmNsYXNzTmFtZSksbi5kZXRlY3QhPT12b2lkIDAmJnMobi5kZXRlY3QpLG4ub3JkZXImJmkobi5vcmRlciksbi5yZW5kZXIhPT12b2lkIDAmJnIoInJlbmRlciIsbi5yZW5kZXIpLG4uc2VhcmNoIT09dm9pZCAwJiZyKCJzZWFyY2giLG4uc2VhcmNoKSl9O2J0LnR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG1lLmRldGVjdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZX0pfTt2YXIgWmE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxlPWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLHQubG9jYWxlQ29tcGFyZShlLG5hdmlnYXRvci5sYW5ndWFnZXNbMF18fG5hdmlnYXRvci5sYW5ndWFnZSx7bnVtZXJpYzohMCxpZ25vcmVQdW5jdHVhdGlvbjohMH0pfTtidC50eXBlKCJzdHJpbmciLHtkZXRlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4ic3RyaW5nIn0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXtyZXR1cm4gSGUodCkmJnR5cGVvZiB0IT0iYm9vbGVhbiI/IiI6dHlwZW9mIHQ9PSJzdHJpbmciP3QudG9Mb3dlckNhc2UoKTp0LnRvU3RyaW5nP3QudG9TdHJpbmcoKToiIn19LHNlYXJjaDppcighMSwhMCl9KTtidC50eXBlKCJzdHJpbmctdXRmOCIse2RldGVjdDp7YWxsT2Y6ZnVuY3Rpb24odCl7cmV0dXJuITB9LG9uZU9mOmZ1bmN0aW9uKHQpe3JldHVybiFIZSh0KSYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmdHlwZW9mIHQ9PSJzdHJpbmciJiZ0Lm1hdGNoKC9bXlx4MDAtXHg3Rl0vKX19LG9yZGVyOnthc2M6WmEsZGVzYzpmdW5jdGlvbih0LGUpe3JldHVybiBaYSh0LGUpKi0xfX0sc2VhcmNoOmlyKCExLCEwKX0pO2J0LnR5cGUoImh0bWwiLHtkZXRlY3Q6e2FsbE9mOmZ1bmN0aW9uKHQpe3JldHVybiBIZSh0KXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoIjwiKSE9PS0xfSxvbmVPZjpmdW5jdGlvbih0KXtyZXR1cm4hSGUodCkmJnR5cGVvZiB0PT0ic3RyaW5nIiYmdC5pbmRleE9mKCI8IikhPT0tMX19LG9yZGVyOntwcmU6ZnVuY3Rpb24odCl7cmV0dXJuIEhlKHQpPyIiOnQucmVwbGFjZT9nbih0KS50cmltKCkudG9Mb3dlckNhc2UoKTp0KyIifX0sc2VhcmNoOmlyKCEwLCEwKX0pO2J0LnR5cGUoImRhdGUiLHtjbGFzc05hbWU6ImR0LXR5cGUtZGF0ZSIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0KXtpZih0JiYhKHQgaW5zdGFuY2VvZiBEYXRlKSYmIXphLnRlc3QodCkpcmV0dXJuIG51bGw7dmFyIGU9RGF0ZS5wYXJzZSh0KTtyZXR1cm4gZSE9PW51bGwmJiFpc05hTihlKXx8SGUodCl9LG9uZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ6YS50ZXN0KHQpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXt2YXIgZT1EYXRlLnBhcnNlKHQpO3JldHVybiBpc05hTihlKT8tMS8wOmV9fX0pO2J0LnR5cGUoImh0bWwtbnVtLWZtdCIse2NsYXNzTmFtZToiZHQtdHlwZS1udW1lcmljIixkZXRlY3Q6e2FsbE9mOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFNyKHQsbiwhMCwhMSl9LG9uZU9mOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFNyKHQsbiwhMCwhMSl9fSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIEhyKHQsbixTaSxEaSl9fSxzZWFyY2g6aXIoITAsITApfSk7YnQudHlwZSgiaHRtbC1udW0iLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBTcih0LG4sITEsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBTcih0LG4sITEsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4sU2kpfX0sc2VhcmNoOmlyKCEwLCEwKX0pO2J0LnR5cGUoIm51bS1mbXQiLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITAsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITAsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4sRGkpfX19KTtidC50eXBlKCJudW0iLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITEsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITEsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4pfX19KTt2YXIgSHI9ZnVuY3Rpb24odCxlLG4scil7aWYodCE9PTAmJighdHx8dD09PSItIikpcmV0dXJuLTEvMDt2YXIgcz10eXBlb2YgdDtyZXR1cm4gcz09PSJudW1iZXIifHxzPT09ImJpZ2ludCI/dDooZSYmKHQ9UWEodCxlKSksdC5yZXBsYWNlJiYobiYmKHQ9dC5yZXBsYWNlKG4sIiIpKSxyJiYodD10LnJlcGxhY2UociwiIikpKSx0KjEpfTtILmV4dGVuZCghMCxidC5leHQucmVuZGVyZXIse2Zvb3Rlcjp7XzpmdW5jdGlvbih0LGUsbil7ZS5hZGRDbGFzcyhuLnRmb290LmNlbGwpfX0saGVhZGVyOntfOmZ1bmN0aW9uKHQsZSxuKXtlLmFkZENsYXNzKG4udGhlYWQuY2VsbCksdC5vRmVhdHVyZXMuYlNvcnR8fGUuYWRkQ2xhc3Mobi5vcmRlci5ub25lKTt2YXIgcj10LmJTb3J0Q2VsbHNUb3Ascz1lLmNsb3Nlc3QoInRoZWFkIikuZmluZCgidHIiKSxpPWUucGFyZW50KCkuaW5kZXgoKTtlLmF0dHIoImRhdGEtZHQtb3JkZXIiKT09PSJkaXNhYmxlInx8ZS5wYXJlbnQoKS5hdHRyKCJkYXRhLWR0LW9yZGVyIik9PT0iZGlzYWJsZSJ8fHI9PT0hMCYmaSE9PTB8fHI9PT0hMSYmaSE9PXMubGVuZ3RoLTF8fEgodC5uVGFibGUpLm9uKCJvcmRlci5kdC5EVCBjb2x1bW4tdmlzaWJpbGl0eS5kdC5EVCIsZnVuY3Rpb24obyx1KXtpZih0PT09dSl7dmFyIHA9dS5zb3J0RGV0YWlscztpZihwKXt2YXIgYixnPW4ub3JkZXIsbT11LmFwaS5jb2x1bW5zKGUpLEM9dC5hb0NvbHVtbnNbbS5mbGF0dGVuKClbMF1dLHk9bS5vcmRlcmFibGUoKS5pbmNsdWRlcyghMCksVD0iIixQPW0uaW5kZXhlcygpLGM9bS5vcmRlcmFibGUoITApLmZsYXR0ZW4oKSxsPUNlKHAsImNvbCIpO2UucmVtb3ZlQ2xhc3MoZy5pc0FzYysiICIrZy5pc0Rlc2MpLnRvZ2dsZUNsYXNzKGcubm9uZSwheSkudG9nZ2xlQ2xhc3MoZy5jYW5Bc2MseSYmYy5pbmNsdWRlcygiYXNjIikpLnRvZ2dsZUNsYXNzKGcuY2FuRGVzYyx5JiZjLmluY2x1ZGVzKCJkZXNjIikpO3ZhciBoPSEwO2ZvcihiPTA7YjxQLmxlbmd0aDtiKyspbC5pbmNsdWRlcyhQW2JdKXx8KGg9ITEpO2lmKGgpe3ZhciBfPW0ub3JkZXIoKTtlLmFkZENsYXNzKF8uaW5jbHVkZXMoImFzYyIpP2cuaXNBc2M6IiIrXy5pbmNsdWRlcygiZGVzYyIpP2cuaXNEZXNjOiIiKX12YXIgRj0tMTtmb3IoYj0wO2I8bC5sZW5ndGg7YisrKWlmKHQuYW9Db2x1bW5zW2xbYl1dLmJWaXNpYmxlKXtGPWxbYl07YnJlYWt9aWYoUFswXT09Ril7dmFyIE89cFswXSxmPUMuYXNTb3J0aW5nO2UuYXR0cigiYXJpYS1zb3J0IixPLmRpcj09PSJhc2MiPyJhc2NlbmRpbmciOiJkZXNjZW5kaW5nIiksVD1mW08uaW5kZXgrMV0/IlJldmVyc2UiOiJSZW1vdmUifWVsc2UgZS5yZW1vdmVBdHRyKCJhcmlhLXNvcnQiKTtlLmF0dHIoImFyaWEtbGFiZWwiLHk/Qy5hcmlhVGl0bGUrdS5hcGkuaTE4bigib0FyaWEub3JkZXJhYmxlIitUKTpDLmFyaWFUaXRsZSkseSYmKGUuZmluZCgiLmR0LWNvbHVtbi10aXRsZSIpLmF0dHIoInJvbGUiLCJidXR0b24iKSxlLmF0dHIoInRhYmluZGV4IiwwKSl9fX0pfX0sbGF5b3V0OntfOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10Lm9DbGFzc2VzLmxheW91dCxzPUgoIjxkaXYvPiIpLmF0dHIoImlkIixuLmlkfHxudWxsKS5hZGRDbGFzcyhuLmNsYXNzTmFtZXx8ci5yb3cpLmFwcGVuZFRvKGUpO0guZWFjaChuLGZ1bmN0aW9uKGksbyl7aWYoIShpPT09ImlkInx8aT09PSJjbGFzc05hbWUiKSl7dmFyIHU9IiI7by50YWJsZSYmKHMuYWRkQ2xhc3Moci50YWJsZVJvdyksdSs9ci50YWJsZUNlbGwrIiAiKSxpPT09InN0YXJ0Ij91Kz1yLnN0YXJ0Omk9PT0iZW5kIj91Kz1yLmVuZDp1Kz1yLmZ1bGwsSCgiPGRpdi8+IikuYXR0cih7aWQ6by5pZHx8bnVsbCxjbGFzczpvLmNsYXNzTmFtZT9vLmNsYXNzTmFtZTpyLmNlbGwrIiAiK3V9KS5hcHBlbmQoby5jb250ZW50cykuYXBwZW5kVG8ocyl9fSl9fX0pO2J0LmZlYXR1cmU9e307YnQuZmVhdHVyZS5yZWdpc3Rlcj1mdW5jdGlvbih0LGUsbil7YnQuZXh0LmZlYXR1cmVzW3RdPWUsbiYmbGUuZmVhdHVyZS5wdXNoKHtjRmVhdHVyZTpuLGZuSW5pdDplfSl9O2Z1bmN0aW9uIENyKHQsZSxuKXtuJiYodFtlXT1uKX1idC5mZWF0dXJlLnJlZ2lzdGVyKCJkaXYiLGZ1bmN0aW9uKHQsZSl7dmFyIG49SCgiPGRpdj4iKVswXTtyZXR1cm4gZSYmKENyKG4sImNsYXNzTmFtZSIsZS5jbGFzc05hbWUpLENyKG4sImlkIixlLmlkKSxDcihuLCJpbm5lckhUTUwiLGUuaHRtbCksQ3IobiwidGV4dENvbnRlbnQiLGUudGV4dCkpLG59KTtidC5mZWF0dXJlLnJlZ2lzdGVyKCJpbmZvIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iSW5mbylyZXR1cm4gbnVsbDt2YXIgbj10Lm9MYW5ndWFnZSxyPXQuc1RhYmxlSWQscz1IKCI8ZGl2Lz4iLHtjbGFzczp0Lm9DbGFzc2VzLmluZm8uY29udGFpbmVyfSk7cmV0dXJuIGU9SC5leHRlbmQoe2NhbGxiYWNrOm4uZm5JbmZvQ2FsbGJhY2ssZW1wdHk6bi5zSW5mb0VtcHR5LHBvc3RmaXg6bi5zSW5mb1Bvc3RGaXgsc2VhcmNoOm4uc0luZm9GaWx0ZXJlZCx0ZXh0Om4uc0luZm99LGUpLHQuYW9EcmF3Q2FsbGJhY2sucHVzaChmdW5jdGlvbihpKXtNbChpLGUscyl9KSx0Ll9pbmZvRWx8fChzLmF0dHIoeyJhcmlhLWxpdmUiOiJwb2xpdGUiLGlkOnIrIl9pbmZvIixyb2xlOiJzdGF0dXMifSksSCh0Lm5UYWJsZSkuYXR0cigiYXJpYS1kZXNjcmliZWRieSIscisiX2luZm8iKSx0Ll9pbmZvRWw9cyksc30sImkiKTtmdW5jdGlvbiBNbCh0LGUsbil7dmFyIHI9dC5faURpc3BsYXlTdGFydCsxLHM9dC5mbkRpc3BsYXlFbmQoKSxpPXQuZm5SZWNvcmRzVG90YWwoKSxvPXQuZm5SZWNvcmRzRGlzcGxheSgpLHU9bz9lLnRleHQ6ZS5lbXB0eTtvIT09aSYmKHUrPSIgIitlLnNlYXJjaCksdSs9ZS5wb3N0Zml4LHU9amkodCx1KSxlLmNhbGxiYWNrJiYodT1lLmNhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxyLHMsaSxvLHUpKSxuLmh0bWwodSksWnQodCxudWxsLCJpbmZvIixbdCxuWzBdLHVdKX12YXIgeWk9MDtidC5mZWF0dXJlLnJlZ2lzdGVyKCJzZWFyY2giLGZ1bmN0aW9uKHQsZSl7aWYoIXQub0ZlYXR1cmVzLmJGaWx0ZXIpcmV0dXJuIG51bGw7dmFyIG49dC5vQ2xhc3Nlcy5zZWFyY2gscj10LnNUYWJsZUlkLHM9dC5vTGFuZ3VhZ2UsaT10Lm9QcmV2aW91c1NlYXJjaCxvPSc8aW5wdXQgdHlwZT0ic2VhcmNoIiBjbGFzcz0iJytuLmlucHV0KyciLz4nO2U9SC5leHRlbmQoe3BsYWNlaG9sZGVyOnMuc1NlYXJjaFBsYWNlaG9sZGVyLHByb2Nlc3Npbmc6ITEsdGV4dDpzLnNTZWFyY2h9LGUpLGUudGV4dC5pbmRleE9mKCJfSU5QVVRfIik9PT0tMSYmKGUudGV4dCs9Il9JTlBVVF8iKSxlLnRleHQ9amkodCxlLnRleHQpO3ZhciB1PWUudGV4dC5tYXRjaCgvX0lOUFVUXyQvKSxwPWUudGV4dC5tYXRjaCgvXl9JTlBVVF8vKSxiPWUudGV4dC5yZXBsYWNlKC9fSU5QVVRfLywiIiksZz0iPGxhYmVsPiIrZS50ZXh0KyI8L2xhYmVsPiI7cD9nPSJfSU5QVVRfPGxhYmVsPiIrYisiPC9sYWJlbD4iOnUmJihnPSI8bGFiZWw+IitiKyI8L2xhYmVsPl9JTlBVVF8iKTt2YXIgbT1IKCI8ZGl2PiIpLmFkZENsYXNzKG4uY29udGFpbmVyKS5hcHBlbmQoZy5yZXBsYWNlKC9fSU5QVVRfLyxvKSk7bS5maW5kKCJsYWJlbCIpLmF0dHIoImZvciIsImR0LXNlYXJjaC0iK3lpKSxtLmZpbmQoImlucHV0IikuYXR0cigiaWQiLCJkdC1zZWFyY2gtIit5aSkseWkrKzt2YXIgQz1mdW5jdGlvbihQKXt2YXIgYz10aGlzLnZhbHVlO2kucmV0dXJuJiZQLmtleSE9PSJFbnRlciJ8fGMhPWkuc2VhcmNoJiZ1cyh0LGUucHJvY2Vzc2luZyxmdW5jdGlvbigpe2kuc2VhcmNoPWMsdHIodCxpKSx0Ll9pRGlzcGxheVN0YXJ0PTAsTG4odCl9KX0seT10LnNlYXJjaERlbGF5IT09bnVsbD90LnNlYXJjaERlbGF5OjAsVD1IKCJpbnB1dCIsbSkudmFsKGkuc2VhcmNoKS5hdHRyKCJwbGFjZWhvbGRlciIsZS5wbGFjZWhvbGRlcikub24oImtleXVwLkRUIHNlYXJjaC5EVCBpbnB1dC5EVCBwYXN0ZS5EVCBjdXQuRFQiLHk/YnQudXRpbC5kZWJvdW5jZShDLHkpOkMpLm9uKCJtb3VzZXVwLkRUIixmdW5jdGlvbihQKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5jYWxsKFRbMF0sUCl9LDEwKX0pLm9uKCJrZXlwcmVzcy5EVCIsZnVuY3Rpb24oUCl7aWYoUC5rZXlDb2RlPT0xMylyZXR1cm4hMX0pLmF0dHIoImFyaWEtY29udHJvbHMiLHIpO3JldHVybiBIKHQublRhYmxlKS5vbigic2VhcmNoLmR0LkRUIixmdW5jdGlvbihQLGMpe3Q9PT1jJiZUWzBdIT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmVC52YWwodHlwZW9mIGkuc2VhcmNoIT0iZnVuY3Rpb24iP2kuc2VhcmNoOiIiKX0pLG19LCJmIik7YnQuZmVhdHVyZS5yZWdpc3RlcigicGFnaW5nIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iUGFnaW5hdGUpcmV0dXJuIG51bGw7ZT1ILmV4dGVuZCh7YnV0dG9uczpidC5leHQucGFnZXIubnVtYmVyc19sZW5ndGgsdHlwZTp0LnNQYWdpbmF0aW9uVHlwZSxib3VuZGFyeU51bWJlcnM6ITAsZmlyc3RMYXN0OiEwLHByZXZpb3VzTmV4dDohMCxudW1iZXJzOiEwfSxlKTt2YXIgbj1IKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0Lm9DbGFzc2VzLnBhZ2luZy5jb250YWluZXIrKGUudHlwZT8iIHBhZ2luZ18iK2UudHlwZToiIikpLmFwcGVuZChIKCI8bmF2PiIpLmF0dHIoImFyaWEtbGFiZWwiLCJwYWdpbmF0aW9uIikuYWRkQ2xhc3ModC5vQ2xhc3Nlcy5wYWdpbmcubmF2KSkscj1mdW5jdGlvbigpe2tzKHQsbi5jaGlsZHJlbigpLGUpfTtyZXR1cm4gdC5hb0RyYXdDYWxsYmFjay5wdXNoKHIpLEgodC5uVGFibGUpLm9uKCJjb2x1bW4tc2l6aW5nLmR0LkRUIixyKSxufSwicCIpO2Z1bmN0aW9uIFZsKHQpe3ZhciBlPVtdO3JldHVybiB0Lm51bWJlcnMmJmUucHVzaCgibnVtYmVycyIpLHQucHJldmlvdXNOZXh0JiYoZS51bnNoaWZ0KCJwcmV2aW91cyIpLGUucHVzaCgibmV4dCIpKSx0LmZpcnN0TGFzdCYmKGUudW5zaGlmdCgiZmlyc3QiKSxlLnB1c2goImxhc3QiKSksZX1mdW5jdGlvbiBrcyh0LGUsbil7aWYodC5fYkluaXRDb21wbGV0ZSl7Zm9yKHZhciByPW4udHlwZT9idC5leHQucGFnZXJbbi50eXBlXTpWbCxzPXQub0xhbmd1YWdlLm9BcmlhLnBhZ2luYXRlfHx7fSxpPXQuX2lEaXNwbGF5U3RhcnQsbz10Ll9pRGlzcGxheUxlbmd0aCx1PXQuZm5SZWNvcmRzRGlzcGxheSgpLHA9bz09PS0xLGI9cD8wOk1hdGguY2VpbChpL28pLGc9cD8xOk1hdGguY2VpbCh1L28pLG09cihuKS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEY9PT0ibnVtYmVycyI/U3MoYixnLG4uYnV0dG9ucyxuLmJvdW5kYXJ5TnVtYmVycyk6Rn0pLmZsYXQoKSxDPVtdLHk9MDt5PG0ubGVuZ3RoO3krKyl7dmFyIFQ9bVt5XSxQPUhsKHQsVCxiLGcpLGM9RnIodCwicGFnaW5nQnV0dG9uIikodCxULFAuZGlzcGxheSxQLmFjdGl2ZSxQLmRpc2FibGVkKSxsPXR5cGVvZiBUPT0ic3RyaW5nIj9zW1RdOnMubnVtYmVyP3MubnVtYmVyKyhUKzEpOm51bGw7SChjLmNsaWNrZXIpLmF0dHIoeyJhcmlhLWNvbnRyb2xzIjp0LnNUYWJsZUlkLCJhcmlhLWRpc2FibGVkIjpQLmRpc2FibGVkPyJ0cnVlIjpudWxsLCJhcmlhLWN1cnJlbnQiOlAuYWN0aXZlPyJwYWdlIjpudWxsLCJhcmlhLWxhYmVsIjpsLCJkYXRhLWR0LWlkeCI6VCx0YWJJbmRleDpQLmRpc2FibGVkPy0xOnQuaVRhYkluZGV4P3QuaVRhYkluZGV4Om51bGx9KSx0eXBlb2YgVCE9Im51bWJlciImJkgoYy5jbGlja2VyKS5hZGRDbGFzcyhUKSxtcyhjLmNsaWNrZXIse2FjdGlvbjpUfSxmdW5jdGlvbihGKXtGLnByZXZlbnREZWZhdWx0KCksTGkodCxGLmRhdGEuYWN0aW9uLCEwKX0pLEMucHVzaChjLmRpc3BsYXkpfXZhciBoPUZyKHQsInBhZ2luZ0NvbnRhaW5lciIpKHQsQyksXz1lLmZpbmQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuZGF0YSgiZHQtaWR4Iik7ZS5lbXB0eSgpLmFwcGVuZChoKSxfIT09dm9pZCAwJiZlLmZpbmQoIltkYXRhLWR0LWlkeD0iK18rIl0iKS50cmlnZ2VyKCJmb2N1cyIpLEMubGVuZ3RoJiZuLmJ1dHRvbnM+MSYmSChlKS5oZWlnaHQoKT49SChDWzBdKS5vdXRlckhlaWdodCgpKjItMTAmJmtzKHQsZSxILmV4dGVuZCh7fSxuLHtidXR0b25zOm4uYnV0dG9ucy0yfSkpfX1mdW5jdGlvbiBIbCh0LGUsbixyKXt2YXIgcz10Lm9MYW5ndWFnZS5vUGFnaW5hdGUsaT17ZGlzcGxheToiIixhY3RpdmU6ITEsZGlzYWJsZWQ6ITF9O3N3aXRjaChlKXtjYXNlImVsbGlwc2lzIjppLmRpc3BsYXk9IiYjeDIwMjY7IixpLmRpc2FibGVkPSEwO2JyZWFrO2Nhc2UiZmlyc3QiOmkuZGlzcGxheT1zLnNGaXJzdCxuPT09MCYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UicHJldmlvdXMiOmkuZGlzcGxheT1zLnNQcmV2aW91cyxuPT09MCYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibmV4dCI6aS5kaXNwbGF5PXMuc05leHQsKHI9PT0wfHxuPT09ci0xKSYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibGFzdCI6aS5kaXNwbGF5PXMuc0xhc3QsKHI9PT0wfHxuPT09ci0xKSYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGU9PSJudW1iZXIiJiYoaS5kaXNwbGF5PXQuZm5Gb3JtYXROdW1iZXIoZSsxKSxuPT09ZSYmKGkuYWN0aXZlPSEwKSk7YnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gU3ModCxlLG4scil7dmFyIHM9W10saT1NYXRoLmZsb29yKG4vMiksbz1yPzI6MSx1PXI/MTowO3JldHVybiBlPD1uP3M9YW4oMCxlKTpuPT09MT9zPVt0XTpuPT09Mz90PD0xP3M9WzAsMSwiZWxsaXBzaXMiXTp0Pj1lLTI/KHM9YW4oZS0yLGUpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSk6cz1bImVsbGlwc2lzIix0LCJlbGxpcHNpcyJdOnQ8PWk/KHM9YW4oMCxuLW8pLHMucHVzaCgiZWxsaXBzaXMiKSxyJiZzLnB1c2goZS0xKSk6dD49ZS0xLWk/KHM9YW4oZS0obi1vKSxlKSxzLnVuc2hpZnQoImVsbGlwc2lzIiksciYmcy51bnNoaWZ0KDApKToocz1hbih0LWkrbyx0K2ktdSkscy5wdXNoKCJlbGxpcHNpcyIpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSxyJiYocy5wdXNoKGUtMSkscy51bnNoaWZ0KDApKSksc312YXIgd2k9MDtidC5mZWF0dXJlLnJlZ2lzdGVyKCJwYWdlTGVuZ3RoIixmdW5jdGlvbih0LGUpe3ZhciBuPXQub0ZlYXR1cmVzO2lmKCFuLmJQYWdpbmF0ZXx8IW4uYkxlbmd0aENoYW5nZSlyZXR1cm4gbnVsbDtlPUguZXh0ZW5kKHttZW51OnQuYUxlbmd0aE1lbnUsdGV4dDp0Lm9MYW5ndWFnZS5zTGVuZ3RoTWVudX0sZSk7dmFyIHI9dC5vQ2xhc3Nlcy5sZW5ndGgscz10LnNUYWJsZUlkLGk9ZS5tZW51LG89W10sdT1bXSxwO2lmKEFycmF5LmlzQXJyYXkoaVswXSkpbz1pWzBdLHU9aVsxXTtlbHNlIGZvcihwPTA7cDxpLmxlbmd0aDtwKyspSC5pc1BsYWluT2JqZWN0KGlbcF0pPyhvLnB1c2goaVtwXS52YWx1ZSksdS5wdXNoKGlbcF0ubGFiZWwpKTooby5wdXNoKGlbcF0pLHUucHVzaChpW3BdKSk7dmFyIGI9ZS50ZXh0Lm1hdGNoKC9fTUVOVV8kLyksZz1lLnRleHQubWF0Y2goL15fTUVOVV8vKSxtPWUudGV4dC5yZXBsYWNlKC9fTUVOVV8vLCIiKSxDPSI8bGFiZWw+IitlLnRleHQrIjwvbGFiZWw+IjtnP0M9Il9NRU5VXzxsYWJlbD4iK20rIjwvbGFiZWw+IjpiJiYoQz0iPGxhYmVsPiIrbSsiPC9sYWJlbD5fTUVOVV8iKTt2YXIgeT0idG1wLSIrICtuZXcgRGF0ZSxUPUgoIjxkaXYvPiIpLmFkZENsYXNzKHIuY29udGFpbmVyKS5hcHBlbmQoQy5yZXBsYWNlKCJfTUVOVV8iLCc8c3BhbiBpZD0iJyt5KyciPjwvc3Bhbj4nKSksUD1bXTtULmZpbmQoImxhYmVsIilbMF0uY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe2gubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmUC5wdXNoKHtlbDpoLHRleHQ6aC50ZXh0Q29udGVudH0pfSk7dmFyIGM9ZnVuY3Rpb24oaCl7UC5mb3JFYWNoKGZ1bmN0aW9uKF8pe18uZWwudGV4dENvbnRlbnQ9amkodCxfLnRleHQsaCl9KX0sbD1IKCI8c2VsZWN0Lz4iLHtuYW1lOnMrIl9sZW5ndGgiLCJhcmlhLWNvbnRyb2xzIjpzLGNsYXNzOnIuc2VsZWN0fSk7Zm9yKHA9MDtwPG8ubGVuZ3RoO3ArKylsWzBdW3BdPW5ldyBPcHRpb24odHlwZW9mIHVbcF09PSJudW1iZXIiP3QuZm5Gb3JtYXROdW1iZXIodVtwXSk6dVtwXSxvW3BdKTtyZXR1cm4gVC5maW5kKCJsYWJlbCIpLmF0dHIoImZvciIsImR0LWxlbmd0aC0iK3dpKSxsLmF0dHIoImlkIiwiZHQtbGVuZ3RoLSIrd2kpLHdpKyssVC5maW5kKCIjIit5KS5yZXBsYWNlV2l0aChsKSxIKCJzZWxlY3QiLFQpLnZhbCh0Ll9pRGlzcGxheUxlbmd0aCkub24oImNoYW5nZS5EVCIsZnVuY3Rpb24oKXtkcyh0LEgodGhpcykudmFsKCkpLExuKHQpfSksSCh0Lm5UYWJsZSkub24oImxlbmd0aC5kdC5EVCIsZnVuY3Rpb24oaCxfLEYpe3Q9PT1fJiYoSCgic2VsZWN0IixUKS52YWwoRiksYyhGKSl9KSxjKHQuX2lEaXNwbGF5TGVuZ3RoKSxUfSwibCIpO0guZm4uZGF0YVRhYmxlPWJ0O2J0LiQ9SDtILmZuLmRhdGFUYWJsZVNldHRpbmdzPWJ0LnNldHRpbmdzO0guZm4uZGF0YVRhYmxlRXh0PWJ0LmV4dDtILmZuLkRhdGFUYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gSCh0aGlzKS5kYXRhVGFibGUodCkuYXBpKCl9O0guZWFjaChidCxmdW5jdGlvbih0LGUpe0guZm4uRGF0YVRhYmxlW3RdPWV9KTt2YXIgYXQ9YnQ7dmFyIExlPWF0O3ZhciAkbD1pZShhZSgpLDEpO3ZhciBQcz1pZShhZSgpLDEpO3ZhciBodD1Qcy5kZWZhdWx0LFdsPTAsR2w9MCxTZT1hdC5leHQuYnV0dG9ucyxxaT1udWxsO2Z1bmN0aW9uIFhpKHQsZSxuKXtodC5mbi5hbmltYXRlP3Quc3RvcCgpLmZhZGVJbihlLG4pOih0LmNzcygiZGlzcGxheSIsImJsb2NrIiksbiYmbi5jYWxsKHQpKX1mdW5jdGlvbiBZaSh0LGUsbil7aHQuZm4uYW5pbWF0ZT90LnN0b3AoKS5mYWRlT3V0KGUsbik6KHQuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLG4mJm4uY2FsbCh0KSl9dmFyIHRlPWZ1bmN0aW9uKHQsZSl7aWYoIWF0LnZlcnNpb25DaGVjaygiMiIpKXRocm93Ildhcm5pbmc6IEJ1dHRvbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIjtpZighKHRoaXMgaW5zdGFuY2VvZiB0ZSkpcmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgdGUobix0KS5jb250YWluZXIoKX07dHlwZW9mIGU+InUiJiYoZT17fSksZT09PSEwJiYoZT17fSksQXJyYXkuaXNBcnJheShlKSYmKGU9e2J1dHRvbnM6ZX0pLHRoaXMuYz1odC5leHRlbmQoITAse30sdGUuZGVmYXVsdHMsZSksZS5idXR0b25zJiYodGhpcy5jLmJ1dHRvbnM9ZS5idXR0b25zKSx0aGlzLnM9e2R0Om5ldyBhdC5BcGkodCksYnV0dG9uczpbXSxsaXN0ZW5LZXlzOiIiLG5hbWVzcGFjZToiZHRiIitXbCsrfSx0aGlzLmRvbT17Y29udGFpbmVyOmh0KCI8Iit0aGlzLmMuZG9tLmNvbnRhaW5lci50YWcrIi8+IikuYWRkQ2xhc3ModGhpcy5jLmRvbS5jb250YWluZXIuY2xhc3NOYW1lKX0sdGhpcy5fY29uc3RydWN0b3IoKX07aHQuZXh0ZW5kKHRlLnByb3RvdHlwZSx7YWN0aW9uOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP24uY29uZi5hY3Rpb246KG4uY29uZi5hY3Rpb249ZSx0aGlzKX0sYWN0aXZlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpLHI9dGhpcy5jLmRvbS5idXR0b24uYWN0aXZlLHM9aHQobi5ub2RlKTtyZXR1cm4gbi5pbkNvbGxlY3Rpb24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24uYWN0aXZlIT09dm9pZCAwJiYocj10aGlzLmMuZG9tLmNvbGxlY3Rpb24uYnV0dG9uLmFjdGl2ZSksZT09PXZvaWQgMD9zLmhhc0NsYXNzKHIpOihzLnRvZ2dsZUNsYXNzKHIsZT09PXZvaWQgMD8hMDplKSx0aGlzKX0sYWRkOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnMuYnV0dG9ucztpZih0eXBlb2YgZT09InN0cmluZyIpe2Zvcih2YXIgcz1lLnNwbGl0KCItIiksaT10aGlzLnMsbz0wLHU9cy5sZW5ndGgtMTtvPHU7bysrKWk9aS5idXR0b25zW3Nbb10qMV07cj1pLmJ1dHRvbnMsZT1zW3MubGVuZ3RoLTFdKjF9cmV0dXJuIHRoaXMuX2V4cGFuZEJ1dHRvbihyLHQsdCE9PXZvaWQgMD90LnNwbGl0OnZvaWQgMCwodD09PXZvaWQgMHx8dC5zcGxpdD09PXZvaWQgMHx8dC5zcGxpdC5sZW5ndGg9PT0wKSYmaSE9PXZvaWQgMCwhMSxlKSwobj09PXZvaWQgMHx8bj09PSEwKSYmdGhpcy5fZHJhdygpLHRoaXN9LGNvbGxlY3Rpb25SZWJ1aWxkOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpO2lmKGUhPT12b2lkIDApe3ZhciByO2ZvcihyPW4uYnV0dG9ucy5sZW5ndGgtMTtyPj0wO3ItLSl0aGlzLnJlbW92ZShuLmJ1dHRvbnNbcl0ubm9kZSk7Zm9yKG4uY29uZi5wcmVmaXhCdXR0b25zJiZlLnVuc2hpZnQuYXBwbHkoZSxuLmNvbmYucHJlZml4QnV0dG9ucyksbi5jb25mLnBvc3RmaXhCdXR0b25zJiZlLnB1c2guYXBwbHkoZSxuLmNvbmYucG9zdGZpeEJ1dHRvbnMpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIHM9ZVtyXTt0aGlzLl9leHBhbmRCdXR0b24obi5idXR0b25zLHMscyE9PXZvaWQgMCYmcy5jb25maWchPT12b2lkIDAmJnMuY29uZmlnLnNwbGl0IT09dm9pZCAwLCEwLHMucGFyZW50Q29uZiE9PXZvaWQgMCYmcy5wYXJlbnRDb25mLnNwbGl0IT09dm9pZCAwLG51bGwscy5wYXJlbnRDb25mKX19dGhpcy5fZHJhdyhuLmNvbGxlY3Rpb24sbi5idXR0b25zKX0sY29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sZGlzYWJsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub2RlVG9CdXR0b24odCk7cmV0dXJuIGh0KGUubm9kZSkuYWRkQ2xhc3ModGhpcy5jLmRvbS5idXR0b24uZGlzYWJsZWQpLnByb3AoImRpc2FibGVkIiwhMCksdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe2h0KCJib2R5Iikub2ZmKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UpO3ZhciB0PXRoaXMucy5idXR0b25zLnNsaWNlKCksZSxuO2ZvcihlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMucmVtb3ZlKHRbZV0ubm9kZSk7dGhpcy5kb20uY29udGFpbmVyLnJlbW92ZSgpO3ZhciByPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2ZvcihlPTAsbj1yLmxlbmd0aDtlPG47ZSsrKWlmKHIuaW5zdD09PXRoaXMpe3Iuc3BsaWNlKGUsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbih0LGUpe2lmKGU9PT0hMSlyZXR1cm4gdGhpcy5kaXNhYmxlKHQpO3ZhciBuPXRoaXMuX25vZGVUb0J1dHRvbih0KTtyZXR1cm4gaHQobi5ub2RlKS5yZW1vdmVDbGFzcyh0aGlzLmMuZG9tLmJ1dHRvbi5kaXNhYmxlZCkucHJvcCgiZGlzYWJsZWQiLCExKSx0aGlzfSxpbmRleDpmdW5jdGlvbih0LGUsbil7ZXx8KGU9IiIsbj10aGlzLnMuYnV0dG9ucyk7Zm9yKHZhciByPTAscz1uLmxlbmd0aDtyPHM7cisrKXt2YXIgaT1uW3JdLmJ1dHRvbnM7aWYobltyXS5ub2RlPT09dClyZXR1cm4gZStyO2lmKGkmJmkubGVuZ3RoKXt2YXIgbz10aGlzLmluZGV4KHQscisiLSIsaSk7aWYobyE9PW51bGwpcmV0dXJuIG99fXJldHVybiBudWxsfSxuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5uYW1lfSxub2RlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzLmRvbS5jb250YWluZXI7dmFyIGU9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBodChlLm5vZGUpfSxwcm9jZXNzaW5nOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zLmR0LHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP2h0KHIubm9kZSkuaGFzQ2xhc3MoInByb2Nlc3NpbmciKTooaHQoci5ub2RlKS50b2dnbGVDbGFzcygicHJvY2Vzc2luZyIsZSksaHQobi50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtcHJvY2Vzc2luZy5kdCIsW2Usbi5idXR0b24odCksbixodCh0KSxyLmNvbmZdKSx0aGlzKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX25vZGVUb0J1dHRvbih0KSxuPXRoaXMuX25vZGVUb0hvc3QodCkscj10aGlzLnMuZHQ7aWYoZS5idXR0b25zLmxlbmd0aClmb3IodmFyIHM9ZS5idXR0b25zLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlKGUuYnV0dG9uc1tzXS5ub2RlKTtlLmNvbmYuZGVzdHJveWluZz0hMCxlLmNvbmYuZGVzdHJveSYmZS5jb25mLmRlc3Ryb3kuY2FsbChyLmJ1dHRvbih0KSxyLGh0KHQpLGUuY29uZiksdGhpcy5fcmVtb3ZlS2V5KGUuY29uZiksaHQoZS5ub2RlKS5yZW1vdmUoKTt2YXIgaT1odC5pbkFycmF5KGUsbik7cmV0dXJuIG4uc3BsaWNlKGksMSksdGhpc30sdGV4dDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX25vZGVUb0J1dHRvbih0KSxyPW4udGV4dE5vZGUscz10aGlzLnMuZHQsaT1odChuLm5vZGUpLG89ZnVuY3Rpb24odSl7cmV0dXJuIHR5cGVvZiB1PT0iZnVuY3Rpb24iP3UocyxpLG4uY29uZik6dX07cmV0dXJuIGU9PT12b2lkIDA/byhuLmNvbmYudGV4dCk6KG4uY29uZi50ZXh0PWUsci5odG1sKG8oZSkpLHRoaXMpfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LG49ZS5zZXR0aW5ncygpWzBdLHI9dGhpcy5jLmJ1dHRvbnM7bi5fYnV0dG9uc3x8KG4uX2J1dHRvbnM9W10pLG4uX2J1dHRvbnMucHVzaCh7aW5zdDp0aGlzLG5hbWU6dGhpcy5jLm5hbWV9KTtmb3IodmFyIHM9MCxpPXIubGVuZ3RoO3M8aTtzKyspdGhpcy5hZGQocltzXSk7ZS5vbigiZGVzdHJveSIsZnVuY3Rpb24obyx1KXt1PT09biYmdC5kZXN0cm95KCl9KSxodCgiYm9keSIpLm9uKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UsZnVuY3Rpb24obyl7aWYoIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5KXt2YXIgdT1TdHJpbmcuZnJvbUNoYXJDb2RlKG8ua2V5Q29kZSkudG9Mb3dlckNhc2UoKTt0LnMubGlzdGVuS2V5cy50b0xvd2VyQ2FzZSgpLmluZGV4T2YodSkhPT0tMSYmdC5fa2V5cHJlc3ModSxvKX19KX0sX2FkZEtleTpmdW5jdGlvbih0KXt0LmtleSYmKHRoaXMucy5saXN0ZW5LZXlzKz1odC5pc1BsYWluT2JqZWN0KHQua2V5KT90LmtleS5rZXk6dC5rZXkpfSxfZHJhdzpmdW5jdGlvbih0LGUpe3R8fCh0PXRoaXMuZG9tLmNvbnRhaW5lcixlPXRoaXMucy5idXR0b25zKSx0LmNoaWxkcmVuKCkuZGV0YWNoKCk7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQuYXBwZW5kKGVbbl0uaW5zZXJ0ZXIpLHQuYXBwZW5kKCIgIiksZVtuXS5idXR0b25zJiZlW25dLmJ1dHRvbnMubGVuZ3RoJiZ0aGlzLl9kcmF3KGVbbl0uY29sbGVjdGlvbixlW25dLmJ1dHRvbnMpfSxfZXhwYW5kQnV0dG9uOmZ1bmN0aW9uKHQsZSxuLHIscyxpLG8pe3ZhciB1PXRoaXMucy5kdCxwPSExLGI9dGhpcy5jLmRvbS5jb2xsZWN0aW9uLGc9QXJyYXkuaXNBcnJheShlKT9lOltlXTtlPT09dm9pZCAwJiYoZz1BcnJheS5pc0FycmF5KG4pP246W25dKTtmb3IodmFyIG09MCxDPWcubGVuZ3RoO208QzttKyspe3ZhciB5PXRoaXMuX3Jlc29sdmVFeHRlbmRzKGdbbV0pO2lmKHkpe2lmKHA9ISEoeS5jb25maWcmJnkuY29uZmlnLnNwbGl0KSxBcnJheS5pc0FycmF5KHkpKXt0aGlzLl9leHBhbmRCdXR0b24odCx5LFQhPT12b2lkIDAmJlQuY29uZiE9PXZvaWQgMD9ULmNvbmYuc3BsaXQ6dm9pZCAwLHIsbyE9PXZvaWQgMCYmby5zcGxpdCE9PXZvaWQgMCxpLG8pO2NvbnRpbnVlfXZhciBUPXRoaXMuX2J1aWxkQnV0dG9uKHkscix5LnNwbGl0IT09dm9pZCAwfHx5LmNvbmZpZyE9PXZvaWQgMCYmeS5jb25maWcuc3BsaXQhPT12b2lkIDAscyk7aWYoVCl7aWYoaSE9bnVsbD8odC5zcGxpY2UoaSwwLFQpLGkrKyk6dC5wdXNoKFQpLFQuY29uZi5idXR0b25zJiYoVC5jb2xsZWN0aW9uPWh0KCI8IitiLmNvbnRhaW5lci5jb250ZW50LnRhZysiLz4iKSxULmNvbmYuX2NvbGxlY3Rpb249VC5jb2xsZWN0aW9uLGh0KFQubm9kZSkuYXBwZW5kKGIuYWN0aW9uLmRyb3BIdG1sKSx0aGlzLl9leHBhbmRCdXR0b24oVC5idXR0b25zLFQuY29uZi5idXR0b25zLFQuY29uZi5zcGxpdCwhcCxwLGksVC5jb25mKSksVC5jb25mLnNwbGl0KXtULmNvbGxlY3Rpb249aHQoIjwiK2IuY29udGFpbmVyLnRhZysiLz4iKSxULmNvbmYuX2NvbGxlY3Rpb249VC5jb2xsZWN0aW9uO2Zvcih2YXIgUD0wO1A8VC5jb25mLnNwbGl0Lmxlbmd0aDtQKyspe3ZhciBjPVQuY29uZi5zcGxpdFtQXTt0eXBlb2YgYz09Im9iamVjdCImJihjLnBhcmVudD1vLGMuY29sbGVjdGlvbkxheW91dD09PXZvaWQgMCYmKGMuY29sbGVjdGlvbkxheW91dD1ULmNvbmYuY29sbGVjdGlvbkxheW91dCksYy5kcm9wdXA9PT12b2lkIDAmJihjLmRyb3B1cD1ULmNvbmYuZHJvcHVwKSxjLmZhZGU9PT12b2lkIDAmJihjLmZhZGU9VC5jb25mLmZhZGUpKX10aGlzLl9leHBhbmRCdXR0b24oVC5idXR0b25zLFQuY29uZi5idXR0b25zLFQuY29uZi5zcGxpdCwhcCxwLGksVC5jb25mKX1ULmNvbmYucGFyZW50PW8seS5pbml0JiZ5LmluaXQuY2FsbCh1LmJ1dHRvbihULm5vZGUpLHUsaHQoVC5ub2RlKSx5KX19fX0sX2J1aWxkQnV0dG9uOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMsaT10aGlzLmMuZG9tLG8sdT10aGlzLnMuZHQscD1mdW5jdGlvbihRKXtyZXR1cm4gdHlwZW9mIFE9PSJmdW5jdGlvbiI/USh1LG0sdCk6UX0sYj1odC5leHRlbmQoITAse30saS5idXR0b24pO2lmKGUmJm4mJmkuY29sbGVjdGlvbi5zcGxpdD9odC5leHRlbmQoITAsYixpLmNvbGxlY3Rpb24uc3BsaXQuYWN0aW9uKTpyfHxlP2h0LmV4dGVuZCghMCxiLGkuY29sbGVjdGlvbi5idXR0b24pOm4mJmh0LmV4dGVuZCghMCxiLGkuc3BsaXQuYnV0dG9uKSx0LnNwYWNlcil7dmFyIGc9aHQoIjwiK2Iuc3BhY2VyLnRhZysiLz4iKS5hZGRDbGFzcygiZHQtYnV0dG9uLXNwYWNlciAiK3Quc3R5bGUrIiAiK2Iuc3BhY2VyLmNsYXNzTmFtZSkuaHRtbChwKHQudGV4dCkpO3JldHVybntjb25mOnQsbm9kZTpnLGluc2VydGVyOmcsYnV0dG9uczpbXSxpbkNvbGxlY3Rpb246ZSxpc1NwbGl0Om4sY29sbGVjdGlvbjpudWxsLHRleHROb2RlOmd9fWlmKHQuYXZhaWxhYmxlJiYhdC5hdmFpbGFibGUodSx0KSYmIXQuaHRtbClyZXR1cm4hMTt2YXIgbTtpZih0Lmh0bWwpbT1odCh0Lmh0bWwpO2Vsc2V7dmFyIEM9ZnVuY3Rpb24oUSxFLCQsdyxrKXt3LmFjdGlvbi5jYWxsKEUuYnV0dG9uKCQpLFEsRSwkLHcsayksaHQoRS50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbRS5idXR0b24oJCksRSwkLHddKX0seT1mdW5jdGlvbihRLEUsJCx3KXt3LmFzeW5jPyhzLnByb2Nlc3NpbmcoJFswXSwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe0MoUSxFLCQsdyxmdW5jdGlvbigpe3MucHJvY2Vzc2luZygkWzBdLCExKX0pfSx3LmFzeW5jKSk6QyhRLEUsJCx3LGZ1bmN0aW9uKCl7fSl9LFQ9dC50YWd8fGIudGFnLFA9dC5jbGlja0JsdXJzPT09dm9pZCAwPyEwOnQuY2xpY2tCbHVycztpZihtPWh0KCI8IitUKyIvPiIpLmFkZENsYXNzKGIuY2xhc3NOYW1lKS5hdHRyKCJ0YWJpbmRleCIsdGhpcy5zLmR0LnNldHRpbmdzKClbMF0uaVRhYkluZGV4KS5hdHRyKCJhcmlhLWNvbnRyb2xzIix0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkuaWQpLm9uKCJjbGljay5kdGIiLGZ1bmN0aW9uKFEpe1EucHJldmVudERlZmF1bHQoKSwhbS5oYXNDbGFzcyhiLmRpc2FibGVkKSYmdC5hY3Rpb24mJnkoUSx1LG0sdCksUCYmbS50cmlnZ2VyKCJibHVyIil9KS5vbigia2V5cHJlc3MuZHRiIixmdW5jdGlvbihRKXtRLmtleUNvZGU9PT0xMyYmKFEucHJldmVudERlZmF1bHQoKSwhbS5oYXNDbGFzcyhiLmRpc2FibGVkKSYmdC5hY3Rpb24mJnkoUSx1LG0sdCkpfSksVC50b0xvd2VyQ2FzZSgpPT09ImEiJiZtLmF0dHIoImhyZWYiLCIjIiksVC50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiImJm0uYXR0cigidHlwZSIsImJ1dHRvbiIpLGIubGluZXIudGFnKXt2YXIgYz1odCgiPCIrYi5saW5lci50YWcrIi8+IikuaHRtbChwKHQudGV4dCkpLmFkZENsYXNzKGIubGluZXIuY2xhc3NOYW1lKTtiLmxpbmVyLnRhZy50b0xvd2VyQ2FzZSgpPT09ImEiJiZjLmF0dHIoImhyZWYiLCIjIiksbS5hcHBlbmQoYyksbz1jfWVsc2UgbS5odG1sKHAodC50ZXh0KSksbz1tO3QuZW5hYmxlZD09PSExJiZtLmFkZENsYXNzKGIuZGlzYWJsZWQpLHQuY2xhc3NOYW1lJiZtLmFkZENsYXNzKHQuY2xhc3NOYW1lKSx0LnRpdGxlQXR0ciYmbS5hdHRyKCJ0aXRsZSIscCh0LnRpdGxlQXR0cikpLHQuYXR0ciYmbS5hdHRyKHQuYXR0ciksdC5uYW1lc3BhY2V8fCh0Lm5hbWVzcGFjZT0iLmR0LWJ1dHRvbi0iK0dsKyspLHQuY29uZmlnIT09dm9pZCAwJiZ0LmNvbmZpZy5zcGxpdCYmKHQuc3BsaXQ9dC5jb25maWcuc3BsaXQpfXZhciBsPXRoaXMuYy5kb20uYnV0dG9uQ29udGFpbmVyLGg7bCYmbC50YWc/aD1odCgiPCIrbC50YWcrIi8+IikuYWRkQ2xhc3MobC5jbGFzc05hbWUpLmFwcGVuZChtKTpoPW0sdGhpcy5fYWRkS2V5KHQpLHRoaXMuYy5idXR0b25DcmVhdGVkJiYoaD10aGlzLmMuYnV0dG9uQ3JlYXRlZCh0LGgpKTt2YXIgXztpZihuKXt2YXIgRj1lP2h0LmV4dGVuZCghMCx0aGlzLmMuZG9tLnNwbGl0LHRoaXMuYy5kb20uY29sbGVjdGlvbi5zcGxpdCk6dGhpcy5jLmRvbS5zcGxpdCxPPUYud3JhcHBlcjtfPWh0KCI8IitPLnRhZysiLz4iKS5hZGRDbGFzcyhPLmNsYXNzTmFtZSkuYXBwZW5kKG0pO3ZhciBmPWh0LmV4dGVuZCh0LHthbGlnbjpGLmRyb3Bkb3duLmFsaWduLGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIiwiYXJpYS1leHBhbmRlZCI6ITF9LGNsYXNzTmFtZTpGLmRyb3Bkb3duLmNsYXNzTmFtZSxjbG9zZUJ1dHRvbjohMSxzcGxpdEFsaWduQ2xhc3M6Ri5kcm9wZG93bi5zcGxpdEFsaWduQ2xhc3MsdGV4dDpGLmRyb3Bkb3duLnRleHR9KTt0aGlzLl9hZGRLZXkoZik7dmFyIFU9ZnVuY3Rpb24oUSxFLCQsdyl7U2Uuc3BsaXQuYWN0aW9uLmNhbGwoRS5idXR0b24oXyksUSxFLCQsdyksaHQoRS50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbRS5idXR0b24oJCksRSwkLHddKSwkLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKX0sWD1odCgnPGJ1dHRvbiBjbGFzcz0iJytGLmRyb3Bkb3duLmNsYXNzTmFtZSsnIGR0LWJ1dHRvbiI+PC9idXR0b24+JykuaHRtbChGLmRyb3Bkb3duLmRyb3BIdG1sKS5vbigiY2xpY2suZHRiIixmdW5jdGlvbihRKXtRLnByZXZlbnREZWZhdWx0KCksUS5zdG9wUHJvcGFnYXRpb24oKSxYLmhhc0NsYXNzKGIuZGlzYWJsZWQpfHxVKFEsdSxYLGYpLFAmJlgudHJpZ2dlcigiYmx1ciIpfSkub24oImtleXByZXNzLmR0YiIsZnVuY3Rpb24oUSl7US5rZXlDb2RlPT09MTMmJihRLnByZXZlbnREZWZhdWx0KCksWC5oYXNDbGFzcyhiLmRpc2FibGVkKXx8VShRLHUsWCxmKSl9KTt0LnNwbGl0Lmxlbmd0aD09PTAmJlguYWRkQ2xhc3MoImR0Yi1oaWRlLWRyb3AiKSxfLmFwcGVuZChYKS5hdHRyKGYuYXR0cil9cmV0dXJue2NvbmY6dCxub2RlOm4/Xy5nZXQoMCk6bS5nZXQoMCksaW5zZXJ0ZXI6bj9fOmgsYnV0dG9uczpbXSxpbkNvbGxlY3Rpb246ZSxpc1NwbGl0Om4saW5TcGxpdDpyLGNvbGxlY3Rpb246bnVsbCx0ZXh0Tm9kZTpvfX0sX25vZGVUb0J1dHRvbjpmdW5jdGlvbih0LGUpe2V8fChlPXRoaXMucy5idXR0b25zKTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspe2lmKGVbbl0ubm9kZT09PXQpcmV0dXJuIGVbbl07aWYoZVtuXS5idXR0b25zLmxlbmd0aCl7dmFyIHM9dGhpcy5fbm9kZVRvQnV0dG9uKHQsZVtuXS5idXR0b25zKTtpZihzKXJldHVybiBzfX19LF9ub2RlVG9Ib3N0OmZ1bmN0aW9uKHQsZSl7ZXx8KGU9dGhpcy5zLmJ1dHRvbnMpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl7aWYoZVtuXS5ub2RlPT09dClyZXR1cm4gZTtpZihlW25dLmJ1dHRvbnMubGVuZ3RoKXt2YXIgcz10aGlzLl9ub2RlVG9Ib3N0KHQsZVtuXS5idXR0b25zKTtpZihzKXJldHVybiBzfX19LF9rZXlwcmVzczpmdW5jdGlvbih0LGUpe2lmKCFlLl9idXR0b25zSGFuZGxlZCl7dmFyIG49ZnVuY3Rpb24ocyxpKXtpZihzLmtleSl7aWYocy5rZXk9PT10KWUuX2J1dHRvbnNIYW5kbGVkPSEwLGh0KGkpLmNsaWNrKCk7ZWxzZSBpZihodC5pc1BsYWluT2JqZWN0KHMua2V5KSl7aWYocy5rZXkua2V5IT09dHx8cy5rZXkuc2hpZnRLZXkmJiFlLnNoaWZ0S2V5fHxzLmtleS5hbHRLZXkmJiFlLmFsdEtleXx8cy5rZXkuY3RybEtleSYmIWUuY3RybEtleXx8cy5rZXkubWV0YUtleSYmIWUubWV0YUtleSlyZXR1cm47ZS5fYnV0dG9uc0hhbmRsZWQ9ITAsaHQoaSkuY2xpY2soKX19fSxyPWZ1bmN0aW9uKHMpe2Zvcih2YXIgaT0wLG89cy5sZW5ndGg7aTxvO2krKyluKHNbaV0uY29uZixzW2ldLm5vZGUpLHNbaV0uYnV0dG9ucy5sZW5ndGgmJnIoc1tpXS5idXR0b25zKX07cih0aGlzLnMuYnV0dG9ucyl9fSxfcmVtb3ZlS2V5OmZ1bmN0aW9uKHQpe2lmKHQua2V5KXt2YXIgZT1odC5pc1BsYWluT2JqZWN0KHQua2V5KT90LmtleS5rZXk6dC5rZXksbj10aGlzLnMubGlzdGVuS2V5cy5zcGxpdCgiIikscj1odC5pbkFycmF5KGUsbik7bi5zcGxpY2UociwxKSx0aGlzLnMubGlzdGVuS2V5cz1uLmpvaW4oIiIpfX0sX3Jlc29sdmVFeHRlbmRzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLnMuZHQscixzLGk9ZnVuY3Rpb24oZyl7Zm9yKHZhciBtPTA7IWh0LmlzUGxhaW5PYmplY3QoZykmJiFBcnJheS5pc0FycmF5KGcpOyl7aWYoZz09PXZvaWQgMClyZXR1cm47aWYodHlwZW9mIGc9PSJmdW5jdGlvbiIpe2lmKGc9Zy5jYWxsKGUsbix0KSwhZylyZXR1cm4hMX1lbHNlIGlmKHR5cGVvZiBnPT0ic3RyaW5nIil7aWYoIVNlW2ddKXJldHVybntodG1sOmd9O2c9U2VbZ119aWYobSsrLG0+MzApdGhyb3ciQnV0dG9uczogVG9vIG1hbnkgaXRlcmF0aW9ucyJ9cmV0dXJuIEFycmF5LmlzQXJyYXkoZyk/ZzpodC5leHRlbmQoe30sZyl9O2Zvcih0PWkodCk7dCYmdC5leHRlbmQ7KXtpZighU2VbdC5leHRlbmRdKXRocm93IkNhbm5vdCBleHRlbmQgdW5rbm93biBidXR0b24gdHlwZTogIit0LmV4dGVuZDt2YXIgbz1pKFNlW3QuZXh0ZW5kXSk7aWYoQXJyYXkuaXNBcnJheShvKSlyZXR1cm4gbztpZighbylyZXR1cm4hMTt2YXIgdT1vLmNsYXNzTmFtZTt0LmNvbmZpZyE9PXZvaWQgMCYmby5jb25maWchPT12b2lkIDAmJih0LmNvbmZpZz1odC5leHRlbmQoe30sby5jb25maWcsdC5jb25maWcpKSx0PWh0LmV4dGVuZCh7fSxvLHQpLHUmJnQuY2xhc3NOYW1lIT09dSYmKHQuY2xhc3NOYW1lPXUrIiAiK3QuY2xhc3NOYW1lKSx0LmV4dGVuZD1vLmV4dGVuZH12YXIgcD10LnBvc3RmaXhCdXR0b25zO2lmKHApZm9yKHQuYnV0dG9uc3x8KHQuYnV0dG9ucz1bXSkscj0wLHM9cC5sZW5ndGg7cjxzO3IrKyl0LmJ1dHRvbnMucHVzaChwW3JdKTt2YXIgYj10LnByZWZpeEJ1dHRvbnM7aWYoYilmb3IodC5idXR0b25zfHwodC5idXR0b25zPVtdKSxyPTAscz1iLmxlbmd0aDtyPHM7cisrKXQuYnV0dG9ucy5zcGxpY2UociwwLGJbcl0pO3JldHVybiB0fSxfcG9wb3ZlcjpmdW5jdGlvbih0LGUsbil7dmFyIHI9ZSxzPXRoaXMuYyxpPSExLG89aHQuZXh0ZW5kKHthbGlnbjoiYnV0dG9uLWxlZnQiLGF1dG9DbG9zZTohMSxiYWNrZ3JvdW5kOiEwLGJhY2tncm91bmRDbGFzc05hbWU6ImR0LWJ1dHRvbi1iYWNrZ3JvdW5kIixjbG9zZUJ1dHRvbjohMCxjb250YWluZXJDbGFzc05hbWU6cy5kb20uY29sbGVjdGlvbi5jb250YWluZXIuY2xhc3NOYW1lLGNvbnRlbnRDbGFzc05hbWU6cy5kb20uY29sbGVjdGlvbi5jb250YWluZXIuY29udGVudC5jbGFzc05hbWUsY29sbGVjdGlvbkxheW91dDoiIixjb2xsZWN0aW9uVGl0bGU6IiIsZHJvcHVwOiExLGZhZGU6NDAwLHBvcG92ZXJUaXRsZToiIixyaWdodEFsaWduQ2xhc3NOYW1lOiJkdC1idXR0b24tcmlnaHQiLHRhZzpzLmRvbS5jb2xsZWN0aW9uLmNvbnRhaW5lci50YWd9LG4pLHU9by50YWcrIi4iK28uY29udGFpbmVyQ2xhc3NOYW1lLnJlcGxhY2UoLyAvZywiLiIpLHA9ZS5ub2RlKCksYj1mdW5jdGlvbigpe2k9ITAsWWkoaHQodSksby5mYWRlLGZ1bmN0aW9uKCl7aHQodGhpcykuZGV0YWNoKCl9KSxodChyLmJ1dHRvbnMoJ1thcmlhLWhhc3BvcHVwPSJkaWFsb2ciXVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKS5ub2RlcygpKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxodCgiZGl2LmR0LWJ1dHRvbi1iYWNrZ3JvdW5kIikub2ZmKCJjbGljay5kdGItY29sbGVjdGlvbiIpLHRlLmJhY2tncm91bmQoITEsby5iYWNrZ3JvdW5kQ2xhc3NOYW1lLG8uZmFkZSxwKSxodCh3aW5kb3cpLm9mZigicmVzaXplLnJlc2l6ZS5kdGItY29sbGVjdGlvbiIpLGh0KCJib2R5Iikub2ZmKCIuZHRiLWNvbGxlY3Rpb24iKSxyLm9mZigiYnV0dG9ucy1hY3Rpb24uYi1pbnRlcm5hbCIpLHIub2ZmKCJkZXN0cm95Iil9O2lmKHQ9PT0hMSl7YigpO3JldHVybn12YXIgZz1odChyLmJ1dHRvbnMoJ1thcmlhLWhhc3BvcHVwPSJkaWFsb2ciXVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKS5ub2RlcygpKTtnLmxlbmd0aCYmKHAuY2xvc2VzdCh1KS5sZW5ndGgmJihwPWcuZXEoMCkpLGIoKSk7dmFyIG09aHQoIi5kdC1idXR0b24iLHQpLmxlbmd0aCxDPSIiO209PT0zP0M9ImR0Yi1iMyI6bT09PTI/Qz0iZHRiLWIyIjptPT09MSYmKEM9ImR0Yi1iMSIpO3ZhciB5PWh0KCI8IitvLnRhZysiLz4iKS5hZGRDbGFzcyhvLmNvbnRhaW5lckNsYXNzTmFtZSkuYWRkQ2xhc3Moby5jb2xsZWN0aW9uTGF5b3V0KS5hZGRDbGFzcyhvLnNwbGl0QWxpZ25DbGFzcykuYWRkQ2xhc3MoQykuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoeyJhcmlhLW1vZGFsIjohMCxyb2xlOiJkaWFsb2cifSk7dD1odCh0KS5hZGRDbGFzcyhvLmNvbnRlbnRDbGFzc05hbWUpLmF0dHIoInJvbGUiLCJtZW51IikuYXBwZW5kVG8oeSkscC5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLHAucGFyZW50cygiYm9keSIpWzBdIT09ZG9jdW1lbnQuYm9keSYmKHA9ZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQpLG8ucG9wb3ZlclRpdGxlP3kucHJlcGVuZCgnPGRpdiBjbGFzcz0iZHQtYnV0dG9uLWNvbGxlY3Rpb24tdGl0bGUiPicrby5wb3BvdmVyVGl0bGUrIjwvZGl2PiIpOm8uY29sbGVjdGlvblRpdGxlJiZ5LnByZXBlbmQoJzxkaXYgY2xhc3M9ImR0LWJ1dHRvbi1jb2xsZWN0aW9uLXRpdGxlIj4nK28uY29sbGVjdGlvblRpdGxlKyI8L2Rpdj4iKSxvLmNsb3NlQnV0dG9uJiZ5LnByZXBlbmQoJzxkaXYgY2xhc3M9ImR0Yi1wb3BvdmVyLWNsb3NlIj4mdGltZXM7PC9kaXY+JykuYWRkQ2xhc3MoImR0Yi1jb2xsZWN0aW9uLWNsb3NlYWJsZSIpLFhpKHkuaW5zZXJ0QWZ0ZXIocCksby5mYWRlKTt2YXIgVD1odChlLnRhYmxlKCkuY29udGFpbmVyKCkpLFA9eS5jc3MoInBvc2l0aW9uIik7aWYoKG8uc3Bhbj09PSJjb250YWluZXIifHxvLmFsaWduPT09ImR0LWNvbnRhaW5lciIpJiYocD1wLnBhcmVudCgpLHkuY3NzKCJ3aWR0aCIsVC53aWR0aCgpKSksUD09PSJhYnNvbHV0ZSIpe3ZhciBjPWh0KHBbMF0ub2Zmc2V0UGFyZW50KSxsPXAucG9zaXRpb24oKSxoPXAub2Zmc2V0KCksXz1jLm9mZnNldCgpLEY9Yy5wb3NpdGlvbigpLE89d2luZG93LmdldENvbXB1dGVkU3R5bGUoY1swXSk7Xy5oZWlnaHQ9Yy5vdXRlckhlaWdodCgpLF8ud2lkdGg9Yy53aWR0aCgpK3BhcnNlRmxvYXQoTy5wYWRkaW5nTGVmdCksXy5yaWdodD1fLmxlZnQrXy53aWR0aCxfLmJvdHRvbT1fLnRvcCtfLmhlaWdodDt2YXIgZj1sLnRvcCtwLm91dGVySGVpZ2h0KCksVT1sLmxlZnQ7eS5jc3Moe3RvcDpmLGxlZnQ6VX0pLE89d2luZG93LmdldENvbXB1dGVkU3R5bGUoeVswXSk7dmFyIFg9eS5vZmZzZXQoKTtYLmhlaWdodD15Lm91dGVySGVpZ2h0KCksWC53aWR0aD15Lm91dGVyV2lkdGgoKSxYLnJpZ2h0PVgubGVmdCtYLndpZHRoLFguYm90dG9tPVgudG9wK1guaGVpZ2h0LFgubWFyZ2luVG9wPXBhcnNlRmxvYXQoTy5tYXJnaW5Ub3ApLFgubWFyZ2luQm90dG9tPXBhcnNlRmxvYXQoTy5tYXJnaW5Cb3R0b20pLG8uZHJvcHVwJiYoZj1sLnRvcC1YLmhlaWdodC1YLm1hcmdpblRvcC1YLm1hcmdpbkJvdHRvbSksKG8uYWxpZ249PT0iYnV0dG9uLXJpZ2h0Inx8eS5oYXNDbGFzcyhvLnJpZ2h0QWxpZ25DbGFzc05hbWUpKSYmKFU9bC5sZWZ0LVgud2lkdGgrcC5vdXRlcldpZHRoKCkpLChvLmFsaWduPT09ImR0LWNvbnRhaW5lciJ8fG8uYWxpZ249PT0iY29udGFpbmVyIikmJlU8bC5sZWZ0JiYoVT0tbC5sZWZ0KSxGLmxlZnQrVStYLndpZHRoPmh0KHdpbmRvdykud2lkdGgoKSYmKFU9aHQod2luZG93KS53aWR0aCgpLVgud2lkdGgtRi5sZWZ0KSxoLmxlZnQrVTwwJiYoVT0taC5sZWZ0KSxGLnRvcCtmK1guaGVpZ2h0Pmh0KHdpbmRvdykuaGVpZ2h0KCkraHQod2luZG93KS5zY3JvbGxUb3AoKSYmKGY9bC50b3AtWC5oZWlnaHQtWC5tYXJnaW5Ub3AtWC5tYXJnaW5Cb3R0b20pLEYudG9wK2Y8aHQod2luZG93KS5zY3JvbGxUb3AoKSYmKGY9bC50b3ArcC5vdXRlckhlaWdodCgpKSx5LmNzcyh7dG9wOmYsbGVmdDpVfSl9ZWxzZXt2YXIgUT1mdW5jdGlvbigpe3ZhciBFPWh0KHdpbmRvdykuaGVpZ2h0KCkvMiwkPXkuaGVpZ2h0KCkvMjskPkUmJigkPUUpLHkuY3NzKCJtYXJnaW5Ub3AiLCQqLTEpfTtRKCksaHQod2luZG93KS5vbigicmVzaXplLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbigpe1EoKX0pfW8uYmFja2dyb3VuZCYmdGUuYmFja2dyb3VuZCghMCxvLmJhY2tncm91bmRDbGFzc05hbWUsby5mYWRlLG8uYmFja2dyb3VuZEhvc3R8fHApLGh0KCJkaXYuZHQtYnV0dG9uLWJhY2tncm91bmQiKS5vbigiY2xpY2suZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKCl7fSksby5hdXRvQ2xvc2UmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLm9uKCJidXR0b25zLWFjdGlvbi5iLWludGVybmFsIixmdW5jdGlvbihFLCQsdyxrKXtrWzBdIT09cFswXSYmYigpfSl9LDApLGh0KHkpLnRyaWdnZXIoImJ1dHRvbnMtcG9wb3Zlci5kdCIpLHIub24oImRlc3Ryb3kiLGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPSExLGh0KCJib2R5Iikub24oImNsaWNrLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbihFKXtpZighaSl7dmFyICQ9aHQuZm4uYWRkQmFjaz8iYWRkQmFjayI6ImFuZFNlbGYiLHc9aHQoRS50YXJnZXQpLnBhcmVudCgpWzBdOyghaHQoRS50YXJnZXQpLnBhcmVudHMoKVskXSgpLmZpbHRlcih0KS5sZW5ndGgmJiFodCh3KS5oYXNDbGFzcygiZHQtYnV0dG9ucyIpfHxodChFLnRhcmdldCkuaGFzQ2xhc3MoImR0LWJ1dHRvbi1iYWNrZ3JvdW5kIikpJiZiKCl9fSkub24oImtleXVwLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbihFKXtFLmtleUNvZGU9PT0yNyYmYigpfSkub24oImtleWRvd24uZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKEUpe3ZhciAkPWh0KCJhLCBidXR0b24iLHQpLHc9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtFLmtleUNvZGU9PT05JiYoJC5pbmRleCh3KT09PS0xPygkLmZpcnN0KCkuZm9jdXMoKSxFLnByZXZlbnREZWZhdWx0KCkpOkUuc2hpZnRLZXk/dz09PSRbMF0mJigkLmxhc3QoKS5mb2N1cygpLEUucHJldmVudERlZmF1bHQoKSk6dz09PSQubGFzdCgpWzBdJiYoJC5maXJzdCgpLmZvY3VzKCksRS5wcmV2ZW50RGVmYXVsdCgpKSl9KX0sMCl9fSk7dGUuYmFja2dyb3VuZD1mdW5jdGlvbih0LGUsbixyKXtuPT09dm9pZCAwJiYobj00MDApLHJ8fChyPWRvY3VtZW50LmJvZHkpLHQ/WGkoaHQoIjxkaXYvPiIpLmFkZENsYXNzKGUpLmNzcygiZGlzcGxheSIsIm5vbmUiKS5pbnNlcnRBZnRlcihyKSxuKTpZaShodCgiZGl2LiIrZSksbixmdW5jdGlvbigpe2h0KHRoaXMpLnJlbW92ZUNsYXNzKGUpLnJlbW92ZSgpfSl9O3RlLmluc3RhbmNlU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtpZih0PT1udWxsKXJldHVybiBodC5tYXAoZSxmdW5jdGlvbihpKXtyZXR1cm4gaS5pbnN0fSk7dmFyIG49W10scj1odC5tYXAoZSxmdW5jdGlvbihpKXtyZXR1cm4gaS5uYW1lfSkscz1mdW5jdGlvbihpKXtpZihBcnJheS5pc0FycmF5KGkpKXtmb3IodmFyIG89MCx1PWkubGVuZ3RoO288dTtvKyspcyhpW29dKTtyZXR1cm59aWYodHlwZW9mIGk9PSJzdHJpbmciKWlmKGkuaW5kZXhPZigiLCIpIT09LTEpcyhpLnNwbGl0KCIsIikpO2Vsc2V7dmFyIHA9aHQuaW5BcnJheShpLnRyaW0oKSxyKTtwIT09LTEmJm4ucHVzaChlW3BdLmluc3QpfWVsc2UgaWYodHlwZW9mIGk9PSJudW1iZXIiKW4ucHVzaChlW2ldLmluc3QpO2Vsc2UgaWYodHlwZW9mIGk9PSJvYmplY3QiJiZpLm5vZGVOYW1lKWZvcih2YXIgYj0wO2I8ZS5sZW5ndGg7YisrKWVbYl0uaW5zdC5kb20uY29udGFpbmVyWzBdPT09aSYmbi5wdXNoKGVbYl0uaW5zdCk7ZWxzZSB0eXBlb2YgaT09Im9iamVjdCImJm4ucHVzaChpKX07cmV0dXJuIHModCksbn07dGUuYnV0dG9uU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj1mdW5jdGlvbihwLGIsZyl7Zm9yKHZhciBtLEMseT0wLFQ9Yi5sZW5ndGg7eTxUO3krKyltPWJbeV0sbSYmKEM9ZyE9PXZvaWQgMD9nK3k6eSsiIixwLnB1c2goe25vZGU6bS5ub2RlLG5hbWU6bS5jb25mLm5hbWUsaWR4OkN9KSxtLmJ1dHRvbnMmJnIocCxtLmJ1dHRvbnMsQysiLSIpKX0scz1mdW5jdGlvbihwLGIpe3ZhciBnLG0sQz1bXTtyKEMsYi5zLmJ1dHRvbnMpO3ZhciB5PWh0Lm1hcChDLGZ1bmN0aW9uKGgpe3JldHVybiBoLm5vZGV9KTtpZihBcnJheS5pc0FycmF5KHApfHxwIGluc3RhbmNlb2YgaHQpe2ZvcihnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXMocFtnXSxiKTtyZXR1cm59aWYocD09bnVsbHx8cD09PSIqIilmb3IoZz0wLG09Qy5sZW5ndGg7ZzxtO2crKyluLnB1c2goe2luc3Q6Yixub2RlOkNbZ10ubm9kZX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJudW1iZXIiKWIucy5idXR0b25zW3BdJiZuLnB1c2goe2luc3Q6Yixub2RlOmIucy5idXR0b25zW3BdLm5vZGV9KTtlbHNlIGlmKHR5cGVvZiBwPT0ic3RyaW5nIilpZihwLmluZGV4T2YoIiwiKSE9PS0xKXt2YXIgVD1wLnNwbGl0KCIsIik7Zm9yKGc9MCxtPVQubGVuZ3RoO2c8bTtnKyspcyhUW2ddLnRyaW0oKSxiKX1lbHNlIGlmKHAubWF0Y2goL15cZCsoXC1cZCspKiQvKSl7dmFyIFA9aHQubWFwKEMsZnVuY3Rpb24oaCl7cmV0dXJuIGguaWR4fSk7bi5wdXNoKHtpbnN0OmIsbm9kZTpDW2h0LmluQXJyYXkocCxQKV0ubm9kZX0pfWVsc2UgaWYocC5pbmRleE9mKCI6bmFtZSIpIT09LTEpe3ZhciBjPXAucmVwbGFjZSgiOm5hbWUiLCIiKTtmb3IoZz0wLG09Qy5sZW5ndGg7ZzxtO2crKylDW2ddLm5hbWU9PT1jJiZuLnB1c2goe2luc3Q6Yixub2RlOkNbZ10ubm9kZX0pfWVsc2UgaHQoeSkuZmlsdGVyKHApLmVhY2goZnVuY3Rpb24oKXtuLnB1c2goe2luc3Q6Yixub2RlOnRoaXN9KX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJvYmplY3QiJiZwLm5vZGVOYW1lKXt2YXIgbD1odC5pbkFycmF5KHAseSk7bCE9PS0xJiZuLnB1c2goe2luc3Q6Yixub2RlOnlbbF19KX19LGk9MCxvPXQubGVuZ3RoO2k8bztpKyspe3ZhciB1PXRbaV07cyhlLHUpfXJldHVybiBufTt0ZS5zdHJpcERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdHlwZW9mIHQhPSJzdHJpbmcifHwodD10ZS5zdHJpcEh0bWxTY3JpcHQodCksdD10ZS5zdHJpcEh0bWxDb21tZW50cyh0KSwoIWV8fGUuc3RyaXBIdG1sKSYmKHQ9YXQudXRpbC5zdHJpcEh0bWwodCkpLCghZXx8ZS50cmltKSYmKHQ9dC50cmltKCkpLCghZXx8ZS5zdHJpcE5ld2xpbmVzKSYmKHQ9dC5yZXBsYWNlKC9cbi9nLCIgIikpLCghZXx8ZS5kZWNvZGVFbnRpdGllcykmJihxaT90PXFpKHQpOihBcy5pbm5lckhUTUw9dCx0PUFzLnZhbHVlKSkpLHR9O3RlLmVudGl0eURlY29kZXI9ZnVuY3Rpb24odCl7cWk9dH07dGUuc3RyaXBIdG1sQ29tbWVudHM9ZnVuY3Rpb24odCl7dmFyIGU7ZG8gZT10LHQ9dC5yZXBsYWNlKC8oPCEtLS4qPy0tIT8+KXwoPCEtLVtcU1xzXSs/LS0hPz4pfCg8IS0tW1xTXHNdKj8kKS9nLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIHR9O3RlLnN0cmlwSHRtbFNjcmlwdD1mdW5jdGlvbih0KXt2YXIgZTtkbyBlPXQsdD10LnJlcGxhY2UoLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0W14+XSo+KTxbXjxdKikqPFwvc2NyaXB0W14+XSo+L2dpLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIHR9O3RlLmRlZmF1bHRzPXtidXR0b25zOlsiY29weSIsImV4Y2VsIiwiY3N2IiwicGRmIiwicHJpbnQiXSxuYW1lOiJtYWluIix0YWJJbmRleDowLGRvbTp7Y29udGFpbmVyOnt0YWc6ImRpdiIsY2xhc3NOYW1lOiJkdC1idXR0b25zIn0sY29sbGVjdGlvbjp7YWN0aW9uOntkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nfSxjb250YWluZXI6e2NsYXNzTmFtZToiZHQtYnV0dG9uLWNvbGxlY3Rpb24iLGNvbnRlbnQ6e2NsYXNzTmFtZToiIix0YWc6ImRpdiJ9LHRhZzoiZGl2In19LGJ1dHRvbjp7dGFnOiJidXR0b24iLGNsYXNzTmFtZToiZHQtYnV0dG9uIixhY3RpdmU6ImR0LWJ1dHRvbi1hY3RpdmUiLGRpc2FibGVkOiJkaXNhYmxlZCIsc3BhY2VyOntjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGFjZXIiLHRhZzoic3BhbiJ9LGxpbmVyOnt0YWc6InNwYW4iLGNsYXNzTmFtZToiIn19LHNwbGl0OnthY3Rpb246e2NsYXNzTmFtZToiZHQtYnV0dG9uLXNwbGl0LWRyb3AtYnV0dG9uIGR0LWJ1dHRvbiIsdGFnOiJidXR0b24ifSxkcm9wZG93bjp7YWxpZ246InNwbGl0LXJpZ2h0IixjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGxpdC1kcm9wIixkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nLHNwbGl0QWxpZ25DbGFzczoiZHQtYnV0dG9uLXNwbGl0LWxlZnQiLHRhZzoiYnV0dG9uIn0sd3JhcHBlcjp7Y2xhc3NOYW1lOiJkdC1idXR0b24tc3BsaXQiLHRhZzoiZGl2In19fX07dGUudmVyc2lvbj0iMy4xLjIiO2h0LmV4dGVuZChTZSx7Y29sbGVjdGlvbjp7dGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIil9LGNsYXNzTmFtZToiYnV0dG9ucy1jb2xsZWN0aW9uIixjbG9zZUJ1dHRvbjohMSxpbml0OmZ1bmN0aW9uKHQsZSl7ZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXtyLl9jb2xsZWN0aW9uLnBhcmVudHMoImJvZHkiKS5sZW5ndGg/dGhpcy5wb3BvdmVyKCExLHIpOnRoaXMucG9wb3ZlcihyLl9jb2xsZWN0aW9uLHIpLHQudHlwZT09PSJrZXlwcmVzcyImJmh0KCJhLCBidXR0b24iLHIuX2NvbGxlY3Rpb24pLmVxKDApLmZvY3VzKCl9LGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIn19LHNwbGl0Ont0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuc3BsaXQiLCJTcGxpdCIpfSxjbGFzc05hbWU6ImJ1dHRvbnMtc3BsaXQiLGNsb3NlQnV0dG9uOiExLGluaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXt0aGlzLnBvcG92ZXIoci5fY29sbGVjdGlvbixyKX0sYXR0cjp7ImFyaWEtaGFzcG9wdXAiOiJkaWFsb2cifX0sY29weTpmdW5jdGlvbigpe2lmKFNlLmNvcHlIdG1sNSlyZXR1cm4iY29weUh0bWw1In0sY3N2OmZ1bmN0aW9uKHQsZSl7aWYoU2UuY3N2SHRtbDUmJlNlLmNzdkh0bWw1LmF2YWlsYWJsZSh0LGUpKXJldHVybiJjc3ZIdG1sNSJ9LGV4Y2VsOmZ1bmN0aW9uKHQsZSl7aWYoU2UuZXhjZWxIdG1sNSYmU2UuZXhjZWxIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4iZXhjZWxIdG1sNSJ9LHBkZjpmdW5jdGlvbih0LGUpe2lmKFNlLnBkZkh0bWw1JiZTZS5wZGZIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4icGRmSHRtbDUifSxwYWdlTGVuZ3RoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc2V0dGluZ3MoKVswXS5hTGVuZ3RoTWVudSxuPVtdLHI9W10scz1mdW5jdGlvbih1KXtyZXR1cm4gdS5pMThuKCJidXR0b25zLnBhZ2VMZW5ndGgiLHsiLTEiOiJTaG93IGFsbCByb3dzIixfOiJTaG93ICVkIHJvd3MifSx1LnBhZ2UubGVuKCkpfTtpZihBcnJheS5pc0FycmF5KGVbMF0pKW49ZVswXSxyPWVbMV07ZWxzZSBmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtodC5pc1BsYWluT2JqZWN0KG8pPyhuLnB1c2goby52YWx1ZSksci5wdXNoKG8ubGFiZWwpKToobi5wdXNoKG8pLHIucHVzaChvKSl9cmV0dXJue2V4dGVuZDoiY29sbGVjdGlvbiIsdGV4dDpzLGNsYXNzTmFtZToiYnV0dG9ucy1wYWdlLWxlbmd0aCIsYXV0b0Nsb3NlOiEwLGJ1dHRvbnM6aHQubWFwKG4sZnVuY3Rpb24odSxwKXtyZXR1cm57dGV4dDpyW3BdLGNsYXNzTmFtZToiYnV0dG9uLXBhZ2UtbGVuZ3RoIixhY3Rpb246ZnVuY3Rpb24oYixnKXtnLnBhZ2UubGVuKHUpLmRyYXcoKX0saW5pdDpmdW5jdGlvbihiLGcsbSl7dmFyIEM9dGhpcyx5PWZ1bmN0aW9uKCl7Qy5hY3RpdmUoYi5wYWdlLmxlbigpPT09dSl9O2Iub24oImxlbmd0aC5kdCIrbS5uYW1lc3BhY2UseSkseSgpfSxkZXN0cm95OmZ1bmN0aW9uKGIsZyxtKXtiLm9mZigibGVuZ3RoLmR0IittLm5hbWVzcGFjZSl9fX0pLGluaXQ6ZnVuY3Rpb24odSxwLGIpe3ZhciBnPXRoaXM7dS5vbigibGVuZ3RoLmR0IitiLm5hbWVzcGFjZSxmdW5jdGlvbigpe2cudGV4dChiLnRleHQpfSl9LGRlc3Ryb3k6ZnVuY3Rpb24odSxwLGIpe3Uub2ZmKCJsZW5ndGguZHQiK2IubmFtZXNwYWNlKX19fSxzcGFjZXI6e3N0eWxlOiJlbXB0eSIsc3BhY2VyOiEwLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5zcGFjZXIiLCIiKX19fSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkiLGZ1bmN0aW9uKHQsZSl7ZT09PXZvaWQgMCYmKGU9dCx0PXZvaWQgMCksdGhpcy5zZWxlY3Rvci5idXR0b25Hcm91cD10O3ZhciBuPXRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihyKXtpZihyLl9idXR0b25zKXJldHVybiB0ZS5idXR0b25TZWxlY3Rvcih0ZS5pbnN0YW5jZVNlbGVjdG9yKHQsci5fYnV0dG9ucyksZSl9LCEwKTtyZXR1cm4gbi5fZ3JvdXBTZWxlY3Rvcj10LG59KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYnV0dG9ucyh0LGUpO3JldHVybiBuLmxlbmd0aD4xJiZuLnNwbGljZSgxLG4ubGVuZ3RoKSxufSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aXZlKCkiLCJidXR0b24oKS5hY3RpdmUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3RpdmUoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aXZlKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aW9uKCkiLCJidXR0b24oKS5hY3Rpb24oKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3Rpb24oZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aW9uKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuY29sbGVjdGlvblJlYnVpbGQoKSIsImJ1dHRvbigpLmNvbGxlY3Rpb25SZWJ1aWxkKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdHlwZW9mIHRbbl09PSJvYmplY3QiJiYodFtuXS5wYXJlbnRDb25mPWUpO2UuaW5zdC5jb2xsZWN0aW9uUmVidWlsZChlLm5vZGUsdCl9KX0pO2F0LkFwaS5yZWdpc3RlcihbImJ1dHRvbnMoKS5lbmFibGUoKSIsImJ1dHRvbigpLmVuYWJsZSgpIl0sZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuZW5hYmxlKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyKFsiYnV0dG9ucygpLmRpc2FibGUoKSIsImJ1dHRvbigpLmRpc2FibGUoKSJdLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt0Lmluc3QuZGlzYWJsZSh0Lm5vZGUpfSl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpLmluZGV4KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9bnVsbDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuaW5zdC5pbmRleChlLm5vZGUpO24hPT1udWxsJiYodD1uKX0pLHR9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5ub2RlcygpIiwiYnV0dG9uKCkubm9kZSgpIixmdW5jdGlvbigpe3ZhciB0PWh0KCk7cmV0dXJuIGh0KHRoaXMuZWFjaChmdW5jdGlvbihlKXt0PXQuYWRkKGUuaW5zdC5ub2RlKGUubm9kZSkpfSkpLHR9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5wcm9jZXNzaW5nKCkiLCJidXR0b24oKS5wcm9jZXNzaW5nKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmluc3QucHJvY2Vzc2luZyhlLm5vZGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC5wcm9jZXNzaW5nKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkudGV4dCgpIiwiYnV0dG9uKCkudGV4dCgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbnN0LnRleHQoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QudGV4dChlLm5vZGUsdCl9KX0pO2F0LkFwaS5yZWdpc3RlclBsdXJhbCgiYnV0dG9ucygpLnRyaWdnZXIoKSIsImJ1dHRvbigpLnRyaWdnZXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5ub2RlKHQubm9kZSkudHJpZ2dlcigiY2xpY2siKX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b24oKS5wb3BvdmVyKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLmluc3QuX3BvcG92ZXIodCx0aGlzLmJ1dHRvbih0aGlzWzBdLm5vZGUpLGUpfSl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMoKS5jb250YWluZXJzKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9aHQoKSxlPXRoaXMuX2dyb3VwU2VsZWN0b3I7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihuKXtpZihuLl9idXR0b25zKWZvcih2YXIgcj10ZS5pbnN0YW5jZVNlbGVjdG9yKGUsbi5fYnV0dG9ucykscz0wLGk9ci5sZW5ndGg7czxpO3MrKyl0PXQuYWRkKHJbc10uY29udGFpbmVyKCkpfSksdH0pO2F0LkFwaS5yZWdpc3RlcigiYnV0dG9ucygpLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcnMoKS5lcSgwKX0pO2F0LkFwaS5yZWdpc3RlcigiYnV0dG9uKCkuYWRkKCkiLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmNvbnRleHQ7aWYoci5sZW5ndGgpe3ZhciBzPXRlLmluc3RhbmNlU2VsZWN0b3IodGhpcy5fZ3JvdXBTZWxlY3RvcixyWzBdLl9idXR0b25zKTtzLmxlbmd0aCYmc1swXS5hZGQoZSx0LG4pfXJldHVybiB0aGlzLmJ1dHRvbih0aGlzLl9ncm91cFNlbGVjdG9yLHQpfSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkuZGVzdHJveSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsdWNrKCJpbnN0IikudW5pcXVlKCkuZWFjaChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pLHRoaXN9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5yZW1vdmUoKSIsImJ1dHRvbnMoKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5yZW1vdmUodC5ub2RlKX0pLHRoaXN9KTt2YXIgYXI7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zLmluZm8oKSIsZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7cmV0dXJuIHQ9PT0hMT8odGhpcy5vZmYoImRlc3Ryb3kuYnRuLWluZm8iKSxZaShodCgiI2RhdGF0YWJsZXNfYnV0dG9uc19pbmZvIiksNDAwLGZ1bmN0aW9uKCl7aHQodGhpcykucmVtb3ZlKCl9KSxjbGVhclRpbWVvdXQoYXIpLGFyPW51bGwsdGhpcyk6KGFyJiZjbGVhclRpbWVvdXQoYXIpLGh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5sZW5ndGgmJmh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5yZW1vdmUoKSx0PXQ/IjxoMj4iK3QrIjwvaDI+IjoiIixYaShodCgnPGRpdiBpZD0iZGF0YXRhYmxlc19idXR0b25zX2luZm8iIGNsYXNzPSJkdC1idXR0b24taW5mbyIvPicpLmh0bWwodCkuYXBwZW5kKGh0KCI8ZGl2Lz4iKVt0eXBlb2YgZT09InN0cmluZyI/Imh0bWwiOiJhcHBlbmQiXShlKSkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmFwcGVuZFRvKCJib2R5IikpLG4hPT12b2lkIDAmJm4hPT0wJiYoYXI9c2V0VGltZW91dChmdW5jdGlvbigpe3IuYnV0dG9ucy5pbmZvKCExKX0sbikpLHRoaXMub24oImRlc3Ryb3kuYnRuLWluZm8iLGZ1bmN0aW9uKCl7ci5idXR0b25zLmluZm8oITEpfSksdGhpcyl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0RGF0YSgpIixmdW5jdGlvbih0KXtpZih0aGlzLmNvbnRleHQubGVuZ3RoKXJldHVybiBZbChuZXcgYXQuQXBpKHRoaXMuY29udGV4dFswXSksdCl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0SW5mbygpIixmdW5jdGlvbih0KXtyZXR1cm4gdHx8KHQ9e30pLHtmaWxlbmFtZTpxbCh0LHRoaXMpLHRpdGxlOlhsKHQsdGhpcyksbWVzc2FnZVRvcDpEcyh0aGlzLHQsdC5tZXNzYWdlfHx0Lm1lc3NhZ2VUb3AsInRvcCIpLG1lc3NhZ2VCb3R0b206RHModGhpcyx0LHQubWVzc2FnZUJvdHRvbSwiYm90dG9tIil9fSk7dmFyIHFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5maWxlbmFtZT09PSIqIiYmdC50aXRsZSE9PSIqIiYmdC50aXRsZSE9PXZvaWQgMCYmdC50aXRsZSE9PW51bGwmJnQudGl0bGUhPT0iIj90LnRpdGxlOnQuZmlsZW5hbWU7aWYodHlwZW9mIG49PSJmdW5jdGlvbiImJihuPW4odCxlKSksbj09bnVsbClyZXR1cm4gbnVsbDtuLmluZGV4T2YoIioiKSE9PS0xJiYobj1uLnJlcGxhY2UoL1wqL2csaHQoImhlYWQgPiB0aXRsZSIpLnRleHQoKSkudHJpbSgpKSxuPW4ucmVwbGFjZSgvW15hLXpBLVowLTlfXHUwMEExLVx1RkZGRlwuLFwtXyAhXChcKV0vZywiIik7dmFyIHI9JGkodC5leHRlbnNpb24sdCxlKTtyZXR1cm4gcnx8KHI9IiIpLG4rcn0sJGk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PT1udWxsP251bGw6dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlLG4pOnR9LFhsPWZ1bmN0aW9uKHQsZSl7dmFyIG49JGkodC50aXRsZSx0LGUpO3JldHVybiBuPT09bnVsbD9udWxsOm4uaW5kZXhPZigiKiIpIT09LTE/bi5yZXBsYWNlKC9cKi9nLGh0KCJoZWFkID4gdGl0bGUiKS50ZXh0KCl8fCJFeHBvcnRlZCBkYXRhIik6bn0sRHM9ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9JGkobixlLHQpO2lmKHM9PT1udWxsKXJldHVybiBudWxsO3ZhciBpPWh0KCJjYXB0aW9uIix0LnRhYmxlKCkuY29udGFpbmVyKCkpLmVxKDApO2lmKHM9PT0iKiIpe3ZhciBvPWkuY3NzKCJjYXB0aW9uLXNpZGUiKTtyZXR1cm4gbyE9PXI/bnVsbDppLmxlbmd0aD9pLnRleHQoKToiIn1yZXR1cm4gc30sQXM9aHQoIjx0ZXh0YXJlYS8+IilbMF0sWWw9ZnVuY3Rpb24odCxlKXt2YXIgbj1odC5leHRlbmQoITAse30se3Jvd3M6bnVsbCxjb2x1bW5zOiIiLG1vZGlmaWVyOntzZWFyY2g6ImFwcGxpZWQiLG9yZGVyOiJhcHBsaWVkIn0sb3J0aG9nb25hbDoiZGlzcGxheSIsc3RyaXBIdG1sOiEwLHN0cmlwTmV3bGluZXM6ITAsZGVjb2RlRW50aXRpZXM6ITAsdHJpbTohMCxmb3JtYXQ6e2hlYWRlcjpmdW5jdGlvbihGKXtyZXR1cm4gdGUuc3RyaXBEYXRhKEYsbil9LGZvb3RlcjpmdW5jdGlvbihGKXtyZXR1cm4gdGUuc3RyaXBEYXRhKEYsbil9LGJvZHk6ZnVuY3Rpb24oRil7cmV0dXJuIHRlLnN0cmlwRGF0YShGLG4pfX0sY3VzdG9taXplRGF0YTpudWxsLGN1c3RvbWl6ZVppcDpudWxsfSxlKSxyPXQuY29sdW1ucyhuLmNvbHVtbnMpLmluZGV4ZXMoKS5tYXAoZnVuY3Rpb24oRil7dmFyIE89dC5jb2x1bW4oRik7cmV0dXJuIG4uZm9ybWF0LmhlYWRlcihPLnRpdGxlKCksRixPLmhlYWRlcigpKX0pLnRvQXJyYXkoKSxzPXQudGFibGUoKS5mb290ZXIoKT90LmNvbHVtbnMobi5jb2x1bW5zKS5pbmRleGVzKCkubWFwKGZ1bmN0aW9uKEYpe3ZhciBPPXQuY29sdW1uKEYpLmZvb3RlcigpLGY9IiI7aWYoTyl7dmFyIFU9aHQoIi5kdC1jb2x1bW4tdGl0bGUiLE8pO2Y9VS5sZW5ndGg/VS5odG1sKCk6aHQoTykuaHRtbCgpfXJldHVybiBuLmZvcm1hdC5mb290ZXIoZixGLE8pfSkudG9BcnJheSgpOm51bGwsaT1odC5leHRlbmQoe30sbi5tb2RpZmllcik7dC5zZWxlY3QmJnR5cGVvZiB0LnNlbGVjdC5pbmZvPT0iZnVuY3Rpb24iJiZpLnNlbGVjdGVkPT09dm9pZCAwJiZ0LnJvd3Mobi5yb3dzLGh0LmV4dGVuZCh7c2VsZWN0ZWQ6ITB9LGkpKS5hbnkoKSYmaHQuZXh0ZW5kKGkse3NlbGVjdGVkOiEwfSk7Zm9yKHZhciBvPXQucm93cyhuLnJvd3MsaSkuaW5kZXhlcygpLnRvQXJyYXkoKSx1PXQuY2VsbHMobyxuLmNvbHVtbnMse29yZGVyOmkub3JkZXJ9KSxwPXUucmVuZGVyKG4ub3J0aG9nb25hbCkudG9BcnJheSgpLGI9dS5ub2RlcygpLnRvQXJyYXkoKSxnPXUuaW5kZXhlcygpLnRvQXJyYXkoKSxtPXQuY29sdW1ucyhuLmNvbHVtbnMpLmNvdW50KCksQz1tPjA/cC5sZW5ndGgvbTowLHk9W10sVD0wLFA9MCxjPUM7UDxjO1ArKyl7Zm9yKHZhciBsPVttXSxoPTA7aDxtO2grKylsW2hdPW4uZm9ybWF0LmJvZHkocFtUXSxnW1RdLnJvdyxnW1RdLmNvbHVtbixiW1RdKSxUKys7eVtQXT1sfXZhciBfPXtoZWFkZXI6cixoZWFkZXJTdHJ1Y3R1cmU6SXMobi5mb3JtYXQuaGVhZGVyLHQudGFibGUoKS5oZWFkZXIuc3RydWN0dXJlKG4uY29sdW1ucykpLGZvb3RlcjpzLGZvb3RlclN0cnVjdHVyZTpJcyhuLmZvcm1hdC5mb290ZXIsdC50YWJsZSgpLmZvb3Rlci5zdHJ1Y3R1cmUobi5jb2x1bW5zKSksYm9keTp5fTtyZXR1cm4gbi5jdXN0b21pemVEYXRhJiZuLmN1c3RvbWl6ZURhdGEoXyksX307ZnVuY3Rpb24gSXModCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylmb3IodmFyIHI9MDtyPGVbbl0ubGVuZ3RoO3IrKyl7dmFyIHM9ZVtuXVtyXTtzJiYocy50aXRsZT10KHMudGl0bGUscixzLmNlbGwpKX1yZXR1cm4gZX1odC5mbi5kYXRhVGFibGUuQnV0dG9ucz10ZTtodC5mbi5EYXRhVGFibGUuQnV0dG9ucz10ZTtodChkb2N1bWVudCkub24oImluaXQuZHQgcGx1Z2luLWluaXQuZHQiLGZ1bmN0aW9uKHQsZSl7aWYodC5uYW1lc3BhY2U9PT0iZHQiKXt2YXIgbj1lLm9Jbml0LmJ1dHRvbnN8fGF0LmRlZmF1bHRzLmJ1dHRvbnM7biYmIWUuX2J1dHRvbnMmJm5ldyB0ZShlLG4pLmNvbnRhaW5lcigpfX0pO2Z1bmN0aW9uIEZzKHQsZSl7dmFyIG49bmV3IGF0LkFwaSh0KSxyPWV8fG4uaW5pdCgpLmJ1dHRvbnN8fGF0LmRlZmF1bHRzLmJ1dHRvbnM7cmV0dXJuIG5ldyB0ZShuLHIpLmNvbnRhaW5lcigpfWF0LmV4dC5mZWF0dXJlLnB1c2goe2ZuSW5pdDpGcyxjRmVhdHVyZToiQiJ9KTthdC5mZWF0dXJlJiZhdC5mZWF0dXJlLnJlZ2lzdGVyKCJidXR0b25zIixGcyk7dmFyIFJzPWllKGFlKCksMSk7dmFyIHNlPVJzLmRlZmF1bHQsTHMsenM7ZnVuY3Rpb24gWmkoKXtyZXR1cm4gTHN8fHdpbmRvdy5KU1ppcH1mdW5jdGlvbiBLaSgpe3JldHVybiB6c3x8d2luZG93LnBkZk1ha2V9YXQuQnV0dG9ucy5wZGZNYWtlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBLaSgpO3pzPXR9LGF0LkJ1dHRvbnMuanN6aXA9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIFppKCk7THM9dH07dmFyIFdyPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuLHIscyxpLG8sdSxwLGIsZyxtO2lmKCEodD09PXZvaWQgMHx8dHlwZW9mIG5hdmlnYXRvcjwidSImJi9NU0lFIFsxLTldXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpKXJldHVybiBtPXQuZG9jdW1lbnQsZT1mdW5jdGlvbigpe3JldHVybiB0LlVSTHx8dC53ZWJraXRVUkx8fHR9LG49bS5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJhIikscj0iZG93bmxvYWQiaW4gbixzPS9jb25zdHJ1Y3Rvci9pLnRlc3QodC5IVE1MRWxlbWVudCl8fHQuc2FmYXJpLGk9L0NyaU9TXC9bXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxvPWZ1bmN0aW9uKEMpeyh0LnNldEltbWVkaWF0ZXx8dC5zZXRUaW1lb3V0KShmdW5jdGlvbigpe3Rocm93IEN9LDApfSx1PTRlNCxwPWZ1bmN0aW9uKEMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0eXBlb2YgQz09InN0cmluZyI/ZSgpLnJldm9rZU9iamVjdFVSTChDKTpDLnJlbW92ZSgpfSx1KX0sYj1mdW5jdGlvbihDKXtyZXR1cm4vXlxzKig/OnRleHRcL1xTKnxhcHBsaWNhdGlvblwveG1sfFxTKlwvXFMqXCt4bWwpXHMqOy4qY2hhcnNldFxzKj1ccyp1dGYtOC9pLnRlc3QoQy50eXBlKT9uZXcgQmxvYihbIlx1RkVGRiIsQ10se3R5cGU6Qy50eXBlfSk6Q30sbT0oZz1mdW5jdGlvbihDLHksaCl7aHx8KEM9YihDKSk7dmFyIFAsYyxsPXRoaXMsaD1DLnR5cGU9PT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixfPWZ1bmN0aW9uKCl7Zm9yKHZhciBGPWwsTz0id3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZCIuc3BsaXQoIiAiKSxmPXZvaWQgMCxVPShPPVtdLmNvbmNhdChPKSkubGVuZ3RoO1UtLTspe3ZhciBYPUZbIm9uIitPW1VdXTtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIil0cnl7WC5jYWxsKEYsZnx8Ril9Y2F0Y2goUSl7byhRKX19fTtsLnJlYWR5U3RhdGU9bC5JTklULHI/KFA9ZSgpLmNyZWF0ZU9iamVjdFVSTChDKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIEYsTztuLmhyZWY9UCxuLmRvd25sb2FkPXksRj1uLE89bmV3IE1vdXNlRXZlbnQoImNsaWNrIiksRi5kaXNwYXRjaEV2ZW50KE8pLF8oKSxwKFApLGwucmVhZHlTdGF0ZT1sLkRPTkV9KSk6KGl8fGgmJnMpJiZ0LkZpbGVSZWFkZXI/KChjPW5ldyBGaWxlUmVhZGVyKS5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgRj1pP2MucmVzdWx0OmMucmVzdWx0LnJlcGxhY2UoL15kYXRhOlteO10qOy8sImRhdGE6YXR0YWNobWVudC9maWxlOyIpO3Qub3BlbihGLCJfYmxhbmsiKXx8KHQubG9jYXRpb24uaHJlZj1GKSxsLnJlYWR5U3RhdGU9bC5ET05FLF8oKX0sYy5yZWFkQXNEYXRhVVJMKEMpLGwucmVhZHlTdGF0ZT1sLklOSVQpOihQPVB8fGUoKS5jcmVhdGVPYmplY3RVUkwoQyksIWgmJnQub3BlbihQLCJfYmxhbmsiKXx8KHQubG9jYXRpb24uaHJlZj1QKSxsLnJlYWR5U3RhdGU9bC5ET05FLF8oKSxwKFApKX0pLnByb3RvdHlwZSx0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2I/ZnVuY3Rpb24oQyx5LFQpe3JldHVybiB5PXl8fEMubmFtZXx8ImRvd25sb2FkIixUfHwoQz1iKEMpKSxuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihDLHkpfToobS5hYm9ydD1mdW5jdGlvbigpe30sbS5yZWFkeVN0YXRlPW0uSU5JVD0wLG0uV1JJVElORz0xLG0uRE9ORT0yLG0uZXJyb3I9bS5vbndyaXRlc3RhcnQ9bS5vbnByb2dyZXNzPW0ub253cml0ZT1tLm9uYWJvcnQ9bS5vbmVycm9yPW0ub253cml0ZWVuZD1udWxsLGZ1bmN0aW9uKEMseSxUKXtyZXR1cm4gbmV3IGcoQyx5fHxDLm5hbWV8fCJkb3dubG9hZCIsVCl9KX0odHlwZW9mIHNlbGY8InUiJiZzZWxmfHx0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93fHwodm9pZCAwKS5jb250ZW50KSxCcz0oYXQuZmlsZVNhdmU9V3IsZnVuY3Rpb24odCl7dmFyIGU9IlNoZWV0MSI7cmV0dXJuIGU9dC5zaGVldE5hbWU/dC5zaGVldE5hbWUucmVwbGFjZSgvW1xbXF1cKlwvXFxcP1w6XS9nLCIiKTplfSksanM9ZnVuY3Rpb24odCl7cmV0dXJuIHQubmV3bGluZXx8KG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MvKT9gXHIKYDpgCmApfSxOcz1mdW5jdGlvbihiLGUpe2Z1bmN0aW9uIG4oVCl7Zm9yKHZhciBQPSIiLGM9MCxsPVQubGVuZ3RoO2M8bDtjKyspMDxjJiYoUCs9byksUCs9aT9pKygiIitUW2NdKS5yZXBsYWNlKHUscCtpKStpOlRbY107cmV0dXJuIFB9dmFyIHI9anMoZSkscz1iLmJ1dHRvbnMuZXhwb3J0RGF0YShlLmV4cG9ydE9wdGlvbnMpLGk9ZS5maWVsZEJvdW5kYXJ5LG89ZS5maWVsZFNlcGFyYXRvcix1PW5ldyBSZWdFeHAoaSwiZyIpLHA9ZS5lc2NhcGVDaGFyIT09dm9pZCAwP2UuZXNjYXBlQ2hhcjoiXFwiLGI9IiIsZz0iIixtPVtdO2UuaGVhZGVyJiYoYj1zLmhlYWRlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIG4oVC5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrciksZS5mb290ZXImJnMuZm9vdGVyJiYoZz1zLmZvb3RlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIG4oVC5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrcik7Zm9yKHZhciBDPTAseT1zLmJvZHkubGVuZ3RoO0M8eTtDKyspbS5wdXNoKG4ocy5ib2R5W0NdKSk7cmV0dXJue3N0cjpiK20uam9pbihyKStyK2cscm93czptLmxlbmd0aH19LE9zPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIikhPT0tMSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKT09PS0xJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIik9PT0tMSYmISEoKHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLyhcZCtcLlxkKykvKSkmJjE8dC5sZW5ndGgmJit0WzFdPDYwMy4xKX07ZnVuY3Rpb24gb3IodCl7Zm9yKHZhciBlPTY1LG49OTAtZSsxLHI9IiI7MDw9dDspcj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQlbitlKStyLHQ9TWF0aC5mbG9vcih0L24pLTE7cmV0dXJuIHJ9dHJ5e0dyPW5ldyBYTUxTZXJpYWxpemVyfWNhdGNoe312YXIgc3IsR3I7ZnVuY3Rpb24gTXModCxlKXtzcj09PXZvaWQgMCYmKHNyPUdyLnNlcmlhbGl6ZVRvU3RyaW5nKG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFZzWyJ4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiXSwidGV4dC94bWwiKSkuaW5kZXhPZigieG1sbnM6ciIpPT09LTEpLHNlLmVhY2goZSxmdW5jdGlvbihuLHIpe2lmKHNlLmlzUGxhaW5PYmplY3QocikpTXModC5mb2xkZXIobikscik7ZWxzZXtpZihzcil7Zm9yKHZhciBzLGk9ci5jaGlsZE5vZGVzWzBdLG89W10sdT1pLmF0dHJpYnV0ZXMubGVuZ3RoLTE7MDw9dTt1LS0pe3ZhciBwPWkuYXR0cmlidXRlc1t1XS5ub2RlTmFtZSxiPWkuYXR0cmlidXRlc1t1XS5ub2RlVmFsdWU7cC5pbmRleE9mKCI6IikhPT0tMSYmKG8ucHVzaCh7bmFtZTpwLHZhbHVlOmJ9KSxpLnJlbW92ZUF0dHJpYnV0ZShwKSl9Zm9yKHU9MCxzPW8ubGVuZ3RoO3U8czt1Kyspe3ZhciBnPXIuY3JlYXRlQXR0cmlidXRlKG9bdV0ubmFtZS5yZXBsYWNlKCI6IiwiX2R0X2JfbmFtZXNwYWNlX3Rva2VuXyIpKTtnLnZhbHVlPW9bdV0udmFsdWUsaS5zZXRBdHRyaWJ1dGVOb2RlKGcpfX12YXIgbT1Hci5zZXJpYWxpemVUb1N0cmluZyhyKSxtPShtPXNyPyhtPShtPW0uaW5kZXhPZigiPD94bWwiKT09PS0xPyc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+JyttOm0pLnJlcGxhY2UoL19kdF9iX25hbWVzcGFjZV90b2tlbl8vZywiOiIpKS5yZXBsYWNlKC94bWxuczpOU1tcZF0rPSIiIE5TW1xkXSs6L2csIiIpOm0pLnJlcGxhY2UoLzwoW148Pl0qPykgeG1sbnM9IiIoW148Pl0qPyk+L2csIjwkMSAkMj4iKTt0LmZpbGUobixtKX19KX1mdW5jdGlvbiBEZSh0LGUsbil7dmFyIHI9dC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBuJiYobi5hdHRyJiZzZShyKS5hdHRyKG4uYXR0ciksbi5jaGlsZHJlbiYmc2UuZWFjaChuLmNoaWxkcmVuLGZ1bmN0aW9uKHMsaSl7ci5hcHBlbmRDaGlsZChpKX0pLG4udGV4dCE9PW51bGwpJiZuLnRleHQhPT12b2lkIDAmJnIuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShuLnRleHQpKSxyfWZ1bmN0aW9uIFpsKHQsZSl7dmFyIG49dC5oZWFkZXJbZV0ubGVuZ3RoO3QuZm9vdGVyJiZ0LmZvb3RlcltlXSYmdC5mb290ZXJbZV0ubGVuZ3RoPm4mJihuPXQuZm9vdGVyW2VdLmxlbmd0aCk7Zm9yKHZhciByPTAscz10LmJvZHkubGVuZ3RoO3I8cztyKyspe3ZhciBpLG89dC5ib2R5W3JdW2VdO2lmKDQwPChuPW48KGk9KChvPW8hPW51bGw/by50b1N0cmluZygpOiIiKS5pbmRleE9mKGAKYCkhPT0tMT8oKGk9by5zcGxpdChgCmApKS5zb3J0KGZ1bmN0aW9uKHUscCl7cmV0dXJuIHAubGVuZ3RoLXUubGVuZ3RofSksaVswXSk6bykubGVuZ3RoKT9pOm4pKXJldHVybiA1NH1yZXR1cm4gNjwobio9MS4zNSk/bjo2fXZhciBWcz17Il9yZWxzLy5yZWxzIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiIFRhcmdldD0ieGwvd29ya2Jvb2sueG1sIi8+PC9SZWxhdGlvbnNoaXBzPicsInhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0IiBUYXJnZXQ9IndvcmtzaGVldHMvc2hlZXQxLnhtbCIvPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDIiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvc3R5bGVzIiBUYXJnZXQ9InN0eWxlcy54bWwiLz48L1JlbGF0aW9uc2hpcHM+JywiW0NvbnRlbnRfVHlwZXNdLnhtbCI6Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz48VHlwZXMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlcyI+PERlZmF1bHQgRXh0ZW5zaW9uPSJ4bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiIC8+PERlZmF1bHQgRXh0ZW5zaW9uPSJyZWxzIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwiIC8+PERlZmF1bHQgRXh0ZW5zaW9uPSJqcGVnIiBDb250ZW50VHlwZT0iaW1hZ2UvanBlZyIgLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3JrYm9vay54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbCIgLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIiAvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3N0eWxlcy54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zdHlsZXMreG1sIiAvPjwvVHlwZXM+JywieGwvd29ya2Jvb2sueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjx3b3JrYm9vayB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIj48ZmlsZVZlcnNpb24gYXBwTmFtZT0ieGwiIGxhc3RFZGl0ZWQ9IjUiIGxvd2VzdEVkaXRlZD0iNSIgcnVwQnVpbGQ9IjI0ODE2Ii8+PHdvcmtib29rUHIgc2hvd0lua0Fubm90YXRpb249IjAiIGF1dG9Db21wcmVzc1BpY3R1cmVzPSIwIi8+PGJvb2tWaWV3cz48d29ya2Jvb2tWaWV3IHhXaW5kb3c9IjAiIHlXaW5kb3c9IjAiIHdpbmRvd1dpZHRoPSIyNTYwMCIgd2luZG93SGVpZ2h0PSIxOTAyMCIgdGFiUmF0aW89IjUwMCIvPjwvYm9va1ZpZXdzPjxzaGVldHM+PHNoZWV0IG5hbWU9IlNoZWV0MSIgc2hlZXRJZD0iMSIgcjppZD0icklkMSIvPjwvc2hlZXRzPjxkZWZpbmVkTmFtZXMvPjwvd29ya2Jvb2s+JywieGwvd29ya3NoZWV0cy9zaGVldDEueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjx3b3Jrc2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIgeG1sbnM6cj0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyIgeG1sbnM6bWM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2IiBtYzpJZ25vcmFibGU9IngxNGFjIiB4bWxuczp4MTRhYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWMiPjxzaGVldERhdGEvPjxtZXJnZUNlbGxzIGNvdW50PSIwIi8+PC93b3Jrc2hlZXQ+JywieGwvc3R5bGVzLnhtbCI6Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHN0eWxlU2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIgeG1sbnM6bWM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2IiBtYzpJZ25vcmFibGU9IngxNGFjIiB4bWxuczp4MTRhYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWMiPjxudW1GbXRzIGNvdW50PSI2Ij48bnVtRm10IG51bUZtdElkPSIxNjQiIGZvcm1hdENvZGU9IlskJC00MDldIywjIzAuMDA7LVskJC00MDldIywjIzAuMDAiLz48bnVtRm10IG51bUZtdElkPSIxNjUiIGZvcm1hdENvZGU9IiZxdW90O1x4QTMmcXVvdDsjLCMjMC4wMCIvPjxudW1GbXQgbnVtRm10SWQ9IjE2NiIgZm9ybWF0Q29kZT0iWyRcdTIwQUMtMl0gIywjIzAuMDAiLz48bnVtRm10IG51bUZtdElkPSIxNjciIGZvcm1hdENvZGU9IjAuMCUiLz48bnVtRm10IG51bUZtdElkPSIxNjgiIGZvcm1hdENvZGU9IiMsIyMwOygjLCMjMCkiLz48bnVtRm10IG51bUZtdElkPSIxNjkiIGZvcm1hdENvZGU9IiMsIyMwLjAwOygjLCMjMC4wMCkiLz48L251bUZtdHM+PGZvbnRzIGNvdW50PSI1IiB4MTRhYzprbm93bkZvbnRzPSIxIj48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48Y29sb3IgcmdiPSJGRkZGRkZGRiIgLz48L2ZvbnQ+PGZvbnQ+PHN6IHZhbD0iMTEiIC8+PG5hbWUgdmFsPSJDYWxpYnJpIiAvPjxiIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48aSAvPjwvZm9udD48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PHUgLz48L2ZvbnQ+PC9mb250cz48ZmlsbHMgY291bnQ9IjYiPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ibm9uZSIgLz48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJub25lIiAvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9IkZGRDlEOUQ5IiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iRkZEOTk3OTUiIC8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiIC8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJzb2xpZCI+PGZnQ29sb3IgcmdiPSJmZmM2ZWZjZSIgLz48YmdDb2xvciBpbmRleGVkPSI2NCIgLz48L3BhdHRlcm5GaWxsPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9ImZmYzZjZmVmIiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjwvZmlsbHM+PGJvcmRlcnMgY291bnQ9IjIiPjxib3JkZXI+PGxlZnQgLz48cmlnaHQgLz48dG9wIC8+PGJvdHRvbSAvPjxkaWFnb25hbCAvPjwvYm9yZGVyPjxib3JkZXIgZGlhZ29uYWxVcD0iZmFsc2UiIGRpYWdvbmFsRG93bj0iZmFsc2UiPjxsZWZ0IHN0eWxlPSJ0aGluIj48Y29sb3IgYXV0bz0iMSIgLz48L2xlZnQ+PHJpZ2h0IHN0eWxlPSJ0aGluIj48Y29sb3IgYXV0bz0iMSIgLz48L3JpZ2h0Pjx0b3Agc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvdG9wPjxib3R0b20gc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvYm90dG9tPjxkaWFnb25hbCAvPjwvYm9yZGVyPjwvYm9yZGVycz48Y2VsbFN0eWxlWGZzIGNvdW50PSIxIj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgLz48L2NlbGxTdHlsZVhmcz48Y2VsbFhmcyBjb3VudD0iNjgiPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSI1IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIzIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0ibGVmdCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0iY2VudGVyIi8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJyaWdodCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0iZmlsbCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgdGV4dFJvdGF0aW9uPSI5MCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgd3JhcFRleHQ9IjEiLz48L3hmPjx4ZiBudW1GbXRJZD0iOSIgICBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjUiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY2IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NyIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjgiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY5IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjMiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iNCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjIiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTQiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjwvY2VsbFhmcz48Y2VsbFN0eWxlcyBjb3VudD0iMSI+PGNlbGxTdHlsZSBuYW1lPSJOb3JtYWwiIHhmSWQ9IjAiIGJ1aWx0aW5JZD0iMCIgLz48L2NlbGxTdHlsZXM+PGR4ZnMgY291bnQ9IjAiIC8+PHRhYmxlU3R5bGVzIGNvdW50PSIwIiBkZWZhdWx0VGFibGVTdHlsZT0iVGFibGVTdHlsZU1lZGl1bTkiIGRlZmF1bHRQaXZvdFN0eWxlPSJQaXZvdFN0eWxlTWVkaXVtNCIgLz48L3N0eWxlU2hlZXQ+J30sRXM9W3ttYXRjaDovXlwtP1xkK1wuXGQlJC8sc3R5bGU6NjAsZm10OmZ1bmN0aW9uKHQpe3JldHVybiB0LzEwMH19LHttYXRjaDovXlwtP1xkK1wuP1xkKiUkLyxzdHlsZTo1NixmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQvMTAwfX0se21hdGNoOi9eXC0/XCRbXGQsXSsuP1xkKiQvLHN0eWxlOjU3fSx7bWF0Y2g6L15cLT/Co1tcZCxdKy4/XGQqJC8sc3R5bGU6NTh9LHttYXRjaDovXlwtP+KCrFtcZCxdKy4/XGQqJC8sc3R5bGU6NTl9LHttYXRjaDovXlwtP1xkKyQvLHN0eWxlOjY1fSx7bWF0Y2g6L15cLT9cZCtcLlxkezJ9JC8sc3R5bGU6NjZ9LHttYXRjaDovXlwoW1xkLF0rXCkkLyxzdHlsZTo2MSxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuLTEqdC5yZXBsYWNlKC9bXChcKV0vZywiIil9fSx7bWF0Y2g6L15cKFtcZCxdK1wuXGR7Mn1cKSQvLHN0eWxlOjYyLGZtdDpmdW5jdGlvbih0KXtyZXR1cm4tMSp0LnJlcGxhY2UoL1tcKFwpXS9nLCIiKX19LHttYXRjaDovXlwtP1tcZCxdKyQvLHN0eWxlOjYzfSx7bWF0Y2g6L15cLT9bXGQsXStcLlxkezJ9JC8sc3R5bGU6NjR9LHttYXRjaDovXigxOVxkXGR8WzItOV1cZFxkXGQpXC0oMFxkfDFbMDEyXSlcLVswMTIzXVtcZF0kLyxzdHlsZTo2NyxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQoMjU1NjkrRGF0ZS5wYXJzZSh0KS84NjRlNSl9fV0sVXI9ZnVuY3Rpb24odCxlLG4scixzKXt2YXIgaT1zZSgibWVyZ2VDZWxscyIsdCk7aVswXS5hcHBlbmRDaGlsZChEZSh0LCJtZXJnZUNlbGwiLHthdHRyOntyZWY6b3IobikrZSsiOiIrb3IobitzLTEpKyhlK3ItMSl9fSkpLGkuYXR0cigiY291bnQiLHBhcnNlRmxvYXQoaS5hdHRyKCJjb3VudCIpKSsxKX07YXQuZXh0LmJ1dHRvbnMuY29weUh0bWw1PXtjbGFzc05hbWU6ImJ1dHRvbnMtY29weSBidXR0b25zLWh0bWw1Iix0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY29weSIsIkNvcHkiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9TnMoZSxyKSxtPWUuYnV0dG9ucy5leHBvcnRJbmZvKHIpLHA9anMociksbz1pLnN0cix1PXNlKCI8ZGl2Lz4iKS5jc3Moe2hlaWdodDoxLHdpZHRoOjEsb3ZlcmZsb3c6ImhpZGRlbiIscG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0OjB9KSxwPShtLnRpdGxlJiYobz1tLnRpdGxlK3ArcCtvKSxtLm1lc3NhZ2VUb3AmJihvPW0ubWVzc2FnZVRvcCtwK3ArbyksbS5tZXNzYWdlQm90dG9tJiYobz1vK3ArcCttLm1lc3NhZ2VCb3R0b20pLHIuY3VzdG9taXplJiYobz1yLmN1c3RvbWl6ZShvLHIsZSkpLHNlKCI8dGV4dGFyZWEgcmVhZG9ubHkvPiIpLnZhbChvKS5hcHBlbmRUbyh1KSk7aWYoZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKCJjb3B5Iikpe3UuYXBwZW5kVG8oZS50YWJsZSgpLmNvbnRhaW5lcigpKSxwWzBdLmZvY3VzKCkscFswXS5zZWxlY3QoKTt0cnl7dmFyIGI9ZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTtpZih1LnJlbW92ZSgpLGIpcmV0dXJuIHIuY29weVN1Y2Nlc3MmJmUuYnV0dG9ucy5pbmZvKGUuaTE4bigiYnV0dG9ucy5jb3B5VGl0bGUiLCJDb3B5IHRvIGNsaXBib2FyZCIpLGUuaTE4bigiYnV0dG9ucy5jb3B5U3VjY2VzcyIsezE6IkNvcGllZCBvbmUgcm93IHRvIGNsaXBib2FyZCIsXzoiQ29waWVkICVkIHJvd3MgdG8gY2xpcGJvYXJkIn0saS5yb3dzKSwyZTMpLHZvaWQgcygpfWNhdGNoe319ZnVuY3Rpb24gZygpe0Mub2ZmKCJjbGljay5idXR0b25zLWNvcHkiKSxzZShkb2N1bWVudCkub2ZmKCIuYnV0dG9ucy1jb3B5IiksZS5idXR0b25zLmluZm8oITEpfXZhciBtPXNlKCI8c3Bhbj4iK2UuaTE4bigiYnV0dG9ucy5jb3B5S2V5cyIsIlByZXNzIDxpPmN0cmw8L2k+IG9yIDxpPlx1MjMxODwvaT4gKyA8aT5DPC9pPiB0byBjb3B5IHRoZSB0YWJsZSBkYXRhPGJyPnRvIHlvdXIgc3lzdGVtIGNsaXBib2FyZC48YnI+PGJyPlRvIGNhbmNlbCwgY2xpY2sgdGhpcyBtZXNzYWdlIG9yIHByZXNzIGVzY2FwZS4iKSsiPC9zcGFuPiIpLmFwcGVuZCh1KSxDPShlLmJ1dHRvbnMuaW5mbyhlLmkxOG4oImJ1dHRvbnMuY29weVRpdGxlIiwiQ29weSB0byBjbGlwYm9hcmQiKSxtLDApLHBbMF0uZm9jdXMoKSxwWzBdLnNlbGVjdCgpLHNlKG0pLmNsb3Nlc3QoIi5kdC1idXR0b24taW5mbyIpKTtDLm9uKCJjbGljay5idXR0b25zLWNvcHkiLGZ1bmN0aW9uKCl7ZygpLHMoKX0pLHNlKGRvY3VtZW50KS5vbigia2V5ZG93bi5idXR0b25zLWNvcHkiLGZ1bmN0aW9uKHkpe3kua2V5Q29kZT09PTI3JiYoZygpLHMoKSl9KS5vbigiY29weS5idXR0b25zLWNvcHkgY3V0LmJ1dHRvbnMtY29weSIsZnVuY3Rpb24oKXtnKCkscygpfSl9LGFzeW5jOjEwMCxjb3B5U3VjY2VzczohMCxleHBvcnRPcHRpb25zOnt9LGZpZWxkU2VwYXJhdG9yOiIJIixmaWVsZEJvdW5kYXJ5OiIiLGhlYWRlcjohMCxmb290ZXI6ITAsdGl0bGU6IioiLG1lc3NhZ2VUb3A6IioiLG1lc3NhZ2VCb3R0b206IioifSxhdC5leHQuYnV0dG9ucy5jc3ZIdG1sNT17Ym9tOiExLGNsYXNzTmFtZToiYnV0dG9ucy1jc3YgYnV0dG9ucy1odG1sNSIsYXZhaWxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5GaWxlUmVhZGVyIT09dm9pZCAwJiZ3aW5kb3cuQmxvYn0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmNzdiIsIkNTViIpfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scixzKXt2YXIgaT1OcyhlLHIpLnN0cixvPWUuYnV0dG9ucy5leHBvcnRJbmZvKHIpLHU9ci5jaGFyc2V0O3IuY3VzdG9taXplJiYoaT1yLmN1c3RvbWl6ZShpLHIsZSkpLHU9dSE9PSExPyh1PXV8fGRvY3VtZW50LmNoYXJhY3RlclNldHx8ZG9jdW1lbnQuY2hhcnNldCkmJiI7Y2hhcnNldD0iK3U6IiIsci5ib20mJihpPSJcdUZFRkYiK2kpLFdyKG5ldyBCbG9iKFtpXSx7dHlwZToidGV4dC9jc3YiK3V9KSxvLmZpbGVuYW1lLCEwKSxzKCl9LGFzeW5jOjEwMCxmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIuY3N2IixleHBvcnRPcHRpb25zOnt9LGZpZWxkU2VwYXJhdG9yOiIsIixmaWVsZEJvdW5kYXJ5OiciJyxlc2NhcGVDaGFyOiciJyxjaGFyc2V0Om51bGwsaGVhZGVyOiEwLGZvb3RlcjohMH0sYXQuZXh0LmJ1dHRvbnMuZXhjZWxIdG1sNT17Y2xhc3NOYW1lOiJidXR0b25zLWV4Y2VsIGJ1dHRvbnMtaHRtbDUiLGF2YWlsYWJsZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuRmlsZVJlYWRlciE9PXZvaWQgMCYmWmkoKSE9PXZvaWQgMCYmIU9zKCkmJkdyfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuZXhjZWwiLCJFeGNlbCIpfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scixzKXtmdW5jdGlvbiBpKFEpe3JldHVybiBRPVZzW1FdLHNlLnBhcnNlWE1MKFEpfWZ1bmN0aW9uIG8oUSl7Zz1EZShDLCJyb3ciLHthdHRyOntyOmI9bSsxfX0pO2Zvcih2YXIgRT0wLCQ9US5sZW5ndGg7RTwkO0UrKyl7dmFyIHc9b3IoRSkrIiIrYixrPW51bGw7aWYoUVtFXT09PW51bGx8fFFbRV09PT12b2lkIDB8fFFbRV09PT0iIil7aWYoci5jcmVhdGVFbXB0eUNlbGxzIT09ITApY29udGludWU7UVtFXT0iIn12YXIgUz1RW0VdO1FbRV09dHlwZW9mIFFbRV0udHJpbT09ImZ1bmN0aW9uIj9RW0VdLnRyaW0oKTpRW0VdO2Zvcih2YXIgQj0wLEw9RXMubGVuZ3RoO0I8TDtCKyspe3ZhciBSPUVzW0JdO2lmKFFbRV0ubWF0Y2gmJiFRW0VdLm1hdGNoKC9eMFxkKy8pJiZRW0VdLm1hdGNoKFIubWF0Y2gpKXt2YXIgcT1RW0VdLnJlcGxhY2UoL1teXGRcLlwtXS9nLCIiKTtSLmZtdCYmKHE9Ui5mbXQocSkpLGs9RGUoQywiYyIse2F0dHI6e3I6dyxzOlIuc3R5bGV9LGNoaWxkcmVuOltEZShDLCJ2Iix7dGV4dDpxfSldfSk7YnJlYWt9fWs9a3x8KHR5cGVvZiBRW0VdPT0ibnVtYmVyInx8UVtFXS5tYXRjaCYmUVtFXS5tYXRjaCgvXi0/XGQrKFwuXGQrKT8oW2VFXVwtP1xkKyk/JC8pJiYhUVtFXS5tYXRjaCgvXjBcZCsvKT9EZShDLCJjIix7YXR0cjp7dDoibiIscjp3fSxjaGlsZHJlbjpbRGUoQywidiIse3RleHQ6UVtFXX0pXX0pOihTPVMucmVwbGFjZT9TLnJlcGxhY2UoL1tceDAwLVx4MDlceDBCXHgwQ1x4MEUtXHgxRlx4N0YtXHg5Rl0vZywiIik6UyxEZShDLCJjIix7YXR0cjp7dDoiaW5saW5lU3RyIixyOnd9LGNoaWxkcmVuOntyb3c6RGUoQywiaXMiLHtjaGlsZHJlbjp7cm93OkRlKEMsInQiLHt0ZXh0OlMsYXR0cjp7InhtbDpzcGFjZSI6InByZXNlcnZlIn19KX19KX19KSkpLGcuYXBwZW5kQ2hpbGQoayl9eS5hcHBlbmRDaGlsZChnKSxtKyt9ZnVuY3Rpb24gdShRKXtRLmZvckVhY2goZnVuY3Rpb24oRSl7byhFLm1hcChmdW5jdGlvbigkKXtyZXR1cm4gJD8kLnRpdGxlOiIifSkpLHNlKCJyb3c6bGFzdCBjIixDKS5hdHRyKCJzIiwiMiIpLEUuZm9yRWFjaChmdW5jdGlvbigkLHcpeyQmJigxPCQuY29sU3Bhbnx8MTwkLnJvd1NwYW4pJiZVcihDLG0sdywkLnJvd1NwYW4sJC5jb2xTcGFuKX0pfSl9dmFyIHAsYixnLG09MCxDPWkoInhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCIpLHk9Qy5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2hlZXREYXRhIilbMF0sVD17X3JlbHM6eyIucmVscyI6aSgiX3JlbHMvLnJlbHMiKX0seGw6e19yZWxzOnsid29ya2Jvb2sueG1sLnJlbHMiOmkoInhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzIil9LCJ3b3JrYm9vay54bWwiOmkoInhsL3dvcmtib29rLnhtbCIpLCJzdHlsZXMueG1sIjppKCJ4bC9zdHlsZXMueG1sIiksd29ya3NoZWV0czp7InNoZWV0MS54bWwiOkN9fSwiW0NvbnRlbnRfVHlwZXNdLnhtbCI6aSgiW0NvbnRlbnRfVHlwZXNdLnhtbCIpfSxQPWUuYnV0dG9ucy5leHBvcnREYXRhKHIuZXhwb3J0T3B0aW9ucyksYz1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhyKTtjLnRpdGxlJiYobyhbYy50aXRsZV0pLFVyKEMsbSwwLDEsUC5oZWFkZXIubGVuZ3RoKSxzZSgicm93Omxhc3QgYyIsQykuYXR0cigicyIsIjUxIikpLGMubWVzc2FnZVRvcCYmKG8oW2MubWVzc2FnZVRvcF0pLFVyKEMsbSwwLDEsUC5oZWFkZXIubGVuZ3RoKSksci5oZWFkZXImJnUoUC5oZWFkZXJTdHJ1Y3R1cmUpO2Zvcih2YXIgVT1tLGw9MCxoPVAuYm9keS5sZW5ndGg7bDxoO2wrKylvKFAuYm9keVtsXSk7cD1tLHIuZm9vdGVyJiZQLmZvb3RlciYmdShQLmZvb3RlclN0cnVjdHVyZSksYy5tZXNzYWdlQm90dG9tJiYobyhbYy5tZXNzYWdlQm90dG9tXSksVXIoQyxtLDAsMSxQLmhlYWRlci5sZW5ndGgpKTt2YXIgXz1EZShDLCJjb2xzIik7c2UoIndvcmtzaGVldCIsQykucHJlcGVuZChfKTtmb3IodmFyIEY9MCxPPVAuaGVhZGVyLmxlbmd0aDtGPE87RisrKV8uYXBwZW5kQ2hpbGQoRGUoQywiY29sIix7YXR0cjp7bWluOkYrMSxtYXg6RisxLHdpZHRoOlpsKFAsRiksY3VzdG9tV2lkdGg6MX19KSk7dmFyIGY9VC54bFsid29ya2Jvb2sueG1sIl07c2UoInNoZWV0cyBzaGVldCIsZikuYXR0cigibmFtZSIsQnMocikpLHIuYXV0b0ZpbHRlciYmKHNlKCJtZXJnZUNlbGxzIixDKS5iZWZvcmUoRGUoQywiYXV0b0ZpbHRlciIse2F0dHI6e3JlZjoiQSIrVSsiOiIrb3IoUC5oZWFkZXIubGVuZ3RoLTEpK3B9fSkpLHNlKCJkZWZpbmVkTmFtZXMiLGYpLmFwcGVuZChEZShmLCJkZWZpbmVkTmFtZSIse2F0dHI6e25hbWU6Il94bG5tLl9GaWx0ZXJEYXRhYmFzZSIsbG9jYWxTaGVldElkOiIwIixoaWRkZW46MX0sdGV4dDoiJyIrQnMocikucmVwbGFjZSgvJy9nLCInJyIpKyInISRBJCIrVSsiOiIrb3IoUC5oZWFkZXIubGVuZ3RoLTEpK3B9KSkpLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShULHIsZSksc2UoIm1lcmdlQ2VsbHMiLEMpLmNoaWxkcmVuKCkubGVuZ3RoPT09MCYmc2UoIm1lcmdlQ2VsbHMiLEMpLnJlbW92ZSgpO3ZhciBmPW5ldyhaaSgpKSxVPXtjb21wcmVzc2lvbjoiREVGTEFURSIsdHlwZToiYmxvYiIsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0In0sWD0oTXMoZixUKSxjLmZpbGVuYW1lKTsxNzU8WCYmKFg9WC5zdWJzdHIoMCwxNzUpKSxyLmN1c3RvbWl6ZVppcCYmci5jdXN0b21pemVaaXAoZixQLFgpLGYuZ2VuZXJhdGVBc3luYz9mLmdlbmVyYXRlQXN5bmMoVSkudGhlbihmdW5jdGlvbihRKXtXcihRLFgpLHMoKX0pOihXcihmLmdlbmVyYXRlKFUpLFgpLHMoKSl9LGFzeW5jOjEwMCxmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIueGxzeCIsZXhwb3J0T3B0aW9uczp7fSxoZWFkZXI6ITAsZm9vdGVyOiEwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixjcmVhdGVFbXB0eUNlbGxzOiExLGF1dG9GaWx0ZXI6ITEsc2hlZXROYW1lOiIifSxhdC5leHQuYnV0dG9ucy5wZGZIdG1sNT17Y2xhc3NOYW1lOiJidXR0b25zLXBkZiBidXR0b25zLWh0bWw1IixhdmFpbGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkZpbGVSZWFkZXIhPT12b2lkIDAmJktpKCl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5wZGYiLCJQREYiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsbSxuLHIscyl7dmFyIGk9bS5idXR0b25zLmV4cG9ydERhdGEoci5leHBvcnRPcHRpb25zKSxvPW0uYnV0dG9ucy5leHBvcnRJbmZvKHIpLHU9W107ci5oZWFkZXImJmkuaGVhZGVyU3RydWN0dXJlLmZvckVhY2goZnVuY3Rpb24oQyl7dS5wdXNoKEMubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5P3t0ZXh0OnkudGl0bGUsY29sU3Bhbjp5LmNvbHNwYW4scm93U3Bhbjp5LnJvd3NwYW4sc3R5bGU6InRhYmxlSGVhZGVyIn06e319KSl9KTtmb3IodmFyIHA9MCxiPWkuYm9keS5sZW5ndGg7cDxiO3ArKyl1LnB1c2goaS5ib2R5W3BdLm1hcChmdW5jdGlvbihDKXtyZXR1cm57dGV4dDpDPT1udWxsPyIiOnR5cGVvZiBDPT0ic3RyaW5nIj9DOkMudG9TdHJpbmcoKX19KSk7ci5mb290ZXImJmkuZm9vdGVyU3RydWN0dXJlLmZvckVhY2goZnVuY3Rpb24oQyl7dS5wdXNoKEMubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5P3t0ZXh0OnkudGl0bGUsY29sU3Bhbjp5LmNvbHNwYW4scm93U3Bhbjp5LnJvd3NwYW4sc3R5bGU6InRhYmxlSGVhZGVyIn06e319KSl9KTt2YXIgZz17cGFnZVNpemU6ci5wYWdlU2l6ZSxwYWdlT3JpZW50YXRpb246ci5vcmllbnRhdGlvbixjb250ZW50Olt7c3R5bGU6InRhYmxlIix0YWJsZTp7aGVhZGVyUm93czppLmhlYWRlclN0cnVjdHVyZS5sZW5ndGgsZm9vdGVyUm93czppLmZvb3RlclN0cnVjdHVyZS5sZW5ndGgsYm9keTp1fSxsYXlvdXQ6e2hMaW5lV2lkdGg6ZnVuY3Rpb24oQyx5KXtyZXR1cm4gQz09PTB8fEM9PT15LnRhYmxlLmJvZHkubGVuZ3RoPzA6LjV9LHZMaW5lV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saExpbmVDb2xvcjpmdW5jdGlvbihDLHkpe3JldHVybiBDPT09eS50YWJsZS5oZWFkZXJSb3dzfHxDPT09eS50YWJsZS5ib2R5Lmxlbmd0aC15LnRhYmxlLmZvb3RlclJvd3M/IiMzMzMiOiIjZGRkIn0sZmlsbENvbG9yOmZ1bmN0aW9uKEMpe3JldHVybiBDPGkuaGVhZGVyU3RydWN0dXJlLmxlbmd0aD8iI2ZmZiI6QyUyPT0wPyIjZjNmM2YzIjpudWxsfSxwYWRkaW5nVG9wOmZ1bmN0aW9uKCl7cmV0dXJuIDV9LHBhZGRpbmdCb3R0b206ZnVuY3Rpb24oKXtyZXR1cm4gNX19fV0sc3R5bGVzOnt0YWJsZUhlYWRlcjp7Ym9sZDohMCxmb250U2l6ZToxMSxhbGlnbm1lbnQ6ImNlbnRlciJ9LHRhYmxlRm9vdGVyOntib2xkOiEwLGZvbnRTaXplOjExfSx0YWJsZTp7bWFyZ2luOlswLDUsMCw1XX0sdGl0bGU6e2FsaWdubWVudDoiY2VudGVyIixmb250U2l6ZToxM30sbWVzc2FnZTp7fX0sZGVmYXVsdFN0eWxlOntmb250U2l6ZToxMH19LG09KG8ubWVzc2FnZVRvcCYmZy5jb250ZW50LnVuc2hpZnQoe3RleHQ6by5tZXNzYWdlVG9wLHN0eWxlOiJtZXNzYWdlIixtYXJnaW46WzAsMCwwLDEyXX0pLG8ubWVzc2FnZUJvdHRvbSYmZy5jb250ZW50LnB1c2goe3RleHQ6by5tZXNzYWdlQm90dG9tLHN0eWxlOiJtZXNzYWdlIixtYXJnaW46WzAsMCwwLDEyXX0pLG8udGl0bGUmJmcuY29udGVudC51bnNoaWZ0KHt0ZXh0Om8udGl0bGUsc3R5bGU6InRpdGxlIixtYXJnaW46WzAsMCwwLDEyXX0pLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShnLHIsbSksS2koKS5jcmVhdGVQZGYoZykpO3IuZG93bmxvYWQhPT0ib3BlbiJ8fE9zKCk/bS5kb3dubG9hZChvLmZpbGVuYW1lKTptLm9wZW4oKSxzKCl9LGFzeW5jOjEwMCx0aXRsZToiKiIsZmlsZW5hbWU6IioiLGV4dGVuc2lvbjoiLnBkZiIsZXhwb3J0T3B0aW9uczp7fSxvcmllbnRhdGlvbjoicG9ydHJhaXQiLHBhZ2VTaXplOm5hdmlnYXRvci5sYW5ndWFnZT09PSJlbi1VUyJ8fG5hdmlnYXRvci5sYW5ndWFnZT09PSJlbi1DQSI/IkxFVFRFUiI6IkE0IixoZWFkZXI6ITAsZm9vdGVyOiEwLG1lc3NhZ2VUb3A6IioiLG1lc3NhZ2VCb3R0b206IioiLGN1c3RvbWl6ZTpudWxsLGRvd25sb2FkOiJkb3dubG9hZCJ9O3ZhciBIcz1pZShhZSgpLDEpO3ZhciBqbj1Icy5kZWZhdWx0LHpuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxLbD1mdW5jdGlvbih0KXtyZXR1cm4gdD1qbih0KS5jbG9uZSgpWzBdLHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJsaW5rIiYmKHQuaHJlZj1Vcyh0LmhyZWYpKSx0Lm91dGVySFRNTH0sVXM9ZnVuY3Rpb24odCl7cmV0dXJuIHpuLmhyZWY9dCx0PXpuLmhvc3QsdC5pbmRleE9mKCIvIik9PT0tMSYmem4ucGF0aG5hbWUuaW5kZXhPZigiLyIpIT09MCYmKHQrPSIvIiksem4ucHJvdG9jb2wrIi8vIit0K3puLnBhdGhuYW1lK3puLnNlYXJjaH07YXQuZXh0LmJ1dHRvbnMucHJpbnQ9e2NsYXNzTmFtZToiYnV0dG9ucy1wcmludCIsdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLnByaW50IiwiUHJpbnQiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9ZS5idXR0b25zLmV4cG9ydERhdGEoam4uZXh0ZW5kKHtkZWNvZGVFbnRpdGllczohMX0sci5leHBvcnRPcHRpb25zKSksbz1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhyKSx1PWUuY29sdW1ucyhyLmV4cG9ydE9wdGlvbnMuY29sdW1ucykubm9kZXMoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHkuY2xhc3NOYW1lfSkudG9BcnJheSgpLHA9Jzx0YWJsZSBjbGFzcz0iJytlLnRhYmxlKCkubm9kZSgpLmNsYXNzTmFtZSsnIj4nO3IuaGVhZGVyJiYocCs9Ijx0aGVhZD4iK2kuaGVhZGVyU3RydWN0dXJlLm1hcChmdW5jdGlvbih5KXtyZXR1cm4iPHRyPiIreS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIFQ/Jzx0aCBjb2xzcGFuPSInK1QuY29sc3BhbisnIiByb3dzcGFuPSInK1Qucm93c3BhbisnIj4nK1QudGl0bGUrIjwvdGg+IjoiIn0pLmpvaW4oIiIpKyI8L3RyPiJ9KS5qb2luKCIiKSsiPC90aGVhZD4iKSxwKz0iPHRib2R5PiI7Zm9yKHZhciBiPTAsZz1pLmJvZHkubGVuZ3RoO2I8ZztiKyspcCs9ZnVuY3Rpb24oeSxUKXtmb3IodmFyIFA9Ijx0cj4iLGM9MCxsPXkubGVuZ3RoO2M8bDtjKyspe3ZhciBoPXlbY109PT1udWxsfHx5W2NdPT09dm9pZCAwPyIiOnlbY107UCs9IjwiK1QrIiAiKyh1W2NdPydjbGFzcz0iJyt1W2NdKyciJzoiIikrIj4iK2grIjwvIitUKyI+In1yZXR1cm4gUCsiPC90cj4ifShpLmJvZHlbYl0sInRkIik7cCs9IjwvdGJvZHk+IixyLmZvb3RlciYmaS5mb290ZXImJihwKz0iPHRmb290PiIraS5mb290ZXJTdHJ1Y3R1cmUubWFwKGZ1bmN0aW9uKHkpe3JldHVybiI8dHI+Iit5Lm1hcChmdW5jdGlvbihUKXtyZXR1cm4gVD8nPHRoIGNvbHNwYW49IicrVC5jb2xzcGFuKyciIHJvd3NwYW49IicrVC5yb3dzcGFuKyciPicrVC50aXRsZSsiPC90aD4iOiIifSkuam9pbigiIikrIjwvdHI+In0pLmpvaW4oIiIpKyI8L3Rmb290PiIpLHArPSI8L3RhYmxlPiI7dmFyIG09d2luZG93Lm9wZW4oIiIsIiIpO2lmKG0pe20uZG9jdW1lbnQuY2xvc2UoKTt2YXIgQz0iPHRpdGxlPiIrby50aXRsZSsiPC90aXRsZT4iO2puKCJzdHlsZSwgbGluayIpLmVhY2goZnVuY3Rpb24oKXtDKz1LbCh0aGlzKX0pO3RyeXttLmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MPUN9Y2F0Y2h7am4obS5kb2N1bWVudC5oZWFkKS5odG1sKEMpfXIuY3VzdG9tU2NyaXB0cyYmci5jdXN0b21TY3JpcHRzLmZvckVhY2goZnVuY3Rpb24oeSl7dmFyIFQ9bS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtULnNyYz15LG0uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChUKX0pLG0uZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxoMT4iK28udGl0bGUrIjwvaDE+PGRpdj4iKyhvLm1lc3NhZ2VUb3B8fCIiKSsiPC9kaXY+IitwKyI8ZGl2PiIrKG8ubWVzc2FnZUJvdHRvbXx8IiIpKyI8L2Rpdj4iLGpuKG0uZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoImR0LXByaW50LXZpZXciKSxqbigiaW1nIixtLmRvY3VtZW50LmJvZHkpLmVhY2goZnVuY3Rpb24oeSxUKXtULnNldEF0dHJpYnV0ZSgic3JjIixVcyhULmdldEF0dHJpYnV0ZSgic3JjIikpKX0pLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShtLHIsZSksbS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5hdXRvUHJpbnQmJihtLnByaW50KCksbS5jbG9zZSgpKX0sMWUzKSxzKCl9ZWxzZSBlLmJ1dHRvbnMuaW5mbyhlLmkxOG4oImJ1dHRvbnMucHJpbnRFcnJvclRpdGxlIiwiVW5hYmxlIHRvIG9wZW4gcHJpbnQgdmlldyIpLGUuaTE4bigiYnV0dG9ucy5wcmludEVycm9yTXNnIiwiUGxlYXNlIGFsbG93IHBvcHVwcyBpbiB5b3VyIGJyb3dzZXIgZm9yIHRoaXMgc2l0ZSB0byBiZSBhYmxlIHRvIHZpZXcgdGhlIHByaW50IHZpZXcuIiksNWUzKX0sYXN5bmM6MTAwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixleHBvcnRPcHRpb25zOnt9LGhlYWRlcjohMCxmb290ZXI6ITAsYXV0b1ByaW50OiEwLGN1c3RvbWl6ZTpudWxsfTt2YXIgV3M9aWUoYWUoKSwxKTt2YXIgSmw9V3MuZGVmYXVsdDtKbC5leHRlbmQoYXQuZXh0LmJ1dHRvbnMse2NvbHZpczpmdW5jdGlvbih0LGUpe3ZhciBuPW51bGwscj17ZXh0ZW5kOiJjb2xsZWN0aW9uIixpbml0OmZ1bmN0aW9uKHMsaSl7bj1pfSx0ZXh0OmZ1bmN0aW9uKHMpe3JldHVybiBzLmkxOG4oImJ1dHRvbnMuY29sdmlzIiwiQ29sdW1uIHZpc2liaWxpdHkiKX0sY2xhc3NOYW1lOiJidXR0b25zLWNvbHZpcyIsY2xvc2VCdXR0b246ITEsYnV0dG9uczpbe2V4dGVuZDoiY29sdW1uc1RvZ2dsZSIsY29sdW1uczplLmNvbHVtbnMsY29sdW1uVGV4dDplLmNvbHVtblRleHR9XX07cmV0dXJuIHQub24oImNvbHVtbi1yZW9yZGVyLmR0IitlLm5hbWVzcGFjZSxmdW5jdGlvbigpe3QuYnV0dG9uKG51bGwsdC5idXR0b24obnVsbCxuKS5ub2RlKCkpLmNvbGxlY3Rpb25SZWJ1aWxkKFt7ZXh0ZW5kOiJjb2x1bW5zVG9nZ2xlIixjb2x1bW5zOmUuY29sdW1ucyxjb2x1bW5UZXh0OmUuY29sdW1uVGV4dH1dKX0pLHJ9LGNvbHVtbnNUb2dnbGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb2x1bW5zKGUuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5Ub2dnbGUiLGNvbHVtbnM6bixjb2x1bW5UZXh0OmUuY29sdW1uVGV4dH19KS50b0FycmF5KCl9LGNvbHVtblRvZ2dsZTpmdW5jdGlvbih0LGUpe3JldHVybntleHRlbmQ6ImNvbHVtblZpc2liaWxpdHkiLGNvbHVtbnM6ZS5jb2x1bW5zLGNvbHVtblRleHQ6ZS5jb2x1bW5UZXh0fX0sY29sdW1uc1Zpc2liaWxpdHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb2x1bW5zKGUuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5WaXNpYmlsaXR5Iixjb2x1bW5zOm4sdmlzaWJpbGl0eTplLnZpc2liaWxpdHksY29sdW1uVGV4dDplLmNvbHVtblRleHR9fSkudG9BcnJheSgpfSxjb2x1bW5WaXNpYmlsaXR5Ontjb2x1bW5zOnZvaWQgMCx0ZXh0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbi5fY29sdW1uVGV4dCh0LG4pfSxjbGFzc05hbWU6ImJ1dHRvbnMtY29sdW1uVmlzaWJpbGl0eSIsYWN0aW9uOmZ1bmN0aW9uKHQscyxuLHIpe3ZhciBzPXMuY29sdW1ucyhyLmNvbHVtbnMpLGk9cy52aXNpYmxlKCk7cy52aXNpYmxlKHIudmlzaWJpbGl0eSE9PXZvaWQgMD9yLnZpc2liaWxpdHk6IShpLmxlbmd0aCYmaVswXSkpfSxpbml0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2UuYXR0cigiZGF0YS1jdi1pZHgiLG4uY29sdW1ucyksdC5vbigiY29sdW1uLXZpc2liaWxpdHkuZHQiK24ubmFtZXNwYWNlLGZ1bmN0aW9uKHMsaSl7aS5iRGVzdHJveWluZ3x8aS5uVGFibGUhPXQuc2V0dGluZ3MoKVswXS5uVGFibGV8fHIuYWN0aXZlKHQuY29sdW1uKG4uY29sdW1ucykudmlzaWJsZSgpKX0pLm9uKCJjb2x1bW4tcmVvcmRlci5kdCIrbi5uYW1lc3BhY2UsZnVuY3Rpb24oKXtuLmRlc3Ryb3lpbmd8fHQuY29sdW1ucyhuLmNvbHVtbnMpLmNvdW50KCk9PT0xJiYoci50ZXh0KG4uX2NvbHVtblRleHQodCxuKSksci5hY3RpdmUodC5jb2x1bW4obi5jb2x1bW5zKS52aXNpYmxlKCkpKX0pLHRoaXMuYWN0aXZlKHQuY29sdW1uKG4uY29sdW1ucykudmlzaWJsZSgpKX0sZGVzdHJveTpmdW5jdGlvbih0LGUsbil7dC5vZmYoImNvbHVtbi12aXNpYmlsaXR5LmR0IituLm5hbWVzcGFjZSkub2ZmKCJjb2x1bW4tcmVvcmRlci5kdCIrbi5uYW1lc3BhY2UpfSxfY29sdW1uVGV4dDpmdW5jdGlvbih0LGUpe3ZhciBuLHI7cmV0dXJuIHR5cGVvZiBlLnRleHQ9PSJzdHJpbmciP2UudGV4dDoocj10LmNvbHVtbihlLmNvbHVtbnMpLnRpdGxlKCksbj10LmNvbHVtbihlLmNvbHVtbnMpLmluZGV4KCkscj1yLnJlcGxhY2UoL1xuL2csIiAiKS5yZXBsYWNlKC88YnJccypcLz8+L2dpLCIgIikucmVwbGFjZSgvPHNlbGVjdCguKj8pPFwvc2VsZWN0XHMqPi9naSwiIikscj1hdC5CdXR0b25zLnN0cmlwSHRtbENvbW1lbnRzKHIpLHI9YXQudXRpbC5zdHJpcEh0bWwocikudHJpbSgpLGUuY29sdW1uVGV4dD9lLmNvbHVtblRleHQodCxuLHIpOnIpfX0sY29sdmlzUmVzdG9yZTp7Y2xhc3NOYW1lOiJidXR0b25zLWNvbHZpc1Jlc3RvcmUiLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5jb2x2aXNSZXN0b3JlIiwiUmVzdG9yZSB2aXNpYmlsaXR5Iil9LGluaXQ6ZnVuY3Rpb24odCxlLG4pe3QuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5pbml0KCk7ci5fX3Zpc09yaWdpbmFsPT09dm9pZCAwJiYoci5fX3Zpc09yaWdpbmFsPXRoaXMudmlzaWJsZSgpKX0pfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scil7ZS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24ocyl7dmFyIGk9dGhpcy5pbml0KCk7dGhpcy52aXNpYmxlKGkuX192aXNPcmlnaW5hbCl9KX19LGNvbHZpc0dyb3VwOntjbGFzc05hbWU6ImJ1dHRvbnMtY29sdmlzR3JvdXAiLGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXtlLmNvbHVtbnMoci5zaG93KS52aXNpYmxlKCEwLCExKSxlLmNvbHVtbnMoci5oaWRlKS52aXNpYmxlKCExLCExKSxlLmNvbHVtbnMuYWRqdXN0KCl9LHNob3c6W10saGlkZTpbXX19KTt2YXIgUWw9aWUoYWUoKSwxKTt2YXIgR3M9aWUoYWUoKSwxKTt2YXIgdW49R3MuZGVmYXVsdDsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsZTtmdW5jdGlvbiBuKG8pe3Q9byxlPXQuZm4uZGF0YVRhYmxlfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh1LHApe3ZhciBiPXRoaXM7aWYoIWV8fCFlLnZlcnNpb25DaGVja3x8IWUudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJGaXhlZENvbHVtbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIik7dmFyIGc9bmV3IGUuQXBpKHUpO3RoaXMuY2xhc3Nlcz10LmV4dGVuZCghMCx7fSxvLmNsYXNzZXMpLHRoaXMuYz10LmV4dGVuZCghMCx7fSxvLmRlZmF1bHRzLHApLHRoaXMucz17ZHQ6ZyxydGw6dChnLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCJ9LHAmJnAubGVmdENvbHVtbnMhPT12b2lkIDAmJihwLmxlZnQ9cC5sZWZ0Q29sdW1ucykscCYmcC5sZWZ0IT09dm9pZCAwJiYodGhpcy5jW3RoaXMucy5ydGw/ImVuZCI6InN0YXJ0Il09cC5sZWZ0KSxwJiZwLnJpZ2h0Q29sdW1ucyE9PXZvaWQgMCYmKHAucmlnaHQ9cC5yaWdodENvbHVtbnMpLHAmJnAucmlnaHQhPT12b2lkIDAmJih0aGlzLmNbdGhpcy5zLnJ0bD8ic3RhcnQiOiJlbmQiXT1wLnJpZ2h0KSx0aGlzLmRvbT17Ym90dG9tQmxvY2tlcjp0KCI8ZGl2PiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3R0b21CbG9ja2VyKSx0b3BCbG9ja2VyOnQoIjxkaXY+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRvcEJsb2NrZXIpLHNjcm9sbGVyOnQoImRpdi5kdC1zY3JvbGwtYm9keSIsdGhpcy5zLmR0LnRhYmxlKCkuY29udGFpbmVyKCkpfSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT8odGhpcy5fYWRkU3R5bGVzKCksdGhpcy5fc2V0S2V5VGFibGVMaXN0ZW5lcigpKTpnLm9uZSgiaW5pdC5kdC5kdGZjIixmdW5jdGlvbigpe2IuX2FkZFN0eWxlcygpLGIuX3NldEtleVRhYmxlTGlzdGVuZXIoKX0pLGcub24oImNvbHVtbi1zaXppbmcuZHQuZHRmYyBjb2x1bW4tcmVvcmRlci5kdC5kdGZjIGRyYXcuZHQuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fYWRkU3R5bGVzKCl9KTt2YXIgbT1lLnV0aWwuZGVib3VuY2UoZnVuY3Rpb24oKXtiLl9hZGRTdHlsZXMoKX0sNTApO3JldHVybiBnLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdGZjIixmdW5jdGlvbigpe20oKX0pLHRoaXMuZG9tLnNjcm9sbGVyLm9uKCJzY3JvbGwuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fc2Nyb2xsKCl9KSx0aGlzLl9zY3JvbGwoKSxnLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucz10aGlzLGcub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7cmV0dXJuIGIuX2Rlc3Ryb3koKX0pLHRoaXN9cmV0dXJuIG8ucHJvdG90eXBlLmVuZD1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXZvaWQgMD8odT49MCYmdTw9dGhpcy5zLmR0LmNvbHVtbnMoKS5jb3VudCgpJiYodGhpcy5jLmVuZD11LHRoaXMuX2FkZFN0eWxlcygpKSx0aGlzKTp0aGlzLmMuZW5kfSxvLnByb3RvdHlwZS5sZWZ0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuZW5kKHUpOnRoaXMuc3RhcnQodSl9LG8ucHJvdG90eXBlLnJpZ2h0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuc3RhcnQodSk6dGhpcy5lbmQodSl9LG8ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHUpe3JldHVybiB1IT09dm9pZCAwPyh1Pj0wJiZ1PD10aGlzLnMuZHQuY29sdW1ucygpLmNvdW50KCkmJih0aGlzLmMuc3RhcnQ9dSx0aGlzLl9hZGRTdHlsZXMoKSksdGhpcyk6dGhpcy5jLnN0YXJ0fSxvLnByb3RvdHlwZS5fYWRkU3R5bGVzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5zLmR0LHA9dGhpcyxiPXRoaXMucy5kdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmNvdW50KCksZz11LnRhYmxlKCkuaGVhZGVyLnN0cnVjdHVyZSgiOnZpc2libGUiKSxtPXUudGFibGUoKS5mb290ZXIuc3RydWN0dXJlKCI6dmlzaWJsZSIpLEM9dS5jb2x1bW5zKCI6dmlzaWJsZSIpLndpZHRocygpLnRvQXJyYXkoKSx5PXQodS50YWJsZSgpLm5vZGUoKSkuY2xvc2VzdCgiZGl2LmR0LXNjcm9sbCIpLFQ9dCh1LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKVswXSxQPXRoaXMucy5ydGwsYz10aGlzLmMuc3RhcnQsbD10aGlzLmMuZW5kLGg9UD9sOmMsXz1QP2M6bCxGPXUuc2V0dGluZ3MoKVswXS5vQnJvd3Nlci5iYXJXaWR0aDtpZih5Lmxlbmd0aD09PTApcmV0dXJuIHRoaXM7VC5vZmZzZXRXaWR0aD09PVQuY2xpZW50V2lkdGgmJihGPTApLHUuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihRKXt2YXIgRT11LmNvbHVtbi5pbmRleCgidG9WaXNpYmxlIixRKSwkO0U8Yz8oJD1wLl9zdW0oQyxFKSxwLl9maXhDb2x1bW4oRSwkLCJzdGFydCIsZyxtLEYpKTpFPj1iLWw/KCQ9cC5fc3VtKEMsYi1FLTEsITApLHAuX2ZpeENvbHVtbihFLCQsImVuZCIsZyxtLEYpKTpwLl9maXhDb2x1bW4oRSwwLCJub25lIixnLG0sRil9KSx0KHUudGFibGUoKS5ub2RlKCkpLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkU3RhcnQsYz4wKS50b2dnbGVDbGFzcyhwLmNsYXNzZXMudGFibGVGaXhlZEVuZCxsPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkTGVmdCxoPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkUmlnaHQsXz4wKTt2YXIgTz11LnRhYmxlKCkuaGVhZGVyKCksZj11LnRhYmxlKCkuZm9vdGVyKCksVT10KE8pLm91dGVySGVpZ2h0KCksWD10KGYpLm91dGVySGVpZ2h0KCk7dGhpcy5kb20udG9wQmxvY2tlci5hcHBlbmRUbyh5KS5jc3MoInRvcCIsMCkuY3NzKHRoaXMucy5ydGw/ImxlZnQiOiJyaWdodCIsMCkuY3NzKCJoZWlnaHQiLFUpLmNzcygid2lkdGgiLEYrMSkuY3NzKCJkaXNwbGF5IixGPyJibG9jayI6Im5vbmUiKSxmJiZ0aGlzLmRvbS5ib3R0b21CbG9ja2VyLmFwcGVuZFRvKHkpLmNzcygiYm90dG9tIiwwKS5jc3ModGhpcy5zLnJ0bD8ibGVmdCI6InJpZ2h0IiwwKS5jc3MoImhlaWdodCIsWCkuY3NzKCJ3aWR0aCIsRisxKS5jc3MoImRpc3BsYXkiLEY/ImJsb2NrIjoibm9uZSIpfSxvLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbigpe3RoaXMucy5kdC5vZmYoIi5kdGZjIiksdGhpcy5kb20uc2Nyb2xsZXIub2ZmKCIuZHRmYyIpLHQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdFbmQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0xlZnQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ1N0YXJ0KyIgIit0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdSaWdodCksdGhpcy5kb20uYm90dG9tQmxvY2tlci5yZW1vdmUoKSx0aGlzLmRvbS50b3BCbG9ja2VyLnJlbW92ZSgpfSxvLnByb3RvdHlwZS5fZml4Q29sdW1uPWZ1bmN0aW9uKHUscCxiLGcsbSxDKXt2YXIgeT10aGlzLFQ9dGhpcy5zLmR0LFA9ZnVuY3Rpb24oYyxsKXtpZihiPT09Im5vbmUiKWMuY3NzKCJwb3NpdGlvbiIsIiIpLmNzcygibGVmdCIsIiIpLmNzcygicmlnaHQiLCIiKS5yZW1vdmVDbGFzcyh5LmNsYXNzZXMuZml4ZWRFbmQrIiAiK3kuY2xhc3Nlcy5maXhlZExlZnQrIiAiK3kuY2xhc3Nlcy5maXhlZFJpZ2h0KyIgIit5LmNsYXNzZXMuZml4ZWRTdGFydCk7ZWxzZXt2YXIgaD1iPT09InN0YXJ0Ij8ibGVmdCI6InJpZ2h0Ijt5LnMucnRsJiYoaD1iPT09InN0YXJ0Ij8icmlnaHQiOiJsZWZ0Iik7dmFyIF89cDtiPT09ImVuZCImJihsPT09ImhlYWRlciJ8fGw9PT0iZm9vdGVyIikmJihfKz1DKSxjLmNzcygicG9zaXRpb24iLCJzdGlja3kiKS5jc3MoaCxfKS5hZGRDbGFzcyhiPT09InN0YXJ0Ij95LmNsYXNzZXMuZml4ZWRTdGFydDp5LmNsYXNzZXMuZml4ZWRFbmQpLmFkZENsYXNzKGg9PT0ibGVmdCI/eS5jbGFzc2VzLmZpeGVkTGVmdDp5LmNsYXNzZXMuZml4ZWRSaWdodCl9fTtnLmZvckVhY2goZnVuY3Rpb24oYyl7Y1t1XSYmUCh0KGNbdV0uY2VsbCksImhlYWRlciIpfSksUChULmNvbHVtbih1KyI6dmlzaWJsZSIse3BhZ2U6ImN1cnJlbnQifSkubm9kZXMoKS50byQoKSwiYm9keSIpLG0mJm0uZm9yRWFjaChmdW5jdGlvbihjKXtjW3VdJiZQKHQoY1t1XS5jZWxsKSwiZm9vdGVyIil9KX0sby5wcm90b3R5cGUuX3Njcm9sbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuZG9tLnNjcm9sbGVyWzBdO2lmKHUpe3ZhciBwPXQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5hZGQodGhpcy5zLmR0LnRhYmxlKCkuaGVhZGVyKCkucGFyZW50Tm9kZSkuYWRkKHRoaXMucy5kdC50YWJsZSgpLmZvb3RlcigpLnBhcmVudE5vZGUpLmFkZCgiZGl2LmR0LXNjcm9sbC1oZWFkSW5uZXIgdGFibGUiLHRoaXMucy5kdC50YWJsZSgpLmNvbnRhaW5lcigpKS5hZGQoImRpdi5kdC1zY3JvbGwtZm9vdElubmVyIHRhYmxlIix0aGlzLnMuZHQudGFibGUoKS5jb250YWluZXIoKSksYj11LnNjcm9sbExlZnQsZz0hdGhpcy5zLnJ0bCxtPWIhPT0wLEM9dS5zY3JvbGxXaWR0aD51LmNsaWVudFdpZHRoK01hdGguYWJzKGIpKzE7cC50b2dnbGVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdTdGFydCxtKSxwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0VuZCxDKSxwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0xlZnQsbSYmZ3x8QyYmIWcpLHAudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nUmlnaHQsQyYmZ3x8bSYmIWcpfX0sby5wcm90b3R5cGUuX3NldEtleVRhYmxlTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzO3RoaXMucy5kdC5vbigia2V5LWZvY3VzLmR0LmR0ZmMiLGZ1bmN0aW9uKHAsYixnKXt2YXIgbSxDPXQoZy5ub2RlKCkpLm9mZnNldCgpLHk9dS5kb20uc2Nyb2xsZXJbMF0sVD10KHQodS5zLmR0LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKSk7aWYodS5jLnN0YXJ0PjApe3ZhciBQPXQodS5zLmR0LmNvbHVtbih1LmMuc3RhcnQtMSkuaGVhZGVyKCkpLGM9UC5vZmZzZXQoKSxsPVAub3V0ZXJXaWR0aCgpO3QoZy5ub2RlKCkpLmhhc0NsYXNzKHUuY2xhc3Nlcy5maXhlZExlZnQpP1Quc2Nyb2xsTGVmdCgwKTpDLmxlZnQ8Yy5sZWZ0K2wmJihtPVQuc2Nyb2xsTGVmdCgpLFQuc2Nyb2xsTGVmdChtLShjLmxlZnQrbC1DLmxlZnQpKSl9aWYodS5jLmVuZD4wKXt2YXIgaD11LnMuZHQuY29sdW1ucygpLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoLF89dChnLm5vZGUoKSkub3V0ZXJXaWR0aCgpLEY9dCh1LnMuZHQuY29sdW1uKGgtdS5jLmVuZCkuaGVhZGVyKCkpLE89Ri5vZmZzZXQoKTt0KGcubm9kZSgpKS5oYXNDbGFzcyh1LmNsYXNzZXMuZml4ZWRSaWdodCk/VC5zY3JvbGxMZWZ0KHkuc2Nyb2xsV2lkdGgteS5jbGllbnRXaWR0aCk6Qy5sZWZ0K18+Ty5sZWZ0JiYobT1ULnNjcm9sbExlZnQoKSxULnNjcm9sbExlZnQobS0oTy5sZWZ0LShDLmxlZnQrXykpKSl9fSl9LG8ucHJvdG90eXBlLl9zdW09ZnVuY3Rpb24odSxwLGIpe3JldHVybiBiPT09dm9pZCAwJiYoYj0hMSksYiYmKHU9dS5zbGljZSgpLnJldmVyc2UoKSksdS5zbGljZSgwLHApLnJlZHVjZShmdW5jdGlvbihnLG0pe3JldHVybiBnK219LDApfSxvLnZlcnNpb249IjUuMC4wIixvLmNsYXNzZXM9e2JvdHRvbUJsb2NrZXI6ImR0ZmMtYm90dG9tLWJsb2NrZXIiLGZpeGVkRW5kOiJkdGZjLWZpeGVkLWVuZCIsZml4ZWRMZWZ0OiJkdGZjLWZpeGVkLWxlZnQiLGZpeGVkUmlnaHQ6ImR0ZmMtZml4ZWQtcmlnaHQiLGZpeGVkU3RhcnQ6ImR0ZmMtZml4ZWQtc3RhcnQiLHRhYmxlRml4ZWRFbmQ6ImR0ZmMtaGFzLWVuZCIsdGFibGVGaXhlZExlZnQ6ImR0ZmMtaGFzLWxlZnQiLHRhYmxlRml4ZWRSaWdodDoiZHRmYy1oYXMtcmlnaHQiLHRhYmxlRml4ZWRTdGFydDoiZHRmYy1oYXMtc3RhcnQiLHRhYmxlU2Nyb2xsaW5nRW5kOiJkdGZjLXNjcm9sbGluZy1lbmQiLHRhYmxlU2Nyb2xsaW5nTGVmdDoiZHRmYy1zY3JvbGxpbmctbGVmdCIsdGFibGVTY3JvbGxpbmdSaWdodDoiZHRmYy1zY3JvbGxpbmctcmlnaHQiLHRhYmxlU2Nyb2xsaW5nU3RhcnQ6ImR0ZmMtc2Nyb2xsaW5nLXN0YXJ0Iix0b3BCbG9ja2VyOiJkdGZjLXRvcC1ibG9ja2VyIn0sby5kZWZhdWx0cz17aTE4bjp7YnV0dG9uOiJGaXhlZENvbHVtbnMifSxzdGFydDoxLGVuZDowfSxvfSgpO24odW4pLHVuLmZuLmRhdGFUYWJsZS5GaXhlZENvbHVtbnM9cix1bi5mbi5EYXRhVGFibGUuRml4ZWRDb2x1bW5zPXI7dmFyIHM9YXQuQXBpLnJlZ2lzdGVyO3MoImZpeGVkQ29sdW1ucygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzfSkscygiZml4ZWRDb2x1bW5zKCkuc3RhcnQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMuc3RhcnQobyksdGhpcyk6dS5fZml4ZWRDb2x1bW5zLnN0YXJ0KCl9KSxzKCJmaXhlZENvbHVtbnMoKS5lbmQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMuZW5kKG8pLHRoaXMpOnUuX2ZpeGVkQ29sdW1ucy5lbmQoKX0pLHMoImZpeGVkQ29sdW1ucygpLmxlZnQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMubGVmdChvKSx0aGlzKTp1Ll9maXhlZENvbHVtbnMubGVmdCgpfSkscygiZml4ZWRDb2x1bW5zKCkucmlnaHQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMucmlnaHQobyksdGhpcyk6dS5fZml4ZWRDb2x1bW5zLnJpZ2h0KCl9KSxhdC5leHQuYnV0dG9ucy5maXhlZENvbHVtbnM9e2FjdGlvbjpmdW5jdGlvbihvLHUscCxiKXt1bihwKS5hdHRyKCJhY3RpdmUiKT8odW4ocCkucmVtb3ZlQXR0cigiYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHUuZml4ZWRDb2x1bW5zKCkuc3RhcnQoMCksdS5maXhlZENvbHVtbnMoKS5lbmQoMCkpOih1bihwKS5hdHRyKCJhY3RpdmUiLCJ0cnVlIikuYWRkQ2xhc3MoImFjdGl2ZSIpLHUuZml4ZWRDb2x1bW5zKCkuc3RhcnQoYi5jb25maWcuc3RhcnQpLHUuZml4ZWRDb2x1bW5zKCkuZW5kKGIuY29uZmlnLmVuZCkpfSxjb25maWc6e3N0YXJ0OjEsZW5kOjB9LGluaXQ6ZnVuY3Rpb24obyx1LHApe28uc2V0dGluZ3MoKVswXS5fZml4ZWRDb2x1bW5zPT09dm9pZCAwJiZpKG8uc2V0dGluZ3MoKSxwKSx1bih1KS5hdHRyKCJhY3RpdmUiLCJ0cnVlIikuYWRkQ2xhc3MoImFjdGl2ZSIpLG8uYnV0dG9uKHUpLnRleHQocC50ZXh0fHxvLmkxOG4oImJ1dHRvbnMuZml4ZWRDb2x1bW5zIixvLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucy5jLmkxOG4uYnV0dG9uKSl9LHRleHQ6bnVsbH07ZnVuY3Rpb24gaShvLHUpe3U9PT12b2lkIDAmJih1PW51bGwpO3ZhciBwPW5ldyBhdC5BcGkobyksYj11fHxwLmluaXQoKS5maXhlZENvbHVtbnN8fGF0LmRlZmF1bHRzLmZpeGVkQ29sdW1ucyxnPW5ldyByKHAsYik7cmV0dXJuIGd9dW4oZG9jdW1lbnQpLm9uKCJwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24obyx1KXtvLm5hbWVzcGFjZT09PSJkdCImJih1Lm9Jbml0LmZpeGVkQ29sdW1uc3x8YXQuZGVmYXVsdHMuZml4ZWRDb2x1bW5zKSYmKHUuX2ZpeGVkQ29sdW1uc3x8aSh1LG51bGwpKX0pfSkoKTt2YXIgbmQ9aWUoYWUoKSwxKTt2YXIgcXM9aWUoYWUoKSwxKTt2YXIganQ9cXMuZGVmYXVsdCx0ZD0wLGVkPTAsX249ZnVuY3Rpb24odCxlKXtpZighYXQudmVyc2lvbkNoZWNrfHwhYXQudmVyc2lvbkNoZWNrKCIxLjEwLjgiKSl0aHJvdyJLZXlUYWJsZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAuOCBvciBuZXdlciI7dGhpcy5jPWp0LmV4dGVuZCghMCx7fSxhdC5kZWZhdWx0cy5rZXlUYWJsZSxfbi5kZWZhdWx0cyxlKSx0aGlzLnM9e2R0Om5ldyBhdC5BcGkodCksZHREcmF3aW5nOiExLGVuYWJsZTohMCxmb2N1c0RyYXc6ITEsd2FpdGluZ0ZvckRyYXc6ITEsbGFzdEZvY3VzOm51bGwsbmFtZXNwYWNlOiIua2V5VGFibGUtIit0ZCsrLHRhYklucHV0Om51bGx9LHRoaXMuZG9tPXt9O3ZhciBuPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHI9bi5rZXl0YWJsZTtpZihyKXJldHVybiByO24ua2V5dGFibGU9dGhpcyx0aGlzLl9jb25zdHJ1Y3RvcigpfTtqdC5leHRlbmQoX24ucHJvdG90eXBlLHtibHVyOmZ1bmN0aW9uKCl7dGhpcy5fYmx1cigpfSxlbmFibGU6ZnVuY3Rpb24odCl7dGhpcy5zLmVuYWJsZT10fSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5lbmFibGV9LGZvY3VzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fZm9jdXModGhpcy5zLmR0LmNlbGwodCxlKSl9LGZvY3VzZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmxhc3RGb2N1cztpZighZSlyZXR1cm4hMTt2YXIgbj10aGlzLnMubGFzdEZvY3VzLmNlbGwuaW5kZXgoKTtyZXR1cm4gdC5yb3c9PT1uLnJvdyYmdC5jb2x1bW49PT1uLmNvbHVtbn0sX2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fdGFiSW5wdXQoKTt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LG49anQoZS50YWJsZSgpLm5vZGUoKSkscj10aGlzLnMubmFtZXNwYWNlLHM9ITE7aWYobi5jc3MoInBvc2l0aW9uIik9PT0ic3RhdGljIiYmbi5jc3MoInBvc2l0aW9uIiwicmVsYXRpdmUiKSxqdChlLnRhYmxlKCkuYm9keSgpKS5vbigiY2xpY2siK3IsInRoLCB0ZCIsZnVuY3Rpb24odSl7aWYodC5zLmVuYWJsZSE9PSExKXt2YXIgcD1lLmNlbGwodGhpcyk7cC5hbnkoKSYmdC5fZm9jdXMocCxudWxsLCExLHUpfX0pLGp0KGRvY3VtZW50KS5vbigia2V5ZG93biIrcixmdW5jdGlvbih1KXshcyYmIXQucy5kdERyYXdpbmc/dC5fa2V5KHUpOnUucHJldmVudERlZmF1bHQoKX0pLHRoaXMuYy5ibHVyYWJsZSYmanQoZG9jdW1lbnQpLm9uKCJtb3VzZWRvd24iK3IsZnVuY3Rpb24odSl7anQodS50YXJnZXQpLnBhcmVudHMoIi5kYXRhVGFibGVzX2ZpbHRlciwgLmR0LXNlYXJjaCIpLmxlbmd0aCYmdC5fYmx1cigpLCFqdCh1LnRhcmdldCkucGFyZW50cygpLmZpbHRlcihlLnRhYmxlKCkuY29udGFpbmVyKCkpLmxlbmd0aCYmKGp0KHUudGFyZ2V0KS5wYXJlbnRzKCJkaXYuRFRFIikubGVuZ3RofHxqdCh1LnRhcmdldCkucGFyZW50cygiZGl2LmVkaXRvci1kYXRldGltZSIpLmxlbmd0aHx8anQodS50YXJnZXQpLnBhcmVudHMoImRpdi5kdC1kYXRldGltZSIpLmxlbmd0aHx8anQodS50YXJnZXQpLnBhcmVudHMoKS5maWx0ZXIoIi5EVEZDX0Nsb25lZCIpLmxlbmd0aHx8dC5fYmx1cigpKX0pLHRoaXMuYy5lZGl0b3Ipe3ZhciBpPXRoaXMuYy5lZGl0b3I7aS5vbigib3Blbi5rZXlUYWJsZU1haW4iLGZ1bmN0aW9uKHUscCxiKXtwIT09ImlubGluZSImJnQucy5lbmFibGUmJih0LmVuYWJsZSghMSksaS5vbmUoImNsb3NlIityLGZ1bmN0aW9uKCl7dC5lbmFibGUoITApfSkpfSksdGhpcy5jLmVkaXRPbkZvY3VzJiZlLm9uKCJrZXktZm9jdXMiK3IrIiBrZXktcmVmb2N1cyIrcixmdW5jdGlvbih1LHAsYixnKXt0Ll9lZGl0b3IobnVsbCxnLCEwKX0pLGUub24oImtleSIrcixmdW5jdGlvbih1LHAsYixnLG0pe3QuX2VkaXRvcihiLG0sITEpfSksanQoZS50YWJsZSgpLmJvZHkoKSkub24oImRibGNsaWNrIityLCJ0aCwgdGQiLGZ1bmN0aW9uKHUpe2lmKHQucy5lbmFibGUhPT0hMSl7dmFyIHA9ZS5jZWxsKHRoaXMpO3AuYW55KCkmJih0LnMubGFzdEZvY3VzJiZ0aGlzIT09dC5zLmxhc3RGb2N1cy5jZWxsLm5vZGUoKXx8dC5fZWRpdG9yKG51bGwsdSwhMCkpfX0pLGkub24oInByZVN1Ym1pdCIsZnVuY3Rpb24oKXtzPSEwfSkub24oInByZVN1Ym1pdENhbmNlbGxlZCIsZnVuY3Rpb24oKXtzPSExfSkub24oInN1Ym1pdENvbXBsZXRlIixmdW5jdGlvbigpe3M9ITF9KX1lLm9uKCJzdGF0ZVNhdmVQYXJhbXMiK3IsZnVuY3Rpb24odSxwLGIpe2Iua2V5VGFibGU9dC5zLmxhc3RGb2N1cz90LnMubGFzdEZvY3VzLmNlbGwuaW5kZXgoKTpudWxsfSksZS5vbigiY29sdW1uLXZpc2liaWxpdHkiK3IsZnVuY3Rpb24odSl7dC5fdGFiSW5wdXQoKX0pLGUub24oImNvbHVtbi1yZW9yZGVyIityLGZ1bmN0aW9uKHUscCxiKXt2YXIgZz10LnMubGFzdEZvY3VzO2lmKGcmJmcuY2VsbCl7dmFyIG09Zy5yZWxhdGl2ZS5jb2x1bW47Zy5jZWxsWzBdWzBdLmNvbHVtbj1iLm1hcHBpbmcuaW5kZXhPZihtKSxnLnJlbGF0aXZlLmNvbHVtbj1iLm1hcHBpbmcuaW5kZXhPZihtKX19KSxlLm9uKCJwcmVEcmF3IityKyIgc2Nyb2xsZXItd2lsbC1kcmF3IityLGZ1bmN0aW9uKHUpe3Qucy5kdERyYXdpbmc9ITB9KSxlLm9uKCJkcmF3IityLGZ1bmN0aW9uKHUpe2lmKHQucy5kdERyYXdpbmc9ITEsdC5fdGFiSW5wdXQoKSwhdC5zLmZvY3VzRHJhdyl7dmFyIHA9dC5zLmxhc3RGb2N1cztpZihwKXt2YXIgYj10LnMubGFzdEZvY3VzLnJlbGF0aXZlLGc9ZS5wYWdlLmluZm8oKSxtPWIucm93O2lmKGcucmVjb3Jkc0Rpc3BsYXk9PT0wfHxtPGcuc3RhcnR8fG0+Zy5zdGFydCtnLmxlbmd0aClyZXR1cm47bT49Zy5yZWNvcmRzRGlzcGxheSYmKG09Zy5yZWNvcmRzRGlzcGxheS0xKSx0Ll9mb2N1cyhtLGIuY29sdW1uLCEwLHUpfX19KSx0aGlzLmMuY2xpcGJvYXJkJiZ0aGlzLl9jbGlwYm9hcmQoKSxlLm9uKCJkZXN0cm95IityLGZ1bmN0aW9uKCl7dC5fYmx1cighMCksZS5vZmYociksanQoZS50YWJsZSgpLmJvZHkoKSkub2ZmKCJjbGljayIrciwidGgsIHRkIikub2ZmKCJkYmxjbGljayIrciwidGgsIHRkIiksanQoZG9jdW1lbnQpLm9mZigibW91c2Vkb3duIityKS5vZmYoImtleWRvd24iK3IpLm9mZigiY29weSIrcikub2ZmKCJwYXN0ZSIrcil9KTt2YXIgbz1lLnN0YXRlLmxvYWRlZCgpO28mJm8ua2V5VGFibGU/ZS5vbmUoImluaXQiLGZ1bmN0aW9uKCl7dmFyIHU9ZS5jZWxsKG8ua2V5VGFibGUpO3UuYW55KCkmJnUuZm9jdXMoKX0pOnRoaXMuYy5mb2N1cyYmZS5jZWxsKHRoaXMuYy5mb2N1cykuZm9jdXMoKX0sX2JsdXI6ZnVuY3Rpb24odCl7aWYoISghdGhpcy5zLmVuYWJsZXx8IXRoaXMucy5sYXN0Rm9jdXMpKXt2YXIgZT10aGlzLnMubGFzdEZvY3VzLmNlbGw7anQoZS5ub2RlKCkpLnJlbW92ZUNsYXNzKHRoaXMuYy5jbGFzc05hbWUpLHRoaXMucy5sYXN0Rm9jdXM9bnVsbCx0fHwodGhpcy5fdXBkYXRlRml4ZWRDb2x1bW5zKGUuaW5kZXgoKS5jb2x1bW4pLHRoaXMuX2VtaXRFdmVudCgia2V5LWJsdXIiLFt0aGlzLnMuZHQsZV0pKX19LF9jbGlwYm9hcmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnMuZHQsZT10aGlzLG49dGhpcy5zLm5hbWVzcGFjZSxyPXRoaXMuYy5jbGlwYm9hcmQ7d2luZG93LmdldFNlbGVjdGlvbiYmKChyPT09ITB8fHIuY29weSkmJmp0KGRvY3VtZW50KS5vbigiY29weSIrbixmdW5jdGlvbihzKXt2YXIgaT1zLm9yaWdpbmFsRXZlbnQsbz13aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKSx1PWUucy5sYXN0Rm9jdXM7IW8mJnUmJihpLmNsaXBib2FyZERhdGEuc2V0RGF0YSgidGV4dC9wbGFpbiIsdS5jZWxsLnJlbmRlcihlLmMuY2xpcGJvYXJkT3J0aG9nb25hbCkpLGkucHJldmVudERlZmF1bHQoKSl9KSwocj09PSEwfHxyLnBhc3RlKSYmanQoZG9jdW1lbnQpLm9uKCJwYXN0ZSIrbixmdW5jdGlvbihzKXt2YXIgaT1zLm9yaWdpbmFsRXZlbnQsbz1lLnMubGFzdEZvY3VzLHU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxwPWUuYy5lZGl0b3IsYjtpZihvJiYoIXV8fHUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJib2R5IikpaWYoaS5wcmV2ZW50RGVmYXVsdCgpLHdpbmRvdy5jbGlwYm9hcmREYXRhJiZ3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhP2I9d2luZG93LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgiVGV4dCIpOmkuY2xpcGJvYXJkRGF0YSYmaS5jbGlwYm9hcmREYXRhLmdldERhdGEmJihiPWkuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0L3BsYWluIikpLHApe3ZhciBnPWUuX2lubGluZU9wdGlvbnMoby5jZWxsLmluZGV4KCkpO3AuaW5saW5lKGcuY2VsbCxnLmZpZWxkLGcub3B0aW9ucykuc2V0KHAuZGlzcGxheWVkKClbMF0sYikuc3VibWl0KCl9ZWxzZSBvLmNlbGwuZGF0YShiKSx0LmRyYXcoITEpfSkpfSxfY29sdW1uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdCxlPXQuY29sdW1ucyh0aGlzLmMuY29sdW1ucykuaW5kZXhlcygpLG49W107cmV0dXJuIHQuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihyKXtlLmluZGV4T2YocikhPT0tMSYmbi5wdXNoKHIpfSksbn0sX2VkaXRvcjpmdW5jdGlvbih0LGUsbil7aWYodGhpcy5zLmxhc3RGb2N1cyYmIShlJiZlLnR5cGU9PT0iZHJhdyIpKXt2YXIgcj10aGlzLHM9dGhpcy5zLmR0LGk9dGhpcy5jLmVkaXRvcixvPXRoaXMucy5sYXN0Rm9jdXMuY2VsbCx1PXRoaXMucy5uYW1lc3BhY2UrImUiK2VkKys7aWYoIWp0KCJkaXYuRFRFIixvLm5vZGUoKSkubGVuZ3RoJiYhKHQhPT1udWxsJiYodD49MCYmdDw9OXx8dD09PTExfHx0PT09MTJ8fHQ+PTE0JiZ0PD0zMXx8dD49MTEyJiZ0PD0xMjN8fHQ+PTEyNyYmdDw9MTU5KSkpe2UmJihlLnN0b3BQcm9wYWdhdGlvbigpLHQ9PT0xMyYmZS5wcmV2ZW50RGVmYXVsdCgpKTt2YXIgcD1mdW5jdGlvbigpe3ZhciBiPXIuX2lubGluZU9wdGlvbnMoby5pbmRleCgpKTtpLm9uZSgib3BlbiIrdSxmdW5jdGlvbigpe2kub2ZmKCJjYW5jZWxPcGVuIit1KSxufHxqdCgiZGl2LkRURV9GaWVsZF9JbnB1dENvbnRyb2wgaW5wdXQsIGRpdi5EVEVfRmllbGRfSW5wdXRDb250cm9sIHRleHRhcmVhIikuc2VsZWN0KCkscy5rZXlzLmVuYWJsZShuPyJ0YWItb25seSI6Im5hdmlnYXRpb24tb25seSIpLHMub24oImtleS1ibHVyLmVkaXRvciIsZnVuY3Rpb24oZyxtLEMpe2kucy5lZGl0T3B0cy5vbkJsdXIhPT0ic3VibWl0IiYmaS5kaXNwbGF5ZWQoKSYmQy5ub2RlKCk9PT1vLm5vZGUoKSYmaS5zdWJtaXQoKX0pLG4mJmp0KHMudGFibGUoKS5jb250YWluZXIoKSkuYWRkQ2xhc3MoImR0ay1mb2N1cy1hbHQiKSxpLm9uKCJwcmVTdWJtaXRDYW5jZWxsZWQiK3UsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fZm9jdXMobyxudWxsLCExKX0sNTApfSksaS5vbigic3VibWl0VW5zdWNjZXNzZnVsIit1LGZ1bmN0aW9uKCl7ci5fZm9jdXMobyxudWxsLCExKX0pLGkub25lKCJjbG9zZSIrdSxmdW5jdGlvbigpe3Mua2V5cy5lbmFibGUoITApLHMub2ZmKCJrZXktYmx1ci5lZGl0b3IiKSxpLm9mZih1KSxqdChzLnRhYmxlKCkuY29udGFpbmVyKCkpLnJlbW92ZUNsYXNzKCJkdGstZm9jdXMtYWx0Iiksci5zLnJldHVyblN1Ym1pdCYmKHIucy5yZXR1cm5TdWJtaXQ9ITEsci5fZW1pdEV2ZW50KCJrZXktcmV0dXJuLXN1Ym1pdCIsW3Msb10pKX0pfSkub25lKCJjYW5jZWxPcGVuIit1LGZ1bmN0aW9uKCl7aS5vZmYodSl9KS5pbmxpbmUoYi5jZWxsLGIuZmllbGQsYi5vcHRpb25zKX07dD09PTEzPyhuPSEwLGp0KGRvY3VtZW50KS5vbmUoImtleXVwIixmdW5jdGlvbigpe3AoKX0pKTpwKCl9fX0sX2lubGluZU9wdGlvbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYy5lZGl0b3JPcHRpb25zP3RoaXMuYy5lZGl0b3JPcHRpb25zKHQpOntjZWxsOnQsZmllbGQ6dm9pZCAwLG9wdGlvbnM6dm9pZCAwfX0sX2VtaXRFdmVudDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnMuZHQuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuLHIpe3JldHVybiBqdChuLm5UYWJsZSkudHJpZ2dlckhhbmRsZXIodCxlKX0pfSxfZm9jdXM6ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9dGhpcyxpPXRoaXMucy5kdCxvPWkucGFnZS5pbmZvKCksdT10aGlzLnMubGFzdEZvY3VzO2lmKHJ8fChyPW51bGwpLCEhdGhpcy5zLmVuYWJsZSl7aWYodHlwZW9mIHQhPSJudW1iZXIiKXtpZighdC5hbnkoKSlyZXR1cm47dmFyIHA9dC5pbmRleCgpO2lmKGU9cC5jb2x1bW4sdD1pLnJvd3Moe2ZpbHRlcjoiYXBwbGllZCIsb3JkZXI6ImFwcGxpZWQifSkuaW5kZXhlcygpLmluZGV4T2YocC5yb3cpLHQ8MClyZXR1cm47by5zZXJ2ZXJTaWRlJiYodCs9by5zdGFydCl9aWYoby5sZW5ndGghPT0tMSYmKHQ8by5zdGFydHx8dD49by5zdGFydCtvLmxlbmd0aCkpe3RoaXMucy5mb2N1c0RyYXc9ITAsdGhpcy5zLndhaXRpbmdGb3JEcmF3PSEwLGkub25lKCJkcmF3IixmdW5jdGlvbigpe3Mucy5mb2N1c0RyYXc9ITEscy5zLndhaXRpbmdGb3JEcmF3PSExLHMuX2ZvY3VzKHQsZSx2b2lkIDAscil9KS5wYWdlKE1hdGguZmxvb3IodC9vLmxlbmd0aCkpLmRyYXcoITEpO3JldHVybn1pZihqdC5pbkFycmF5KGUsdGhpcy5fY29sdW1ucygpKSE9PS0xKXtvLnNlcnZlclNpZGUmJih0LT1vLnN0YXJ0KTt2YXIgYj1pLmNlbGxzKG51bGwsZSx7c2VhcmNoOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5mbGF0dGVuKCksZz1pLmNlbGwoYlt0XSksbT10aGlzLl9lbWl0RXZlbnQoImtleS1wcmVmb2N1cyIsW3RoaXMucy5kdCxnLHJ8fG51bGxdKTtpZihtLmluZGV4T2YoITEpPT09LTEpe2lmKHUpe2lmKHUubm9kZT09PWcubm9kZSgpKXt0aGlzLl9lbWl0RXZlbnQoImtleS1yZWZvY3VzIixbdGhpcy5zLmR0LGcscnx8bnVsbF0pO3JldHVybn10aGlzLl9ibHVyKCl9dGhpcy5fcmVtb3ZlT3RoZXJGb2N1cygpO3ZhciBDPWp0KGcubm9kZSgpKTtpZihDLmFkZENsYXNzKHRoaXMuYy5jbGFzc05hbWUpLHRoaXMuX3VwZGF0ZUZpeGVkQ29sdW1ucyhlKSxuPT09dm9pZCAwfHxuPT09ITApe3RoaXMuX3Njcm9sbChqdCh3aW5kb3cpLGp0KGRvY3VtZW50LmJvZHkpLEMsIm9mZnNldCIpO3ZhciB5PWkudGFibGUoKS5ib2R5KCkucGFyZW50Tm9kZTtpZih5IT09aS50YWJsZSgpLmhlYWRlcigpLnBhcmVudE5vZGUpe3ZhciBUPWp0KHkucGFyZW50Tm9kZSk7dGhpcy5fc2Nyb2xsKFQsVCxDLCJwb3NpdGlvbiIpfX12YXIgUD1pLnBhZ2UuaW5mbygpO3RoaXMucy5sYXN0Rm9jdXM9e2NlbGw6Zyxub2RlOmcubm9kZSgpLHJlbGF0aXZlOntyb3c6UC5zdGFydCtpLnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuaW5kZXhlcygpLmluZGV4T2YoZy5pbmRleCgpLnJvdyksY29sdW1uOmcuaW5kZXgoKS5jb2x1bW59fSx0aGlzLl9lbWl0RXZlbnQoImtleS1mb2N1cyIsW3RoaXMucy5kdCxnLHJ8fG51bGxdKSxpLnN0YXRlLnNhdmUoKX19fX0sX2tleTpmdW5jdGlvbih0KXtpZih0aGlzLnMud2FpdGluZ0ZvckRyYXcpe3QucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIWp0KHQudGFyZ2V0KS5jbG9zZXN0KCIuZHRlLWlubGluZUFkZCIpLmxlbmd0aCl7dmFyIGU9dGhpcy5zLmVuYWJsZTt0aGlzLnMucmV0dXJuU3VibWl0PShlPT09Im5hdmlnYXRpb24tb25seSJ8fGU9PT0idGFiLW9ubHkiKSYmdC5rZXlDb2RlPT09MTM7dmFyIG49ZT09PSEwfHxlPT09Im5hdmlnYXRpb24tb25seSI7aWYoZSYmISgodC5rZXlDb2RlPT09MHx8dC5jdHJsS2V5fHx0Lm1ldGFLZXl8fHQuYWx0S2V5KSYmISh0LmN0cmxLZXkmJnQuYWx0S2V5KSkpe3ZhciByPXRoaXMucy5sYXN0Rm9jdXM7aWYocil7aWYoIXRoaXMucy5kdC5jZWxsKHIubm9kZSkuYW55KCkpe3RoaXMucy5sYXN0Rm9jdXM9bnVsbDtyZXR1cm59dmFyIHM9dGhpcyxpPXRoaXMucy5kdCxvPSEhdGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub1Njcm9sbC5zWTtpZighKHRoaXMuYy5rZXlzJiZqdC5pbkFycmF5KHQua2V5Q29kZSx0aGlzLmMua2V5cyk9PT0tMSkpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSA5OnQucHJldmVudERlZmF1bHQoKSx0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LHQuc2hpZnRLZXk/ImxlZnQiOiJyaWdodCIsITApfSk7YnJlYWs7Y2FzZSAyNzppZihqdChyLm5vZGUpLmZpbmQoImRpdi5EVEUiKS5sZW5ndGgpcmV0dXJuO3RoaXMuYy5ibHVyYWJsZSYmZT09PSEwJiZ0aGlzLl9ibHVyKCk7YnJlYWs7Y2FzZSAzMzpjYXNlIDM0Om4mJiFvJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe2kucGFnZSh0LmtleUNvZGU9PT0zMz8icHJldmlvdXMiOiJuZXh0IikuZHJhdyghMSl9KSk7YnJlYWs7Y2FzZSAzNTpjYXNlIDM2Om4mJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7dmFyIHU9aS5jZWxscyh7cGFnZToiY3VycmVudCJ9KS5pbmRleGVzKCkscD1zLl9jb2x1bW5zKCk7cy5fZm9jdXMoaS5jZWxsKHVbdC5rZXlDb2RlPT09MzU/dS5sZW5ndGgtMTpwWzBdXSksbnVsbCwhMCx0KX0pKTticmVhaztjYXNlIDM3Om4mJnRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe3MuX3NoaWZ0KHQsImxlZnQiKX0pO2JyZWFrO2Nhc2UgMzg6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwidXAiKX0pO2JyZWFrO2Nhc2UgMzk6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwicmlnaHQiKX0pO2JyZWFrO2Nhc2UgNDA6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwiZG93biIpfSk7YnJlYWs7Y2FzZSAxMTM6aWYodGhpcy5jLmVkaXRvcil7dGhpcy5fZWRpdG9yKG51bGwsdCwhMCk7YnJlYWt9ZGVmYXVsdDplPT09ITAmJnRoaXMuX2VtaXRFdmVudCgia2V5IixbaSx0LmtleUNvZGUsdGhpcy5zLmxhc3RGb2N1cy5jZWxsLHRdKTticmVha319fX19LF9rZXlBY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jLmVkaXRvcjtlJiZlLm1vZGUoKSYmZS5kaXNwbGF5KCk/ZS5zdWJtaXQodCk6dCgpfSxfcmVtb3ZlT3RoZXJGb2N1czpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdC50YWJsZSgpLm5vZGUoKTtqdC5mbi5kYXRhVGFibGUudGFibGVzKHthcGk6ITB9KS5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3RoaXMudGFibGUoKS5ub2RlKCkhPT10JiZ0aGlzLmNlbGwuYmx1cigpfSl9LF9zY3JvbGw6ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9bltyXSgpLGk9bi5vdXRlckhlaWdodCgpLG89bi5vdXRlcldpZHRoKCksdT1lLnNjcm9sbFRvcCgpLHA9ZS5zY3JvbGxMZWZ0KCksYj10LmhlaWdodCgpLGc9dC53aWR0aCgpO3I9PT0icG9zaXRpb24iJiYocy50b3ArPXBhcnNlSW50KG4uY2xvc2VzdCgidGFibGUiKS5jc3MoInRvcCIpLDEwKSkscy50b3A8dSYmcy50b3AraT51LTUmJmUuc2Nyb2xsVG9wKHMudG9wKSxzLmxlZnQ8cCYmZS5zY3JvbGxMZWZ0KHMubGVmdCkscy50b3AraT51K2ImJnMudG9wPHUrYis1JiZpPGImJmUuc2Nyb2xsVG9wKHMudG9wK2ktYikscy5sZWZ0K28+cCtnJiZvPGcmJmUuc2Nyb2xsTGVmdChzLmxlZnQrby1nKX0sX3NoaWZ0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnMuZHQscz1yLnBhZ2UuaW5mbygpLGk9cy5yZWNvcmRzRGlzcGxheSxvPXRoaXMuX2NvbHVtbnMoKSx1PXRoaXMucy5sYXN0Rm9jdXM7aWYodSl7dmFyIHA9dS5jZWxsO2lmKHApe3ZhciBiPXIucm93cyh7ZmlsdGVyOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5pbmRleGVzKCkuaW5kZXhPZihwLmluZGV4KCkucm93KTtzLnNlcnZlclNpZGUmJihiKz1zLnN0YXJ0KTt2YXIgZz1yLmNvbHVtbnMobykuaW5kZXhlcygpLmluZGV4T2YocC5pbmRleCgpLmNvbHVtbiksbT1iLEM9b1tnXTtqdChyLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCImJihlPT09InJpZ2h0Ij9lPSJsZWZ0IjplPT09ImxlZnQiJiYoZT0icmlnaHQiKSksZT09PSJyaWdodCI/Zz49by5sZW5ndGgtMT8obSsrLEM9b1swXSk6Qz1vW2crMV06ZT09PSJsZWZ0Ij9nPT09MD8obS0tLEM9b1tvLmxlbmd0aC0xXSk6Qz1vW2ctMV06ZT09PSJ1cCI/bS0tOmU9PT0iZG93biImJm0rKyxtPj0wJiZtPGkmJmp0LmluQXJyYXkoQyxvKSE9PS0xPyh0JiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fZm9jdXMobSxDLCEwLHQpKTohbnx8IXRoaXMuYy5ibHVyYWJsZT90JiZ0LnByZXZlbnREZWZhdWx0KCk6dGhpcy5fYmx1cigpfX19LF90YWJJbnB1dDpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZHQsbj10aGlzLmMudGFiSW5kZXghPT1udWxsP3RoaXMuYy50YWJJbmRleDplLnNldHRpbmdzKClbMF0uaVRhYkluZGV4O2lmKG4hPS0xKXtpZighdGhpcy5zLnRhYklucHV0KXt2YXIgcj1qdCgnPGRpdj48aW5wdXQgdHlwZT0idGV4dCIgdGFiaW5kZXg9IicrbisnIi8+PC9kaXY+JykuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGhlaWdodDoxLHdpZHRoOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9KTtyLmNoaWxkcmVuKCkub24oImZvY3VzIixmdW5jdGlvbihpKXt2YXIgbz1lLmNlbGwoIjplcSgwKSIsdC5fY29sdW1ucygpLHtwYWdlOiJjdXJyZW50In0pO28uYW55KCkmJnQuX2ZvY3VzKG8sbnVsbCwhMCxpKX0pLHRoaXMucy50YWJJbnB1dD1yfXZhciBzPXRoaXMucy5kdC5jZWxsKCI6ZXEoMCkiLCIwOnZpc2libGUiLHtwYWdlOiJjdXJyZW50IixvcmRlcjoiY3VycmVudCJ9KS5ub2RlKCk7cyYmanQocykucHJlcGVuZCh0aGlzLnMudGFiSW5wdXQpfX0sX3VwZGF0ZUZpeGVkQ29sdW1uczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnMuZHQsbj1lLnNldHRpbmdzKClbMF07aWYobi5fb0ZpeGVkQ29sdW1ucyl7dmFyIHI9bi5fb0ZpeGVkQ29sdW1ucy5zLmlMZWZ0Q29sdW1ucyxzPW4uYW9Db2x1bW5zLmxlbmd0aC1uLl9vRml4ZWRDb2x1bW5zLnMuaVJpZ2h0Q29sdW1uczsodDxyfHx0Pj1zKSYmZS5maXhlZENvbHVtbnMoKS51cGRhdGUoKX19fSk7X24uZGVmYXVsdHM9e2JsdXJhYmxlOiEwLGNsYXNzTmFtZToiZm9jdXMiLGNsaXBib2FyZDohMCxjbGlwYm9hcmRPcnRob2dvbmFsOiJkaXNwbGF5Iixjb2x1bW5zOiIiLGVkaXRvcjpudWxsLGVkaXRPbkZvY3VzOiExLGVkaXRvck9wdGlvbnM6bnVsbCxmb2N1czpudWxsLGtleXM6bnVsbCx0YWJJbmRleDpudWxsfTtfbi52ZXJzaW9uPSIyLjEyLjEiO2p0LmZuLmRhdGFUYWJsZS5LZXlUYWJsZT1fbjtqdC5mbi5EYXRhVGFibGUuS2V5VGFibGU9X247YXQuQXBpLnJlZ2lzdGVyKCJjZWxsLmJsdXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qua2V5dGFibGUmJnQua2V5dGFibGUuYmx1cigpfSl9KTthdC5BcGkucmVnaXN0ZXIoImNlbGwoKS5mb2N1cygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbih0LGUsbil7dC5rZXl0YWJsZSYmdC5rZXl0YWJsZS5mb2N1cyhlLG4pfSl9KTthdC5BcGkucmVnaXN0ZXIoImtleXMuZGlzYWJsZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24odCl7dC5rZXl0YWJsZSYmdC5rZXl0YWJsZS5lbmFibGUoITEpfSl9KTthdC5BcGkucmVnaXN0ZXIoImtleXMuZW5hYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5rZXl0YWJsZSYmZS5rZXl0YWJsZS5lbmFibGUodD09PXZvaWQgMD8hMDp0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJrZXlzLmVuYWJsZWQoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0O3JldHVybiBlLmxlbmd0aCYmZVswXS5rZXl0YWJsZT9lWzBdLmtleXRhYmxlLmVuYWJsZWQoKTohMX0pO2F0LkFwaS5yZWdpc3Rlcigia2V5cy5tb3ZlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5rZXl0YWJsZSYmZS5rZXl0YWJsZS5fc2hpZnQobnVsbCx0LCExKX0pfSk7YXQuZXh0LnNlbGVjdG9yLmNlbGwucHVzaChmdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5mb2N1c2VkLHM9dC5rZXl0YWJsZSxpPVtdO2lmKCFzfHxyPT09dm9pZCAwKXJldHVybiBuO2Zvcih2YXIgbz0wLHU9bi5sZW5ndGg7bzx1O28rKykocj09PSEwJiZzLmZvY3VzZWQobltvXSl8fHI9PT0hMSYmIXMuZm9jdXNlZChuW29dKSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0pO2p0KGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdGsiLGZ1bmN0aW9uKHQsZSxuKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQua2V5cyxzPWF0LmRlZmF1bHRzLmtleXM7aWYocnx8cyl7dmFyIGk9anQuZXh0ZW5kKHt9LHMscik7ciE9PSExJiZuZXcgX24oZSxpKX19fSk7dmFyIHJkPWllKGFlKCksMSk7dmFyIFhzPWllKGFlKCksMSk7dmFyIHplPVhzLmRlZmF1bHQsQ249ZnVuY3Rpb24odCxlKXtpZighYXQudmVyc2lvbkNoZWNrfHwhYXQudmVyc2lvbkNoZWNrKCIxLjExIikpdGhyb3ciUm93R3JvdXAgcmVxdWlyZXMgRGF0YVRhYmxlcyAxLjExIG9yIG5ld2VyIjt0aGlzLmM9emUuZXh0ZW5kKCEwLHt9LGF0LmRlZmF1bHRzLnJvd0dyb3VwLENuLmRlZmF1bHRzLGUpLHRoaXMucz17ZHQ6bmV3IGF0LkFwaSh0KX0sdGhpcy5kb209e307dmFyIG49dGhpcy5zLmR0LnNldHRpbmdzKClbMF0scj1uLnJvd0dyb3VwO2lmKHIpcmV0dXJuIHI7bi5yb3dHcm91cD10aGlzLHRoaXMuX2NvbnN0cnVjdG9yKCl9O3plLmV4dGVuZChDbi5wcm90b3R5cGUse2RhdGFTcmM6ZnVuY3Rpb24odCl7aWYodD09PXZvaWQgMClyZXR1cm4gdGhpcy5jLmRhdGFTcmM7dmFyIGU9dGhpcy5zLmR0O3JldHVybiB0aGlzLmMuZGF0YVNyYz10LHplKGUudGFibGUoKS5ub2RlKCkpLnRyaWdnZXJIYW5kbGVyKCJyb3dncm91cC1kYXRhc3JjLmR0IixbZSx0XSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuZW5hYmxlPSExLHRoaXN9LGVuYWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSExP3RoaXMuZGlzYWJsZSgpOih0aGlzLmMuZW5hYmxlPSEwLHRoaXMpfSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5lbmFibGV9LF9jb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZHQsbj1lLnNldHRpbmdzKClbMF07ZS5vbigiZHJhdy5kdHJnIixmdW5jdGlvbihyLHMpe3QuYy5lbmFibGUmJm49PT1zJiZ0Ll9kcmF3KCl9KSxlLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdHJnIHJlc3BvbnNpdmUtcmVzaXplLmR0LmR0cmciLGZ1bmN0aW9uKCl7dC5fYWRqdXN0Q29sc3BhbigpfSksZS5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtlLm9mZigiLmR0cmciKX0pfSxfYWRqdXN0Q29sc3BhbjpmdW5jdGlvbigpe3plKCJ0ci4iK3RoaXMuYy5jbGFzc05hbWUsdGhpcy5zLmR0LnRhYmxlKCkuYm9keSgpKS5maW5kKCJ0aDp2aXNpYmxlLCB0ZDp2aXNpYmxlIikuYXR0cigiY29sc3BhbiIsdGhpcy5fY29sc3BhbigpKX0sX2NvbHNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmR0LmNvbHVtbnMoKS52aXNpYmxlKCkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0sMCl9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zLmR0LGU9dGhpcy5fZ3JvdXAoMCx0LnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuaW5kZXhlcygpKTt0aGlzLl9ncm91cERpc3BsYXkoMCxlKX0sX2dyb3VwOmZ1bmN0aW9uKHQsZSl7dmFyIG49QXJyYXkuaXNBcnJheSh0aGlzLmMuZGF0YVNyYyk/dGhpcy5jLmRhdGFTcmM6W3RoaXMuYy5kYXRhU3JjXSxyPWF0LnV0aWwuZ2V0KG5bdF0pLHM9dGhpcy5zLmR0LGksbyx1LHAsYj1bXSxnPXRoaXM7Zm9yKHU9MCxwPWUubGVuZ3RoO3U8cDt1Kyspe3ZhciBtPWVbdV0sQz1zLnJvdyhtKS5kYXRhKCk7aT1yKEMsdCksaT09bnVsbCYmKGk9Zy5jLmVtcHR5RGF0YUdyb3VwKSwobz09PXZvaWQgMHx8aSE9PW8pJiYoYi5wdXNoKHtkYXRhUG9pbnQ6aSxyb3dzOltdfSksbz1pKSxiW2IubGVuZ3RoLTFdLnJvd3MucHVzaChtKX1pZihuW3QrMV0hPT12b2lkIDApZm9yKHU9MCxwPWIubGVuZ3RoO3U8cDt1KyspYlt1XS5jaGlsZHJlbj10aGlzLl9ncm91cCh0KzEsYlt1XS5yb3dzKTtyZXR1cm4gYn0sX2dyb3VwRGlzcGxheTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnMuZHQscixzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXt2YXIgbz1lW3NdLHU9by5kYXRhUG9pbnQscCxiPW8ucm93czt0aGlzLmMuc3RhcnRSZW5kZXImJihyPXRoaXMuYy5zdGFydFJlbmRlci5jYWxsKHRoaXMsbi5yb3dzKGIpLHUsdCkscD10aGlzLl9yb3dXcmFwKHIsdGhpcy5jLnN0YXJ0Q2xhc3NOYW1lLHQpLHAmJnAuaW5zZXJ0QmVmb3JlKG4ucm93KGJbMF0pLm5vZGUoKSkpLHRoaXMuYy5lbmRSZW5kZXImJihyPXRoaXMuYy5lbmRSZW5kZXIuY2FsbCh0aGlzLG4ucm93cyhiKSx1LHQpLHA9dGhpcy5fcm93V3JhcChyLHRoaXMuYy5lbmRDbGFzc05hbWUsdCkscCYmcC5pbnNlcnRBZnRlcihuLnJvdyhiW2IubGVuZ3RoLTFdKS5ub2RlKCkpKSxvLmNoaWxkcmVuJiZ0aGlzLl9ncm91cERpc3BsYXkodCsxLG8uY2hpbGRyZW4pfX0sX3Jvd1dyYXA6ZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybih0PT09bnVsbHx8dD09PSIiKSYmKHQ9dGhpcy5jLmVtcHR5RGF0YUdyb3VwKSx0PT1udWxsP251bGw6KHR5cGVvZiB0PT0ib2JqZWN0IiYmdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRyIj9yPXplKHQpOnQgaW5zdGFuY2VvZiB6ZSYmdC5sZW5ndGgmJnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI/cj10OnI9emUoIjx0ci8+IikuYXBwZW5kKHplKCI8dGgvPiIpLmF0dHIoImNvbHNwYW4iLHRoaXMuX2NvbHNwYW4oKSkuYXR0cigic2NvcGUiLCJyb3ciKS5hcHBlbmQodCkpLHIuYWRkQ2xhc3ModGhpcy5jLmNsYXNzTmFtZSkuYWRkQ2xhc3MoZSkuYWRkQ2xhc3MoImR0cmctbGV2ZWwtIituKSl9fSk7Q24uZGVmYXVsdHM9e2NsYXNzTmFtZToiZHRyZy1ncm91cCIsZGF0YVNyYzowLGVtcHR5RGF0YUdyb3VwOiJObyBncm91cCIsZW5hYmxlOiEwLGVuZENsYXNzTmFtZToiZHRyZy1lbmQiLGVuZFJlbmRlcjpudWxsLHN0YXJ0Q2xhc3NOYW1lOiJkdHJnLXN0YXJ0IixzdGFydFJlbmRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBlfX07Q24udmVyc2lvbj0iMS41LjAiO3plLmZuLmRhdGFUYWJsZS5Sb3dHcm91cD1Dbjt6ZS5mbi5EYXRhVGFibGUuUm93R3JvdXA9Q247YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzfSk7YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpLmRpc2FibGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qucm93R3JvdXAmJnQucm93R3JvdXAuZW5hYmxlKCExKX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpLmVuYWJsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uucm93R3JvdXAmJmUucm93R3JvdXAuZW5hYmxlKHQ9PT12b2lkIDA/ITA6dCl9KX0pO2F0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5lbmFibGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aCYmdFswXS5yb3dHcm91cD90WzBdLnJvd0dyb3VwLmVuYWJsZWQoKTohMX0pO2F0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5kYXRhU3JjKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5yb3dHcm91cC5kYXRhU3JjKCk6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uucm93R3JvdXAmJmUucm93R3JvdXAuZGF0YVNyYyh0KX0pfSk7emUoZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0cmciLGZ1bmN0aW9uKHQsZSxuKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQucm93R3JvdXAscz1hdC5kZWZhdWx0cy5yb3dHcm91cDtpZihyfHxzKXt2YXIgaT16ZS5leHRlbmQoe30scyxyKTtyIT09ITEmJm5ldyBDbihlLGkpfX19KTt2YXIgWXM9aWUoYWUoKSwxKTt2YXIgTXQ9WXMuZGVmYXVsdCxjZSxkZT1mdW5jdGlvbih0LGUpe2lmKGRlLmZhY3RvcnkodCxlKSlyZXR1cm4gZGU7dHlwZW9mIGNlPiJ1IiYmKGNlPXdpbmRvdy5tb21lbnQ/d2luZG93Lm1vbWVudDp3aW5kb3cuZGF5anM/d2luZG93LmRheWpzOndpbmRvdy5sdXhvbj93aW5kb3cubHV4b246bnVsbCksdGhpcy5jPU10LmV4dGVuZCghMCx7fSxkZS5kZWZhdWx0cyxlKTt2YXIgbj10aGlzLmMuY2xhc3NQcmVmaXg7aWYoIWNlJiZ0aGlzLmMuZm9ybWF0IT09IllZWVktTU0tREQiKXRocm93IkRhdGVUaW1lOiBXaXRob3V0IG1vbWVudGpzLCBkYXlqcyBvciBsdXhvbiBvbmx5IHRoZSBmb3JtYXQgJ1lZWVktTU0tREQnIGNhbiBiZSB1c2VkIjt0eXBlb2YgdGhpcy5jLm1pbkRhdGU9PSJzdHJpbmciJiYodGhpcy5jLm1pbkRhdGU9bmV3IERhdGUodGhpcy5jLm1pbkRhdGUpKSx0eXBlb2YgdGhpcy5jLm1heERhdGU9PSJzdHJpbmciJiYodGhpcy5jLm1heERhdGU9bmV3IERhdGUodGhpcy5jLm1heERhdGUpKTt2YXIgcj1NdCgnPGRpdiBjbGFzcz0iJytuKyciPjxkaXYgY2xhc3M9IicrbisnLWRhdGUiPjxkaXYgY2xhc3M9IicrbisnLXRpdGxlIj48ZGl2IGNsYXNzPSInK24rJy1pY29uTGVmdCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWljb25SaWdodCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWxhYmVsIj48c3Bhbj48L3NwYW4+PHNlbGVjdCBjbGFzcz0iJytuKyctbW9udGgiPjwvc2VsZWN0PjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWxhYmVsIj48c3Bhbj48L3NwYW4+PHNlbGVjdCBjbGFzcz0iJytuKycteWVhciI+PC9zZWxlY3Q+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iJytuKyctYnV0dG9ucyI+PGEgY2xhc3M9IicrbisnLWNsZWFyIj48L2E+PGEgY2xhc3M9IicrbisnLXRvZGF5Ij48L2E+PC9kaXY+PGRpdiBjbGFzcz0iJytuKyctY2FsZW5kYXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLXRpbWUiPjxkaXYgY2xhc3M9IicrbisnLWhvdXJzIj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1taW51dGVzIj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1zZWNvbmRzIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1lcnJvciI+PC9kaXY+PC9kaXY+Jyk7dGhpcy5kb209e2NvbnRhaW5lcjpyLGRhdGU6ci5maW5kKCIuIituKyItZGF0ZSIpLHRpdGxlOnIuZmluZCgiLiIrbisiLXRpdGxlIiksY2FsZW5kYXI6ci5maW5kKCIuIituKyItY2FsZW5kYXIiKSx0aW1lOnIuZmluZCgiLiIrbisiLXRpbWUiKSxlcnJvcjpyLmZpbmQoIi4iK24rIi1lcnJvciIpLGJ1dHRvbnM6ci5maW5kKCIuIituKyItYnV0dG9ucyIpLGNsZWFyOnIuZmluZCgiLiIrbisiLWNsZWFyIiksdG9kYXk6ci5maW5kKCIuIituKyItdG9kYXkiKSxwcmV2aW91czpyLmZpbmQoIi4iK24rIi1pY29uTGVmdCIpLG5leHQ6ci5maW5kKCIuIituKyItaWNvblJpZ2h0IiksaW5wdXQ6TXQodCl9LHRoaXMucz17ZDpudWxsLGRpc3BsYXk6bnVsbCxtaW51dGVzUmFuZ2U6bnVsbCxzZWNvbmRzUmFuZ2U6bnVsbCxuYW1lc3BhY2U6ImRhdGVpbWUtIitkZS5faW5zdGFuY2UrKyxwYXJ0czp7ZGF0ZTp0aGlzLmMuZm9ybWF0Lm1hdGNoKC9bWU1EXXxMKD8hVCl8bC8pIT09bnVsbCx0aW1lOnRoaXMuYy5mb3JtYXQubWF0Y2goL1tIaG1dfExUfExUUy8pIT09bnVsbCxzZWNvbmRzOnRoaXMuYy5mb3JtYXQuaW5kZXhPZigicyIpIT09LTEsaG91cnMxMjp0aGlzLmMuZm9ybWF0Lm1hdGNoKC9baGFBXS8pIT09bnVsbH19LHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0ZSkuYXBwZW5kKHRoaXMuZG9tLnRpbWUpLmFwcGVuZCh0aGlzLmRvbS5lcnJvciksdGhpcy5kb20uZGF0ZS5hcHBlbmQodGhpcy5kb20udGl0bGUpLmFwcGVuZCh0aGlzLmRvbS5idXR0b25zKS5hcHBlbmQodGhpcy5kb20uY2FsZW5kYXIpLHRoaXMuZG9tLmlucHV0LmFkZENsYXNzKCJkdC1kYXRldGltZSIpLHRoaXMuX2NvbnN0cnVjdG9yKCl9O010LmV4dGVuZChkZS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9oaWRlKCEwKSx0aGlzLmRvbS5jb250YWluZXIub2ZmKCkuZW1wdHkoKSx0aGlzLmRvbS5pbnB1dC5yZW1vdmVDbGFzcygiZHQtZGF0ZXRpbWUiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5vZmYoIi5kYXRldGltZSIpfSxkaXNwbGF5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT12b2lkIDAmJnRoaXMucy5kaXNwbGF5LnNldFVUQ0Z1bGxZZWFyKHQpLGUhPT12b2lkIDAmJnRoaXMucy5kaXNwbGF5LnNldFVUQ01vbnRoKGUtMSksdCE9PXZvaWQgMHx8ZSE9PXZvaWQgMD8odGhpcy5fc2V0VGl0bGUoKSx0aGlzLl9zZXRDYWxhbmRlcigpLHRoaXMpOnttb250aDp0aGlzLnMuZGlzcGxheS5nZXRVVENNb250aCgpKzEseWVhcjp0aGlzLnMuZGlzcGxheS5nZXRVVENGdWxsWWVhcigpfX0sZXJyb3JNc2c6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kb20uZXJyb3I7cmV0dXJuIHQ/ZS5odG1sKHQpOmUuZW1wdHkoKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpZGUoKSx0aGlzfSxtYXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYy5tYXhEYXRlPXR5cGVvZiB0PT0ic3RyaW5nIj9uZXcgRGF0ZSh0KTp0LHRoaXMuX29wdGlvbnNUaXRsZSgpLHRoaXMuX3NldENhbGFuZGVyKCksdGhpc30sbWluOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmMubWluRGF0ZT10eXBlb2YgdD09InN0cmluZyI/bmV3IERhdGUodCk6dCx0aGlzLl9vcHRpb25zVGl0bGUoKSx0aGlzLl9zZXRDYWxhbmRlcigpLHRoaXN9LG93bnM6ZnVuY3Rpb24odCl7cmV0dXJuIE10KHQpLnBhcmVudHMoKS5maWx0ZXIodGhpcy5kb20uY29udGFpbmVyKS5sZW5ndGg+MH0sdmFsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5zLmQ6KHQgaW5zdGFuY2VvZiBEYXRlP3RoaXMucy5kPXRoaXMuX2RhdGVUb1V0Yyh0KTp0PT09bnVsbHx8dD09PSIiP3RoaXMucy5kPW51bGw6dD09PSItLW5vdyI/dGhpcy5zLmQ9dGhpcy5fZGF0ZVRvVXRjKG5ldyBEYXRlKTp0eXBlb2YgdD09InN0cmluZyImJih0aGlzLnMuZD10aGlzLl9kYXRlVG9VdGModGhpcy5fY29udmVydCh0LHRoaXMuYy5mb3JtYXQsbnVsbCkpKSwoZXx8ZT09PXZvaWQgMCkmJih0aGlzLnMuZD90aGlzLl93cml0ZU91dHB1dCgpOnRoaXMuZG9tLmlucHV0LnZhbCh0KSksdGhpcy5zLmRpc3BsYXk9dGhpcy5zLmQ/bmV3IERhdGUodGhpcy5zLmQudG9TdHJpbmcoKSk6bmV3IERhdGUsdGhpcy5zLmRpc3BsYXkuc2V0VVRDRGF0ZSgxKSx0aGlzLl9zZXRUaXRsZSgpLHRoaXMuX3NldENhbGFuZGVyKCksdGhpcy5fc2V0VGltZSgpLHRoaXMpfSx2YWxGb3JtYXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT8odGhpcy52YWwodGhpcy5fY29udmVydChlLHQsbnVsbCkpLHRoaXMpOnRoaXMuX2NvbnZlcnQodGhpcy52YWwoKSxudWxsLHQpfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5jLmNsYXNzUHJlZml4LG49dGhpcy5kb20uaW5wdXQudmFsKCkscj1mdW5jdGlvbigpe3ZhciBzPXQuZG9tLmlucHV0LnZhbCgpO3MhPT1uJiYodC5jLm9uQ2hhbmdlLmNhbGwodCxzLHQucy5kLHQuZG9tLmlucHV0KSxuPXMpfTt0aGlzLnMucGFydHMuZGF0ZXx8dGhpcy5kb20uZGF0ZS5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5zLnBhcnRzLnRpbWV8fHRoaXMuZG9tLnRpbWUuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLHRoaXMucy5wYXJ0cy5zZWNvbmRzfHwodGhpcy5kb20udGltZS5jaGlsZHJlbigiZGl2LiIrZSsiLXNlY29uZHMiKS5yZW1vdmUoKSx0aGlzLmRvbS50aW1lLmNoaWxkcmVuKCJzcGFuIikuZXEoMSkucmVtb3ZlKCkpLHRoaXMuYy5idXR0b25zLmNsZWFyfHx0aGlzLmRvbS5jbGVhci5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5jLmJ1dHRvbnMudG9kYXl8fHRoaXMuZG9tLnRvZGF5LmNzcygiZGlzcGxheSIsIm5vbmUiKSx0aGlzLl9vcHRpb25zVGl0bGUoKSxNdChkb2N1bWVudCkub24oImkxOG4uZHQiLGZ1bmN0aW9uKHMsaSl7aS5vTGFuZ3VhZ2UuZGF0ZXRpbWUmJihNdC5leHRlbmQoITAsdC5jLmkxOG4saS5vTGFuZ3VhZ2UuZGF0ZXRpbWUpLHQuX29wdGlvbnNUaXRsZSgpKX0pLHRoaXMuZG9tLmlucHV0LmF0dHIoInR5cGUiKT09PSJoaWRkZW4iJiYodGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKCJpbmxpbmUiKSx0aGlzLmMuYXR0YWNoVG89ImlucHV0Iix0aGlzLnZhbCh0aGlzLmRvbS5pbnB1dC52YWwoKSwhMSksdGhpcy5fc2hvdygpKSxuJiZ0aGlzLnZhbChuLCExKSx0aGlzLmRvbS5pbnB1dC5hdHRyKCJhdXRvY29tcGxldGUiLCJvZmYiKS5vbigiZm9jdXMuZGF0ZXRpbWUgY2xpY2suZGF0ZXRpbWUiLGZ1bmN0aW9uKCl7dC5kb20uY29udGFpbmVyLmlzKCI6dmlzaWJsZSIpfHx0LmRvbS5pbnB1dC5pcygiOmRpc2FibGVkIil8fCh0LnZhbCh0LmRvbS5pbnB1dC52YWwoKSwhMSksdC5fc2hvdygpKX0pLm9uKCJrZXl1cC5kYXRldGltZSIsZnVuY3Rpb24oKXt0LmRvbS5jb250YWluZXIuaXMoIjp2aXNpYmxlIikmJnQudmFsKHQuZG9tLmlucHV0LnZhbCgpLCExKX0pLHRoaXMuZG9tLmNvbnRhaW5lclswXS5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIixmdW5jdGlvbihzKXtzLnN0b3BQcm9wYWdhdGlvbigpfSksdGhpcy5kb20uY29udGFpbmVyLm9uKCJjaGFuZ2UiLCJzZWxlY3QiLGZ1bmN0aW9uKCl7dmFyIHM9TXQodGhpcyksaT1zLnZhbCgpO2lmKHMuaGFzQ2xhc3MoZSsiLW1vbnRoIikpdC5fY29ycmVjdE1vbnRoKHQucy5kaXNwbGF5LGkpLHQuX3NldFRpdGxlKCksdC5fc2V0Q2FsYW5kZXIoKTtlbHNlIGlmKHMuaGFzQ2xhc3MoZSsiLXllYXIiKSl0LnMuZGlzcGxheS5zZXRVVENGdWxsWWVhcihpKSx0Ll9zZXRUaXRsZSgpLHQuX3NldENhbGFuZGVyKCk7ZWxzZSBpZihzLmhhc0NsYXNzKGUrIi1ob3VycyIpfHxzLmhhc0NsYXNzKGUrIi1hbXBtIikpe2lmKHQucy5wYXJ0cy5ob3VyczEyKXt2YXIgbz1NdCh0LmRvbS5jb250YWluZXIpLmZpbmQoIi4iK2UrIi1ob3VycyIpLnZhbCgpKjEsdT1NdCh0LmRvbS5jb250YWluZXIpLmZpbmQoIi4iK2UrIi1hbXBtIikudmFsKCk9PT0icG0iO3Qucy5kLnNldFVUQ0hvdXJzKG89PT0xMiYmIXU/MDp1JiZvIT09MTI/bysxMjpvKX1lbHNlIHQucy5kLnNldFVUQ0hvdXJzKGkpO3QuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpfWVsc2Ugcy5oYXNDbGFzcyhlKyItbWludXRlcyIpPyh0LnMuZC5zZXRVVENNaW51dGVzKGkpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpKTpzLmhhc0NsYXNzKGUrIi1zZWNvbmRzIikmJih0LnMuZC5zZXRTZWNvbmRzKGkpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpKTt0LmRvbS5pbnB1dC5mb2N1cygpLHQuX3Bvc2l0aW9uKCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHMpe3ZhciBpPXQucy5kLG89cy50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx1PW89PT0ic3BhbiI/cy50YXJnZXQucGFyZW50Tm9kZTpzLnRhcmdldDtpZihvPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxvIT09InNlbGVjdCIpaWYocy5zdG9wUHJvcGFnYXRpb24oKSxvPT09ImEiJiYocy5wcmV2ZW50RGVmYXVsdCgpLE10KHUpLmhhc0NsYXNzKGUrIi1jbGVhciIpPyh0LnMuZD1udWxsLHQuZG9tLmlucHV0LnZhbCgiIiksdC5fd3JpdGVPdXRwdXQoKSx0Ll9zZXRDYWxhbmRlcigpLHQuX3NldFRpbWUoKSxyKCkpOk10KHUpLmhhc0NsYXNzKGUrIi10b2RheSIpJiYodC5zLmRpc3BsYXk9bmV3IERhdGUsdC5fc2V0VGl0bGUoKSx0Ll9zZXRDYWxhbmRlcigpKSksbz09PSJidXR0b24iKXt2YXIgcD1NdCh1KSxiPXAucGFyZW50KCk7aWYoYi5oYXNDbGFzcygiZGlzYWJsZWQiKSYmIWIuaGFzQ2xhc3MoInJhbmdlIikpe3AuYmx1cigpO3JldHVybn1pZihiLmhhc0NsYXNzKGUrIi1pY29uTGVmdCIpKXQucy5kaXNwbGF5LnNldFVUQ01vbnRoKHQucy5kaXNwbGF5LmdldFVUQ01vbnRoKCktMSksdC5fc2V0VGl0bGUoKSx0Ll9zZXRDYWxhbmRlcigpLHQuZG9tLmlucHV0LmZvY3VzKCk7ZWxzZSBpZihiLmhhc0NsYXNzKGUrIi1pY29uUmlnaHQiKSl0Ll9jb3JyZWN0TW9udGgodC5zLmRpc3BsYXksdC5zLmRpc3BsYXkuZ2V0VVRDTW9udGgoKSsxKSx0Ll9zZXRUaXRsZSgpLHQuX3NldENhbGFuZGVyKCksdC5kb20uaW5wdXQuZm9jdXMoKTtlbHNlIGlmKHAucGFyZW50cygiLiIrZSsiLXRpbWUiKS5sZW5ndGgpe3ZhciBnPXAuZGF0YSgidmFsdWUiKSxtPXAuZGF0YSgidW5pdCIpO2lmKGk9dC5fbmVlZFZhbHVlKCksbT09PSJtaW51dGVzIilpZihiLmhhc0NsYXNzKCJkaXNhYmxlZCIpJiZiLmhhc0NsYXNzKCJyYW5nZSIpKXt0LnMubWludXRlc1JhbmdlPWcsdC5fc2V0VGltZSgpO3JldHVybn1lbHNlIHQucy5taW51dGVzUmFuZ2U9bnVsbDtpZihtPT09InNlY29uZHMiKWlmKGIuaGFzQ2xhc3MoImRpc2FibGVkIikmJmIuaGFzQ2xhc3MoInJhbmdlIikpe3Qucy5zZWNvbmRzUmFuZ2U9Zyx0Ll9zZXRUaW1lKCk7cmV0dXJufWVsc2UgdC5zLnNlY29uZHNSYW5nZT1udWxsO2lmKGc9PT0iYW0iKWlmKGkuZ2V0VVRDSG91cnMoKT49MTIpZz1pLmdldFVUQ0hvdXJzKCktMTI7ZWxzZSByZXR1cm47ZWxzZSBpZihnPT09InBtIilpZihpLmdldFVUQ0hvdXJzKCk8MTIpZz1pLmdldFVUQ0hvdXJzKCkrMTI7ZWxzZSByZXR1cm47dmFyIEM9bT09PSJob3VycyI/InNldFVUQ0hvdXJzIjptPT09Im1pbnV0ZXMiPyJzZXRVVENNaW51dGVzIjoic2V0U2Vjb25kcyI7aVtDXShnKSx0Ll9zZXRDYWxhbmRlcigpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpfWVsc2UgaT10Ll9uZWVkVmFsdWUoKSxpLnNldFVUQ0RhdGUoMSksaS5zZXRVVENGdWxsWWVhcihwLmRhdGEoInllYXIiKSksaS5zZXRVVENNb250aChwLmRhdGEoIm1vbnRoIikpLGkuc2V0VVRDRGF0ZShwLmRhdGEoImRheSIpKSx0Ll93cml0ZU91dHB1dCghMCksdC5zLnBhcnRzLnRpbWU/KHQuX3NldENhbGFuZGVyKCksdC5fc2V0VGltZSgpKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5faGlkZSgpfSwxMCkscigpfWVsc2UgdC5kb20uaW5wdXQuZm9jdXMoKX0pfSxfY29tcGFyZURhdGVzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2lzTHV4b24oKT9jZS5EYXRlVGltZS5mcm9tSlNEYXRlKHQpLnRvVVRDKCkudG9JU09EYXRlKCk9PT1jZS5EYXRlVGltZS5mcm9tSlNEYXRlKGUpLnRvVVRDKCkudG9JU09EYXRlKCk6dGhpcy5fZGF0ZVRvVXRjU3RyaW5nKHQpPT09dGhpcy5fZGF0ZVRvVXRjU3RyaW5nKGUpfSxfY29udmVydDpmdW5jdGlvbih0LGUsbil7aWYoIXQpcmV0dXJuIHQ7aWYoY2UpaWYodGhpcy5faXNMdXhvbigpKXt2YXIgcz10IGluc3RhbmNlb2YgRGF0ZT9jZS5EYXRlVGltZS5mcm9tSlNEYXRlKHQpLnRvVVRDKCk6Y2UuRGF0ZVRpbWUuZnJvbUZvcm1hdCh0LGUpO3JldHVybiBzLmlzVmFsaWQ/bj9zLnRvRm9ybWF0KG4pOnMudG9KU0RhdGUoKTpudWxsfWVsc2V7dmFyIGk9dCBpbnN0YW5jZW9mIERhdGU/Y2UudXRjKHQsdm9pZCAwLHRoaXMuYy5sb2NhbGUsdGhpcy5jLnN0cmljdCk6Y2UodCxlLHRoaXMuYy5sb2NhbGUsdGhpcy5jLnN0cmljdCk7cmV0dXJuIGkuaXNWYWxpZCgpP24/aS5mb3JtYXQobik6aS50b0RhdGUoKTpudWxsfWVsc2V7aWYoIWUmJiFufHxlJiZuKXJldHVybiB0O2lmKGUpe3ZhciByPXQubWF0Y2goLyhcZHs0fSlcLShcZHsyfSlcLShcZHsyfSkvKTtyZXR1cm4gcj9uZXcgRGF0ZShyWzFdLHJbMl0tMSxyWzNdKTpudWxsfWVsc2UgcmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKSsiLSIrdGhpcy5fcGFkKHQuZ2V0VVRDTW9udGgoKSsxKSsiLSIrdGhpcy5fcGFkKHQuZ2V0VVRDRGF0ZSgpKX19LF9jb3JyZWN0TW9udGg6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9kYXlzSW5Nb250aCh0LmdldFVUQ0Z1bGxZZWFyKCksZSkscj10LmdldFVUQ0RhdGUoKT5uO3Quc2V0VVRDTW9udGgoZSksciYmKHQuc2V0VVRDRGF0ZShuKSx0LnNldFVUQ01vbnRoKGUpKX0sX2RheXNJbk1vbnRoOmZ1bmN0aW9uKHQsZSl7dmFyIG49dCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKSxyPVszMSxuPzI5OjI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtyZXR1cm4gcltlXX0sX2RhdGVUb1V0YzpmdW5jdGlvbih0KXtyZXR1cm4gdCYmbmV3IERhdGUoRGF0ZS5VVEModC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSx0LmdldEhvdXJzKCksdC5nZXRNaW51dGVzKCksdC5nZXRTZWNvbmRzKCkpKX0sX2RhdGVUb1V0Y1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXNMdXhvbigpP2NlLkRhdGVUaW1lLmZyb21KU0RhdGUodCkudG9VVEMoKS50b0lTT0RhdGUoKTp0LmdldFVUQ0Z1bGxZZWFyKCkrIi0iK3RoaXMuX3BhZCh0LmdldFVUQ01vbnRoKCkrMSkrIi0iK3RoaXMuX3BhZCh0LmdldFVUQ0RhdGUoKSl9LF9oaWRlOmZ1bmN0aW9uKHQpe2lmKCEoIXQmJnRoaXMuZG9tLmlucHV0LmF0dHIoInR5cGUiKT09PSJoaWRkZW4iKSl7dmFyIGU9dGhpcy5zLm5hbWVzcGFjZTt0aGlzLmRvbS5jb250YWluZXIuZGV0YWNoKCksTXQod2luZG93KS5vZmYoIi4iK2UpLE10KGRvY3VtZW50KS5vZmYoImtleWRvd24uIitlKSxNdCgiZGl2LmRhdGFUYWJsZXNfc2Nyb2xsQm9keSIpLm9mZigic2Nyb2xsLiIrZSksTXQoImRpdi5EVEVfQm9keV9Db250ZW50Iikub2ZmKCJzY3JvbGwuIitlKSxNdCgiYm9keSIpLm9mZigiY2xpY2suIitlKSxNdCh0aGlzLmRvbS5pbnB1dFswXS5vZmZzZXRQYXJlbnQpLm9mZigiLiIrZSl9fSxfaG91cnMyNFRvMTI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0wPzEyOnQ+MTI/dC0xMjp0fSxfaHRtbERheTpmdW5jdGlvbih0KXtpZih0LmVtcHR5KXJldHVybic8dGQgY2xhc3M9ImVtcHR5Ij48L3RkPic7dmFyIGU9WyJzZWxlY3RhYmxlIl0sbj10aGlzLmMuY2xhc3NQcmVmaXg7cmV0dXJuIHQuZGlzYWJsZWQmJmUucHVzaCgiZGlzYWJsZWQiKSx0LnRvZGF5JiZlLnB1c2goIm5vdyIpLHQuc2VsZWN0ZWQmJmUucHVzaCgic2VsZWN0ZWQiKSwnPHRkIGRhdGEtZGF5PSInK3QuZGF5KyciIGNsYXNzPSInK2Uuam9pbigiICIpKyciPjxidXR0b24gY2xhc3M9IicrbisiLWJ1dHRvbiAiK24rJy1kYXkiIHR5cGU9ImJ1dHRvbiIgZGF0YS15ZWFyPSInK3QueWVhcisnIiBkYXRhLW1vbnRoPSInK3QubW9udGgrJyIgZGF0YS1kYXk9IicrdC5kYXkrJyI+PHNwYW4+Jyt0LmRheSsiPC9zcGFuPjwvYnV0dG9uPjwvdGQ+In0sX2h0bWxNb250aDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2RhdGVUb1V0YyhuZXcgRGF0ZSkscj10aGlzLl9kYXlzSW5Nb250aCh0LGUpLHM9bmV3IERhdGUoRGF0ZS5VVEModCxlLDEpKS5nZXRVVENEYXkoKSxpPVtdLG89W107dGhpcy5jLmZpcnN0RGF5PjAmJihzLT10aGlzLmMuZmlyc3REYXksczwwJiYocys9NykpO2Zvcih2YXIgdT1yK3MscD11O3A+NzspcC09Nzt1Kz03LXA7dmFyIGI9dGhpcy5jLm1pbkRhdGUsZz10aGlzLmMubWF4RGF0ZTtiJiYoYi5zZXRVVENIb3VycygwKSxiLnNldFVUQ01pbnV0ZXMoMCksYi5zZXRTZWNvbmRzKDApKSxnJiYoZy5zZXRVVENIb3VycygyMyksZy5zZXRVVENNaW51dGVzKDU5KSxnLnNldFNlY29uZHMoNTkpKTtmb3IodmFyIG09MCxDPTA7bTx1O20rKyl7dmFyIHk9bmV3IERhdGUoRGF0ZS5VVEModCxlLDErKG0tcykpKSxUPXRoaXMucy5kP3RoaXMuX2NvbXBhcmVEYXRlcyh5LHRoaXMucy5kKTohMSxQPXRoaXMuX2NvbXBhcmVEYXRlcyh5LG4pLGM9bTxzfHxtPj1yK3MsbD1iJiZ5PGJ8fGcmJnk+ZyxoPXRoaXMuYy5kaXNhYmxlRGF5czsoQXJyYXkuaXNBcnJheShoKSYmTXQuaW5BcnJheSh5LmdldFVUQ0RheSgpLGgpIT09LTF8fHR5cGVvZiBoPT0iZnVuY3Rpb24iJiZoKHkpPT09ITApJiYobD0hMCk7dmFyIF89e2RheToxKyhtLXMpLG1vbnRoOmUseWVhcjp0LHNlbGVjdGVkOlQsdG9kYXk6UCxkaXNhYmxlZDpsLGVtcHR5OmN9O28ucHVzaCh0aGlzLl9odG1sRGF5KF8pKSwrK0M9PT03JiYodGhpcy5jLnNob3dXZWVrTnVtYmVyJiZvLnVuc2hpZnQodGhpcy5faHRtbFdlZWtPZlllYXIobS1zLGUsdCkpLGkucHVzaCgiPHRyPiIrby5qb2luKCIiKSsiPC90cj4iKSxvPVtdLEM9MCl9dmFyIEY9dGhpcy5jLmNsYXNzUHJlZml4LE89RisiLXRhYmxlIjtpZih0aGlzLmMuc2hvd1dlZWtOdW1iZXImJihPKz0iIHdlZWtOdW1iZXIiKSxiKXt2YXIgZj1iPj1uZXcgRGF0ZShEYXRlLlVUQyh0LGUsMSwwLDAsMCkpO3RoaXMuZG9tLnRpdGxlLmZpbmQoImRpdi4iK0YrIi1pY29uTGVmdCIpLmNzcygiZGlzcGxheSIsZj8ibm9uZSI6ImJsb2NrIil9aWYoZyl7dmFyIFU9ZzxuZXcgRGF0ZShEYXRlLlVUQyh0LGUrMSwxLDAsMCwwKSk7dGhpcy5kb20udGl0bGUuZmluZCgiZGl2LiIrRisiLWljb25SaWdodCIpLmNzcygiZGlzcGxheSIsVT8ibm9uZSI6ImJsb2NrIil9cmV0dXJuJzx0YWJsZSBjbGFzcz0iJytPKyciPjx0aGVhZD4nK3RoaXMuX2h0bWxNb250aEhlYWQoKSsiPC90aGVhZD48dGJvZHk+IitpLmpvaW4oIiIpKyI8L3Rib2R5PjwvdGFibGU+In0sX2h0bWxNb250aEhlYWQ6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuYy5maXJzdERheSxuPXRoaXMuYy5pMThuLHI9ZnVuY3Rpb24oaSl7Zm9yKGkrPWU7aT49NzspaS09NztyZXR1cm4gbi53ZWVrZGF5c1tpXX07dGhpcy5jLnNob3dXZWVrTnVtYmVyJiZ0LnB1c2goIjx0aD48L3RoPiIpO2Zvcih2YXIgcz0wO3M8NztzKyspdC5wdXNoKCI8dGg+IityKHMpKyI8L3RoPiIpO3JldHVybiB0LmpvaW4oIiIpfSxfaHRtbFdlZWtPZlllYXI6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBEYXRlKG4sZSx0LDAsMCwwLDApO3Iuc2V0RGF0ZShyLmdldERhdGUoKSs0LShyLmdldERheSgpfHw3KSk7dmFyIHM9bmV3IERhdGUobiwwLDEpLGk9TWF0aC5jZWlsKCgoci1zKS84NjRlNSsxKS83KTtyZXR1cm4nPHRkIGNsYXNzPSInK3RoaXMuYy5jbGFzc1ByZWZpeCsnLXdlZWsiPicraSsiPC90ZD4ifSxfaXNMdXhvbjpmdW5jdGlvbigpe3JldHVybiEhKGNlJiZjZS5EYXRlVGltZSYmY2UuRHVyYXRpb24mJmNlLlNldHRpbmdzKX0sX25lZWRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnMuZHx8KHRoaXMucy5kPXRoaXMuX2RhdGVUb1V0YyhuZXcgRGF0ZSksdGhpcy5zLnBhcnRzLnRpbWV8fCh0aGlzLnMuZC5zZXRVVENIb3VycygwKSx0aGlzLnMuZC5zZXRVVENNaW51dGVzKDApLHRoaXMucy5kLnNldFNlY29uZHMoMCksdGhpcy5zLmQuc2V0TWlsbGlzZWNvbmRzKDApKSksdGhpcy5zLmR9LF9vcHRpb25zOmZ1bmN0aW9uKHQsZSxuKXtufHwobj1lKTt2YXIgcj10aGlzLmRvbS5jb250YWluZXIuZmluZCgic2VsZWN0LiIrdGhpcy5jLmNsYXNzUHJlZml4KyItIit0KTtyLmVtcHR5KCk7Zm9yKHZhciBzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXIuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSInK2Vbc10rJyI+JytuW3NdKyI8L29wdGlvbj4iKX0sX29wdGlvblNldDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCJzZWxlY3QuIit0aGlzLmMuY2xhc3NQcmVmaXgrIi0iK3QpLHI9bi5wYXJlbnQoKS5jaGlsZHJlbigic3BhbiIpO24udmFsKGUpO3ZhciBzPW4uZmluZCgib3B0aW9uOnNlbGVjdGVkIik7ci5odG1sKHMubGVuZ3RoIT09MD9zLnRleHQoKTp0aGlzLmMuaTE4bi51bmtub3duKX0sX29wdGlvbnNUaW1lOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9dGhpcy5jLmNsYXNzUHJlZml4LG89dGhpcy5kb20uY29udGFpbmVyLmZpbmQoImRpdi4iK2krIi0iK3QpLHUscCxiPWU9PT0xMj9mdW5jdGlvbihsKXtyZXR1cm4gbH06dGhpcy5fcGFkLGc9aSsiLXRhYmxlIixtPXRoaXMuYy5pMThuO2lmKG8ubGVuZ3RoKXt2YXIgQz0iIix5PTEwLFQ9ZnVuY3Rpb24obCxoLF8pe2U9PT0xMiYmdHlwZW9mIGw9PSJudW1iZXIiJiYobj49MTImJihsKz0xMiksbD09MTI/bD0wOmw9PTI0JiYobD0xMikpO3ZhciBGPW49PT1sfHxsPT09ImFtIiYmbjwxMnx8bD09PSJwbSImJm4+PTEyPyJzZWxlY3RlZCI6IiI7cmV0dXJuIHR5cGVvZiBsPT0ibnVtYmVyIiYmciYmTXQuaW5BcnJheShsLHIpPT09LTEmJihGKz0iIGRpc2FibGVkIiksXyYmKEYrPSIgIitfKSwnPHRkIGNsYXNzPSJzZWxlY3RhYmxlICcrRisnIj48YnV0dG9uIGNsYXNzPSInK2krIi1idXR0b24gIitpKyctZGF5IiB0eXBlPSJidXR0b24iIGRhdGEtdW5pdD0iJyt0KyciIGRhdGEtdmFsdWU9IicrbCsnIj48c3Bhbj4nK2grIjwvc3Bhbj48L2J1dHRvbj48L3RkPiJ9O2lmKGU9PT0xMil7Zm9yKEMrPSI8dHI+Iix1PTE7dTw9Njt1KyspQys9VCh1LGIodSkpO2ZvcihDKz1UKCJhbSIsbS5hbVBtWzBdKSxDKz0iPC90cj4iLEMrPSI8dHI+Iix1PTc7dTw9MTI7dSsrKUMrPVQodSxiKHUpKTtDKz1UKCJwbSIsbS5hbVBtWzFdKSxDKz0iPC90cj4iLHk9N31lbHNlIGlmKGU9PT0yNCl7dmFyIFA9MDtmb3IocD0wO3A8NDtwKyspe2ZvcihDKz0iPHRyPiIsdT0wO3U8Njt1KyspQys9VChQLGIoUCkpLFArKztDKz0iPC90cj4ifXk9Nn1lbHNle2ZvcihDKz0iPHRyPiIscD0wO3A8NjA7cCs9MTApQys9VChwLGIocCksInJhbmdlIik7Qys9IjwvdHI+IixDKz0nPC90Ym9keT48L3RoZWFkPjx0YWJsZSBjbGFzcz0iJytnKyIgIitnKyctbm9zcGFjZSI+PHRib2R5Pic7dmFyIGM9cyE9PW51bGw/czpuPT09LTE/MDpNYXRoLmZsb29yKG4vMTApKjEwO2ZvcihDKz0iPHRyPiIscD1jKzE7cDxjKzEwO3ArKylDKz1UKHAsYihwKSk7Qys9IjwvdHI+Iix5PTZ9by5lbXB0eSgpLmFwcGVuZCgnPHRhYmxlIGNsYXNzPSInK2crJyI+PHRoZWFkPjx0cj48dGggY29sc3Bhbj0iJyt5KyciPicrbVt0XSsiPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiIrQysiPC90Ym9keT48L3RhYmxlPiIpfX0sX29wdGlvbnNUaXRsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYy5pMThuLGU9dGhpcy5jLm1pbkRhdGUsbj10aGlzLmMubWF4RGF0ZSxyPWU/ZS5nZXRGdWxsWWVhcigpOm51bGwscz1uP24uZ2V0RnVsbFllYXIoKTpudWxsLGk9ciE9PW51bGw/cjpuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCktdGhpcy5jLnllYXJSYW5nZSxvPXMhPT1udWxsP3M6bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpK3RoaXMuYy55ZWFyUmFuZ2U7dGhpcy5fb3B0aW9ucygibW9udGgiLHRoaXMuX3JhbmdlKDAsMTEpLHQubW9udGhzKSx0aGlzLl9vcHRpb25zKCJ5ZWFyIix0aGlzLl9yYW5nZShpLG8pKSx0aGlzLmRvbS50b2RheS50ZXh0KHQudG9kYXkpLnRleHQodC50b2RheSksdGhpcy5kb20uY2xlYXIudGV4dCh0LmNsZWFyKS50ZXh0KHQuY2xlYXIpLHRoaXMuZG9tLnByZXZpb3VzLmF0dHIoInRpdGxlIix0LnByZXZpb3VzKS5jaGlsZHJlbigiYnV0dG9uIikudGV4dCh0LnByZXZpb3VzKSx0aGlzLmRvbS5uZXh0LmF0dHIoInRpdGxlIix0Lm5leHQpLmNoaWxkcmVuKCJidXR0b24iKS50ZXh0KHQubmV4dCl9LF9wYWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MTA/IjAiK3Q6dH0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jLmF0dGFjaFRvPT09ImlucHV0Ij90aGlzLmRvbS5pbnB1dC5wb3NpdGlvbigpOnRoaXMuZG9tLmlucHV0Lm9mZnNldCgpLGU9dGhpcy5kb20uY29udGFpbmVyLG49dGhpcy5kb20uaW5wdXQub3V0ZXJIZWlnaHQoKTtpZihlLmhhc0NsYXNzKCJpbmxpbmUiKSl7ZS5pbnNlcnRBZnRlcih0aGlzLmRvbS5pbnB1dCk7cmV0dXJufXRoaXMucy5wYXJ0cy5kYXRlJiZ0aGlzLnMucGFydHMudGltZSYmTXQod2luZG93KS53aWR0aCgpPjU1MD9lLmFkZENsYXNzKCJob3Jpem9udGFsIik6ZS5yZW1vdmVDbGFzcygiaG9yaXpvbnRhbCIpLHRoaXMuYy5hdHRhY2hUbz09PSJpbnB1dCI/ZS5jc3Moe3RvcDp0LnRvcCtuLGxlZnQ6dC5sZWZ0fSkuaW5zZXJ0QWZ0ZXIodGhpcy5kb20uaW5wdXQpOmUuY3NzKHt0b3A6dC50b3ArbixsZWZ0OnQubGVmdH0pLmFwcGVuZFRvKCJib2R5Iik7dmFyIHI9ZS5vdXRlckhlaWdodCgpLHM9ZS5vdXRlcldpZHRoKCksaT1NdCh3aW5kb3cpLnNjcm9sbFRvcCgpO2lmKHQudG9wK24rci1pPk10KHdpbmRvdykuaGVpZ2h0KCkpe3ZhciBvPXQudG9wLXI7ZS5jc3MoInRvcCIsbzwwPzA6byl9aWYocyt0LmxlZnQ+TXQod2luZG93KS53aWR0aCgpKXt2YXIgdT1NdCh3aW5kb3cpLndpZHRoKCktczt0aGlzLmMuYXR0YWNoVG89PT0iaW5wdXQiJiYodS09TXQoZSkub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCkubGVmdCksZS5jc3MoImxlZnQiLHU8MD8wOnUpfX0sX3JhbmdlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1bXTtufHwobj0xKTtmb3IodmFyIHM9dDtzPD1lO3MrPW4pci5wdXNoKHMpO3JldHVybiByfSxfc2V0Q2FsYW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnMuZGlzcGxheSYmdGhpcy5kb20uY2FsZW5kYXIuZW1wdHkoKS5hcHBlbmQodGhpcy5faHRtbE1vbnRoKHRoaXMucy5kaXNwbGF5LmdldFVUQ0Z1bGxZZWFyKCksdGhpcy5zLmRpc3BsYXkuZ2V0VVRDTW9udGgoKSkpfSxfc2V0VGl0bGU6ZnVuY3Rpb24oKXt0aGlzLl9vcHRpb25TZXQoIm1vbnRoIix0aGlzLnMuZGlzcGxheS5nZXRVVENNb250aCgpKSx0aGlzLl9vcHRpb25TZXQoInllYXIiLHRoaXMucy5kaXNwbGF5LmdldFVUQ0Z1bGxZZWFyKCkpfSxfc2V0VGltZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZCxuPW51bGw7dGhpcy5faXNMdXhvbigpJiYobj1jZS5EYXRlVGltZS5mcm9tSlNEYXRlKGUpLnRvVVRDKCkpO3ZhciByPW4hPW51bGw/bi5ob3VyOmU/ZS5nZXRVVENIb3VycygpOi0xLHM9ZnVuY3Rpb24oaSl7cmV0dXJuIHQuY1tpKyJBdmFpbGFibGUiXT90LmNbaSsiQXZhaWxhYmxlIl06dC5fcmFuZ2UoMCw1OSx0LmNbaSsiSW5jcmVtZW50Il0pfTt0aGlzLl9vcHRpb25zVGltZSgiaG91cnMiLHRoaXMucy5wYXJ0cy5ob3VyczEyPzEyOjI0LHIsdGhpcy5jLmhvdXJzQXZhaWxhYmxlKSx0aGlzLl9vcHRpb25zVGltZSgibWludXRlcyIsNjAsbiE9bnVsbD9uLm1pbnV0ZTplP2UuZ2V0VVRDTWludXRlcygpOi0xLHMoIm1pbnV0ZXMiKSx0aGlzLnMubWludXRlc1JhbmdlKSx0aGlzLl9vcHRpb25zVGltZSgic2Vjb25kcyIsNjAsbiE9bnVsbD9uLnNlY29uZDplP2UuZ2V0U2Vjb25kcygpOi0xLHMoInNlY29uZHMiKSx0aGlzLnMuc2Vjb25kc1JhbmdlKX0sX3Nob3c6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLm5hbWVzcGFjZTt0aGlzLl9wb3NpdGlvbigpLE10KHdpbmRvdykub24oInNjcm9sbC4iK2UrIiByZXNpemUuIitlLGZ1bmN0aW9uKCl7dC5fcG9zaXRpb24oKX0pLE10KCJkaXYuRFRFX0JvZHlfQ29udGVudCIpLm9uKCJzY3JvbGwuIitlLGZ1bmN0aW9uKCl7dC5fcG9zaXRpb24oKX0pLE10KCJkaXYuZGF0YVRhYmxlc19zY3JvbGxCb2R5Iikub24oInNjcm9sbC4iK2UsZnVuY3Rpb24oKXt0Ll9wb3NpdGlvbigpfSk7dmFyIG49dGhpcy5kb20uaW5wdXRbMF0ub2Zmc2V0UGFyZW50O24hPT1kb2N1bWVudC5ib2R5JiZNdChuKS5vbigic2Nyb2xsLiIrZSxmdW5jdGlvbigpe3QuX3Bvc2l0aW9uKCl9KSxNdChkb2N1bWVudCkub24oImtleWRvd24uIitlLGZ1bmN0aW9uKHIpeyhyLmtleUNvZGU9PT05fHxyLmtleUNvZGU9PT0yN3x8ci5rZXlDb2RlPT09MTMpJiZ0Ll9oaWRlKCl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TXQoImJvZHkiKS5vbigiY2xpY2suIitlLGZ1bmN0aW9uKHIpe3ZhciBzPU10KHIudGFyZ2V0KS5wYXJlbnRzKCk7IXMuZmlsdGVyKHQuZG9tLmNvbnRhaW5lcikubGVuZ3RoJiZyLnRhcmdldCE9PXQuZG9tLmlucHV0WzBdJiZ0Ll9oaWRlKCl9KX0sMTApfSxfd3JpdGVPdXRwdXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmQsbj0iIixyPXRoaXMuZG9tLmlucHV0O2UmJihuPXRoaXMuX2NvbnZlcnQoZSxudWxsLHRoaXMuYy5mb3JtYXQpKSxyLnZhbChuKTt2YXIgcz1uZXcgRXZlbnQoImNoYW5nZSIse2J1YmJsZXM6ITB9KTtyWzBdLmRpc3BhdGNoRXZlbnQocyksci5hdHRyKCJ0eXBlIik9PT0iaGlkZGVuIiYmdGhpcy52YWwobiwhMSksdCYmci5mb2N1cygpfX0pO2RlLnVzZT1mdW5jdGlvbih0KXtjZT10fTtkZS5faW5zdGFuY2U9MDtkZS50eXBlPSJEYXRlVGltZSI7ZGUuZGVmYXVsdHM9e2F0dGFjaFRvOiJib2R5IixidXR0b25zOntjbGVhcjohMSx0b2RheTohMX0sY2xhc3NQcmVmaXg6ImR0LWRhdGV0aW1lIixkaXNhYmxlRGF5czpudWxsLGZpcnN0RGF5OjEsZm9ybWF0OiJZWVlZLU1NLUREIixob3Vyc0F2YWlsYWJsZTpudWxsLGkxOG46e2NsZWFyOiJDbGVhciIscHJldmlvdXM6IlByZXZpb3VzIixuZXh0OiJOZXh0Iixtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHdlZWtkYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sYW1QbTpbImFtIiwicG0iXSxob3VyczoiSG91ciIsbWludXRlczoiTWludXRlIixzZWNvbmRzOiJTZWNvbmQiLHVua25vd246Ii0iLHRvZGF5OiJUb2RheSJ9LG1heERhdGU6bnVsbCxtaW5EYXRlOm51bGwsbWludXRlc0F2YWlsYWJsZTpudWxsLG1pbnV0ZXNJbmNyZW1lbnQ6MSxzdHJpY3Q6ITAsbG9jYWxlOiJlbiIsb25DaGFuZ2U6ZnVuY3Rpb24oKXt9LHNlY29uZHNBdmFpbGFibGU6bnVsbCxzZWNvbmRzSW5jcmVtZW50OjEsc2hvd1dlZWtOdW1iZXI6ITEseWVhclJhbmdlOjI1fTtkZS52ZXJzaW9uPSIxLjUuMyI7ZGUuZmFjdG9yeT1mdW5jdGlvbih0LGUpe3ZhciBuPSExO3JldHVybiB0JiZ0LmRvY3VtZW50JiYod2luZG93PXQsZG9jdW1lbnQ9dC5kb2N1bWVudCksZSYmZS5mbiYmZS5mbi5qcXVlcnkmJihNdD1lLG49ITApLG59O3dpbmRvdy5EYXRlVGltZXx8KHdpbmRvdy5EYXRlVGltZT1kZSk7d2luZG93LkRhdGFUYWJsZSYmKHdpbmRvdy5EYXRhVGFibGUuRGF0ZVRpbWU9ZGUpO010LmZuLmR0RGF0ZVRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe25ldyBkZSh0aGlzLHQpfSl9O010LmZuLmRhdGFUYWJsZSYmKE10LmZuLmRhdGFUYWJsZS5EYXRlVGltZT1kZSxNdC5mbi5EYXRhVGFibGUuRGF0ZVRpbWU9ZGUsTXQuZm4uZGF0YVRhYmxlLkVkaXRvciYmKE10LmZuLmRhdGFUYWJsZS5FZGl0b3IuRGF0ZVRpbWU9ZGUpKTt2YXIgaWQ9ZGU7dmFyIGFkPWllKGFlKCksMSk7dmFyICRzPWllKGFlKCksMSk7dmFyIGNuPSRzLmRlZmF1bHQ7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0LGU7ZnVuY3Rpb24gbigpe3ZhciBjPWF0LnVzZSgibW9tZW50Iik7cmV0dXJuIGN8fHdpbmRvdy5tb21lbnR9ZnVuY3Rpb24gcigpe3ZhciBjPWF0LnVzZSgibHV4b24iKTtyZXR1cm4gY3x8d2luZG93Lmx1eG9ufWZ1bmN0aW9uIHMoYyl7dD1jLGU9Yy5mbi5kYXRhVGFibGV9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGwsaCxfLEYsTyxmLFUpe0Y9PT12b2lkIDAmJihGPTApLE89PT12b2lkIDAmJihPPTEpLGY9PT12b2lkIDAmJihmPXZvaWQgMCksVT09PXZvaWQgMCYmKFU9ITEpO3ZhciBYPXRoaXM7dGhpcy5jbGFzc2VzPXQuZXh0ZW5kKCEwLHt9LGMuY2xhc3NlcyksdGhpcy5jPXQuZXh0ZW5kKCEwLHt9LGMuZGVmYXVsdHMsdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaEJ1aWxkZXIsaCk7dmFyIFE9dGhpcy5jLmkxOG47aWYodGhpcy5zPXtjb25kaXRpb246dm9pZCAwLGNvbmRpdGlvbnM6e30sZGF0YTp2b2lkIDAsZGF0YUlkeDotMSxkYXRhUG9pbnRzOltdLGRhdGVGb3JtYXQ6ITEsZGVwdGg6TyxkdDpsLGZpbGxlZDohMSxpbmRleDpGLGxpdmVTZWFyY2g6VSxvcmlnRGF0YTp2b2lkIDAscHJldmVudFJlZHJhdzohMSxzZXJ2ZXJEYXRhOmYsdG9wR3JvdXA6Xyx0eXBlOiIiLHZhbHVlOltdfSx0aGlzLmRvbT17YnV0dG9uczp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uQ29udGFpbmVyKSxjb25kaXRpb246dCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbmRpdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hdHRyKCJhdXRvY29tcGxldGUiLCJoYWNraW5nIiksY29uZGl0aW9uVGl0bGU6dCgnPG9wdGlvbiB2YWx1ZT0iIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9uIixRLmNvbmRpdGlvbikpLGNvbnRhaW5lcjp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSxkYXRhOnQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kYXRhKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLGRhdGFUaXRsZTp0KCc8b3B0aW9uIHZhbHVlPSIiIGRpc2FibGVkIHNlbGVjdGVkIGhpZGRlbi8+JykuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5kYXRhIixRLmRhdGEpKSxkZWZhdWx0VmFsdWU6dCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLGRlbGV0ZTp0KCI8YnV0dG9uLz4iKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmRlbGV0ZSIsUS5kZWxldGUpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGVsZXRlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uKS5hdHRyKCJ0aXRsZSIsdGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuZGVsZXRlVGl0bGUiLFEuZGVsZXRlVGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksaW5wdXRDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pbnB1dENvbnQpLGxlZnQ6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sZWZ0IixRLmxlZnQpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubGVmdCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxlZnRUaXRsZSIsUS5sZWZ0VGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIikscmlnaHQ6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5yaWdodCIsUS5yaWdodCkpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5yaWdodCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnJpZ2h0VGl0bGUiLFEucmlnaHRUaXRsZSkpLmF0dHIoInR5cGUiLCJidXR0b24iKSx2YWx1ZTpbdCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpXSx2YWx1ZVRpdGxlOnQoJzxvcHRpb24gdmFsdWU9Ii0tdmFsdWVUaXRsZS0tIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudmFsdWUiLFEudmFsdWUpKX0sdGhpcy5jLmdyZXlzY2FsZSl7dGhpcy5kb20uZGF0YS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKSx0aGlzLmRvbS5jb25kaXRpb24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20uZGVmYXVsdFZhbHVlLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncmV5c2NhbGUpO2Zvcih2YXIgRT0wLCQ9dGhpcy5kb20udmFsdWU7RTwkLmxlbmd0aDtFKyspe3ZhciB3PSRbRV07dy5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKX19cmV0dXJuIHQod2luZG93KS5vbigicmVzaXplLmR0c2IiLGUudXRpbC50aHJvdHRsZShmdW5jdGlvbigpe1gucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSksdGhpcy5fYnVpbGRDcml0ZXJpYSgpLHRoaXN9cmV0dXJuIGMuX2VzY2FwZUhUTUw9ZnVuY3Rpb24obCl7cmV0dXJuIGwudG9TdHJpbmcoKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mcXVvdDsvZywnIicpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sYy5wcm90b3R5cGUuZG9TZWFyY2g9ZnVuY3Rpb24oKXt0aGlzLmMubGl2ZVNlYXJjaCYmdGhpcy5zLmR0LmRyYXcoKX0sYy5wYXJzZU51bUZtdD1mdW5jdGlvbihsKXtyZXR1cm4rbC5yZXBsYWNlKC8oPyFeLSlbXjAtOS5dL2csIiIpfSxjLnByb3RvdHlwZS51cGRhdGVBcnJvd3M9ZnVuY3Rpb24obCl7bD09PXZvaWQgMCYmKGw9ITEpLHRoaXMuZG9tLmNvbnRhaW5lci5jaGlsZHJlbigpLmRldGFjaCgpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0YSkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvbikuYXBwZW5kKHRoaXMuZG9tLmlucHV0Q29udCksdGhpcy5zZXRMaXN0ZW5lcnMoKSx0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMCYmdCh0aGlzLmRvbS52YWx1ZVswXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpO2Zvcih2YXIgaD0xO2g8dGhpcy5kb20udmFsdWUubGVuZ3RoO2grKyl0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKHRoaXMuZG9tLnZhbHVlW2hdKSx0KHRoaXMuZG9tLnZhbHVlW2hdKS50cmlnZ2VyKCJkdHNiLWluc2VydGVkIik7dGhpcy5zLmRlcHRoPjEmJnRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmxlZnQpLCh0aGlzLmMuZGVwdGhMaW1pdD09PSExfHx0aGlzLnMuZGVwdGg8dGhpcy5jLmRlcHRoTGltaXQpJiZsP3RoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLnJpZ2h0KTp0aGlzLmRvbS5yaWdodC5yZW1vdmUoKSx0aGlzLmRvbS5idXR0b25zLmFwcGVuZCh0aGlzLmRvbS5kZWxldGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uYnV0dG9ucyl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kYXRhLm9mZigiLmR0c2IiKSx0aGlzLmRvbS5jb25kaXRpb24ub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmRlbGV0ZS5vZmYoIi5kdHNiIik7Zm9yKHZhciBsPTAsaD10aGlzLmRvbS52YWx1ZTtsPGgubGVuZ3RoO2wrKyl7dmFyIF89aFtsXTtfLm9mZigiLmR0c2IiKX10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlKCl9LGMucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbihsLGgpe3ZhciBfPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLEY9dGhpcy5zLmNvbmRpdGlvbnNbdGhpcy5zLmNvbmRpdGlvbl07aWYodGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCYmRiE9PXZvaWQgMCl7dmFyIE89bFt0aGlzLnMuZGF0YUlkeF07aWYodGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0iKSYmKF8ub0xhbmd1YWdlLnNEZWNpbWFsIT09IiJ8fF8ub0xhbmd1YWdlLnNUaG91c2FuZHMhPT0iIikpe3ZhciBmPVtsW3RoaXMucy5kYXRhSWR4XV07aWYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iIiYmKGY9bFt0aGlzLnMuZGF0YUlkeF0uc3BsaXQoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwpKSxfLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpZm9yKHZhciBVPTA7VTxmLmxlbmd0aDtVKyspZltVXT1mW1VdLnJlcGxhY2UoXy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcywiLCIpO089Zi5qb2luKCIuIil9aWYodGhpcy5jLm9ydGhvZ29uYWwuc2VhcmNoIT09ImZpbHRlciImJihPPV8uZmFzdERhdGEoaCx0aGlzLnMuZGF0YUlkeCx0eXBlb2YgdGhpcy5jLm9ydGhvZ29uYWw9PSJzdHJpbmciP3RoaXMuYy5vcnRob2dvbmFsOnRoaXMuYy5vcnRob2dvbmFsLnNlYXJjaCkpLHRoaXMucy50eXBlPT09ImFycmF5Iil7QXJyYXkuaXNBcnJheShPKXx8KE89W09dKSxPLnNvcnQoKTtmb3IodmFyIFg9MCxRPU87WDxRLmxlbmd0aDtYKyspe3ZhciBFPVFbWF07RSYmdHlwZW9mIEU9PSJzdHJpbmciJiYoRT1FLnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIgIikpfX1lbHNlIE8hPT1udWxsJiZ0eXBlb2YgTz09InN0cmluZyImJihPPU8ucmVwbGFjZSgvW1xyXG5cdTIwMjhdL2csIiAiKSk7cmV0dXJuIHRoaXMucy50eXBlLmluY2x1ZGVzKCJodG1sIikmJnR5cGVvZiBPPT0ic3RyaW5nIiYmKE89Ty5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIikpLE89PT1udWxsJiYoTz0iIiksRi5zZWFyY2goTyx0aGlzLnMudmFsdWUsdGhpcyl9fSxjLnByb3RvdHlwZS5nZXREZXRhaWxzPWZ1bmN0aW9uKGwpe2w9PT12b2lkIDAmJihsPSExKTt2YXIgaCxfPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2lmKHRoaXMucy50eXBlIT09bnVsbCYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iInx8Xy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspe3ZhciBGPVt0aGlzLnMudmFsdWVbaF0udG9TdHJpbmcoKV07aWYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iIiYmKEY9dGhpcy5zLnZhbHVlW2hdLnNwbGl0KF8ub0xhbmd1YWdlLnNEZWNpbWFsKSksXy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKWZvcih2YXIgTz0wO088Ri5sZW5ndGg7TysrKUZbT109RltPXS5yZXBsYWNlKF8ub0xhbmd1YWdlLnNUaG91c2FuZHMsIiwiKTt0aGlzLnMudmFsdWVbaF09Ri5qb2luKCIuIil9ZWxzZSBpZih0aGlzLnMudHlwZSE9PW51bGwmJmwpe2lmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJkYXRlIil8fHRoaXMucy50eXBlLmluY2x1ZGVzKCJ0aW1lIikpZm9yKGg9MDtoPHRoaXMucy52YWx1ZS5sZW5ndGg7aCsrKXRoaXMucy52YWx1ZVtoXS5tYXRjaCgvXlxkezR9LShbMF1cZHwxWzAtMl0pLShbMC0yXVxkfDNbMDFdKSQvZyk9PT1udWxsJiYodGhpcy5zLnZhbHVlW2hdPSIiKTtlbHNlIGlmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdJiZ0aGlzLnMudmFsdWVbaF0ubGVuZ3RoPjAmJm4oKSh0aGlzLnMudmFsdWVbaF0sdGhpcy5zLmRhdGVGb3JtYXQsITApLmlzVmFsaWQoKSYmKHRoaXMucy52YWx1ZVtoXT1uKCkodGhpcy5zLnZhbHVlW2hdLHRoaXMucy5kYXRlRm9ybWF0KS5mb3JtYXQoIllZWVktTU0tREQgSEg6bW06c3MiKSk7ZWxzZSBpZih0aGlzLnMudHlwZS5pbmNsdWRlcygibHV4b24iKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdJiZ0aGlzLnMudmFsdWVbaF0ubGVuZ3RoPjAmJnIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KHRoaXMucy52YWx1ZVtoXSx0aGlzLnMuZGF0ZUZvcm1hdCkuaW52YWxpZD09PW51bGwmJih0aGlzLnMudmFsdWVbaF09cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQodGhpcy5zLnZhbHVlW2hdLHRoaXMucy5kYXRlRm9ybWF0KS50b0Zvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcyIpKX1pZih0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiZ0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdPXRoaXMucy52YWx1ZVtoXS5yZXBsYWNlKC9bXjAtOS5cLV0vZywiIik7cmV0dXJue2NvbmRpdGlvbjp0aGlzLnMuY29uZGl0aW9uLGRhdGE6dGhpcy5zLmRhdGEsb3JpZ0RhdGE6dGhpcy5zLm9yaWdEYXRhLHR5cGU6dGhpcy5zLnR5cGUsdmFsdWU6dGhpcy5zLnZhbHVlLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZiE9bnVsbD9mLnRvU3RyaW5nKCk6Zn0pfX0sYy5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGMucHJvdG90eXBlLnBhcnNlTnVtYmVyPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMucy5kdC5pMThuKCJkZWNpbWFsIik7cmV0dXJuIGgmJmghPT0iLiImJihsPWwucmVwbGFjZSgvXC4vZywiIikucmVwbGFjZShoLCIuIikpLCtsLnJlcGxhY2UoLyg/IV4tKVteMC05Ll0vZywiIil9LGMucHJvdG90eXBlLnBvcHVsYXRlPWZ1bmN0aW9uKCl7dGhpcy5fcG9wdWxhdGVEYXRhKCksdGhpcy5zLmRhdGFJZHghPT0tMSYmKHRoaXMuX3BvcHVsYXRlQ29uZGl0aW9uKCksdGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCYmdGhpcy5fcG9wdWxhdGVWYWx1ZSgpKX0sYy5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihsKXt2YXIgaD0hMSxfLEY7aWYodGhpcy5fcG9wdWxhdGVEYXRhKCksbC5kYXRhIT09dm9pZCAwKXt2YXIgTz10aGlzLmNsYXNzZXMuaXRhbGljLGY9dGhpcy5kb20uZGF0YTt0aGlzLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7IWgmJih0KHRoaXMpLnRleHQoKT09PWwuZGF0YXx8bC5vcmlnRGF0YSYmdCh0aGlzKS5wcm9wKCJvcmlnRGF0YSIpPT09bC5vcmlnRGF0YSk/KHQodGhpcykucHJvcCgic2VsZWN0ZWQiLCEwKSxmLnJlbW92ZUNsYXNzKE8pLGg9ITAsXz1wYXJzZUludCh0KHRoaXMpLnZhbCgpLDEwKSk6dCh0aGlzKS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfSl9aWYoaCl7dGhpcy5zLmRhdGE9bC5kYXRhLHRoaXMucy5vcmlnRGF0YT1sLm9yaWdEYXRhLHRoaXMucy5kYXRhSWR4PV8sdGhpcy5jLm9ydGhvZ29uYWw9dGhpcy5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsdGhpcy5kb20uZGF0YVRpdGxlLnJlbW92ZSgpLHRoaXMuX3BvcHVsYXRlQ29uZGl0aW9uKCksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucmVtb3ZlKCk7dmFyIFU9dm9pZCAwLFg9dGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCJvcHRpb24iKTtmb3IoRj0wO0Y8WC5sZW5ndGg7RisrKXt2YXIgUT10KFhbRl0pO2wuY29uZGl0aW9uIT09dm9pZCAwJiZRLnZhbCgpPT09bC5jb25kaXRpb24mJnR5cGVvZiBsLmNvbmRpdGlvbj09InN0cmluZyI/KFEucHJvcCgic2VsZWN0ZWQiLCEwKSxVPVEudmFsKCkpOlEucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX1pZih0aGlzLnMuY29uZGl0aW9uPVUsdGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCl7Zm9yKHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIiksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucmVtb3ZlKCksdGhpcy5kb20uY29uZGl0aW9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLEY9MDtGPFgubGVuZ3RoO0YrKyl7dmFyIEU9dChYW0ZdKTtFLnZhbCgpIT09dGhpcy5zLmNvbmRpdGlvbiYmRS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfXRoaXMuX3BvcHVsYXRlVmFsdWUobCl9ZWxzZSB0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcmVwZW5kVG8odGhpcy5kb20uY29uZGl0aW9uKS5wcm9wKCJzZWxlY3RlZCIsITApfX0sYy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLmRvbS5kYXRhLnVuYmluZCgiY2hhbmdlIikub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe2wuZG9tLmRhdGFUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgaD1sLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24uIitsLmNsYXNzZXMub3B0aW9uKSxfPTA7XzxoLmxlbmd0aDtfKyspe3ZhciBGPXQoaFtfXSk7Ri52YWwoKT09PWwuZG9tLmRhdGEudmFsKCk/KGwuZG9tLmRhdGEucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksRi5wcm9wKCJzZWxlY3RlZCIsITApLGwucy5kYXRhSWR4PStGLnZhbCgpLGwucy5kYXRhPUYudGV4dCgpLGwucy5vcmlnRGF0YT1GLnByb3AoIm9yaWdEYXRhIiksbC5jLm9ydGhvZ29uYWw9bC5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsbC5fY2xlYXJDb25kaXRpb24oKSxsLl9jbGVhclZhbHVlKCksbC5fcG9wdWxhdGVDb25kaXRpb24oKSxsLnMuZmlsbGVkJiYobC5zLmZpbGxlZD0hMSxsLmRvU2VhcmNoKCksbC5zZXRMaXN0ZW5lcnMoKSksbC5zLmR0LnN0YXRlLnNhdmUoKSk6Ri5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pLHRoaXMuZG9tLmNvbmRpdGlvbi51bmJpbmQoImNoYW5nZSIpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXtsLmRvbS5jb25kaXRpb25UaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgaD1sLmRvbS5jb25kaXRpb24uY2hpbGRyZW4oIm9wdGlvbi4iK2wuY2xhc3Nlcy5vcHRpb24pLF89MDtfPGgubGVuZ3RoO18rKyl7dmFyIEY9dChoW19dKTtpZihGLnZhbCgpPT09bC5kb20uY29uZGl0aW9uLnZhbCgpKXtsLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksRi5wcm9wKCJzZWxlY3RlZCIsITApO2Zvcih2YXIgTz1GLnZhbCgpLGY9MCxVPU9iamVjdC5rZXlzKGwucy5jb25kaXRpb25zKTtmPFUubGVuZ3RoO2YrKyl7dmFyIFg9VVtmXTtpZihYPT09Tyl7bC5zLmNvbmRpdGlvbj1PO2JyZWFrfX1sLl9jbGVhclZhbHVlKCksbC5fcG9wdWxhdGVWYWx1ZSgpO2Zvcih2YXIgUT0wLEU9bC5kb20udmFsdWU7UTxFLmxlbmd0aDtRKyspe3ZhciAkPUVbUV07bC5zLmZpbGxlZCYmJCE9PXZvaWQgMCYmbC5kb20uaW5wdXRDb250LmhhcygkWzBdKS5sZW5ndGghPT0wJiYobC5zLmZpbGxlZD0hMSxsLmRvU2VhcmNoKCksbC5zZXRMaXN0ZW5lcnMoKSl9KGwuZG9tLnZhbHVlLmxlbmd0aD09PTB8fGwuZG9tLnZhbHVlLmxlbmd0aD09PTEmJmwuZG9tLnZhbHVlWzBdPT09dm9pZCAwKSYmbC5kb1NlYXJjaCgpfWVsc2UgRi5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pfSxjLnByb3RvdHlwZS5zZXR1cEJ1dHRvbnM9ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5uZXJXaWR0aD41NTApe3RoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMudmVydGljYWwpLHRoaXMuZG9tLmJ1dHRvbnMuY3NzKCJsZWZ0IixudWxsKSx0aGlzLmRvbS5idXR0b25zLmNzcygidG9wIixudWxsKTtyZXR1cm59dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52ZXJ0aWNhbCksdGhpcy5kb20uYnV0dG9ucy5jc3MoImxlZnQiLHRoaXMuZG9tLmRhdGEuaW5uZXJXaWR0aCgpKSx0aGlzLmRvbS5idXR0b25zLmNzcygidG9wIix0aGlzLmRvbS5kYXRhLnBvc2l0aW9uKCkudG9wKX0sYy5wcm90b3R5cGUuX2J1aWxkQ3JpdGVyaWE9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kYXRhLmFwcGVuZCh0aGlzLmRvbS5kYXRhVGl0bGUpLHRoaXMuZG9tLmNvbmRpdGlvbi5hcHBlbmQodGhpcy5kb20uY29uZGl0aW9uVGl0bGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0YSkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvbiksdGhpcy5kb20uaW5wdXRDb250LmVtcHR5KCk7Zm9yKHZhciBsPTAsaD10aGlzLmRvbS52YWx1ZTtsPGgubGVuZ3RoO2wrKyl7dmFyIF89aFtsXTtfLmFwcGVuZCh0aGlzLmRvbS52YWx1ZVRpdGxlKSx0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKF8pfXRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmRlbGV0ZSkuYXBwZW5kKHRoaXMuZG9tLnJpZ2h0KSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmlucHV0Q29udCkuYXBwZW5kKHRoaXMuZG9tLmJ1dHRvbnMpLHRoaXMuc2V0TGlzdGVuZXJzKCl9LGMucHJvdG90eXBlLl9jbGVhckNvbmRpdGlvbj1mdW5jdGlvbigpe3RoaXMuZG9tLmNvbmRpdGlvbi5lbXB0eSgpLHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnByb3AoInNlbGVjdGVkIiwhMCkuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5kb20uY29uZGl0aW9uLnByZXBlbmQodGhpcy5kb20uY29uZGl0aW9uVGl0bGUpLnByb3AoInNlbGVjdGVkSW5kZXgiLDApLHRoaXMucy5jb25kaXRpb25zPXt9LHRoaXMucy5jb25kaXRpb249dm9pZCAwfSxjLnByb3RvdHlwZS5fY2xlYXJWYWx1ZT1mdW5jdGlvbigpe3ZhciBsO2lmKHRoaXMucy5jb25kaXRpb24hPT12b2lkIDApe2lmKHRoaXMuZG9tLnZhbHVlLmxlbmd0aD4wJiZ0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMClmb3IodmFyIGg9MCxfPXRoaXMuZG9tLnZhbHVlO2g8Xy5sZW5ndGg7aCsrKWw9X1toXSxsIT09dm9pZCAwJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bC5yZW1vdmUoKX0sNTApO2lmKHRoaXMuZG9tLnZhbHVlPVtdLmNvbmNhdCh0aGlzLnMuY29uZGl0aW9uc1t0aGlzLnMuY29uZGl0aW9uXS5pbml0KHRoaXMsYy51cGRhdGVMaXN0ZW5lcikpLHRoaXMuZG9tLnZhbHVlLmxlbmd0aD4wJiZ0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMCl7dGhpcy5kb20uaW5wdXRDb250LmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLnZhbHVlWzBdKS5pbnNlcnRBZnRlcih0aGlzLmRvbS5jb25kaXRpb24pLHQodGhpcy5kb20udmFsdWVbMF0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTtmb3IodmFyIEY9MTtGPHRoaXMuZG9tLnZhbHVlLmxlbmd0aDtGKyspdGhpcy5kb20uaW5wdXRDb250LmFwcGVuZCh0aGlzLmRvbS52YWx1ZVtGXSksdCh0aGlzLmRvbS52YWx1ZVtGXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpfX1lbHNle2Zvcih2YXIgTz0wLGY9dGhpcy5kb20udmFsdWU7TzxmLmxlbmd0aDtPKyspbD1mW09dLGwhPT12b2lkIDAmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLnJlbW92ZSgpfSw1MCk7dGhpcy5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApLHRoaXMuZG9tLmRlZmF1bHRWYWx1ZS5hcHBlbmQodGhpcy5kb20udmFsdWVUaXRsZSkuaW5zZXJ0QWZ0ZXIodGhpcy5kb20uY29uZGl0aW9uKX10aGlzLnMudmFsdWU9W10sdGhpcy5kb20udmFsdWU9W3QoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQodGhpcy5kb20udmFsdWVUaXRsZS5jbG9uZSgpKV19LGMucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5zLmR0O3JldHVybiB0LmV4dGVuZCghMCx7fSxjLmRlZmF1bHRzLGwuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbdGhpcy5zLmRhdGFJZHhdLnNlYXJjaEJ1aWxkZXIpfSxjLnByb3RvdHlwZS5fcG9wdWxhdGVDb25kaXRpb249ZnVuY3Rpb24oKXt2YXIgbD1bXSxoPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKS5sZW5ndGgsXz10aGlzLnMuZHQsRj1fLnNldHRpbmdzKClbMF0uYW9Db2x1bW5zLE89K3RoaXMuZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLGYsVTtpZihoPT09MCl7aWYodGhpcy5zLnR5cGU9Xy5jb2x1bW4oTykudHlwZSgpLEYhPT12b2lkIDApe3ZhciBYPUZbT107WC5zZWFyY2hCdWlsZGVyVHlwZSE9PXZvaWQgMCYmWC5zZWFyY2hCdWlsZGVyVHlwZSE9PW51bGw/dGhpcy5zLnR5cGU9WC5zZWFyY2hCdWlsZGVyVHlwZToodGhpcy5zLnR5cGU9PT12b2lkIDB8fHRoaXMucy50eXBlPT09bnVsbCkmJih0aGlzLnMudHlwZT1YLnNUeXBlKX0odGhpcy5zLnR5cGU9PT1udWxsfHx0aGlzLnMudHlwZT09PXZvaWQgMCkmJih0LmZuLmRhdGFUYWJsZS5leHQub0FwaSYmdC5mbi5kYXRhVGFibGUuZXh0Lm9BcGkuX2ZuQ29sdW1uVHlwZXMoXy5zZXR0aW5ncygpWzBdKSx0aGlzLnMudHlwZT1fLmNvbHVtbihPKS50eXBlKCkpLHRoaXMuZG9tLmNvbmRpdGlvbi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSx0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBRPV8uc2V0dGluZ3MoKVswXS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7USE9PSIiJiZ0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5kZXhPZihRKT09PXRoaXMucy50eXBlLmxlbmd0aC1RLmxlbmd0aCYmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0tZm10Iik/dGhpcy5zLnR5cGU9dGhpcy5zLnR5cGUucmVwbGFjZShRLCIiKTp0aGlzLnMudHlwZS5pbmNsdWRlcygibnVtIikmJih0aGlzLnMudHlwZT10aGlzLnMudHlwZS5yZXBsYWNlKFEsIiIpKSk7dmFyIEU9dm9pZCAwO3RoaXMuYy5jb25kaXRpb25zW3RoaXMucy50eXBlXSE9PXZvaWQgMD9FPXRoaXMuYy5jb25kaXRpb25zW3RoaXMucy50eXBlXTp0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoImRhdGV0aW1lLSIpPyhFPWF0LnVzZSgibW9tZW50Iik/dGhpcy5jLmNvbmRpdGlvbnMubW9tZW50OnRoaXMuYy5jb25kaXRpb25zLmx1eG9uLHRoaXMucy5kYXRlRm9ybWF0PXRoaXMucy50eXBlLnJlcGxhY2UoL2RhdGV0aW1lLS9nLCIiKSk6dGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKT8oRT10aGlzLmMuY29uZGl0aW9ucy5tb21lbnQsdGhpcy5zLmRhdGVGb3JtYXQ9dGhpcy5zLnR5cGUucmVwbGFjZSgvbW9tZW50LS9nLCIiKSk6dGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJsdXhvbiIpPyhFPXRoaXMuYy5jb25kaXRpb25zLmx1eG9uLHRoaXMucy5kYXRlRm9ybWF0PXRoaXMucy50eXBlLnJlcGxhY2UoL2x1eG9uLS9nLCIiKSk6RT10aGlzLmMuY29uZGl0aW9ucy5zdHJpbmc7Zm9yKHZhciAkPTAsdz1PYmplY3Qua2V5cyhFKTskPHcubGVuZ3RoOyQrKylpZihmPXdbJF0sRVtmXSE9PW51bGwpe2lmKF8ucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmRVtmXS5pbml0PT09Yy5pbml0U2VsZWN0KXt2YXIgaz1GW09dO3RoaXMucy5zZXJ2ZXJEYXRhJiZ0aGlzLnMuc2VydmVyRGF0YVtrLmRhdGFdPyhFW2ZdLmluaXQ9Yy5pbml0U2VsZWN0U1NQLEVbZl0uaW5wdXRWYWx1ZT1jLmlucHV0VmFsdWVTZWxlY3QsRVtmXS5pc0lucHV0VmFsaWQ9Yy5pc0lucHV0VmFsaWRTZWxlY3QpOihFW2ZdLmluaXQ9Yy5pbml0SW5wdXQsRVtmXS5pbnB1dFZhbHVlPWMuaW5wdXRWYWx1ZUlucHV0LEVbZl0uaXNJbnB1dFZhbGlkPWMuaXNJbnB1dFZhbGlkSW5wdXQpfXRoaXMucy5jb25kaXRpb25zW2ZdPUVbZl0sVT1FW2ZdLmNvbmRpdGlvbk5hbWUsdHlwZW9mIFU9PSJmdW5jdGlvbiImJihVPVUoXyx0aGlzLmMuaTE4bikpLGwucHVzaCh0KCI8b3B0aW9uPiIse3RleHQ6VSx2YWx1ZTpmfSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5vdEl0YWxpYykpfX1lbHNlIGlmKGg+MCl7dGhpcy5kb20uY29uZGl0aW9uLmVtcHR5KCkucmVtb3ZlQXR0cigiZGlzYWJsZWQiKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKTtmb3IodmFyIFM9MCxCPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKTtTPEIubGVuZ3RoO1MrKyl7Zj1CW1NdO3ZhciBMPXRoaXMucy5jb25kaXRpb25zW2ZdLmNvbmRpdGlvbk5hbWU7dHlwZW9mIEw9PSJmdW5jdGlvbiImJihMPUwoXyx0aGlzLmMuaTE4bikpO3ZhciBSPXQoIjxvcHRpb24+Iix7dGV4dDpMLHZhbHVlOmZ9KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubm90SXRhbGljKTt0aGlzLnMuY29uZGl0aW9uIT09dm9pZCAwJiZ0aGlzLnMuY29uZGl0aW9uPT09TCYmKFIucHJvcCgic2VsZWN0ZWQiLCEwKSx0aGlzLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYykpLGwucHVzaChSKX19ZWxzZXt0aGlzLmRvbS5jb25kaXRpb24uYXR0cigiZGlzYWJsZWQiLCJ0cnVlIikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYyk7cmV0dXJufWZvcih2YXIgcT0wLHo9bDtxPHoubGVuZ3RoO3ErKyl7dmFyIEc9eltxXTt0aGlzLmRvbS5jb25kaXRpb24uYXBwZW5kKEcpfWlmKEZbT10uc2VhcmNoQnVpbGRlciYmRltPXS5zZWFyY2hCdWlsZGVyLmRlZmF1bHRDb25kaXRpb24pe3ZhciBudD1GW09dLnNlYXJjaEJ1aWxkZXIuZGVmYXVsdENvbmRpdGlvbjtpZih0eXBlb2YgbnQ9PSJudW1iZXIiKXRoaXMuZG9tLmNvbmRpdGlvbi5wcm9wKCJzZWxlY3RlZEluZGV4IixudCksdGhpcy5kb20uY29uZGl0aW9uLnRyaWdnZXIoImNoYW5nZSIpO2Vsc2UgaWYodHlwZW9mIG50PT0ic3RyaW5nIilmb3IodmFyIHR0PTA7dHQ8bC5sZW5ndGg7dHQrKylmb3IodmFyIGV0PTAsd3Q9T2JqZWN0LmtleXModGhpcy5zLmNvbmRpdGlvbnMpO2V0PHd0Lmxlbmd0aDtldCsrKXt2YXIgU3Q9d3RbZXRdO2lmKFU9dGhpcy5zLmNvbmRpdGlvbnNbU3RdLmNvbmRpdGlvbk5hbWUsKHR5cGVvZiBVPT0ic3RyaW5nIj9VOlUoXyx0aGlzLmMuaTE4bikpPT09bFt0dF0udGV4dCgpJiZTdD09PW50KXt0aGlzLmRvbS5jb25kaXRpb24ucHJvcCgic2VsZWN0ZWRJbmRleCIsdGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCkudG9BcnJheSgpLmluZGV4T2YobFt0dF1bMF0pKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSx0aGlzLmRvbS5jb25kaXRpb24udHJpZ2dlcigiY2hhbmdlIiksdHQ9bC5sZW5ndGg7YnJlYWt9fX1lbHNlIHRoaXMuZG9tLmNvbmRpdGlvbi5wcm9wKCJzZWxlY3RlZEluZGV4IiwwKX0sYy5wcm90b3R5cGUuX3BvcHVsYXRlRGF0YT1mdW5jdGlvbigpe3ZhciBsPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1ucyxoPXRoaXMucy5kdC5jb2x1bW5zKHRoaXMuYy5jb2x1bW5zKS5pbmRleGVzKCkudG9BcnJheSgpO3RoaXMuZG9tLmRhdGEuZW1wdHkoKS5hcHBlbmQodGhpcy5kb20uZGF0YVRpdGxlKTtmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKylpZih0aGlzLmMuY29sdW1ucz09PSEwfHxoLmluY2x1ZGVzKF8pKXt2YXIgRj1sW19dLE89e2luZGV4Ol8sb3JpZ0RhdGE6Ri5kYXRhLHRleHQ6KEYuc2VhcmNoQnVpbGRlclRpdGxlfHxGLnNUaXRsZSkucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpfTt0aGlzLmRvbS5kYXRhLmFwcGVuZCh0KCI8b3B0aW9uPiIse3RleHQ6Ty50ZXh0LHZhbHVlOk8uaW5kZXh9KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubm90SXRhbGljKS5wcm9wKCJvcmlnRGF0YSIsRi5kYXRhKS5wcm9wKCJzZWxlY3RlZCIsdGhpcy5zLmRhdGFJZHg9PT1PLmluZGV4KSksdGhpcy5zLmRhdGFJZHg9PT1PLmluZGV4JiZ0aGlzLmRvbS5kYXRhVGl0bGUucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX19LGMucHJvdG90eXBlLl9wb3B1bGF0ZVZhbHVlPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMsXz10aGlzLnMuZmlsbGVkLEY7dGhpcy5zLmZpbGxlZD0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5kb20uZGVmYXVsdFZhbHVlLnJlbW92ZSgpfSw1MCk7Zm9yKHZhciBPPWZ1bmN0aW9uKEUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtFIT09dm9pZCAwJiZFLnJlbW92ZSgpfSw1MCl9LGY9MCxVPXRoaXMuZG9tLnZhbHVlO2Y8VS5sZW5ndGg7ZisrKXt2YXIgWD1VW2ZdO08oWCl9dmFyIFE9dGhpcy5kb20uaW5wdXRDb250LmNoaWxkcmVuKCk7aWYoUS5sZW5ndGg+MSlmb3IoRj0wO0Y8US5sZW5ndGg7RisrKXQoUVtGXSkucmVtb3ZlKCk7Zm9yKGwhPT12b2lkIDAmJnRoaXMucy5kdC5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oRSl7aC5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW0VdLnNUaXRsZT09PWwuZGF0YSYmKGgucy5kYXRhSWR4PUUpfSksdGhpcy5kb20udmFsdWU9W10uY29uY2F0KHRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmluaXQodGhpcyxjLnVwZGF0ZUxpc3RlbmVyLGwhPT12b2lkIDA/bC52YWx1ZTp2b2lkIDApKSxsIT09dm9pZCAwJiZsLnZhbHVlIT09dm9pZCAwJiYodGhpcy5zLnZhbHVlPWwudmFsdWUpLHRoaXMuZG9tLmlucHV0Q29udC5lbXB0eSgpLHRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwJiZ0KHRoaXMuZG9tLnZhbHVlWzBdKS5hcHBlbmRUbyh0aGlzLmRvbS5pbnB1dENvbnQpLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKSxGPTE7Rjx0aGlzLmRvbS52YWx1ZS5sZW5ndGg7RisrKXQodGhpcy5kb20udmFsdWVbRl0pLmluc2VydEFmdGVyKHRoaXMuZG9tLnZhbHVlW0YtMV0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTt0aGlzLnMuZmlsbGVkPXRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmlzSW5wdXRWYWxpZCh0aGlzLmRvbS52YWx1ZSx0aGlzKSx0aGlzLnNldExpc3RlbmVycygpLCF0aGlzLnMucHJldmVudFJlZHJhdyYmXyE9PXRoaXMucy5maWxsZWQmJih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8dGhpcy5kb1NlYXJjaCgpLHRoaXMuc2V0TGlzdGVuZXJzKCkpfSxjLnByb3RvdHlwZS5fdGhyb3R0bGU9ZnVuY3Rpb24obCxoKXtoPT09dm9pZCAwJiYoaD0yMDApO3ZhciBfPW51bGwsRj1udWxsLE89dGhpcztyZXR1cm4gaD09PW51bGwmJihoPTIwMCksZnVuY3Rpb24oKXtmb3IodmFyIGY9W10sVT0wO1U8YXJndW1lbnRzLmxlbmd0aDtVKyspZltVXT1hcmd1bWVudHNbVV07dmFyIFg9K25ldyBEYXRlO18hPT1udWxsJiZYPF8raD9jbGVhclRpbWVvdXQoRik6Xz1YLEY9c2V0VGltZW91dChmdW5jdGlvbigpe189bnVsbCxsLmFwcGx5KE8sZil9LGgpfX0sYy52ZXJzaW9uPSIxLjEuMCIsYy5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixidXR0b25Db250YWluZXI6ImR0c2ItYnV0dG9uQ29udGFpbmVyIixjb25kaXRpb246ImR0c2ItY29uZGl0aW9uIixjb250YWluZXI6ImR0c2ItY3JpdGVyaWEiLGRhdGE6ImR0c2ItZGF0YSIsZGVsZXRlOiJkdHNiLWRlbGV0ZSIsZHJvcERvd246ImR0c2ItZHJvcERvd24iLGdyZXlzY2FsZToiZHRzYi1ncmV5c2NhbGUiLGlucHV0OiJkdHNiLWlucHV0IixpbnB1dENvbnQ6ImR0c2ItaW5wdXRDb250IixpdGFsaWM6ImR0c2ItaXRhbGljIixqb2luZXI6ImR0c2Itam9pbmVyIixsZWZ0OiJkdHNiLWxlZnQiLG5vdEl0YWxpYzoiZHRzYi1ub3RJdGFsaWMiLG9wdGlvbjoiZHRzYi1vcHRpb24iLHJpZ2h0OiJkdHNiLXJpZ2h0IixzZWxlY3Q6ImR0c2Itc2VsZWN0Iix2YWx1ZToiZHRzYi12YWx1ZSIsdmVydGljYWw6ImR0c2ItdmVydGljYWwifSxjLmluaXRTZWxlY3Q9ZnVuY3Rpb24obCxoLF8sRil7Xz09PXZvaWQgMCYmKF89bnVsbCksRj09PXZvaWQgMCYmKEY9ITEpO3ZhciBPPWwuZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLGY9bC5zLmR0LnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpLFU9bC5zLmR0LnNldHRpbmdzKClbMF0uZmFzdERhdGE7bC5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBYPXQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyhjLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyhjLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQobC5kb20udmFsdWVUaXRsZSkub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe3QodGhpcykucmVtb3ZlQ2xhc3MoYy5jbGFzc2VzLml0YWxpYyksaChsLHRoaXMpfSk7bC5jLmdyZXlzY2FsZSYmWC5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKTtmb3IodmFyIFE9W10sRT1bXSwkPTAsdz1mOyQ8dy5sZW5ndGg7JCsrKXt2YXIgaz13WyRdLFM9VShrLE8sdHlwZW9mIGwuYy5vcnRob2dvbmFsPT0ic3RyaW5nIj9sLmMub3J0aG9nb25hbDpsLmMub3J0aG9nb25hbC5zZWFyY2gpLEI9e2ZpbHRlcjp0eXBlb2YgUz09InN0cmluZyI/Uy5yZXBsYWNlKC9bXHJcblx1MjAyOF0vZywiICIpOlMsaW5kZXg6ayx0ZXh0OlUoayxPLHR5cGVvZiBsLmMub3J0aG9nb25hbD09InN0cmluZyI/bC5jLm9ydGhvZ29uYWw6bC5jLm9ydGhvZ29uYWwuZGlzcGxheSl9O2wucy50eXBlPT09ImFycmF5IiYmKEIuZmlsdGVyPUFycmF5LmlzQXJyYXkoQi5maWx0ZXIpP0IuZmlsdGVyOltCLmZpbHRlcl0sQi50ZXh0PUFycmF5LmlzQXJyYXkoQi50ZXh0KT9CLnRleHQ6W0IudGV4dF0pO3ZhciBMPWZ1bmN0aW9uKG50LHR0KXtsLnMudHlwZS5pbmNsdWRlcygiaHRtbCIpJiZudCE9PW51bGwmJnR5cGVvZiBudD09InN0cmluZyImJm50LnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTt2YXIgZXQ9dCgiPG9wdGlvbj4iLHt0eXBlOkFycmF5LmlzQXJyYXkobnQpPyJBcnJheSI6IlN0cmluZyIsdmFsdWU6bnR9KS5kYXRhKCJzYnYiLG50KS5hZGRDbGFzcyhsLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyhsLmNsYXNzZXMubm90SXRhbGljKS5odG1sKHR5cGVvZiB0dD09InN0cmluZyI/dHQucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpOnR0KSx3dD1ldC52YWwoKTtRLmluZGV4T2Yod3QpPT09LTEmJihRLnB1c2god3QpLEUucHVzaChldCksXyE9PW51bGwmJkFycmF5LmlzQXJyYXkoX1swXSkmJihfWzBdPV9bMF0uc29ydCgpLmpvaW4oIiwiKSksXyE9PW51bGwmJmV0LnZhbCgpPT09X1swXSYmKGV0LnByb3AoInNlbGVjdGVkIiwhMCksWC5yZW1vdmVDbGFzcyhjLmNsYXNzZXMuaXRhbGljKSxsLmRvbS52YWx1ZVRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIikpKX07aWYoRilmb3IodmFyIFI9MDtSPEIuZmlsdGVyLmxlbmd0aDtSKyspTChCLmZpbHRlcltSXSxCLnRleHRbUl0pO2Vsc2UgTChCLmZpbHRlcixBcnJheS5pc0FycmF5KEIudGV4dCk/Qi50ZXh0LmpvaW4oIiwgIik6Qi50ZXh0KX1FLnNvcnQoZnVuY3Rpb24obnQsdHQpe2lmKGwucy50eXBlPT09ImFycmF5Inx8bC5zLnR5cGU9PT0ic3RyaW5nInx8bC5zLnR5cGU9PT0iaHRtbCIpcmV0dXJuIG50LnZhbCgpPHR0LnZhbCgpPy0xOm50LnZhbCgpPnR0LnZhbCgpPzE6MDtpZihsLnMudHlwZT09PSJudW0ifHxsLnMudHlwZT09PSJodG1sLW51bSIpcmV0dXJuK250LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTwrdHQudmFsKCkucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpPy0xOitudC52YWwoKS5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKT8xOjA7aWYobC5zLnR5cGU9PT0ibnVtLWZtdCJ8fGwucy50eXBlPT09Imh0bWwtbnVtLWZtdCIpcmV0dXJuK250LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik8K3R0LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik/LTE6K250LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik/MTowfSk7Zm9yKHZhciBxPTAsej1FO3E8ei5sZW5ndGg7cSsrKXt2YXIgRz16W3FdO1guYXBwZW5kKEcpfXJldHVybiBYfSxjLmluaXRTZWxlY3RTU1A9ZnVuY3Rpb24obCxoLF8pe189PT12b2lkIDAmJihfPW51bGwpLGwuZG9tLnZhbHVlVGl0bGUucHJvcCgic2VsZWN0ZWQiLCEwKTt2YXIgRj10KCI8c2VsZWN0Lz4iKS5hZGRDbGFzcyhjLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGMuY2xhc3Nlcy5kcm9wRG93bikuYWRkQ2xhc3MoYy5jbGFzc2VzLml0YWxpYykuYWRkQ2xhc3MoYy5jbGFzc2VzLnNlbGVjdCkuYXBwZW5kKGwuZG9tLnZhbHVlVGl0bGUpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXt0KHRoaXMpLnJlbW92ZUNsYXNzKGMuY2xhc3Nlcy5pdGFsaWMpLGgobCx0aGlzKX0pO2wuYy5ncmV5c2NhbGUmJkYuYWRkQ2xhc3MoYy5jbGFzc2VzLmdyZXlzY2FsZSk7Zm9yKHZhciBPPVtdLGY9MCxVPWwucy5zZXJ2ZXJEYXRhW2wucy5vcmlnRGF0YV07ZjxVLmxlbmd0aDtmKyspe3ZhciBYPVVbZl0sUT1YLnZhbHVlLEU9WC5sYWJlbCwkPWZ1bmN0aW9uKEIsTCl7bC5zLnR5cGUuaW5jbHVkZXMoImh0bWwiKSYmQiE9PW51bGwmJnR5cGVvZiBCPT0ic3RyaW5nIiYmQi5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik7dmFyIFI9dCgiPG9wdGlvbj4iLHt0eXBlOkFycmF5LmlzQXJyYXkoQik/IkFycmF5IjoiU3RyaW5nIix2YWx1ZTpCfSkuZGF0YSgic2J2IixCKS5hZGRDbGFzcyhsLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyhsLmNsYXNzZXMubm90SXRhbGljKS5odG1sKHR5cGVvZiBMPT0ic3RyaW5nIj9MLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTpMKTtPLnB1c2goUiksXyE9PW51bGwmJlIudmFsKCk9PT1fWzBdJiYoUi5wcm9wKCJzZWxlY3RlZCIsITApLEYucmVtb3ZlQ2xhc3MoYy5jbGFzc2VzLml0YWxpYyksbC5kb20udmFsdWVUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpKX07JChRLEUpfWZvcih2YXIgdz0wLGs9Tzt3PGsubGVuZ3RoO3crKyl7dmFyIFM9a1t3XTtGLmFwcGVuZChTKX1yZXR1cm4gRn0sYy5pbml0U2VsZWN0QXJyYXk9ZnVuY3Rpb24obCxoLF8pe3JldHVybiBfPT09dm9pZCAwJiYoXz1udWxsKSxjLmluaXRTZWxlY3QobCxoLF8sITApfSxjLmluaXRJbnB1dD1mdW5jdGlvbihsLGgsXyl7Xz09PXZvaWQgMCYmKF89bnVsbCk7dmFyIEY9bC5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksTz10KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixsLl90aHJvdHRsZShmdW5jdGlvbihmKXt2YXIgVT1mLmtleUNvZGV8fGYud2hpY2g7cmV0dXJuIGgobCx0aGlzLFUpfSxGPT09bnVsbD8xMDA6RikpO3JldHVybiBsLmMuZ3JleXNjYWxlJiZPLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpLF8hPT1udWxsJiZPLnZhbChfWzBdKSxsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLE99LGMuaW5pdDJJbnB1dD1mdW5jdGlvbihsLGgsXyl7Xz09PXZvaWQgMCYmKF89bnVsbCk7dmFyIEY9bC5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksTz1bdCgiPGlucHV0Lz4iKS5hZGRDbGFzcyhjLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGMuY2xhc3Nlcy5pbnB1dCkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsbC5fdGhyb3R0bGUoZnVuY3Rpb24oZil7dmFyIFU9Zi5rZXlDb2RlfHxmLndoaWNoO3JldHVybiBoKGwsdGhpcyxVKX0sRj09PW51bGw/MTAwOkYpKSx0KCI8c3Bhbj4iKS5hZGRDbGFzcyhsLmNsYXNzZXMuam9pbmVyKS5odG1sKGwucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnZhbHVlSm9pbmVyIixsLmMuaTE4bi52YWx1ZUpvaW5lcikpLHQoIjxpbnB1dC8+IikuYWRkQ2xhc3MoYy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhjLmNsYXNzZXMuaW5wdXQpLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLGwuX3Rocm90dGxlKGZ1bmN0aW9uKGYpe3ZhciBVPWYua2V5Q29kZXx8Zi53aGljaDtyZXR1cm4gaChsLHRoaXMsVSl9LEY9PT1udWxsPzEwMDpGKSldO3JldHVybiBsLmMuZ3JleXNjYWxlJiYoT1swXS5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKSxPWzJdLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpKSxfIT09bnVsbCYmKE9bMF0udmFsKF9bMF0pLE9bMl0udmFsKF9bMV0pKSxsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLE99LGMuaW5pdERhdGU9ZnVuY3Rpb24obCxoLF8pe189PT12b2lkIDAmJihfPW51bGwpO3ZhciBGPWwucy5kdC5zZXR0aW5ncygpWzBdLnNlYXJjaERlbGF5LE89bC5zLmR0LmkxOG4oImRhdGV0aW1lIix7fSksZj10KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpsLnMuZGF0ZUZvcm1hdD9sLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjpPfSkub24oImNoYW5nZS5kdHNiIixsLl90aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBoKGwsdGhpcyl9LEY9PT1udWxsPzEwMDpGKSkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsZnVuY3Rpb24oVSl7bC5fdGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgWD1VLmtleUNvZGV8fFUud2hpY2g7cmV0dXJuIGgobCx0aGlzLFgpfSxGPT09bnVsbD8xMDA6Ril9KTtyZXR1cm4gbC5jLmdyZXlzY2FsZSYmZi5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKSxfIT09bnVsbCYmZi52YWwoX1swXSksbC5zLmR0Lm9uZSgiZHJhdy5kdHNiIixmdW5jdGlvbigpe2wucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSxmfSxjLmluaXROb1ZhbHVlPWZ1bmN0aW9uKGwpe3JldHVybiBsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLFtdfSxjLmluaXQyRGF0ZT1mdW5jdGlvbihsLGgsXyl7dmFyIEY9dGhpcztfPT09dm9pZCAwJiYoXz1udWxsKTt2YXIgTz1sLnMuZHQuc2V0dGluZ3MoKVswXS5zZWFyY2hEZWxheSxmPWwucy5kdC5pMThuKCJkYXRldGltZSIse30pLFU9W3QoIjxpbnB1dC8+IikuYWRkQ2xhc3MoYy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhjLmNsYXNzZXMuaW5wdXQpLmR0RGF0ZVRpbWUoe2F0dGFjaFRvOiJpbnB1dCIsZm9ybWF0Omwucy5kYXRlRm9ybWF0P2wucy5kYXRlRm9ybWF0OnZvaWQgMCxpMThuOmZ9KS5vbigiY2hhbmdlLmR0c2IiLE8hPT1udWxsP2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtyZXR1cm4gaChsLHRoaXMpfSxPKTpmdW5jdGlvbigpe2gobCxGKX0pLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLGZ1bmN0aW9uKFgpe2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgUT1YLmtleUNvZGV8fFgud2hpY2g7cmV0dXJuIGgobCx0aGlzLFEpfSxPPT09bnVsbD8wOk8pfSksdCgiPHNwYW4+IikuYWRkQ2xhc3MobC5jbGFzc2VzLmpvaW5lcikuaHRtbChsLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci52YWx1ZUpvaW5lciIsbC5jLmkxOG4udmFsdWVKb2luZXIpKSx0KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpsLnMuZGF0ZUZvcm1hdD9sLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjpmfSkub24oImNoYW5nZS5kdHNiIixPIT09bnVsbD9hdC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGgobCx0aGlzKX0sTyk6ZnVuY3Rpb24oKXtoKGwsRil9KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIiwhbC5jLmVudGVyU2VhcmNoJiYhKGwucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmbC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybikmJk8hPT1udWxsP2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtyZXR1cm4gaChsLHRoaXMpfSxPKTpmdW5jdGlvbihYKXt2YXIgUT1YLmtleUNvZGV8fFgud2hpY2g7aChsLEYsUSl9KV07cmV0dXJuIGwuYy5ncmV5c2NhbGUmJihVWzBdLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpLFVbMl0uYWRkQ2xhc3MoYy5jbGFzc2VzLmdyZXlzY2FsZSkpLF8hPT1udWxsJiZfLmxlbmd0aD4wJiYoVVswXS52YWwoX1swXSksVVsyXS52YWwoX1sxXSkpLGwucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtsLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksVX0sYy5pc0lucHV0VmFsaWRTZWxlY3Q9ZnVuY3Rpb24obCl7Zm9yKHZhciBoPSEwLF89MCxGPWw7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107Ty5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIikubGVuZ3RoPT09Ty5jaGlsZHJlbigib3B0aW9uIikubGVuZ3RoLU8uY2hpbGRyZW4oIm9wdGlvbi4iK2MuY2xhc3Nlcy5ub3RJdGFsaWMpLmxlbmd0aCYmTy5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIikubGVuZ3RoPT09MSYmTy5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIilbMF09PT1PLmNoaWxkcmVuKCJvcHRpb24iKVswXSYmKGg9ITEpfXJldHVybiBofSxjLmlzSW5wdXRWYWxpZElucHV0PWZ1bmN0aW9uKGwpe2Zvcih2YXIgaD0hMCxfPTAsRj1sO188Ri5sZW5ndGg7XysrKXt2YXIgTz1GW19dO08uaXMoImlucHV0IikmJk8udmFsKCkubGVuZ3RoPT09MCYmKGg9ITEpfXJldHVybiBofSxjLmlucHV0VmFsdWVTZWxlY3Q9ZnVuY3Rpb24obCl7Zm9yKHZhciBoPVtdLF89MCxGPWw7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107Ty5pcygic2VsZWN0IikmJmgucHVzaChjLl9lc2NhcGVIVE1MKE8uY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLmRhdGEoInNidiIpKSl9cmV0dXJuIGh9LGMuaW5wdXRWYWx1ZUlucHV0PWZ1bmN0aW9uKGwpe2Zvcih2YXIgaD1bXSxfPTAsRj1sO188Ri5sZW5ndGg7XysrKXt2YXIgTz1GW19dO08uaXMoImlucHV0IikmJmgucHVzaChjLl9lc2NhcGVIVE1MKE8udmFsKCkpKX1yZXR1cm4gaH0sYy51cGRhdGVMaXN0ZW5lcj1mdW5jdGlvbihsLGgsXyl7dmFyIEY9bC5zLmNvbmRpdGlvbnNbbC5zLmNvbmRpdGlvbl0sTztpZihsLnMuZmlsbGVkPUYuaXNJbnB1dFZhbGlkKGwuZG9tLnZhbHVlLGwpLGwucy52YWx1ZT1GLmlucHV0VmFsdWUobC5kb20udmFsdWUsbCksIWwucy5maWxsZWQpeyghbC5jLmVudGVyU2VhcmNoJiYhKGwucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmbC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybil8fF89PT0xMykmJmwuZG9TZWFyY2goKTtyZXR1cm59Zm9yKEFycmF5LmlzQXJyYXkobC5zLnZhbHVlKXx8KGwucy52YWx1ZT1bbC5zLnZhbHVlXSksTz0wO088bC5zLnZhbHVlLmxlbmd0aDtPKyspQXJyYXkuaXNBcnJheShsLnMudmFsdWVbT10pJiZsLnMudmFsdWVbT10uc29ydCgpO3ZhciBmPW51bGwsVT1udWxsO2ZvcihPPTA7TzxsLmRvbS52YWx1ZS5sZW5ndGg7TysrKWg9PT1sLmRvbS52YWx1ZVtPXVswXSYmKGY9TyxoLnNlbGVjdGlvblN0YXJ0IT09dm9pZCAwJiYoVT1oLnNlbGVjdGlvblN0YXJ0KSk7KCFsLmMuZW50ZXJTZWFyY2gmJiEobC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoIT09dm9pZCAwJiZsLnMuZHQuc2V0dGluZ3MoKVswXS5vSW5pdC5zZWFyY2gucmV0dXJuKXx8Xz09PTEzKSYmbC5kb1NlYXJjaCgpLGYhPT1udWxsJiYobC5kb20udmFsdWVbZl0ucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksbC5kb20udmFsdWVbZl0uZm9jdXMoKSxVIT09bnVsbCYmbC5kb20udmFsdWVbZl1bMF0uc2V0U2VsZWN0aW9uUmFuZ2UoVSxVKSl9LGMuZGF0ZUNvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVxdWFscyIsaC5jb25kaXRpb25zLmRhdGUuZXF1YWxzKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbD09PWhbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixoLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbD1sLnJlcGxhY2UoLyhcL3wtfCwpL2csIi0iKSxsIT09aFswXX19LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSIsaC5jb25kaXRpb25zLmRhdGUuYmVmb3JlKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbDxoWzBdfX0sIj4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYWZ0ZXIiLGguY29uZGl0aW9ucy5kYXRlLmFmdGVyKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbD5oWzBdfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGguY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmMuaW5pdDJEYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksaFswXTxoWzFdP2hbMF08PWwmJmw8PWhbMV06aFsxXTw9bCYmbDw9aFswXX19LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuIixoLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuKX0saW5pdDpjLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsPWwucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLGhbMF08aFsxXT8hKGhbMF08PWwmJmw8PWhbMV0pOiEoaFsxXTw9bCYmbDw9aFswXSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLmVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PW51bGx8fGwubGVuZ3RoPT09MH19LCIhbnVsbCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSIsaC5jb25kaXRpb25zLmRhdGUubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4hKGw9PW51bGx8fGwubGVuZ3RoPT09MCl9fX0sYy5tb21lbnREYXRlQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZXF1YWxzIixoLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPT09bigpKGhbMF0sXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3QiLGguY29uZGl0aW9ucy5kYXRlLm5vdCl9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIG4oKShsLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCkhPT1uKCkoaFswXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmVmb3JlIixoLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPG4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5hZnRlciIsaC5jb25kaXRpb25zLmRhdGUuYWZ0ZXIpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPm4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSxiZXR3ZWVuOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmV0d2VlbiIsaC5jb25kaXRpb25zLmRhdGUuYmV0d2Vlbil9LGluaXQ6Yy5pbml0MkRhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPW4oKShsLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksTz1uKCkoaFswXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpLGY9bigpKGhbMV0sXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKTtyZXR1cm4gTzxmP088PUYmJkY8PWY6Zjw9RiYmRjw9T319LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuIixoLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuKX0saW5pdDpjLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7dmFyIEY9bigpKGwsXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKSxPPW4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksZj1uKCkoaFsxXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpO3JldHVybiBPPGY/ISgrTzw9K0YmJitGPD0rZik6ISgrZjw9K0YmJitGPD0rTyl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLmVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PW51bGx8fGwubGVuZ3RoPT09MH19LCIhbnVsbCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSIsaC5jb25kaXRpb25zLmRhdGUubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4hKGw9PW51bGx8fGwubGVuZ3RoPT09MCl9fX0sYy5sdXhvbkRhdGVDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMiLGguY29uZGl0aW9ucy5kYXRlLmVxdWFscyl9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIHIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzPT09cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFswXSxfLnMuZGF0ZUZvcm1hdCkudHN9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixoLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiByKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50cyE9PXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmVmb3JlIixoLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiByKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50czxyKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChoWzBdLF8ucy5kYXRlRm9ybWF0KS50c319LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmFmdGVyIixoLmNvbmRpdGlvbnMuZGF0ZS5hZnRlcil9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIHIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzPnIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGguY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmMuaW5pdDJEYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXt2YXIgRj1yKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50cyxPPXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzLGY9cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFsxXSxfLnMuZGF0ZUZvcm1hdCkudHM7cmV0dXJuIE88Zj9PPD1GJiZGPD1mOmY8PUYmJkY8PU99fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90QmV0d2VlbiIsaC5jb25kaXRpb25zLmRhdGUubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MkRhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzLE89cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFswXSxfLnMuZGF0ZUZvcm1hdCkudHMsZj1yKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChoWzFdLF8ucy5kYXRlRm9ybWF0KS50cztyZXR1cm4gTzxmPyEoK088PStGJiYrRjw9K2YpOiEoK2Y8PStGJiYrRjw9K08pfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVtcHR5IixoLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90RW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIShsPT1udWxsfHxsLmxlbmd0aD09PTApfX19LGMubnVtQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lcXVhbHMiLGguY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzKX0saW5pdDpjLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybitsPT0raFswXX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdCIsaC5jb25kaXRpb25zLm51bWJlci5ub3QpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2whPStoWzBdfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdCIsaC5jb25kaXRpb25zLm51bWJlci5sdCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4rbDwraFswXX19LCI8PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0ZSIsaC5jb25kaXRpb25zLm51bWJlci5sdGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2w8PStoWzBdfX0sIj49Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZ3RlIixoLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4rbD49K2hbMF19fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0IixoLmNvbmRpdGlvbnMubnVtYmVyLmd0KX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybitsPitoWzBdfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuYmV0d2VlbiIsaC5jb25kaXRpb25zLm51bWJlci5iZXR3ZWVuKX0saW5pdDpjLmluaXQySW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4raFswXTwraFsxXT8raFswXTw9K2wmJitsPD0raFsxXToraFsxXTw9K2wmJitsPD0raFswXX19LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4iLGguY29uZGl0aW9ucy5udW1iZXIubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MklucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2hbMF08K2hbMV0/ISgraFswXTw9K2wmJitsPD0raFsxXSk6ISgraFsxXTw9K2wmJitsPD0raFswXSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLm51bUZtdENvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzIixoLmNvbmRpdGlvbnMubnVtYmVyLmVxdWFscyl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBfLnBhcnNlTnVtYmVyKGwpPT09Xy5wYXJzZU51bWJlcihoWzBdKX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdCIsaC5jb25kaXRpb25zLm51bWJlci5ub3QpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKSE9PV8ucGFyc2VOdW1iZXIoaFswXSl9fSwiPCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0IixoLmNvbmRpdGlvbnMubnVtYmVyLmx0KX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIF8ucGFyc2VOdW1iZXIobCk8Xy5wYXJzZU51bWJlcihoWzBdKX19LCI8PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0ZSIsaC5jb25kaXRpb25zLm51bWJlci5sdGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKTw9Xy5wYXJzZU51bWJlcihoWzBdKX19LCI+PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSIsaC5jb25kaXRpb25zLm51bWJlci5ndGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKT49Xy5wYXJzZU51bWJlcihoWzBdKX19LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZ3QiLGguY29uZGl0aW9ucy5udW1iZXIuZ3QpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKT5fLnBhcnNlTnVtYmVyKGhbMF0pfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuYmV0d2VlbiIsaC5jb25kaXRpb25zLm51bWJlci5iZXR3ZWVuKX0saW5pdDpjLmluaXQySW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPV8ucGFyc2VOdW1iZXIobCksTz1fLnBhcnNlTnVtYmVyKGhbMF0pLGY9Xy5wYXJzZU51bWJlcihoWzFdKTtyZXR1cm4rTzwrZj8rTzw9K0YmJitGPD0rZjorZjw9K0YmJitGPD0rT319LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4iLGguY29uZGl0aW9ucy5udW1iZXIubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MklucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXt2YXIgRj1fLnBhcnNlTnVtYmVyKGwpLE89Xy5wYXJzZU51bWJlcihoWzBdKSxmPV8ucGFyc2VOdW1iZXIoaFsxXSk7cmV0dXJuK088K2Y/ISgrTzw9K0YmJitGPD0rZik6ISgrZjw9K0YmJitGPD0rTyl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLnN0cmluZ0NvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuZXF1YWxzIixoLmNvbmRpdGlvbnMuc3RyaW5nLmVxdWFscyl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbD09PWhbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3QiLGguY29uZGl0aW9ucy5zdHJpbmcubm90KX0saW5pdDpjLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwhPT1oWzBdfX0sc3RhcnRzOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5zdGFydHNXaXRoIixoLmNvbmRpdGlvbnMuc3RyaW5nLnN0YXJ0c1dpdGgpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGhbMF0udG9Mb3dlckNhc2UoKSk9PT0wfX0sIiFzdGFydHMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RTdGFydHNXaXRoIixoLmNvbmRpdGlvbnMuc3RyaW5nLm5vdFN0YXJ0c1dpdGgpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGhbMF0udG9Mb3dlckNhc2UoKSkhPT0wfX0sY29udGFpbnM6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuc3RyaW5nLmNvbnRhaW5zIixoLmNvbmRpdGlvbnMuc3RyaW5nLmNvbnRhaW5zKX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaFswXS50b0xvd2VyQ2FzZSgpKX19LCIhY29udGFpbnMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RDb250YWlucyIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RDb250YWlucyl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4hbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGhbMF0udG9Mb3dlckNhc2UoKSl9fSxlbmRzOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5lbmRzV2l0aCIsaC5jb25kaXRpb25zLnN0cmluZy5lbmRzV2l0aCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGhbMF0udG9Mb3dlckNhc2UoKSl9fSwiIWVuZHMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RFbmRzV2l0aCIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RFbmRzV2l0aCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4hbC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGhbMF0udG9Mb3dlckNhc2UoKSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5lbXB0eSIsaC5jb25kaXRpb25zLnN0cmluZy5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RFbXB0eSIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLmFycmF5Q29uZGl0aW9ucz17Y29udGFpbnM6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuY29udGFpbnMiLGguY29uZGl0aW9ucy5hcnJheS5jb250YWlucyl9LGluaXQ6Yy5pbml0U2VsZWN0QXJyYXksaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLmluY2x1ZGVzKGhbMF0pfX0sd2l0aG91dDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS53aXRob3V0IixoLmNvbmRpdGlvbnMuYXJyYXkud2l0aG91dCl9LGluaXQ6Yy5pbml0U2VsZWN0QXJyYXksaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLmluZGV4T2YoaFswXSk9PT0tMX19LCI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS5lcXVhbHMiLGguY29uZGl0aW9ucy5hcnJheS5lcXVhbHMpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7aWYobC5sZW5ndGg9PT1oWzBdLmxlbmd0aCl7Zm9yKHZhciBfPTA7XzxsLmxlbmd0aDtfKyspaWYobFtfXSE9PWhbMF1bX10pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5Lm5vdCIsaC5jb25kaXRpb25zLmFycmF5Lm5vdCl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtpZihsLmxlbmd0aD09PWhbMF0ubGVuZ3RoKXtmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKylpZihsW19dIT09aFswXVtfXSlyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMH19LG51bGw6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuZW1wdHkiLGguY29uZGl0aW9ucy5hcnJheS5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5Lm5vdEVtcHR5IixoLmNvbmRpdGlvbnMuYXJyYXkubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4gbCE9bnVsbCYmbC5sZW5ndGghPT0wfX19LGMuZGVmYXVsdHM9e2NvbHVtbnM6ITAsY29uZGl0aW9uczp7YXJyYXk6Yy5hcnJheUNvbmRpdGlvbnMsZGF0ZTpjLmRhdGVDb25kaXRpb25zLGh0bWw6Yy5zdHJpbmdDb25kaXRpb25zLCJodG1sLW51bSI6Yy5udW1Db25kaXRpb25zLCJodG1sLW51bS1mbXQiOmMubnVtRm10Q29uZGl0aW9ucyxsdXhvbjpjLmx1eG9uRGF0ZUNvbmRpdGlvbnMsbW9tZW50OmMubW9tZW50RGF0ZUNvbmRpdGlvbnMsbnVtOmMubnVtQ29uZGl0aW9ucywibnVtLWZtdCI6Yy5udW1GbXRDb25kaXRpb25zLHN0cmluZzpjLnN0cmluZ0NvbmRpdGlvbnN9LGRlcHRoTGltaXQ6ITEsZW50ZXJTZWFyY2g6ITEsZmlsdGVyQ2hhbmdlZDp2b2lkIDAsZ3JleXNjYWxlOiExLGkxOG46e2FkZDoiQWRkIENvbmRpdGlvbiIsYnV0dG9uOnswOiJTZWFyY2ggQnVpbGRlciIsXzoiU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LGNsZWFyQWxsOiJDbGVhciBBbGwiLGNvbmRpdGlvbjoiQ29uZGl0aW9uIixkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbGl2ZVNlYXJjaDohMCxsb2dpYzoiQU5EIixvcnRob2dvbmFsOntkaXNwbGF5OiJkaXNwbGF5IixzZWFyY2g6ImZpbHRlciJ9LHByZURlZmluZWQ6ITF9LGN9KCksbztmdW5jdGlvbiB1KGMpe289YyxjLmZuLmRhdGFUYWJsZX12YXIgcD1mdW5jdGlvbigpe2Z1bmN0aW9uIGMobCxoLF8sRixPLGYsVSl7cmV0dXJuIEY9PT12b2lkIDAmJihGPTApLE89PT12b2lkIDAmJihPPSExKSxmPT09dm9pZCAwJiYoZj0xKSxVPT09dm9pZCAwJiYoVT12b2lkIDApLHRoaXMuY2xhc3Nlcz1vLmV4dGVuZCghMCx7fSxjLmNsYXNzZXMpLHRoaXMuYz1vLmV4dGVuZCghMCx7fSxjLmRlZmF1bHRzLGgpLHRoaXMucz17Y3JpdGVyaWE6W10sZGVwdGg6ZixkdDpsLGluZGV4OkYsaXNDaGlsZDpPLGxvZ2ljOnZvaWQgMCxvcHRzOmgscHJldmVudFJlZHJhdzohMSxzZXJ2ZXJEYXRhOlUsdG9Ecm9wOnZvaWQgMCx0b3BHcm91cDpffSx0aGlzLmRvbT17YWRkOm8oIjxidXR0b24vPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5hZGQpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKSxjbGVhcjpvKCI8YnV0dG9uPiZ0aW1lczwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckdyb3VwKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksY29udGFpbmVyOm8oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncm91cCksbG9naWM6bygiPGJ1dHRvbj48ZGl2Lz48L2J1dHRvbj4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubG9naWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKSxsb2dpY0NvbnRhaW5lcjpvKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubG9naWNDb250YWluZXIpLHNlYXJjaDpvKCI8YnV0dG9uLz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VhcmNoKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIikuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSx0aGlzLnMudG9wR3JvdXA9PT12b2lkIDAmJih0aGlzLnMudG9wR3JvdXA9dGhpcy5kb20uY29udGFpbmVyKSx0aGlzLl9zZXR1cCgpLHRoaXN9cmV0dXJuIGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRvbS5hZGQub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmxvZ2ljLm9mZigiLmR0c2IiKSx0aGlzLmRvbS5zZWFyY2gub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWRlc3Ryb3kiKS5yZW1vdmUoKSx0aGlzLnMuY3JpdGVyaWE9W119LGMucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obCl7aWYobD09PXZvaWQgMCYmKGw9ITEpLHRoaXMucy5jcml0ZXJpYS5sZW5ndGg9PT0wKXJldHVybnt9O2Zvcih2YXIgaD17Y3JpdGVyaWE6W10sbG9naWM6dGhpcy5zLmxvZ2ljfSxfPTAsRj10aGlzLnMuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107aC5jcml0ZXJpYS5wdXNoKE8uY3JpdGVyaWEuZ2V0RGV0YWlscyhsKSl9cmV0dXJuIGh9LGMucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxjLnByb3RvdHlwZS5yZWJ1aWxkPWZ1bmN0aW9uKGwpe3ZhciBoO2lmKCEobC5jcml0ZXJpYT09PXZvaWQgMHx8bC5jcml0ZXJpYT09PW51bGx8fEFycmF5LmlzQXJyYXkobC5jcml0ZXJpYSkmJmwuY3JpdGVyaWEubGVuZ3RoPT09MCkpe2lmKHRoaXMucy5sb2dpYz1sLmxvZ2ljLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5sb2dpYz09PSJPUiI/dGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubG9naWNPciIsdGhpcy5jLmkxOG4ubG9naWNPcik6dGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubG9naWNBbmQiLHRoaXMuYy5pMThuLmxvZ2ljQW5kKSksQXJyYXkuaXNBcnJheShsLmNyaXRlcmlhKSlmb3IodmFyIF89MCxGPWwuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspaD1GW19dLGgubG9naWMhPT12b2lkIDA/dGhpcy5fYWRkUHJldkdyb3VwKGgpOmgubG9naWM9PT12b2lkIDAmJnRoaXMuX2FkZFByZXZDcml0ZXJpYShoKTtmb3IodmFyIE89MCxmPXRoaXMucy5jcml0ZXJpYTtPPGYubGVuZ3RoO08rKyloPWZbT10saC5jcml0ZXJpYSBpbnN0YW5jZW9mIGkmJihoLmNyaXRlcmlhLnVwZGF0ZUFycm93cyh0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPjEpLHRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKGguY3JpdGVyaWEpKX19LGMucHJvdG90eXBlLnJlZHJhd0NvbnRlbnRzPWZ1bmN0aW9uKCl7aWYoIXRoaXMucy5wcmV2ZW50UmVkcmF3KXt0aGlzLmRvbS5jb250YWluZXIuY2hpbGRyZW4oKS5kZXRhY2goKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyKS5hcHBlbmQodGhpcy5kb20uYWRkKSx0aGlzLmMubGl2ZVNlYXJjaHx8dGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5zZWFyY2gpLHRoaXMucy5jcml0ZXJpYS5zb3J0KGZ1bmN0aW9uKF8sRil7cmV0dXJuIF8uY3JpdGVyaWEucy5pbmRleDxGLmNyaXRlcmlhLnMuaW5kZXg/LTE6Xy5jcml0ZXJpYS5zLmluZGV4PkYuY3JpdGVyaWEucy5pbmRleD8xOjB9KSx0aGlzLnNldExpc3RlbmVycygpO2Zvcih2YXIgbD0wO2w8dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDtsKyspe3ZhciBoPXRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYTtoIGluc3RhbmNlb2YgaT8odGhpcy5zLmNyaXRlcmlhW2xdLmluZGV4PWwsdGhpcy5zLmNyaXRlcmlhW2xdLmNyaXRlcmlhLnMuaW5kZXg9bCx0aGlzLnMuY3JpdGVyaWFbbF0uY3JpdGVyaWEuZG9tLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5kb20uYWRkKSx0aGlzLl9zZXRDcml0ZXJpYUxpc3RlbmVycyhoKSx0aGlzLnMuY3JpdGVyaWFbbF0uY3JpdGVyaWEucy5wcmV2ZW50UmVkcmF3PXRoaXMucy5wcmV2ZW50UmVkcmF3LHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5yZWJ1aWxkKHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5nZXREZXRhaWxzKCkpLHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5zLnByZXZlbnRSZWRyYXc9ITEpOmggaW5zdGFuY2VvZiBjJiZoLnMuY3JpdGVyaWEubGVuZ3RoPjA/KHRoaXMucy5jcml0ZXJpYVtsXS5pbmRleD1sLHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5zLmluZGV4PWwsdGhpcy5zLmNyaXRlcmlhW2xdLmNyaXRlcmlhLmRvbS5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLmFkZCksaC5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsaC5yZWRyYXdDb250ZW50cygpLGgucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMuX3NldEdyb3VwTGlzdGVuZXJzKGgpKToodGhpcy5zLmNyaXRlcmlhLnNwbGljZShsLDEpLGwtLSl9dGhpcy5zZXR1cExvZ2ljKCl9fSxjLnByb3RvdHlwZS5yZWRyYXdMb2dpYz1mdW5jdGlvbigpe2Zvcih2YXIgbD0wLGg9dGhpcy5zLmNyaXRlcmlhO2w8aC5sZW5ndGg7bCsrKXt2YXIgXz1oW2xdO18uY3JpdGVyaWEgaW5zdGFuY2VvZiBjJiZfLmNyaXRlcmlhLnJlZHJhd0xvZ2ljKCl9dGhpcy5zZXR1cExvZ2ljKCl9LGMucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbihsLGgpe3JldHVybiB0aGlzLnMubG9naWM9PT0iQU5EIj90aGlzLl9hbmRTZWFyY2gobCxoKTp0aGlzLnMubG9naWM9PT0iT1IiP3RoaXMuX29yU2VhcmNoKGwsaCk6ITB9LGMucHJvdG90eXBlLnNldHVwTG9naWM9ZnVuY3Rpb24oKXtpZih0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5yZW1vdmUoKSx0aGlzLmRvbS5jbGVhci5yZW1vdmUoKSx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPDEpe3RoaXMucy5pc0NoaWxkfHwodGhpcy5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItZGVzdHJveSIpLHRoaXMuZG9tLmNvbnRhaW5lci5jc3MoIm1hcmdpbi1sZWZ0IiwwKSksdGhpcy5kb20uc2VhcmNoLmNzcygiZGlzcGxheSIsIm5vbmUiKTtyZXR1cm59dGhpcy5kb20uY2xlYXIuaGVpZ2h0KCIwcHgiKSx0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uY2xlYXIpLHRoaXMucy5pc0NoaWxkfHx0aGlzLmRvbS5zZWFyY2guY3NzKCJkaXNwbGF5IiwiaW5saW5lLWJsb2NrIiksdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmQodGhpcy5kb20ubG9naWNDb250YWluZXIpO2Zvcih2YXIgbD0wLGg9dGhpcy5zLmNyaXRlcmlhO2w8aC5sZW5ndGg7bCsrKXt2YXIgXz1oW2xdO18uY3JpdGVyaWEgaW5zdGFuY2VvZiBpJiZfLmNyaXRlcmlhLnNldHVwQnV0dG9ucygpfXZhciBGPXRoaXMuZG9tLmNvbnRhaW5lci5vdXRlckhlaWdodCgpLTE7dGhpcy5kb20ubG9naWNDb250YWluZXIud2lkdGgoRiksdGhpcy5fc2V0TG9naWNMaXN0ZW5lcigpLHRoaXMuZG9tLmNvbnRhaW5lci5jc3MoIm1hcmdpbi1sZWZ0Iix0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vdXRlckhlaWdodCghMCkpO3ZhciBPPXRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm9mZnNldCgpLGY9Ty5sZWZ0LFU9dGhpcy5kb20uY29udGFpbmVyLm9mZnNldCgpLmxlZnQsWD1mLVUsUT1mLVgtdGhpcy5kb20ubG9naWNDb250YWluZXIub3V0ZXJIZWlnaHQoITApO3RoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm9mZnNldCh7bGVmdDpRfSk7dmFyIEU9dGhpcy5kb20ubG9naWNDb250YWluZXIubmV4dCgpLCQ9Ty50b3Asdz1vKEUpLm9mZnNldCgpLnRvcCxrPSQtdyxTPSQtazt0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vZmZzZXQoe3RvcDpTfSksdGhpcy5kb20uY2xlYXIub3V0ZXJIZWlnaHQodGhpcy5kb20ubG9naWNDb250YWluZXIuaGVpZ2h0KCkpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKX0sYy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLmRvbS5hZGQudW5iaW5kKCJjbGljayIpLHRoaXMuZG9tLmFkZC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gbC5zLmlzQ2hpbGR8fGwuZG9tLmNvbnRhaW5lci5wcmVwZW5kKGwuZG9tLmxvZ2ljQ29udGFpbmVyKSxsLmFkZENyaXRlcmlhKCksbC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItYWRkIiksbC5zLmR0LnN0YXRlLnNhdmUoKSwhMX0pLHRoaXMuZG9tLnNlYXJjaC5vZmYoImNsaWNrLmR0c2IiKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLnMuZHQuZHJhdygpfSk7Zm9yKHZhciBoPTAsXz10aGlzLnMuY3JpdGVyaWE7aDxfLmxlbmd0aDtoKyspe3ZhciBGPV9baF07Ri5jcml0ZXJpYS5zZXRMaXN0ZW5lcnMoKX10aGlzLl9zZXRDbGVhckxpc3RlbmVyKCksdGhpcy5fc2V0TG9naWNMaXN0ZW5lcigpfSxjLnByb3RvdHlwZS5hZGRDcml0ZXJpYT1mdW5jdGlvbihsKXtsPT09dm9pZCAwJiYobD1udWxsKTt2YXIgaD1sPT09bnVsbD90aGlzLnMuY3JpdGVyaWEubGVuZ3RoOmwucy5pbmRleCxfPW5ldyBpKHRoaXMucy5kdCx0aGlzLnMub3B0cyx0aGlzLnMudG9wR3JvdXAsaCx0aGlzLnMuZGVwdGgsdGhpcy5zLnNlcnZlckRhdGEsdGhpcy5jLmxpdmVTZWFyY2gpO2whPT1udWxsJiYoXy5jPWwuYyxfLnM9bC5zLF8ucy5kZXB0aD10aGlzLnMuZGVwdGgsXy5jbGFzc2VzPWwuY2xhc3NlcyksXy5wb3B1bGF0ZSgpO2Zvcih2YXIgRj0hMSxPPTA7Tzx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoO08rKylPPT09MCYmdGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLnMuaW5kZXg+Xy5zLmluZGV4PyhfLmdldE5vZGUoKS5pbnNlcnRCZWZvcmUodGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLmRvbS5jb250YWluZXIpLEY9ITApOk88dGhpcy5zLmNyaXRlcmlhLmxlbmd0aC0xJiZ0aGlzLnMuY3JpdGVyaWFbT10uY3JpdGVyaWEucy5pbmRleDxfLnMuaW5kZXgmJnRoaXMucy5jcml0ZXJpYVtPKzFdLmNyaXRlcmlhLnMuaW5kZXg+Xy5zLmluZGV4JiYoXy5nZXROb2RlKCkuaW5zZXJ0QWZ0ZXIodGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLmRvbS5jb250YWluZXIpLEY9ITApO0Z8fF8uZ2V0Tm9kZSgpLmluc2VydEJlZm9yZSh0aGlzLmRvbS5hZGQpLHRoaXMucy5jcml0ZXJpYS5wdXNoKHtjcml0ZXJpYTpfLGluZGV4Omh9KSx0aGlzLnMuY3JpdGVyaWE9dGhpcy5zLmNyaXRlcmlhLnNvcnQoZnVuY3Rpb24oUSxFKXtyZXR1cm4gUS5jcml0ZXJpYS5zLmluZGV4LUUuY3JpdGVyaWEucy5pbmRleH0pO2Zvcih2YXIgZj0wLFU9dGhpcy5zLmNyaXRlcmlhO2Y8VS5sZW5ndGg7ZisrKXt2YXIgWD1VW2ZdO1guY3JpdGVyaWEgaW5zdGFuY2VvZiBpJiZYLmNyaXRlcmlhLnVwZGF0ZUFycm93cyh0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPjEpfXRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKF8pLF8uc2V0TGlzdGVuZXJzKCksdGhpcy5zZXR1cExvZ2ljKCl9LGMucHJvdG90eXBlLmNoZWNrRmlsbGVkPWZ1bmN0aW9uKCl7Zm9yKHZhciBsPTAsaD10aGlzLnMuY3JpdGVyaWE7bDxoLmxlbmd0aDtsKyspe3ZhciBfPWhbbF07aWYoXy5jcml0ZXJpYSBpbnN0YW5jZW9mIGkmJl8uY3JpdGVyaWEucy5maWxsZWR8fF8uY3JpdGVyaWEgaW5zdGFuY2VvZiBjJiZfLmNyaXRlcmlhLmNoZWNrRmlsbGVkKCkpcmV0dXJuITB9cmV0dXJuITF9LGMucHJvdG90eXBlLmNvdW50PWZ1bmN0aW9uKCl7Zm9yKHZhciBsPTAsaD0wLF89dGhpcy5zLmNyaXRlcmlhO2g8Xy5sZW5ndGg7aCsrKXt2YXIgRj1fW2hdO0YuY3JpdGVyaWEgaW5zdGFuY2VvZiBjP2wrPUYuY3JpdGVyaWEuY291bnQoKTpsKyt9cmV0dXJuIGx9LGMucHJvdG90eXBlLl9hZGRQcmV2R3JvdXA9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5zLmNyaXRlcmlhLmxlbmd0aCxfPW5ldyBjKHRoaXMucy5kdCx0aGlzLmMsdGhpcy5zLnRvcEdyb3VwLGgsITAsdGhpcy5zLmRlcHRoKzEsdGhpcy5zLnNlcnZlckRhdGEpO3RoaXMucy5jcml0ZXJpYS5wdXNoKHtjcml0ZXJpYTpfLGluZGV4OmgsbG9naWM6Xy5zLmxvZ2ljfSksXy5yZWJ1aWxkKGwpLHRoaXMucy5jcml0ZXJpYVtoXS5jcml0ZXJpYT1fLHRoaXMucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksdGhpcy5fc2V0R3JvdXBMaXN0ZW5lcnMoXyl9LGMucHJvdG90eXBlLl9hZGRQcmV2Q3JpdGVyaWE9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5zLmNyaXRlcmlhLmxlbmd0aCxfPW5ldyBpKHRoaXMucy5kdCx0aGlzLnMub3B0cyx0aGlzLnMudG9wR3JvdXAsaCx0aGlzLnMuZGVwdGgsdGhpcy5zLnNlcnZlckRhdGEpO18ucG9wdWxhdGUoKSx0aGlzLnMuY3JpdGVyaWEucHVzaCh7Y3JpdGVyaWE6XyxpbmRleDpofSksXy5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsXy5yZWJ1aWxkKGwpLF8ucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMucy5jcml0ZXJpYVtoXS5jcml0ZXJpYT1fLHRoaXMucy5wcmV2ZW50UmVkcmF3fHx0aGlzLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpfSxjLnByb3RvdHlwZS5fYW5kU2VhcmNoPWZ1bmN0aW9uKGwsaCl7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJuITA7Zm9yKHZhciBfPTAsRj10aGlzLnMuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107aWYoIShPLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmIU8uY3JpdGVyaWEucy5maWxsZWQpJiYhTy5jcml0ZXJpYS5zZWFyY2gobCxoKSlyZXR1cm4hMX1yZXR1cm4hMH0sYy5wcm90b3R5cGUuX29yU2VhcmNoPWZ1bmN0aW9uKGwsaCl7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJuITA7Zm9yKHZhciBfPSExLEY9MCxPPXRoaXMucy5jcml0ZXJpYTtGPE8ubGVuZ3RoO0YrKyl7dmFyIGY9T1tGXTtpZihmLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmZi5jcml0ZXJpYS5zLmZpbGxlZCl7aWYoXz0hMCxmLmNyaXRlcmlhLnNlYXJjaChsLGgpKXJldHVybiEwfWVsc2UgaWYoZi5jcml0ZXJpYSBpbnN0YW5jZW9mIGMmJmYuY3JpdGVyaWEuY2hlY2tGaWxsZWQoKSYmKF89ITAsZi5jcml0ZXJpYS5zZWFyY2gobCxoKSkpcmV0dXJuITB9cmV0dXJuIV99LGMucHJvdG90eXBlLl9yZW1vdmVDcml0ZXJpYT1mdW5jdGlvbihsLGgpe2g9PT12b2lkIDAmJihoPSExKTt2YXIgXztpZih0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPD0xJiZ0aGlzLnMuaXNDaGlsZCl0aGlzLmRlc3Ryb3koKTtlbHNle3ZhciBGPXZvaWQgMDtmb3IoXz0wO188dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDtfKyspdGhpcy5zLmNyaXRlcmlhW19dLmluZGV4PT09bC5zLmluZGV4JiYoIWh8fHRoaXMucy5jcml0ZXJpYVtfXS5jcml0ZXJpYSBpbnN0YW5jZW9mIGMpJiYoRj1fKTtmb3IoRiE9PXZvaWQgMCYmdGhpcy5zLmNyaXRlcmlhLnNwbGljZShGLDEpLF89MDtfPHRoaXMucy5jcml0ZXJpYS5sZW5ndGg7XysrKXRoaXMucy5jcml0ZXJpYVtfXS5pbmRleD1fLHRoaXMucy5jcml0ZXJpYVtfXS5jcml0ZXJpYS5zLmluZGV4PV99fSxjLnByb3RvdHlwZS5fc2V0Q3JpdGVyaWFMaXN0ZW5lcnM9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcztsLmRvbS5kZWxldGUudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe2guX3JlbW92ZUNyaXRlcmlhKGwpLGwuZG9tLmNvbnRhaW5lci5yZW1vdmUoKTtmb3IodmFyIF89MCxGPWgucy5jcml0ZXJpYTtfPEYubGVuZ3RoO18rKyl7dmFyIE89RltfXTtPLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmTy5jcml0ZXJpYS51cGRhdGVBcnJvd3MoaC5zLmNyaXRlcmlhLmxlbmd0aD4xKX1yZXR1cm4gbC5kZXN0cm95KCksaC5zLmR0LmRyYXcoKSxoLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLCExfSksbC5kb20ucmlnaHQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3ZhciBfPWwucy5pbmRleCxGPW5ldyBjKGgucy5kdCxoLnMub3B0cyxoLnMudG9wR3JvdXAsbC5zLmluZGV4LCEwLGgucy5kZXB0aCsxLGgucy5zZXJ2ZXJEYXRhKTtyZXR1cm4gRi5hZGRDcml0ZXJpYShsKSxoLnMuY3JpdGVyaWFbX10uY3JpdGVyaWE9RixoLnMuY3JpdGVyaWFbX10ubG9naWM9IkFORCIsaC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSxoLl9zZXRHcm91cExpc3RlbmVycyhGKSwhMX0pLGwuZG9tLmxlZnQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe2gucy50b0Ryb3A9bmV3IGkoaC5zLmR0LGgucy5vcHRzLGgucy50b3BHcm91cCxsLnMuaW5kZXgsdm9pZCAwLGgucy5zZXJ2ZXJEYXRhKSxoLnMudG9Ecm9wLnM9bC5zLGgucy50b0Ryb3AuYz1sLmMsaC5zLnRvRHJvcC5jbGFzc2VzPWwuY2xhc3NlcyxoLnMudG9Ecm9wLnBvcHVsYXRlKCk7dmFyIF89aC5zLnRvRHJvcC5zLmluZGV4O3JldHVybiBoLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1kcm9wQ3JpdGVyaWEiKSxsLnMuaW5kZXg9XyxoLl9yZW1vdmVDcml0ZXJpYShsKSxoLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLGgucy5kdC5kcmF3KCksITF9KX0sYy5wcm90b3R5cGUuX3NldENsZWFyTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmNsZWFyLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gbC5zLmlzQ2hpbGQ/KGwuZGVzdHJveSgpLGwucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksITEpOihsLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1jbGVhckNvbnRlbnRzIiksITEpfSl9LGMucHJvdG90eXBlLl9zZXRHcm91cExpc3RlbmVycz1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2wuZG9tLmFkZC51bmJpbmQoImNsaWNrIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGguc2V0dXBMb2dpYygpLGguZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWFkZCIpLCExfSksbC5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1hZGQiKS5vbigiZHRzYi1hZGQuZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gaC5zZXR1cExvZ2ljKCksaC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItYWRkIiksITF9KSxsLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWRlc3Ryb3kiKS5vbigiZHRzYi1kZXN0cm95LmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGguX3JlbW92ZUNyaXRlcmlhKGwsITApLGwuZG9tLmNvbnRhaW5lci5yZW1vdmUoKSxoLnNldHVwTG9naWMoKSwhMX0pLGwuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItZHJvcENyaXRlcmlhIikub24oImR0c2ItZHJvcENyaXRlcmlhLmR0c2IiLGZ1bmN0aW9uKCl7dmFyIF89bC5zLnRvRHJvcDtyZXR1cm4gXy5zLmluZGV4PWwucy5pbmRleCxfLnVwZGF0ZUFycm93cyhoLnMuY3JpdGVyaWEubGVuZ3RoPjEpLGguYWRkQ3JpdGVyaWEoXyksITF9KSxsLnNldExpc3RlbmVycygpfSxjLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0aGlzLnNldExpc3RlbmVycygpLHRoaXMuZG9tLmFkZC5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmFkZCIsdGhpcy5jLmkxOG4uYWRkKSksdGhpcy5kb20uc2VhcmNoLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuc2VhcmNoIix0aGlzLmMuaTE4bi5zZWFyY2gpKSx0aGlzLmRvbS5sb2dpYy5jaGlsZHJlbigpLmZpcnN0KCkuaHRtbCh0aGlzLmMubG9naWM9PT0iT1IiP3RoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljT3IiLHRoaXMuYy5pMThuLmxvZ2ljT3IpOnRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljQW5kIix0aGlzLmMuaTE4bi5sb2dpY0FuZCkpLHRoaXMucy5sb2dpYz10aGlzLmMubG9naWM9PT0iT1IiPyJPUiI6IkFORCIsdGhpcy5jLmdyZXlzY2FsZSYmdGhpcy5kb20ubG9naWMuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20ubG9naWNDb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljKS5hcHBlbmQodGhpcy5kb20uY2xlYXIpLHRoaXMucy5pc0NoaWxkJiZ0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmFkZCksdGhpcy5jLmxpdmVTZWFyY2h8fHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uc2VhcmNoKX0sYy5wcm90b3R5cGUuX3NldExvZ2ljTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmxvZ2ljLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLl90b2dnbGVMb2dpYygpLGwucy5kdC5kcmF3KCk7Zm9yKHZhciBoPTAsXz1sLnMuY3JpdGVyaWE7aDxfLmxlbmd0aDtoKyspe3ZhciBGPV9baF07Ri5jcml0ZXJpYS5zZXRMaXN0ZW5lcnMoKX19KX0sYy5wcm90b3R5cGUuX3RvZ2dsZUxvZ2ljPWZ1bmN0aW9uKCl7dGhpcy5zLmxvZ2ljPT09Ik9SIj8odGhpcy5zLmxvZ2ljPSJBTkQiLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljQW5kIix0aGlzLmMuaTE4bi5sb2dpY0FuZCkpKTp0aGlzLnMubG9naWM9PT0iQU5EIiYmKHRoaXMucy5sb2dpYz0iT1IiLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljT3IiLHRoaXMuYy5pMThuLmxvZ2ljT3IpKSl9LGMudmVyc2lvbj0iMS4xLjAiLGMuY2xhc3Nlcz17YWRkOiJkdHNiLWFkZCIsYnV0dG9uOiJkdHNiLWJ1dHRvbiIsY2xlYXJHcm91cDoiZHRzYi1jbGVhckdyb3VwIixncmV5c2NhbGU6ImR0c2ItZ3JleXNjYWxlIixncm91cDoiZHRzYi1ncm91cCIsaW5wdXRCdXR0b246ImR0c2ItaXB0YnRuIixsb2dpYzoiZHRzYi1sb2dpYyIsbG9naWNDb250YWluZXI6ImR0c2ItbG9naWNDb250YWluZXIiLHNlYXJjaDoiZHRzYi1zZWFyY2gifSxjLmRlZmF1bHRzPXtjb2x1bW5zOiEwLGNvbmRpdGlvbnM6e2RhdGU6aS5kYXRlQ29uZGl0aW9ucyxodG1sOmkuc3RyaW5nQ29uZGl0aW9ucywiaHRtbC1udW0iOmkubnVtQ29uZGl0aW9ucywiaHRtbC1udW0tZm10IjppLm51bUZtdENvbmRpdGlvbnMsbHV4b246aS5sdXhvbkRhdGVDb25kaXRpb25zLG1vbWVudDppLm1vbWVudERhdGVDb25kaXRpb25zLG51bTppLm51bUNvbmRpdGlvbnMsIm51bS1mbXQiOmkubnVtRm10Q29uZGl0aW9ucyxzdHJpbmc6aS5zdHJpbmdDb25kaXRpb25zfSxkZXB0aExpbWl0OiExLGVudGVyU2VhcmNoOiExLGZpbHRlckNoYW5nZWQ6dm9pZCAwLGdyZXlzY2FsZTohMSxsaXZlU2VhcmNoOiEwLGkxOG46e2FkZDoiQWRkIENvbmRpdGlvbiIsYnV0dG9uOnswOiJTZWFyY2ggQnVpbGRlciIsXzoiU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LGNsZWFyQWxsOiJDbGVhciBBbGwiLGNvbmRpdGlvbjoiQ29uZGl0aW9uIixkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxjfSgpLGIsZztmdW5jdGlvbiBtKGMpe2I9YyxnPWMuZm4uRGF0YVRhYmxlfXZhciBDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhsLGgpe3ZhciBfPXRoaXM7aWYoIWd8fCFnLnZlcnNpb25DaGVja3x8IWcudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hCdWlsZGVyIHJlcXVpcmVzIERhdGFUYWJsZXMgMiBvciBuZXdlciIpO3ZhciBGPW5ldyBnLkFwaShsKTtpZih0aGlzLmNsYXNzZXM9Yi5leHRlbmQoITAse30sYy5jbGFzc2VzKSx0aGlzLmM9Yi5leHRlbmQoITAse30sYy5kZWZhdWx0cyxoKSx0aGlzLmRvbT17Y2xlYXJBbGw6YignPGJ1dHRvbiB0eXBlPSJidXR0b24iPicrRi5pMThuKCJzZWFyY2hCdWlsZGVyLmNsZWFyQWxsIix0aGlzLmMuaTE4bi5jbGVhckFsbCkrIjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckFsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGNvbnRhaW5lcjpiKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSx0aXRsZTpiKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGUpLHRpdGxlUm93OmIoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50aXRsZVJvdyksdG9wR3JvdXA6dm9pZCAwfSx0aGlzLnM9e2R0OkYsb3B0czpoLHNlYXJjaDp2b2lkIDAsc2VydmVyRGF0YTp2b2lkIDAsdG9wR3JvdXA6dm9pZCAwfSxGLnNldHRpbmdzKClbMF0uX3NlYXJjaEJ1aWxkZXI9PT12b2lkIDApcmV0dXJuIEYuc2V0dGluZ3MoKVswXS5fc2VhcmNoQnVpbGRlcj10aGlzLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYodGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24oTyxmLFUpe3ZhciBYPV8ucy5kdC5zdGF0ZS5sb2FkZWQoKTtYJiZYLnNlYXJjaEJ1aWxkZXImJihVLnNlYXJjaEJ1aWxkZXI9Xy5fY29sbGFwc2VBcnJheShYLnNlYXJjaEJ1aWxkZXIpKX0pLHRoaXMucy5kdC5vbigieGhyLmR0c2IiLGZ1bmN0aW9uKE8sZixVKXtVJiZVLnNlYXJjaEJ1aWxkZXImJlUuc2VhcmNoQnVpbGRlci5vcHRpb25zJiYoXy5zLnNlcnZlckRhdGE9VS5zZWFyY2hCdWlsZGVyLm9wdGlvbnMpfSkpLHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLl9iSW5pdENvbXBsZXRlP3RoaXMuX3NldFVwKCk6Ri5vbmUoImluaXQuZHQiLGZ1bmN0aW9uKCl7Xy5fc2V0VXAoKX0pLHRoaXN9cmV0dXJuIGMucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obCl7cmV0dXJuIGw9PT12b2lkIDAmJihsPSExKSx0aGlzLnMudG9wR3JvdXAuZ2V0RGV0YWlscyhsKX0sYy5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGMucHJvdG90eXBlLnJlYnVpbGQ9ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZG9tLmNsZWFyQWxsLmNsaWNrKCksbD09bnVsbD90aGlzOih0aGlzLnMudG9wR3JvdXAucy5wcmV2ZW50UmVkcmF3PSEwLHRoaXMucy50b3BHcm91cC5yZWJ1aWxkKGwpLHRoaXMucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITEsdGhpcy5fY2hlY2tDbGVhcigpLHRoaXMuX3VwZGF0ZVRpdGxlKHRoaXMucy50b3BHcm91cC5jb3VudCgpKSx0aGlzLnMudG9wR3JvdXAucmVkcmF3Q29udGVudHMoKSx0aGlzLnMuZHQuZHJhdyghMSksdGhpcy5zLnRvcEdyb3VwLnNldExpc3RlbmVycygpLHRoaXMpfSxjLnByb3RvdHlwZS5fYXBwbHlQcmVEZWZEZWZhdWx0cz1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2wuY3JpdGVyaWEhPT12b2lkIDAmJmwubG9naWM9PT12b2lkIDAmJihsLmxvZ2ljPSJBTkQiKTtmb3IodmFyIF89ZnVuY3Rpb24oWCl7WC5jcml0ZXJpYSE9PXZvaWQgMD9YPUYuX2FwcGx5UHJlRGVmRGVmYXVsdHMoWCk6Ri5zLmR0LmNvbHVtbnMoKS5ldmVyeShmdW5jdGlvbihRKXtoLnMuZHQuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbUV0uc1RpdGxlPT09WC5kYXRhJiYoWC5kYXRhSWR4PVEpfSl9LEY9dGhpcyxPPTAsZj1sLmNyaXRlcmlhO088Zi5sZW5ndGg7TysrKXt2YXIgVT1mW09dO18oVSl9cmV0dXJuIGx9LGMucHJvdG90eXBlLl9zZXRVcD1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2lmKGw9PT12b2lkIDAmJihsPSEwKSx0eXBlb2YgdGhpcy5zLmR0LmNvbHVtbigpLnR5cGUhPSJmdW5jdGlvbiImJmF0LkFwaS5yZWdpc3RlclBsdXJhbCgiY29sdW1ucygpLnR5cGVzKCkiLCJjb2x1bW4oKS50eXBlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odyxrKXtyZXR1cm4gdy5hb0NvbHVtbnNba10uc1R5cGV9LDEpfSksIWcuRGF0ZVRpbWUpe3ZhciBfPXRoaXMucy5kdC5jb2x1bW5zKCkudHlwZXMoKS50b0FycmF5KCk7aWYoXz09PXZvaWQgMHx8Xy5pbmNsdWRlcyh2b2lkIDApfHxfLmluY2x1ZGVzKG51bGwpKXtfPVtdO2Zvcih2YXIgRj0wLE89dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zO0Y8Ty5sZW5ndGg7RisrKXt2YXIgZj1PW0ZdO18ucHVzaChmLnNlYXJjaEJ1aWxkZXJUeXBlIT09dm9pZCAwP2Yuc2VhcmNoQnVpbGRlclR5cGU6Zi5zVHlwZSl9fXZhciBVPXRoaXMucy5kdC5jb2x1bW5zKCkudG9BcnJheSgpOyhfPT09dm9pZCAwfHxfLmluY2x1ZGVzKHZvaWQgMCl8fF8uaW5jbHVkZXMobnVsbCkpJiYoYi5mbi5kYXRhVGFibGUuZXh0Lm9BcGkmJmIuZm4uZGF0YVRhYmxlLmV4dC5vQXBpLl9mbkNvbHVtblR5cGVzKHRoaXMucy5kdC5zZXR0aW5ncygpWzBdKSxfPXRoaXMucy5kdC5jb2x1bW5zKCkudHlwZXMoKS50b0FycmF5KCkpO2Zvcih2YXIgWD0wO1g8VVswXS5sZW5ndGg7WCsrKXt2YXIgUT1VWzBdW1hdLEU9X1tRXTtpZigodGhpcy5jLmNvbHVtbnM9PT0hMHx8QXJyYXkuaXNBcnJheSh0aGlzLmMuY29sdW1ucykmJnRoaXMuYy5jb2x1bW5zLmluY2x1ZGVzKFgpKSYmKEUuaW5jbHVkZXMoImRhdGUiKXx8RS5pbmNsdWRlcygibW9tZW50Iil8fEUuaW5jbHVkZXMoImx1eG9uIikpKXRocm93IGFsZXJ0KCJTZWFyY2hCdWlsZGVyIFJlcXVpcmVzIERhdGVUaW1lIHdoZW4gdXNlZCB3aXRoIGRhdGVzLiIpLG5ldyBFcnJvcigiU2VhcmNoQnVpbGRlciByZXF1aXJlcyBEYXRlVGltZSIpfX1pZih0aGlzLnMudG9wR3JvdXA9bmV3IHAodGhpcy5zLmR0LHRoaXMuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdGhpcy5zLnNlcnZlckRhdGEpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNiIixmdW5jdGlvbih3LGssUyl7Uy5zZWFyY2hCdWlsZGVyPWguZ2V0RGV0YWlscygpLFMuc2Nyb2xsZXI/Uy5zdGFydD1oLnMuZHQuc3RhdGUoKS5zdGFydDpTLnBhZ2U9aC5zLmR0LnBhZ2UoKX0pLHRoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c2IiLGZ1bmN0aW9uKHcsayxTKXtoLnJlYnVpbGQoUy5zZWFyY2hCdWlsZGVyKX0pLHRoaXMuX2J1aWxkKCksdGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24odyxrLFMpe2gucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYoUy5zZWFyY2hCdWlsZGVyPWguX2NvbGxhcHNlQXJyYXkoaC5nZXREZXRhaWxzKCEwKSkpfSksdGhpcy5zLmR0Lm9uKCJjb2x1bW5zLXJlb3JkZXJlZCIsZnVuY3Rpb24oKXtoLnJlYnVpbGQoaC5nZXREZXRhaWxzKCkpfSksbCl7dmFyICQ9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpOyQhPT1udWxsJiYkLnNlYXJjaEJ1aWxkZXIhPT12b2lkIDA/KHRoaXMucy50b3BHcm91cC5yZWJ1aWxkKCQuc2VhcmNoQnVpbGRlciksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHwoJC5wYWdlP3RoaXMucy5kdC5wYWdlKCQucGFnZSkuZHJhdygicGFnZSIpOnRoaXMucy5kdC5zY3JvbGxlciYmJC5zY3JvbGxlciYmdGhpcy5zLmR0LnNjcm9sbGVyKCkuc2Nyb2xsVG9Sb3coJC5zY3JvbGxlci50b3BSb3cpKSx0aGlzLnMudG9wR3JvdXAuc2V0TGlzdGVuZXJzKCkpOnRoaXMuYy5wcmVEZWZpbmVkIT09ITEmJih0aGlzLmMucHJlRGVmaW5lZD10aGlzLl9hcHBseVByZURlZkRlZmF1bHRzKHRoaXMuYy5wcmVEZWZpbmVkKSx0aGlzLnJlYnVpbGQodGhpcy5jLnByZURlZmluZWQpKX10aGlzLl9zZXRFbXB0eUxpc3RlbmVyKCksdGhpcy5zLmR0LnN0YXRlLnNhdmUoKX0sYy5wcm90b3R5cGUuX2NvbGxhcHNlQXJyYXk9ZnVuY3Rpb24obCl7aWYobC5sb2dpYz09PXZvaWQgMClsLnZhbHVlIT09dm9pZCAwJiYobC52YWx1ZS5zb3J0KGZ1bmN0aW9uKF8sRil7cmV0dXJuIGlzTmFOKCtfKXx8KF89K18sRj0rRiksXzxGPy0xOkY8Xz8xOjB9KSxsLnZhbHVlMT1sLnZhbHVlWzBdLGwudmFsdWUyPWwudmFsdWVbMV0pO2Vsc2UgZm9yKHZhciBoPTA7aDxsLmNyaXRlcmlhLmxlbmd0aDtoKyspbC5jcml0ZXJpYVtoXT10aGlzLl9jb2xsYXBzZUFycmF5KGwuY3JpdGVyaWFbaF0pO3JldHVybiBsfSxjLnByb3RvdHlwZS5fdXBkYXRlVGl0bGU9ZnVuY3Rpb24obCl7dGhpcy5kb20udGl0bGUuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci50aXRsZSIsdGhpcy5jLmkxOG4udGl0bGUsbCkpfSxjLnByb3RvdHlwZS5fYnVpbGQ9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZSgpLHRoaXMuZG9tLmNvbnRhaW5lci5lbXB0eSgpO3ZhciBoPXRoaXMucy50b3BHcm91cC5jb3VudCgpO3RoaXMuX3VwZGF0ZVRpdGxlKGgpLHRoaXMuZG9tLnRpdGxlUm93LmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS50aXRsZVJvdyksdGhpcy5kb20udG9wR3JvdXA9dGhpcy5zLnRvcEdyb3VwLmdldE5vZGUoKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLnRvcEdyb3VwKSx0aGlzLl9zZXRSZWRyYXdMaXN0ZW5lcigpO3ZhciBfPXRoaXMucy5kdC50YWJsZSgwKS5ub2RlKCk7Yi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5pbmNsdWRlcyh0aGlzLnMuc2VhcmNoKXx8KHRoaXMucy5zZWFyY2g9ZnVuY3Rpb24oRixPLGYpe3JldHVybiBGLm5UYWJsZSE9PV8/ITA6bC5zLnRvcEdyb3VwLnNlYXJjaChPLGYpfSxiLmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaCkpLHRoaXMucy5kdC5vbigiZGVzdHJveS5kdHNiIixmdW5jdGlvbigpe2wuZG9tLmNvbnRhaW5lci5yZW1vdmUoKSxsLmRvbS5jbGVhckFsbC5yZW1vdmUoKTtmb3IodmFyIEY9Yi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5pbmRleE9mKGwucy5zZWFyY2gpO0YhPT0tMTspYi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5zcGxpY2UoRiwxKSxGPWIuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZihsLnMuc2VhcmNoKTtsLnMuZHQub2ZmKCIuZHRzYiIpLGIobC5zLmR0LnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNiIil9KX0sYy5wcm90b3R5cGUuX2NoZWNrQ2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnMudG9wR3JvdXAucy5jcml0ZXJpYS5sZW5ndGg+MD8odGhpcy5kb20uY2xlYXJBbGwuaW5zZXJ0QWZ0ZXIodGhpcy5kb20udGl0bGUpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSk6dGhpcy5kb20uY2xlYXJBbGwucmVtb3ZlKCl9LGMucHJvdG90eXBlLl9maWx0ZXJDaGFuZ2VkPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMuYy5maWx0ZXJDaGFuZ2VkO3R5cGVvZiBoPT0iZnVuY3Rpb24iJiZoKGwsdGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuYnV0dG9uIix0aGlzLmMuaTE4bi5idXR0b24sbCkpfSxjLnByb3RvdHlwZS5fc2V0Q2xlYXJMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBsPXRoaXM7dGhpcy5kb20uY2xlYXJBbGwudW5iaW5kKCJjbGljayIpLHRoaXMuZG9tLmNsZWFyQWxsLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3JldHVybiBsLnMudG9wR3JvdXA9bmV3IHAobC5zLmR0LGwuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbC5zLnNlcnZlckRhdGEpLGwuX2J1aWxkKCksbC5zLmR0LmRyYXcoKSxsLnMudG9wR3JvdXAuc2V0TGlzdGVuZXJzKCksbC5kb20uY2xlYXJBbGwucmVtb3ZlKCksbC5fc2V0RW1wdHlMaXN0ZW5lcigpLGwuX2ZpbHRlckNoYW5nZWQoMCksITF9KX0sYy5wcm90b3R5cGUuX3NldFJlZHJhd0xpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItcmVkcmF3Q29udGVudHMiKSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1yZWRyYXdDb250ZW50cy5kdHNiIixmdW5jdGlvbigpe2wuX2NoZWNrQ2xlYXIoKSxsLnMudG9wR3JvdXAucmVkcmF3Q29udGVudHMoKSxsLnMudG9wR3JvdXAuc2V0dXBMb2dpYygpLGwuX3NldEVtcHR5TGlzdGVuZXIoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpLGwucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHxsLnMuZHQuZHJhdygpLGwucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItcmVkcmF3Q29udGVudHMtbm9EcmF3IiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3Q29udGVudHMtbm9EcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5fY2hlY2tDbGVhcigpLGwucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITAsbC5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCksbC5zLnRvcEdyb3VwLnMucHJldmVudFJlZHJhdz0hMSxsLnMudG9wR3JvdXAuc2V0dXBMb2dpYygpLGwuX3NldEVtcHR5TGlzdGVuZXIoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLXJlZHJhd0xvZ2ljIiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3TG9naWMuZHRzYiIsZnVuY3Rpb24oKXtsLnMudG9wR3JvdXAucmVkcmF3TG9naWMoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWFkZCIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLWFkZC5kdHNiIixmdW5jdGlvbigpe3ZhciBoPWwucy50b3BHcm91cC5jb3VudCgpO2wuX3VwZGF0ZVRpdGxlKGgpLGwuX2ZpbHRlckNoYW5nZWQoaCksbC5fY2hlY2tDbGVhcigpfSksdGhpcy5zLmR0Lm9uKCJwb3N0RWRpdC5kdHNiIHBvc3RDcmVhdGUuZHRzYiBwb3N0UmVtb3ZlLmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItY2xlYXJDb250ZW50cyIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLWNsZWFyQ29udGVudHMuZHRzYiIsZnVuY3Rpb24oKXtsLl9zZXRVcCghMSksbC5fZmlsdGVyQ2hhbmdlZCgwKSxsLnMuZHQuZHJhdygpfSl9LGMucHJvdG90eXBlLl9zZXRFbXB0eUxpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLnMudG9wR3JvdXAuZG9tLmFkZC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLl9jaGVja0NsZWFyKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1kZXN0cm95LmR0c2IiLGZ1bmN0aW9uKCl7bC5kb20uY2xlYXJBbGwucmVtb3ZlKCl9KX0sYy52ZXJzaW9uPSIxLjguMCIsYy5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixjbGVhckFsbDoiZHRzYi1jbGVhckFsbCIsY29udGFpbmVyOiJkdHNiLXNlYXJjaEJ1aWxkZXIiLGlucHV0QnV0dG9uOiJkdHNiLWlwdGJ0biIsdGl0bGU6ImR0c2ItdGl0bGUiLHRpdGxlUm93OiJkdHNiLXRpdGxlUm93In0sYy5kZWZhdWx0cz17Y29sdW1uczohMCxjb25kaXRpb25zOntkYXRlOmkuZGF0ZUNvbmRpdGlvbnMsaHRtbDppLnN0cmluZ0NvbmRpdGlvbnMsImh0bWwtbnVtIjppLm51bUNvbmRpdGlvbnMsImh0bWwtbnVtLWZtdCI6aS5udW1GbXRDb25kaXRpb25zLGx1eG9uOmkubHV4b25EYXRlQ29uZGl0aW9ucyxtb21lbnQ6aS5tb21lbnREYXRlQ29uZGl0aW9ucyxudW06aS5udW1Db25kaXRpb25zLCJudW0tZm10IjppLm51bUZtdENvbmRpdGlvbnMsc3RyaW5nOmkuc3RyaW5nQ29uZGl0aW9uc30sZGVwdGhMaW1pdDohMSxlbnRlclNlYXJjaDohMSxmaWx0ZXJDaGFuZ2VkOnZvaWQgMCxncmV5c2NhbGU6ITEsbGl2ZVNlYXJjaDohMCxpMThuOnthZGQ6IkFkZCBDb25kaXRpb24iLGJ1dHRvbjp7MDoiU2VhcmNoIEJ1aWxkZXIiLF86IlNlYXJjaCBCdWlsZGVyICglZCkifSxjbGVhckFsbDoiQ2xlYXIgQWxsIixjb25kaXRpb246IkNvbmRpdGlvbiIsY29uZGl0aW9uczp7YXJyYXk6e2NvbnRhaW5zOiJDb250YWlucyIsZW1wdHk6IkVtcHR5IixlcXVhbHM6IkVxdWFscyIsbm90OiJOb3QiLG5vdEVtcHR5OiJOb3QgRW1wdHkiLHdpdGhvdXQ6IldpdGhvdXQifSxkYXRlOnthZnRlcjoiQWZ0ZXIiLGJlZm9yZToiQmVmb3JlIixiZXR3ZWVuOiJCZXR3ZWVuIixlbXB0eToiRW1wdHkiLGVxdWFsczoiRXF1YWxzIixub3Q6Ik5vdCIsbm90QmV0d2VlbjoiTm90IEJldHdlZW4iLG5vdEVtcHR5OiJOb3QgRW1wdHkifSxudW1iZXI6e2JldHdlZW46IkJldHdlZW4iLGVtcHR5OiJFbXB0eSIsZXF1YWxzOiJFcXVhbHMiLGd0OiJHcmVhdGVyIFRoYW4iLGd0ZToiR3JlYXRlciBUaGFuIEVxdWFsIFRvIixsdDoiTGVzcyBUaGFuIixsdGU6Ikxlc3MgVGhhbiBFcXVhbCBUbyIsbm90OiJOb3QiLG5vdEJldHdlZW46Ik5vdCBCZXR3ZWVuIixub3RFbXB0eToiTm90IEVtcHR5In0sc3RyaW5nOntjb250YWluczoiQ29udGFpbnMiLGVtcHR5OiJFbXB0eSIsZW5kc1dpdGg6IkVuZHMgV2l0aCIsZXF1YWxzOiJFcXVhbHMiLG5vdDoiTm90Iixub3RDb250YWluczoiRG9lcyBOb3QgQ29udGFpbiIsbm90RW1wdHk6Ik5vdCBFbXB0eSIsbm90RW5kc1dpdGg6IkRvZXMgTm90IEVuZCBXaXRoIixub3RTdGFydHNXaXRoOiJEb2VzIE5vdCBTdGFydCBXaXRoIixzdGFydHNXaXRoOiJTdGFydHMgV2l0aCJ9fSxkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxjfSgpO20oY24pLHUoY24pLHMoY24pO3ZhciB5PWNuLmZuLmRhdGFUYWJsZTthdC5TZWFyY2hCdWlsZGVyPUMseS5TZWFyY2hCdWlsZGVyPUMsYXQuR3JvdXA9cCx5Lkdyb3VwPXAsYXQuQ3JpdGVyaWE9aSx5LkNyaXRlcmlhPWk7dmFyIFQ9YXQuQXBpLnJlZ2lzdGVyO2F0LmV4dC5zZWFyY2hCdWlsZGVyPXtjb25kaXRpb25zOnt9fSxhdC5leHQuYnV0dG9ucy5zZWFyY2hCdWlsZGVyPXthY3Rpb246ZnVuY3Rpb24oYyxsLGgsXyl7dGhpcy5wb3BvdmVyKF8uX3NlYXJjaEJ1aWxkZXIuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSk7dmFyIEY9Xy5fc2VhcmNoQnVpbGRlci5zLnRvcEdyb3VwO0YhPT12b2lkIDAmJkYuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzLW5vRHJhdyIpLEYucy5jcml0ZXJpYS5sZW5ndGg9PT0wJiZjbigiLiIrY24uZm4uZGF0YVRhYmxlLkdyb3VwLmNsYXNzZXMuYWRkLnJlcGxhY2UoLyAvZywiLiIpKS5jbGljaygpfSxjb25maWc6e30saW5pdDpmdW5jdGlvbihjLGwsaCl7dmFyIF89bmV3IGF0LlNlYXJjaEJ1aWxkZXIoYyxjbi5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oRixPKXtjLmJ1dHRvbihsKS50ZXh0KE8pfX0saC5jb25maWcpKTtjLmJ1dHRvbihsKS50ZXh0KGgudGV4dHx8Yy5pMThuKCJzZWFyY2hCdWlsZGVyLmJ1dHRvbiIsXy5jLmkxOG4uYnV0dG9uLDApKSxoLl9zZWFyY2hCdWlsZGVyPV99LHRleHQ6bnVsbH0sVCgic2VhcmNoQnVpbGRlci5nZXREZXRhaWxzKCkiLGZ1bmN0aW9uKGMpe2M9PT12b2lkIDAmJihjPSExKTt2YXIgbD10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwuX3NlYXJjaEJ1aWxkZXI/bC5fc2VhcmNoQnVpbGRlci5nZXREZXRhaWxzKGMpOm51bGx9KSxUKCJzZWFyY2hCdWlsZGVyLnJlYnVpbGQoKSIsZnVuY3Rpb24oYyl7dmFyIGw9dGhpcy5jb250ZXh0WzBdO3JldHVybiBsLl9zZWFyY2hCdWlsZGVyPT09dm9pZCAwP251bGw6KGwuX3NlYXJjaEJ1aWxkZXIucmVidWlsZChjKSx0aGlzKX0pLFQoInNlYXJjaEJ1aWxkZXIuY29udGFpbmVyKCkiLGZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5jb250ZXh0WzBdO3JldHVybiBjLl9zZWFyY2hCdWlsZGVyP2MuX3NlYXJjaEJ1aWxkZXIuZ2V0Tm9kZSgpOm51bGx9KTtmdW5jdGlvbiBQKGMsbCl7dmFyIGg9bmV3IGF0LkFwaShjKSxfPWx8fGguaW5pdCgpLnNlYXJjaEJ1aWxkZXJ8fGF0LmRlZmF1bHRzLnNlYXJjaEJ1aWxkZXIsRj1uZXcgQyhoLF8pLE89Ri5nZXROb2RlKCk7cmV0dXJuIE99Y24oZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0c3AiLGZ1bmN0aW9uKGMsbCl7Yy5uYW1lc3BhY2U9PT0iZHQiJiYobC5vSW5pdC5zZWFyY2hCdWlsZGVyfHxhdC5kZWZhdWx0cy5zZWFyY2hCdWlsZGVyKSYmKGwuX3NlYXJjaEJ1aWxkZXJ8fFAobCkpfSksYXQuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlEiLGZuSW5pdDpQfSksYXQuZmVhdHVyZSYmYXQuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoQnVpbGRlciIsUCl9KSgpO3ZhciBzZD1pZShhZSgpLDEpO3ZhciBacz1pZShhZSgpLDEpO3ZhciBaZT1acy5kZWZhdWx0OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgdCxlO2Z1bmN0aW9uIG4odyl7dD13LGU9dy5mbi5kYXRhVGFibGV9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB3KGssUyxCLEwsUil7dmFyIHE9dGhpcztpZihSPT09dm9pZCAwJiYoUj1udWxsKSwhZXx8IWUudmVyc2lvbkNoZWNrfHwhZS52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighZS5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciB6PW5ldyBlLkFwaShrKTt0aGlzLmNsYXNzZXM9dC5leHRlbmQoITAse30sdy5jbGFzc2VzKSx0aGlzLmM9dC5leHRlbmQoITAse30sdy5kZWZhdWx0cyxTLFIpLFMmJlMuaGlkZUNvdW50JiZTLnZpZXdDb3VudD09PXZvaWQgMCYmKHRoaXMuYy52aWV3Q291bnQ9IXRoaXMuYy5oaWRlQ291bnQpO3ZhciBHPXouY29sdW1ucygpLmVxKDApLnRvQXJyYXkoKS5sZW5ndGg7dGhpcy5zPXtjb2xFeGlzdHM6QjxHLGNvbE9wdHM6dm9pZCAwLGN1c3RvbVBhbmVTZXR0aW5nczpSLGRpc3BsYXllZDohMSxkdDp6LGR0UGFuZTp2b2lkIDAsZmlyc3RTZXQ6ITAsaW5kZXg6QixpbmRleGVzOltdLGxpc3RTZXQ6ITEsbmFtZTp2b2lkIDAscm93RGF0YTp7YXJyYXlGaWx0ZXI6W10sYXJyYXlPcmlnaW5hbDpbXSxiaW5zOnt9LGJpbnNPcmlnaW5hbDp7fSxmaWx0ZXJNYXA6bmV3IE1hcCx0b3RhbE9wdGlvbnM6MH0sc2Nyb2xsVG9wOjAsc2VhcmNoRnVuY3Rpb246dm9pZCAwLHNlbGVjdGlvbnM6W10sc2VydmVyU2VsZWN0OltdLHNlcnZlclNlbGVjdGluZzohMSx0YWJsZUxlbmd0aDpudWxsLHVwZGF0aW5nOiExfSx0aGlzLnMuY29sT3B0cz10aGlzLnMuY29sRXhpc3RzP3RoaXMuX2dldE9wdGlvbnMoKTp0aGlzLl9nZXRCb251c09wdGlvbnMoKSx0aGlzLmRvbT17YnV0dG9uR3JvdXA6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbkdyb3VwKSxjbGVhcjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+JiMyMTU7PC9idXR0b24+JykuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNsZWFyQnV0dG9uKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jbGVhclBhbmUiLHRoaXMuYy5pMThuLmNsZWFyUGFuZSkpLGNvbGxhcHNlQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3BhbiBjbGFzcz0iJyt0aGlzLmNsYXNzZXMuY2FyZXQrJyI+JiN4NWU7PC9zcGFuPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29sbGFwc2VCdXR0b24pLGNvbnRhaW5lcjp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKS5hZGRDbGFzcyh0aGlzLnMuY29sT3B0cy5jbGFzc05hbWUpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sYXlvdXQrKHBhcnNlSW50KHRoaXMuYy5sYXlvdXQuc3BsaXQoIi0iKVsxXSwxMCk8MTA/dGhpcy5jLmxheW91dDp0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMF0rIi05IikpLmFkZENsYXNzKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lOiIiKSxjb3VudEJ1dHRvbjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY291bnRCdXR0b24pLGR0UDp0KCc8dGFibGUgd2lkdGg9IjEwMCUiPjx0aGVhZD48dHI+PHRoPjwvdGg+PHRoPjwvdGg+PC90cj48L3RoZWFkPjwvdGFibGU+JyksbG93ZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnN1YlJvdzIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dCdXR0b24pLG5hbWVCdXR0b246dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hbWVCdXR0b24pLHBhbmVzQ29udGFpbmVyOnQoTCksc2VhcmNoQm94OnQoIjxpbnB1dC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVJbnB1dEJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaCksc2VhcmNoQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3Bhbj48L3NwYW4+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaEljb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKSxzZWFyY2hDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWFyY2hDb250KSxzZWFyY2hMYWJlbENvbnQ6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaExhYmVsQ29udCksdG9wUm93OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50b3BSb3cpLHVwcGVyOnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zdWJSb3cxKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U2VhcmNoKX07dmFyIG50PSIiO3RoaXMucy5jb2xFeGlzdHM/KG50PXQodGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLmhlYWRlcigpKS50ZXh0KCksdGhpcy5kb20uZHRQLmZpbmQoInRoIikuZXEoMCkudGV4dChudCkpOihudD10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmhlYWRlcnx8IkN1c3RvbSBQYW5lIix0aGlzLmRvbS5kdFAuZmluZCgidGgiKS5lcSgwKS5odG1sKG50KSksdGhpcy5zLmNvbE9wdHMubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY29sT3B0cy5uYW1lOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm5hbWU6dGhpcy5zLm5hbWU9bnQ7dmFyIHR0PXRoaXMucy5kdC50YWJsZSgwKS5ub2RlKCk7cmV0dXJuIHRoaXMucy5zZWFyY2hGdW5jdGlvbj1mdW5jdGlvbihldCx3dCxTdCl7aWYocS5zLnNlbGVjdGlvbnMubGVuZ3RoPT09MHx8ZXQublRhYmxlIT09dHQpcmV0dXJuITA7dmFyIFR0PW51bGw7cmV0dXJuIHEucy5jb2xFeGlzdHMmJihUdD13dFtxLnMuaW5kZXhdLHEucy5jb2xPcHRzLm9ydGhvZ29uYWwuZmlsdGVyIT09ImZpbHRlciImJihUdD1xLnMucm93RGF0YS5maWx0ZXJNYXAuZ2V0KFN0KSxUdCBpbnN0YW5jZW9mIHQuZm4uZGF0YVRhYmxlLkFwaSYmKFR0PVR0LnRvQXJyYXkoKSkpKSxxLl9zZWFyY2goVHQsU3QpfSx0LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaEZ1bmN0aW9uKSx0aGlzLmMuY2xlYXImJnRoaXMuZG9tLmNsZWFyLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBldD1xLmRvbS5jb250YWluZXIuZmluZCgiLiIrcS5jbGFzc2VzLnNlYXJjaC5yZXBsYWNlKC9ccysvZywiLiIpKTtldC5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS52YWwoIiIpLnRyaWdnZXIoImlucHV0Iil9KSxxLmNsZWFyUGFuZSgpfSksdGhpcy5zLmR0Lm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImJ1dHRvbnMtYWN0aW9uLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImNvbHVtbi1yZW9yZGVyLmR0c3AiLGZ1bmN0aW9uKGV0LHd0LFN0KXtxLnMuaW5kZXg9U3QubWFwcGluZ1txLnMuaW5kZXhdfSksdGhpc31yZXR1cm4gdy5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKGssUyxCLEwsUixxLHope3F8fChxPXRoaXMucy5yb3dEYXRhLmJpbnNbU10/dGhpcy5zLnJvd0RhdGEuYmluc1tTXTowKSx6fHwoej10aGlzLl9nZXRTaG93bihTKSk7Zm9yKHZhciBHLG50PTAsdHQ9dGhpcy5zLmluZGV4ZXM7bnQ8dHQubGVuZ3RoO250Kyspe3ZhciBldD10dFtudF07ZXQuZmlsdGVyPT09UyYmKEc9ZXQuaW5kZXgpfXJldHVybiBHPT09dm9pZCAwJiYoRz10aGlzLnMuaW5kZXhlcy5sZW5ndGgsdGhpcy5zLmluZGV4ZXMucHVzaCh7ZmlsdGVyOlMsaW5kZXg6R30pKSx0aGlzLnMuZHRQYW5lLnJvdy5hZGQoe2NsYXNzTmFtZTpSLGRpc3BsYXk6ayE9PSIiP2s6dGhpcy5lbXB0eU1lc3NhZ2UoKSxmaWx0ZXI6UyxpbmRleDpHLHNob3duOnosc29ydDpCLHRvdGFsOnEsdHlwZTpMfSl9LHcucHJvdG90eXBlLmFkanVzdFRvcFJvdz1mdW5jdGlvbigpe3ZhciBrPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93c0NvbnRhaW5lci5yZXBsYWNlKC9ccysvZywiLiIpKSxTPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93MS5yZXBsYWNlKC9ccysvZywiLiIpKSxCPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93Mi5yZXBsYWNlKC9ccysvZywiLiIpKSxMPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMudG9wUm93LnJlcGxhY2UoL1xzKy9nLCIuIikpOyh0KGtbMF0pLndpZHRoKCk8MjUyfHx0KExbMF0pLndpZHRoKCk8MjUyKSYmdChrWzBdKS53aWR0aCgpIT09MD8odChrWzBdKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93KSx0KFNbMF0pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTdWIpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTZWFyY2gpLHQoQlswXSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd0J1dHRvbikpOih0KGtbMF0pLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3cpLHQoU1swXSkucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1NlYXJjaCksdChCWzBdKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U3ViKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93QnV0dG9uKSl9LHcucHJvdG90eXBlLmNsZWFyRGF0YT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhPXthcnJheUZpbHRlcjpbXSxhcnJheU9yaWdpbmFsOltdLGJpbnM6e30sYmluc09yaWdpbmFsOnt9LGZpbHRlck1hcDpuZXcgTWFwLHRvdGFsT3B0aW9uczowfX0sdy5wcm90b3R5cGUuY2xlYXJQYW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kZXNlbGVjdCgpLHRoaXMudXBkYXRlVGFibGUoKSx0aGlzfSx3LnByb3RvdHlwZS5jb2xsYXBzZT1mdW5jdGlvbigpe3ZhciBrPXRoaXM7IXRoaXMucy5kaXNwbGF5ZWR8fCF0aGlzLmMuY29sbGFwc2UmJnRoaXMucy5jb2xPcHRzLmNvbGxhcHNlIT09ITB8fHRoaXMucy5jb2xPcHRzLmNvbGxhcHNlPT09ITF8fCh0KHRoaXMucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGRlbiksdGhpcy5kb20udG9wUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3JkZXJlZCksdGhpcy5kb20ubmFtZUJ1dHRvbi5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLHRoaXMuZG9tLmNvdW50QnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uc2VhcmNoQnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnJvdGF0ZWQpLHRoaXMuZG9tLnRvcFJvdy5vbmUoImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc2hvdygpfSksdGhpcy5kb20udG9wUm93LnRyaWdnZXIoImNvbGxhcHNlLmR0c3BzIikpfSx3LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5zLmR0UGFuZSYmdGhpcy5zLmR0UGFuZS5vZmYoIi5kdHNwIiksdGhpcy5zLmR0Lm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jbGVhci5vZmYoIi5kdHNwIiksdGhpcy5kb20ubmFtZUJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCIuZHRzcCIpLHRoaXMuZG9tLnNlYXJjaEJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24ub2ZmKCIuZHRzcCIpLHQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNwIiksdGhpcy5kb20uY29udGFpbmVyLmRldGFjaCgpO2Zvcih2YXIgaz10LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2YodGhpcy5zLnNlYXJjaEZ1bmN0aW9uKTtrIT09LTE7KXQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guc3BsaWNlKGssMSksaz10LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2YodGhpcy5zLnNlYXJjaEZ1bmN0aW9uKTt0aGlzLnMuZHRQYW5lJiZ0aGlzLnMuZHRQYW5lLmRlc3Ryb3koKSx0aGlzLnMubGlzdFNldD0hMX0sdy5wcm90b3R5cGUuZW1wdHlNZXNzYWdlPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5jLmkxOG4uZW1wdHlNZXNzYWdlO3JldHVybiB0aGlzLmMuZW1wdHlNZXNzYWdlJiYoaz10aGlzLmMuZW1wdHlNZXNzYWdlKSx0aGlzLnMuY29sT3B0cy5lbXB0eU1lc3NhZ2UhPT0hMSYmdGhpcy5zLmNvbE9wdHMuZW1wdHlNZXNzYWdlIT09bnVsbCYmKGs9dGhpcy5zLmNvbE9wdHMuZW1wdHlNZXNzYWdlKSx0aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuZW1wdHlNZXNzYWdlIixrKX0sdy5wcm90b3R5cGUuZ2V0UGFuZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdFBhbmU/dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoOjB9LHcucHJvdG90eXBlLnJlYnVpbGRQYW5lPWZ1bmN0aW9uKGssUyl7az09PXZvaWQgMCYmKGs9bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpLHRoaXMuY2xlYXJEYXRhKCk7dmFyIEI9W107dGhpcy5zLnNlcnZlclNlbGVjdD1bXTt2YXIgTD1udWxsO3JldHVybiB0aGlzLnMuZHRQYW5lJiYoUyYmKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCk6Qj10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSksdGhpcy5zLmR0UGFuZS5jbGVhcigpLmRlc3Ryb3koKSxMPXRoaXMuZG9tLmNvbnRhaW5lci5wcmV2KCksdGhpcy5kZXN0cm95KCksdGhpcy5zLmR0UGFuZT12b2lkIDAsdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5wdXNoKHRoaXMucy5zZWFyY2hGdW5jdGlvbikpLHRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExLHRoaXMuX2J1aWxkUGFuZSh0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZT90aGlzLnMuc2VydmVyU2VsZWN0OkIsayxMKSx0aGlzfSx3LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oayl7dGhpcy5jLmxheW91dD1rLHRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcygpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zaG93KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKS5hZGRDbGFzcyh0aGlzLnMuY29sT3B0cy5jbGFzc05hbWUpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sYXlvdXQrKHBhcnNlSW50KGsuc3BsaXQoIi0iKVsxXSwxMCk8MTA/azprLnNwbGl0KCItIilbMF0rIi05IikpLmFkZENsYXNzKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MhPT1udWxsJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZT90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZToiIiksdGhpcy5hZGp1c3RUb3BSb3coKX0sdy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGs9dGhpczt0aGlzLnMuZHRQYW5lJiYodGhpcy5zLmR0UGFuZS5vZmYoInNlbGVjdC5kdHNwIikub24oInNlbGVjdC5kdHNwIixmdW5jdGlvbigpe2NsZWFyVGltZW91dChrLnMuZGVzZWxlY3RUaW1lb3V0KSxrLl91cGRhdGVTZWxlY3Rpb24oIWsucy51cGRhdGluZyksay5kb20uY2xlYXIucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfSksdGhpcy5zLmR0UGFuZS5vZmYoImRlc2VsZWN0LmR0c3AiKS5vbigiZGVzZWxlY3QuZHRzcCIsZnVuY3Rpb24oKXtrLnMuZGVzZWxlY3RUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtrLl91cGRhdGVTZWxlY3Rpb24oITApLGsucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpLmxlbmd0aD09PTAmJmsuZG9tLmNsZWFyLmFkZENsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIil9LDUwKX0pLHRoaXMucy5maXJzdFNldCYmKHRoaXMucy5maXJzdFNldD0hMSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNwIixmdW5jdGlvbihTLEIsTCl7aWYodC5pc0VtcHR5T2JqZWN0KEwpKXtrLnMuZHRQYW5lLnN0YXRlLmNsZWFyKCk7cmV0dXJufXZhciBSLHEsej1bXSxHLG50LHR0O2sucy5kdFBhbmUmJih6PWsucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkubWFwKGZ1bmN0aW9uKHd0KXtyZXR1cm4gd3QuZmlsdGVyIT09bnVsbD93dC5maWx0ZXIudG9TdHJpbmcoKTpudWxsfSkudG9BcnJheSgpLG50PWsuZG9tLnNlYXJjaEJveC52YWwoKSxxPWsucy5kdFBhbmUub3JkZXIoKSxSPWsucy5yb3dEYXRhLmJpbnNPcmlnaW5hbCx0dD1rLnMucm93RGF0YS5hcnJheU9yaWdpbmFsLEc9ay5kb20uY29sbGFwc2VCdXR0b24uaGFzQ2xhc3Moay5jbGFzc2VzLnJvdGF0ZWQpKSxMLnNlYXJjaFBhbmVzPT09dm9pZCAwJiYoTC5zZWFyY2hQYW5lcz17fSksTC5zZWFyY2hQYW5lcy5wYW5lcz09PXZvaWQgMCYmKEwuc2VhcmNoUGFuZXMucGFuZXM9W10pO2Zvcih2YXIgZXQ9MDtldDxMLnNlYXJjaFBhbmVzLnBhbmVzLmxlbmd0aDtldCsrKUwuc2VhcmNoUGFuZXMucGFuZXNbZXRdLmlkPT09ay5zLmluZGV4JiYoTC5zZWFyY2hQYW5lcy5wYW5lcy5zcGxpY2UoZXQsMSksZXQtLSk7TC5zZWFyY2hQYW5lcy5wYW5lcy5wdXNoKHthcnJheUZpbHRlcjp0dCxiaW5zOlIsY29sbGFwc2VkOkcsaWQ6ay5zLmluZGV4LG9yZGVyOnEsc2VhcmNoVGVybTpudCxzZWxlY3RlZDp6fSl9KSksdGhpcy5zLmR0UGFuZS5vZmYoInVzZXItc2VsZWN0LmR0c3AiKS5vbigidXNlci1zZWxlY3QuZHRzcCIsZnVuY3Rpb24oUyxCLEwsUixxKXtxLnN0b3BQcm9wYWdhdGlvbigpfSksdGhpcy5zLmR0UGFuZS5vZmYoImRyYXcuZHRzcCIpLm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuYWRqdXN0VG9wUm93KCl9KSx0aGlzLmRvbS5uYW1lQnV0dG9uLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsucy5kdFBhbmUub3JkZXIoKVswXVsxXTtrLnMuZHRQYW5lLm9yZGVyKFtbMCxTPT09ImFzYyI/ImRlc2MiOiJhc2MiXV0pLmRyYXcoKSxrLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIFM9ay5zLmR0UGFuZS5vcmRlcigpWzBdWzFdO2sucy5kdFBhbmUub3JkZXIoW1sxLFM9PT0iYXNjIj8iZGVzYyI6ImFzYyJdXSkuZHJhdygpLGsucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5vZmYoImNsaWNrLmR0c3AiKS5vbigiY2xpY2suZHRzcCIsZnVuY3Rpb24oUyl7Uy5zdG9wUHJvcGFnYXRpb24oKTt2YXIgQj10KGsucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSk7Qi50b2dnbGVDbGFzcyhrLmNsYXNzZXMuaGlkZGVuKSxrLmRvbS50b3BSb3cudG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmJvcmRlcmVkKSxrLmRvbS5uYW1lQnV0dG9uLnRvZ2dsZUNsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksay5kb20uY291bnRCdXR0b24udG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSxrLmRvbS5zZWFyY2hCdXR0b24udG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSxrLmRvbS5jb2xsYXBzZUJ1dHRvbi50b2dnbGVDbGFzcyhrLmNsYXNzZXMucm90YXRlZCksQi5oYXNDbGFzcyhrLmNsYXNzZXMuaGlkZGVuKT9rLmRvbS50b3BSb3cub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuZG9tLmNvbGxhcHNlQnV0dG9uLmNsaWNrKCl9KTprLmRvbS50b3BSb3cub2ZmKCJjbGljay5kdHNwIiksay5zLmR0LnN0YXRlLnNhdmUoKSxrLmRvbS50b3BSb3cudHJpZ2dlcigiY29sbGFwc2UuZHRzcHMiKX0pLHRoaXMuZG9tLmNsZWFyLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsuZG9tLmNvbnRhaW5lci5maW5kKCIuIitrLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoLyAvZywiLiIpKTtTLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLnZhbCgiIikudHJpZ2dlcigiaW5wdXQiKX0pLGsuY2xlYXJQYW5lKCl9KSx0aGlzLmRvbS5zZWFyY2hCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuZG9tLnNlYXJjaEJveC5mb2N1cygpfSksdGhpcy5kb20uc2VhcmNoQm94Lm9mZigiY2xpY2suZHRzcCIpLm9uKCJpbnB1dC5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsuZG9tLnNlYXJjaEJveC52YWwoKTtrLnMuZHRQYW5lLnNlYXJjaChTKS5kcmF3KCksdHlwZW9mIFM9PSJzdHJpbmciJiYoUy5sZW5ndGg+MHx8Uy5sZW5ndGg9PT0wJiZrLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg+MCk/ay5kb20uY2xlYXIucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOmsuZG9tLmNsZWFyLmFkZENsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksay5zLmR0LnN0YXRlLnNhdmUoKX0pLHRoaXMucy5kdFBhbmUuc2VsZWN0LnN0eWxlKHRoaXMucy5jb2xPcHRzLmR0T3B0cyYmdGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdCYmdGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdC5zdHlsZT90aGlzLnMuY29sT3B0cy5kdE9wdHMuc2VsZWN0LnN0eWxlOnRoaXMuYy5kdE9wdHMmJnRoaXMuYy5kdE9wdHMuc2VsZWN0JiZ0aGlzLmMuZHRPcHRzLnNlbGVjdC5zdHlsZT90aGlzLmMuZHRPcHRzLnNlbGVjdC5zdHlsZToib3MiKSl9LHcucHJvdG90eXBlLl9zZXJ2ZXJQb3B1bGF0ZT1mdW5jdGlvbihrKXtrLnRhYmxlTGVuZ3RoPyh0aGlzLnMudGFibGVMZW5ndGg9ay50YWJsZUxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKToodGhpcy5zLnRhYmxlTGVuZ3RoPT09bnVsbHx8dGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGg+dGhpcy5zLnRhYmxlTGVuZ3RoKSYmKHRoaXMucy50YWJsZUxlbmd0aD10aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKTt2YXIgUz10aGlzLnMuZHQuY29sdW1uKHRoaXMucy5pbmRleCkuZGF0YVNyYygpO2lmKGsuc2VhcmNoUGFuZXMub3B0aW9uc1tTXSlmb3IodmFyIEI9MCxMPWsuc2VhcmNoUGFuZXMub3B0aW9uc1tTXTtCPEwubGVuZ3RoO0IrKyl7dmFyIFI9TFtCXTt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5wdXNoKHtkaXNwbGF5OlIubGFiZWwsZmlsdGVyOlIudmFsdWUsc29ydDpSLmxhYmVsLHR5cGU6Ui5sYWJlbH0pLHRoaXMucy5yb3dEYXRhLmJpbnNbUi52YWx1ZV09Ui50b3RhbH12YXIgcT1PYmplY3Qua2V5cyh0aGlzLnMucm93RGF0YS5iaW5zKS5sZW5ndGgsej10aGlzLl91bmlxdWVSYXRpbyhxLHRoaXMucy50YWJsZUxlbmd0aCk7aWYodGhpcy5zLmRpc3BsYXllZD09PSExJiYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZD09PW51bGw/ej50aGlzLmMudGhyZXNob2xkOno+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZxPD0xKSl7dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITE7cmV0dXJufXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsdGhpcy5zLnJvd0RhdGEuYmluc09yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmJpbnMsdGhpcy5zLmRpc3BsYXllZD0hMH0sdy5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMucy5kaXNwbGF5ZWQmJih0aGlzLmRvbS50b3BSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmJvcmRlcmVkKSx0aGlzLmRvbS5uYW1lQnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY291bnRCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5zZWFyY2hCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMucm90YXRlZCksdCh0aGlzLnMuZHRQYW5lLnRhYmxlKCkuY29udGFpbmVyKCkpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMuZG9tLnRvcFJvdy50cmlnZ2VyKCJjb2xsYXBzZS5kdHNwcyIpKX0sdy5wcm90b3R5cGUuX3VuaXF1ZVJhdGlvPWZ1bmN0aW9uKGssUyl7cmV0dXJuIFM+MCYmKHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz4wJiYhdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMudGFibGVMZW5ndGg+MCk/ay90aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM6MX0sdy5wcm90b3R5cGUudXBkYXRlVGFibGU9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIFMuZmlsdGVyfSk7dGhpcy5zLnNlbGVjdGlvbnM9ayx0aGlzLl9zZWFyY2hFeHRyYXMoKX0sdy5wcm90b3R5cGUuX2dldENvbXBhcmlzb25Sb3dzPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5zLmNvbE9wdHMub3B0aW9ucz90aGlzLnMuY29sT3B0cy5vcHRpb25zOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucz90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm9wdGlvbnM6dm9pZCAwO2lmKGshPT12b2lkIDApe3ZhciBTPXRoaXMucy5kdC5yb3dzKCksQj1TLmRhdGEoKS50b0FycmF5KCksTD1bXTt0aGlzLnMuZHRQYW5lLmNsZWFyKCksdGhpcy5zLmluZGV4ZXM9W107Zm9yKHZhciBSPTAscT1rO1I8cS5sZW5ndGg7UisrKXt2YXIgej1xW1JdLEc9ei5sYWJlbCE9PSIiP3oubGFiZWw6dGhpcy5lbXB0eU1lc3NhZ2UoKSxudD17Y2xhc3NOYW1lOnouY2xhc3NOYW1lLGRpc3BsYXk6RyxmaWx0ZXI6dHlwZW9mIHoudmFsdWU9PSJmdW5jdGlvbiI/ei52YWx1ZTpbXSxzb3J0Onoub3JkZXIhPT12b2lkIDA/ei5vcmRlcjpHLHRvdGFsOjAsdHlwZTpHfTtpZih0eXBlb2Ygei52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciB0dD0wO3R0PEIubGVuZ3RoO3R0Kyspei52YWx1ZS5jYWxsKHRoaXMucy5kdCxCW3R0XSxTWzBdW3R0XSkmJm50LnRvdGFsKys7dHlwZW9mIG50LmZpbHRlciE9ImZ1bmN0aW9uIiYmbnQuZmlsdGVyLnB1c2goei5maWx0ZXIpfUwucHVzaCh0aGlzLmFkZFJvdyhudC5kaXNwbGF5LG50LmZpbHRlcixudC5zb3J0LG50LnR5cGUsbnQuY2xhc3NOYW1lLG50LnRvdGFsKSl9cmV0dXJuIEx9fSx3LnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLGsudG90YWwpfSx3LnByb3RvdHlwZS5fZ2V0U2hvd249ZnVuY3Rpb24oayl7fSx3LnByb3RvdHlwZS5fZ2V0UGFuZUNvbmZpZz1mdW5jdGlvbigpe3ZhciBrPXRoaXMsUz1lLlNjcm9sbGVyLEI9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0xhbmd1YWdlO3JldHVybiBCLnVybD12b2lkIDAsQi5zVXJsPXZvaWQgMCx7Y29sdW1uRGVmczpbe2NsYXNzTmFtZToiZHRzcC1uYW1lQ29sdW1uIixkYXRhOiJkaXNwbGF5IixyZW5kZXI6ZnVuY3Rpb24oTCxSLHEpe2lmKFI9PT0ic29ydCIpcmV0dXJuIHEuc29ydDtpZihSPT09InR5cGUiKXJldHVybiBxLnR5cGU7dmFyIHo9ay5fZ2V0TWVzc2FnZShxKSxHPSc8c3BhbiBjbGFzcz0iJytrLmNsYXNzZXMucGlsbCsnIj4nK3orIjwvc3Bhbj4iO3JldHVybighay5jLnZpZXdDb3VudHx8IWsucy5jb2xPcHRzLnZpZXdDb3VudCkmJihHPSIiKSxSPT09ImZpbHRlciI/dHlwZW9mIEw9PSJzdHJpbmciJiZMLm1hdGNoKC88W14+XSo+LykhPT1udWxsP0wucmVwbGFjZSgvPFtePl0qPi9nLCIiKTpMOic8ZGl2IGNsYXNzPSInK2suY2xhc3Nlcy5uYW1lQ29udCsnIj48c3BhbiB0aXRsZT0iJysodHlwZW9mIEw9PSJzdHJpbmciJiZMLm1hdGNoKC88W14+XSo+LykhPT1udWxsP0wucmVwbGFjZSgvPFtePl0qPi9nLCIiKTpMKSsnIiBjbGFzcz0iJytrLmNsYXNzZXMubmFtZSsnIj4nK0wrIjwvc3Bhbj4iK0crIjwvZGl2PiJ9LHRhcmdldHM6MCx0eXBlOnRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdP3RoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdLl9zTWFudWFsVHlwZTpudWxsfSx7Y2xhc3NOYW1lOiJkdHNwLWNvdW50Q29sdW1uICIrdGhpcy5jbGFzc2VzLmJhZGdlUGlsbCxkYXRhOiJ0b3RhbCIsc2VhcmNoYWJsZTohMSx0YXJnZXRzOjEsdmlzaWJsZTohMX1dLGRlZmVyUmVuZGVyOiEwLGluZm86ITEsbGFuZ3VhZ2U6QixwYWdpbmc6ISFTLHNjcm9sbFg6ITEsc2Nyb2xsWToiMjAwcHgiLHNjcm9sbGVyOiEhUyxzZWxlY3Q6ITAsc3RhdGVTYXZlOiEhdGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0ZlYXR1cmVzLmJTdGF0ZVNhdmV9fSx3LnByb3RvdHlwZS5fbWFrZVNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMudXBkYXRlVGFibGUoKSx0aGlzLnMudXBkYXRpbmc9ITAsdGhpcy5zLmR0LmRyYXcoKSx0aGlzLnMudXBkYXRpbmc9ITF9LHcucHJvdG90eXBlLl9wb3B1bGF0ZVBhbmVBcnJheT1mdW5jdGlvbihrLFMsQixMKXtMPT09dm9pZCAwJiYoTD10aGlzLnMucm93RGF0YS5iaW5zKTt2YXIgUj1CLmZhc3REYXRhP0IuZmFzdERhdGE6ZnVuY3Rpb24oRyxudCx0dCl7cmV0dXJuIEIub0FwaS5fZm5HZXRDZWxsRGF0YShCLEcsbnQsdHQpfTtpZih0eXBlb2YgdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbD09InN0cmluZyIpe3ZhciBxPVIoayx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbCk7dGhpcy5zLnJvd0RhdGEuZmlsdGVyTWFwLnNldChrLHEpLHRoaXMuX2FkZE9wdGlvbihxLHEscSxxLFMsTCksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyt9ZWxzZXt2YXIgej1SKGssdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc2VhcmNoKTt6PT09bnVsbCYmKHo9IiIpLHR5cGVvZiB6PT0ic3RyaW5nIiYmKHo9ei5yZXBsYWNlKC88W14+XSo+L2csIiIpKSx0aGlzLnMucm93RGF0YS5maWx0ZXJNYXAuc2V0KGsseiksTFt6XT8oTFt6XSsrLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrKTooTFt6XT0xLHRoaXMuX2FkZE9wdGlvbih6LFIoayx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC5kaXNwbGF5KSxSKGssdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc29ydCksUihrLHRoaXMucy5pbmRleCx0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsLnR5cGUpLFMsTCksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspfX0sdy5wcm90b3R5cGUuX3JlbG9hZFNlbGVjdD1mdW5jdGlvbihrKXtpZihrIT09dm9pZCAwKXtmb3IodmFyIFMsQj0wO0I8ay5zZWFyY2hQYW5lcy5wYW5lcy5sZW5ndGg7QisrKWlmKGsuc2VhcmNoUGFuZXMucGFuZXNbQl0uaWQ9PT10aGlzLnMuaW5kZXgpe1M9QjticmVha31pZihTKWZvcih2YXIgTD10aGlzLnMuZHRQYW5lLFI9TC5yb3dzKHtvcmRlcjoiaW5kZXgifSkuZGF0YSgpLm1hcChmdW5jdGlvbih0dCl7cmV0dXJuIHR0LmZpbHRlciE9PW51bGw/dHQuZmlsdGVyLnRvU3RyaW5nKCk6bnVsbH0pLnRvQXJyYXkoKSxxPTAsej1rLnNlYXJjaFBhbmVzLnBhbmVzW1NdLnNlbGVjdGVkO3E8ei5sZW5ndGg7cSsrKXt2YXIgRz16W3FdLG50PS0xO0chPT1udWxsJiYobnQ9Ui5pbmRleE9mKEcudG9TdHJpbmcoKSkpLG50Pi0xJiYodGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxMLnJvdyhudCkuc2VsZWN0KCksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMSl9fX0sdy5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbihrKXt2YXIgUz10aGlzLEI9ZnVuY3Rpb24oUil7aWYoYXQudmVyc2lvbkNoZWNrKCIyIikpUy5zLmR0LnByb2Nlc3NpbmcoUik7ZWxzZXt2YXIgcT1TLnMuZHQuc2V0dGluZ3MoKVswXSx6PXEub0FwaTt6Ll9mblByb2Nlc3NpbmdEaXNwbGF5KHEsITEpfX0sTD1mdW5jdGlvbigpe1Mucy5zY3JvbGxUb3A9dChTLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpKS5wYXJlbnQoKVswXS5zY3JvbGxUb3AsUy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJiFTLnMudXBkYXRpbmc/Uy5zLnNlcnZlclNlbGVjdGluZ3x8KFMucy5zZXJ2ZXJTZWxlY3Q9Uy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCksUy5zLmR0LmRyYXcoITEpKTprJiZTLl9tYWtlU2VsZWN0aW9uKCksQighMSl9O0IoITApLHNldFRpbWVvdXQoTCwxKX0sdy5wcm90b3R5cGUuX2FkZE9wdGlvbj1mdW5jdGlvbihrLFMsQixMLFIscSl7aWYoQXJyYXkuaXNBcnJheShrKXx8ayBpbnN0YW5jZW9mIGUuQXBpKXtpZihrIGluc3RhbmNlb2YgZS5BcGkmJihrPWsudG9BcnJheSgpLFM9Uy50b0FycmF5KCkpLGsubGVuZ3RoPT09Uy5sZW5ndGgpe2Zvcih2YXIgej0wO3o8ay5sZW5ndGg7eisrKXFba1t6XV0/cVtrW3pdXSsrOihxW2tbel1dPTEsUi5wdXNoKHtkaXNwbGF5OlNbel0sZmlsdGVyOmtbel0sc29ydDpCW3pdLHR5cGU6TFt6XX0pKSx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKztyZXR1cm59dGhyb3cgbmV3IEVycm9yKCJkaXNwbGF5IGFuZCBmaWx0ZXIgbm90IHRoZSBzYW1lIGxlbmd0aCIpfWVsc2UgdHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciP3Fba10/KHFba10rKyx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKyk6KHFba109MSxSLnB1c2goe2Rpc3BsYXk6UyxmaWx0ZXI6ayxzb3J0OkIsdHlwZTpMfSksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspOlIucHVzaCh7ZGlzcGxheTpTLGZpbHRlcjprLHNvcnQ6Qix0eXBlOkx9KX0sdy5wcm90b3R5cGUuX2J1aWxkUGFuZT1mdW5jdGlvbihrLFMsQil7dmFyIEw9dGhpcztrPT09dm9pZCAwJiYoaz1bXSksUz09PXZvaWQgMCYmKFM9bnVsbCksQj09PXZvaWQgMCYmKEI9bnVsbCksdGhpcy5zLnNlbGVjdGlvbnM9W107dmFyIFI9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpLHE7aWYodGhpcy5zLmxpc3RTZXQmJihSPXRoaXMucy5kdC5zdGF0ZSgpKSx0aGlzLnMuY29sRXhpc3RzKXt2YXIgej0tMTtpZihSJiZSLnNlYXJjaFBhbmVzJiZSLnNlYXJjaFBhbmVzLnBhbmVzKXtmb3IodmFyIEc9MDtHPFIuc2VhcmNoUGFuZXMucGFuZXMubGVuZ3RoO0crKylpZihSLnNlYXJjaFBhbmVzLnBhbmVzW0ddLmlkPT09dGhpcy5zLmluZGV4KXt6PUc7YnJlYWt9fWlmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09ITF8fHRoaXMucy5jb2xPcHRzLnNob3chPT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnNob3chPT0hMCkmJno9PT0tMSlyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITEsITE7aWYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT0hMHx8eiE9PS0xKSYmKHRoaXMucy5kaXNwbGF5ZWQ9ITApLCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmKCFTfHwhUy5zZWFyY2hQYW5lc3x8IVMuc2VhcmNoUGFuZXMub3B0aW9ucykpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLmxlbmd0aD09PTAmJih0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9MCx0aGlzLl9wb3B1bGF0ZVBhbmUoKSx0aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zKTt2YXIgbnQ9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmluc09yaWdpbmFsKS5sZW5ndGgsdHQ9dGhpcy5fdW5pcXVlUmF0aW8obnQsdGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGgpO2lmKHRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP3R0PnRoaXMuYy50aHJlc2hvbGQ6dHQ+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZudDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn10aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNob3cpLHRoaXMucy5kaXNwbGF5ZWQ9ITB9ZWxzZSBTJiZTLnNlYXJjaFBhbmVzJiZTLnNlYXJjaFBhbmVzLm9wdGlvbnMmJnRoaXMuX3NlcnZlclBvcHVsYXRlKFMpfWVsc2UgdGhpcy5zLmRpc3BsYXllZD0hMDt0aGlzLl9kaXNwbGF5UGFuZSgpLHRoaXMucy5saXN0U2V0fHx0aGlzLmRvbS5kdFAub24oInN0YXRlTG9hZFBhcmFtcy5kdHNwIixmdW5jdGlvbihwdCx2dCxydCl7dC5pc0VtcHR5T2JqZWN0KEwucy5kdC5zdGF0ZS5sb2FkZWQoKSkmJnQuZWFjaChydCxmdW5jdGlvbihndCl7ZGVsZXRlIHJ0W2d0XX0pfSksQiE9PW51bGwmJnRoaXMuZG9tLnBhbmVzQ29udGFpbmVyLmhhcyhCKS5sZW5ndGg+MD90aGlzLmRvbS5jb250YWluZXIuaW5zZXJ0QWZ0ZXIoQik6dGhpcy5kb20ucGFuZXNDb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS5jb250YWluZXIpO3ZhciBldD10LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZTt0LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZT0ibm9uZSIsdGhpcy5kb20uZHRQLm9uKCJpbml0LmR0IixmdW5jdGlvbihwdCx2dCl7dmFyIHJ0PUwuZG9tLmR0UC5EYXRhVGFibGUoKSxndD1ydC5zZWxlY3Quc3R5bGUoKTtydC5zZWxlY3Quc3R5bGUoZ3QpfSksdGhpcy5zLmR0UGFuZT10aGlzLmRvbS5kdFAuRGF0YVRhYmxlKHQuZXh0ZW5kKCEwLHRoaXMuX2dldFBhbmVDb25maWcoKSx0aGlzLmMuZHRPcHRzLHRoaXMucy5jb2xPcHRzP3RoaXMucy5jb2xPcHRzLmR0T3B0czp7fSx0aGlzLnMuY29sT3B0cy5vcHRpb25zfHwhdGhpcy5zLmNvbEV4aXN0cz97Y3JlYXRlZFJvdzpmdW5jdGlvbihwdCx2dCl7dChwdCkuYWRkQ2xhc3ModnQuY2xhc3NOYW1lKX19OnZvaWQgMCx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzIT09bnVsbCYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHM/dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHM6e30sdC5mbi5kYXRhVGFibGUudmVyc2lvbkNoZWNrKCIyIik/e2xheW91dDp7Ym90dG9tU3RhcnQ6bnVsbCxib3R0b21FbmQ6bnVsbCx0b3BTdGFydDpudWxsLHRvcEVuZDpudWxsfX06e2RvbToidCJ9KSksdGhpcy5kb20uZHRQLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZSk7dmFyIHd0PSJDdXN0b20gUGFuZSI7aWYodGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXI/d3Q9dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXI6dGhpcy5zLmNvbE9wdHMuaGVhZGVyP3d0PXRoaXMucy5jb2xPcHRzLmhlYWRlcjp0aGlzLnMuY29sRXhpc3RzJiYod3Q9dC5mbi5kYXRhVGFibGUudmVyc2lvbkNoZWNrKCIyIik/dGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLnRpdGxlKCk6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0uc1RpdGxlKSx3dD10aGlzLl9lc2NhcGVIVE1MKHd0KSx0aGlzLmRvbS5zZWFyY2hCb3guYXR0cigicGxhY2Vob2xkZXIiLHd0KSx0LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZT1ldCx0aGlzLnMuY29sRXhpc3RzKWZvcih2YXIgU3Q9MCxUdD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5sZW5ndGg7U3Q8VHQ7U3QrKylpZih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7cT10aGlzLmFkZFJvdyh0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZGlzcGxheSx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZmlsdGVyLHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1N0XS5zb3J0LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1N0XS50eXBlKTtmb3IodmFyIGt0PTAsTHQ9dGhpcy5zLnNlcnZlclNlbGVjdDtrdDxMdC5sZW5ndGg7a3QrKyl7dmFyIEJ0PUx0W2t0XTtCdC5maWx0ZXI9PT10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZmlsdGVyJiYodGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxxLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpfX1lbHNlIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0/dGhpcy5hZGRSb3codGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbU3RdLmRpc3BsYXksdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbU3RdLmZpbHRlcix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uc29ydCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0udHlwZSk6dGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMuYWRkUm93KCIiLCIiLCIiLCIiKTsodGhpcy5zLmNvbE9wdHMub3B0aW9uc3x8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zKSYmdGhpcy5fZ2V0Q29tcGFyaXNvblJvd3MoKSx0aGlzLnMuZHRQYW5lLmRyYXcoKSx0aGlzLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpLnBhcmVudE5vZGUuc2Nyb2xsVG9wPXRoaXMucy5zY3JvbGxUb3AsdGhpcy5hZGp1c3RUb3BSb3coKSx0aGlzLnNldExpc3RlbmVycygpLHRoaXMucy5saXN0U2V0PSEwO2Zvcih2YXIgJHQ9MCxLdD1rOyR0PEt0Lmxlbmd0aDskdCsrKXt2YXIgRD1LdFskdF07aWYoRClmb3IodmFyIHV0PTAsb3Q9dGhpcy5zLmR0UGFuZS5yb3dzKCkuaW5kZXhlcygpLnRvQXJyYXkoKTt1dDxvdC5sZW5ndGg7dXQrKylxPW90W3V0XSx0aGlzLnMuZHRQYW5lLnJvdyhxKS5kYXRhKCkmJkQuZmlsdGVyPT09dGhpcy5zLmR0UGFuZS5yb3cocSkuZGF0YSgpLmZpbHRlciYmKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlPyh0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSEwLHRoaXMucy5kdFBhbmUucm93KHEpLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpOnRoaXMucy5kdFBhbmUucm93KHEpLnNlbGVjdCgpKX1pZih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLmR0UGFuZS5zZWFyY2godGhpcy5kb20uc2VhcmNoQm94LnZhbCgpKS5kcmF3KCksKHRoaXMuYy5pbml0Q29sbGFwc2VkJiZ0aGlzLnMuY29sT3B0cy5pbml0Q29sbGFwc2VkIT09ITF8fHRoaXMucy5jb2xPcHRzLmluaXRDb2xsYXBzZWQpJiYodGhpcy5jLmNvbGxhcHNlJiZ0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSE9PSExfHx0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSkmJih0aGlzLnMuZHRQYW5lLnNldHRpbmdzKClbMF0uX2JJbml0Q29tcGxldGU/dGhpcy5jb2xsYXBzZSgpOnRoaXMucy5kdFBhbmUub25lKCJpbml0IixmdW5jdGlvbigpe3JldHVybiBMLmNvbGxhcHNlKCl9KSksUiYmUi5zZWFyY2hQYW5lcyYmUi5zZWFyY2hQYW5lcy5wYW5lcyYmKCFTfHxTLmRyYXc9PT0xKSl7dGhpcy5fcmVsb2FkU2VsZWN0KFIpO2Zvcih2YXIgVj0wLGo9Ui5zZWFyY2hQYW5lcy5wYW5lcztWPGoubGVuZ3RoO1YrKyl7dmFyIEs9altWXTtLLmlkPT09dGhpcy5zLmluZGV4JiYoSy5zZWFyY2hUZXJtJiZLLnNlYXJjaFRlcm0ubGVuZ3RoPjAmJnRoaXMuZG9tLnNlYXJjaEJveC52YWwoSy5zZWFyY2hUZXJtKS50cmlnZ2VyKCJpbnB1dCIpLEsub3JkZXImJnRoaXMucy5kdFBhbmUub3JkZXIoSy5vcmRlcikuZHJhdygpLEsuY29sbGFwc2VkP3RoaXMuY29sbGFwc2UoKTp0aGlzLnNob3coKSl9fXJldHVybiEwfSx3LnByb3RvdHlwZS5fZGlzcGxheVBhbmU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kdFAuZW1wdHkoKSx0aGlzLmRvbS50b3BSb3cuZW1wdHkoKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudG9wUm93KSxwYXJzZUludCh0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMV0sMTApPjMmJnRoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc21hbGxHYXApLHRoaXMuZG9tLnRvcFJvdy5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc3ViUm93c0NvbnRhaW5lcikuYXBwZW5kKHRoaXMuZG9tLnVwcGVyLmFwcGVuZCh0aGlzLmRvbS5zZWFyY2hDb250KSkuYXBwZW5kKHRoaXMuZG9tLmxvd2VyLmFwcGVuZCh0aGlzLmRvbS5idXR0b25Hcm91cCkpLCh0aGlzLmMuZHRPcHRzLnNlYXJjaGluZz09PSExfHx0aGlzLnMuY29sT3B0cy5kdE9wdHMmJnRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8IXRoaXMuYy5jb250cm9sc3x8IXRoaXMucy5jb2xPcHRzLmNvbnRyb2xzfHx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmR0T3B0cyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nIT09dm9pZCAwJiYhdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nKSYmdGhpcy5kb20uc2VhcmNoQm94LnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lSW5wdXRCdXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5kb20uc2VhcmNoQm94LmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaENvbnQpLHRoaXMuX3NlYXJjaENvbnRTZXR1cCgpLHRoaXMuYy5jbGVhciYmdGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20uY2xlYXIuYXBwZW5kVG8odGhpcy5kb20uYnV0dG9uR3JvdXApLHRoaXMuYy5vcmRlcmFibGUmJnRoaXMucy5jb2xPcHRzLm9yZGVyYWJsZSYmdGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20ubmFtZUJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5idXR0b25Hcm91cCksdGhpcy5jLnZpZXdDb3VudCYmdGhpcy5zLmNvbE9wdHMudmlld0NvdW50JiZ0aGlzLmMub3JkZXJhYmxlJiZ0aGlzLnMuY29sT3B0cy5vcmRlcmFibGUmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNvdW50QnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSwodGhpcy5jLmNvbGxhcHNlJiZ0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSE9PSExfHx0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSkmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNvbGxhcHNlQnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSx0aGlzLmRvbS5jb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS50b3BSb3cpLmFwcGVuZCh0aGlzLmRvbS5kdFApLnNob3coKX0sdy5wcm90b3R5cGUuX2VzY2FwZUhUTUw9ZnVuY3Rpb24oayl7cmV0dXJuIGsudG9TdHJpbmcoKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mcXVvdDsvZywnIicpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sdy5wcm90b3R5cGUuX2dldEJvbnVzT3B0aW9ucz1mdW5jdGlvbigpe3ZhciBrPXt0aHJlc2hvbGQ6bnVsbH07cmV0dXJuIHQuZXh0ZW5kKCEwLHt9LHcuZGVmYXVsdHMsayx0aGlzLmM/dGhpcy5jOnt9KX0sdy5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMuZHQsUz17Y29sbGFwc2U6bnVsbCxlbXB0eU1lc3NhZ2U6ITEsaW5pdENvbGxhcHNlZDpudWxsLHRocmVzaG9sZDpudWxsfSxCPWsuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbdGhpcy5zLmluZGV4XS5zZWFyY2hQYW5lcyxMPXQuZXh0ZW5kKCEwLHt9LHcuZGVmYXVsdHMsUyxCKTtyZXR1cm4gQiYmQi5oaWRlQ291bnQmJkIudmlld0NvdW50PT09dm9pZCAwJiYoTC52aWV3Q291bnQ9IUIuaGlkZUNvdW50KSxMfSx3LnByb3RvdHlwZS5fcG9wdWxhdGVQYW5lPWZ1bmN0aW9uKCl7dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI9W10sdGhpcy5zLnJvd0RhdGEuYmlucz17fTt2YXIgaz10aGlzLnMuZHQuY29udGV4dFswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBTPTAsQj10aGlzLnMuZHQucm93cygpLmluZGV4ZXMoKS50b0FycmF5KCk7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoTCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixrKX19LHcucHJvdG90eXBlLl9zZWFyY2g9ZnVuY3Rpb24oayxTKXtmb3IodmFyIEI9dGhpcy5zLmNvbE9wdHMsTD10aGlzLnMuZHQsUj0wLHE9dGhpcy5zLnNlbGVjdGlvbnM7UjxxLmxlbmd0aDtSKyspe3ZhciB6PXFbUl07aWYodHlwZW9mIHo9PSJzdHJpbmciJiZ0eXBlb2Ygaz09InN0cmluZyImJih6PXRoaXMuX2VzY2FwZUhUTUwoeikpLEFycmF5LmlzQXJyYXkoaykpe2lmKEIuY29tYmluZXI9PT0iYW5kIil7aWYoIWsuaW5jbHVkZXMoeikpcmV0dXJuITF9ZWxzZSBpZihrLmluY2x1ZGVzKHopKXJldHVybiEwfWVsc2UgaWYodHlwZW9mIHo9PSJmdW5jdGlvbiIpe2lmKHouY2FsbChMLEwucm93KFMpLmRhdGEoKSxTKSl7aWYoQi5jb21iaW5lcj09PSJvciIpcmV0dXJuITB9ZWxzZSBpZihCLmNvbWJpbmVyPT09ImFuZCIpcmV0dXJuITF9ZWxzZSBpZihrPT09enx8ISh0eXBlb2Ygaz09InN0cmluZyImJmsubGVuZ3RoPT09MCkmJms9PXp8fHo9PT1udWxsJiZ0eXBlb2Ygaz09InN0cmluZyImJms9PT0iIilyZXR1cm4hMH1yZXR1cm4gQi5jb21iaW5lcj09PSJhbmQifSx3LnByb3RvdHlwZS5fc2VhcmNoQ29udFNldHVwPWZ1bmN0aW9uKCl7dGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20uc2VhcmNoQnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaExhYmVsQ29udCksdGhpcy5jLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8dGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlYXJjaGluZz09PSExfHx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmR0T3B0cyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nIT09dm9pZCAwJiYhdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nfHx0aGlzLmRvbS5zZWFyY2hMYWJlbENvbnQuYXBwZW5kVG8odGhpcy5kb20uc2VhcmNoQ29udCl9LHcucHJvdG90eXBlLl9zZWFyY2hFeHRyYXM9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMudXBkYXRpbmc7dGhpcy5zLnVwZGF0aW5nPSEwO3ZhciBTPXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkucGx1Y2soImZpbHRlciIpLnRvQXJyYXkoKSxCPVMuaW5kZXhPZih0aGlzLmVtcHR5TWVzc2FnZSgpKSxMPXQodGhpcy5zLmR0UGFuZS50YWJsZSgpLmNvbnRhaW5lcigpKTtCPi0xJiYoU1tCXT0iIiksUy5sZW5ndGg+MD9MLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3RlZCk6Uy5sZW5ndGg9PT0wJiZMLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3RlZCksdGhpcy5zLnVwZGF0aW5nPWt9LHcudmVyc2lvbj0iMi4xLjIiLHcuY2xhc3Nlcz17Ym9yZGVyZWQ6ImR0c3AtYm9yZGVyZWQiLGJ1dHRvbkdyb3VwOiJkdHNwLWJ1dHRvbkdyb3VwIixidXR0b25TdWI6ImR0c3AtYnV0dG9uU3ViIixjYXJldDoiZHRzcC1jYXJldCIsY2xlYXI6ImR0c3AtY2xlYXIiLGNsZWFyQWxsOiJkdHNwLWNsZWFyQWxsIixjbGVhckJ1dHRvbjoiY2xlYXJCdXR0b24iLGNvbGxhcHNlQWxsOiJkdHNwLWNvbGxhcHNlQWxsIixjb2xsYXBzZUJ1dHRvbjoiZHRzcC1jb2xsYXBzZUJ1dHRvbiIsY29udGFpbmVyOiJkdHNwLXNlYXJjaFBhbmUiLGNvdW50QnV0dG9uOiJkdHNwLWNvdW50QnV0dG9uIixkaXNhYmxlZEJ1dHRvbjoiZHRzcC1kaXNhYmxlZEJ1dHRvbiIsaGlkZGVuOiJkdHNwLWhpZGRlbiIsaGlkZToiZHRzcC1oaWRlIixsYXlvdXQ6ImR0c3AtIixuYW1lOiJkdHNwLW5hbWUiLG5hbWVCdXR0b246ImR0c3AtbmFtZUJ1dHRvbiIsbmFtZUNvbnQ6ImR0c3AtbmFtZUNvbnQiLG5hcnJvdzoiZHRzcC1uYXJyb3ciLHBhbmVCdXR0b246ImR0c3AtcGFuZUJ1dHRvbiIscGFuZUlucHV0QnV0dG9uOiJkdHNwLXBhbmVJbnB1dEJ1dHRvbiIscGlsbDoiZHRzcC1waWxsIixyb3RhdGVkOiJkdHNwLXJvdGF0ZWQiLHNlYXJjaDoiZHRzcC1zZWFyY2giLHNlYXJjaENvbnQ6ImR0c3Atc2VhcmNoQ29udCIsc2VhcmNoSWNvbjoiZHRzcC1zZWFyY2hJY29uIixzZWFyY2hMYWJlbENvbnQ6ImR0c3Atc2VhcmNoQnV0dG9uQ29udCIsc2VsZWN0ZWQ6ImR0c3Atc2VsZWN0ZWQiLHNtYWxsR2FwOiJkdHNwLXNtYWxsR2FwIixzdWJSb3cxOiJkdHNwLXN1YlJvdzEiLHN1YlJvdzI6ImR0c3Atc3ViUm93MiIsc3ViUm93c0NvbnRhaW5lcjoiZHRzcC1zdWJSb3dzQ29udGFpbmVyIix0aXRsZToiZHRzcC10aXRsZSIsdG9wUm93OiJkdHNwLXRvcFJvdyJ9LHcuZGVmYXVsdHM9e2NsZWFyOiEwLGNvbGxhcHNlOiEwLGNvbWJpbmVyOiJvciIsY29udGFpbmVyOmZ1bmN0aW9uKGspe3JldHVybiBrLnRhYmxlKCkuY29udGFpbmVyKCl9LGNvbnRyb2xzOiEwLGR0T3B0czp7fSxlbXB0eU1lc3NhZ2U6bnVsbCxoaWRlQ291bnQ6ITEsaTE4bjp7Y2xlYXJQYW5lOiImdGltZXM7Iixjb3VudDoie3RvdGFsfSIsZW1wdHlNZXNzYWdlOiI8ZW0+Tm8gZGF0YTwvZW0+In0saW5pdENvbGxhcHNlZDohMSxsYXlvdXQ6ImF1dG8iLG5hbWU6dm9pZCAwLG9yZGVyYWJsZTohMCxvcnRob2dvbmFsOntkaXNwbGF5OiJkaXNwbGF5IixmaWx0ZXI6ImZpbHRlciIsaGlkZUNvdW50OiExLHNlYXJjaDoiZmlsdGVyIixzaG93OnZvaWQgMCxzb3J0OiJzb3J0Iix0aHJlc2hvbGQ6LjYsdHlwZToidHlwZSIsdmlld0NvdW50OiEwfSxwcmVTZWxlY3Q6W10sdGhyZXNob2xkOi42LHZpZXdDb3VudDohMH0sd30oKSxzPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksaT1mdW5jdGlvbih3KXtzKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3JldHVybiB3LmNhbGwodGhpcyxTLEIsTCxSLHEpfHx0aGlzfXJldHVybiBrLnByb3RvdHlwZS5fZW1wdHlQYW5lPWZ1bmN0aW9uKCl7dmFyIFM9dGhpcy5zLmR0UGFuZTtpZihhdC52ZXJzaW9uQ2hlY2soIjIiKSl7dmFyIEI9Uy5zZWxlY3QubGFzdCgpLEw7cmV0dXJuIEImJlMucm93KEIucm93KS5hbnkoKSYmKEw9Uy5yb3coQi5yb3cpLmRhdGEoKS5pbmRleCksUy5yb3dzKCkucmVtb3ZlKCksZnVuY3Rpb24oKXtpZihMIT09dm9pZCAwKXt2YXIgUj1TLnJvdyhmdW5jdGlvbihxLHope3JldHVybiB6LmluZGV4PT09TH0pLmluZGV4KCk7Uy5zZWxlY3QubGFzdCh7cm93OlIsY29sdW1uOjB9KX19fXJldHVybiBTLnJvd3MoKS5yZW1vdmUoKSxmdW5jdGlvbigpe319LGsucHJvdG90eXBlLl9zZXJ2ZXJQb3B1bGF0ZT1mdW5jdGlvbihTKXt2YXIgQixMLFI7dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLFMudGFibGVMZW5ndGghPT12b2lkIDA/KHRoaXMucy50YWJsZUxlbmd0aD1TLnRhYmxlTGVuZ3RoLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz10aGlzLnMudGFibGVMZW5ndGgpOih0aGlzLnMudGFibGVMZW5ndGg9PT1udWxsfHx0aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aD50aGlzLnMudGFibGVMZW5ndGgpJiYodGhpcy5zLnRhYmxlTGVuZ3RoPXRoaXMucy5kdC5yb3dzKClbMF0ubGVuZ3RoLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz10aGlzLnMudGFibGVMZW5ndGgpO3ZhciBxPXRoaXMucy5kdC5jb2x1bW4odGhpcy5zLmluZGV4KS5kYXRhU3JjKCk7aWYoUy5zZWFyY2hQYW5lcy5vcHRpb25zW3FdIT09dm9pZCAwKWZvcih2YXIgej0wLEc9Uy5zZWFyY2hQYW5lcy5vcHRpb25zW3FdO3o8Ry5sZW5ndGg7eisrKXt2YXIgbnQ9R1t6XTt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5wdXNoKHtkaXNwbGF5Om50LmxhYmVsLGZpbHRlcjpudC52YWx1ZSxzaG93bjorbnQuY291bnQsc29ydDpudC5sYWJlbCx0b3RhbDorbnQudG90YWwsdHlwZTpudC5sYWJlbH0pLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltudC52YWx1ZV09K250LmNvdW50LHRoaXMucy5yb3dEYXRhLmJpbnNbbnQudmFsdWVdPStudC50b3RhbH12YXIgdHQ9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmlucykubGVuZ3RoLGV0PXRoaXMuX3VuaXF1ZVJhdGlvKHR0LHRoaXMucy50YWJsZUxlbmd0aCk7aWYoIXRoaXMucy5jb2xPcHRzLnNob3cmJnRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP2V0PnRoaXMuYy50aHJlc2hvbGQ6ZXQ+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZ0dDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn1pZih0aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zLHRoaXMucy5kaXNwbGF5ZWQ9ITAsdGhpcy5zLmR0UGFuZSl7Zm9yKHZhciB3dD10aGlzLnMuc2VydmVyU2VsZWN0LFN0PXRoaXMuX2VtcHR5UGFuZSgpLFR0PTAsa3Q9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI7VHQ8a3QubGVuZ3RoO1R0KyspaWYoUj1rdFtUdF0sdGhpcy5fc2hvdWxkQWRkUm93KFIpKXtMPXRoaXMuYWRkUm93KFIuZGlzcGxheSxSLmZpbHRlcixSLnNvcnQsUi50eXBlKTtmb3IodmFyIEx0PTA7THQ8d3QubGVuZ3RoO0x0KyspaWYoQj13dFtMdF0sQi5maWx0ZXI9PT1SLmZpbHRlcil7dGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxMLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEsd3Quc3BsaWNlKEx0LDEpLHRoaXMucy5zZWxlY3Rpb25zLnB1c2goUi5maWx0ZXIpO2JyZWFrfX1mb3IodmFyIEJ0PTAsJHQ9d3Q7QnQ8JHQubGVuZ3RoO0J0Kyspe0I9JHRbQnRdO2Zvcih2YXIgS3Q9MCxEPXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw7S3Q8RC5sZW5ndGg7S3QrKylSPURbS3RdLFIuZmlsdGVyPT09Qi5maWx0ZXImJihMPXRoaXMuYWRkUm93KFIuZGlzcGxheSxSLmZpbHRlcixSLnNvcnQsUi50eXBlKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSEwLEwuc2VsZWN0KCksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKFIuZmlsdGVyKSl9dGhpcy5zLnNlcnZlclNlbGVjdD10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSx0aGlzLnMuZHRQYW5lLmRyYXcoKSxTdCgpfX0say5wcm90b3R5cGUudXBkYXRlUm93cz1mdW5jdGlvbigpe2lmKCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9O2Zvcih2YXIgUz0wLEI9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO3RoaXMuX3VwZGF0ZVNob3duKEwsdGhpcy5zLmR0LnNldHRpbmdzKClbMF0sdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duKX19Zm9yKHZhciBSPWZ1bmN0aW9uKHR0KXt0dC5zaG93bj10eXBlb2YgcS5zLnJvd0RhdGEuYmluc1Nob3duW3R0LmZpbHRlcl09PSJudW1iZXIiP3Eucy5yb3dEYXRhLmJpbnNTaG93blt0dC5maWx0ZXJdOjAscS5zLmR0UGFuZS5yb3coZnVuY3Rpb24oZXQsd3Qpe3JldHVybiB3dCYmd3QuaW5kZXg9PT10dC5pbmRleH0pLmRhdGEodHQpfSxxPXRoaXMsej0wLEc9dGhpcy5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKTt6PEcubGVuZ3RoO3orKyl7dmFyIG50PUdbel07UihudCl9dGhpcy5zLmR0UGFuZS5kcmF3KCksdGhpcy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKS5wYXJlbnROb2RlLnNjcm9sbFRvcD10aGlzLnMuc2Nyb2xsVG9wfSxrLnByb3RvdHlwZS5fbWFrZVNlbGVjdGlvbj1mdW5jdGlvbigpe30say5wcm90b3R5cGUuX3JlbG9hZFNlbGVjdD1mdW5jdGlvbigpe30say5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4hMH0say5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYhdGhpcy5zLnVwZGF0aW5nJiYhdGhpcy5zLnNlcnZlclNlbGVjdGluZyYmKHRoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkpfSxrLnByb3RvdHlwZS5fdXBkYXRlU2hvd249ZnVuY3Rpb24oUyxCLEwpe0w9PT12b2lkIDAmJihMPXRoaXMucy5yb3dEYXRhLmJpbnNTaG93bik7dmFyIFI9dHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciP3RoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw6dGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC5zZWFyY2gscT1CLmZhc3REYXRhP0IuZmFzdERhdGE6ZnVuY3Rpb24od3QsU3QsVHQpe3JldHVybiBCLm9BcGkuX2ZuR2V0Q2VsbERhdGEoQix3dCxTdCxUdCl9LHo9cShTLHRoaXMucy5pbmRleCxSKSxHPWZ1bmN0aW9uKHd0KXtMW3d0XT9MW3d0XSsrOkxbd3RdPTF9O2lmKEFycmF5LmlzQXJyYXkoeikpZm9yKHZhciBudD0wLHR0PXo7bnQ8dHQubGVuZ3RoO250Kyspe3ZhciBldD10dFtudF07RyhldCl9ZWxzZSBHKHopfSxrfShyKSxvPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksdTtmdW5jdGlvbiBwKHcpe3U9d312YXIgYj1mdW5jdGlvbih3KXtvKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3ZhciB6PXRoaXMsRz17aTE4bjp7Y291bnRGaWx0ZXJlZDoie3Nob3dufSAoe3RvdGFsfSkifX07cmV0dXJuIHo9dy5jYWxsKHRoaXMsUyx1LmV4dGVuZChHLEIpLEwsUixxKXx8dGhpcyx6fXJldHVybiBrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgQj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxMPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9MOkIpLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LGsucHJvdG90eXBlLl9nZXRTaG93bj1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duJiZ0aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU10/dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duW1NdOjB9LGt9KGkpLGc9d2luZG93JiZ3aW5kb3cuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciB3PWZ1bmN0aW9uKGssUyl7cmV0dXJuIHc9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKEIsTCl7Qi5fX3Byb3RvX189TH18fGZ1bmN0aW9uKEIsTCl7Zm9yKHZhciBSIGluIEwpTC5oYXNPd25Qcm9wZXJ0eShSKSYmKEJbUl09TFtSXSl9LHcoayxTKX07cmV0dXJuIGZ1bmN0aW9uKGssUyl7dyhrLFMpO2Z1bmN0aW9uIEIoKXt0aGlzLmNvbnN0cnVjdG9yPWt9ay5wcm90b3R5cGU9Uz09PW51bGw/T2JqZWN0LmNyZWF0ZShTKTooQi5wcm90b3R5cGU9Uy5wcm90b3R5cGUsbmV3IEIpfX0oKSxtO2Z1bmN0aW9uIEModyl7bT13fXZhciB5PWZ1bmN0aW9uKHcpe2coayx3KTtmdW5jdGlvbiBrKFMsQixMLFIscSl7dmFyIHo9dGhpcyxHPXtpMThuOntjb3VudDoie3Nob3dufSJ9fTtyZXR1cm4gej13LmNhbGwodGhpcyxTLG0uZXh0ZW5kKEcsQiksTCxSLHEpfHx0aGlzLHp9cmV0dXJuIGsucHJvdG90eXBlLnVwZGF0ZVJvd3M9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSxCO2lmKHRoaXMucy5jb2xPcHRzLm9wdGlvbnN8fHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucyl7dGhpcy5fZ2V0Q29tcGFyaXNvblJvd3MoKTtmb3IodmFyIEw9dGhpcy5zLmR0UGFuZS5yb3dzKCkudG9BcnJheSgpWzBdLFI9MDtSPEwubGVuZ3RoO1IrKyl7dmFyIHE9dGhpcy5zLmR0UGFuZS5yb3coTFtSXSksej1xLmRhdGEoKTtpZih6IT09dm9pZCAwKXtpZih6LnNob3duPT09MCl7cS5yZW1vdmUoKSxMPXRoaXMucy5kdFBhbmUucm93cygpLnRvQXJyYXkoKVswXSxSLS07Y29udGludWV9Zm9yKHZhciBHPTAsbnQ9UztHPG50Lmxlbmd0aDtHKyspaWYoQj1udFtHXSx6LmZpbHRlcj09PUIuZmlsdGVyKXtxLnNlbGVjdCgpLFMuc3BsaWNlKFIsMSksdGhpcy5zLnNlbGVjdGlvbnMucHVzaCh6LmZpbHRlcik7YnJlYWt9fX19ZWxzZXtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMuX2FjdGl2ZVBvcHVsYXRlUGFuZSgpLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTtmb3IodmFyIHR0PTAsZXQ9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO3R0PGV0Lmxlbmd0aDt0dCsrKXt2YXIgd3Q9ZXRbdHRdO3RoaXMuX3VwZGF0ZVNob3duKHd0LHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fXRoaXMucy5kdFBhbmUucm93cygpLnJlbW92ZSgpO2Zvcih2YXIgU3Q9MCxUdD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcjtTdDxUdC5sZW5ndGg7U3QrKyl7dmFyIGt0PVR0W1N0XTtpZihrdC5zaG93biE9PTApZm9yKHZhciBMdD10aGlzLmFkZFJvdyhrdC5kaXNwbGF5LGt0LmZpbHRlcixrdC5zb3J0LGt0LnR5cGUsdm9pZCAwKSxCdD0wO0J0PFMubGVuZ3RoO0J0Kyspe3ZhciAkdD1TW0J0XTtpZigkdC5maWx0ZXI9PT1rdC5maWx0ZXIpe0x0LnNlbGVjdCgpLFMuc3BsaWNlKEJ0LDEpLHRoaXMucy5zZWxlY3Rpb25zLnB1c2goa3QuZmlsdGVyKTticmVha319fWZvcih2YXIgS3Q9MCxEPVM7S3Q8RC5sZW5ndGg7S3QrKyl7Qj1EW0t0XTtmb3IodmFyIHV0PTAsb3Q9dGhpcy5zLnJvd0RhdGEuYXJyYXlPcmlnaW5hbDt1dDxvdC5sZW5ndGg7dXQrKyl7dmFyIFY9b3RbdXRdO2lmKFYuZmlsdGVyPT09Qi5maWx0ZXIpe3ZhciBqPXRoaXMuYWRkUm93KFYuZGlzcGxheSxWLmZpbHRlcixWLnNvcnQsVi50eXBlLHZvaWQgMCk7ai5zZWxlY3QoKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKFYuZmlsdGVyKX19fX10aGlzLnMuZHRQYW5lLmRyYXcoKSx0aGlzLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpLnBhcmVudE5vZGUuc2Nyb2xsVG9wPXRoaXMucy5zY3JvbGxUb3AsdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMucy5kdC5kcmF3KCExKX0say5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnM9e307dmFyIFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF07aWYoIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKWZvcih2YXIgQj0wLEw9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO0I8TC5sZW5ndGg7QisrKXt2YXIgUj1MW0JdO3RoaXMuX3BvcHVsYXRlUGFuZUFycmF5KFIsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsUyl9fSxrLnByb3RvdHlwZS5fZ2V0Q29tcGFyaXNvblJvd3M9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLnMuY29sT3B0cy5vcHRpb25zP3RoaXMucy5jb2xPcHRzLm9wdGlvbnM6dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9uczp2b2lkIDA7aWYoUyE9PXZvaWQgMCl7dmFyIEI9dGhpcy5zLmR0LnJvd3MoKSxMPXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSksUj1CLmRhdGEoKS50b0FycmF5KCkscT1MLmRhdGEoKS50b0FycmF5KCksej1bXTt0aGlzLnMuZHRQYW5lLmNsZWFyKCksdGhpcy5zLmluZGV4ZXM9W107Zm9yKHZhciBHPTAsbnQ9UztHPG50Lmxlbmd0aDtHKyspe3ZhciB0dD1udFtHXSxldD10dC5sYWJlbCE9PSIiP3R0LmxhYmVsOnRoaXMuZW1wdHlNZXNzYWdlKCksd3Q9e2NsYXNzTmFtZTp0dC5jbGFzc05hbWUsZGlzcGxheTpldCxmaWx0ZXI6dHlwZW9mIHR0LnZhbHVlPT0iZnVuY3Rpb24iP3R0LnZhbHVlOltdLHNob3duOjAsc29ydDpldCx0b3RhbDowLHR5cGU6ZXR9O2lmKHR5cGVvZiB0dC52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciBTdD0wO1N0PFIubGVuZ3RoO1N0KyspdHQudmFsdWUuY2FsbCh0aGlzLnMuZHQsUltTdF0sQlswXVtTdF0pJiZ3dC50b3RhbCsrO2Zvcih2YXIgVHQ9MDtUdDxxLmxlbmd0aDtUdCsrKXR0LnZhbHVlLmNhbGwodGhpcy5zLmR0LHFbVHRdLExbMF1bVHRdKSYmd3Quc2hvd24rKzt0eXBlb2Ygd3QuZmlsdGVyIT0iZnVuY3Rpb24iJiZ3dC5maWx0ZXIucHVzaCh0dC5maWx0ZXIpfXoucHVzaCh0aGlzLmFkZFJvdyh3dC5kaXNwbGF5LHd0LmZpbHRlcix3dC5zb3J0LHd0LnR5cGUsd3QuY2xhc3NOYW1lLHd0LnRvdGFsLHd0LnNob3duKSl9cmV0dXJuIHp9fSxrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLFMudG90YWwpLnJlcGxhY2UoL3tzaG93bn0vZyxTLnNob3duKX0say5wcm90b3R5cGUuX2dldFNob3duPWZ1bmN0aW9uKFMpe3JldHVybiB0aGlzLnMucm93RGF0YS5iaW5zU2hvd24mJnRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltTXT90aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU106MH0say5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4gUy5zaG93bj4wfSxrfShpKSxUPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksUDtmdW5jdGlvbiBjKHcpe1A9d312YXIgbD1mdW5jdGlvbih3KXtUKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3ZhciB6PXRoaXMsRz17aTE4bjp7Y291bnQ6Int0b3RhbH0iLGNvdW50RmlsdGVyZWQ6IntzaG93bn0gKHt0b3RhbH0pIn19O3JldHVybiB6PXcuY2FsbCh0aGlzLFMsUC5leHRlbmQoRyxCKSxMLFIscSl8fHRoaXMsen1yZXR1cm4gay5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTt2YXIgUz10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBCPTAsTD10aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKS50b0FycmF5KCk7QjxMLmxlbmd0aDtCKyspe3ZhciBSPUxbQl07dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoUix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixTLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fSxrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgQj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxMPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9MOkIpLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LGt9KHkpLGgsXztmdW5jdGlvbiBGKHcpe2g9dyxfPXcuZm4uZGF0YVRhYmxlfXZhciBPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdyhrLFMsQixMKXt2YXIgUj10aGlzO2lmKEI9PT12b2lkIDAmJihCPSExKSxMPT09dm9pZCAwJiYoTD1yKSwhX3x8IV8udmVyc2lvbkNoZWNrfHwhXy52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighXy5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciBxPW5ldyBfLkFwaShrKTtpZih0aGlzLmNsYXNzZXM9aC5leHRlbmQoITAse30sdy5jbGFzc2VzKSx0aGlzLmM9aC5leHRlbmQoITAse30sdy5kZWZhdWx0cyxTKSx0aGlzLmRvbT17Y2xlYXJBbGw6aCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY2xlYXJBbGwpLmh0bWwocS5pMThuKCJzZWFyY2hQYW5lcy5jbGVhck1lc3NhZ2UiLHRoaXMuYy5pMThuLmNsZWFyTWVzc2FnZSkpLGNvbGxhcHNlQWxsOmgoJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbGxhcHNlQWxsKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2VNZXNzYWdlIix0aGlzLmMuaTE4bi5jb2xsYXBzZU1lc3NhZ2UpKSxjb250YWluZXI6aCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVzKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMubG9hZE1lc3NhZ2UiLHRoaXMuYy5pMThuLmxvYWRNZXNzYWdlKSksZW1wdHlNZXNzYWdlOmgoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5lbXB0eU1lc3NhZ2UpLHBhbmVzOmgoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb250YWluZXIpLHNob3dBbGw6aCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2hvd0FsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMuc2hvd01lc3NhZ2UiLHRoaXMuYy5pMThuLnNob3dNZXNzYWdlKSksdGl0bGU6aCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRpdGxlKSx0aXRsZVJvdzpoKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGVSb3cpfSx0aGlzLnM9e2NvbE9wdHM6W10sZHQ6cSxmaWx0ZXJDb3VudDowLG1pblBhbmVXaWR0aDoyNjAscGFnZTowLHBhZ2luZzohMSxwYWdpbmdTVDohMSxwYW5lQ2xhc3M6TCxwYW5lczpbXSxzZWxlY3Rpb25MaXN0OltdLHNlcnZlckRhdGE6e30sc3RhdGVSZWFkOiExLHVwZGF0aW5nOiExfSwhcS5zZXR0aW5ncygpWzBdLl9zZWFyY2hQYW5lcyl7aWYoaChkb2N1bWVudCkub24oImRyYXcuZHQiLGZ1bmN0aW9uKEcpe1IuZG9tLmNvbnRhaW5lci5maW5kKEcudGFyZ2V0KS5sZW5ndGgmJlIuX3VwZGF0ZUZpbHRlckNvdW50KCl9KSx0aGlzLl9nZXRTdGF0ZSgpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgej10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTt0aGlzLnMuZHQub24oInByZVhoci5kdHNwcyIsZnVuY3Rpb24oRyxudCx0dCl7aWYoej09PW50KXt0dC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsPT09dm9pZCAwJiYodHQuc2VhcmNoUGFuZXNfbnVsbD17fSk7Zm9yKHZhciBldCx3dD0wLFN0PVIucy5zZWxlY3Rpb25MaXN0O3d0PFN0Lmxlbmd0aDt3dCsrKXt2YXIgVHQ9U3Rbd3RdO2V0PVIucy5kdC5jb2x1bW4oVHQuY29sdW1uKS5kYXRhU3JjKCksdHQuc2VhcmNoUGFuZXNbZXRdPT09dm9pZCAwJiYodHQuc2VhcmNoUGFuZXNbZXRdPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsW2V0XT09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzX251bGxbZXRdPXt9KTtmb3IodmFyIGt0PTA7a3Q8VHQucm93cy5sZW5ndGg7a3QrKyl0dC5zZWFyY2hQYW5lc1tldF1ba3RdPVR0LnJvd3Nba3RdLHR0LnNlYXJjaFBhbmVzW2V0XVtrdF09PT1udWxsP3R0LnNlYXJjaFBhbmVzX251bGxbZXRdW2t0XT0hMDp0dC5zZWFyY2hQYW5lc19udWxsW2V0XVtrdF09ITF9Ui5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJih0dC5zZWFyY2hQYW5lc0xhc3Q9ZXQpLHR0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Ui5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Ui5jLnZpZXdDb3VudCx2aWV3VG90YWw6Ui5jLnZpZXdUb3RhbH19fSl9cmV0dXJuIHRoaXMuX3NldFhIUigpLHEuc2V0dGluZ3MoKVswXS5fc2VhcmNoUGFuZXM9dGhpcyx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZXx8Qj90aGlzLl9wYW5lRGVjbGFyZShxLGssUyk6cS5vbmUoInByZUluaXQuZHRzcHMiLGZ1bmN0aW9uKCl7Ui5fcGFuZURlY2xhcmUocSxrLFMpfSksdGhpc319cmV0dXJuIHcucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgayxTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspaz1CW1NdLGsucy5kdFBhbmUmJihrLnMuc2Nyb2xsVG9wPWsucy5kdFBhbmUudGFibGUoKS5ub2RlKCkucGFyZW50Tm9kZS5zY3JvbGxUb3ApO3ZhciBMPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoL1xzKy9nLCIuIikpO0wuZWFjaChmdW5jdGlvbigpe2godGhpcykudmFsKCIiKS50cmlnZ2VyKCJpbnB1dCIpfSksdGhpcy5zLnNlbGVjdGlvbkxpc3Q9W107Zm9yKHZhciBSPVtdLHE9MCx6PXRoaXMucy5wYW5lcztxPHoubGVuZ3RoO3ErKylrPXpbcV0say5zLmR0UGFuZSYmUi5wdXNoKGsuY2xlYXJQYW5lKCkpO3JldHVybiBSfSx3LnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sdy5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihrLFMpe2s9PT12b2lkIDAmJihrPSExKSxTPT09dm9pZCAwJiYoUz0hMSksdGhpcy5kb20uZW1wdHlNZXNzYWdlLmRldGFjaCgpLGs9PT0hMSYmdGhpcy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIEI9W10sTD0wLFI9dGhpcy5zLnBhbmVzO0w8Ui5sZW5ndGg7TCsrKXt2YXIgcT1SW0xdOyhrPT09ITF8fHEucy5pbmRleD09PWspJiYocS5jbGVhckRhdGEoKSxxLnJlYnVpbGRQYW5lKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJEYXRhOnZvaWQgMCxTKSx0aGlzLmRvbS5wYW5lcy5hcHBlbmQocS5kb20uY29udGFpbmVyKSxCLnB1c2gocSkpfXJldHVybiB0aGlzLl91cGRhdGVTZWxlY3Rpb24oKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLHRoaXMuX2F0dGFjaFBhbmVDb250YWluZXIoKSx0aGlzLl9pbml0U2VsZWN0aW9uTGlzdGVuZXJzKCExKSx0aGlzLnMuZHQuZHJhdyghUyksdGhpcy5yZXNpemVQYW5lcygpLEIubGVuZ3RoPT09MT9CWzBdOkJ9LHcucHJvdG90eXBlLnJlc2l6ZVBhbmVzPWZ1bmN0aW9uKCl7dmFyIGs7aWYodGhpcy5jLmxheW91dD09PSJhdXRvIil7Zm9yKHZhciBTPWgodGhpcy5zLmR0LnNlYXJjaFBhbmVzLmNvbnRhaW5lcigpKS53aWR0aCgpLEI9TWF0aC5mbG9vcihTL3RoaXMucy5taW5QYW5lV2lkdGgpLEw9MSxSPTAscT1bXSx6PTAsRz10aGlzLnMucGFuZXM7ejxHLmxlbmd0aDt6Kyspaz1HW3pdLGsucy5kaXNwbGF5ZWQmJnEucHVzaChrLnMuaW5kZXgpO3ZhciBudD1xLmxlbmd0aDtpZihCPT09bnQpTD1CO2Vsc2UgZm9yKHZhciB0dD1CO3R0PjE7dHQtLSl7dmFyIGV0PW50JXR0O2lmKGV0PT09MCl7TD10dCxSPTA7YnJlYWt9ZWxzZSBldD5SJiYoTD10dCxSPWV0KX12YXIgd3Q9UiE9PTA/cS5zbGljZShxLmxlbmd0aC1SLHEubGVuZ3RoKTpbXTt0aGlzLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihrdCl7a3Qucy5kaXNwbGF5ZWQmJmt0LnJlc2l6ZSgiY29sdW1ucy0iKyh3dC5pbmNsdWRlcyhrdC5zLmluZGV4KT9SOkwpKX0pfWVsc2UgZm9yKHZhciBTdD0wLFR0PXRoaXMucy5wYW5lcztTdDxUdC5sZW5ndGg7U3QrKylrPVR0W1N0XSxrLmFkanVzdFRvcFJvdygpO3JldHVybiB0aGlzfSx3LnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihrKXt9LHcucHJvdG90eXBlLl9zZXJ2ZXJUb3RhbHM9ZnVuY3Rpb24oKXt9LHcucHJvdG90eXBlLl9zZXRYSFI9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sQj1mdW5jdGlvbihMKXtMJiZMLnNlYXJjaFBhbmVzJiZMLnNlYXJjaFBhbmVzLm9wdGlvbnMmJihrLnMuc2VydmVyRGF0YT1MLGsucy5zZXJ2ZXJEYXRhLnRhYmxlTGVuZ3RoPUwucmVjb3Jkc1RvdGFsLGsuX3NlcnZlclRvdGFscygpKX07dGhpcy5zLmR0Lm9uKCJ4aHIuZHRzcHMiLGZ1bmN0aW9uKEwsUixxKXtTPT09UiYmQihxKX0pLEIodGhpcy5zLmR0LmFqYXguanNvbigpKX0sdy5wcm90b3R5cGUuX3N0YXRlTG9hZExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcyxTPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO3RoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c3BzIixmdW5jdGlvbihCLEwsUil7aWYoIShSLnNlYXJjaFBhbmVzPT09dm9pZCAwfHxMIT09Uykpe2lmKGsuY2xlYXJTZWxlY3Rpb25zKCksay5zLnNlbGVjdGlvbkxpc3Q9Ui5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P1Iuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpbXSxSLnNlYXJjaFBhbmVzLnBhbmVzKWZvcih2YXIgcT0wLHo9Ui5zZWFyY2hQYW5lcy5wYW5lcztxPHoubGVuZ3RoO3ErKylmb3IodmFyIEc9eltxXSxudD0wLHR0PWsucy5wYW5lcztudDx0dC5sZW5ndGg7bnQrKyl7dmFyIGV0PXR0W250XTtHLmlkPT09ZXQucy5pbmRleCYmZXQucy5kdFBhbmUmJihldC5kb20uc2VhcmNoQm94LnZhbChHLnNlYXJjaFRlcm0pLGV0LnMuZHRQYW5lLm9yZGVyKEcub3JkZXIpKX1rLl9tYWtlU2VsZWN0aW9ucyhrLnMuc2VsZWN0aW9uTGlzdCl9fSl9LHcucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnMuc2VsZWN0aW9uTGlzdD1bXTtmb3IodmFyIGs9MCxTPXRoaXMucy5wYW5lcztrPFMubGVuZ3RoO2srKyl7dmFyIEI9U1trXTtpZihCLnMuZHRQYW5lKXt2YXIgTD1CLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oUil7cmV0dXJuIFIuZmlsdGVyfSk7TC5sZW5ndGgmJnRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpCLnMuaW5kZXgscm93czpMfSl9fX0sdy5wcm90b3R5cGUuX2F0dGFjaD1mdW5jdGlvbigpe3ZhciBrPXRoaXM7dGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLmRldGFjaCgpLmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5jLmNsZWFyJiZ0aGlzLmRvbS5jbGVhckFsbC5hcHBlbmRUbyh0aGlzLmRvbS50aXRsZVJvdykub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtyZXR1cm4gay5jbGVhclNlbGVjdGlvbnMoKX0pLHRoaXMuYy5jb2xsYXBzZSYmKHRoaXMuZG9tLnNob3dBbGwuYXBwZW5kVG8odGhpcy5kb20udGl0bGVSb3cpLHRoaXMuZG9tLmNvbGxhcHNlQWxsLmFwcGVuZFRvKHRoaXMuZG9tLnRpdGxlUm93KSx0aGlzLl9zZXRDb2xsYXBzZUxpc3RlbmVyKCkpO2Zvcih2YXIgUz0wLEI9dGhpcy5zLnBhbmVzO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO3RoaXMuZG9tLnBhbmVzLmFwcGVuZChMLmRvbS5jb250YWluZXIpfXRoaXMuZG9tLmNvbnRhaW5lci50ZXh0KCIiKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSkuYXBwZW5kKHRoaXMuZG9tLnRpdGxlUm93KS5hcHBlbmQodGhpcy5kb20ucGFuZXMpLHRoaXMucy5wYW5lcy5mb3JFYWNoKGZ1bmN0aW9uKFIpe3JldHVybiBSLnNldExpc3RlbmVycygpfSksaCgiZGl2LiIrdGhpcy5jbGFzc2VzLmNvbnRhaW5lcikubGVuZ3RoPT09MCYmdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmRUbyh0aGlzLnMuZHQpfSx3LnByb3RvdHlwZS5fYXR0YWNoTWVzc2FnZT1mdW5jdGlvbigpe3ZhciBrO3RyeXtrPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5lbXB0eVBhbmVzIix0aGlzLmMuaTE4bi5lbXB0eVBhbmVzKX1jYXRjaHtrPW51bGx9aWYoaz09PW51bGwpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLHRoaXMuZG9tLnRpdGxlUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRlKSx0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuaHRtbChrKS5hcHBlbmRUbyh0aGlzLmRvbS5jb250YWluZXIpfSx3LnByb3RvdHlwZS5fYXR0YWNoUGFuZUNvbnRhaW5lcj1mdW5jdGlvbigpe2Zvcih2YXIgaz0wLFM9dGhpcy5zLnBhbmVzO2s8Uy5sZW5ndGg7aysrKXt2YXIgQj1TW2tdO2lmKEIucy5kaXNwbGF5ZWQ9PT0hMCl7dGhpcy5fYXR0YWNoKCk7cmV0dXJufX10aGlzLl9hdHRhY2hNZXNzYWdlKCl9LHcucHJvdG90eXBlLl9jaGVja0NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPSEwLFM9ITAsQj0wLEw9dGhpcy5zLnBhbmVzO0I8TC5sZW5ndGg7QisrKXt2YXIgUj1MW0JdO1Iucy5kaXNwbGF5ZWQmJihSLmRvbS5jb2xsYXBzZUJ1dHRvbi5oYXNDbGFzcyhSLmNsYXNzZXMucm90YXRlZCk/KHRoaXMuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLFM9ITEpOih0aGlzLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksaz0hMSkpfWsmJnRoaXMuZG9tLmNvbGxhcHNlQWxsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksUyYmdGhpcy5kb20uc2hvd0FsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpfSx3LnByb3RvdHlwZS5fY2hlY2tNZXNzYWdlPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsUz10aGlzLnMucGFuZXM7azxTLmxlbmd0aDtrKyspe3ZhciBCPVNba107aWYoQi5zLmRpc3BsYXllZD09PSEwKXt0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuZGV0YWNoKCksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn19dGhpcy5fYXR0YWNoTWVzc2FnZSgpfSx3LnByb3RvdHlwZS5fY29sbGFwc2VBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIGs9MCxTPXRoaXMucy5wYW5lcztrPFMubGVuZ3RoO2srKyl7dmFyIEI9U1trXTtCLmNvbGxhcHNlKCl9fSx3LnByb3RvdHlwZS5fZmluZFBhbmU9ZnVuY3Rpb24oayl7Zm9yKHZhciBTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107aWYoaz09PUwucy5uYW1lKXJldHVybiBMfX0sdy5wcm90b3R5cGUuX2dldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpO2smJmsuc2VhcmNoUGFuZXMmJmsuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PWsuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCl9LHcucHJvdG90eXBlLl9tYWtlU2VsZWN0aW9ucz1mdW5jdGlvbihrKXtmb3IodmFyIFM9MCxCPWs7UzxCLmxlbmd0aDtTKyspe2Zvcih2YXIgTD1CW1NdLFI9dm9pZCAwLHE9MCx6PXRoaXMucy5wYW5lcztxPHoubGVuZ3RoO3ErKyl7dmFyIEc9eltxXTtpZihHLnMuaW5kZXg9PT1MLmNvbHVtbil7Uj1HO2JyZWFrfX1pZihSJiZSLnMuZHRQYW5lKXtmb3IodmFyIG50PTA7bnQ8Ui5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg7bnQrKylMLnJvd3MuaW5jbHVkZXModHlwZW9mIFIucy5kdFBhbmUucm93KG50KS5kYXRhKCkuZmlsdGVyPT0iZnVuY3Rpb24iP1Iucy5kdFBhbmUuY2VsbChudCwwKS5kYXRhKCk6Ui5zLmR0UGFuZS5yb3cobnQpLmRhdGEoKS5maWx0ZXIpJiZSLnMuZHRQYW5lLnJvdyhudCkuc2VsZWN0KCk7Ui51cGRhdGVUYWJsZSgpfX19LHcucHJvdG90eXBlLl9wYW5lRGVjbGFyZT1mdW5jdGlvbihrLFMsQil7dmFyIEw9dGhpcztrLmNvbHVtbnModGhpcy5jLmNvbHVtbnMubGVuZ3RoPjA/dGhpcy5jLmNvbHVtbnM6dm9pZCAwKS5lcSgwKS5lYWNoKGZ1bmN0aW9uKEcpe0wucy5wYW5lcy5wdXNoKG5ldyBMLnMucGFuZUNsYXNzKFMsQixHLEwuZG9tLnBhbmVzKSl9KTtmb3IodmFyIFI9ay5jb2x1bW5zKCkuZXEoMCkudG9BcnJheSgpLmxlbmd0aCxxPTA7cTx0aGlzLmMucGFuZXMubGVuZ3RoO3ErKyl7dmFyIHo9UitxO3RoaXMucy5wYW5lcy5wdXNoKG5ldyB0aGlzLnMucGFuZUNsYXNzKFMsQix6LHRoaXMuZG9tLnBhbmVzLHRoaXMuYy5wYW5lc1txXSkpfXRoaXMuYy5vcmRlci5sZW5ndGg+MCYmKHRoaXMucy5wYW5lcz10aGlzLmMub3JkZXIubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBMLl9maW5kUGFuZShHKX0pKSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT90aGlzLl9zdGFydHVwKGspOl8udmVyc2lvbkNoZWNrKCIyIik/dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Jbml0Q29tcGxldGUucHVzaChmdW5jdGlvbigpe3JldHVybiBMLl9zdGFydHVwKGspfSk6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Jbml0Q29tcGxldGUucHVzaCh7Zm46ZnVuY3Rpb24oKXtyZXR1cm4gTC5fc3RhcnR1cChrKX19KX0sdy5wcm90b3R5cGUuX3NldENvbGxhcHNlTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgaz10aGlzO3RoaXMuZG9tLmNvbGxhcHNlQWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7ay5fY29sbGFwc2VBbGwoKSxrLmRvbS5jb2xsYXBzZUFsbC5hZGRDbGFzcyhrLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLGsuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLGsucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLmRvbS5zaG93QWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7ay5fc2hvd0FsbCgpLGsuZG9tLnNob3dBbGwuYWRkQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKSxrLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyhrLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksay5zLmR0LnN0YXRlLnNhdmUoKX0pO2Zvcih2YXIgUz0wLEI9dGhpcy5zLnBhbmVzO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO0wuZG9tLnRvcFJvdy5vZmYoImNvbGxhcHNlLmR0c3BzIikub24oImNvbGxhcHNlLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBrLl9jaGVja0NvbGxhcHNlKCl9KX10aGlzLl9jaGVja0NvbGxhcHNlKCl9LHcucHJvdG90eXBlLl9zaG93QWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsUz10aGlzLnMucGFuZXM7azxTLmxlbmd0aDtrKyspe3ZhciBCPVNba107Qi5zaG93KCl9fSx3LnByb3RvdHlwZS5fc3RhcnR1cD1mdW5jdGlvbihrKXt2YXIgUz10aGlzO3RoaXMuX2F0dGFjaCgpLHRoaXMuZG9tLnBhbmVzLmVtcHR5KCk7Zm9yKHZhciBCPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLEw9MCxSPXRoaXMucy5wYW5lcztMPFIubGVuZ3RoO0wrKyl7dmFyIHE9UltMXTtxLnJlYnVpbGRQYW5lKE9iamVjdC5rZXlzKHRoaXMucy5zZXJ2ZXJEYXRhKS5sZW5ndGg+MD90aGlzLnMuc2VydmVyRGF0YTp2b2lkIDApLHRoaXMuZG9tLnBhbmVzLmFwcGVuZChxLmRvbS5jb250YWluZXIpfXRoaXMuYy5sYXlvdXQ9PT0iYXV0byImJnRoaXMucmVzaXplUGFuZXMoKTt2YXIgej10aGlzLnMuZHQuc3RhdGUubG9hZGVkKCk7IXRoaXMucy5zdGF0ZVJlYWQmJnomJnRoaXMucy5kdC5wYWdlKHouc3RhcnQvdGhpcy5zLmR0LnBhZ2UubGVuKCkpLmRyYXcoInBhZ2UiKSx0aGlzLnMuc3RhdGVSZWFkPSEwLHRoaXMuX2NoZWNrTWVzc2FnZSgpLGsub24oInByZURyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7IVMucy51cGRhdGluZyYmIVMucy5wYWdpbmcmJihTLl91cGRhdGVGaWx0ZXJDb3VudCgpLFMuX3VwZGF0ZVNlbGVjdGlvbigpKSxTLnMucGFnaW5nPSExfSksaCh3aW5kb3cpLm9uKCJyZXNpemUuZHRzcHMiLF8udXRpbC50aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBTLnJlc2l6ZVBhbmVzKCl9KSksdGhpcy5zLmR0Lm9uKCJzdGF0ZVNhdmVQYXJhbXMuZHRzcHMiLGZ1bmN0aW9uKG50LHR0LGV0KXt0dD09PUImJihldC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKGV0LnNlYXJjaFBhbmVzPXt9KSxldC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0PVMucy5zZWxlY3Rpb25MaXN0KX0pLHRoaXMuX3N0YXRlTG9hZExpc3RlbmVyKCksay5vZmYoInBhZ2UuZHRzcHMgcGFnZS1uYy5kdHNwcyIpLm9uKCJwYWdlLmR0c3BzIHBhZ2UtbmMuZHRzcHMiLGZ1bmN0aW9uKG50LHR0KXtTLnMucGFnaW5nPSEwLFMucy5wYWdpbmdTVD0hMCxTLnMucGFnZT1TLnMuZHQucGFnZSgpfSksdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGU/ay5vZmYoInByZVhoci5kdHNwcyIpLm9uKCJwcmVYaHIuZHRzcHMiLGZ1bmN0aW9uKG50LHR0LGV0KXtpZih0dD09PUIpe2V0LnNlYXJjaFBhbmVzfHwoZXQuc2VhcmNoUGFuZXM9e30pLGV0LnNlYXJjaFBhbmVzX251bGx8fChldC5zZWFyY2hQYW5lc19udWxsPXt9KTtmb3IodmFyIHd0PTAsU3Q9MCxUdD1TLnMucGFuZXM7U3Q8VHQubGVuZ3RoO1N0Kyspe3ZhciBrdD1UdFtTdF0sTHQ9Uy5zLmR0LmNvbHVtbihrdC5zLmluZGV4KS5kYXRhU3JjKCk7aWYoZXQuc2VhcmNoUGFuZXNbTHRdfHwoZXQuc2VhcmNoUGFuZXNbTHRdPXt9KSxldC5zZWFyY2hQYW5lc19udWxsW0x0XXx8KGV0LnNlYXJjaFBhbmVzX251bGxbTHRdPXt9KSxrdC5zLmR0UGFuZSlmb3IodmFyIEJ0PWt0LnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSwkdD0wOyR0PEJ0Lmxlbmd0aDskdCsrKWV0LnNlYXJjaFBhbmVzW0x0XVskdF09QnRbJHRdLmZpbHRlcixldC5zZWFyY2hQYW5lc1tMdF1bJHRdP2V0LnNlYXJjaFBhbmVzX251bGxbTHRdWyR0XT0hMTpldC5zZWFyY2hQYW5lc19udWxsW0x0XVskdF09ITAsd3QrK313dD4wJiYod3QhPT1TLnMuZmlsdGVyQ291bnQ/KGV0LnN0YXJ0PTAsUy5zLnBhZ2U9MCk6ZXQuc3RhcnQ9Uy5zLnBhZ2UqUy5zLmR0LnBhZ2UubGVuKCksUy5zLmR0LnBhZ2UoUy5zLnBhZ2UpLFMucy5maWx0ZXJDb3VudD13dCksUy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJihldC5zZWFyY2hQYW5lc0xhc3Q9Uy5zLmR0LmNvbHVtbihTLnMuc2VsZWN0aW9uTGlzdFtTLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGgtMV0uY29sdW1uKS5kYXRhU3JjKCkpLGV0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Uy5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Uy5jLnZpZXdDb3VudCx2aWV3VG90YWw6Uy5jLnZpZXdUb3RhbH19fSk6ay5vbigicHJlWGhyLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBTLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihudCl7cmV0dXJuIG50LmNsZWFyRGF0YSgpfSl9KSx0aGlzLnMuZHQub24oInhoci5kdHNwcyIsZnVuY3Rpb24obnQsdHQpe2lmKHR0Lm5UYWJsZT09PVMucy5kdC50YWJsZSgpLm5vZGUoKSYmIVMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgZXQ9ITE7Uy5zLmR0Lm9uZSgicHJlRHJhdy5kdHNwcyIsZnVuY3Rpb24oKXtpZighZXQpe3ZhciB3dD1TLnMuZHQucGFnZSgpO2V0PSEwLFMucy51cGRhdGluZz0hMCxTLmRvbS5wYW5lcy5lbXB0eSgpO2Zvcih2YXIgU3Q9MCxUdD1TLnMucGFuZXM7U3Q8VHQubGVuZ3RoO1N0Kyspe3ZhciBrdD1UdFtTdF07a3QuY2xlYXJEYXRhKCksa3QucmVidWlsZFBhbmUodm9pZCAwLCEwKSxTLmRvbS5wYW5lcy5hcHBlbmQoa3QuZG9tLmNvbnRhaW5lcil9Uy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fFMucy5kdC5kcmF3KCksUy5zLnVwZGF0aW5nPSExLFMuX3VwZGF0ZVNlbGVjdGlvbigpLFMuX2NoZWNrTWVzc2FnZSgpLFMucy5kdC5vbmUoImRyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7Uy5zLnVwZGF0aW5nPSEwLFMucy5kdC5wYWdlKHd0KS5kcmF3KCExKSxTLnMudXBkYXRpbmc9ITF9KX19KX19KTt2YXIgRz10aGlzLmMucHJlU2VsZWN0O3omJnouc2VhcmNoUGFuZXMmJnouc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKEc9ei5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0KSx0aGlzLl9tYWtlU2VsZWN0aW9ucyhHKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLGsub24oImRlc3Ryb3kuZHRzcHMiLGZ1bmN0aW9uKG50LHR0KXtpZih0dD09PUIpe2Zvcih2YXIgZXQ9MCx3dD1TLnMucGFuZXM7ZXQ8d3QubGVuZ3RoO2V0Kyspe3ZhciBTdD13dFtldF07U3QuZGVzdHJveSgpfWsub2ZmKCIuZHRzcHMiKSxTLmRvbS5zaG93QWxsLm9mZigiLmR0c3BzIiksUy5kb20uY2xlYXJBbGwub2ZmKCIuZHRzcHMiKSxTLmRvbS5jb2xsYXBzZUFsbC5vZmYoIi5kdHNwcyIpLGgoay50YWJsZSgpLm5vZGUoKSkub2ZmKCIuZHRzcHMiKSxTLmRvbS5jb250YWluZXIuZGV0YWNoKCksUy5jbGVhclNlbGVjdGlvbnMoKX19KSx0aGlzLmMuY29sbGFwc2UmJnRoaXMuX3NldENvbGxhcHNlTGlzdGVuZXIoKSx0aGlzLmMuY2xlYXImJnRoaXMuZG9tLmNsZWFyQWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7cmV0dXJuIFMuY2xlYXJTZWxlY3Rpb25zKCl9KSxCLl9zZWFyY2hQYW5lcz10aGlzLHRoaXMucy5kdC5zdGF0ZS5zYXZlKCl9LHcucHJvdG90eXBlLl91cGRhdGVGaWx0ZXJDb3VudD1mdW5jdGlvbigpe2Zvcih2YXIgaz0wLFM9MCxCPTAsTD10aGlzLnMucGFuZXM7QjxMLmxlbmd0aDtCKyspe3ZhciBSPUxbQl07Ui5zLmR0UGFuZSYmKGsrPVIuZ2V0UGFuZUNvdW50KCksUi5zLmR0UGFuZS5zZWFyY2goKSYmUysrKX10aGlzLmRvbS50aXRsZS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy50aXRsZSIsdGhpcy5jLmkxOG4udGl0bGUsaykpLHRoaXMuYy5maWx0ZXJDaGFuZ2VkJiZ0eXBlb2YgdGhpcy5jLmZpbHRlckNoYW5nZWQ9PSJmdW5jdGlvbiImJnRoaXMuYy5maWx0ZXJDaGFuZ2VkLmNhbGwodGhpcy5zLmR0LGspLGs9PT0wJiZTPT09MD90aGlzLmRvbS5jbGVhckFsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpOnRoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKX0sdy52ZXJzaW9uPSIyLjMuMiIsdy5jbGFzc2VzPXtjbGVhcjoiZHRzcC1jbGVhciIsY2xlYXJBbGw6ImR0c3AtY2xlYXJBbGwiLGNvbGxhcHNlQWxsOiJkdHNwLWNvbGxhcHNlQWxsIixjb250YWluZXI6ImR0c3Atc2VhcmNoUGFuZXMiLGRpc2FibGVkQnV0dG9uOiJkdHNwLWRpc2FibGVkQnV0dG9uIixlbXB0eU1lc3NhZ2U6ImR0c3AtZW1wdHlNZXNzYWdlIixoaWRlOiJkdHNwLWhpZGRlbiIscGFuZXM6ImR0c3AtcGFuZXNDb250YWluZXIiLHNlYXJjaDoiZHRzcC1zZWFyY2giLHNob3dBbGw6ImR0c3Atc2hvd0FsbCIsdGl0bGU6ImR0c3AtdGl0bGUiLHRpdGxlUm93OiJkdHNwLXRpdGxlUm93In0sdy5kZWZhdWx0cz17Y2FzY2FkZVBhbmVzOiExLGNsZWFyOiEwLGNvbGxhcHNlOiEwLGNvbHVtbnM6W10sY29udGFpbmVyOmZ1bmN0aW9uKGspe3JldHVybiBrLnRhYmxlKCkuY29udGFpbmVyKCl9LGZpbHRlckNoYW5nZWQ6dm9pZCAwLGkxOG46e2NsZWFyTWVzc2FnZToiQ2xlYXIgQWxsIixjbGVhclBhbmU6IiZ0aW1lczsiLGNvbGxhcHNlOnswOiJTZWFyY2hQYW5lcyIsXzoiU2VhcmNoUGFuZXMgKCVkKSJ9LGNvbGxhcHNlTWVzc2FnZToiQ29sbGFwc2UgQWxsIixjb3VudDoie3RvdGFsfSIsZW1wdHlNZXNzYWdlOiI8ZW0+Tm8gZGF0YTwvZW0+IixlbXB0eVBhbmVzOiJObyBTZWFyY2hQYW5lcyIsbG9hZE1lc3NhZ2U6IkxvYWRpbmcgU2VhcmNoIFBhbmVzLi4uIixzaG93TWVzc2FnZToiU2hvdyBBbGwiLHRpdGxlOiJGaWx0ZXJzIEFjdGl2ZSAtICVkIn0sbGF5b3V0OiJhdXRvIixvcmRlcjpbXSxwYW5lczpbXSxwcmVTZWxlY3Q6W10sdmlld0NvdW50OiEwLHZpZXdUb3RhbDohMX0sd30oKSxmPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksVT1mdW5jdGlvbih3KXtmKGssdyk7ZnVuY3Rpb24gayhTLEIsTCl7TD09PXZvaWQgMCYmKEw9ITEpO3ZhciBSPXRoaXMscTtCLmNhc2NhZGVQYW5lcyYmQi52aWV3VG90YWw/cT1sOkIuY2FzY2FkZVBhbmVzP3E9eTpCLnZpZXdUb3RhbCYmKHE9YiksUj13LmNhbGwodGhpcyxTLEIsTCxxKXx8dGhpczt2YXIgej1SLnMuZHQsRz16LnN0YXRlLmxvYWRlZCgpLG50PWZ1bmN0aW9uKCl7cmV0dXJuIFIuX2luaXRTZWxlY3Rpb25MaXN0ZW5lcnMoITAsRyYmRy5zZWFyY2hQYW5lcyYmRy5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P0cuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpSLmMucHJlU2VsZWN0KX07cmV0dXJuIHouc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT9udCgpOnoub2ZmKCJpbml0LmR0c3BzIikub24oImluaXQuZHRzcHMiLG50KSxSfXJldHVybiBrLnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihTLEIpe1M9PT12b2lkIDAmJihTPSEwKSxCPT09dm9pZCAwJiYoQj1bXSksUyYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PUIpO2Zvcih2YXIgTD0wLFI9dGhpcy5zLnBhbmVzO0w8Ui5sZW5ndGg7TCsrKXt2YXIgcT1SW0xdO3Eucy5kaXNwbGF5ZWQmJnEucy5kdFBhbmUub2ZmKCJzZWxlY3QuZHRzcCIpLm9uKCJzZWxlY3QuZHRzcCIsdGhpcy5fdXBkYXRlKHEpKS5vZmYoImRlc2VsZWN0LmR0c3AiKS5vbigiZGVzZWxlY3QuZHRzcCIsdGhpcy5fdXBkYXRlVGltZW91dChxKSl9dGhpcy5zLmR0Lm9mZigiZHJhdy5kdHNwcyIpLm9uKCJkcmF3LmR0c3BzIix0aGlzLl91cGRhdGUoKSksdGhpcy5fdXBkYXRlU2VsZWN0aW9uTGlzdCgpfSxrLnByb3RvdHlwZS5fc2VydmVyVG90YWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107aWYoTC5zLmNvbE9wdHMuc2hvdyl7dmFyIFI9dGhpcy5zLmR0LmNvbHVtbihMLnMuaW5kZXgpLmRhdGFTcmMoKSxxPSEwO2lmKHRoaXMucy5zZXJ2ZXJEYXRhLnNlYXJjaFBhbmVzLm9wdGlvbnNbUl0pZm9yKHZhciB6PTAsRz10aGlzLnMuc2VydmVyRGF0YS5zZWFyY2hQYW5lcy5vcHRpb25zW1JdO3o8Ry5sZW5ndGg7eisrKXt2YXIgbnQ9R1t6XTtpZihudC50b3RhbCE9PW50LmNvdW50KXtxPSExO2JyZWFrfX1MLnMuZmlsdGVyaW5nQWN0aXZlPSFxLEwuX3NlcnZlclBvcHVsYXRlKHRoaXMucy5zZXJ2ZXJEYXRhKX19fSxrLnByb3RvdHlwZS5fc3RhdGVMb2FkTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLEI9ZnVuY3Rpb24oTCxSLHEpe2lmKHEuc2VhcmNoUGFuZXMhPT12b2lkIDApe2lmKFMucy5zZWxlY3Rpb25MaXN0PXEuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdD9xLnNlYXJjaFBhbmVzLnNlbGVjdGlvbkxpc3Q6W10scS5zZWFyY2hQYW5lcy5wYW5lcylmb3IodmFyIHo9MCxHPXEuc2VhcmNoUGFuZXMucGFuZXM7ejxHLmxlbmd0aDt6KyspZm9yKHZhciBudD1HW3pdLHR0PTAsZXQ9Uy5zLnBhbmVzO3R0PGV0Lmxlbmd0aDt0dCsrKXt2YXIgd3Q9ZXRbdHRdO250LmlkPT09d3Qucy5pbmRleCYmd3Qucy5kdFBhbmUmJih3dC5kb20uc2VhcmNoQm94LnZhbChudC5zZWFyY2hUZXJtKSx3dC5zLmR0UGFuZS5vcmRlcihudC5vcmRlcikpfVMuX3VwZGF0ZVNlbGVjdGlvbkxpc3QoKX19O3RoaXMucy5kdC5vZmYoInN0YXRlTG9hZFBhcmFtcy5kdHNwcyIsQikub24oInN0YXRlTG9hZFBhcmFtcy5kdHNwcyIsQil9LGsucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt9LGsucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oUyl7dmFyIEI9dGhpcztyZXR1cm4gUz09PXZvaWQgMCYmKFM9dm9pZCAwKSxmdW5jdGlvbigpe1MmJmNsZWFyVGltZW91dChTLnMuZGVzZWxlY3RUaW1lb3V0KSxCLl91cGRhdGVTZWxlY3Rpb25MaXN0KFMpfX0say5wcm90b3R5cGUuX3VwZGF0ZVRpbWVvdXQ9ZnVuY3Rpb24oUyl7dmFyIEI9dGhpcztyZXR1cm4gUz09PXZvaWQgMCYmKFM9dm9pZCAwKSxmdW5jdGlvbigpe3JldHVybiBTP1Mucy5kZXNlbGVjdFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBCLl91cGRhdGVTZWxlY3Rpb25MaXN0KFMpfSw1MCk6Qi5fdXBkYXRlU2VsZWN0aW9uTGlzdCgpfX0say5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbkxpc3Q9ZnVuY3Rpb24oUyl7aWYoUz09PXZvaWQgMCYmKFM9dm9pZCAwKSx0aGlzLnMucGFnaW5nU1Qpe3RoaXMucy5wYWdpbmdTVD0hMTtyZXR1cm59ZWxzZSBpZih0aGlzLnMudXBkYXRpbmd8fFMmJlMucy5zZXJ2ZXJTZWxlY3RpbmcpcmV0dXJuO2lmKFMhPT12b2lkIDApe3RoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZTLl91cGRhdGVTZWxlY3Rpb24oKTt2YXIgQj1TLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEwuZmlsdGVyfSk7dGhpcy5zLnNlbGVjdGlvbkxpc3Q9dGhpcy5zLnNlbGVjdGlvbkxpc3QuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBMLmNvbHVtbiE9PVMucy5pbmRleH0pLEIubGVuZ3RoPjA/KHRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpTLnMuaW5kZXgscm93czpCfSksUy5kb20uY2xlYXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpKTpTLmRvbS5jbGVhci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMuZHQuZHJhdyghMSl9dGhpcy5fcmVtYWtlU2VsZWN0aW9ucygpLHRoaXMuX3VwZGF0ZUZpbHRlckNvdW50KCl9LGsucHJvdG90eXBlLl9yZW1ha2VTZWxlY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIFMsQjtpZih0aGlzLnMudXBkYXRpbmc9ITAsdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMucy5zZWxlY3Rpb25MaXN0Lmxlbmd0aD4wJiYoQj10aGlzLnMucGFuZXNbdGhpcy5zLnNlbGVjdGlvbkxpc3RbdGhpcy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoLTFdLmNvbHVtbl0pO2Zvcih2YXIgQ3Q9MCx4dD10aGlzLnMucGFuZXM7Q3Q8eHQubGVuZ3RoO0N0KyspUz14dFtDdF0sUy5zLmRpc3BsYXllZCYmKCFCfHxTLnMuaW5kZXghPT1CLnMuaW5kZXgpJiZTLnVwZGF0ZVJvd3MoKX1lbHNle3ZhciBMPXRoaXMucy5zZWxlY3Rpb25MaXN0LFI9ITE7dGhpcy5jbGVhclNlbGVjdGlvbnMoKSx0aGlzLnMuZHQuZHJhdyghMSksdGhpcy5zLmR0LnJvd3MoKS50b0FycmF5KClbMF0ubGVuZ3RoPnRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkudG9BcnJheSgpWzBdLmxlbmd0aCYmKFI9ITApLHRoaXMucy5zZWxlY3Rpb25MaXN0PUw7Zm9yKHZhciBxPTAsej10aGlzLnMucGFuZXM7cTx6Lmxlbmd0aDtxKyspQj16W3FdLEIucy5kaXNwbGF5ZWQmJihCLnMuZmlsdGVyaW5nQWN0aXZlPVIsQi51cGRhdGVSb3dzKCkpO2Zvcih2YXIgRz0wLG50PXRoaXMucy5zZWxlY3Rpb25MaXN0O0c8bnQubGVuZ3RoO0crKyl7dmFyIHR0PW50W0ddO0I9bnVsbDtmb3IodmFyIGV0PTAsd3Q9dGhpcy5zLnBhbmVzO2V0PHd0Lmxlbmd0aDtldCsrKXt2YXIgU3Q9d3RbZXRdO2lmKFN0LnMuaW5kZXg9PT10dC5jb2x1bW4pe0I9U3Q7YnJlYWt9fWlmKEIucy5kdFBhbmUpe2Zvcih2YXIgVHQ9Qi5zLmR0UGFuZS5yb3dzKCkuaW5kZXhlcygpLnRvQXJyYXkoKSxrdD0wO2t0PHR0LnJvd3MubGVuZ3RoO2t0Kyspe2Zvcih2YXIgTHQ9ITEsQnQ9MCwkdD1UdDtCdDwkdC5sZW5ndGg7QnQrKyl7dmFyIEt0PSR0W0J0XSxEPUIucy5kdFBhbmUucm93KEt0KSx1dD1ELmRhdGEoKTt0dC5yb3dzW2t0XT09PXV0LmZpbHRlciYmKEQuc2VsZWN0KCksTHQ9ITApfUx0fHwodHQucm93cy5zcGxpY2Uoa3QsMSksa3QtLSl9aWYoQi5zLnNlbGVjdGlvbnM9dHQucm93cyx0dC5yb3dzLmxlbmd0aCE9PTApe3RoaXMucy5kdC5kcmF3KCk7Zm9yKHZhciBvdD0hMSxWPTAsaj0wLEs9MCxwdD0wLHZ0PXRoaXMucy5wYW5lcztwdDx2dC5sZW5ndGg7cHQrKylTPXZ0W3B0XSxTLnMuZHRQYW5lJiYoVis9Uy5nZXRQYW5lQ291bnQoKSxWPmomJihLKyssaj1WKSk7b3Q9Vj4wO2Zvcih2YXIgcnQ9MCxndD10aGlzLnMucGFuZXM7cnQ8Z3QubGVuZ3RoO3J0KyspUz1ndFtydF0sUy5zLmRpc3BsYXllZCYmKFJ8fEIucy5pbmRleCE9PVMucy5pbmRleHx8IW90P1Mucy5maWx0ZXJpbmdBY3RpdmU9b3R8fFI6Sz09PTEmJihTLnMuZmlsdGVyaW5nQWN0aXZlPSExKSxTLnMuaW5kZXghPT1CLnMuaW5kZXgmJlMudXBkYXRlUm93cygpKX19fXRoaXMucy5kdC5kcmF3KCExKX10aGlzLnMudXBkYXRpbmc9ITF9LGt9KE8pO24oWmUpLEYoWmUpLHAoWmUpLEMoWmUpLGMoWmUpO3ZhciBYPVplLmZuLmRhdGFUYWJsZTtYLlNlYXJjaFBhbmVzPU8sYXQuU2VhcmNoUGFuZXM9TyxYLlNlYXJjaFBhbmVzU1Q9VSxhdC5TZWFyY2hQYW5lc1NUPVUsWC5TZWFyY2hQYW5lPXIsYXQuU2VhcmNoUGFuZT1yLFguU2VhcmNoUGFuZVZpZXdUb3RhbD1iLGF0LlNlYXJjaFBhbmVWaWV3VG90YWw9YixYLlNlYXJjaFBhbmVDYXNjYWRlPXksYXQuU2VhcmNoUGFuZUNhc2NhZGU9eSxYLlNlYXJjaFBhbmVDYXNjYWRlVmlld1RvdGFsPWwsYXQuU2VhcmNoUGFuZUNhc2NhZGVWaWV3VG90YWw9bDt2YXIgUT1aZS5mbi5kYXRhVGFibGUuQXBpLnJlZ2lzdGVyO1EoInNlYXJjaFBhbmVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxRKCJzZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHcpe3cuX3NlYXJjaFBhbmVzJiZ3Ll9zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0pfSksUSgic2VhcmNoUGFuZXMucmVidWlsZFBhbmUoKSIsZnVuY3Rpb24odyxrKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKFMpe1MuX3NlYXJjaFBhbmVzJiZTLl9zZWFyY2hQYW5lcy5yZWJ1aWxkKHcsayl9KX0pLFEoInNlYXJjaFBhbmVzLnJlc2l6ZVBhbmVzKCkiLGZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5jb250ZXh0WzBdO3JldHVybiB3Ll9zZWFyY2hQYW5lcz93Ll9zZWFyY2hQYW5lcy5yZXNpemVQYW5lcygpOm51bGx9KSxRKCJzZWFyY2hQYW5lcy5jb250YWluZXIoKSIsZnVuY3Rpb24oKXt2YXIgdz10aGlzLmNvbnRleHRbMF07cmV0dXJuIHcuX3NlYXJjaFBhbmVzP3cuX3NlYXJjaFBhbmVzLmdldE5vZGUoKTpudWxsfSksYXQuZXh0LmJ1dHRvbnMuc2VhcmNoUGFuZXNDbGVhcj17YWN0aW9uOmZ1bmN0aW9uKHcsayl7ay5zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0sdGV4dDoiQ2xlYXIgUGFuZXMifSxhdC5leHQuYnV0dG9ucy5zZWFyY2hQYW5lcz17YWN0aW9uOmZ1bmN0aW9uKHcsayxTLEIpe3ZhciBMPXRoaXMsUj10aGlzO0IuX3BhbmVzPyh0aGlzLnBvcG92ZXIoQi5fcGFuZXMuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSksQi5fcGFuZXMucmVidWlsZCh2b2lkIDAsITApKToodGhpcy5wcm9jZXNzaW5nKCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RShrLFMsQiksTC5wb3BvdmVyKEIuX3BhbmVzLmdldE5vZGUoKSx7YWxpZ246ImNvbnRhaW5lciIsc3BhbjoiY29udGFpbmVyIn0pLEIuX3BhbmVzLnJlYnVpbGQodm9pZCAwLCEwKSxaZSgidGFibGUuZGF0YVRhYmxlIixCLl9wYW5lcy5nZXROb2RlKCkpLkRhdGFUYWJsZSgpLmNvbHVtbnMuYWRqdXN0KCksUi5wcm9jZXNzaW5nKCExKX0sMTApKX0saW5pdDpmdW5jdGlvbih3LGssUyl7dy5idXR0b24oaykudGV4dChTLnRleHR8fHcuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2UiLCJTZWFyY2hQYW5lcyIsMCkpLCh3LmluaXQoKS5zdGF0ZVNhdmV8fFMuZGVsYXlJbml0PT09ITEpJiZFKHcsayxTKX0sY29uZmlnOnt9LHRleHQ6IiIsZGVsYXlJbml0OiEwfTtmdW5jdGlvbiBFKHcsayxTKXt2YXIgQj1aZS5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oUil7dy5idXR0b24oaykudGV4dCh3LmkxOG4oInNlYXJjaFBhbmVzLmNvbGxhcHNlIix3LmNvbnRleHRbMF0ub0xhbmd1YWdlLnNlYXJjaFBhbmVzIT09dm9pZCAwP3cuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc2VhcmNoUGFuZXMuY29sbGFwc2U6dy5jb250ZXh0WzBdLl9zZWFyY2hQYW5lcy5jLmkxOG4uY29sbGFwc2UsUikpfX0sUy5jb25maWcpLEw9QiYmKEIuY2FzY2FkZVBhbmVzfHxCLnZpZXdUb3RhbCk/bmV3IGF0LlNlYXJjaFBhbmVzU1QodyxCKTpuZXcgYXQuU2VhcmNoUGFuZXModyxCKTt3LmJ1dHRvbihrKS50ZXh0KFMudGV4dHx8dy5pMThuKCJzZWFyY2hQYW5lcy5jb2xsYXBzZSIsTC5jLmkxOG4uY29sbGFwc2UsMCkpLFMuX3BhbmVzPUx9ZnVuY3Rpb24gJCh3LGssUyl7az09PXZvaWQgMCYmKGs9bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpO3ZhciBCPW5ldyBYLkFwaSh3KSxMPWt8fEIuaW5pdCgpLnNlYXJjaFBhbmVzfHxYLmRlZmF1bHRzLnNlYXJjaFBhbmVzLFI9TCYmKEwuY2FzY2FkZVBhbmVzfHxMLnZpZXdUb3RhbCk/bmV3IFUoQixMLFMpOm5ldyBPKEIsTCxTKSxxPVIuZ2V0Tm9kZSgpO3JldHVybiBxfVplKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHNwIixmdW5jdGlvbih3LGspe3cubmFtZXNwYWNlPT09ImR0IiYmKGsub0luaXQuc2VhcmNoUGFuZXN8fGF0LmRlZmF1bHRzLnNlYXJjaFBhbmVzKSYmKGsuX3NlYXJjaFBhbmVzfHwkKGssbnVsbCwhMCkpfSksYXQuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlAiLGZuSW5pdDokfSksYXQuZmVhdHVyZSYmYXQuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoUGFuZXMiLCQpfSkoKTt2YXIgZGQ9aWUoYWUoKSwxKTt2YXIgZW89aWUoYWUoKSwxKTt2YXIgRXQ9ZW8uZGVmYXVsdDthdC5zZWxlY3Q9e307YXQuc2VsZWN0LmNsYXNzZXM9e2NoZWNrYm94OiJkdC1zZWxlY3QtY2hlY2tib3gifTthdC5zZWxlY3QudmVyc2lvbj0iMi4wLjUiO2F0LnNlbGVjdC5pbml0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2V0dGluZ3MoKVswXTtpZighYXQudmVyc2lvbkNoZWNrKCIyIikpdGhyb3ciV2FybmluZzogU2VsZWN0IHJlcXVpcmVzIERhdGFUYWJsZXMgMiBvciBuZXdlciI7aWYoIWUuX3NlbGVjdCl7dmFyIG49dC5zdGF0ZS5sb2FkZWQoKSxyPWZ1bmN0aW9uKGMsbCxoKXtpZighKGg9PT1udWxsfHxoLnNlbGVjdD09PXZvaWQgMCkpe2lmKHQucm93cyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmdC5yb3dzKCkuZGVzZWxlY3QoKSxoLnNlbGVjdC5yb3dzIT09dm9pZCAwJiZ0LnJvd3MoaC5zZWxlY3Qucm93cykuc2VsZWN0KCksdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmFueSgpJiZ0LmNvbHVtbnMoKS5kZXNlbGVjdCgpLGguc2VsZWN0LmNvbHVtbnMhPT12b2lkIDAmJnQuY29sdW1ucyhoLnNlbGVjdC5jb2x1bW5zKS5zZWxlY3QoKSx0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiZ0LmNlbGxzKCkuZGVzZWxlY3QoKSxoLnNlbGVjdC5jZWxscyE9PXZvaWQgMClmb3IodmFyIF89MDtfPGguc2VsZWN0LmNlbGxzLmxlbmd0aDtfKyspdC5jZWxsKGguc2VsZWN0LmNlbGxzW19dLnJvdyxoLnNlbGVjdC5jZWxsc1tfXS5jb2x1bW4pLnNlbGVjdCgpO3Quc3RhdGUuc2F2ZSgpfX07dC5vbigic3RhdGVTYXZlUGFyYW1zIixmdW5jdGlvbihjLGwsaCl7aC5zZWxlY3Q9e30saC5zZWxlY3Qucm93cz10LnJvd3Moe3NlbGVjdGVkOiEwfSkuaWRzKCEwKS50b0FycmF5KCksaC5zZWxlY3QuY29sdW1ucz10LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSlbMF0saC5zZWxlY3QuY2VsbHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KVswXS5tYXAoZnVuY3Rpb24oXyl7cmV0dXJue3Jvdzp0LnJvdyhfLnJvdykuaWQoITApLGNvbHVtbjpfLmNvbHVtbn19KX0pLm9uKCJzdGF0ZUxvYWRQYXJhbXMiLHIpLm9uZSgiaW5pdCIsZnVuY3Rpb24oKXtyKHZvaWQgMCx2b2lkIDAsbil9KTt2YXIgcz1lLm9Jbml0LnNlbGVjdCxpPWF0LmRlZmF1bHRzLnNlbGVjdCxvPXM9PT12b2lkIDA/aTpzLHU9InJvdyIscD0iYXBpIixiPSExLGc9ITAsbT0hMCxDPSJ0ZCwgdGgiLHk9InNlbGVjdGVkIixUPSEwLFA9ITE7ZS5fc2VsZWN0PXtpbmZvRWxzOltdfSxvPT09ITA/KHA9Im9zIixQPSEwKTp0eXBlb2Ygbz09InN0cmluZyI/KHA9byxQPSEwKTpFdC5pc1BsYWluT2JqZWN0KG8pJiYoby5ibHVyYWJsZSE9PXZvaWQgMCYmKGI9by5ibHVyYWJsZSksby50b2dnbGVhYmxlIT09dm9pZCAwJiYoZz1vLnRvZ2dsZWFibGUpLG8uaW5mbyE9PXZvaWQgMCYmKG09by5pbmZvKSxvLml0ZW1zIT09dm9pZCAwJiYodT1vLml0ZW1zKSxvLnN0eWxlIT09dm9pZCAwPyhwPW8uc3R5bGUsUD0hMCk6KHA9Im9zIixQPSEwKSxvLnNlbGVjdG9yIT09dm9pZCAwJiYoQz1vLnNlbGVjdG9yKSxvLmNsYXNzTmFtZSE9PXZvaWQgMCYmKHk9by5jbGFzc05hbWUpLG8uaGVhZGVyQ2hlY2tib3ghPT12b2lkIDAmJihUPW8uaGVhZGVyQ2hlY2tib3gpKSx0LnNlbGVjdC5zZWxlY3RvcihDKSx0LnNlbGVjdC5pdGVtcyh1KSx0LnNlbGVjdC5zdHlsZShwKSx0LnNlbGVjdC5ibHVyYWJsZShiKSx0LnNlbGVjdC50b2dnbGVhYmxlKGcpLHQuc2VsZWN0LmluZm8obSksZS5fc2VsZWN0LmNsYXNzTmFtZT15LCFQJiZFdCh0LnRhYmxlKCkubm9kZSgpKS5oYXNDbGFzcygic2VsZWN0YWJsZSIpJiZ0LnNlbGVjdC5zdHlsZSgib3MiKSwoVHx8VD09PSJzZWxlY3QtcGFnZSJ8fFQ9PT0ic2VsZWN0LWFsbCIpJiYoUXModCxUKSx0Lm9uKCJpbml0IixmdW5jdGlvbigpe1FzKHQsVCl9KSl9fTtmdW5jdGlvbiBLcyh0LGUsbil7dmFyIHIscyxpLG89ZnVuY3Rpb24ocCxiKXtpZihwPmIpe3ZhciBnPWI7Yj1wLHA9Z312YXIgbT0hMTtyZXR1cm4gdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmluZGV4ZXMoKS5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIEM9PT1wJiYobT0hMCksQz09PWI/KG09ITEsITApOm19KX0sdT1mdW5jdGlvbihwLGIpe3ZhciBnPXQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKTtpZihnLmluZGV4T2YocCk+Zy5pbmRleE9mKGIpKXt2YXIgbT1iO2I9cCxwPW19dmFyIEM9ITE7cmV0dXJuIGcuZmlsdGVyKGZ1bmN0aW9uKHkpe3JldHVybiB5PT09cCYmKEM9ITApLHk9PT1iPyhDPSExLCEwKTpDfSl9OyF0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiYhbj8ocz1vKDAsZS5jb2x1bW4pLGk9dSgwLGUucm93KSk6KHM9byhuLmNvbHVtbixlLmNvbHVtbiksaT11KG4ucm93LGUucm93KSkscj10LmNlbGxzKGkscykuZmxhdHRlbigpLHQuY2VsbHMoZSx7c2VsZWN0ZWQ6ITB9KS5hbnkoKT90LmNlbGxzKHIpLmRlc2VsZWN0KCk6dC5jZWxscyhyKS5zZWxlY3QoKX1mdW5jdGlvbiBWbih0KXt2YXIgZT1hdC5zZWxlY3QuY2xhc3Nlcy5jaGVja2JveDtyZXR1cm4gdD9lLnJlcGxhY2UoLyAvZywiLiIpOmV9ZnVuY3Rpb24gZWEodCl7dmFyIGU9dC5zZXR0aW5ncygpWzBdLG49ZS5fc2VsZWN0LnNlbGVjdG9yO0V0KHQudGFibGUoKS5jb250YWluZXIoKSkub2ZmKCJtb3VzZWRvd24uZHRTZWxlY3QiLG4pLm9mZigibW91c2V1cC5kdFNlbGVjdCIsbikub2ZmKCJjbGljay5kdFNlbGVjdCIsbiksRXQoImJvZHkiKS5vZmYoImNsaWNrLmR0U2VsZWN0IituYSh0LnRhYmxlKCkubm9kZSgpKSl9ZnVuY3Rpb24gbm8odCl7dmFyIGU9RXQodC50YWJsZSgpLmNvbnRhaW5lcigpKSxuPXQuc2V0dGluZ3MoKVswXSxyPW4uX3NlbGVjdC5zZWxlY3RvcixzO2Uub24oIm1vdXNlZG93bi5kdFNlbGVjdCIscixmdW5jdGlvbihpKXsoaS5zaGlmdEtleXx8aS5tZXRhS2V5fHxpLmN0cmxLZXkpJiZlLmNzcygiLW1vei11c2VyLXNlbGVjdCIsIm5vbmUiKS5vbmUoInNlbGVjdHN0YXJ0LmR0U2VsZWN0IixyLGZ1bmN0aW9uKCl7cmV0dXJuITF9KSx3aW5kb3cuZ2V0U2VsZWN0aW9uJiYocz13aW5kb3cuZ2V0U2VsZWN0aW9uKCkpfSkub24oIm1vdXNldXAuZHRTZWxlY3QiLHIsZnVuY3Rpb24oKXtlLmNzcygiLW1vei11c2VyLXNlbGVjdCIsIiIpfSkub24oImNsaWNrLmR0U2VsZWN0IixyLGZ1bmN0aW9uKGkpe3ZhciBvPXQuc2VsZWN0Lml0ZW1zKCksdTtpZihzKXt2YXIgcD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7aWYoKCFwLmFuY2hvck5vZGV8fEV0KHAuYW5jaG9yTm9kZSkuY2xvc2VzdCgidGFibGUiKVswXT09PXQudGFibGUoKS5ub2RlKCkpJiZwIT09cylyZXR1cm59dmFyIGI9dC5zZXR0aW5ncygpWzBdLGc9dC50YWJsZSgpLmNvbnRhaW5lcigpO2lmKEV0KGkudGFyZ2V0KS5jbG9zZXN0KCJkaXYuZHQtY29udGFpbmVyIilbMF09PWcpe3ZhciBtPXQuY2VsbChFdChpLnRhcmdldCkuY2xvc2VzdCgidGQsIHRoIikpO2lmKG0uYW55KCkpe3ZhciBDPUV0LkV2ZW50KCJ1c2VyLXNlbGVjdC5kdCIpO2lmKEtlKHQsQyxbbyxtLGldKSwhQy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIHk9bS5pbmRleCgpO289PT0icm93Ij8odT15LnJvdyxKaShpLHQsYiwicm93Iix1KSk6bz09PSJjb2x1bW4iPyh1PW0uaW5kZXgoKS5jb2x1bW4sSmkoaSx0LGIsImNvbHVtbiIsdSkpOm89PT0iY2VsbCImJih1PW0uaW5kZXgoKSxKaShpLHQsYiwiY2VsbCIsdSkpLGIuX3NlbGVjdF9sYXN0Q2VsbD15fX19fSksRXQoImJvZHkiKS5vbigiY2xpY2suZHRTZWxlY3QiK25hKHQudGFibGUoKS5ub2RlKCkpLGZ1bmN0aW9uKGkpe2lmKG4uX3NlbGVjdC5ibHVyYWJsZSl7aWYoRXQoaS50YXJnZXQpLnBhcmVudHMoKS5maWx0ZXIodC50YWJsZSgpLmNvbnRhaW5lcigpKS5sZW5ndGh8fEV0KGkudGFyZ2V0KS5wYXJlbnRzKCJodG1sIikubGVuZ3RoPT09MHx8RXQoaS50YXJnZXQpLnBhcmVudHMoImRpdi5EVEUiKS5sZW5ndGgpcmV0dXJuO3ZhciBvPUV0LkV2ZW50KCJzZWxlY3QtYmx1ci5kdCIpO2lmKEtlKHQsbyxbaS50YXJnZXQsaV0pLG8uaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO2xyKG4sITApfX0pfWZ1bmN0aW9uIEtlKHQsZSxuLHIpe3ImJiF0LmZsYXR0ZW4oKS5sZW5ndGh8fCh0eXBlb2YgZT09InN0cmluZyImJihlPWUrIi5kdCIpLG4udW5zaGlmdCh0KSxFdCh0LnRhYmxlKCkubm9kZSgpKS50cmlnZ2VyKGUsbikpfWZ1bmN0aW9uIHFyKHQpe3JldHVybiB0Lm1SZW5kZXImJnQubVJlbmRlci5fbmFtZT09PSJzZWxlY3RDaGVja2JveCJ9ZnVuY3Rpb24gSnModCxlKXtpZighKHQuc2VsZWN0LnN0eWxlKCk9PT0iYXBpInx8dC5zZWxlY3QuaW5mbygpPT09ITEpKXt2YXIgbj10LnJvd3Moe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCxyPXQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLGk9ZnVuY3Rpb24oYixnLG0pe2IuYXBwZW5kKEV0KCc8c3BhbiBjbGFzcz0ic2VsZWN0LWl0ZW0iLz4nKS5hcHBlbmQodC5pMThuKCJzZWxlY3QuIitnKyJzIix7XzoiJWQgIitnKyJzIHNlbGVjdGVkIiwwOiIiLDE6IjEgIitnKyIgc2VsZWN0ZWQifSxtKSkpfSxvPUV0KGUpLHU9RXQoJzxzcGFuIGNsYXNzPSJzZWxlY3QtaW5mbyIvPicpO2kodSwicm93IixuKSxpKHUsImNvbHVtbiIsciksaSh1LCJjZWxsIixzKTt2YXIgcD1vLmNoaWxkcmVuKCJzcGFuLnNlbGVjdC1pbmZvIik7cC5sZW5ndGgmJnAucmVtb3ZlKCksdS50ZXh0KCkhPT0iIiYmby5hcHBlbmQodSl9fWZ1bmN0aW9uIFFzKHQsZSl7dmFyIG49dC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uczt0LmNvbHVtbnMoKS5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihyLHMpe3ZhciBpPW5bc107aWYocXIoaSkpe3ZhciBvPXQuY29sdW1uKHMpLmhlYWRlcigpO2lmKCFFdCgiaW5wdXQiLG8pLmxlbmd0aCl7dmFyIHU9RXQoIjxpbnB1dD4iKS5hdHRyKHtjbGFzczpWbighMCksdHlwZToiY2hlY2tib3giLCJhcmlhLWxhYmVsIjp0LmkxOG4oInNlbGVjdC5hcmlhLmhlYWRlckNoZWNrYm94Iil8fCJTZWxlY3QgYWxsIHJvd3MifSkuYXBwZW5kVG8obykub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0aGlzLmNoZWNrZWQ/ZT09InNlbGVjdC1wYWdlIj90LnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHApe3Auc3RvcFByb3BhZ2F0aW9uKCl9KTt0Lm9uKCJkcmF3IHNlbGVjdCBkZXNlbGVjdCIsZnVuY3Rpb24ocCxiLGcpe2lmKGc9PT0icm93Inx8IWcpe3ZhciBtPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5jb3VudCgpLEM9dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQiLHNlbGVjdGVkOiEwfSkuY291bnQoKSx5PWU9PSJzZWxlY3QtcGFnZSI/dC5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmNvdW50KCk6dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuY291bnQoKTtDJiZDPD1tJiZDPT09eT91LnByb3AoImNoZWNrZWQiLCEwKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMSk6Qz09PTAmJm09PT0wP3UucHJvcCgiY2hlY2tlZCIsITEpLnByb3AoImluZGV0ZXJtaW5hdGUiLCExKTp1LnByb3AoImNoZWNrZWQiLCExKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMCl9fSl9fX0pfWZ1bmN0aW9uIG9kKHQpe3ZhciBlPW5ldyBhdC5BcGkodCk7dC5fc2VsZWN0X2luaXQ9ITAsdC5hb1Jvd0NyZWF0ZWRDYWxsYmFjay5wdXNoKGZ1bmN0aW9uKG4scixzKXt2YXIgaSxvLHU9dC5hb0RhdGFbc107Zm9yKHUuX3NlbGVjdF9zZWxlY3RlZCYmRXQobikuYWRkQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSkuZmluZCgiaW5wdXQuIitWbighMCkpLnByb3AoImNoZWNrZWQiLCEwKSxpPTAsbz10LmFvQ29sdW1ucy5sZW5ndGg7aTxvO2krKykodC5hb0NvbHVtbnNbaV0uX3NlbGVjdF9zZWxlY3RlZHx8dS5fc2VsZWN0ZWRfY2VsbHMmJnUuX3NlbGVjdGVkX2NlbGxzW2ldKSYmRXQodS5hbkNlbGxzW2ldKS5hZGRDbGFzcyh0Ll9zZWxlY3QuY2xhc3NOYW1lKX0pLGUub24oInByZVhoci5kdC5kdFNlbGVjdCIsZnVuY3Rpb24obixyKXtpZihyPT09ZS5zZXR0aW5ncygpWzBdKXt2YXIgcz1lLnJvd3Moe3NlbGVjdGVkOiEwfSkuaWRzKCEwKS5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIG8hPT12b2lkIDB9KSxpPWUuY2VsbHMoe3NlbGVjdGVkOiEwfSkuZXEoMCkubWFwKGZ1bmN0aW9uKG8pe3ZhciB1PWUucm93KG8ucm93KS5pZCghMCk7cmV0dXJuIHU/e3Jvdzp1LGNvbHVtbjpvLmNvbHVtbn06dm9pZCAwfSkuZmlsdGVyKGZ1bmN0aW9uKG8pe3JldHVybiBvIT09dm9pZCAwfSk7ZS5vbmUoImRyYXcuZHQuZHRTZWxlY3QiLGZ1bmN0aW9uKCl7ZS5yb3dzKHMpLnNlbGVjdCgpLGkuYW55KCkmJmkuZWFjaChmdW5jdGlvbihvKXtlLmNlbGxzKG8ucm93LG8uY29sdW1uKS5zZWxlY3QoKX0pfSl9fSksZS5vbigiaW5mby5kdCIsZnVuY3Rpb24obixyLHMpe3IuX3NlbGVjdC5pbmZvRWxzLmluY2x1ZGVzKHMpfHxyLl9zZWxlY3QuaW5mb0Vscy5wdXNoKHMpLEpzKGUscyl9KSxlLm9uKCJzZWxlY3QuZHRTZWxlY3QuZHQgZGVzZWxlY3QuZHRTZWxlY3QuZHQiLGZ1bmN0aW9uKCl7dC5fc2VsZWN0LmluZm9FbHMuZm9yRWFjaChmdW5jdGlvbihuKXtKcyhlLG4pfSksZS5zdGF0ZS5zYXZlKCl9KSxlLm9uKCJkZXN0cm95LmR0U2VsZWN0IixmdW5jdGlvbigpe0V0KGUucm93cyh7c2VsZWN0ZWQ6ITB9KS5ub2RlcygpKS5yZW1vdmVDbGFzcyhlLnNldHRpbmdzKClbMF0uX3NlbGVjdC5jbGFzc05hbWUpLEV0KCJpbnB1dC4iK1ZuKCEwKSxlLnRhYmxlKCkuaGVhZGVyKCkpLnJlbW92ZSgpLGVhKGUpLGUub2ZmKCIuZHRTZWxlY3QiKSxFdCgiYm9keSIpLm9mZigiLmR0U2VsZWN0IituYShlLnRhYmxlKCkubm9kZSgpKSl9KX1mdW5jdGlvbiB0byh0LGUsbixyKXt2YXIgcz10W2UrInMiXSh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKSxpPXMuaW5kZXhPZihyKSxvPXMuaW5kZXhPZihuKTtpZighdFtlKyJzIl0oe3NlbGVjdGVkOiEwfSkuYW55KCkmJmk9PT0tMSlzLnNwbGljZShzLmluZGV4T2YobikrMSxzLmxlbmd0aCk7ZWxzZXtpZihpPm8pe3ZhciB1PW87bz1pLGk9dX1zLnNwbGljZShvKzEscy5sZW5ndGgpLHMuc3BsaWNlKDAsaSl9dFtlXShuLHtzZWxlY3RlZDohMH0pLmFueSgpPyhzLnNwbGljZShzLmluZGV4T2YobiksMSksdFtlKyJzIl0ocykuZGVzZWxlY3QoKSk6dFtlKyJzIl0ocykuc2VsZWN0KCl9ZnVuY3Rpb24gbHIodCxlKXtpZihlfHx0Ll9zZWxlY3Quc3R5bGU9PT0ic2luZ2xlIil7dmFyIG49bmV3IGF0LkFwaSh0KTtuLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGVzZWxlY3QoKSxuLmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuZGVzZWxlY3QoKSxuLmNlbGxzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9fWZ1bmN0aW9uIEppKHQsZSxuLHIscyl7dmFyIGk9ZS5zZWxlY3Quc3R5bGUoKSxvPWUuc2VsZWN0LnRvZ2dsZWFibGUoKSx1PWVbcl0ocyx7c2VsZWN0ZWQ6ITB9KS5hbnkoKTtpZighKHUmJiFvKSlpZihpPT09Im9zIilpZih0LmN0cmxLZXl8fHQubWV0YUtleSllW3JdKHMpLnNlbGVjdCghdSk7ZWxzZSBpZih0LnNoaWZ0S2V5KXI9PT0iY2VsbCI/S3MoZSxzLG4uX3NlbGVjdF9sYXN0Q2VsbHx8bnVsbCk6dG8oZSxyLHMsbi5fc2VsZWN0X2xhc3RDZWxsP24uX3NlbGVjdF9sYXN0Q2VsbFtyXTpudWxsKTtlbHNle3ZhciBwPWVbcisicyJdKHtzZWxlY3RlZDohMH0pO3UmJnAuZmxhdHRlbigpLmxlbmd0aD09PTE/ZVtyXShzKS5kZXNlbGVjdCgpOihwLmRlc2VsZWN0KCksZVtyXShzKS5zZWxlY3QoKSl9ZWxzZSBpPT0ibXVsdGkrc2hpZnQiJiZ0LnNoaWZ0S2V5P3I9PT0iY2VsbCI/S3MoZSxzLG4uX3NlbGVjdF9sYXN0Q2VsbHx8bnVsbCk6dG8oZSxyLHMsbi5fc2VsZWN0X2xhc3RDZWxsP24uX3NlbGVjdF9sYXN0Q2VsbFtyXTpudWxsKTplW3JdKHMpLnNlbGVjdCghdSl9ZnVuY3Rpb24gbmEodCl7cmV0dXJuIHQuaWQucmVwbGFjZSgvW15hLXpBLVowLTlcLVxfXS9nLCItIil9RXQuZWFjaChbe3R5cGU6InJvdyIscHJvcDoiYW9EYXRhIn0se3R5cGU6ImNvbHVtbiIscHJvcDoiYW9Db2x1bW5zIn1dLGZ1bmN0aW9uKHQsZSl7YXQuZXh0LnNlbGVjdG9yW2UudHlwZV0ucHVzaChmdW5jdGlvbihuLHIscyl7dmFyIGk9ci5zZWxlY3RlZCxvLHU9W107aWYoaSE9PSEwJiZpIT09ITEpcmV0dXJuIHM7Zm9yKHZhciBwPTAsYj1zLmxlbmd0aDtwPGI7cCsrKW89bltlLnByb3BdW3NbcF1dLG8mJihpPT09ITAmJm8uX3NlbGVjdF9zZWxlY3RlZD09PSEwfHxpPT09ITEmJiFvLl9zZWxlY3Rfc2VsZWN0ZWQpJiZ1LnB1c2goc1twXSk7cmV0dXJuIHV9KX0pO2F0LmV4dC5zZWxlY3Rvci5jZWxsLnB1c2goZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuc2VsZWN0ZWQscyxpPVtdO2lmKHI9PT12b2lkIDApcmV0dXJuIG47Zm9yKHZhciBvPTAsdT1uLmxlbmd0aDtvPHU7bysrKXM9dC5hb0RhdGFbbltvXS5yb3ddLHMmJihyPT09ITAmJnMuX3NlbGVjdGVkX2NlbGxzJiZzLl9zZWxlY3RlZF9jZWxsc1tuW29dLmNvbHVtbl09PT0hMHx8cj09PSExJiYoIXMuX3NlbGVjdGVkX2NlbGxzfHwhcy5fc2VsZWN0ZWRfY2VsbHNbbltvXS5jb2x1bW5dKSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0pO3ZhciBVZT1hdC5BcGkucmVnaXN0ZXIsSG49YXQuQXBpLnJlZ2lzdGVyUGx1cmFsO1VlKCJzZWxlY3QoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe2F0LnNlbGVjdC5pbml0KG5ldyBhdC5BcGkodCkpfSl9KTtVZSgic2VsZWN0LmJsdXJhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LmJsdXJhYmxlOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuYmx1cmFibGU9dH0pfSk7VWUoInNlbGVjdC50b2dnbGVhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LnRvZ2dsZWFibGU6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2UuX3NlbGVjdC50b2dnbGVhYmxlPXR9KX0pO1VlKCJzZWxlY3QuaW5mbygpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5pbmZvOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuaW5mbz10fSl9KTtVZSgic2VsZWN0Lml0ZW1zKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0Lml0ZW1zOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuaXRlbXM9dCxLZShuZXcgYXQuQXBpKGUpLCJzZWxlY3RJdGVtcyIsW3RdKX0pfSk7VWUoInNlbGVjdC5zdHlsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5zdHlsZTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5fc2VsZWN0fHxhdC5zZWxlY3QuaW5pdChuZXcgYXQuQXBpKGUpKSxlLl9zZWxlY3RfaW5pdHx8b2QoZSksZS5fc2VsZWN0LnN0eWxlPXQ7dmFyIG49bmV3IGF0LkFwaShlKTtlYShuKSx0IT09ImFwaSImJm5vKG4pLEtlKG5ldyBhdC5BcGkoZSksInNlbGVjdFN0eWxlIixbdF0pfSl9KTtVZSgic2VsZWN0LnNlbGVjdG9yKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LnNlbGVjdG9yOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlYShuZXcgYXQuQXBpKGUpKSxlLl9zZWxlY3Quc2VsZWN0b3I9dCxlLl9zZWxlY3Quc3R5bGUhPT0iYXBpIiYmbm8obmV3IGF0LkFwaShlKSl9KX0pO1VlKCJzZWxlY3QubGFzdCgpIixmdW5jdGlvbih0KXtsZXQgZT10aGlzLmNvbnRleHRbMF07cmV0dXJuIHQ/KGUuX3NlbGVjdF9sYXN0Q2VsbD10LHRoaXMpOmUuX3NlbGVjdF9sYXN0Q2VsbH0pO0huKCJyb3dzKCkuc2VsZWN0KCkiLCJyb3coKS5zZWxlY3QoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD09PSExP3RoaXMuZGVzZWxlY3QoKToodGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihuLHIpe2xyKG4pO3ZhciBzPW4uYW9EYXRhW3JdLGk9bi5hb0NvbHVtbnM7RXQocy5uVHIpLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpLHMuX3NlbGVjdF9zZWxlY3RlZD0hMDtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHU9aVtvXTtpZih1LnNUeXBlPT09bnVsbCYmZS5jb2x1bW5zKCkudHlwZXMoKSxxcih1KSl7dmFyIHA9cy5hbkNlbGxzO3AmJnBbb10mJkV0KCJpbnB1dC4iK1ZuKCEwKSxwW29dKS5wcm9wKCJjaGVja2VkIiwhMCkscy5fYVNvcnREYXRhIT09bnVsbCYmKHMuX2FTb3J0RGF0YVtvXT1udWxsKX19fSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbInJvdyIsZVtyXV0sITApfSksdGhpcyl9KTtVZSgicm93KCkuc2VsZWN0ZWQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRbMF07cmV0dXJuISEodCYmdGhpcy5sZW5ndGgmJnQuYW9EYXRhW3RoaXNbMF1dJiZ0LmFvRGF0YVt0aGlzWzBdXS5fc2VsZWN0X3NlbGVjdGVkKX0pO0huKCJjb2x1bW5zKCkuc2VsZWN0KCkiLCJjb2x1bW4oKS5zZWxlY3QoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD09PSExP3RoaXMuZGVzZWxlY3QoKToodGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihuLHIpe2xyKG4pLG4uYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQ9ITA7dmFyIHM9bmV3IGF0LkFwaShuKS5jb2x1bW4ocik7RXQocy5oZWFkZXIoKSkuYWRkQ2xhc3Mobi5fc2VsZWN0LmNsYXNzTmFtZSksRXQocy5mb290ZXIoKSkuYWRkQ2xhc3Mobi5fc2VsZWN0LmNsYXNzTmFtZSkscy5ub2RlcygpLnRvJCgpLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpfSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbImNvbHVtbiIsZVtyXV0sITApfSksdGhpcyl9KTtVZSgiY29sdW1uKCkuc2VsZWN0ZWQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRbMF07cmV0dXJuISEodCYmdGhpcy5sZW5ndGgmJnQuYW9Db2x1bW5zW3RoaXNbMF1dJiZ0LmFvQ29sdW1uc1t0aGlzWzBdXS5fc2VsZWN0X3NlbGVjdGVkKX0pO0huKCJjZWxscygpLnNlbGVjdCgpIiwiY2VsbCgpLnNlbGVjdCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0PT09ITE/dGhpcy5kZXNlbGVjdCgpOih0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihuLHIscyl7bHIobik7dmFyIGk9bi5hb0RhdGFbcl07aS5fc2VsZWN0ZWRfY2VsbHM9PT12b2lkIDAmJihpLl9zZWxlY3RlZF9jZWxscz1bXSksaS5fc2VsZWN0ZWRfY2VsbHNbc109ITAsaS5hbkNlbGxzJiZFdChpLmFuQ2VsbHNbc10pLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpfSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbImNlbGwiLGUuY2VsbHMoZVtyXSkuaW5kZXhlcygpLnRvQXJyYXkoKV0sITApfSksdGhpcyl9KTtVZSgiY2VsbCgpLnNlbGVjdGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdO2lmKHQmJnRoaXMubGVuZ3RoKXt2YXIgZT10LmFvRGF0YVt0aGlzWzBdWzBdLnJvd107aWYoZSYmZS5fc2VsZWN0ZWRfY2VsbHMmJmUuX3NlbGVjdGVkX2NlbGxzW3RoaXNbMF1bMF0uY29sdW1uXSlyZXR1cm4hMH1yZXR1cm4hMX0pO0huKCJyb3dzKCkuZGVzZWxlY3QoKSIsInJvdygpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihlLG4pe3ZhciByPWUuYW9EYXRhW25dLHM9ZS5hb0NvbHVtbnM7RXQoci5uVHIpLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpLHIuX3NlbGVjdF9zZWxlY3RlZD0hMSxlLl9zZWxlY3RfbGFzdENlbGw9bnVsbDtmb3IodmFyIGk9MDtpPHMubGVuZ3RoO2krKyl7dmFyIG89c1tpXTtpZihvLnNUeXBlPT09bnVsbCYmdC5jb2x1bW5zKCkudHlwZXMoKSxxcihvKSl7dmFyIHU9ci5hbkNlbGxzO3UmJnVbaV0mJkV0KCJpbnB1dC4iK1ZuKCEwKSxyLmFuQ2VsbHNbaV0pLnByb3AoImNoZWNrZWQiLCExKSxyLl9hU29ydERhdGEhPT1udWxsJiYoci5fYVNvcnREYXRhW2ldPW51bGwpfX19KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJyb3ciLHRbbl1dLCEwKX0pLHRoaXN9KTtIbigiY29sdW1ucygpLmRlc2VsZWN0KCkiLCJjb2x1bW4oKS5kZXNlbGVjdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxuKXtlLmFvQ29sdW1uc1tuXS5fc2VsZWN0X3NlbGVjdGVkPSExO3ZhciByPW5ldyBhdC5BcGkoZSkscz1yLmNvbHVtbihuKTtFdChzLmhlYWRlcigpKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKSxFdChzLmZvb3RlcigpKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKSxyLmNlbGxzKG51bGwsbikuaW5kZXhlcygpLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5hb0RhdGFbaS5yb3ddLHU9by5fc2VsZWN0ZWRfY2VsbHM7by5hbkNlbGxzJiYoIXV8fCF1W2kuY29sdW1uXSkmJkV0KG8uYW5DZWxsc1tpLmNvbHVtbl0pLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpfSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJjb2x1bW4iLHRbbl1dLCEwKX0pLHRoaXN9KTtIbigiY2VsbHMoKS5kZXNlbGVjdCgpIiwiY2VsbCgpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oZSxuLHIpe3ZhciBzPWUuYW9EYXRhW25dO3MuX3NlbGVjdGVkX2NlbGxzIT09dm9pZCAwJiYocy5fc2VsZWN0ZWRfY2VsbHNbcl09ITEpLHMuYW5DZWxscyYmIWUuYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQmJkV0KHMuYW5DZWxsc1tyXSkucmVtb3ZlQ2xhc3MoZS5fc2VsZWN0LmNsYXNzTmFtZSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJjZWxsIix0W25dXSwhMCl9KSx0aGlzfSk7ZnVuY3Rpb24gTW4odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4uaTE4bigiYnV0dG9ucy4iK3QsZSl9fWZ1bmN0aW9uIFFpKHQpe3ZhciBlPXQuX2V2ZW50TmFtZXNwYWNlO3JldHVybiJkcmF3LmR0LkRUIitlKyIgc2VsZWN0LmR0LkRUIitlKyIgZGVzZWxlY3QuZHQuRFQiK2V9ZnVuY3Rpb24gbGQodCxlKXtyZXR1cm4hIShlLmxpbWl0VG8uaW5kZXhPZigicm93cyIpIT09LTEmJnQucm93cyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKXx8ZS5saW1pdFRvLmluZGV4T2YoImNvbHVtbnMiKSE9PS0xJiZ0LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuYW55KCl8fGUubGltaXRUby5pbmRleE9mKCJjZWxscyIpIT09LTEmJnQuY2VsbHMoe3NlbGVjdGVkOiEwfSkuYW55KCkpfXZhciB0YT0wO0V0LmV4dGVuZChhdC5leHQuYnV0dG9ucyx7c2VsZWN0ZWQ6e3RleHQ6TW4oInNlbGVjdGVkIiwiU2VsZWN0ZWQiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0ZWQiLGxpbWl0VG86WyJyb3dzIiwiY29sdW1ucyIsImNlbGxzIl0saW5pdDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztuLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrdGErKyx0Lm9uKFFpKG4pLGZ1bmN0aW9uKCl7ci5lbmFibGUobGQodCxuKSl9KSx0aGlzLmRpc2FibGUoKX0sZGVzdHJveTpmdW5jdGlvbih0LGUsbil7dC5vZmYobi5fZXZlbnROYW1lc3BhY2UpfX0sc2VsZWN0ZWRTaW5nbGU6e3RleHQ6TW4oInNlbGVjdGVkU2luZ2xlIiwiU2VsZWN0ZWQgc2luZ2xlIiksY2xhc3NOYW1lOiJidXR0b25zLXNlbGVjdGVkLXNpbmdsZSIsaW5pdDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztuLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrdGErKyx0Lm9uKFFpKG4pLGZ1bmN0aW9uKCl7dmFyIHM9dC5yb3dzKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoO3IuZW5hYmxlKHM9PT0xKX0pLHRoaXMuZGlzYWJsZSgpfSxkZXN0cm95OmZ1bmN0aW9uKHQsZSxuKXt0Lm9mZihuLl9ldmVudE5hbWVzcGFjZSl9fSxzZWxlY3RBbGw6e3RleHQ6TW4oInNlbGVjdEFsbCIsIlNlbGVjdCBhbGwiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0LWFsbCIsYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMuc2VsZWN0Lml0ZW1zKCksaT1yLnNlbGVjdG9yTW9kaWZpZXI7aT8odHlwZW9mIGk9PSJmdW5jdGlvbiImJihpPWkuY2FsbChlLHQsZSxuLHIpKSx0aGlzW3MrInMiXShpKS5zZWxlY3QoKSk6dGhpc1tzKyJzIl0oKS5zZWxlY3QoKX19LHNlbGVjdE5vbmU6e3RleHQ6TW4oInNlbGVjdE5vbmUiLCJEZXNlbGVjdCBhbGwiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0LW5vbmUiLGFjdGlvbjpmdW5jdGlvbigpe2xyKHRoaXMuc2V0dGluZ3MoKVswXSwhMCl9LGluaXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7bi5fZXZlbnROYW1lc3BhY2U9Ii5zZWxlY3QiK3RhKyssdC5vbihRaShuKSxmdW5jdGlvbigpe3ZhciBzPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoK3QuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoK3QuY2VsbHMoe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aDtyLmVuYWJsZShzPjApfSksdGhpcy5kaXNhYmxlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCxlLG4pe3Qub2ZmKG4uX2V2ZW50TmFtZXNwYWNlKX19LHNob3dTZWxlY3RlZDp7dGV4dDpNbigic2hvd1NlbGVjdGVkIiwiU2hvdyBvbmx5IHNlbGVjdGVkIiksY2xhc3NOYW1lOiJidXR0b25zLXNob3ctc2VsZWN0ZWQiLGFjdGlvbjpmdW5jdGlvbih0LGUpe2lmKGUuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiKSllLnNlYXJjaC5maXhlZCgiZHQtc2VsZWN0IixudWxsKSx0aGlzLmFjdGl2ZSghMSk7ZWxzZXt2YXIgbj1lLnNldHRpbmdzKClbMF0uYW9EYXRhO2Uuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiLGZ1bmN0aW9uKHIscyxpKXtyZXR1cm4gbltpXS5fc2VsZWN0X3NlbGVjdGVkfSksdGhpcy5hY3RpdmUoITApfWUuZHJhdygpfX19KTtFdC5lYWNoKFsiUm93IiwiQ29sdW1uIiwiQ2VsbCJdLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpO2F0LmV4dC5idXR0b25zWyJzZWxlY3QiK2UrInMiXT17dGV4dDpNbigic2VsZWN0IitlKyJzIiwiU2VsZWN0ICIrbisicyIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3QtIituKyJzIixhY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdC5pdGVtcyhuKX0saW5pdDpmdW5jdGlvbihyKXt2YXIgcz10aGlzO3Iub24oInNlbGVjdEl0ZW1zLmR0LkRUIixmdW5jdGlvbihpLG8sdSl7cy5hY3RpdmUodT09PW4pfSl9fX0pO2F0LnR5cGUoInNlbGVjdC1jaGVja2JveCIse2NsYXNzTmFtZToiZHQtc2VsZWN0IixkZXRlY3Q6YXQudmVyc2lvbkNoZWNrKCIyLjEiKT97b25lT2Y6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYWxsT2Y6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saW5pdDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHFyKGUpfX06ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0ic2VsZWN0LWNoZWNrYm94Ij90OiExfSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQpe3JldHVybiB0PT09IlgiPy0xOjB9fX0pO0V0LmV4dGVuZCghMCxhdC5kZWZhdWx0cy5vTGFuZ3VhZ2Use3NlbGVjdDp7YXJpYTp7cm93Q2hlY2tib3g6IlNlbGVjdCByb3cifX19KTthdC5yZW5kZXIuc2VsZWN0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dD9hdC51dGlsLmdldCh0KTpudWxsLHI9ZT9hdC51dGlsLmdldChlKTpudWxsLHM9ZnVuY3Rpb24oaSxvLHUscCl7dmFyIGI9cC5zZXR0aW5ncy5hb0RhdGFbcC5yb3ddLGc9Yi5fc2VsZWN0X3NlbGVjdGVkLG09cC5zZXR0aW5ncy5vTGFuZ3VhZ2Uuc2VsZWN0LmFyaWEucm93Q2hlY2tib3g7cmV0dXJuIG89PT0iZGlzcGxheSI/RXQoIjxpbnB1dD4iKS5hdHRyKHsiYXJpYS1sYWJlbCI6bSxjbGFzczpWbigpLG5hbWU6cj9yKHUpOm51bGwsdHlwZToiY2hlY2tib3giLHZhbHVlOm4/bih1KTpudWxsLGNoZWNrZWQ6Z30pLm9uKCJpbnB1dCIsZnVuY3Rpb24oQyl7Qy5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2hlY2tlZD1FdCh0aGlzKS5jbG9zZXN0KCJ0ciIpLmhhc0NsYXNzKCJzZWxlY3RlZCIpfSlbMF06bz09PSJ0eXBlIj8ic2VsZWN0LWNoZWNrYm94IjpvPT09ImZpbHRlciI/IiI6Zz8iWCI6IiJ9O3JldHVybiBzLl9uYW1lPSJzZWxlY3RDaGVja2JveCIsc307YXQuZXh0Lm9yZGVyWyJzZWxlY3QtY2hlY2tib3giXT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFwaSgpLmNvbHVtbihlLHtvcmRlcjoiaW5kZXgifSkubm9kZXMoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQuX3NlbGVjdC5pdGVtcz09PSJyb3ciP0V0KG4pLnBhcmVudCgpLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpLnRvU3RyaW5nKCk6dC5fc2VsZWN0Lml0ZW1zPT09ImNlbGwiP0V0KG4pLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpLnRvU3RyaW5nKCk6ITF9KX07RXQuZm4uRGF0YVRhYmxlLnNlbGVjdD1hdC5zZWxlY3Q7RXQoZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0U2VsZWN0IixmdW5jdGlvbih0LGUpe3QubmFtZXNwYWNlPT09ImR0IiYmYXQuc2VsZWN0LmluaXQobmV3IGF0LkFwaShlKSl9KTtMZS5CdXR0b25zLmpzemlwKHJvLmRlZmF1bHQpO0xlLmdldF9zZWxlY3RlZF9yb3dzPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dC5yb3dzKCkuY291bnQoKS8yO3JldHVybiBBcnJheS5mcm9tKHQucm93cyh7c2VsZWN0ZWQ6ITB9KS5pbmRleGVzKCkubWFwKHM9PnM8cj9zOnMrZSkpfTtMZS5zZXRfc2VsZWN0ZWRfcm93cz1mdW5jdGlvbih0LGUsbil7bGV0IHI9dC5yb3dzKCkuY291bnQoKSxzPXIvMixpPXMrZSxvPXIrZTtuPUFycmF5LmZyb20obi5maWx0ZXIodT0+dT49MCYmdTxvJiYodTxzfHx1Pj1pKSkubWFwKHU9PnU8cz91OnUtZSkpLHQucm93cygpLmRlc2VsZWN0KCksdC5yb3dzKG4pLnNlbGVjdCgpfTt2YXIgYWM9TGU7dmFyIGV4cG9ydF9qUXVlcnk9dWQuZGVmYXVsdDtleHBvcnR7TGUgYXMgRGF0YVRhYmxlLGlkIGFzIERhdGVUaW1lLGFjIGFzIGRlZmF1bHQsZXhwb3J0X2pRdWVyeSBhcyBqUXVlcnl9OwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKanN6aXAvZGlzdC9qc3ppcC5taW4uanM6CiAgKCohCiAgCiAgSlNaaXAgdjMuMTAuMSAtIEEgSmF2YVNjcmlwdCBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgcmVhZGluZyB6aXAgZmlsZXMKICA8aHR0cDovL3N0dWFydGsuY29tL2pzemlwPgogIAogIChjKSAyMDA5LTIwMTYgU3R1YXJ0IEtuaWdodGxleSA8c3R1YXJ0IFthdF0gc3R1YXJ0ay5jb20+CiAgRHVhbCBsaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2Ugb3IgR1BMdjMuIFNlZSBodHRwczovL3Jhdy5naXRodWIuY29tL1N0dWsvanN6aXAvbWFpbi9MSUNFTlNFLm1hcmtkb3duLgogIAogIEpTWmlwIHVzZXMgdGhlIGxpYnJhcnkgcGFrbyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgOgogIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9ibG9iL21haW4vTElDRU5TRQogICopCgpqcXVlcnkvZGlzdC9qcXVlcnkuanM6CiAgKCohCiAgICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My43LjEKICAgKiBodHRwczovL2pxdWVyeS5jb20vCiAgICoKICAgKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogICAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAgICoKICAgKiBEYXRlOiAyMDIzLTA4LTI4VDEzOjM3WgogICAqKQoKZGF0YXRhYmxlcy5uZXQvanMvZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgMi4xLjYKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtZHQvanMvZGF0YVRhYmxlcy5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIGludGVncmF0aW9uCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvZGF0YVRhYmxlcy5idXR0b25zLm1qczoKICAoKiEgQnV0dG9ucyBmb3IgRGF0YVRhYmxlcyAzLjEuMgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1idXR0b25zLWR0L2pzL2J1dHRvbnMuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgc3R5bGluZyB3cmFwcGVyIGZvciBCdXR0b25zCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvYnV0dG9ucy5odG1sNS5taW4ubWpzOgogICgqIQogICAqIEhUTUw1IGV4cG9ydCBidXR0b25zIGZvciBCdXR0b25zIGFuZCBEYXRhVGFibGVzLgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICoKICAgKiBGaWxlU2F2ZXIuanMgKDEuMy4zKSAtIE1JVCBsaWNlbnNlCiAgICogQ29weXJpZ2h0IMKpIDIwMTYgRWxpIEdyZXkgLSBodHRwOi8vZWxpZ3JleS5jb20KICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvYnV0dG9ucy5wcmludC5taW4ubWpzOgogICgqIQogICAqIFByaW50IGJ1dHRvbiBmb3IgQnV0dG9ucyBhbmQgRGF0YVRhYmxlcy4KICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtYnV0dG9ucy9qcy9idXR0b25zLmNvbFZpcy5taW4ubWpzOgogICgqIQogICAqIENvbHVtbiB2aXNpYmlsaXR5IGJ1dHRvbnMgZm9yIEJ1dHRvbnMgYW5kIERhdGFUYWJsZXMuCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWZpeGVkY29sdW1ucy9qcy9kYXRhVGFibGVzLmZpeGVkQ29sdW1ucy5tanM6CiAgKCohIEZpeGVkQ29sdW1ucyA1LjAuMAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMtZHQvanMvZml4ZWRDb2x1bW5zLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIGludGVncmF0aW9uIGZvciBEYXRhVGFibGVzJyBGaXhlZENvbHVtbnMKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQta2V5dGFibGUvanMvZGF0YVRhYmxlcy5rZXlUYWJsZS5tanM6CiAgKCohIEtleVRhYmxlIDIuMTIuMQogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1rZXl0YWJsZS1kdC9qcy9rZXlUYWJsZS5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIEtleVRhYmxlCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXJvd2dyb3VwL2pzL2RhdGFUYWJsZXMucm93R3JvdXAubWpzOgogICgqISBSb3dHcm91cCAxLjUuMAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1yb3dncm91cC1kdC9qcy9yb3dHcm91cC5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIFJvd0dyb3VwCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWRhdGV0aW1lL2Rpc3QvZGF0YVRhYmxlcy5kYXRlVGltZS5tanM6CiAgKCohIERhdGVUaW1lIHBpY2tlciBmb3IgRGF0YVRhYmxlcy5uZXQgdjEuNS4zCiAgICoKICAgKiDCqSBTcHJ5TWVkaWEgTHRkLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIExpY2Vuc2U6IE1JVCBkYXRhdGFibGVzLm5ldC9saWNlbnNlL21pdAogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VhcmNoYnVpbGRlci9qcy9kYXRhVGFibGVzLnNlYXJjaEJ1aWxkZXIubWpzOgogICgqISBTZWFyY2hCdWlsZGVyIDEuOC4wCiAgICogwqlTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZS9taXQKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlYXJjaGJ1aWxkZXItZHQvanMvc2VhcmNoQnVpbGRlci5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBpbnRlZ3JhdGlvbiBmb3IgRGF0YVRhYmxlcycgU2VhcmNoQnVpbGRlcgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWFyY2hwYW5lcy9qcy9kYXRhVGFibGVzLnNlYXJjaFBhbmVzLm1qczoKICAoKiEgU2VhcmNoUGFuZXMgMi4zLjIKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VhcmNocGFuZXMtZHQvanMvc2VhcmNoUGFuZXMuZGF0YVRhYmxlcy5tanM6CiAgKCohIEJvb3RzdHJhcCBpbnRlZ3JhdGlvbiBmb3IgRGF0YVRhYmxlcycgU2VhcmNoUGFuZXMKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VsZWN0L2pzL2RhdGFUYWJsZXMuc2VsZWN0Lm1qczoKICAoKiEgU2VsZWN0IGZvciBEYXRhVGFibGVzIDIuMC41CiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UvbWl0CiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWxlY3QtZHQvanMvc2VsZWN0LmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIHN0eWxpbmcgd3JhcHBlciBmb3IgU2VsZWN0CiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKKi8K";
</script>
<noscript>
<div style="float:left; margin-right: 10px;">
<a href="https://mwouts.github.io/itables/"><svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" width="64" viewbox="0 0 500 400" style="font-family: 'Droid Sans', sans-serif;">
    <g style="fill:#d9d7fc">
        <path d="M100,400H500V357H100Z"></path>
        <path d="M100,300H400V257H100Z"></path>
        <path d="M0,200H400V157H0Z"></path>
        <path d="M100,100H500V57H100Z"></path>
        <path d="M100,350H500V307H100Z"></path>
        <path d="M100,250H400V207H100Z"></path>
        <path d="M0,150H400V107H0Z"></path>
        <path d="M100,50H500V7H100Z"></path>
    </g>
    <g style="fill:#1a1366;stroke:#1a1366;">
   <rect x="100" y="7" width="400" height="43">
    <animate attributename="width" values="0;400;0" dur="5s" repeatcount="indefinite"></animate>
      <animate attributename="x" values="100;100;500" dur="5s" repeatcount="indefinite"></animate>
  </rect>
        <rect x="0" y="107" width="400" height="43">
    <animate attributename="width" values="0;400;0" dur="3.5s" repeatcount="indefinite"></animate>
    <animate attributename="x" values="0;0;400" dur="3.5s" repeatcount="indefinite"></animate>
  </rect>
        <rect x="100" y="207" width="300" height="43">
    <animate attributename="width" values="0;300;0" dur="3s" repeatcount="indefinite"></animate>
    <animate attributename="x" values="100;100;400" dur="3s" repeatcount="indefinite"></animate>
  </rect>
        <rect x="100" y="307" width="400" height="43">
    <animate attributename="width" values="0;400;0" dur="4s" repeatcount="indefinite"></animate>
      <animate attributename="x" values="100;100;500" dur="4s" repeatcount="indefinite"></animate>
  </rect>
        <g style="fill:transparent;stroke-width:8; stroke-linejoin:round" rx="5">
            <g transform="translate(45 50) rotate(-45)">
                <circle r="33" cx="0" cy="0"></circle>
                <rect x="-8" y="32" width="16" height="30"></rect>
            </g>

            <g transform="translate(450 152)">
                <polyline points="-15,-20 -35,-20 -35,40 25,40 25,20"></polyline>
                <rect x="-15" y="-40" width="60" height="60"></rect>
            </g>

            <g transform="translate(50 352)">
                <polygon points="-35,-5 0,-40 35,-5"></polygon>
                <polygon points="-35,10 0,45 35,10"></polygon>
            </g>

            <g transform="translate(75 250)">
                <polyline points="-30,30 -60,0 -30,-30"></polyline>
                <polyline points="0,30 -30,0 0,-30"></polyline>
            </g>

            <g transform="translate(425 250) rotate(180)">
                <polyline points="-30,30 -60,0 -30,-30"></polyline>
                <polyline points="0,30 -30,0 0,-30"></polyline>
            </g>
        </g>
    </g>
</svg>
</a>
</div>

This is the <code>init_notebook_mode</code> cell from ITables v2.2.3<br>
(you should not see this message - is your notebook <it>trusted</it>?)
</noscript>
</div>
</div>
<div class="cell-output cell-output-display">
<table id="itables_f84831e9_f21b_4d60_9222_d98b67b73416" class="display nowrap" data-quarto-disable-processing="true" style="table-layout:auto;width:auto;margin:auto;caption-side:bottom">
<thead>
    <tr style="text-align: right;">
      
      <th>CUP</th>
      <th>REGIONE</th>
      <th>SIGLA_PROVINCIA</th>
      <th>COMUNE</th>
      <th>Data e ora presentazione domanda</th>
      <th>Spese Ammesse (€)</th>
      <th>Contributo Concesso (€)</th>
    </tr>
  </thead><tbody><tr>
<td style="vertical-align:middle; text-align:left">
<div style="float:left; margin-right: 10px;">
<a href="https://mwouts.github.io/itables/"><svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" width="64" viewbox="0 0 500 400" style="font-family: 'Droid Sans', sans-serif;">
    <g style="fill:#d9d7fc">
        <path d="M100,400H500V357H100Z"></path>
        <path d="M100,300H400V257H100Z"></path>
        <path d="M0,200H400V157H0Z"></path>
        <path d="M100,100H500V57H100Z"></path>
        <path d="M100,350H500V307H100Z"></path>
        <path d="M100,250H400V207H100Z"></path>
        <path d="M0,150H400V107H0Z"></path>
        <path d="M100,50H500V7H100Z"></path>
    </g>
    <g style="fill:#1a1366;stroke:#1a1366;">
   <rect x="100" y="7" width="400" height="43">
    <animate attributename="width" values="0;400;0" dur="5s" repeatcount="indefinite"></animate>
      <animate attributename="x" values="100;100;500" dur="5s" repeatcount="indefinite"></animate>
  </rect>
        <rect x="0" y="107" width="400" height="43">
    <animate attributename="width" values="0;400;0" dur="3.5s" repeatcount="indefinite"></animate>
    <animate attributename="x" values="0;0;400" dur="3.5s" repeatcount="indefinite"></animate>
  </rect>
        <rect x="100" y="207" width="300" height="43">
    <animate attributename="width" values="0;300;0" dur="3s" repeatcount="indefinite"></animate>
    <animate attributename="x" values="100;100;400" dur="3s" repeatcount="indefinite"></animate>
  </rect>
        <rect x="100" y="307" width="400" height="43">
    <animate attributename="width" values="0;400;0" dur="4s" repeatcount="indefinite"></animate>
      <animate attributename="x" values="100;100;500" dur="4s" repeatcount="indefinite"></animate>
  </rect>
        <g style="fill:transparent;stroke-width:8; stroke-linejoin:round" rx="5">
            <g transform="translate(45 50) rotate(-45)">
                <circle r="33" cx="0" cy="0"></circle>
                <rect x="-8" y="32" width="16" height="30"></rect>
            </g>

            <g transform="translate(450 152)">
                <polyline points="-15,-20 -35,-20 -35,40 25,40 25,20"></polyline>
                <rect x="-15" y="-40" width="60" height="60"></rect>
            </g>

            <g transform="translate(50 352)">
                <polygon points="-35,-5 0,-40 35,-5"></polygon>
                <polygon points="-35,10 0,45 35,10"></polygon>
            </g>

            <g transform="translate(75 250)">
                <polyline points="-30,30 -60,0 -30,-30"></polyline>
                <polyline points="0,30 -30,0 0,-30"></polyline>
            </g>

            <g transform="translate(425 250) rotate(180)">
                <polyline points="-30,30 -60,0 -30,-30"></polyline>
                <polyline points="0,30 -30,0 0,-30"></polyline>
            </g>
        </g>
    </g>
</svg>
</a>
</div>
<div>
Loading ITables v2.2.3 from the <code>init_notebook_mode</code> cell...
(need <a href="https://mwouts.github.io/itables/troubleshooting.html">help</a>?)</div></td>

</tr></tbody>
</table>
<script type="module">
    const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_2_3);

    document.querySelectorAll("#itables_f84831e9_f21b_4d60_9222_d98b67b73416:not(.dataTable)").forEach(table => {
        if (!(table instanceof HTMLTableElement))
            return;

        // Define the table data
        const data = [["C42E23004680008", "LOMBARDIA", "MB", "DESIO", "2023-11-14 15:56:45", 2150.0, 1500.0], ["B42E24043420008", "LAZIO", "FR", "ATINA", "2024-07-11 15:45:00", 1727.27, 1381.82], ["C42E23004900008", "LOMBARDIA", "MI", "MILANO", "2023-11-16 21:03:10", 2000.0, 1500.0], ["B42E24047920008", "LOMBARDIA", "MI", "MILANO", "2024-09-12 08:36:09", 3870.09, 1500.0], ["B92E24043830008", "FRIULI-VENEZIA GIULIA", "UD", "MANZANO", "2024-07-09 12:09:56", 2100.0, 1500.0], ["B82E24050480008", "LOMBARDIA", "MI", "PARABIAGO", "2024-07-09 18:39:24", 1363.64, 1090.91], ["B82E24051950008", "LAZIO", "RM", "ROMA", "2024-07-12 17:25:14", 1470.0, 1176.0], ["B92E24050250008", "VENETO", "VR", "SAN ZENO DI MONTAGNA", "2024-11-20 13:38:29", 1500.0, 1200.0], ["B32E24054440008", "VENETO", "PD", "VIGODARZERE", "2024-09-16 18:41:16", 1485.72, 1188.58], ["B42E24051050008", "VENETO", "PD", "CAMPOSAMPIERO", "2024-10-10 07:43:47", 1058.52, 846.82], ["B52E24043990008", "VALLE D'AOSTA", "AO", "SAINT-VINCENT", "2024-11-19 21:01:01", 872.77, 698.22], ["B72E24046880008", "PIEMONTE", "VB", "TOCENO", "2024-11-21 15:04:18", 1250.0, 1000.0], ["B42E24040300008", "ABRUZZO", "CH", "LANCIANO", "2024-07-08 10:25:11", 1500.0, 1200.0], ["B72E24046040008", "LOMBARDIA", "MI", "CASSANO D'ADDA", "2024-11-20 18:02:52", 694.75, 555.8], ["C62E23001410008", "LOMBARDIA", "MI", "TREZZANO SUL NAVIGLIO", "2023-11-09 11:40:12", 1639.22, 1311.38], ["C52E23001250008", "SICILIA", "ME", "MILAZZO", "2023-11-09 11:59:18", 1620.0, 1296.0], ["B62E24042010008", "LOMBARDIA", "BS", "GUSSAGO", "2024-07-15 17:16:21", 1771.64, 1417.31], ["B32E24058880008", "LAZIO", "RM", "ROCCA DI PAPA", "2024-11-14 09:15:35", 1400.0, 1120.0], ["C12E23001220008", "VENETO", "PD", "ARZERGRANDE", "2023-10-22 14:59:54", 1600.0, 1280.0], ["B42E24053400008", "CAMPANIA", "SA", "POLLA", "2024-10-29 14:50:51", 1500.0, 1200.0], ["C92E23004080008", "SICILIA", "PA", "CERDA", "2023-11-10 01:13:02", 1740.17, 1392.14], ["C22E23003010008", "LOMBARDIA", "PV", "SANNAZZARO DE'BURGONDI", "2023-11-17 20:00:38", 1287.48, 1029.98], ["C82E23005560008", "LAZIO", "RM", "ROMA", "2023-11-16 16:24:52", 1859.0, 1487.2], ["B32E24058350008", "PIEMONTE", "TO", "LEINI", "2024-10-12 09:43:46", 1520.0, 1216.0], ["B22E24039680008", "CAMPANIA", "SA", "CASTELNUOVO CILENTO", "2024-07-15 18:25:43", 1722.45, 1377.96], ["B12E24007510008", "SICILIA", "ME", "CONDRO'", "2024-03-01 14:26:45", 1859.0, 1487.2], ["B72E24045290008", "TRENTINO-ALTO ADIGE", "TN", "CALLIANO", "2024-09-30 11:37:23", 1669.15, 1335.32], ["B42E24011070008", "VENETO", "VR", "ROVERCHIARA", "2024-02-16 10:18:14", 2150.0, 1500.0], ["C42E23003880008", "PIEMONTE", "TO", "VILLARBASSE", "2023-11-13 23:30:28", 912.99, 730.39], ["B62E24040440008", "TOSCANA", "LU", "LUCCA", "2024-07-08 17:58:09", 1600.0, 1280.0], ["B62E24046200008", "LOMBARDIA", "MN", "CASALROMANO", "2024-10-15 22:03:35", 1830.0, 1464.0], ["B42E24051700008", "FRIULI-VENEZIA GIULIA", "PN", "PORCIA", "2024-11-05 19:03:21", 1065.57, 852.46], ["B32E24049430008", "LIGURIA", "SP", "BONASSOLA", "2024-07-12 17:42:46", 750.0, 600.0], ["C12E23002430008", "LAZIO", "LT", "APRILIA", "2023-11-09 19:35:42", 649.45, 519.56], ["B42E24053980008", "LOMBARDIA", "MI", "MILANO", "2024-11-16 10:10:54", 2538.52, 1500.0], ["C12E23003890008", "TOSCANA", "SI", "CHIANCIANO TERME", "2023-11-16 10:13:34", 1342.0, 1073.6], ["C42E23003790008", "LOMBARDIA", "MI", "MILANO", "2023-11-13 15:19:47", 1487.76, 1190.21], ["C42E23004030008", "LAZIO", "RM", "GENAZZANO", "2023-11-14 11:52:55", 774.92, 619.94], ["C42E23007230008", "SICILIA", "ME", "MESSINA", "2023-11-23 09:37:23", 1420.0, 1136.0], ["B82E24055300008", "LOMBARDIA", "BG", "LUZZANA", "2024-08-03 14:08:42", 4800.0, 1500.0], ["B32E24008370008", "VENETO", "VR", "VERONA", "2024-03-09 08:56:25", 1200.0, 960.0], ["B62E24042170008", "SICILIA", "CT", "MASCALUCIA", "2024-07-12 08:00:35", 1202.14, 961.71], ["B42E24007900008", "LOMBARDIA", "MI", "MILANO", "2024-02-16 10:09:23", 641.78, 513.42], ["B62E24041850008", "LOMBARDIA", "MI", "MAGENTA", "2024-07-10 17:06:32", 2000.0, 1500.0], ["B42E24007890008", "LOMBARDIA", "MI", "MILANO", "2024-02-19 10:14:12", 2852.0, 1500.0], ["B12E24051510008", "CAMPANIA", "CE", "CASAPULLA", "2024-10-24 16:04:09", 1875.0, 1500.0], ["B12E24053680008", "VENETO", "VI", "THIENE", "2024-11-10 08:24:31", 1800.0, 1440.0], ["C42E23002470008", "PIEMONTE", "TO", "FIANO", "2023-11-09 16:16:31", 1400.0, 1120.0], ["B92E24051300008", "PUGLIA", "BA", "BARI", "2024-10-02 17:23:41", 1400.0, 1120.0], ["C12E23006650008", "TOSCANA", "PI", "CALCINAIA", "2023-11-14 16:57:29", 661.6, 529.28], ["C72E23001010008", "LOMBARDIA", "MI", "INVERUNO", "2023-11-09 11:37:31", 870.0, 696.0], ["B52E24041660008", "VENETO", "VE", "TEGLIO VENETO", "2024-08-09 07:47:02", 1700.0, 1360.0], ["B32E24053350008", "VENETO", "VR", "VERONA", "2024-09-11 11:06:02", 1900.0, 1500.0], ["C12E23001170008", "EMILIA-ROMAGNA", "MO", "CASTELFRANCO EMILIA", "2023-10-19 14:34:12", 999.0, 799.2], ["C32E23004540008", "TRENTINO-ALTO ADIGE", "TN", "PERGINE VALSUGANA", "2023-11-17 09:17:52", 1798.18, 1438.54], ["C32E23006600008", "MARCHE", "AN", "ANCONA", "2023-11-22 23:49:11", 1107.7, 886.16], ["C82E23005830008", "LOMBARDIA", "MI", "PARABIAGO", "2023-11-17 12:46:01", 1059.84, 847.87], ["B12E24007820008", "EMILIA-ROMAGNA", "FC", "CESENA", "2024-02-16 13:02:59", 2303.07, 1500.0], ["B52E24039190008", "TOSCANA", "PT", "PISTOIA", "2024-07-09 10:28:42", 1230.4, 984.32], ["B72E24007200008", "SICILIA", "PA", "PALERMO", "2024-03-02 08:05:34", 568.95, 455.16], ["B72E24049570008", "BASILICATA", "PZ", "LATRONICO", "2024-11-13 10:11:20", 1850.0, 1480.0], ["B82E24048240008", "SICILIA", "SR", "NOTO", "2024-07-08 10:44:14", 1550.0, 1240.0], ["B42E24053210008", "LOMBARDIA", "MI", "MILANO", "2024-11-12 16:45:47", 1334.0, 1067.2], ["B12E24047910008", "PUGLIA", "FG", "STORNARA", "2024-09-02 15:20:15", 1363.64, 1090.91], ["C72E23000590008", "PUGLIA", "LE", "PORTO CESAREO", "2023-10-19 19:26:32", 530.0, 424.0], ["B62E24045200008", "PUGLIA", "LE", "ARADEO", "2024-08-31 16:54:09", 1245.0, 996.0], ["C42E23000910008", "PIEMONTE", "CN", "FOSSANO", "2023-10-31 18:14:39", 1129.84, 903.87], ["C22E23000620008", "LOMBARDIA", "MI", "PESCHIERA BORROMEO", "2023-11-02 09:00:06", 1475.41, 1180.33], ["C52E23003510008", "PIEMONTE", "TO", "VILLAR DORA", "2023-11-17 16:58:43", 1825.41, 1460.33], ["C22E23005280008", "VENETO", "VE", "SCORZE'", "2023-11-22 10:03:26", 1414.1, 1131.28], ["C22E23005490008", "MARCHE", "MC", "RECANATI", "2023-11-22 20:48:29", 1314.67, 1051.74], ["B12E24043550008", "TOSCANA", "AR", "AREZZO", "2024-07-09 07:00:35", 1200.0, 960.0], ["B72E24039920008", "LOMBARDIA", "BG", "CAVERNAGO", "2024-07-08 15:28:22", 1650.0, 1320.0], ["B42E24053340008", "VENETO", "VE", "DOLO", "2024-11-11 16:37:20", 1167.52, 934.02], ["C82E23009110008", "LOMBARDIA", "BS", "PAVONE DEL MELLA", "2023-11-22 15:45:14", 1363.63, 1090.9], ["B12E24048180008", "LOMBARDIA", "PV", "PAVIA", "2024-09-02 16:26:02", 802.16, 641.73], ["B42E24050350008", "SICILIA", "ME", "MESSINA", "2024-11-22 08:31:35", 965.09, 772.07], ["B52E24039430008", "EMILIA-ROMAGNA", "PR", "FIDENZA", "2024-07-09 08:32:18", 1410.6, 1128.48], ["B82E24063470008", "LAZIO", "RM", "MONTE PORZIO CATONE", "2024-11-15 15:53:40", 1500.0, 1200.0], ["B22E24041540008", "LOMBARDIA", "VA", "LAVENO-MOMBELLO", "2024-07-29 12:41:14", 1500.0, 1200.0], ["B82E24062650008", "LAZIO", "RM", "ROMA", "2024-10-31 13:15:56", 1558.0, 1246.4], ["B82E24047440008", "LOMBARDIA", "MI", "BASIGLIO", "2024-07-08 10:39:16", 1600.0, 1280.0], ["B42E24046490008", "LOMBARDIA", "LC", "GALBIATE", "2024-08-06 16:13:49", 1200.0, 960.0], ["C12E23002390008", "TRENTINO-ALTO ADIGE", "TN", "GIOVO", "2023-11-09 13:09:44", 2885.0, 1500.0], ["B42E24045270008", "PIEMONTE", "BI", "BIELLA", "2024-07-26 08:16:13", 1776.8, 1421.44], ["C82E23002160008", "LAZIO", "RM", "ROMA", "2023-11-09 12:08:39", 2586.28, 1500.0], ["C92E23003980008", "LOMBARDIA", "BG", "COSTA VOLPINO", "2023-11-13 10:52:56", 1500.0, 1200.0], ["C82E23004730008", "LAZIO", "RM", "ROMA", "2023-11-11 17:56:03", 1660.0, 1328.0], ["C62E23002740008", "SICILIA", "CT", "PATERNO'", "2023-11-10 08:07:31", 1885.25, 1500.0], ["B32E24051820008", "VENETO", "TV", "SAN VENDEMIANO", "2024-08-06 08:46:11", 1497.94, 1198.35], ["B62E24042130008", "LOMBARDIA", "CO", "MARIANO COMENSE", "2024-07-13 14:08:36", 1229.51, 983.61], ["B42E24040550008", "LOMBARDIA", "MI", "MILANO", "2024-07-08 10:35:40", 2020.49, 1500.0], ["C12E23001510008", "LOMBARDIA", "LC", "LECCO", "2023-11-09 11:54:05", 1056.56, 845.25], ["C32E23000900008", "LOMBARDIA", "CO", "CANTU'", "2023-10-19 11:31:57", 1691.8, 1353.44], ["B42E24049980008", "PUGLIA", "BA", "CONVERSANO", "2024-11-21 14:54:01", 1500.0, 1200.0], ["B32E24049890008", "PIEMONTE", "AT", "ASTI", "2024-07-19 16:32:22", 890.0, 712.0], ["B82E24054960008", "LOMBARDIA", "MI", "PARABIAGO", "2024-07-31 10:35:50", 1606.56, 1285.25], ["B52E24007900008", "TOSCANA", "SI", "POGGIBONSI", "2024-03-13 14:19:44", 1650.0, 1320.0], ["B52E24038650008", "LAZIO", "RM", "ANZIO", "2024-07-08 17:12:03", 1300.0, 1040.0], ["B42E24045500008", "LOMBARDIA", "MI", "MILANO", "2024-07-31 13:01:22", 2560.2, 1500.0], ["B72E24043140008", "ABRUZZO", "PE", "MONTESILVANO", "2024-07-29 12:32:51", 1354.55, 1083.64], ["B92E24053610008", "LOMBARDIA", "CR", "OFFANENGO", "2024-11-19 22:35:50", 1686.0, 1348.8], ["C62E23002490008", "TRENTINO-ALTO ADIGE", "TN", "TRENTO", "2023-11-10 11:00:47", 620.0, 496.0], ["B82E24053660008", "LAZIO", "RM", "ROMA", "2024-07-24 14:03:46", 1504.09, 1203.27], ["B42E24052180008", "ABRUZZO", "TE", "TERAMO", "2024-11-13 11:11:09", 1666.45, 1333.16], ["C52E23002100008", "PIEMONTE", "VB", "VERBANIA", "2023-11-11 17:57:24", 1350.0, 1080.0], ["B42E24050910008", "LOMBARDIA", "MI", "MILANO", "2024-10-09 07:25:25", 2283.78, 1500.0], ["C92E23006150008", "MOLISE", "CB", "RICCIA", "2023-11-21 18:21:12", 1599.75, 1279.8], ["B12E24043100008", "LOMBARDIA", "BS", "PADERNO FRANCIACORTA", "2024-07-08 15:24:21", 1064.0, 851.2], ["B22E24043180008", "SARDEGNA", "CA", "CAGLIARI", "2024-10-04 17:07:48", 870.0, 696.0], ["B72E24044000008", "LOMBARDIA", "LO", "CODOGNO", "2024-08-20 13:54:01", 2000.0, 1500.0], ["B82E24009770008", "MARCHE", "AP", "SAN BENEDETTO DEL TRONTO", "2024-03-11 18:16:36", 1500.0, 1200.0], ["C42E23003190008", "SARDEGNA", "CA", "CAPOTERRA", "2023-11-13 10:22:22", 1500.0, 1200.0], ["B72E24039560008", "TOSCANA", "GR", "CASTEL DEL PIANO", "2024-07-08 11:20:41", 1100.0, 880.0], ["B22E24042050008", "LOMBARDIA", "BS", "GAVARDO", "2024-08-11 18:06:30", 1700.0, 1360.0], ["B82E24052070008", "LAZIO", "RM", "ROMA", "2024-07-15 11:03:30", 2700.0, 1500.0], ["B22E24041060008", "CAMPANIA", "SA", "ALTAVILLA SILENTINA", "2024-07-23 10:00:55", 1818.18, 1454.54], ["B92E24053600008", "FRIULI-VENEZIA GIULIA", "UD", "MANZANO", "2024-11-19 22:41:31", 1193.44, 954.75], ["B92E24049910008", "PUGLIA", "BA", "BARI", "2024-11-21 12:14:13", 955.21, 764.17], ["B82E24062270008", "LAZIO", "RM", "ROMA", "2024-10-19 17:12:33", 1818.18, 1454.54], ["C42E23001410008", "LOMBARDIA", "BS", "POZZOLENGO", "2023-11-09 11:36:47", 1681.82, 1345.46], ["C12E23001910008", "LOMBARDIA", "CR", "CREMONA", "2023-11-09 12:10:57", 1350.0, 1080.0], ["C32E23003340008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2023-11-09 21:15:43", 1764.75, 1411.8], ["B92E24041900008", "LOMBARDIA", "MI", "SEGRATE", "2024-07-08 10:35:08", 1700.0, 1360.0], ["C32E23004550008", "LOMBARDIA", "VA", "VARESE", "2023-11-15 11:07:57", 1251.04, 1000.83], ["B62E24047650008", "SICILIA", "PA", "TERMINI IMERESE", "2024-11-21 18:11:49", 1950.0, 1500.0], ["B12E24047990008", "CALABRIA", "CS", "MANDATORICCIO", "2024-09-04 21:33:21", 1533.34, 1226.67], ["B72E24041250008", "CAMPANIA", "None", "NOLA", "2024-07-10 07:48:15", 1971.74, 1500.0], ["B32E24007550008", "CAMPANIA", "None", "BRUSCIANO", "2024-02-15 11:56:46", 1397.34, 1117.87], ["C72E23002120008", "EMILIA-ROMAGNA", "FE", "FERRARA", "2023-11-10 11:08:15", 1590.91, 1272.73], ["C32E23003890008", "FRIULI-VENEZIA GIULIA", "PN", "POLCENIGO", "2023-11-15 13:42:35", 1475.41, 1180.33], ["C82E23009080008", "PIEMONTE", "NO", "CASALVOLONE", "2023-11-22 22:08:32", 849.5, 679.6], ["C22E23003860008", "EMILIA-ROMAGNA", "RA", "FAENZA", "2023-11-19 20:25:29", 1900.0, 1500.0], ["C82E23003620008", "PUGLIA", "TA", "CASTELLANETA", "2023-11-13 12:05:59", 1500.0, 1200.0], ["C92E23006410008", "LOMBARDIA", "PV", "ROGNANO", "2023-11-20 18:29:12", 1434.43, 1147.54], ["C12E23000990008", "TOSCANA", "PI", "CASCIANA TERME LARI", "2023-10-21 08:36:32", 643.72, 514.98], ["B82E24060610008", "CALABRIA", "CS", "MONTALTO UFFUGO", "2024-11-22 10:50:07", 1229.51, 983.61], ["C92E23006160008", "EMILIA-ROMAGNA", "PR", "COLLECCHIO", "2023-11-21 18:45:39", 2204.39, 1500.0], ["B22E24045420008", "SARDEGNA", "CA", "CAGLIARI", "2024-10-23 14:03:28", 2441.98, 1500.0], ["B82E24056700008", "LAZIO", "RM", "ROMA", "2024-08-16 15:31:07", 1474.92, 1179.94], ["B12E24052310008", "LOMBARDIA", "PV", "TORRAZZA COSTE", "2024-11-13 16:38:50", 1400.0, 1120.0], ["B92E24042380008", "FRIULI-VENEZIA GIULIA", "UD", "FIUMICELLO VILLA VICENTINA", "2024-07-08 12:29:57", 1350.0, 1080.0], ["C82E23002090008", "LAZIO", "RM", "ROMA", "2023-11-09 11:40:18", 1624.07, 1299.26], ["B32E24050220008", "TRENTINO-ALTO ADIGE", "TN", "LEDRO", "2024-07-22 13:49:28", 1500.0, 1200.0], ["C32E23003790008", "SICILIA", "PA", "MONREALE", "2023-11-18 06:25:22", 547.55, 438.04], ["B82E24050990008", "LAZIO", "RM", "ROMA", "2024-07-08 21:56:24", 730.42, 584.34], ["B82E24009730008", "LAZIO", "RM", "ROMA", "2024-03-11 19:20:32", 634.95, 507.96], ["C22E23005600008", "VENETO", "TV", "CASTELFRANCO VENETO", "2023-11-23 06:36:42", 1190.96, 952.77], ["C82E23005910008", "VENETO", "VR", "SAN BONIFACIO", "2023-11-15 16:31:49", 674.99, 539.99], ["B92E24008540008", "VENETO", "TV", "PAESE", "2024-02-16 06:29:54", 1880.0, 1500.0], ["C42E23001090008", "LOMBARDIA", "PV", "GAMBOLO'", "2023-11-01 18:21:59", 1091.8, 873.44], ["B72E24045880008", "PIEMONTE", "TO", "IVREA", "2024-10-15 15:34:45", 994.0, 795.2], ["B22E24043400008", "LOMBARDIA", "CO", "ROVELLO PORRO", "2024-09-28 11:00:36", 1868.28, 1494.62], ["B82E24009810008", "LOMBARDIA", "CO", "CERMENATE", "2024-02-15 12:00:03", 1430.0, 1144.0], ["C92E23007910008", "LAZIO", "RM", "GUIDONIA MONTECELIO", "2023-11-22 10:32:51", 1598.36, 1278.69], ["B42E24048530008", "PIEMONTE", "TO", "VILLARBASSE", "2024-10-09 09:59:45", 1700.99, 1360.79], ["B42E24045920008", "SARDEGNA", "SS", "ARZACHENA", "2024-07-31 16:27:57", 1785.0, 1428.0], ["B62E24045680008", "VENETO", "VI", "ZANE'", "2024-09-14 10:55:17", 1128.78, 903.02], ["B82E24064590008", "EMILIA-ROMAGNA", "BO", "CASTEL SAN PIETRO TERME", "2024-10-14 20:14:33", 1450.0, 1160.0], ["B82E24051570008", "LAZIO", "RM", "ROMA", "2024-07-09 21:12:52", 850.0, 680.0], ["C92E23006760008", "PIEMONTE", "TO", "RIVAROLO CANAVESE", "2023-11-21 21:00:59", 1500.0, 1200.0], ["C92E23007470008", "PIEMONTE", "CN", "NEIVE", "2023-11-22 13:59:05", 1196.72, 957.38], ["B22E24042090008", "FRIULI-VENEZIA GIULIA", "UD", "UDINE", "2024-08-25 06:04:06", 2414.38, 1500.0], ["B92E24044740008", "SARDEGNA", "SS", "OLBIA", "2024-07-15 08:56:21", 1636.36, 1309.09], ["B42E24047320008", "LOMBARDIA", "MI", "MILANO", "2024-09-04 16:56:37", 2971.44, 1500.0], ["B72E24047690008", "SICILIA", "TP", "ALCAMO", "2024-10-18 06:56:16", 1393.44, 1114.75], ["B92E24044500008", "LOMBARDIA", "CR", "CREMA", "2024-07-10 17:07:19", 1470.0, 1176.0], ["B42E24044590008", "TOSCANA", "LI", "LIVORNO", "2024-07-17 13:40:54", 1600.0, 1280.0], ["B72E24040090008", "PUGLIA", "BA", "ALTAMURA", "2024-07-08 14:47:34", 1250.0, 1000.0], ["B62E24047500008", "LOMBARDIA", "MN", "MANTOVA", "2024-11-22 07:51:03", 1184.03, 947.22], ["B72E24005850008", "PIEMONTE", "AL", "TAGLIOLO MONFERRATO", "2024-02-21 13:49:54", 1557.38, 1245.9], ["B52E24041930008", "PUGLIA", "BA", "CORATO", "2024-08-09 12:50:36", 1500.0, 1200.0], ["C92E23005230008", "LOMBARDIA", "SO", "PRATA CAMPORTACCIO", "2023-11-15 13:37:50", 1875.0, 1500.0], ["B52E24037680008", "PIEMONTE", "AT", "CASTELL'ALFERO", "2024-07-08 10:31:56", 950.0, 760.0], ["C62E23001150008", "SICILIA", "CT", "CATANIA", "2023-11-09 12:38:25", 1327.87, 1062.3], ["C72E23000540008", "PIEMONTE", "TO", "ALPIGNANO", "2023-10-20 19:27:13", 1530.0, 1224.0], ["B22E24038500008", "EMILIA-ROMAGNA", "MO", "CASTELNUOVO RANGONE", "2024-07-08 13:55:25", 872.0, 697.6], ["C72E23004130008", "CAMPANIA", "None", "VICO EQUENSE", "2023-11-19 22:19:30", 1520.0, 1216.0], ["C92E23004140008", "VENETO", "VI", "MONTORSO VICENTINO", "2023-11-13 19:32:33", 1450.0, 1160.0], ["C82E23007090008", "LAZIO", "RM", "ROMA", "2023-11-20 17:08:16", 1660.0, 1328.0], ["C12E23005880008", "PIEMONTE", "TO", "CALUSO", "2023-11-22 13:11:21", 2179.34, 1500.0], ["B32E24055570008", "ABRUZZO", "AQ", "AVEZZANO", "2024-11-21 18:55:42", 1398.5, 1118.8], ["B22E24046510008", "LOMBARDIA", "MB", "BRUGHERIO", "2024-11-20 11:04:51", 1420.0, 1136.0], ["B52E24043450008", "LIGURIA", "SV", "FINALE LIGURE", "2024-09-17 07:52:18", 2459.02, 1500.0], ["B82E24057820008", "LAZIO", "RM", "ROMA", "2024-09-17 11:37:59", 2102.79, 1500.0], ["B22E24037330008", "LOMBARDIA", "MI", "COLOGNO MONZESE", "2024-07-08 10:23:13", 1580.0, 1264.0], ["B52E24045710008", "TOSCANA", "GR", "GROSSETO", "2024-10-21 16:18:11", 1600.0, 1280.0], ["B12E24007680008", "VENETO", "TV", "REFRONTOLO", "2024-02-26 13:56:32", 1000.0, 800.0], ["B82E24060480008", "LOMBARDIA", "BS", "BRESCIA", "2024-11-22 08:06:52", 1400.0, 1120.0], ["C82E23008680008", "LOMBARDIA", "MB", "LENTATE SUL SEVESO", "2023-11-22 16:48:47", 1405.78, 1124.62], ["C62E23002980008", "PIEMONTE", "NO", "CALTIGNAGA", "2023-11-16 19:13:33", 1640.0, 1312.0], ["C72E23001300008", "LOMBARDIA", "MI", "MAGNAGO", "2023-11-09 12:07:41", 1600.0, 1280.0], ["C72E23000760008", "FRIULI-VENEZIA GIULIA", "PN", "SPILIMBERGO", "2023-10-25 17:08:32", 1636.2, 1308.96], ["B32E24006620008", "LIGURIA", "GE", "GENOVA", "2024-02-15 16:03:14", 950.6, 760.48], ["C22E23002630008", "LOMBARDIA", "BS", "EDOLO", "2023-11-14 08:12:07", 1404.0, 1123.2], ["B72E24041460008", "EMILIA-ROMAGNA", "FE", "FERRARA", "2024-07-12 23:30:06", 1476.97, 1181.58], ["B42E24052700008", "SICILIA", "ME", "MESSINA", "2024-11-18 18:46:17", 591.39, 473.11], ["B82E24060570008", "MARCHE", "FM", "MONTEGIORGIO", "2024-11-21 21:00:36", 1272.73, 1018.18], ["B52E24041760008", "LOMBARDIA", "BS", "MAZZANO", "2024-08-08 08:39:22", 1325.0, 1060.0], ["B52E24042510008", "LOMBARDIA", "MN", "QUISTELLO", "2024-08-19 08:18:57", 1350.0, 1080.0], ["B82E24049920008", "LAZIO", "RM", "ROMA", "2024-07-08 16:47:12", 499.0, 399.2], ["C32E23000620008", "LOMBARDIA", "BG", "ALZANO LOMBARDO", "2023-10-23 09:36:53", 1597.0, 1277.6], ["B42E24040760008", "LOMBARDIA", "MB", "DESIO", "2024-07-08 10:55:22", 1488.55, 1190.84], ["B32E24053870008", "LAZIO", "RM", "ANGUILLARA SABAZIA", "2024-09-17 13:12:48", 1441.0, 1152.8], ["B12E24012100008", "LOMBARDIA", "MN", "RONCOFERRARO", "2024-02-15 11:50:57", 1150.0, 920.0], ["B22E24040650008", "SARDEGNA", "CA", "CAGLIARI", "2024-07-20 09:46:31", 1704.55, 1363.64], ["C42E23003070008", "SICILIA", "CT", "RAGALNA", "2023-11-12 10:13:50", 1600.0, 1280.0], ["B32E24048910008", "CAMPANIA", "CE", "PIETRAVAIRANO", "2024-07-12 10:55:34", 1300.0, 1040.0], ["B72E24043810008", "VENETO", "VI", "ENEGO", "2024-08-21 14:44:15", 1357.0, 1085.6], ["B92E24054150008", "LOMBARDIA", "SO", "CHIAVENNA", "2024-11-13 08:16:38", 2100.0, 1500.0], ["B92E24043410008", "VENETO", "PD", "PADOVA", "2024-07-08 15:01:20", 1200.0, 960.0], ["B42E24040700008", "LOMBARDIA", "VA", "BUSTO ARSIZIO", "2024-07-08 11:14:09", 985.0, 788.0], ["B62E24048210008", "LOMBARDIA", "BS", "FLERO", "2024-10-05 06:30:41", 1600.0, 1280.0], ["B82E24059720008", "PIEMONTE", "VC", "BORGOSESIA", "2024-11-21 07:05:41", 1500.0, 1200.0], ["B22E24038990008", "LOMBARDIA", "BS", "MONTICHIARI", "2024-07-09 10:47:52", 1500.0, 1200.0], ["C12E23005710008", "LOMBARDIA", "MI", "MARCALLO CON CASONE", "2023-11-23 01:08:36", 3062.0, 1500.0], ["B82E24058180008", "LOMBARDIA", "MI", "SAN GIULIANO MILANESE", "2024-09-16 17:10:48", 1338.52, 1070.82], ["B62E24039910008", "TRENTINO-ALTO ADIGE", "TN", "TRENTO", "2024-07-08 11:21:03", 1365.08, 1092.06], ["B82E24063120008", "LAZIO", "RM", "ROMA", "2024-10-28 22:02:53", 1253.52, 1002.82], ["B42E24040890008", "LOMBARDIA", "MI", "MILANO", "2024-07-08 10:36:30", 1800.0, 1440.0], ["B32E24057060008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2024-10-29 18:49:45", 1309.84, 1047.87], ["B62E24040740008", "VENETO", "VI", "DUEVILLE", "2024-07-08 13:45:56", 1850.0, 1480.0], ["B32E24046340008", "LOMBARDIA", "MI", "TURBIGO", "2024-07-08 12:57:13", 1170.0, 936.0], ["C12E23001690008", "FRIULI-VENEZIA GIULIA", "GO", "GRADO", "2023-11-09 12:27:23", 1236.36, 989.09], ["B12E24052550008", "VENETO", "TV", "MARENO DI PIAVE", "2024-11-20 10:11:11", 1850.0, 1480.0], ["C92E23003350008", "TRENTINO-ALTO ADIGE", "TN", "MOENA", "2023-11-09 13:24:38", 1829.2, 1463.36], ["C22E23005480008", "VENETO", "RO", "OCCHIOBELLO", "2023-11-22 16:52:01", 1540.0, 1232.0], ["C72E23004600008", "ABRUZZO", "CH", "CHIETI", "2023-11-18 21:07:31", 1500.0, 1200.0], ["C82E23002670008", "FRIULI-VENEZIA GIULIA", "PN", "ROVEREDO IN PIANO", "2023-11-09 12:42:44", 1954.55, 1500.0], ["C52E23001600008", "PIEMONTE", "TO", "BEINASCO", "2023-11-09 12:23:57", 2662.29, 2129.83], ["C92E23004210008", "UMBRIA", "PG", "PERUGIA", "2023-11-14 06:56:42", 1500.0, 1200.0], ["C52E23004230008", "PUGLIA", "TA", "LATERZA", "2023-11-21 15:05:36", 1089.0, 871.2], ["C72E23002840008", "LOMBARDIA", "SO", "PONTE IN VALTELLINA", "2023-11-17 21:29:39", 1537.6, 1230.08], ["B32E24012110008", "LOMBARDIA", "MI", "LEGNANO", "2024-02-15 12:37:49", 760.0, 608.0], ["C92E23003290008", "EMILIA-ROMAGNA", "MO", "SAVIGNANO SUL PANARO", "2023-11-09 13:57:53", 1818.0, 1454.4], ["B72E24045710008", "VENETO", "BL", "PERAROLO DI CADORE", "2024-11-19 21:16:09", 1300.0, 1040.0], ["B62E24041790008", "VENETO", "VR", "PESCANTINA", "2024-07-10 14:12:23", 2556.07, 1500.0], ["B72E24048600008", "VENETO", "VI", "BASSANO DEL GRAPPA", "2024-11-19 10:27:07", 1840.0, 1472.0], ["B12E24044090008", "ABRUZZO", "AQ", "L'AQUILA", "2024-07-10 07:41:42", 1597.72, 1278.18], ["C22E23001170008", "FRIULI-VENEZIA GIULIA", "PN", "FIUME VENETO", "2023-11-09 12:21:24", 1401.64, 1121.31], ["B82E24055220008", "PUGLIA", "BR", "BRINDISI", "2024-08-08 09:20:54", 1065.57, 852.46], ["B92E24046640008", "UMBRIA", "PG", "PERUGIA", "2024-07-31 14:46:42", 838.52, 670.82], ["B92E24046140008", "LOMBARDIA", "LO", "CASELLE LURANI", "2024-07-23 17:50:26", 1074.19, 859.35], ["C92E23002520008", "LOMBARDIA", "MI", "SEGRATE", "2023-11-09 11:37:38", 1454.1, 1163.28], ["C52E23004380008", "PUGLIA", "LE", "CORIGLIANO D'OTRANTO", "2023-11-21 19:12:27", 1229.51, 983.61], ["C22E23004210008", "FRIULI-VENEZIA GIULIA", "UD", "CORNO DI ROSAZZO", "2023-11-21 14:23:55", 1136.36, 909.09], ["C82E23005700008", "LAZIO", "RM", "ROMA", "2023-11-16 21:28:50", 1564.0, 1251.2], ["C82E23003940008", "LAZIO", "RM", "CIAMPINO", "2023-11-10 10:52:27", 922.73, 738.18], ["B82E24051490008", "LAZIO", "RM", "ROMA", "2024-07-10 09:21:00", 1501.0, 1200.8], ["B12E24042840008", "LOMBARDIA", "BG", "BERGAMO", "2024-07-08 13:17:02", 1194.38, 955.5], ["B92E24045540008", "SICILIA", "TP", "MAZARA DEL VALLO", "2024-07-20 11:57:32", 1475.41, 1180.33], ["B72E24044900008", "PUGLIA", "BT", "TRANI", "2024-09-19 18:30:50", 1192.0, 953.6], ["B42E24043640008", "CAMPANIA", "SA", "FISCIANO", "2024-07-10 11:42:03", 1460.71, 1168.57], ["B82E24064370008", "LOMBARDIA", "BG", "VILLA D'ADDA", "2024-11-20 08:01:37", 1105.93, 884.74], ["B92E24050710008", "EMILIA-ROMAGNA", "PR", "PARMA", "2024-11-21 17:03:02", 1900.0, 1500.0], ["B72E24043450008", "LAZIO", "RM", "ARDEA", "2024-08-09 06:23:02", 1500.0, 1200.0], ["B22E24037430008", "LAZIO", "LT", "LATINA", "2024-07-08 10:15:32", 422.0, 337.6], ["B32E24009090008", "PIEMONTE", "AT", "ASTI", "2024-03-11 21:38:24", 2300.0, 1500.0], ["C12E23000920008", "TRENTINO-ALTO ADIGE", "BZ", "LAIVES", "2023-10-19 10:49:48", 1550.33, 1240.26], ["B62E24043700008", "LIGURIA", "SP", "SANTO STEFANO DI MAGRA", "2024-07-30 15:42:53", 1843.18, 1474.54], ["B22E24046370008", "ABRUZZO", "PE", "PESCARA", "2024-11-15 12:53:02", 923.93, 739.14], ["B32E24050850008", "VENETO", "VI", "CASSOLA", "2024-08-01 12:09:09", 1640.0, 1312.0], ["B52E24045340008", "EMILIA-ROMAGNA", "MO", "VIGNOLA", "2024-10-14 12:39:46", 1500.0, 1200.0], ["B12E24042420008", "LOMBARDIA", "PV", "VOGHERA", "2024-07-08 13:16:14", 1456.56, 1165.25], ["C32E23001990008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2023-11-09 14:36:43", 1580.0, 1264.0], ["C42E23005660008", "CAMPANIA", "SA", "ROCCADASPIDE", "2023-11-21 18:04:35", 1855.79, 1484.63], ["C42E23005450008", "LOMBARDIA", "MI", "ABBIATEGRASSO", "2023-11-20 07:12:40", 1040.0, 832.0], ["C82E23003830008", "LOMBARDIA", "BS", "BRESCIA", "2023-11-11 09:21:24", 2684.0, 1500.0], ["C12E23002690008", "VENETO", "TV", "PEDEROBBA", "2023-11-10 19:11:51", 1197.0, 957.6], ["C42E23004000008", "TOSCANA", "SI", "COLLE DI VAL D'ELSA", "2023-11-14 12:46:14", 1189.35, 951.48], ["B92E24041290008", "LOMBARDIA", "MI", "SEGRATE", "2024-07-08 10:42:44", 1700.0, 1360.0], ["B82E24060960008", "EMILIA-ROMAGNA", "RE", "REGGIO NELL'EMILIA", "2024-09-22 07:27:49", 1260.0, 1008.0], ["B32E24051950008", "PUGLIA", "LE", "MAGLIE", "2024-08-08 16:31:57", 1515.57, 1212.46], ["B82E24053490008", "LOMBARDIA", "VA", "VERGIATE", "2024-07-23 16:44:12", 1500.0, 1200.0], ["B92E24042010008", "LOMBARDIA", "MI", "CERNUSCO SUL NAVIGLIO", "2024-07-08 10:36:14", 1500.0, 1200.0], ["B42E24046220008", "LOMBARDIA", "MI", "MILANO", "2024-08-08 06:43:50", 1990.0, 1500.0], ["B52E24007980008", "EMILIA-ROMAGNA", "BO", "BUDRIO", "2024-02-15 11:33:18", 1810.24, 1448.19], ["B32E24045340008", "LOMBARDIA", "MB", "ARCORE", "2024-07-08 10:43:01", 2050.23, 1500.0], ["C82E23000960008", "LOMBARDIA", "MI", "SAN GIULIANO MILANESE", "2023-10-19 10:45:18", 1280.0, 1024.0], ["B12E24008830008", "LOMBARDIA", "BS", "DESENZANO DEL GARDA", "2024-02-20 15:12:51", 1319.0, 1055.2], ["C72E23003300008", "TRENTINO-ALTO ADIGE", "TN", "MEZZOCORONA", "2023-11-16 10:33:56", 3796.15, 1500.0], ["B82E24046570008", "LAZIO", "RM", "ROMA", "2024-07-08 10:48:16", 2335.24, 1500.0], ["B62E24008340008", "EMILIA-ROMAGNA", "BO", "SAN LAZZARO DI SAVENA", "2024-03-12 10:18:05", 953.69, 762.95], ["B82E24063800008", "LAZIO", "RM", "ROMA", "2024-11-19 21:10:00", 1400.1, 1120.08], ["B92E24047260008", "EMILIA-ROMAGNA", "MO", "MODENA", "2024-08-08 11:39:02", 2000.0, 1500.0], ["C22E23004340008", "TRENTINO-ALTO ADIGE", "TN", "COMANO TERME", "2023-11-21 10:37:56", 1768.0, 1414.4], ["C22E23003690008", "VENETO", "VE", "IESOLO", "2023-11-14 16:21:55", 1950.0, 1500.0], ["C72E23003410008", "VENETO", "PD", "SAONARA", "2023-11-17 00:07:24", 1270.49, 1016.39], ["B32E24047390008", "VENETO", "VR", "VERONA", "2024-07-08 16:52:52", 600.0, 480.0], ["B92E24044070008", "EMILIA-ROMAGNA", "MO", "MODENA", "2024-07-10 12:54:13", 1229.51, 983.61], ["B32E24008060008", "LAZIO", "RM", "LANUVIO", "2024-02-21 17:58:43", 1475.41, 1180.33], ["C22E23001690008", "EMILIA-ROMAGNA", "RE", "MONTECCHIO EMILIA", "2023-11-09 13:51:52", 1727.27, 1381.82], ["B62E24039060008", "LOMBARDIA", "MN", "MANTOVA", "2024-07-08 10:59:51", 1348.0, 1078.4], ["B42E24041920008", "LOMBARDIA", "MI", "MILANO", "2024-07-08 13:45:57", 2286.78, 1500.0], ["C92E23005430008", "EMILIA-ROMAGNA", "MO", "MODENA", "2023-11-15 03:04:25", 16201.0, 1500.0], ["C72E23000650008", "EMILIA-ROMAGNA", "PR", "BUSSETO", "2023-10-20 14:18:25", 950.0, 760.0], ["C32E23006120008", "TOSCANA", "LU", "CAMAIORE", "2023-11-22 17:01:24", 1500.0, 1200.0], ["B32E24054320008", "VENETO", "VI", "VICENZA", "2024-11-12 20:35:55", 500.08, 400.06], ["B72E24043730008", "MARCHE", "MC", "CIVITANOVA MARCHE", "2024-08-22 22:37:42", 1137.0, 909.6], ["B52E24006540008", "FRIULI-VENEZIA GIULIA", "UD", "SAN VITO AL TORRE", "2024-02-27 23:25:21", 650.0, 520.0], ["B82E24055810008", "MARCHE", "PU", "MONTELABBATE", "2024-08-11 18:59:23", 1446.73, 1157.38], ["B82E24008840008", "LAZIO", "RM", "ROMA", "2024-03-07 09:28:15", 3170.71, 1500.0], ["B32E24059040008", "TRENTINO-ALTO ADIGE", "TN", "LAVIS", "2024-10-30 14:03:18", 1864.18, 1491.34], ["B52E24007970008", "LOMBARDIA", "BS", "FIESSE", "2024-02-19 11:52:26", 3539.0, 1500.0], ["B42E24046360008", "SARDEGNA", "CA", "CAPOTERRA", "2024-08-09 16:32:46", 1280.86, 1024.69], ["B32E24049080008", "EMILIA-ROMAGNA", "PC", "PIACENZA", "2024-07-15 11:47:43", 2438.52, 1500.0], ["B82E24052260008", "TOSCANA", "FI", "CAMPI BISENZIO", "2024-07-14 20:31:32", 1285.27, 1028.22], ["B52E24045180008", "VENETO", "TV", "CAERANO DI SAN MARCO", "2024-09-26 15:31:55", 1840.0, 1472.0], ["B42E24050680008", "TRENTINO-ALTO ADIGE", "TN", "CAVALESE", "2024-10-01 14:43:52", 1101.69, 881.35], ["C82E23004180008", "LOMBARDIA", "MI", "SOLARO", "2023-11-11 11:43:34", 1715.0, 1372.0], ["B32E24051430008", "EMILIA-ROMAGNA", "PC", "PIACENZA", "2024-08-10 08:12:36", 2200.0, 1500.0], ["C32E23004300008", "BASILICATA", "PZ", "POTENZA", "2023-11-15 18:12:43", 1005.96, 804.77], ["B62E24050380008", "SICILIA", "CT", "PATERNO'", "2024-11-08 20:52:40", 1363.64, 1090.91], ["C12E23004250008", "LOMBARDIA", "MI", "VIMODRONE", "2023-11-17 12:37:51", 1354.64, 1083.71], ["C62E23003880008", "SICILIA", "AG", "RAFFADALI", "2023-11-21 16:27:34", 1354.55, 1083.64], ["C32E23000890008", "CAMPANIA", "CE", "SAN MARCO EVANGELISTA", "2023-10-30 07:42:58", 1100.0, 880.0], ["C82E23008590008", "SARDEGNA", "CA", "QUARTU SANT'ELENA", "2023-11-22 12:43:00", 1454.55, 1163.64], ["B12E24045360008", "EMILIA-ROMAGNA", "FC", "CESENA", "2024-07-17 17:13:11", 1000.0, 800.0], ["B82E24063790008", "LAZIO", "RM", "ROMA", "2024-11-18 14:17:02", 1881.15, 1500.0], ["B82E24049690008", "PIEMONTE", "NO", "CAMERI", "2024-07-08 13:34:41", 1260.0, 1008.0], ["B32E24051850008", "CALABRIA", "RC", "REGGIO DI CALABRIA", "2024-08-05 11:25:34", 1516.39, 1213.11], ["B92E24050150008", "UMBRIA", "PG", "PERUGIA", "2024-11-20 12:12:30", 1515.57, 1212.46], ["B92E24052380008", "EMILIA-ROMAGNA", "PR", "COLLECCHIO", "2024-11-04 15:22:37", 1680.0, 1344.0], ["C52E23004330008", "LOMBARDIA", "MB", "GIUSSANO", "2023-11-20 09:59:12", 1550.0, 1240.0], ["C32E23005820008", "FRIULI-VENEZIA GIULIA", "UD", "LIGNANO SABBIADORO", "2023-11-22 15:22:47", 2100.0, 1500.0], ["C62E23004560008", "VENETO", "PD", "MONTEGROTTO TERME", "2023-11-21 22:22:04", 1480.0, 1184.0], ["C42E23001230008", "LOMBARDIA", "MI", "MILANO", "2023-11-02 09:43:07", 2000.0, 1500.0], ["C82E23006660008", "VENETO", "PD", "CITTADELLA", "2023-11-20 14:09:17", 1093.44, 874.75], ["C22E23004370008", "LOMBARDIA", "CO", "ROVELLO PORRO", "2023-11-18 21:55:48", 2925.5, 1500.0], ["B82E24055360008", "LAZIO", "RM", "ROMA", "2024-08-07 18:54:30", 1708.0, 1366.4], ["B62E24041490008", "LOMBARDIA", "MI", "MEDIGLIA", "2024-07-10 08:20:41", 1967.21, 1500.0], ["C42E23002500008", "LOMBARDIA", "MI", "MILANO", "2023-11-09 16:31:41", 2690.0, 1500.0], ["C22E23003510008", "FRIULI-VENEZIA GIULIA", "PN", "FIUME VENETO", "2023-11-16 11:36:01", 1040.98, 832.78], ["B22E24037800008", "LOMBARDIA", "MB", "SEREGNO", "2024-07-08 12:27:03", 1000.0, 800.0], ["B42E24007690008", "VENETO", "VR", "GREZZANA", "2024-03-09 16:42:21", 1100.0, 880.0], ["B32E24051320008", "LAZIO", "FR", "ARPINO", "2024-07-30 14:09:34", 1727.27, 1381.82], ["B92E24042760008", "VENETO", "PD", "PADOVA", "2024-07-08 12:38:44", 1134.0, 907.2], ["B22E24038460008", "CALABRIA", "CS", "RENDE", "2024-07-08 17:05:39", 1107.16, 885.73], ["C32E23001390008", "CAMPANIA", "None", "ISCHIA", "2023-11-09 11:34:42", 2100.0, 1500.0], ["B42E24039480008", "LOMBARDIA", "MI", "MILANO", "2024-07-08 10:44:57", 4010.44, 1500.0], ["B52E24037860008", "PUGLIA", "BA", "BITONTO", "2024-07-08 10:28:15", 1600.0, 1280.0], ["C32E23005090008", "LOMBARDIA", "VA", "GALLARATE", "2023-11-20 21:01:38", 1500.0, 1200.0], ["C22E23003670008", "PUGLIA", "BA", "CASTELLANA GROTTE", "2023-11-17 16:14:14", 1116.57, 893.26], ["C82E23003900008", "LAZIO", "RM", "ROMA", "2023-11-13 18:49:27", 1343.0, 1074.4], ["C82E23008540008", "LOMBARDIA", "BS", "BRESCIA", "2023-11-22 19:52:11", 1496.8, 1197.44], ["B42E24039730008", "VENETO", "VI", "CALDOGNO", "2024-07-08 10:54:18", 1294.51, 1035.61], ["B82E24065020008", "LOMBARDIA", "PV", "VARZI", "2024-11-11 15:37:50", 1979.0, 1500.0], ["C82E23006570008", "FRIULI-VENEZIA GIULIA", "UD", "BASILIANO", "2023-11-21 11:14:58", 1035.0, 828.0], ["C12E23004590008", "VENETO", "TV", "VITTORIO VENETO", "2023-11-17 09:24:51", 1800.0, 1440.0], ["C42E23007320008", "LOMBARDIA", "MI", "MILANO", "2023-11-22 19:40:21", 4253.33, 1500.0], ["B42E24006890008", "FRIULI-VENEZIA GIULIA", "UD", "CERVIGNANO DEL FRIULI", "2024-02-23 17:14:37", 1200.0, 960.0], ["C82E23009490008", "LAZIO", "RM", "ROMA", "2023-11-23 10:05:57", 2327.27, 1500.0], ["B82E24051920008", "LOMBARDIA", "MI", "PARABIAGO", "2024-07-15 14:16:09", 1400.0, 1120.0], ["B92E24049450008", "PIEMONTE", "VC", "QUARONA", "2024-10-21 03:14:30", 1270.49, 1016.39], ["B92E24053790008", "VENETO", "PD", "PADOVA", "2024-10-15 20:14:39", 1098.72, 878.98], ["B62E24042700008", "EMILIA-ROMAGNA", "RA", "RAVENNA", "2024-07-19 18:12:42", 1575.0, 1260.0], ["B42E24046350008", "VENETO", "VR", "SONA", "2024-08-07 17:25:08", 1906.07, 1500.0], ["B12E24041500008", "EMILIA-ROMAGNA", "FC", "CESENA", "2024-07-08 11:00:29", 2040.0, 1500.0], ["B42E24044080008", "PUGLIA", "BR", "SAN PANCRAZIO SALENTINO", "2024-07-12 18:33:32", 1300.0, 1040.0], ["C82E23008880008", "LAZIO", "FR", "BROCCOSTELLA", "2023-11-22 18:48:20", 2100.0, 1500.0], ["C42E23003630008", "LOMBARDIA", "MI", "MILANO", "2023-11-14 10:40:32", 1940.0, 1500.0], ["C42E23004430008", "UMBRIA", "TR", "TERNI", "2023-11-16 10:10:29", 1200.81, 960.65], ["C82E23006730008", "SICILIA", "AG", "REALMONTE", "2023-11-20 10:46:53", 809.05, 647.24], ["B52E24046340008", "TRENTINO-ALTO ADIGE", "TN", "TERZOLAS", "2024-11-18 11:17:40", 1290.0, 1032.0], ["B42E24041230008", "PUGLIA", "BA", "BITETTO", "2024-07-08 11:19:15", 1145.08, 916.06], ["B92E24041250008", "LOMBARDIA", "MI", "CERNUSCO SUL NAVIGLIO", "2024-07-08 10:52:19", 1640.0, 1312.0], ["B42E24045620008", "TOSCANA", "LU", "VIAREGGIO", "2024-07-30 08:17:41", 1800.0, 1440.0], ["C82E23000830008", "LAZIO", "RM", "ROMA", "2023-10-19 10:49:58", 2157.38, 1500.0], ["C42E23002530008", "SARDEGNA", "CA", "SESTU", "2023-11-09 13:24:14", 1149.0, 919.2], ["B32E24055900008", "SICILIA", "RG", "ACATE", "2024-09-19 18:01:59", 1055.82, 844.66], ["C42E23002400008", "LOMBARDIA", "MI", "MILANO", "2023-11-09 16:25:54", 950.4, 760.32], ["B82E24060930008", "LOMBARDIA", "MB", "LIMBIATE", "2024-11-21 16:49:53", 2699.68, 1500.0], ["B82E24059360008", "LAZIO", "RM", "ROMA", "2024-11-19 10:02:37", 2254.1, 1500.0], ["B52E24007210008", "LOMBARDIA", "MI", "BAREGGIO", "2024-02-16 19:41:19", 1509.84, 1207.87], ["C82E23005850008", "TOSCANA", "FI", "FIESOLE", "2023-11-16 20:48:43", 987.84, 790.27], ["B12E24011780008", "LOMBARDIA", "BS", "PADERNO FRANCIACORTA", "2024-02-17 13:52:42", 1500.0, 1200.0], ["C42E23005640008", "FRIULI-VENEZIA GIULIA", "UD", "TORREANO", "2023-11-19 16:44:46", 1272.73, 1018.18], ["B22E24046490008", "FRIULI-VENEZIA GIULIA", "UD", "MARTIGNACCO", "2024-11-20 10:07:26", 2000.0, 1500.0], ["B82E24060580008", "LOMBARDIA", "BS", "LONATO", "2024-11-21 16:19:32", 2800.0, 2240.0], ["B72E24045570008", "VENETO", "TV", "SAN BIAGIO DI CALLALTA", "2024-10-25 09:32:21", 2990.0, 1500.0], ["B42E24051070008", "VENETO", "TV", "TREVISO", "2024-10-13 09:10:00", 1750.0, 1400.0], ["B12E24053520008", "LOMBARDIA", "CR", "RIPALTA CREMASCA", "2024-11-18 09:26:47", 1500.0, 1200.0], ["B52E24041500008", "VENETO", "VR", "COSTERMANO", "2024-08-02 16:08:53", 1500.0, 1200.0], ["B12E24051790008", "PIEMONTE", "TO", "BRUINO", "2024-10-04 08:44:50", 1400.0, 1120.0], ["B62E24049750008", "PUGLIA", "LE", "MURO LECCESE", "2024-11-19 14:35:41", 1500.0, 1200.0], ["B62E24045260008", "CAMPANIA", "SA", "ASCEA", "2024-09-02 14:01:35", 1875.0, 1500.0], ["C52E23003370008", "PUGLIA", "BA", "MOLFETTA", "2023-11-15 13:47:01", 807.7, 646.16], ["B52E24005450008", "VENETO", "PD", "PIOVE DI SACCO", "2024-02-16 13:49:27", 1419.0, 1135.2], ["B12E24048960008", "MARCHE", "AN", "MONTEMARCIANO", "2024-10-11 20:46:30", 860.65, 688.52], ["B12E24053330008", "LOMBARDIA", "BG", "BERGAMO", "2024-11-08 09:37:07", 1560.25, 1248.2], ["B82E24009820008", "LOMBARDIA", "MI", "CARUGATE", "2024-02-17 09:44:08", 2090.0, 1500.0], ["C22E23003380008", "LOMBARDIA", "VA", "MORAZZONE", "2023-11-17 19:36:57", 1223.57, 978.86], ["B82E24054970008", "LOMBARDIA", "BS", "BRESCIA", "2024-08-01 21:33:15", 1380.0, 1104.0], ["B82E24052480008", "LAZIO", "RM", "ROMA", "2024-07-15 19:57:38", 1064.75, 851.8], ["B12E24044130008", "VENETO", "VI", "ARCUGNANO", "2024-07-10 17:12:58", 2400.0, 1500.0], ["B42E24049920008", "EMILIA-ROMAGNA", "MO", "SPILAMBERTO", "2024-11-21 16:37:53", 1229.51, 983.61], ["B62E24043400008", "LOMBARDIA", "MN", "CURTATONE", "2024-07-22 19:49:21", 1690.91, 1352.73], ["B62E24049430008", "TRENTINO-ALTO ADIGE", "BZ", "VALLE AURINA", "2024-11-15 13:38:33", 1465.0, 1172.0], ["B42E24049650008", "LOMBARDIA", "PV", "CAVA MANARA", "2024-11-20 16:07:41", 1038.52, 830.82], ["B32E24056230008", "FRIULI-VENEZIA GIULIA", "UD", "LIGNANO SABBIADORO", "2024-10-07 13:05:35", 1403.41, 1122.73], ["B62E24044690008", "LOMBARDIA", "BG", "LOVERE", "2024-08-17 13:58:36", 1475.41, 1180.33], ["B22E24047520008", "LOMBARDIA", "BS", "MONTICHIARI", "2024-11-14 15:25:14", 1725.24, 1380.19], ["B82E24053390008", "LOMBARDIA", "BS", "CAPRIOLO", "2024-07-18 21:41:56", 1680.0, 1344.0], ["C22E23002890008", "LOMBARDIA", "MN", "CASTIGLIONE DELLE STIVIERE", "2023-11-10 10:09:14", 1135.77, 908.62], ["C42E23001890008", "LOMBARDIA", "BS", "MARONE", "2023-11-09 12:31:01", 1300.0, 1040.0], ["C22E23000940008", "EMILIA-ROMAGNA", "RA", "FAENZA", "2023-11-09 11:17:01", 2480.0, 1500.0], ["B62E24049000008", "VENETO", "RO", "ADRIA", "2024-10-29 17:02:02", 1086.07, 868.86], ["B82E24050650008", "LOMBARDIA", "MI", "SOLARO", "2024-07-09 08:35:49", 1690.0, 1352.0], ["B12E24007480008", "LAZIO", "RM", "FRASCATI", "2024-02-22 14:57:52", 1244.77, 995.82], ["B52E24038550008", "CALABRIA", "CS", "CASTROVILLARI", "2024-07-08 18:25:46", 1500.0, 1200.0], ["C32E23001750008", "PIEMONTE", "BI", "CANDELO", "2023-11-09 12:32:11", 1550.0, 1240.0], ["C82E23001820008", "LAZIO", "RM", "ROMA", "2023-11-09 11:48:46", 1516.39, 1213.11], ["B32E24047630008", "LOMBARDIA", "BS", "CASTEL MELLA", "2024-07-09 12:20:38", 850.0, 680.0], ["B52E24038710008", "FRIULI-VENEZIA GIULIA", "PN", "SEQUALS", "2024-07-08 16:17:15", 1600.0, 1280.0], ["B22E24043930008", "SARDEGNA", "CA", "CAGLIARI", "2024-11-20 23:56:50", 1622.13, 1297.7], ["B72E24046500008", "TOSCANA", "FI", "CALENZANO", "2024-11-21 21:40:33", 1488.52, 1190.82], ["B22E24044920008", "EMILIA-ROMAGNA", "RA", "FAENZA", "2024-11-21 15:01:00", 1370.0, 1096.0], ["B52E24007220008", "CAMPANIA", "SA", "SALERNO", "2024-02-16 09:17:19", 1095.61, 876.49], ["C42E23002960008", "UMBRIA", "PG", "TODI", "2023-11-13 16:47:57", 1500.0, 1200.0], ["C52E23002590008", "LOMBARDIA", "PV", "VIGEVANO", "2023-11-13 09:25:31", 1970.0, 1500.0], ["C52E23002740008", "LOMBARDIA", "MI", "CORSICO", "2023-11-13 12:20:00", 1961.17, 1500.0], ["C72E23003760008", "VENETO", "VI", "ISOLA VICENTINA", "2023-11-17 15:25:14", 1040.65, 832.52], ["B52E24041020008", "CAMPANIA", "None", "AGEROLA", "2024-07-23 18:02:36", 1875.0, 1500.0], ["B22E24042800008", "PIEMONTE", "CN", "GENOLA", "2024-09-21 08:06:38", 1240.0, 992.0], ["B32E24056090008", "MARCHE", "AN", "ANCONA", "2024-10-10 07:30:20", 1639.34, 1311.47], ["B22E24040840008", "LOMBARDIA", "MI", "COLOGNO MONZESE", "2024-07-21 21:34:03", 1818.18, 1454.54], ["C92E23007970008", "TRENTINO-ALTO ADIGE", "TN", "PORTE DI RENDENA", "2023-11-23 07:52:36", 1516.39, 1213.11], ["C82E23005140008", "LOMBARDIA", "CO", "FENEGRO'", "2023-11-16 07:31:56", 1762.66, 1410.13], ["B12E24049820008", "ABRUZZO", "AQ", "L'AQUILA", "2024-11-21 10:38:10", 1860.0, 1488.0], ["B62E24041090008", "CAMPANIA", "None", "NAPOLI", "2024-07-09 05:08:19", 1676.23, 1340.98], ["C72E23004760008", "LOMBARDIA", "BS", "OSPITALETTO", "2023-11-22 13:25:53", 1509.84, 1207.87], ["C62E23004900008", "TRENTINO-ALTO ADIGE", "TN", "TRENTO", "2023-11-22 13:00:16", 1930.0, 1500.0], ["B82E24059150008", "EMILIA-ROMAGNA", "RE", "REGGIO NELL'EMILIA", "2024-09-15 08:21:56", 1300.0, 1040.0], ["B82E24063830008", "LAZIO", "RM", "ROMA", "2024-11-19 08:54:17", 1597.54, 1278.03], ["B32E24008080008", "TOSCANA", "PO", "PRATO", "2024-02-22 08:18:20", 2500.0, 1500.0], ["B22E24006390008", "VENETO", "RO", "OCCHIOBELLO", "2024-02-27 21:15:16", 1850.0, 1480.0], ["B32E24059080008", "TOSCANA", "FI", "CASTELFIORENTINO", "2024-11-05 08:44:33", 1932.69, 1500.0], ["B42E24040870008", "LOMBARDIA", "MI", "MILANO", "2024-07-08 10:35:36", 2038.89, 1500.0], ["B12E24044320008", "TOSCANA", "PI", "MONTOPOLI IN VAL D'ARNO", "2024-07-10 19:30:53", 1160.65, 928.52], ["B12E24047690008", "LOMBARDIA", "MI", "MARCALLO CON CASONE", "2024-09-09 20:12:08", 1139.35, 911.48], ["B42E24049150008", "VENETO", "TV", "TREVISO", "2024-11-20 16:56:47", 2058.48, 1500.0], ["C22E23003250008", "ABRUZZO", "PE", "PESCARA", "2023-11-17 23:25:47", 1188.64, 950.91], ["C92E23007670008", "VENETO", "TV", "MONTEBELLUNA", "2023-11-22 20:39:47", 1805.0, 1444.0], ["B82E24049230008", "LAZIO", "RM", "ROMA", "2024-07-08 11:19:27", 988.2, 790.56], ["B32E24046020008", "MOLISE", "CB", "CAMPOBASSO", "2024-07-08 10:44:48", 2171.32, 1500.0], ["B82E24049610008", "TOSCANA", "MS", "CARRARA", "2024-07-08 17:30:11", 1500.0, 1200.0], ["B92E24047540008", "FRIULI-VENEZIA GIULIA", "TS", "TRIESTE", "2024-08-24 11:17:18", 1210.0, 968.0], ["B42E24048100008", "LOMBARDIA", "MI", "MILANO", "2024-09-20 12:42:09", 1773.91, 1419.13], ["C52E23003200008", "EMILIA-ROMAGNA", "RN", "BELLARIA-IGEA MARINA", "2023-11-18 06:19:14", 1590.0, 1272.0], ["B52E24043650008", "EMILIA-ROMAGNA", "PR", "MONTECHIARUGOLO", "2024-10-13 07:18:31", 1970.0, 1500.0], ["B32E24048570008", "VENETO", "TV", "TREVIGNANO", "2024-07-11 15:52:49", 2873.0, 1500.0], ["B62E24045880008", "UMBRIA", "PG", "FOLIGNO", "2024-09-12 07:39:26", 1300.0, 1040.0], ["B82E24061760008", "MARCHE", "AN", "OSIMO", "2024-10-10 15:19:33", 504.09, 403.27], ["B12E24048010008", "MARCHE", "PU", "MONDOLFO", "2024-09-04 16:57:49", 1500.0, 1200.0], ["B22E24041680008", "TOSCANA", "PT", "AGLIANA", "2024-08-08 14:02:55", 1419.0, 1135.2], ["C32E23006300008", "VENETO", "VE", "PORTOGRUARO", "2023-11-22 13:52:54", 1206.1, 964.88], ["C72E23005110008", "VENETO", "VR", "SANT'AMBROGIO DI VALPOLICELLA", "2023-11-22 11:49:40", 2014.0, 1500.0], ["B92E24046180008", "EMILIA-ROMAGNA", "PR", "PARMA", "2024-07-23 13:15:37", 1702.46, 1361.97], ["B12E24048200008", "LAZIO", "LT", "SEZZE", "2024-09-06 06:55:32", 1236.39, 989.11], ["B82E24050290008", "FRIULI-VENEZIA GIULIA", "UD", "BASILIANO", "2024-07-08 13:29:56", 1650.0, 1320.0], ["B42E24052450008", "EMILIA-ROMAGNA", "BO", "VALSAMOGGIA", "2024-10-28 16:28:24", 1850.0, 1480.0], ["B12E24042770008", "LOMBARDIA", "BG", "BERGAMO", "2024-07-08 13:17:37", 770.0, 616.0], ["C92E23006650008", "PIEMONTE", "AL", "RIVALTA BORMIDA", "2023-11-18 17:25:37", 1215.41, 972.33], ["C12E23002970008", "CALABRIA", "CS", "SAN GIOVANNI IN FIORE", "2023-11-11 16:47:35", 1245.9, 996.72], ["C42E23003780008", "VENETO", "RO", "SAN MARTINO DI VENEZZE", "2023-11-10 22:41:44", 1300.0, 1040.0], ["C32E23004560008", "VENETO", "VR", "VERONA", "2023-11-14 12:12:14", 3347.16, 1500.0], ["C12E23004090008", "LOMBARDIA", "BG", "BERGAMO", "2023-11-18 08:29:42", 1209.84, 967.87], ["B32E24008510008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2024-02-19 19:18:19", 1950.0, 1500.0], ["C42E23004600008", "LOMBARDIA", "MI", "MILANO", "2023-11-15 16:09:03", 1144.0, 915.2], ["B82E24050270008", "LAZIO", "RM", "ROMA", "2024-07-08 15:39:05", 1349.18, 1079.34], ["B32E24049500008", "LOMBARDIA", "BG", "CARAVAGGIO", "2024-07-17 21:19:15", 1172.0, 937.6], ["B82E24057940008", "EMILIA-ROMAGNA", "RN", "RICCIONE", "2024-09-17 12:01:22", 1515.57, 1212.46], ["B62E24047580008", "EMILIA-ROMAGNA", "MO", "PALAGANO", "2024-11-22 07:54:09", 906.8, 725.44], ["B92E24052500008", "EMILIA-ROMAGNA", "BO", "MOLINELLA", "2024-10-26 08:56:30", 1622.13, 1297.7], ["B62E24048440008", "LOMBARDIA", "MI", "SETTIMO MILANESE", "2024-10-15 08:29:32", 2357.3, 1500.0], ["B12E24048830008", "LOMBARDIA", "BS", "CASTEGNATO", "2024-10-24 13:38:01", 1700.0, 1360.0], ["B52E24044600008", "LOMBARDIA", "VA", "GAVIRATE", "2024-11-21 21:30:47", 2150.01, 1500.0], ["C12E23006180008", "TOSCANA", "FI", "REGGELLO", "2023-11-22 13:49:54", 807.38, 645.9], ["C52E23004160008", "FRIULI-VENEZIA GIULIA", "PN", "PORDENONE", "2023-11-22 00:45:45", 1393.44, 1114.75], ["C62E23005420008", "EMILIA-ROMAGNA", "MO", "SAN POSSIDONIO", "2023-11-22 22:12:59", 535.0, 428.0], ["B42E24007050008", "SICILIA", "ME", "MESSINA", "2024-02-15 22:20:04", 1926.0, 1500.0], ["B72E24046830008", "FRIULI-VENEZIA GIULIA", "PN", "PRAVISDOMINI", "2024-11-21 20:27:16", 1229.5, 983.6], ["C12E23000630008", "EMILIA-ROMAGNA", "PR", "LESIGNANO DE'BAGNI", "2023-10-19 12:31:21", 1348.37, 1078.7], ["B62E24045210008", "SICILIA", "CL", "MILENA", "2024-08-31 10:57:32", 1500.0, 1200.0], ["B82E24058360008", "LOMBARDIA", "BG", "PALOSCO", "2024-09-17 14:02:58", 1362.46, 1089.97], ["B22E24040000008", "LOMBARDIA", "VA", "BISUSCHIO", "2024-07-12 11:48:57", 1956.7, 1500.0], ["B82E24056040008", "LAZIO", "RM", "ROMA", "2024-08-17 09:25:16", 1777.38, 1421.9], ["B12E24046750008", "EMILIA-ROMAGNA", "RE", "CADELBOSCO DI SOPRA", "2024-08-09 14:20:43", 1382.0, 1105.6], ["B62E24041860008", "LOMBARDIA", "MI", "MAGENTA", "2024-07-11 08:18:55", 938.52, 750.82], ["B72E24048730008", "FRIULI-VENEZIA GIULIA", "PN", "CORDENONS", "2024-11-19 16:51:59", 983.6, 786.88], ["C92E23008530008", "LOMBARDIA", "MI", "SEGRATE", "2023-11-14 13:25:40", 2459.0, 1500.0], ["C62E23002770008", "VENETO", "VR", "CASTELNUOVO DEL GARDA", "2023-11-13 12:04:19", 1302.0, 1041.6], ["B52E24038660008", "PUGLIA", "BA", "ADELFIA", "2024-07-08 14:04:25", 1800.0, 1440.0], ["C92E23007700008", "LOMBARDIA", "BS", "CARPENEDOLO", "2023-11-23 10:00:06", 1497.09, 1197.67], ["C52E23002140008", "VENETO", "VI", "SCHIO", "2023-11-11 08:18:01", 1100.0, 880.0], ["C52E23003040008", "VENETO", "VI", "POZZOLEONE", "2023-11-14 17:54:54", 1300.0, 1040.0], ["C92E23004450008", "UMBRIA", "PG", "PERUGIA", "2023-11-13 21:44:46", 1401.64, 1121.31], ["C12E23004320008", "LOMBARDIA", "BG", "BERGAMO", "2023-11-17 18:26:02", 1700.0, 1360.0], ["C52E23004510008", "LOMBARDIA", "MB", "GIUSSANO", "2023-11-21 22:01:21", 2120.0, 1500.0], ["C92E23007490008", "SICILIA", "TP", "MAZARA DEL VALLO", "2023-11-23 10:04:16", 942.62, 754.1], ["C52E23003960008", "SARDEGNA", "SS", "CHIARAMONTI", "2023-11-20 08:34:47", 588.0, 470.4], ["C12E23005210008", "LOMBARDIA", "CO", "FINO MORNASCO", "2023-11-21 14:25:24", 1513.64, 1210.91], ["B62E24006790008", "LOMBARDIA", "BS", "TREMOSINE SUL GARDA", "2024-02-15 18:36:02", 1500.0, 1200.0], ["B92E24051460008", "LOMBARDIA", "MI", "CERNUSCO SUL NAVIGLIO", "2024-10-06 11:38:09", 2093.44, 1500.0], ["B32E24054790008", "LIGURIA", "GE", "GENOVA", "2024-11-21 09:36:47", 1849.0, 1479.2], ["B32E24008540008", "LOMBARDIA", "VA", "VARESE", "2024-02-15 22:44:56", 1589.69, 1271.75], ["B72E24038930008", "PUGLIA", "BA", "ALTAMURA", "2024-07-08 10:42:25", 1500.0, 1200.0], ["B32E24055130008", "VENETO", "VR", "VERONA", "2024-11-20 19:43:52", 1650.0, 1320.0], ["B72E24043740008", "LAZIO", "RM", "ARICCIA", "2024-08-17 13:58:09", 1500.0, 1200.0], ["B12E24008860008", "PIEMONTE", "NO", "NOVARA", "2024-02-21 07:41:56", 710.65, 568.52], ["B32E24050270008", "VENETO", "VR", "SAN MARTINO BUON ALBERGO", "2024-07-25 20:42:41", 1452.5, 1162.0], ["B22E24040130008", "PIEMONTE", "TO", "RIVOLI", "2024-07-14 12:34:13", 1701.0, 1360.8], ["B82E24057660008", "VENETO", "VR", "SAN BONIFACIO", "2024-09-03 21:02:46", 1666.4, 1333.12], ["B82E24063710008", "EMILIA-ROMAGNA", "MO", "MIRANDOLA", "2024-11-18 13:47:11", 1792.0, 1433.6], ["B32E24058890008", "PIEMONTE", "AL", "TORTONA", "2024-11-15 10:59:39", 1900.0, 1500.0], ["C32E23002000008", "VENETO", "BL", "BELLUNO", "2023-11-09 13:36:37", 3415.51, 1500.0], ["B22E24045010008", "VENETO", "VI", "CORNEDO VICENTINO", "2024-10-01 19:54:44", 1170.85, 936.68], ["B72E24040280008", "LOMBARDIA", "MB", "USMATE VELATE", "2024-07-09 15:16:31", 1298.5, 1038.8], ["C82E23006350008", "LOMBARDIA", "BS", "BRESCIA", "2023-11-14 18:29:49", 2000.0, 1500.0], ["C22E23003150008", "LOMBARDIA", "BS", "COLOGNE", "2023-11-17 17:29:52", 1097.54, 878.03], ["C82E23007200008", "VENETO", "VI", "ALTAVILLA VICENTINA", "2023-11-19 13:59:06", 1409.84, 1127.87], ["C32E23002540008", "SICILIA", "CT", "CAMPOROTONDO ETNEO", "2023-11-13 15:18:06", 1341.0, 1072.8], ["C12E23005940008", "PIEMONTE", "CN", "CAVALLERMAGGIORE", "2023-11-22 16:14:31", 1650.0, 1320.0], ["B12E24053510008", "LOMBARDIA", "BG", "BERGAMO", "2024-11-14 12:53:42", 2776.85, 1500.0], ["C92E23006060008", "PIEMONTE", "VB", "VILLETTE", "2023-11-15 09:54:04", 1350.0, 1080.0], ["B52E24045540008", "PUGLIA", "BA", "RUVO DI PUGLIA", "2024-10-15 08:03:07", 1885.25, 1500.0], ["B12E24048250008", "LAZIO", "RM", "FIUMICINO", "2024-08-29 14:10:51", 1667.05, 1333.64], ["B62E24048260008", "LOMBARDIA", "BG", "LOVERE", "2024-10-07 17:39:26", 1363.64, 1090.91], ["C72E23003710008", "SICILIA", "CT", "PEDARA", "2023-11-15 11:48:14", 1475.41, 1180.33], ["B32E24058260008", "VENETO", "TV", "SAN VENDEMIANO", "2024-11-18 18:38:14", 1782.0, 1425.6], ["B52E24040620008", "LOMBARDIA", "BS", "PIANCOGNO", "2024-07-19 07:48:37", 1300.0, 1040.0], ["B92E24052050008", "LIGURIA", "SP", "ARCOLA", "2024-10-23 13:40:47", 593.0, 474.4], ["B32E24049050008", "TOSCANA", "SI", "CHIUSI", "2024-07-14 10:36:31", 1400.0, 1120.0], ["B22E24047500008", "FRIULI-VENEZIA GIULIA", "UD", "TERZO D'AQUILEIA", "2024-10-28 15:33:44", 1230.0, 984.0], ["B12E24008060008", "LOMBARDIA", "LC", "LECCO", "2024-03-07 19:32:47", 1500.0, 1200.0], ["B72E24010570008", "PIEMONTE", "CN", "BRA", "2024-02-16 11:36:08", 1900.0, 1500.0], ["B12E24044280008", "LOMBARDIA", "BG", "BERGAMO", "2024-07-10 11:02:35", 1618.52, 1294.82], ["B22E24039450008", "VENETO", "PD", "LEGNARO", "2024-07-10 10:19:55", 1620.14, 1296.11], ["B92E24041620008", "LOMBARDIA", "MB", "CESANO MADERNO", "2024-07-08 11:04:21", 1700.0, 1360.0], ["B32E24047580008", "PIEMONTE", "TO", "AVIGLIANA", "2024-07-09 07:25:43", 1830.0, 1464.0], ["B22E24036900008", "TRENTINO-ALTO ADIGE", "BZ", "SAN CANDIDO", "2024-07-08 11:15:19", 959.09, 767.27], ["B72E24039760008", "VENETO", "VI", "BASSANO DEL GRAPPA", "2024-07-08 11:38:38", 1680.0, 1344.0], ["B32E24007900008", "LOMBARDIA", "BG", "CASTELLI CALEPIO", "2024-02-15 19:07:28", 1817.85, 1454.28], ["B32E24045100008", "LOMBARDIA", "CO", "CANTU'", "2024-07-08 10:39:48", 849.51, 679.61], ["B32E24053200008", "LOMBARDIA", "BG", "CARAVAGGIO", "2024-09-01 13:36:28", 1809.09, 1447.27], ["B72E24042470008", "TRENTINO-ALTO ADIGE", "TN", "BLEGGIO SUPERIORE", "2024-07-22 14:44:11", 1500.0, 1200.0], ["B62E24048740008", "EMILIA-ROMAGNA", "FC", "FORLI'", "2024-10-25 07:28:03", 2100.0, 1500.0], ["B32E24057110008", "VENETO", "VR", "VERONA", "2024-10-08 09:55:36", 1400.0, 1120.0], ["B82E24049600008", "LAZIO", "RM", "ROMA", "2024-07-08 17:25:51", 2370.09, 1500.0], ["B32E24050250008", "PUGLIA", "BA", "PUTIGNANO", "2024-07-26 18:33:57", 1363.64, 1090.91], ["B12E24053600008", "VENETO", "TV", "VITTORIO VENETO", "2024-10-26 15:55:44", 1500.0, 1200.0], ["C22E23002820008", "LOMBARDIA", "MB", "SEREGNO", "2023-11-10 08:58:20", 1909.83, 1500.0], ["B52E24045830008", "LAZIO", "RM", "POMEZIA", "2024-10-19 10:31:45", 1620.0, 1296.0], ["B82E24049810008", "LAZIO", "RM", "ROMA", "2024-07-08 13:47:00", 3155.74, 1500.0], ["B92E24042030008", "VENETO", "RO", "BADIA POLESINE", "2024-07-08 10:19:49", 1581.12, 1264.9], ["C82E23000880008", "LOMBARDIA", "MI", "SEDRIANO", "2023-10-23 16:35:55", 1225.0, 980.0], ["B92E24047020008", "TOSCANA", "FI", "FIGLINE E INCISA VALDARNO", "2024-08-05 13:52:29", 1400.0, 1120.0], ["B12E24047800008", "LOMBARDIA", "BG", "CASNIGO", "2024-09-10 14:38:20", 1400.0, 1120.0], ["B22E24047580008", "VENETO", "VI", "BARBARANO MOSSANO", "2024-11-05 19:10:30", 1000.0, 800.0], ["B42E24051320008", "LOMBARDIA", "MI", "MILANO", "2024-10-16 16:04:00", 1577.06, 1261.65], ["C12E23001050008", "VENETO", "VI", "LONGARE", "2023-10-19 19:37:01", 1695.74, 1356.59], ["B72E24048930008", "PIEMONTE", "TO", "CANTALUPA", "2024-11-19 15:29:35", 1500.0, 1200.0], ["B82E24047700008", "LAZIO", "RM", "ROMA", "2024-07-08 10:19:58", 1927.21, 1500.0], ["B82E24048150008", "LAZIO", "RM", "ROMA", "2024-07-08 10:20:06", 1950.0, 1500.0], ["C32E23006340008", "LOMBARDIA", "LC", "ROBBIATE", "2023-11-23 09:17:26", 1520.01, 1216.01], ["B32E24057500008", "CAMPANIA", "None", "ACERRA", "2024-11-12 11:26:06", 1872.73, 1498.18], ["B52E24042290008", "LOMBARDIA", "BS", "REZZATO", "2024-08-22 21:06:12", 1340.42, 1072.34], ["B12E24042620008", "PIEMONTE", "TO", "TORINO", "2024-07-08 13:14:19", 1888.65, 1500.0], ["B52E24047200008", "PUGLIA", "BA", "RUVO DI PUGLIA", "2024-11-07 10:52:42", 1885.24, 1500.0], ["B42E24042520008", "LOMBARDIA", "VA", "VEDANO OLONA", "2024-07-08 20:15:58", 650.0, 520.0], ["B12E24053470008", "LOMBARDIA", "CR", "CREMONA", "2024-11-14 16:23:22", 1454.92, 1163.94], ["B92E24046970008", "FRIULI-VENEZIA GIULIA", "UD", "TAVAGNACCO", "2024-08-09 15:48:10", 1823.0, 1458.4], ["B82E24048600008", "VENETO", "PD", "CITTADELLA", "2024-07-08 10:25:44", 974.1, 779.28], ["B92E24054340008", "VENETO", "PD", "PADOVA", "2024-11-15 18:21:38", 649.0, 519.2], ["B42E24044010008", "LOMBARDIA", "MI", "RHO", "2024-07-12 13:44:38", 1836.7, 1469.36], ["B92E24046840008", "VENETO", "PD", "VO", "2024-08-06 17:22:32", 963.52, 770.82], ["C32E23001940008", "VENETO", "VI", "VICENZA", "2023-11-09 12:21:02", 1266.77, 1013.42], ["C52E23001660008", "LAZIO", "RM", "POMEZIA", "2023-11-09 13:32:42", 1475.41, 1180.33], ["B22E24044060008", "EMILIA-ROMAGNA", "PR", "TERENZO", "2024-11-21 11:47:03", 2000.0, 1500.0], ["B32E24056600008", "LOMBARDIA", "BS", "ERBUSCO", "2024-10-19 17:13:35", 1500.0, 1200.0], ["B32E24046070008", "LOMBARDIA", "BG", "VALBREMBO", "2024-07-08 10:35:26", 1269.67, 1015.74], ["B32E24045010008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2024-07-08 10:55:35", 2300.0, 1500.0], ["C52E23003010008", "VENETO", "TV", "RONCADE", "2023-11-17 10:58:34", 2520.0, 1500.0], ["C42E23005160008", "LOMBARDIA", "BS", "PALAZZOLO SULL'OGLIO", "2023-11-16 10:19:38", 1290.0, 1032.0], ["C52E23004750008", "LOMBARDIA", "CO", "TORNO", "2023-11-22 11:12:45", 2023.0, 1500.0], ["B22E24038580008", "LOMBARDIA", "MI", "BUCCINASCO", "2024-07-08 17:40:38", 1815.41, 1452.33], ["C12E23005230008", "PIEMONTE", "TO", "TORINO", "2023-11-21 12:05:49", 2049.0, 1500.0], ["C12E23006380008", "BASILICATA", "MT", "MATERA", "2023-11-23 10:43:59", 650.0, 520.0], ["B22E24047190008", "LAZIO", "LT", "LATINA", "2024-11-11 18:27:22", 1008.94, 807.15], ["B52E24042260008", "SICILIA", "RG", "VITTORIA", "2024-08-26 15:26:48", 1900.0, 1500.0], ["B82E24058610008", "LAZIO", "RM", "ROMA", "2024-10-08 17:23:15", 1000.0, 800.0], ["B82E24054720008", "LAZIO", "RM", "ROMA", "2024-08-02 09:20:02", 1400.0, 1120.0], ["B82E24047600008", "LAZIO", "RM", "ROMA", "2024-07-08 10:34:33", 1263.67, 1010.94], ["B82E24046590008", "LOMBARDIA", "BG", "TREVIOLO", "2024-07-08 10:58:07", 1300.0, 1040.0], ["B62E24039800008", "LOMBARDIA", "BG", "BOLTIERE", "2024-07-08 10:26:55", 1498.52, 1198.82], ["B62E24041700008", "VENETO", "VR", "PESCANTINA", "2024-07-11 14:14:46", 920.49, 736.39], ["B12E24041940008", "LOMBARDIA", "MI", "VIMODRONE", "2024-07-08 10:30:01", 1428.68, 1142.94], ["B32E24007830008", "LIGURIA", "GE", "GENOVA", "2024-03-04 19:35:04", 970.0, 776.0], ["B12E24047280008", "LOMBARDIA", "MI", "TRUCCAZZANO", "2024-08-27 14:48:32", 888.52, 710.82], ["C22E23002240008", "LAZIO", "RM", "BRACCIANO", "2023-11-13 09:12:44", 1475.41, 1180.33], ["C62E23003870008", "CAMPANIA", "None", "NAPOLI", "2023-11-21 09:19:30", 1435.0, 1148.0], ["B92E24052980008", "EMILIA-ROMAGNA", "MO", "MODENA", "2024-10-30 12:50:46", 1499.0, 1199.2], ["C42E23003110008", "TOSCANA", "LI", "LIVORNO", "2023-11-13 18:52:05", 1800.0, 1440.0], ["B82E24058270008", "PIEMONTE", "NO", "TRECATE", "2024-09-23 12:37:03", 1950.0, 1500.0], ["B32E24057360008", "LIGURIA", "GE", "GENOVA", "2024-11-13 10:02:30", 4430.0, 1500.0], ["B32E24050750008", "LOMBARDIA", "BG", "BRACCA", "2024-07-31 20:31:38", 1818.18, 1454.54], ["B22E24042100008", "PIEMONTE", "CN", "MAGLIANO ALPI", "2024-08-19 07:45:35", 1090.0, 872.0], ["B42E24043590008", "SARDEGNA", "SU", "CARBONIA", "2024-07-09 22:02:22", 899.0, 719.2], ["B32E24046790008", "PIEMONTE", "TO", "LEINI", "2024-07-08 11:31:17", 1600.0, 1280.0], ["B92E24051080008", "VENETO", "TV", "PAESE", "2024-11-22 08:14:31", 1980.0, 1500.0], ["C42E23001780008", "LOMBARDIA", "MI", "RHO", "2023-11-09 11:51:12", 1052.46, 841.97], ["C42E23003680008", "LOMBARDIA", "MB", "DESIO", "2023-11-13 10:47:17", 2600.0, 1500.0], ["B92E24047820008", "FRIULI-VENEZIA GIULIA", "TS", "TRIESTE", "2024-08-13 09:36:07", 983.2, 786.56], ["B82E24054560008", "EMILIA-ROMAGNA", "MO", "MIRANDOLA", "2024-07-26 19:51:47", 1800.0, 1440.0], ["B32E24058400008", "TOSCANA", "LI", "ROSIGNANO MARITTIMO", "2024-10-07 08:47:54", 1250.0, 1000.0], ["C82E23003930008", "LAZIO", "RM", "ROMA", "2023-11-09 21:53:39", 1440.0, 1152.0], ["B12E24050950008", "EMILIA-ROMAGNA", "FC", "CESENA", "2024-10-06 00:50:27", 1182.52, 946.02], ["B82E24050830008", "LOMBARDIA", "BS", "BRESCIA", "2024-07-09 14:07:53", 1830.0, 1464.0], ["B42E24053420008", "LOMBARDIA", "MI", "MILANO", "2024-11-12 23:06:12", 3000.0, 1500.0], ["C82E23001280008", "FRIULI-VENEZIA GIULIA", "GO", "GORIZIA", "2023-10-19 10:38:18", 1500.0, 1200.0], ["B22E24009810008", "VENETO", "TV", "MORIAGO DELLA BATTAGLIA", "2024-02-20 15:06:46", 327.87, 262.3], ["B92E24043270008", "VENETO", "PD", "PADOVA", "2024-07-08 14:47:49", 1727.27, 1381.82], ["B62E24049170008", "EMILIA-ROMAGNA", "RE", "SCANDIANO", "2024-11-06 07:46:48", 1515.57, 1212.46], ["B32E24059050008", "LAZIO", "RM", "ANGUILLARA SABAZIA", "2024-11-04 11:45:02", 1559.36, 1247.49], ["C22E23001800008", "LOMBARDIA", "CO", "ALBESE CON CASSANO", "2023-11-09 13:56:09", 1353.7, 1082.96], ["B52E24045880008", "LOMBARDIA", "SO", "PIURO", "2024-10-31 15:22:02", 747.54, 598.03], ["C52E23002150008", "LOMBARDIA", "CO", "LOMAZZO", "2023-11-13 19:00:43", 1500.0, 1200.0], ["C72E23002720008", "VENETO", "VI", "ZERMEGHEDO", "2023-11-13 15:13:36", 1450.0, 1160.0], ["B32E24050740008", "LOMBARDIA", "LC", "LOMAGNA", "2024-08-01 17:20:11", 1850.0, 1480.0], ["B92E24046030008", "FRIULI-VENEZIA GIULIA", "UD", "PRECENICCO", "2024-07-23 14:54:52", 2309.09, 1500.0], ["C12E23002180008", "PIEMONTE", "TO", "TORINO", "2023-11-09 13:28:53", 1831.2, 1464.96], ["B82E24008420008", "LAZIO", "RM", "ROMA", "2024-03-06 10:14:12", 599.0, 479.2], ["C82E23007910008", "PUGLIA", "LE", "CASTRI DI LECCE", "2023-11-21 14:24:41", 1850.0, 1480.0], ["B92E24047610008", "PUGLIA", "BA", "CASAMASSIMA", "2024-08-20 15:05:58", 2023.98, 1500.0], ["B22E24006760008", "VENETO", "TV", "ASOLO", "2024-02-15 17:05:51", 1565.3, 1252.24], ["C62E23005530008", "TOSCANA", "SI", "SIENA", "2023-11-23 09:12:12", 1509.84, 1207.87], ["C72E23002190008", "LOMBARDIA", "SO", "PONTE IN VALTELLINA", "2023-11-10 20:35:45", 1467.0, 1173.6], ["B42E24053100008", "VENETO", "PD", "ESTE", "2024-11-18 18:36:46", 1979.0, 1500.0], ["B72E24010490008", "VENETO", "VI", "ISOLA VICENTINA", "2024-02-19 13:11:48", 1530.0, 1224.0], ["B32E24048580008", "CAMPANIA", "SA", "NOCERA INFERIORE", "2024-07-10 08:17:53", 467.21, 373.77], ["B42E24046650008", "LOMBARDIA", "MI", "MILANO", "2024-08-11 11:09:31", 2217.55, 1500.0], ["B42E24048760008", "SICILIA", "ME", "MESSINA", "2024-10-25 14:24:02", 1200.0, 960.0], ["B72E24007100008", "CAMPANIA", "AV", "BONITO", "2024-03-02 15:14:09", 1045.08, 836.06], ["B12E24046740008", "LOMBARDIA", "BG", "BERGAMO", "2024-08-07 09:08:56", 1452.25, 1161.8], ["B62E24045650008", "VENETO", "VE", "MIRA", "2024-09-18 19:57:58", 1200.0, 960.0], ["B42E24052660008", "LOMBARDIA", "VA", "BUSTO ARSIZIO", "2024-11-18 15:57:27", 1950.0, 1500.0], ["B22E24043230008", "SICILIA", "PA", "CARINI", "2024-09-28 11:57:15", 1147.52, 918.02], ["B82E24059690008", "CAMPANIA", "None", "VILLARICCA", "2024-11-20 12:49:25", 1872.73, 1498.18], ["C12E23004170008", "LOMBARDIA", "LC", "LECCO", "2023-11-18 12:01:00", 1570.48, 1256.38], ["C12E23004910008", "LAZIO", "RM", "FRASCATI", "2023-11-21 14:16:58", 1234.73, 987.78], ["C92E23001090008", "VENETO", "TV", "MONTEBELLUNA", "2023-10-19 10:33:32", 2690.91, 1500.0], ["C32E23001320008", "LOMBARDIA", "MB", "SEVESO", "2023-11-09 11:26:39", 2800.0, 1500.0], ["C22E23003300008", "VENETO", "TV", "VOLPAGO DEL MONTELLO", "2023-11-18 15:30:09", 1720.0, 1376.0], ["C12E23002230008", "LOMBARDIA", "VA", "CARDANO AL CAMPO", "2023-11-09 18:26:37", 1500.0, 1200.0], ["B52E24042810008", "MOLISE", "IS", "ISERNIA", "2024-09-11 08:56:58", 2093.35, 1500.0], ["C82E23003750008", "LAZIO", "RM", "ROMA", "2023-11-09 20:43:05", 1689.84, 1351.87], ["C42E23006790008", "LOMBARDIA", "BG", "STEZZANO", "2023-11-22 09:23:53", 3900.0, 3120.0], ["B42E24043050008", "LAZIO", "RI", "MONTOPOLI DI SABINA", "2024-07-09 00:48:11", 1844.26, 1475.41], ["B42E24046740008", "LOMBARDIA", "MI", "MILANO", "2024-08-04 13:53:02", 1990.0, 1500.0], ["C12E23005600008", "LOMBARDIA", "BG", "BERGAMO", "2023-11-23 07:50:32", 1700.0, 1360.0], ["C42E23003570008", "EMILIA-ROMAGNA", "RN", "SANTARCANGELO DI ROMAGNA", "2023-11-13 12:21:17", 1209.84, 967.87], ["B92E24045430008", "TOSCANA", "PO", "CARMIGNANO", "2024-07-18 17:24:31", 1705.52, 1364.42], ["C12E23002540008", "PIEMONTE", "TO", "NICHELINO", "2023-11-09 15:41:35", 1129.8, 903.84], ["B12E24048560008", "MARCHE", "AN", "SENIGALLIA", "2024-09-16 09:33:30", 1203.52, 962.82], ["B82E24056580008", "LAZIO", "RM", "ROMA", "2024-08-27 13:50:23", 1500.0, 1200.0], ["B32E24051750008", "UMBRIA", "PG", "GUBBIO", "2024-08-05 13:33:54", 1875.96, 1500.0], ["B62E24042100008", "LOMBARDIA", "VA", "ORIGGIO", "2024-07-12 17:04:25", 957.38, 765.9], ["C32E23001630008", "PIEMONTE", "AL", "ALESSANDRIA", "2023-11-09 11:53:52", 790.0, 632.0], ["B22E24044730008", "VENETO", "VR", "CAPRINO VERONESE", "2024-11-22 10:58:09", 1796.84, 1437.47], ["C42E23001760008", "PUGLIA", "LE", "COPERTINO", "2023-11-09 11:49:20", 1463.11, 1170.49], ["B32E24049910008", "LAZIO", "RM", "ROCCA DI PAPA", "2024-07-20 17:30:52", 868.85, 695.08], ["C32E23005380008", "ABRUZZO", "AQ", "AVEZZANO", "2023-11-22 08:53:28", 1475.41, 1180.33], ["B12E24048750008", "LOMBARDIA", "LO", "LODI", "2024-09-17 19:13:49", 1938.52, 1500.0], ["B42E24052760008", "TRENTINO-ALTO ADIGE", "TN", "PREDAIA", "2024-11-19 07:43:15", 1425.0, 1140.0], ["B42E24050960008", "LOMBARDIA", "MI", "MILANO", "2024-10-07 15:30:19", 1990.0, 1500.0], ["B82E24012470008", "LIGURIA", "IM", "SAN BARTOLOMEO AL MARE", "2024-03-14 10:32:16", 668.85, 535.08], ["B12E24048550008", "VENETO", "PD", "ARZERGRANDE", "2024-09-14 08:19:18", 1282.3, 1025.84], ["B62E24039830008", "EMILIA-ROMAGNA", "RA", "RAVENNA", "2024-07-08 10:31:26", 1035.0, 828.0], ["C92E23004520008", "EMILIA-ROMAGNA", "RN", "RIMINI", "2023-11-13 08:29:04", 1475.41, 1180.33], ["B12E24046140008", "CALABRIA", "CS", "SAN GIOVANNI IN FIORE", "2024-07-30 09:10:30", 18032.79, 1500.0], ["C72E23004170008", "VENETO", "VE", "VENEZIA", "2023-11-21 11:09:21", 2273.1, 1500.0], ["C12E23006660008", "VENETO", "VR", "SAN GIOVANNI LUPATOTO", "2023-11-22 14:25:59", 1475.41, 1180.33], ["C52E23005160008", "VENETO", "TV", "ODERZO", "2023-11-22 23:21:18", 1600.0, 1280.0], ["B82E24051360008", "LAZIO", "VT", "VITERBO", "2024-07-10 12:55:06", 1875.0, 1500.0], ["B22E24007020008", "EMILIA-ROMAGNA", "MO", "CASTELNUOVO RANGONE", "2024-02-15 14:00:44", 1791.0, 1432.8], ["C52E23001740008", "EMILIA-ROMAGNA", "MO", "CONCORDIA SULLA SECCHIA", "2023-11-09 14:25:45", 1650.0, 1320.0], ["B32E24056020008", "ABRUZZO", "CH", "SAN GIOVANNI TEATINO", "2024-10-15 07:55:45", 1009.2, 807.36], ["B52E24040940008", "TOSCANA", "LU", "PIEVE FOSCIANA", "2024-07-25 14:29:40", 1700.0, 1360.0], ["B82E24048110008", "SICILIA", "TP", "MARSALA", "2024-07-08 10:18:48", 1269.67, 1015.74], ["B72E24047460008", "BASILICATA", "MT", "PISTICCI", "2024-10-21 12:48:01", 1500.0, 1200.0], ["B62E24039750008", "TOSCANA", "LU", "PORCARI", "2024-07-08 10:22:05", 1650.0, 1320.0], ["C62E23003920008", "VENETO", "PD", "ALBIGNASEGO", "2023-11-22 08:25:20", 1707.37, 1365.9], ["C32E23003020008", "ABRUZZO", "AQ", "AVEZZANO", "2023-11-10 05:48:09", 2330.0, 1500.0], ["C92E23007580008", "EMILIA-ROMAGNA", "RN", "RIMINI", "2023-11-22 22:35:20", 1900.0, 1500.0], ["C72E23003950008", "CAMPANIA", "SA", "GIFFONI SEI CASALI", "2023-11-18 19:09:28", 1400.0, 1120.0], ["B32E24049970008", "PIEMONTE", "AL", "CASALE MONFERRATO", "2024-07-22 16:28:44", 2205.74, 1500.0], ["B92E24049710008", "VENETO", "VR", "ZEVIO", "2024-10-11 07:27:24", 1498.0, 1198.4], ["B72E24010880008", "LOMBARDIA", "BG", "TREVIGLIO", "2024-03-14 09:32:52", 1880.0, 1500.0], ["B52E24047030008", "LOMBARDIA", "BS", "SALO'", "2024-11-10 20:14:12", 1327.0, 1061.6], ["B32E24048330008", "PIEMONTE", "AT", "ASTI", "2024-07-10 09:19:22", 1400.0, 1120.0], ["B52E24046460008", "TRENTINO-ALTO ADIGE", "TN", "CARISOLO", "2024-11-20 10:13:42", 1408.0, 1126.4], ["C22E23003020008", "FRIULI-VENEZIA GIULIA", "UD", "UDINE", "2023-11-15 12:05:46", 1688.7, 1350.96], ["C72E23003220008", "LAZIO", "RM", "ARDEA", "2023-11-17 14:56:48", 1274.44, 1019.55], ["C42E23006300008", "VENETO", "PD", "ABANO TERME", "2023-11-20 20:30:36", 1209.84, 967.87], ["B32E24054240008", "LOMBARDIA", "VA", "VARESE", "2024-10-13 13:18:06", 1777.44, 1421.95], ["B92E24053740008", "EMILIA-ROMAGNA", "MO", "MODENA", "2024-09-28 08:44:47", 481.0, 384.8], ["B92E24048090008", "PIEMONTE", "AT", "PENANGO", "2024-09-11 07:10:34", 1978.31, 1500.0], ["B62E24046610008", "FRIULI-VENEZIA GIULIA", "UD", "GEMONA DEL FRIULI", "2024-10-01 17:14:42", 1363.64, 1090.91], ["B92E24051110008", "PIEMONTE", "CN", "PAESANA", "2024-11-21 14:34:54", 1950.0, 1500.0], ["C72E23000470008", "EMILIA-ROMAGNA", "FE", "FERRARA", "2023-10-19 13:16:16", 1727.27, 1381.82], ["C22E23000590008", "LOMBARDIA", "BG", "AZZANO SAN PAOLO", "2023-10-19 11:15:48", 1335.78, 1068.62], ["C42E23005270008", "TOSCANA", "LU", "PIETRASANTA", "2023-11-21 21:00:32", 1350.0, 1080.0], ["C82E23008650008", "LAZIO", "RM", "GROTTAFERRATA", "2023-11-22 22:10:39", 1800.0, 1440.0], ["B32E24056500008", "LOMBARDIA", "MB", "VILLASANTA", "2024-10-21 14:34:54", 1667.44, 1333.95], ["B62E24041060008", "VENETO", "VR", "PESCANTINA", "2024-07-09 06:55:57", 1959.28, 1500.0], ["B82E24051880008", "LAZIO", "RM", "ROMA", "2024-07-12 15:46:57", 1170.0, 936.0], ["C32E23001720008", "PIEMONTE", "AL", "ALESSANDRIA", "2023-11-09 11:47:28", 1557.38, 1245.9], ["B82E24046680008", "LAZIO", "RM", "ROMA", "2024-07-08 10:49:29", 3114.75, 1500.0], ["C42E23006510008", "LOMBARDIA", "MI", "MILANO", "2023-11-23 10:20:21", 2432.57, 1500.0], ["C82E23003910008", "PIEMONTE", "TO", "PAVAROLO", "2023-11-13 21:23:27", 1800.0, 1440.0], ["B62E24044930008", "VENETO", "VR", "CASTELNUOVO DEL GARDA", "2024-08-16 10:13:22", 1581.92, 1265.54], ["B92E24048640008", "EMILIA-ROMAGNA", "RN", "MISANO ADRIATICO", "2024-09-20 15:57:53", 1363.64, 1090.91], ["B32E24054130008", "EMILIA-ROMAGNA", "PC", "PIACENZA", "2024-10-03 08:21:40", 1180.0, 944.0], ["B52E24043100008", "LOMBARDIA", "VA", "OLGIATE OLONA", "2024-09-14 12:46:05", 3442.6, 1500.0], ["B62E24040580008", "CAMPANIA", "None", "NAPOLI", "2024-07-08 14:18:34", 1875.0, 1500.0], ["B72E24047450008", "VENETO", "VE", "SAN DONA' DI PIAVE", "2024-10-24 12:59:09", 1829.43, 1463.54], ["B22E24044810008", "TRENTINO-ALTO ADIGE", "TN", "RONCEGNO TERME", "2024-11-22 09:45:54", 1100.0, 880.0], ["C22E23001320008", "CAMPANIA", "None", "CICCIANO", "2023-11-09 12:29:58", 1600.0, 1280.0], ["B52E24040810008", "TOSCANA", "FI", "CERTALDO", "2024-07-16 14:54:36", 1180.0, 944.0], ["B72E24041200008", "VENETO", "PD", "SAN GIORGIO IN BOSCO", "2024-07-11 07:16:55", 1600.0, 1280.0], ["C52E23003070008", "LOMBARDIA", "BS", "CORTE FRANCA", "2023-11-17 15:48:41", 1959.02, 1500.0], ["C92E23008550008", "PIEMONTE", "TO", "CAFASSE", "2023-11-09 21:09:57", 3378.12, 1500.0], ["C22E23003710008", "PIEMONTE", "CN", "GENOLA", "2023-11-16 13:15:18", 1000.0, 800.0], ["C42E23003370008", "EMILIA-ROMAGNA", "RA", "LUGO", "2023-11-13 21:32:55", 2164.8, 1500.0], ["B52E24010760008", "SICILIA", "ME", "MILAZZO", "2024-03-14 09:21:41", 1609.84, 1287.87], ["C52E23002890008", "FRIULI-VENEZIA GIULIA", "PN", "PORDENONE", "2023-11-14 18:04:35", 1853.61, 1482.89], ["C82E23009440008", "SICILIA", "RG", "MODICA", "2023-11-22 22:07:20", 861.0, 688.8], ["B82E24056850008", "TRENTINO-ALTO ADIGE", "TN", "CAVIZZANA", "2024-09-04 13:33:10", 480.0, 384.0], ["B42E24047010008", "FRIULI-VENEZIA GIULIA", "PN", "PORCIA", "2024-08-21 15:24:30", 1803.28, 1442.62], ["B42E24048960008", "TOSCANA", "LI", "LIVORNO", "2024-10-04 10:12:08", 11000.0, 1500.0], ["B92E24043460008", "EMILIA-ROMAGNA", "MO", "CARPI", "2024-07-08 16:51:23", 1800.0, 1440.0], ["B62E24042900008", "TOSCANA", "AR", "MONTE SAN SAVINO", "2024-07-18 13:01:25", 2300.0, 1500.0], ["C42E23001960008", "VENETO", "VR", "GREZZANA", "2023-11-09 11:42:22", 1465.0, 1172.0], ["B62E24007210008", "LAZIO", "RM", "MONTELANICO", "2024-02-19 13:33:42", 1922.0, 1500.0], ["C62E23001780008", "PUGLIA", "BA", "BITRITTO", "2023-11-09 20:00:13", 1237.7, 990.16], ["C32E23006330008", "TOSCANA", "AR", "MARCIANO DELLA CHIANA", "2023-11-23 09:58:17", 993.44, 794.75], ["B92E24051840008", "EMILIA-ROMAGNA", "PR", "PARMA", "2024-10-18 07:55:48", 1900.0, 1500.0], ["B82E24064310008", "FRIULI-VENEZIA GIULIA", "PN", "ROVEREDO IN PIANO", "2024-11-14 11:26:21", 1363.64, 1090.91], ["B82E24049040008", "EMILIA-ROMAGNA", "RE", "REGGIO NELL'EMILIA", "2024-07-08 12:24:21", 2061.0, 1500.0], ["B32E24059010008", "TOSCANA", "SI", "CHIUSI", "2024-11-16 22:38:20", 535.0, 428.0], ["C92E23003410008", "VENETO", "VE", "FOSSO'", "2023-11-09 14:41:04", 954.55, 763.64], ["B42E24042560008", "LOMBARDIA", "MI", "MILANO", "2024-07-09 14:37:07", 415.41, 332.33], ["B82E24008430008", "LAZIO", "RM", "ROMA", "2024-02-28 21:51:55", 1950.0, 1500.0], ["B32E24045240008", "VENETO", "PD", "RUBANO", "2024-07-08 10:43:36", 934.1, 747.28], ["C72E23002080008", "EMILIA-ROMAGNA", "PC", "CORTEMAGGIORE", "2023-11-13 09:52:44", 1363.64, 1090.91], ["B52E24045680008", "LOMBARDIA", "MB", "GIUSSANO", "2024-10-01 12:12:00", 3203.0, 1500.0], ["B82E24058650008", "MARCHE", "MC", "MACERATA", "2024-10-17 17:15:59", 1400.0, 1120.0], ["B52E24043560008", "LOMBARDIA", "PV", "VIGEVANO", "2024-09-30 20:14:45", 1266.63, 1013.3], ["B42E24050420008", "PUGLIA", "LE", "TAVIANO", "2024-11-21 16:04:26", 1718.18, 1374.54], ["C92E23001120008", "VENETO", "PD", "PADOVA", "2023-10-31 12:12:34", 1500.0, 1200.0], ["C72E23002460008", "LOMBARDIA", "MI", "CINISELLO BALSAMO", "2023-11-13 12:51:19", 606.57, 485.26], ["B52E24039310008", "LOMBARDIA", "BS", "TRAVAGLIATO", "2024-07-08 20:08:13", 1820.0, 1456.0], ["B82E24054310008", "TOSCANA", "PT", "QUARRATA", "2024-07-30 14:10:35", 1350.0, 1080.0], ["B22E24044790008", "EMILIA-ROMAGNA", "BO", "IMOLA", "2024-11-22 10:40:07", 1935.0, 1500.0], ["B22E24045930008", "FRIULI-VENEZIA GIULIA", "UD", "UDINE", "2024-10-28 11:32:23", 2590.0, 1500.0], ["B82E24064150008", "LAZIO", "LT", "PONTINIA", "2024-11-16 13:53:36", 1959.84, 1500.0], ["B82E24059670008", "LAZIO", "RM", "ROMA", "2024-11-20 21:24:35", 1440.0, 1152.0], ["B62E24039010008", "TOSCANA", "SI", "SIENA", "2024-07-08 10:44:29", 1908.0, 1500.0], ["B62E24039340008", "VENETO", "PD", "GALLIERA VENETA", "2024-07-08 10:24:19", 800.0, 640.0], ["B32E24053070008", "TOSCANA", "PO", "PRATO", "2024-09-05 12:47:09", 719.76, 575.81], ["C22E23005040008", "VENETO", "TV", "ASOLO", "2023-11-22 21:23:59", 1557.38, 1245.9], ["C82E23006400008", "LAZIO", "RM", "ROMA", "2023-11-17 18:56:29", 1727.27, 1381.82], ["C12E23002450008", "LAZIO", "RM", "MARINO", "2023-11-09 18:14:39", 2336.07, 1500.0], ["C12E23001490008", "LOMBARDIA", "BG", "ALMENNO SAN BARTOLOMEO", "2023-11-09 12:15:08", 1538.86, 1231.09], ["B82E24053500008", "LAZIO", "RM", "ROMA", "2024-07-25 09:23:51", 1649.67, 1319.74], ["B12E24045820008", "EMILIA-ROMAGNA", "MO", "CASTELFRANCO EMILIA", "2024-07-22 16:54:24", 1891.0, 1500.0], ["B82E24055720008", "LAZIO", "RM", "ROMA", "2024-08-07 14:00:11", 2652.0, 1500.0], ["B82E24059810008", "LAZIO", "RM", "ROMA", "2024-11-20 12:20:12", 1696.72, 1357.38], ["B52E24039330008", "CAMPANIA", "None", "LETTERE", "2024-07-09 12:33:34", 1229.51, 983.61], ["B92E24050180008", "VENETO", "VI", "VALLI DEL PASUBIO", "2024-11-21 11:08:34", 1140.0, 912.0], ["B42E24006670008", "LAZIO", "FR", "ACUTO", "2024-02-20 12:59:22", 1454.55, 1163.64], ["B32E24046280008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2024-07-08 12:04:32", 1328.11, 1062.49], ["B42E24007410008", "LOMBARDIA", "MI", "MILANO", "2024-02-15 13:46:35", 1305.9, 1044.72], ["C42E23002300008", "TOSCANA", "LU", "PIETRASANTA", "2023-11-09 14:53:37", 1550.0, 1240.0], ["B62E24050870008", "LOMBARDIA", "VA", "COMERIO", "2024-10-27 13:53:10", 1730.0, 1384.0], ["B52E24041860008", "PUGLIA", "BA", "CORATO", "2024-08-09 15:11:35", 1500.0, 1200.0], ["C22E23000830008", "LOMBARDIA", "BS", "CETO", "2023-11-09 11:26:38", 2090.0, 1500.0], ["B82E24054660008", "FRIULI-VENEZIA GIULIA", "UD", "TARVISIO", "2024-07-30 19:00:52", 858.85, 687.08], ["B62E24048060008", "EMILIA-ROMAGNA", "PC", "LUGAGNANO VAL D'ARDA", "2024-10-01 16:18:25", 845.86, 676.69], ["C72E23003910008", "TOSCANA", "PI", "CASTELLINA MARITTIMA", "2023-11-19 14:56:55", 1800.0, 1440.0], ["B62E24040840008", "VENETO", "TV", "MOGLIANO VENETO", "2024-07-08 15:10:43", 1500.0, 1200.0], ["B42E24047280008", "LOMBARDIA", "LC", "GALBIATE", "2024-08-30 17:22:50", 2079.51, 1500.0], ["C12E23004510008", "LAZIO", "RM", "FIUMICINO", "2023-11-17 12:37:22", 1340.91, 1072.73], ["B42E24045890008", "LOMBARDIA", "VA", "BUSTO ARSIZIO", "2024-07-28 17:18:16", 1820.0, 1456.0], ["B12E24047300008", "LIGURIA", "GE", "SESTRI LEVANTE", "2024-08-13 09:33:58", 1927.27, 1500.0], ["B22E24044110008", "TOSCANA", "LI", "CECINA", "2024-11-20 14:46:21", 615.0, 492.0], ["B62E24050570008", "FRIULI-VENEZIA GIULIA", "UD", "SAN VITO DI FAGAGNA", "2024-11-07 10:33:38", 1772.73, 1418.18], ["B52E24038580008", "PUGLIA", "LE", "ANDRANO", "2024-07-08 17:32:42", 2022.18, 1500.0], ["B42E24044700008", "LOMBARDIA", "MI", "VERNATE", "2024-07-17 13:40:07", 1100.0, 880.0], ["B42E24042720008", "LOMBARDIA", "MI", "DRESANO", "2024-07-09 09:49:57", 1470.0, 1176.0], ["B92E24047130008", "LOMBARDIA", "MB", "LISSONE", "2024-08-09 15:18:23", 2150.0, 1500.0], ["B12E24042100008", "LOMBARDIA", "PV", "PAVIA", "2024-07-08 10:48:39", 1926.23, 1500.0], ["C42E23001990008", "LOMBARDIA", "MI", "MILANO", "2023-11-09 12:33:34", 2460.0, 1500.0], ["B62E24047230008", "FRIULI-VENEZIA GIULIA", "PN", "BRUGNERA", "2024-11-21 14:04:42", 1350.0, 1080.0], ["B82E24047880008", "VENETO", "VI", "ALTAVILLA VICENTINA", "2024-07-08 10:32:47", 950.93, 760.74], ["B92E24042460008", "LOMBARDIA", "MI", "CERNUSCO SUL NAVIGLIO", "2024-07-08 12:35:56", 2225.0, 1500.0], ["C42E23002200008", "LOMBARDIA", "MB", "VIMERCATE", "2023-11-09 12:59:06", 1750.0, 1400.0], ["C42E23001720008", "LAZIO", "FR", "FROSINONE", "2023-11-09 11:51:00", 859.0, 687.2], ["B92E24048590008", "VENETO", "VI", "TEZZE SUL BRENTA", "2024-09-11 15:55:50", 1400.0, 1120.0], ["B62E24045980008", "CAMPANIA", "None", "SAVIANO", "2024-09-12 16:51:45", 1530.0, 1224.0], ["B92E24051060008", "LIGURIA", "IM", "DIANO CASTELLO", "2024-11-22 00:03:43", 1875.0, 1500.0], ["B92E24049220008", "EMILIA-ROMAGNA", "MO", "MODENA", "2024-10-14 20:12:43", 1556.77, 1245.42], ["B72E24040230008", "LOMBARDIA", "CR", "CASTEL GABBIANO", "2024-07-08 18:50:32", 1036.89, 829.51], ["B52E24047430008", "LOMBARDIA", "MN", "SUZZARA", "2024-11-05 17:30:21", 1350.0, 1080.0], ["B12E24046230008", "LOMBARDIA", "VA", "ARSAGO SEPRIO", "2024-08-02 16:50:52", 1952.0, 1500.0], ["B72E24044620008", "SARDEGNA", "CA", "SELARGIUS", "2024-08-28 21:11:00", 1057.79, 846.23], ["C52E23003150008", "LOMBARDIA", "MB", "CARATE BRIANZA", "2023-11-15 10:00:28", 1100.0, 880.0], ["C82E23007450008", "PUGLIA", "BA", "NOICATTARO", "2023-11-21 09:06:48", 1127.7, 902.16], ["C52E23005020008", "LAZIO", "RM", "ANZIO", "2023-11-23 08:49:14", 966.9, 773.52], ["B22E24041940008", "CAMPANIA", "SA", "BATTIPAGLIA", "2024-08-26 16:54:19", 983.61, 786.89], ["C72E23002390008", "PIEMONTE", "BI", "VALDILANA", "2023-11-10 23:20:25", 1980.0, 1500.0], ["C52E23002600008", "LOMBARDIA", "CO", "LOMAZZO", "2023-11-12 18:42:50", 1100.0, 880.0], ["C12E23004060008", "LAZIO", "RM", "VELLETRI", "2023-11-15 15:29:25", 680.0, 544.0], ["B12E24042590008", "LOMBARDIA", "BG", "BERGAMO", "2024-07-08 11:16:05", 1409.05, 1127.24], ["B32E24053210008", "VENETO", "PD", "MESTRINO", "2024-09-09 15:14:53", 1119.66, 895.73], ["B12E24044190008", "LOMBARDIA", "BG", "BERGAMO", "2024-07-09 22:14:40", 1000.0, 800.0], ["C32E23000600008", "MARCHE", "PU", "FANO", "2023-10-19 13:33:52", 1597.82, 1278.26], ["B12E24050940008", "LOMBARDIA", "BS", "DESENZANO DEL GARDA", "2024-10-14 08:33:49", 1536.89, 1229.51], ["B62E24038990008", "TOSCANA", "LU", "LUCCA", "2024-07-08 11:15:17", 1800.0, 1440.0], ["B22E24046330008", "PIEMONTE", "TO", "RIVOLI", "2024-11-14 09:57:00", 2600.0, 1500.0], ["C42E23004480008", "VENETO", "VE", "DOLO", "2023-11-17 17:38:56", 1800.0, 1440.0], ["C12E23003460008", "LOMBARDIA", "LC", "MOLTENO", "2023-11-10 08:38:57", 1848.0, 1478.4], ["B42E24046380008", "LOMBARDIA", "MN", "BORGOCARBONARA", "2024-08-09 10:36:24", 1393.44, 1114.75], ["C32E23006110008", "VENETO", "PD", "PIAZZOLA SUL BRENTA", "2023-11-22 16:07:53", 1188.0, 950.4], ["B52E24043390008", "EMILIA-ROMAGNA", "RE", "SANT'ILARIO D'ENZA", "2024-09-13 09:54:27", 1980.0, 1500.0], ["B92E24045660008", "LOMBARDIA", "MB", "CESANO MADERNO", "2024-07-20 15:11:25", 1460.0, 1168.0], ["B82E24064710008", "CAMPANIA", "SA", "AGROPOLI", "2024-11-07 23:13:00", 1588.52, 1270.82], ["B22E24041170008", "LOMBARDIA", "MN", "CASTIGLIONE DELLE STIVIERE", "2024-08-02 18:09:03", 1775.0, 1420.0], ["C42E23003600008", "VENETO", "VI", "ASIAGO", "2023-11-11 15:07:28", 1131.84, 905.47], ["B72E24045180008", "CAMPANIA", "SA", "SAN CIPRIANO PICENTINO", "2024-09-16 14:00:18", 1380.0, 1104.0], ["B42E24041770008", "EMILIA-ROMAGNA", "RE", "SAN POLO D'ENZA", "2024-07-08 11:56:03", 2145.0, 1500.0], ["B32E24047730008", "VENETO", "VI", "VICENZA", "2024-07-08 21:57:57", 1100.0, 880.0], ["B52E24041070008", "EMILIA-ROMAGNA", "MO", "CONCORDIA SULLA SECCHIA", "2024-07-26 14:23:49", 1500.0, 1200.0], ["B72E24040660008", "LAZIO", "RM", "NETTUNO", "2024-07-09 13:03:51", 1704.0, 1363.2], ["B82E24051600008", "CALABRIA", "CS", "COSENZA", "2024-07-09 21:44:34", 1620.0, 1296.0], ["B42E24039490008", "UMBRIA", "TR", "TERNI", "2024-07-08 10:53:20", 1434.92, 1147.94], ["C12E23003480008", "VENETO", "VI", "ROSA'", "2023-11-14 09:36:51", 1067.74, 854.19], ["C22E23002360008", "VENETO", "TV", "CASTELFRANCO VENETO", "2023-11-14 10:25:05", 1454.55, 1163.64], ["C52E23000780008", "TOSCANA", "PI", "PISA", "2023-11-01 20:47:47", 1800.0, 1440.0], ["B62E24039070008", "LOMBARDIA", "MN", "MANTOVA", "2024-07-08 10:39:33", 1150.0, 920.0], ["B12E24049220008", "PIEMONTE", "TO", "TORINO", "2024-11-09 12:44:33", 1721.45, 1377.16], ["C62E23000460008", "TRENTINO-ALTO ADIGE", "TN", "TRENTO", "2023-10-19 10:54:15", 1400.0, 1120.0], ["B82E24059330008", "TOSCANA", "FI", "CAMPI BISENZIO", "2024-11-19 18:25:44", 1700.0, 1360.0], ["B82E24064760008", "PIEMONTE", "NO", "NIBBIOLA", "2024-11-10 10:39:27", 1154.92, 923.94], ["B12E24053670008", "CAMPANIA", "SA", "BARONISSI", "2024-10-30 18:57:13", 1727.0, 1381.6], ["B12E24041230008", "EMILIA-ROMAGNA", "FC", "CESENA", "2024-07-08 10:38:07", 1692.0, 1353.6], ["B52E24045980008", "PUGLIA", "BT", "SAN FERDINANDO DI PUGLIA", "2024-10-20 17:40:33", 1990.0, 1500.0], ["B72E24046570008", "EMILIA-ROMAGNA", "BO", "MEDICINA", "2024-11-21 17:07:37", 1636.36, 1309.09], ["B62E24044640008", "FRIULI-VENEZIA GIULIA", "PN", "MANIAGO", "2024-08-17 15:32:16", 1128.08, 902.46], ["B42E24053480008", "EMILIA-ROMAGNA", "FE", "VOGHIERA", "2024-11-18 10:07:45", 1650.0, 1320.0], ["C62E23005700008", "LOMBARDIA", "PV", "CASORATE PRIMO", "2023-11-15 09:41:50", 1459.62, 1167.7], ["B32E24053690008", "PIEMONTE", "TO", "PIOBESI TORINESE", "2024-09-20 06:30:51", 427.0, 341.6], ["B32E24050480008", "VENETO", "RO", "PORTO VIRO", "2024-07-26 08:43:39", 809.0, 647.2], ["C52E23003030008", "PIEMONTE", "VC", "CRESCENTINO", "2023-11-14 12:07:58", 1480.0, 1184.0], ["C82E23007590008", "LOMBARDIA", "BS", "PREVALLE", "2023-11-20 18:10:03", 1480.0, 1184.0], ["C92E23005800008", "LOMBARDIA", "SO", "MORBEGNO", "2023-11-14 21:49:49", 1400.0, 1120.0], ["B72E24038860008", "TOSCANA", "FI", "VINCI", "2024-07-08 10:48:07", 2180.0, 1500.0], ["B92E24053950008", "LAZIO", "FR", "VILLA LATINA", "2024-11-11 09:08:39", 1875.0, 1500.0], ["B52E24046900008", "TRENTINO-ALTO ADIGE", "TN", "MORI", "2024-10-03 09:29:40", 1098.36, 878.69], ["C12E23001150008", "LOMBARDIA", "MI", "LAINATE", "2023-10-20 07:01:45", 1804.0, 1443.2], ["B82E24047770008", "LOMBARDIA", "BS", "BRESCIA", "2024-07-08 10:44:30", 1255.06, 1004.05], ["B42E24049540008", "VENETO", "PD", "ABANO TERME", "2024-11-20 16:15:55", 1391.86, 1113.49], ["B82E24052160008", "LAZIO", "RM", "ROMA", "2024-07-15 11:01:19", 1390.07, 1112.06], ["B72E24040540008", "LAZIO", "LT", "SAN FELICE CIRCEO", "2024-07-09 06:51:07", 1400.0, 1120.0], ["C12E23003510008", "EMILIA-ROMAGNA", "PR", "LESIGNANO DE'BAGNI", "2023-11-13 16:31:45", 713.12, 570.5], ["B32E24045950008", "LOMBARDIA", "CR", "CHIEVE", "2024-07-08 10:25:56", 588.52, 470.82], ["B42E24041870008", "SICILIA", "AG", "CAMPOBELLO DI LICATA", "2024-07-08 12:40:46", 3000.0, 1500.0], ["B62E24042090008", "LOMBARDIA", "MN", "BAGNOLO SAN VITO", "2024-07-11 21:52:29", 1163.52, 930.82], ["B72E24045000008", "TRENTINO-ALTO ADIGE", "BZ", "SAN MARTINO IN BADIA", "2024-09-23 20:04:44", 1650.0, 1320.0], ["B42E24046590008", "EMILIA-ROMAGNA", "FE", "CODIGORO", "2024-08-08 17:33:05", 1253.52, 1002.82], ["B92E24054490008", "PUGLIA", "BA", "BARI", "2024-11-07 08:56:30", 600.0, 480.0], ["B32E24055860008", "FRIULI-VENEZIA GIULIA", "UD", "LIGNANO SABBIADORO", "2024-09-30 12:48:25", 1550.0, 1240.0], ["B82E24063740008", "LAZIO", "RM", "ROMA", "2024-11-19 17:43:45", 1700.0, 1360.0], ["C12E23000950008", "LOMBARDIA", "CO", "COMO", "2023-10-27 20:10:58", 1227.83, 982.26], ["C62E23002360008", "LIGURIA", "SV", "MIOGLIA", "2023-11-12 21:14:24", 909.09, 727.27], ["C42E23003740008", "PIEMONTE", "CN", "SAVIGLIANO", "2023-11-10 22:05:21", 1700.0, 1360.0], ["C82E23009030008", "LAZIO", "RM", "ROMA", "2023-11-22 17:01:15", 2520.0, 1500.0], ["C62E23001570008", "LOMBARDIA", "MI", "ROBECCO SUL NAVIGLIO", "2023-11-09 16:41:31", 2820.0, 1500.0], ["B12E24051430008", "CAMPANIA", "SA", "CAMPAGNA", "2024-10-22 14:14:25", 1639.34, 1311.47], ["B92E24054260008", "VENETO", "TV", "CASIER", "2024-11-08 09:10:19", 1302.0, 1041.6], ["B72E24046650008", "PIEMONTE", "VB", "TOCENO", "2024-11-21 14:38:14", 1250.0, 1000.0], ["B12E24053430008", "TOSCANA", "FI", "FIRENZE", "2024-11-16 14:57:34", 1917.21, 1500.0], ["B52E24042440008", "VENETO", "VI", "MONTEGALDA", "2024-08-12 19:06:05", 1480.0, 1184.0], ["B72E24045370008", "TRENTINO-ALTO ADIGE", "TN", "CAVEDINE", "2024-09-27 12:36:07", 1900.0, 1500.0], ["B82E24062190008", "VENETO", "PD", "CITTADELLA", "2024-10-04 10:55:56", 1229.51, 983.61], ["B82E24061820008", "SICILIA", "PA", "PARTINICO", "2024-10-11 10:26:06", 1454.55, 1163.64], ["B62E24010860008", "LOMBARDIA", "CO", "MARIANO COMENSE", "2024-02-15 20:30:17", 1769.84, 1415.87], ["B12E24047330008", "LOMBARDIA", "BS", "ROVATO", "2024-08-25 19:25:06", 850.0, 680.0], ["B52E24006660008", "VENETO", "TV", "VALDOBBIADENE", "2024-02-27 16:47:36", 1800.0, 1440.0], ["B42E24052600008", "LOMBARDIA", "PV", "BEREGUARDO", "2024-11-19 08:35:16", 1800.0, 1440.0], ["B82E24065610008", "TRENTINO-ALTO ADIGE", "BZ", "BRESSANONE", "2024-10-30 07:51:01", 1748.99, 1399.19], ["C62E23002760008", "EMILIA-ROMAGNA", "RE", "SCANDIANO", "2023-11-13 18:42:32", 619.7, 495.76], ["C32E23003710008", "EMILIA-ROMAGNA", "BO", "MONTE SAN PIETRO", "2023-11-17 12:33:44", 1430.0, 1144.0], ["B52E24044120008", "TOSCANA", "GR", "GROSSETO", "2024-11-21 10:49:08", 1203.0, 962.4], ["C12E23004950008", "EMILIA-ROMAGNA", "BO", "GRIZZANA MORANDI", "2023-11-21 14:51:55", 1553.41, 1242.73], ["C42E23000760008", "LOMBARDIA", "MI", "MILANO", "2023-10-19 12:00:25", 2522.0, 1500.0], ["B12E24044790008", "TOSCANA", "FI", "FIRENZE", "2024-07-12 16:36:15", 1351.64, 1081.31], ["B42E24043870008", "LOMBARDIA", "CR", "GERRE DE'CAPRIOLI", "2024-07-15 13:06:44", 757.79, 606.23], ["B42E24049700008", "LOMBARDIA", "VA", "BUSTO ARSIZIO", "2024-11-20 17:00:24", 1946.72, 1500.0], ["B82E24049830008", "LAZIO", "RM", "ROMA", "2024-07-08 13:46:25", 1800.0, 1440.0], ["B32E24056490008", "PIEMONTE", "TO", "LUSERNA SAN GIOVANNI", "2024-10-24 13:45:46", 1500.0, 1200.0], ["B52E24043550008", "EMILIA-ROMAGNA", "RE", "CASALGRANDE", "2024-09-19 17:54:21", 930.52, 744.42], ["B92E24046990008", "VENETO", "VR", "ZEVIO", "2024-08-04 15:44:52", 1338.52, 1070.82], ["B62E24050710008", "VENETO", "PD", "MONTEGROTTO TERME", "2024-11-15 10:49:08", 1685.98, 1348.78], ["B72E24044950008", "BASILICATA", "PZ", "SAN FELE", "2024-09-15 09:36:24", 1622.13, 1297.7], ["C32E23000670008", "LOMBARDIA", "BS", "SENIGA", "2023-10-22 22:48:12", 2544.7, 1500.0], ["C82E23002200008", "LAZIO", "RM", "ROMA", "2023-11-09 12:17:57", 1748.36, 1398.69], ["C22E23000970008", "FRIULI-VENEZIA GIULIA", "UD", "MARTIGNACCO", "2023-11-09 11:44:19", 1917.66, 1500.0], ["C62E23004220008", "TRENTINO-ALTO ADIGE", "TN", "TRENTO", "2023-11-21 09:39:45", 1250.0, 1000.0], ["C32E23002970008", "VENETO", "VE", "PORTOGRUARO", "2023-11-09 21:14:16", 1225.41, 980.33], ["B32E24048000008", "SICILIA", "SR", "SIRACUSA", "2024-07-09 11:00:32", 575.76, 460.61], ["B62E24040510008", "LOMBARDIA", "BS", "FLERO", "2024-07-08 17:46:26", 1393.44, 1114.75], ["B92E24043040008", "EMILIA-ROMAGNA", "RE", "VEZZANO SUL CROSTOLO", "2024-07-08 19:00:13", 1300.0, 1040.0], ["B12E24048000008", "PIEMONTE", "NO", "BELLINZAGO NOVARESE", "2024-09-07 08:43:00", 1300.0, 1040.0], ["B62E24041970008", "TRENTINO-ALTO ADIGE", "TN", "TRENTO", "2024-07-12 07:47:16", 1500.0, 1200.0], ["B22E24045240008", "CAMPANIA", "CE", "MARCIANISE", "2024-10-09 23:17:25", 1122.0, 897.6], ["B32E24051940008", "LOMBARDIA", "VA", "CARONNO PERTUSELLA", "2024-08-07 08:28:03", 2000.0, 1500.0], ["B92E24041800008", "LAZIO", "FR", "ISOLA DEL LIRI", "2024-07-08 10:35:46", 1727.27, 1381.82], ["B82E24060170008", "LOMBARDIA", "BS", "BRESCIA", "2024-11-22 08:01:17", 1938.52, 1500.0], ["C82E23009740008", "LAZIO", "RM", "ROMA", "2023-11-16 15:26:54", 1595.0, 1276.0], ["C12E23004570008", "PIEMONTE", "NO", "NOVARA", "2023-11-18 11:15:22", 2000.0, 1500.0], ["B52E24039050008", "LOMBARDIA", "MI", "SAN DONATO MILANESE", "2024-07-09 11:40:41", 1004.1, 803.28], ["B82E24061160008", "LAZIO", "RM", "ROMA", "2024-09-26 06:51:05", 1396.72, 1117.38], ["C22E23004900008", "VALLE D'AOSTA", "AO", "ETROUBLES", "2023-11-22 21:55:11", 1603.0, 1282.4], ["C42E23005310008", "LOMBARDIA", "MI", "MILANO", "2023-11-21 20:54:58", 2850.0, 1500.0], ["C22E23004630008", "SICILIA", "SR", "ROSOLINI", "2023-11-20 18:42:06", 1840.0, 1472.0], ["B42E24041080008", "VENETO", "VE", "MARTELLAGO", "2024-07-08 10:33:27", 1200.0, 960.0], ["B92E24054210008", "UMBRIA", "PG", "PERUGIA", "2024-11-12 16:52:09", 950.0, 760.0], ["B82E24053940008", "TOSCANA", "FI", "PONTASSIEVE", "2024-07-22 20:50:31", 1360.0, 1088.0], ["C12E23001290008", "LOMBARDIA", "BS", "MANERBIO", "2023-10-19 13:38:01", 1174.0, 939.2], ["C62E23001320008", "EMILIA-ROMAGNA", "RA", "RAVENNA", "2023-11-09 11:46:28", 1828.7, 1462.96], ["B42E24046810008", "LOMBARDIA", "MI", "MILANO", "2024-08-13 09:07:28", 1803.52, 1442.82], ["B92E24045760008", "EMILIA-ROMAGNA", "RN", "MISANO ADRIATICO", "2024-07-16 07:05:34", 3000.0, 1500.0], ["B82E24048500008", "LAZIO", "RM", "ROMA", "2024-07-08 10:18:13", 1190.0, 952.0], ["C82E23002560008", "SICILIA", "TP", "MARSALA", "2023-11-09 12:01:30", 1213.12, 970.5], ["C42E23005530008", "LIGURIA", "SV", "ALASSIO", "2023-11-20 11:47:14", 1481.97, 1185.58], ["C62E23004760008", "MARCHE", "PU", "TERRE ROVERESCHE", "2023-11-21 22:42:23", 1352.0, 1081.6], ["C52E23002320008", "LOMBARDIA", "CO", "LOMAZZO", "2023-11-13 14:37:51", 1634.64, 1307.71], ["B42E24042420008", "SARDEGNA", "CA", "SESTU", "2024-07-08 17:58:52", 880.0, 704.0], ["B42E24048300008", "LOMBARDIA", "VA", "VEDANO OLONA", "2024-09-24 10:52:30", 1555.0, 1244.0], ["B52E24041780008", "LIGURIA", "IM", "IMPERIA", "2024-08-06 06:18:13", 1225.0, 980.0], ["C42E23002050008", "LOMBARDIA", "MI", "MILANO", "2023-11-09 11:46:01", 1400.0, 1120.0], ["C92E23001200008", "FRIULI-VENEZIA GIULIA", "UD", "REMANZACCO", "2023-10-20 19:13:07", 2300.0, 1500.0], ["B52E24045380008", "TOSCANA", "PT", "PISTOIA", "2024-10-11 09:15:16", 900.0, 720.0], ["B12E24042960008", "LOMBARDIA", "BG", "MORNICO AL SERIO", "2024-07-08 11:48:14", 1870.0, 1496.0], ["B82E24057360008", "EMILIA-ROMAGNA", "RE", "GUASTALLA", "2024-08-29 10:30:03", 1363.64, 1090.91], ["B22E24042830008", "FRIULI-VENEZIA GIULIA", "UD", "UDINE", "2024-09-12 09:06:54", 1557.37, 1245.9], ["B72E24043570008", "LOMBARDIA", "MB", "USMATE VELATE", "2024-08-08 18:55:20", 1330.31, 1064.25], ["C32E23003170008", "CAMPANIA", "None", "ISCHIA", "2023-11-10 18:08:55", 930.0, 744.0], ["B82E24061190008", "LAZIO", "RM", "ROMA", "2024-09-26 14:02:09", 1182.29, 945.83], ["C82E23006580008", "PIEMONTE", "TO", "SAN GILLIO", "2023-11-20 20:50:22", 1543.0, 1234.4], ["C42E23003550008", "EMILIA-ROMAGNA", "PR", "SALA BAGANZA", "2023-11-13 08:10:37", 1900.0, 1500.0], ["C42E23003230008", "LOMBARDIA", "MI", "MILANO", "2023-11-14 08:36:05", 1879.84, 1500.0], ["C62E23003170008", "SICILIA", "CT", "CATANIA", "2023-11-17 15:07:28", 1638.0, 1310.4], ["B22E24039750008", "LAZIO", "RM", "CASTEL GANDOLFO", "2024-07-12 08:05:08", 1324.8, 1059.84], ["B52E24044020008", "VENETO", "PD", "MONTAGNANA", "2024-11-19 09:11:17", 1578.25, 1262.6], ["B22E24041410008", "EMILIA-ROMAGNA", "MO", "CASTELNUOVO RANGONE", "2024-08-01 21:14:32", 1950.0, 1500.0], ["C32E23001090008", "VENETO", "VR", "VERONA", "2023-11-02 08:03:25", 1409.09, 1127.27], ["C92E23004340008", "SICILIA", "TP", "MAZARA DEL VALLO", "2023-11-10 13:28:17", 1318.18, 1054.54], ["C62E23002500008", "LOMBARDIA", "BG", "SOLTO COLLINA", "2023-11-09 20:34:25", 1250.0, 1000.0], ["B32E24053240008", "VENETO", "VR", "SOMMACAMPAGNA", "2024-09-02 14:41:51", 1605.74, 1284.59], ["B62E24040040008", "LOMBARDIA", "BS", "CASTREZZATO", "2024-07-08 13:25:12", 1431.0, 1144.8], ["B52E24042060008", "BASILICATA", "PZ", "OPPIDO LUCANO", "2024-08-06 10:54:34", 1500.0, 1200.0], ["B32E24058560008", "VENETO", "VI", "VICENZA", "2024-11-18 12:04:05", 2650.0, 1500.0], ["C32E23000730008", "VENETO", "VI", "VICENZA", "2023-10-19 10:17:49", 1229.51, 983.61], ["C12E23001860008", "TOSCANA", "PI", "SAN GIULIANO TERME", "2023-11-09 11:56:48", 702.84, 562.27], ["C72E23001720008", "PUGLIA", "TA", "PALAGIANELLO", "2023-11-09 13:02:15", 1475.41, 1180.33], ["B82E24053910008", "SARDEGNA", "CA", "QUARTU SANT'ELENA", "2024-07-26 08:00:06", 1950.0, 1500.0], ["C92E23007500008", "EMILIA-ROMAGNA", "PR", "PARMA", "2023-11-22 11:13:27", 2688.51, 1500.0], ["C82E23004890008", "LOMBARDIA", "MB", "BIASSONO", "2023-11-10 19:00:26", 2677.9, 1500.0], ["B72E24046950008", "LOMBARDIA", "VA", "LUINO", "2024-09-15 16:38:11", 1500.0, 1200.0], ["B42E24041110008", "LOMBARDIA", "BS", "CHIARI", "2024-07-08 11:20:22", 2257.0, 1500.0], ["C52E23003100008", "LAZIO", "RM", "ANZIO", "2023-11-16 13:18:23", 901.64, 721.31], ["C12E23003370008", "LOMBARDIA", "CO", "COMO", "2023-11-13 21:54:35", 1330.0, 1064.0], ["C22E23002480008", "TRENTINO-ALTO ADIGE", "TN", "LAVARONE", "2023-11-10 08:44:28", 1063.25, 850.6], ["C32E23005430008", "LOMBARDIA", "BS", "PAITONE", "2023-11-20 20:07:25", 1800.0, 1440.0], ["C42E23006480008", "PIEMONTE", "TO", "VAL DELLA TORRE", "2023-11-22 22:15:14", 1600.0, 1280.0], ["B62E24042080008", "VENETO", "RO", "ADRIA", "2024-07-16 06:27:03", 1339.0, 1071.2], ["B82E24049670008", "LAZIO", "RM", "ROMA", "2024-07-08 14:25:25", 1650.0, 1320.0], ["B12E24051280008", "PIEMONTE", "AT", "PIEA", "2024-09-26 13:15:35", 1210.0, 968.0], ["B62E24048620008", "EMILIA-ROMAGNA", "BO", "SAN LAZZARO DI SAVENA", "2024-10-21 12:29:38", 928.52, 742.82], ["B72E24043230008", "SICILIA", "TP", "ALCAMO", "2024-08-09 11:37:34", 1775.89, 1420.71], ["B82E24055250008", "LAZIO", "RM", "ROMA", "2024-08-03 12:28:23", 1188.52, 950.82], ["C62E23001610008", "FRIULI-VENEZIA GIULIA", "UD", "CAMPOFORMIDO", "2023-11-09 13:34:44", 630.96, 504.77], ["B82E24051050008", "LAZIO", "RM", "ROMA", "2024-07-08 20:44:27", 327.86, 262.29], ["B12E24007860008", "PIEMONTE", "CN", "CARAMAGNA PIEMONTE", "2024-02-15 11:52:07", 1690.0, 1352.0], ["C92E23005420008", "MARCHE", "MC", "MATELICA", "2023-11-17 21:22:07", 1860.0, 1488.0], ["B52E24006830008", "UMBRIA", "PG", "MAGIONE", "2024-02-15 19:24:34", 1769.75, 1415.8], ["B82E24062810008", "PUGLIA", "TA", "CASTELLANETA", "2024-10-23 11:31:50", 1180.34, 944.27], ["B82E24053380008", "LOMBARDIA", "MI", "VANZAGHELLO", "2024-07-16 12:45:34", 1950.0, 1500.0], ["B52E24043220008", "PUGLIA", "BA", "ADELFIA", "2024-09-12 10:40:39", 1900.0, 1500.0], ["C12E23001650008", "MARCHE", "MC", "MOGLIANO", "2023-11-09 12:09:00", 1003.69, 802.95], ["B92E24046430008", "PIEMONTE", "TO", "RIVAROLO CANAVESE", "2024-08-02 15:04:30", 1045.45, 836.36], ["B82E24055700008", "BASILICATA", "MT", "POLICORO", "2024-08-06 14:32:43", 1000.0, 800.0], ["B22E24045820008", "LOMBARDIA", "MI", "ARESE", "2024-10-29 21:36:14", 1023.0, 818.4], ["C82E23003130008", "TRENTINO-ALTO ADIGE", "TN", "RIVA DEL GARDA", "2023-11-09 14:35:26", 2500.0, 1500.0], ["B32E24046450008", "PIEMONTE", "CN", "CENTALLO", "2024-07-08 12:47:32", 2171.6, 1500.0], ["C12E23000590008", "EMILIA-ROMAGNA", "FC", "CESENA", "2023-10-19 10:33:30", 1364.0, 1091.2], ["B32E24051710008", "LOMBARDIA", "BS", "CASTEL MELLA", "2024-08-05 13:18:32", 2000.0, 1500.0], ["B92E24046830008", "VENETO", "PD", "PADOVA", "2024-08-09 19:38:06", 1365.0, 1092.0], ["B72E24040110008", "VENETO", "VE", "VENEZIA", "2024-07-08 15:31:29", 765.79, 612.63], ["B82E24064290008", "LAZIO", "RM", "ROMA", "2024-11-18 09:42:14", 1547.54, 1238.03], ["C52E23002980008", "MARCHE", "PU", "FOSSOMBRONE", "2023-11-14 22:15:10", 1751.75, 1401.4], ["C62E23002710008", "LOMBARDIA", "CO", "ORSENIGO", "2023-11-13 11:05:47", 1609.84, 1287.87], ["B12E24007830008", "LOMBARDIA", "BG", "FARA GERA D'ADDA", "2024-02-16 09:59:56", 1298.64, 1038.91], ["C92E23003590008", "EMILIA-ROMAGNA", "PR", "PARMA", "2023-11-09 16:47:16", 1539.38, 1231.5], ["B52E24047290008", "TOSCANA", "LU", "CAPANNORI", "2024-11-15 10:09:00", 1436.36, 1149.09], ["B12E24045610008", "LOMBARDIA", "CR", "CREMONA", "2024-07-22 20:18:41", 1290.0, 1032.0], ["B82E24063480008", "LAZIO", "RM", "ROMA", "2024-10-31 16:23:59", 1438.52, 1150.82], ["B22E24046530008", "LAZIO", "LT", "LATINA", "2024-11-20 09:49:32", 679.54, 543.63], ["B32E24047360008", "EMILIA-ROMAGNA", "PC", "PIACENZA", "2024-07-08 15:09:02", 1417.0, 1133.6], ["B12E24042980008", "MARCHE", "AN", "SENIGALLIA", "2024-07-08 14:30:25", 1600.0, 1280.0], ["B82E24060010008", "SARDEGNA", "CA", "QUARTU SANT'ELENA", "2024-11-21 14:17:55", 1495.0, 1196.0], ["C92E23000730008", "PUGLIA", "BA", "BARI", "2023-10-19 10:32:41", 1655.74, 1324.59], ["B62E24047380008", "VENETO", "PD", "MASERA' DI PADOVA", "2024-11-21 14:27:56", 957.62, 766.1], ["B92E24049590008", "LOMBARDIA", "MB", "CESANO MADERNO", "2024-11-11 21:55:19", 1850.0, 1480.0], ["B82E24046910008", "CAMPANIA", "CE", "LUSCIANO", "2024-07-08 10:53:06", 1758.45, 1406.76], ["B32E24050290008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2024-07-26 13:28:34", 2269.55, 1500.0], ["C32E23005890008", "TOSCANA", "PO", "PRATO", "2023-11-22 17:20:47", 1411.0, 1128.8], ["C42E23005690008", "LAZIO", "RI", "MONTOPOLI DI SABINA", "2023-11-21 19:19:22", 1235.0, 988.0], ["C52E23001520008", "SICILIA", "RG", "COMISO", "2023-11-09 12:01:13", 1300.0, 1040.0], ["B82E24059450008", "TOSCANA", "PI", "PONTEDERA", "2024-11-21 04:58:58", 1049.93, 839.94], ["B32E24053680008", "LOMBARDIA", "BG", "TORRE DE'BUSI", "2024-09-21 06:52:08", 1700.0, 1360.0], ["B92E24044670008", "EMILIA-ROMAGNA", "RN", "RIMINI", "2024-07-15 13:02:00", 1900.0, 1500.0], ["B32E24008010008", "LOMBARDIA", "CO", "CANTU'", "2024-02-22 18:21:02", 1641.0, 1312.8], ["B12E24011690008", "LOMBARDIA", "CO", "COMO", "2024-02-20 20:54:30", 2409.84, 1500.0], ["B62E24040610008", "PIEMONTE", "TO", "CUMIANA", "2024-07-08 15:28:05", 1532.4, 1225.92], ["B72E24049250008", "LOMBARDIA", "BG", "TREVIGLIO", "2024-11-13 10:22:49", 1205.95, 964.76], ["B92E24011850008", "VENETO", "VR", "NEGRAR VALPOLICELLA", "2024-02-17 13:08:25", 1524.89, 1219.91], ["B62E24010950008", "SICILIA", "ME", "CASTELL'UMBERTO", "2024-03-14 00:37:13", 1500.0, 1200.0], ["B92E24054100008", "LOMBARDIA", "VA", "VIGGIU'", "2024-10-29 10:59:35", 1100.0, 880.0], ["B92E24050670008", "EMILIA-ROMAGNA", "PR", "PARMA", "2024-11-22 10:55:29", 1383.44, 1106.75], ["C32E23001300008", "LOMBARDIA", "MB", "MEZZAGO", "2023-11-09 11:37:23", 2254.6, 1500.0], ["C22E23002020008", "VENETO", "TV", "VOLPAGO DEL MONTELLO", "2023-11-09 18:06:13", 1500.0, 1200.0], ["C12E23001270008", "EMILIA-ROMAGNA", "FC", "CESENA", "2023-11-01 11:03:50", 1000.0, 800.0], ["B82E24055640008", "TOSCANA", "FI", "FIESOLE", "2024-08-08 15:51:16", 2507.63, 1500.0], ["B82E24050160008", "VENETO", "VR", "VILLAFRANCA DI VERONA", "2024-07-08 16:58:05", 1570.0, 1256.0], ["B12E24048110008", "LOMBARDIA", "MN", "VOLTA MANTOVANA", "2024-09-02 20:26:57", 991.45, 793.16], ["B42E24044730008", "VENETO", "VR", "GREZZANA", "2024-07-20 06:15:40", 1550.0, 1240.0], ["B62E24040190008", "LOMBARDIA", "MN", "MANTOVA", "2024-07-08 12:32:28", 2857.13, 1500.0], ["C82E23005150008", "EMILIA-ROMAGNA", "RE", "REGGIO NELL'EMILIA", "2023-11-17 07:57:45", 1520.58, 1216.46], ["C42E23006550008", "LAZIO", "FR", "SORA", "2023-11-22 18:05:51", 1900.0, 1500.0], ["B32E24050560008", "MARCHE", "AP", "ASCOLI PICENO", "2024-07-24 15:24:22", 950.0, 760.0], ["B32E24058530008", "LOMBARDIA", "MN", "GONZAGA", "2024-11-10 17:31:41", 1874.8, 1499.84], ["B52E24043290008", "TOSCANA", "GR", "GROSSETO", "2024-09-20 10:27:43", 1500.0, 1200.0], ["B82E24056340008", "LOMBARDIA", "MI", "BASIGLIO", "2024-08-12 12:45:40", 1704.55, 1363.64], ["B12E24047740008", "TOSCANA", "FI", "REGGELLO", "2024-08-30 10:08:08", 2559.42, 1500.0], ["B32E24057210008", "LOMBARDIA", "BG", "VALBREMBO", "2024-11-01 11:28:30", 2032.62, 1500.0], ["B22E24039170008", "TOSCANA", "FI", "BARBERINO TAVARNELLE", "2024-07-10 09:08:33", 909.09, 727.27], ["B82E24054490008", "EMILIA-ROMAGNA", "RE", "REGGIO NELL'EMILIA", "2024-08-02 15:58:10", 1600.0, 1280.0], ["B62E24044220008", "VENETO", "TV", "MOGLIANO VENETO", "2024-08-05 17:58:41", 1555.38, 1244.3], ["B12E24052540008", "LOMBARDIA", "BG", "CASNIGO", "2024-11-19 20:42:13", 804.2, 643.36], ["B52E24044050008", "PIEMONTE", "CN", "MOROZZO", "2024-11-18 21:09:00", 1069.67, 855.74], ["B32E24058980008", "LOMBARDIA", "MI", "RESCALDINA", "2024-11-15 17:05:14", 1200.0, 960.0], ["C32E23001710008", "PUGLIA", "TA", "GINOSA", "2023-11-09 11:47:57", 1065.57, 852.46], ["C52E23004280008", "EMILIA-ROMAGNA", "BO", "SAN GIOVANNI IN PERSICETO", "2023-11-20 18:22:25", 1360.0, 1088.0], ["C72E23004460008", "TRENTINO-ALTO ADIGE", "TN", "ROVERETO", "2023-11-20 10:43:16", 1350.0, 1080.0], ["C82E23009590008", "TOSCANA", "MS", "CARRARA", "2023-11-23 09:09:17", 1200.0, 960.0], ["C12E23003520008", "VENETO", "TV", "FONTE", "2023-11-10 10:09:17", 1268.48, 1014.78], ["C22E23005380008", "SICILIA", "RG", "RAGUSA", "2023-11-23 07:47:44", 1230.0, 984.0], ["C82E23006450008", "SARDEGNA", "CA", "QUARTU SANT'ELENA", "2023-11-14 16:43:26", 1147.9, 918.32], ["C42E23004270008", "LOMBARDIA", "MI", "MILANO", "2023-11-16 22:09:26", 1870.0, 1496.0], ["B22E24044600008", "VENETO", "TV", "RESANA", "2024-11-22 07:30:12", 1485.4, 1188.32], ["B62E24043190008", "LOMBARDIA", "MI", "MAGENTA", "2024-07-26 10:21:59", 1466.0, 1172.8], ["B92E24008720008", "PUGLIA", "LE", "UGENTO", "2024-03-11 09:53:35", 575.7, 460.56], ["B82E24053710008", "PUGLIA", "BT", "TRINITAPOLI", "2024-07-23 16:02:28", 1600.0, 1280.0], ["C72E23004380008", "FRIULI-VENEZIA GIULIA", "UD", "PRADAMANO", "2023-11-20 13:02:09", 1229.51, 983.61], ["C92E23004400008", "TRENTINO-ALTO ADIGE", "BZ", "LAION", "2023-11-10 12:06:43", 2788.2, 1500.0], ["C42E23004510008", "TOSCANA", "LI", "LIVORNO", "2023-11-17 16:26:23", 2379.0, 1500.0], ["B82E24058640008", "VENETO", "PD", "PONTELONGO", "2024-10-23 15:10:01", 1200.0, 960.0], ["C52E23001890008", "PIEMONTE", "TO", "ISOLABELLA", "2023-11-09 12:44:37", 1713.0, 1370.4], ["B92E24049030008", "UMBRIA", "PG", "PERUGIA", "2024-09-13 14:16:12", 1320.0, 1056.0], ["B82E24055170008", "CALABRIA", "CZ", "LAMEZIA TERME", "2024-08-07 11:26:59", 1597.0, 1277.6], ["B32E24007510008", "ABRUZZO", "TE", "ATRI", "2024-02-17 11:27:33", 505.21, 404.17], ["C22E23000560008", "SARDEGNA", "CA", "CAGLIARI", "2023-10-20 11:23:59", 1099.0, 879.2], ["B12E24042230008", "EMILIA-ROMAGNA", "MO", "CASTELFRANCO EMILIA", "2024-07-08 11:06:22", 1850.0, 1480.0], ["B82E24059660008", "LOMBARDIA", "CO", "MENAGGIO", "2024-11-21 13:28:35", 1818.18, 1454.54], ["B62E24050640008", "LOMBARDIA", "MI", "ROBECCO SUL NAVIGLIO", "2024-11-09 12:59:38", 1890.0, 1500.0], ["B82E24060970008", "VENETO", "PD", "CARMIGNANO DI BRENTA", "2024-09-19 09:33:03", 1875.0, 1500.0], ["B12E24046270008", "TOSCANA", "FI", "FIRENZE", "2024-08-01 14:46:17", 2650.0, 1500.0], ["B22E24043910008", "TOSCANA", "LI", "CECINA", "2024-11-21 07:36:28", 1639.34, 1311.47], ["C82E23007470008", "FRIULI-VENEZIA GIULIA", "UD", "CODROIPO", "2023-11-20 17:20:31", 1161.47, 929.18], ["C62E23002140008", "LAZIO", "LT", "SABAUDIA", "2023-11-13 17:41:45", 1557.38, 1245.9], ["C52E23002090008", "LOMBARDIA", "BS", "ORZINUOVI", "2023-11-09 21:37:00", 1255.9, 1004.72], ["C12E23000910008", "VENETO", "VI", "PIOVENE ROCCHETTE", "2023-10-19 10:36:31", 660.66, 528.53], ["B62E24044760008", "TOSCANA", "LU", "LUCCA", "2024-08-14 10:45:05", 1758.0, 1406.4], ["B42E24046630008", "LOMBARDIA", "MI", "ABBIATEGRASSO", "2024-08-09 10:48:51", 757.87, 606.3], ["B22E24045360008", "LOMBARDIA", "MI", "ROZZANO", "2024-10-09 14:50:27", 1479.51, 1183.61], ["B42E24053240008", "TOSCANA", "LU", "GALLICANO", "2024-11-13 10:13:31", 1302.76, 1042.21], ["B12E24044800008", "TOSCANA", "FI", "FIRENZE", "2024-07-12 07:22:19", 2000.0, 1500.0], ["B42E24045580008", "LOMBARDIA", "MI", "MILANO", "2024-08-01 07:46:48", 1990.0, 1500.0], ["B92E24045910008", "VENETO", "PD", "PADOVA", "2024-07-24 07:32:59", 1400.0, 1120.0], ["B92E24012180008", "EMILIA-ROMAGNA", "MO", "MODENA", "2024-03-13 15:48:15", 509.84, 407.87], ["C62E23003310008", "EMILIA-ROMAGNA", "FC", "FORLI'", "2023-11-17 14:55:12", 1920.0, 1500.0], ["C72E23003580008", "VENETO", "VE", "MIRANO", "2023-11-18 13:21:41", 1443.24, 1154.59], ["B92E24052920008", "EMILIA-ROMAGNA", "PR", "COLLECCHIO", "2024-11-18 08:13:26", 4520.0, 1500.0], ["B62E24039480008", "SICILIA", "CT", "CATANIA", "2024-07-08 10:25:58", 909.0, 727.2], ["B12E24047940008", "PIEMONTE", "TO", "TORINO", "2024-08-30 17:39:56", 1794.1, 1435.28], ["B42E24041760008", "LAZIO", "RM", "ZAGAROLO", "2024-07-08 12:55:39", 1400.0, 1120.0], ["B82E24052060008", "EMILIA-ROMAGNA", "RE", "REGGIO NELL'EMILIA", "2024-07-12 13:51:17", 1195.52, 956.42], ["B62E24044720008", "EMILIA-ROMAGNA", "PC", "PODENZANO", "2024-08-19 15:31:10", 1231.3, 985.04], ["C52E23001340008", "EMILIA-ROMAGNA", "RA", "MASSA LOMBARDA", "2023-11-09 12:21:27", 1656.76, 1325.41], ["C92E23005940008", "LOMBARDIA", "MI", "CERNUSCO SUL NAVIGLIO", "2023-11-17 13:28:19", 1900.0, 1500.0], ["C72E23004690008", "SARDEGNA", "CA", "SELARGIUS", "2023-11-19 16:48:38", 959.83, 767.86], ["C82E23005450008", "LAZIO", "RM", "ROMA", "2023-11-17 17:01:05", 1536.89, 1229.51], ["C62E23004630008", "LOMBARDIA", "MI", "TREZZANO SUL NAVIGLIO", "2023-11-20 17:09:10", 1370.0, 1096.0], ["C62E23001750008", "VENETO", "TV", "VAZZOLA", "2023-11-09 17:28:16", 1500.0, 1200.0], ["B32E24052550008", "MARCHE", "PU", "FANO", "2024-08-21 16:24:24", 1190.0, 952.0], ["B32E24057080008", "EMILIA-ROMAGNA", "FE", "CENTO", "2024-11-02 11:57:26", 1599.99, 1279.99], ["B32E24056890008", "VENETO", "BL", "SAN VITO DI CADORE", "2024-11-01 09:21:21", 1580.0, 1264.0], ["B52E24043530008", "PIEMONTE", "TO", "BEINASCO", "2024-09-27 19:22:20", 1500.0, 1200.0], ["C12E23005170008", "TOSCANA", "FI", "FIRENZE", "2023-11-20 18:58:35", 1069.0, 855.2], ["B32E24012760008", "EMILIA-ROMAGNA", "BO", "BOLOGNA", "2024-03-14 10:10:50", 1020.0, 816.0], ["B92E24045030008", "LAZIO", "RM", "GUIDONIA MONTECELIO", "2024-07-15 07:40:42", 1363.64, 1090.91], ["C32E23006450008", "CAMPANIA", "AV", "FRIGENTO", "2023-11-23 09:34:36", 1147.54, 918.03], ["B62E24049690008", "UMBRIA", "PG", "MARSCIANO", "2024-11-19 18:24:18", 1099.02, 879.22], ["B72E24045810008", "TRENTINO-ALTO ADIGE", "TN", "PINZOLO", "2024-09-15 16:48:58", 1599.5, 1279.6], ["B92E24047870008", "LAZIO", "LT", "SERMONETA", "2024-08-23 09:35:16", 944.26, 755.41], ["B82E24053320008", "VENETO", "VE", "SAN MICHELE AL TAGLIAMENTO", "2024-07-16 11:35:24", 2000.0, 1500.0], ["B12E24007470008", "PIEMONTE", "TO", "TORINO", "2024-03-02 08:59:39", 1625.44, 1300.35], ["B22E24042140008", "MARCHE", "MC", "TOLENTINO", "2024-08-28 14:12:15", 1357.38, 1085.9], ["B62E24044260008", "LIGURIA", "SV", "ALBISOLA MARINA", "2024-08-09 22:23:41", 2700.52, 1500.0], ["B92E24050790008", "SICILIA", "ME", "CESARO'", "2024-11-21 15:36:30", 1363.64, 1090.91], ["B12E24053070008", "LOMBARDIA", "BS", "CASTEGNATO", "2024-10-29 08:00:25", 2100.0, 1500.0], ["B32E24055820008", "FRIULI-VENEZIA GIULIA", "GO", "CORMONS", "2024-09-16 14:57:48", 1800.0, 1440.0], ["B92E24009220008", "VENETO", "VE", "CHIOGGIA", "2024-03-11 16:51:19", 1803.28, 1442.62], ["B72E24039010008", "TRENTINO-ALTO ADIGE", "TN", "ROVERETO", "2024-07-08 10:14:58", 1585.08, 1268.06], ["B62E24007060008", "SICILIA", "ME", "GIARDINI-NAXOS", "2024-02-24 09:45:17", 933.41, 746.73], ["B32E24053610008", "VENETO", "PD", "CASALE DI SCODOSIA", "2024-09-12 08:36:04", 1513.41, 1210.73], ["C32E23002360008", "EMILIA-ROMAGNA", "BO", "ZOLA PREDOSA", "2023-11-09 17:28:00", 1492.55, 1194.04], ["C22E23001940008", "PIEMONTE", "CN", "CUNEO", "2023-11-09 19:21:58", 2333.45, 1500.0], ["B42E24050880008", "PUGLIA", "LE", "COPERTINO", "2024-10-10 17:01:26", 1557.38, 1245.9], ["B62E24047370008", "TOSCANA", "AR", "MONTE SAN SAVINO", "2024-11-21 10:35:03", 1500.0, 1200.0], ["C82E23003180008", "LAZIO", "RM", "ROMA", "2023-11-09 12:48:24", 1400.0, 1120.0], ["B92E24049930008", "VENETO", "PD", "PADOVA", "2024-11-21 14:17:21", 983.1, 786.48], ["B82E24061690008", "VENETO", "PD", "SELVAZZANO DENTRO", "2024-10-09 09:43:35", 1670.65, 1336.52], ["B32E24056910008", "TOSCANA", "FI", "FUCECCHIO", "2024-11-04 15:40:45", 1881.13, 1500.0], ["B22E24042720008", "VENETO", "PD", "TEOLO", "2024-09-04 07:52:30", 1010.0, 808.0], ["B62E24050610008", "PUGLIA", "TA", "AVETRANA", "2024-11-12 14:09:04", 853.36, 682.69], ["B32E24050440008", "CAMPANIA", "SA", "SALA CONSILINA", "2024-07-22 09:22:32", 1875.0, 1500.0], ["B52E24044030008", "LOMBARDIA", "MB", "MONZA", "2024-11-19 21:19:55", 2264.92, 1500.0], ["C32E23001030008", "PIEMONTE", "TO", "SAN MARTINO CANAVESE", "2023-10-20 06:38:55", 2500.0, 1500.0], ["C12E23003230008", "VENETO", "VI", "ARCUGNANO", "2023-11-13 10:53:21", 1298.0, 1038.4], ["C22E23002800008", "SARDEGNA", "CA", "UTA", "2023-11-13 19:34:28", 629.84, 503.87], ["C42E23006870008", "VENETO", "PD", "MONSELICE", "2023-11-22 17:34:17", 1875.01, 1500.0], ["C42E23004230008", "LOMBARDIA", "VA", "GALLIATE LOMBARDO", "2023-11-15 21:59:27", 1477.7, 1182.16], ["C62E23003280008", "EMILIA-ROMAGNA", "FC", "FORLI'", "2023-11-16 21:50:18", 1000.0, 800.0], ["B12E24007440008", "ABRUZZO", "TE", "MARTINSICURO", "2024-02-23 15:21:30", 3000.0, 1500.0], ["B32E24046010008", "LAZIO", "RM", "ANGUILLARA SABAZIA", "2024-07-08 10:23:41", 699.99, 559.99], ["B92E24050100008", "EMILIA-ROMAGNA", "MO", "MODENA", "2024-11-21 07:27:45", 1038.52, 830.82], ["B92E24051030008", "EMILIA-ROMAGNA", "MO", "CARPI", "2024-11-21 17:25:59", 2272.73, 1500.0], ["B62E24050820008", "PIEMONTE", "TO", "CUMIANA", "2024-10-30 18:18:35", 1200.0, 960.0], ["B32E24057120008", "PIEMONTE", "TO", "SANT'ANTONINO DI SUSA", "2024-11-04 20:39:19", 1400.0, 1120.0], ["B92E24042180008", "LOMBARDIA", "LC", "COLICO", "2024-07-08 10:12:27", 1288.0, 1030.4], ["B62E24039220008", "VENETO", "TV", "MOGLIANO VENETO", "2024-07-08 10:24:01", 1155.0, 924.0], ["B62E24047860008", "TRENTINO-ALTO ADIGE", "TN", "CIVEZZANO", "2024-11-22 10:39:11", 1410.9, 1128.72], ["C52E23001030008", "EMILIA-ROMAGNA", "BO", "ALTO RENO TERME", "2023-10-30 13:08:30", 722.18, 577.74], ["B12E24051600008", "LOMBARDIA", "CO", "COMO", "2024-10-25 07:48:33", 2123.71, 1500.0], ["B72E24046970008", "VENETO", "VE", "VENEZIA", "2024-09-28 07:16:07", 1536.0, 1228.8], ["B52E24039240008", "MARCHE", "FM", "FALERONE", "2024-07-09 12:39:11", 1304.92, 1043.94]];

        // Define the dt_args
        let dt_args = {"layout": {"topStart": "pageLength", "topEnd": "search", "bottomStart": "info", "bottomEnd": "paging", "top1": "searchPanes"}, "searchPanes": {"layout": "columns-3", "cascadePanes": true, "columns": [1, 2]}, "order": [], "warn_on_selected_rows_not_rendered": true, "filtered_row_count": 16781, "fnInfoCallback": function (oSettings, iStart, iEnd, iMax, iTotal, sPre) { return sPre + ' (<a href="https://mwouts.github.io/itables/downsampling.html">downsampled</a> from 17,951x7 to 1,170x7 as maxBytes=64KB)'; }};
        dt_args["data"] = data;

        
        new DataTable(table, dt_args);
    });
</script>
</div>
</div>


</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Agevolazioni</category>
  <category>Python</category>
  <category>Opendata</category>
  <category>MIMIT</category>
  <guid>https://paolovolterra.com/posts/2401_Colonnine/Colonnine.html</guid>
  <pubDate>Wed, 08 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Mini contratti di sviluppo</title>
  <dc:creator>Paolo Volterra</dc:creator>
  <link>https://paolovolterra.com/posts/2503_MiniCds/MiniCds.html</link>
  <description><![CDATA[ 




<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://paolovolterra.com/posts/2503_MiniCds/media/cover.png" class="img-fluid figure-img"></p>
<figcaption>cover</figcaption>
</figure>
</div>
<p>Il mini contratto di sviluppo è l’incentivo che supporta gli investimenti per lo sviluppo o la produzione di tecnologie critiche negli ambiti individuati dal [Regolamento europeo STEP(https://www.google.com/url?sa=t&amp;source=web&amp;rct=j&amp;opi=89978449&amp;url=https://opencoesione.gov.it/it/STEP/&amp;ved=2ahUKEwjaguuyo_eKAxUGxQIHHR0iIdoQFnoECAgQAQ&amp;usg=AOvVaw3X26JL2FFO0F2ZlCq1UAzu)]: tecnologie digitali e deep tech, tecnologie pulite ed efficienti sotto il profilo delle risorse, biotecnologie.</p>
<p>Lo strumento punta anche a rafforzare o salvaguardare le rispettive catene del valore, per favorire la sicurezza degli approvvigionamenti, nonché la resilienza e la produttività del sistema.</p>
<p>È promosso dal Ministero delle <strong>MIMIT</strong> ed è gestito da <strong>Invitalia</strong>.</p>
<p>Il mini contratto di sviluppo finanzia progetti tra 5 e 20 M€ e si rivolge alle imprese di tutte le dimensioni nelle regioni Basilicata, Calabria, Campania, Molise, Puglia, Sardegna e Sicilia.</p>
<p>La dotazione è di 300M€, messi a disposizione dal PNR, innovazione e competitività 2021–2027, ed è distribuita fra:</p>
<ul>
<li>100M€ con risorse dell’Obiettivo di Policy 1 del PN RIC 2021–2027 per sostenere gli investimenti delle Pmi</li>
<li>200M€ con risorse dell’Obiettivo di Policy STEP del PN RIC 2021–2027 per sostenere gli investimenti delle PMI e delle imprese di grandi dimensioni</li>
</ul>
<section id="le-agevolazioni" class="level2">
<h2 class="anchored" data-anchor-id="le-agevolazioni">Le agevolazioni</h2>
<p>Le agevolazioni sono concesse nella forma del contributo a fondo perduto, nei limiti delle intensità previste dalla Carta degli aiuti di Stato a finalità regionale.</p>
<p>Le spese ammissibili vengono coperte con le seguenti percentuali:</p>
<ul>
<li>piccole imprese: 55%</li>
<li>medie imprese: 45%</li>
<li>imprese di grandi dimensioni: 35%</li>
</ul>
<p>Relativamente alle sole Pmi: per le spese legate a consulenze funzionali alla realizzazione del piano di investimenti, le agevolazioni sono concesse nella misura del 50% delle spese ammissibili.</p>
</section>
<section id="come-funziona" class="level2">
<h2 class="anchored" data-anchor-id="come-funziona">Come funziona</h2>
<p>A seguito della presentazione delle domande è prevista la formazione di una graduatoria per stabilire l’ordine di avvio all’istruttoria, basata su questi criteri di valutazione:</p>
<ul>
<li>grado di indipendenza finanziaria</li>
<li>incidenza della gestione caratteristica sul fatturato</li>
<li>sostenibilità ambientale</li>
<li>innovatività</li>
<li>impatto occupazionale</li>
</ul>
<p>Il punteggio finale per ciascun criterio è calcolato tramite interpolazione lineare al fine di assegnare al valore più basso il valore 0 e a quello più alto il valore 1.</p>
<p>Il punteggio complessivo ottenuto per ciascun criterio è determinato dalla somma dei valori attribuibili per ciascuno dei criteri, ponderata secondo i seguenti pesi: 15% per il criterio di cui alla lettera a), 15% per il criterio di cui alla lettera b), 20% per il criterio di cui alla lettera c), 20% per il criterio di cui alla lettera d) e 30% per il criterio di cui alla lettera e).</p>
<p>Il punteggio complessivo può essere incrementato per le imprese in possesso di:</p>
<ul>
<li>[rating di legalità(https://www.agcm.it/competenze/rating-di-legalita/)] (+5%)</li>
<li>almeno una certificazione ambientale (EMAS, ISO 140001, ISO 50001); in alternativa può essere prevista l’applicazione, nel piano di investimenti, di metodologie riconosciute di valutazione del ciclo di vita (es. LCA, LCC) o per il calcolo dell’impronta ambientale delle organizzazioni, dei processi o dei prodotti (+5%)</li>
<li>certificazione della parità di genere, se l’impresa ne è in possesso alla data del 31 dicembre dell’anno precedente a quello della presentazione della domanda di agevolazione (+5%)</li>
</ul>
<p>In caso di parità di punteggio, è data preferenza alla domanda di agevolazione che prevede la minore richiesta di contributo in valore nominale. In caso di ulteriore parità di punteggio, è data preferenza alla domanda che ha conseguito il punteggio maggiore per il criterio di cui alla lettera a).</p>
</section>
<section id="normativa" class="level2">
<h2 class="anchored" data-anchor-id="normativa">Normativa</h2>
<ul>
<li><a href="https://www.mimit.gov.it/it/normativa/decreti-ministeriali/decreto-ministeriale-12-agosto-2024-nuovo-regime-di-aiuti-mini-contratti-di-sviluppo">Decreto ministeriale 12 agosto 2024 - Nuovo Regime di aiuti. Mini contratti di sviluppo</a></li>
<li><a href="https://www.invitalia.it/-/media/invitalia/documenti/sosteniamo-grandi-investimenti/mini-cds/decreto-12-agosto-2024.pdf">Decreto 12 agosto 2024</a></li>
<li><a href="https://www.mimit.gov.it/it/normativa/decreti-direttoriali/decreto-direttoriale-20-dicembre-2024-mini-contratti-di-sviluppo-apertura-sportello">Decreto direttoriale 20 dicembre 2024 –Mini Contratti di Sviluppo. Apertura sportello</a></li>
<li><a href="https://www.invitalia.it/-/media/invitalia/documenti/sosteniamo-grandi-investimenti/mini-cds/decreto_direttoriale_mini_cds-20-12-2024.pdf">Decreto direttoriale 20 dicembre 2024</a></li>
</ul>
</section>
<section id="fonti" class="level2">
<h2 class="anchored" data-anchor-id="fonti">Fonti</h2>
<ul>
<li>https://www.pnric.gov.it/opportunities/mini-contratti-di-sviluppo</li>
<li>https://www.invitalia.it/cosa-facciamo/sosteniamo-grandi-investimenti/mini-contratto-di-sviluppo</li>
<li>https://www.mimit.gov.it/it/normativa/decreti-ministeriali/decreto-ministeriale-12-agosto-2024-nuovo-regime-di-aiuti-mini-contratti-di-sviluppo</li>
<li>https://www.mimit.gov.it/it/notizie-stampa/mimit-al-via-dal-5-febbraio-lo-sportello-per-accedere-ai-mini-contratti-di-sviluppo</li>
<li><a href="https://www.pmi.it/economia/finanziamenti/460327/mini-contratti-di-sviluppo-2025-domanda-incentivi-dal-5-febbraio.html">Mini Contratti di Sviluppo 2025: domanda incentivi dal 5 febbraio</a></li>
</ul>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Torna in cima</a> ]]></description>
  <category>Invitalia</category>
  <category>CdS</category>
  <category>Agevolazioni</category>
  <category>Imprese</category>
  <guid>https://paolovolterra.com/posts/2503_MiniCds/MiniCds.html</guid>
  <pubDate>Tue, 07 Jan 2025 23:00:00 GMT</pubDate>
</item>
</channel>
</rss>
