4. Visualizzazioni degli impatti di ogni singolo Goal
Le seguenti mappe interattive riportano gli impatti dei Piani di Ricostruzione su ognugno dei 17 Sustainable Development Goals.
È possibile zoommare e cliccare su ogni singolo Comune così da ottere l’informazione dettagliata degli investimenti pertinenti il Goal scelto per ogni Comune.
Goal 1
L’Obiettivo di Sviluppo Sostenibile 1 (SDG 1 o Obiettivo Globale 1), uno dei 17 Obiettivi di Sviluppo Sostenibile stabiliti dalle Nazioni Unite nel 2015, chiede la fine della povertà in tutte le sue forme. La dicitura ufficiale è: “No Poverty”. I paesi membri si sono impegnati a “Non lasciare indietro nessuno”: alla base dell’obiettivo c’è un “forte impegno a non lasciare indietro nessuno e a raggiungere per primi chi è più indietro”. L’SDG 1 mira a sradicare ogni forma di povertà estrema, compresa la mancanza di cibo, acqua potabile e servizi igienico-sanitari. Il raggiungimento di questo obiettivo include la ricerca di soluzioni alle nuove minacce causate dal cambiamento climatico e dai conflitti. L’SDG 1 si concentra non solo sulle persone che vivono in povertà, ma anche sui servizi su cui le persone fanno affidamento e sulle politiche sociali che promuovono o prevengono la povertà.
Ulteriori informazioni sull’SDG 1 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 1 riceve il 6.31% dei finanziamenti per un totale di 102,291,835.70€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 190, il 73% del totale, investono nel Goal 1.
Il Goal 1 è principalmente impattato, al netto degli investimenti, dalle Strutture Socio Sanitarie, ovvero gli Ospedali, gli Ambulatori, le case di riposo e le case famiglia. Una volta considerati gli investimenti, però, sono le Scuole la categoria a impattare di più con 55 milioni di Euro contro i 28 delle Strutture Sanitarie. Questo perché, anche se le Strutture Socio-Sanitarie hanno un impatto netto maggiore sul Goal 1, bisogna tenere conto che le strutture adibite all’insegnamento ricevono 509 milioni dei 1618 messi a disposizione dai Piani di Ricostruzione.
Goal 2
L’Obiettivo di Sviluppo Sostenibile 2 (SDG 2) mira a raggiungere la “fame zero”. La formulazione ufficiale è: “Porre fine alla fame, raggiungere la sicurezza alimentare e migliorare la nutrizione e promuovere l’agricoltura sostenibile”. L’SDG 2 evidenzia le complesse interconnessioni tra sicurezza alimentare, nutrizione, trasformazione rurale e agricoltura sostenibile. Secondo le Nazioni Unite, ci sono circa 690 milioni di persone che soffrono la fame, pari al 10% della popolazione mondiale.
L’SDG 2 ha otto target e 14 indicatori per misurare i progressi. I cinque “obiettivi finali” sono: porre fine alla fame e migliorare l’accesso al cibo; porre fine a tutte le forme di malnutrizione; produttività agricola; sistemi di produzione alimentare sostenibili e pratiche agricole resilienti; e la diversità genetica dei semi, delle piante coltivate e degli animali d’allevamento e addomesticati; investimenti, ricerca e tecnologia. I tre “mezzi per raggiungere” gli obiettivi includono: affrontare le restrizioni commerciali e le distorsioni nei mercati agricoli mondiali e nei mercati dei prodotti alimentari e dei loro derivati.
Ulteriori informazioni sull’SDG 2 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 2 riceve il 0.70% dei finanziamenti per un totale di 11,328,063.85€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 134, il 52% del totale, investono nel Goal 2.
Il Goal 2 è principalmente impattato, sia qualitativamente che quantitativamente, dalle opere riguardanti il Dissesto Idrogeologico e le risorse idriche. Gli interventi all’interno di questa categoria, infatti, permettono di riassestare le aree riservate all’agricoltura e renderle maggiormente resilienti. Inoltre, la grande maggioranza degli interventi è a favore dei piccoli produttori.
Goal 3
L’obiettivo di sviluppo sostenibile 3 (SDG 3) riguarda la “Buona salute e benessere”. La formulazione ufficiale è: "Per garantire una vita sana e promuovere il benessere per tutti a tutte le età». Gli obiettivi dell’SDG 3 coprono e si concentrano su vari aspetti della vita sana e dello stile di vita sano.
L’SDG 3 ha 13 obiettivi e 28 indicatori per misurare i progressi verso gli obiettivi. I primi nove obiettivi sono “obiettivi finali”. Questi sono: riduzione della mortalità materna; porre fine a tutte le morti evitabili al di sotto dei cinque anni di età; combattere le malattie trasmissibili; assicurare la riduzione della mortalità per malattie non trasmissibili e promuovere la salute mentale; prevenire e curare l’abuso di sostanze; ridurre gli incidenti stradali e i decessi; garantire l’accesso universale all’assistenza sessuale e riproduttiva, alla pianificazione familiare e all’istruzione; ottenere una copertura sanitaria universale; e ridurre le malattie e i decessi causati da sostanze chimiche pericolose e inquinamento.
L’SDG 3 mira a raggiungere una copertura sanitaria universale, che cerca un accesso equo ai servizi sanitari per tutti gli uomini e le donne. Propone di porre fine alla morte prevenibile di neonati, lattanti e bambini sotto i cinque anni (mortalità infantile) e di porre fine alle epidemie.
La buona salute è essenziale per lo sviluppo sostenibile e l’Agenda 2030. Si concentra su più ampie disuguaglianze economiche e sociali, urbanizzazione, crisi climatica, carico continuo di HIV e altre malattie infettive, senza dimenticare le sfide emergenti come le malattie non trasmissibili.
Ulteriori informazioni sull’SDG 3 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 3 riceve il 4.08% dei finanziamenti per un totale di 66,176,691.80€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 136, il 53% del totale, investono nel Goal 3.
Il Goal 3 è, come prevedibile, principalmente traniato dagli interventi riguardanti le Strutture Socio-Sanitarie. Le opere all’interno di questa categoria soddisfano, in media, il 34% dei target posti dalle Nazioni Unite. Può sembrare un risultato basso, ma questo dipende dal fatto che molti dei target sono in realtà rivolti a Paesi in via di sviluppo. Gli investimetni nelle Strutture Socio-Sanitarie impattano in Goal 3 con 36,089,348.46€. Nonostante le scuole soddisfino, in media, i target del Goal 3 al 5% (contribuiscono infatti all’educazione alla salute e al benessere psico-fisico), la mole di investimenti in questa categoria le porta a contribuire al Goal 3 con 25,099,326.95€.
Goal 4
L’Obiettivo di Sviluppo Sostenibile 4 (SDG 4) riguarda un’istruzione di qualità. Il titolo completo dell’SDG 4 è “Garantire un’istruzione di qualità inclusiva ed equa e promuovere opportunità di apprendimento permanente per tutti”.
L’SDG 4 ha dieci obiettivi che sono misurati da 11 indicatori. I sette “risultati finali” sono: istruzione primaria e secondaria gratuita; pari accesso a un’istruzione preprimaria di qualità; istruzione tecnica, professionale e superiore a prezzi accessibili; aumento del numero di persone con competenze rilevanti per il successo finanziario; eliminazione di ogni discriminazione nell’istruzione; alfabetizzazione e calcolo universali; e l’educazione allo sviluppo sostenibile e alla cittadinanza globale. I tre “mezzi per raggiungere gli obiettivi” sono: costruire e migliorare scuole inclusive e sicure; ampliare le borse di studio per l’istruzione superiore per i paesi in via di sviluppo; e aumentare l’offerta di insegnanti qualificati nei paesi in via di sviluppo.
L’SDG 4 mira a fornire ai bambini e ai giovani un’istruzione di qualità e facilmente accessibile oltre ad altre opportunità di apprendimento. Uno dei suoi obiettivi è raggiungere l’alfabetizzazione e la matematica universali. Una componente importante nell’acquisizione di conoscenze e abilità preziose nell’ambiente di apprendimento. Da qui l’urgente necessità di costruire più strutture educative e anche di aggiornare quelle attuali per fornire ambienti di apprendimento sicuri, inclusivi ed efficaci per tutti.
Ulteriori informazioni sull’SDG 4 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 4 riceve il 24.18% dei finanziamenti per un totale di 392,040,352.87€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 187, il 72% del totale, investono nel Goal 4.
Il Goal 4 è traniato dagli interventi riguardanti le Scuole. In media, un intervento su una struttura scolastica soddisfa il 74% dei target posti dalle Nazioni Unite per il Goal 4. 377 milioni dei 392 riservati al Goal 4 derivano dalle Scuole.
Goal 5
L’obiettivo di sviluppo sostenibile 5 (SDG 5) riguarda l’uguaglianza di genere ed è il quinto dei 17 obiettivi di sviluppo sostenibile stabiliti dalle Nazioni Unite nel 2015. La formulazione ufficiale dell’SDG 5 è “Raggiungere l’uguaglianza di genere e responsabilizzare tutte le donne e le ragazze”.
L’SDG 5 ha nove obiettivi e 14 indicatori. Sei degli obiettivi sono “orientati al risultato”: porre fine a tutte le forme di discriminazione contro tutte le donne e le ragazze ovunque; porre fine alla violenza e allo sfruttamento di donne e ragazze; eliminare pratiche dannose come il matrimonio infantile, precoce e forzato e le mutilazioni genitali femminili; valorizzare l’assistenza non retribuita e promuovere responsabilità domestiche condivise; garantire la piena partecipazione delle donne alla leadership e al processo decisionale; e garantire l’accesso ai diritti riproduttivi universali e alla salute. I tre “mezzi per raggiungere” gli obiettivi sono: promuovere la parità di diritti alle risorse economiche, alla proprietà e ai servizi finanziari per le donne; promuovere l’emancipazione delle donne attraverso la tecnologia; e l’adozione, il rafforzamento delle politiche e l’applicazione della legislazione per la parità di genere.
L’SDG 5 mira a garantire a donne e ragazze pari diritti, opportunità di vivere liberi senza discriminazioni, compresa la discriminazione sul posto di lavoro o qualsiasi violenza. Questo per raggiungere l’uguaglianza di genere e dare potere a tutte le donne e le ragazze.
Ulteriori informazioni sull’SDG 5 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 5 riceve il 5.25% dei finanziamenti per un totale di 85,180,909.99€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 122, il 47% del totale, investono nel Goal 5.
Tra gli inteventi presenti, principalmente sono le Scuole e le Strutture Socio-Sanitarie a contribuire al Goal 5.
La scuola ha soprattutto un impatto indiretto sul target 5.b: “Promuovere l’emancipazione delle donne attraverso la tecnologia.”
Le strutture socio sanitarie, invece, contribuiscono attraverso il target 5.6: “Accesso universale ai diritti riproduttivi e alla salute.”
Goal 6
L’Obiettivo di Sviluppo Sostenibile 6 (SDG 6) riguarda “acqua pulita e servizi igienico-sanitari per tutti”. La dicitura ufficiale è: “Garantire la disponibilità e la gestione sostenibile dell’acqua e dei servizi igienico-sanitari per tutti”. L’obiettivo prevede otto target da raggiungere almeno entro il 2030. I progressi verso gli obiettivi saranno misurati utilizzando undici indicatori.
I sei “obiettivi finali” includono: Acqua potabile sicura e conveniente; porre fine alla defecazione all’aperto e fornire accesso a servizi igienico-sanitari, migliorare la qualità dell’acqua, il trattamento delle acque reflue e il riutilizzo sicuro, aumentare l’efficienza nell’uso dell’acqua e garantire l’approvvigionamento di acqua dolce, implementare l’IWRM, proteggere e ripristinare gli ecosistemi legati all’acqua. I mezzi per raggiungere gli obiettivi sono espandere il sostegno idrico e igienico-sanitario ai paesi in via di sviluppo e sostenere l’impegno locale nella gestione dell’acqua e dei servizi igienico-sanitari.
Nel 2017, 2,2 miliardi di persone non avevano acqua potabile gestita in modo sicuro e 4,2 miliardi di persone non avevano servizi igienico-sanitari gestiti in modo sicuro. Tre miliardi di persone in tutto il mondo non dispongono di strutture di base per il lavaggio delle mani a casa. Due strutture sanitarie su cinque in tutto il mondo non hanno acqua e sapone, né sanificatori per le mani a base di alcol (2016). La pandemia di COVID-19 ha reso questo obiettivo sempre più importante.
Ulteriori informazioni sull’SDG 6 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 6 riceve il 7.00% dei finanziamenti per un totale di 113,485,041.84€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 138, il 53% del totale, investono nel Goal 6.
Il Goal 6 è trainato sia qualitativamente che quantitativamente dagli interventi appartenenti alla categoria del Dissesto Idrogeologico e per le Risorse Idriche.
Gli interventi appartententi a questa categoria soddifano, in media, i target del Goal 6 al 62%.
Quantitativamente, la categoria del Dissesto Idrogeologico contribuisce con 93 milioni sul totale di 113.5.
Goal 7
L’Obiettivo di Sviluppo Sostenibile 7 (SDG 7) mira a “Garantire l’accesso a un’energia economica, affidabile, sostenibile e moderna per tutti”. L’accesso all’energia è un pilastro molto importante per il benessere delle persone, lo sviluppo economico e la riduzione della povertà.
L’obiettivo prevede cinque target da raggiungere entro il 2030. I progressi verso gli obiettivi sono misurati da sei indicatori. Tre dei cinque obiettivi sono “obiettivi finali”: Accesso universale all’energia moderna; aumentare la percentuale globale di energia rinnovabile; raddoppiare il miglioramento dell’efficienza energetica. I restanti due obiettivi sono mezzi per raggiungere gli altri target: promuovere l’accesso alla ricerca, alla tecnologia e agli investimenti in energia pulita; ed espandere e aggiornare i servizi energetici per i paesi in via di sviluppo.
In altre parole, questi target includono l’accesso a un’energia economica e affidabile, aumentando al contempo la quota di energia rinnovabile nel mix energetico globale. Ciò comporterebbe il miglioramento dell’efficienza energetica e il rafforzamento della cooperazione internazionale per facilitare un accesso più aperto alla tecnologia dell’energia pulita e maggiori investimenti nelle infrastrutture per l’energia pulita.
Ulteriori informazioni sull’SDG 7 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 7 riceve lo 0.01% dei finanziamenti per un totale di 158,045.604€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, solo 2 investono nel Goal 7.
Il Goal 7 è il penultimo Goal, dopo il 14, per numero di investimenti.
Questo risultato deriva dal fatto che gli interventi di ricostruzione analizzati non esplicitano se l’attuazione degli stessi avverrà in un’ottica sostenibile, quindi se ad esempio, la costruzione di edifici includa anche l’efficientamento energetico o l’installazione di pannelli solari o in generale l’utilizzo del Ecobonus 110%. Conseguentemente, non appena saranno chiare le modalità di attuazione degli interventi, si potrà ricalibrare il modello sulla base degli investimenti finalizzati.
Tra gli interventi analizzati, solo due impattano il Goal 7. Questi sono: le centrali idroelettriche di Castel Sant’Angelo nel Lazio e Arquata del Tronto nelle Marche. Alla prima sono riservati circa 49 mila €, alla seconda circa 109 mila €.
Goal 8
L’Obiettivo di Sviluppo Sostenibile 8 (SDG 8) riguarda “lavoro dignitoso e crescita economica”. Il titolo completo è: “Favorire una crescita economica sostenuta, inclusiva e sostenibile, un’occupazione piena e produttiva e un lavoro dignitoso per tutti”. I progressi verso gli obiettivi sono misurati, monitorati e valutati da 17 indicatori.
L’SDG 8 ha dodici target (o obiettivi) in totale da raggiungere entro il 2030. Alcuni obiettivi sono per il 2030; altri erano per il 2020. I primi dieci sono “obiettivi finali”. Questi sono: crescita economica sostenibile; diversificare, innovare e migliorare per la produttività economica; promuovere politiche a sostegno della creazione di posti di lavoro e delle imprese in crescita; migliorare l’efficienza delle risorse nel consumo e nella produzione; piena occupazione e lavoro dignitoso a parità di retribuzione; promuovere l’occupazione giovanile, l’istruzione e la formazione; porre fine alla schiavitù moderna, alla tratta e al lavoro minorile; proteggere i diritti dei lavoratori e promuovere ambienti di lavoro sicuri; promuovere un turismo benefico e sostenibile; accesso universale ai servizi bancari, assicurativi e finanziari. Inoltre, ci sono anche due obiettivi considerati “mezzi” per raggiungere il fine, che sono: aumentare gli aiuti per il sostegno al commercio; sviluppare una strategia globale per l’occupazione giovanile.
Questo obiettivo mira a garantire che il settore economico di ogni paese fornisca il necessario bisogno per i suoi cittadini di avere una buona vita indipendentemente dal loro background, razza o cultura. Circa la metà della popolazione mondiale vive ancora con l’equivalente di circa 2 dollari al giorno. In molti luoghi, avere un lavoro non garantisce la possibilità di uscire dalla povertà. Questo progresso lento e diseguale potrebbe richiedere a tutti di ripensare e riorganizzare le politiche economiche e sociali volte a sradicare la povertà.
Ulteriori informazioni sull’SDG 8 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 8 riceve il 5.41% dei finanziamenti per un totale di 87,723,703.06€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 197 investono nel Goal 8.
Il Goal 8 è sospinto dagli investimenti nelle Scuole, nelle Attività Produttive e nei Beni Culturali.
Mentre le Scuole e le Attività Produttive soddisfano i target che promuovono l’occupazione giovanile, l’istruzione e la formazione, e la diversificazione, l’innovazione e l’aggiornamento della produttività economica, i Beni Culturali favoriscono la promozione di un turismo sostenibile che benefici le zone colpite dal sisma.
Goal 9
L’Obiettivo di Sviluppo Sostenibile 9 (Obiettivo 9) riguarda “l’industria, l’innovazione e le infrastrutture”. Mira a costruire infrastrutture resilienti, promuovere l’industrializzazione sostenibile e favorire l’innovazione.
L’SDG 9 ha otto target e i progressi sono misurati da dodici indicatori. I primi cinque obiettivi sono “obiettivi finali”: sviluppare infrastrutture sostenibili, resilienti e inclusive; promuovere un’industrializzazione inclusiva e sostenibile; aumentare l’accesso ai servizi e ai mercati finanziari; aggiornare tutte le industrie e le infrastrutture per la sostenibilità; potenziare la ricerca e aggiornare le tecnologie industriali. I restanti tre target sono “mezzi per raggiungere” obiettivi: Facilitare lo sviluppo di infrastrutture sostenibili per i paesi in via di sviluppo; sostenere lo sviluppo tecnologico nazionale e la diversificazione industriale; accesso universale alle tecnologie dell’informazione e della comunicazione.
L’obiettivo ha interconnessioni con altri SDGs. Mentre l’industrializzazione è collegata all’SDG 8 (lavoro dignitoso e crescita economica) e all’SDG 11 (città e comunità sostenibili), l’innovazione e lo sviluppo di nuove competenze aiuteranno a realizzare l’SDG 2 (fame zero), l’SDG 6 (acqua pulita e servizi igienico-sanitari), l’SDG 7 (energia accessibile e pulita) e SDG 11 (città e comunità sostenibili).
Ulteriori informazioni sull’SDG 9 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 9 riceve l’1.18% dei finanziamenti per un totale di 19,140,215.83€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 190 investono nel Goal 9.
Il Goal 9 è per lo più impattato dalle opere di Urbanizzazione. Gli interventi appartenenti a questa categoria, infatti, soddisfano al 100% il primo target del Goal 9: Sviluppare infrastrutture sostenibili, resilienti e inclusive.
Goal 10
L’Obiettivo di Sviluppo Sostenibile 10 (SDG 10) riguarda la riduzione della disuguaglianza. Il titolo completo è: “Ridurre la disuguaglianza all’interno e tra i paesi”.
L’obiettivo ha dieci target da raggiungere entro il 2030. I primi sette obiettivi sono “obiettivi finali”: ridurre le disuguaglianze di reddito; promuovere l’inclusione sociale, economica e politica universale; garantire pari opportunità e porre fine alla discriminazione; adottare politiche fiscali e sociali che promuovano l’uguaglianza; una migliore regolamentazione dei mercati finanziari globali e delle istituzioni; una maggiore rappresentanza dei paesi in via di sviluppo nelle istituzioni finanziarie; politiche migratorie responsabili e ben gestite. Gli altri tre obiettivi sono obiettivi visti come “mezzi di raggiungimento”: trattamento speciale e differenziato per i paesi in via di sviluppo; incoraggiare l’assistenza allo sviluppo e gli investimenti nei paesi meno sviluppati; ridurre i costi di transazione per le rimesse dei migranti.
L’obiettivo 10.1 è “sostenere la crescita del reddito del 40% più povero della popolazione a un tasso superiore alla media nazionale”. Questo obiettivo, noto come “prosperità condivisa”, è complementare all’SDG 1, l’eliminazione della povertà estrema, ed è rilevante per tutti i paesi del mondo.
Ulteriori informazioni sull’SDG 10 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 10 riceve il 4.31% dei finanziamenti per un totale di 69,889,839.73€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 171 investono nel Goal 10.
Il Goal 10 è per lo più sospinto dagli investimenti sulle Scuole. Questa categoria, infatti, contribuisce alla realizzazione del Target 10.2: “Promuovere l’inclusione sociale, economica e politica universale.”
Goal 11
L’Obiettivo di Sviluppo Sostenibile 11 (SDG 11) riguarda “città e comunità sostenibili”. L’SDG 11 è “Rendere le città inclusive, sicure, resilienti e sostenibili”.
L’SDG 11 ha 10 target da raggiungere e questo viene misurato con 15 indicatori. I sette “obiettivi finali” includono: alloggi sicuri e convenienti, sistemi di trasporto convenienti e sostenibili; urbanizzazione inclusiva e sostenibile; proteggere il patrimonio culturale e naturale mondiale; ridurre gli effetti negativi dei disastri naturali; ridurre gli impatti ambientali delle città; fornire accesso a spazi verdi e pubblici sicuri e inclusivi. I tre target visti come “mezzi per raggiungere” gli obiettivi includono: una forte pianificazione dello sviluppo nazionale e regionale; attuare politiche per l’inclusione, l’efficienza delle risorse e la riduzione del rischio di catastrofi; sostenere i paesi meno sviluppati nell’edilizia sostenibile e resiliente.
Ulteriori informazioni sull’SDG 11 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 11 riceve il 19.81% dei finanziamenti per un totale di 321,290,659.88€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 254, il 98% del totale, investono nel Goal 11.
Il Goal 11 è principalmente impattato dalle categorie Edilizia, Dissesto Idrogeologico, e Beni Culturali. Questo, infatti, ha al suo interno il target 11.1 “Entro il 2030, garantire a tutti l’accesso ad alloggi adeguati, sicuri e convenienti e ai servizi di base e riqualificare i quartieri poveri” a cui contribuiscono gli interventi per la costruzione e ricostruzione di case popolari sotto la categoria Edilizia). Inoltre, il target 11.4 “Potenziare gli sforzi per proteggere e salvaguardare il patrimonio culturale e naturale del mondo” viene impattato dal 97% degli interventi totali: da una parte, gli interventi all’interno della categoria Beni Culturali soddisfano la componente di salvaguardia del patrimonio culturale del target in questione; dall’altra, gli interventi di “Dissesto Idrogeologico, Risorse Idriche” coinvolgono l’aspetto di protezione nei confronti del patrimonio naturale presente nel target.
Goal 12
L’obiettivo 12 di sviluppo sostenibile (SDG 12), intitolato “Garantire modelli di consumo e produzione sostenibili”, è inteso a garantire un buon uso delle risorse, migliorare l’efficienza energetica, infrastrutture sostenibili e fornire accesso ai servizi di base, posti di lavoro verdi e dignitosi e garantire una migliore qualità della vita per tutti. L’SDG 12 ha 11 tareget da raggiungere almeno entro il 2030.
I primi 8 sono “obiettivi finali”, che sono: attuare il quadro decennale dei programmi sui modelli di consumo e produzione sostenibili; raggiungere la gestione sostenibile e l’uso efficiente delle risorse naturali; la riduzione della metà dello spreco alimentare globale pro capite a livello di vendita al dettaglio e di consumo e la riduzione delle perdite alimentari lungo le catene di produzione e fornitura, comprese le perdite post-raccolta; raggiungere una gestione ecologicamente corretta delle sostanze chimiche e di tutti i rifiuti durante tutto il loro ciclo di vita; ridurre la produzione di rifiuti attraverso la prevenzione, la riduzione, il riciclaggio e il riutilizzo; incoraggiare le aziende ad adottare pratiche sostenibili; promuovere pratiche di appalti pubblici sostenibili; e garantire che le persone in tutto il mondo abbiano le informazioni e la consapevolezza pertinenti per lo sviluppo sostenibile.
I tre obiettivi “mezzi di raggiungimento” sono: sostenere i paesi in via di sviluppo per rafforzare la loro capacità scientifica e tecnologica; sviluppare e implementare strumenti per monitorare gli impatti dello sviluppo sostenibile; e rimuovere le distorsioni del mercato, come i sussidi ai combustibili fossili, che incoraggiano lo spreco.
Ulteriori informazioni sull’SDG 12 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 12 riceve il 3.89% dei finanziamenti per un totale di 63,032,593.33€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 226, l’87% del totale, investono nel Goal 12.
Il Goal 12 viene principalmente impattato dagli interventi all’interno delle categorie Edilizia e Scuole. Mentre le scuole contribuiscono alla formazione degli studenti riguardo il consumo responsabile, gli investimenti in edilizia vanno a impattare direttamente una diminuzione dello spreco e una miglior gestione dei rifiuti soddisfando il target 12.5: “Ridurre sostanzialmente la produzione di rifiuti.” Ma non solo, la trasparenza con cui sono state effettuati questi interventi soddifsa a pieno il target 12.7: “Promuovere pratiche sostenibili in materia di appalti pubblici.”
Goal 13
L’obiettivo di sviluppo sostenibile 13 (SDG 13) riguarda l’azione per il clima. La formulazione ufficiale è “Adottare misure urgenti per combattere il cambiamento climatico e i suoi impatti”. L’SDG 13 ha obiettivi che devono essere raggiunti entro il 2030.
Ci sono 5 target in totale, che coprono un’ampia gamma di questioni relative all’azione per il clima. I primi tre obiettivi sono “obiettivi finali”: rafforzare la resilienza e la capacità di adattamento ai disastri legati al clima; integrare le misure in materia di cambiamento climatico nelle politiche e nella pianificazione; costruire conoscenze e capacità per affrontare il cambiamento climatico. I restanti due target sono “mezzi per raggiungere” gli obiettivi: attuare la Convenzione quadro delle Nazioni Unite sui cambiamenti climatici; e promuovere meccanismi per aumentare la capacità di pianificazione e gestione. La Convenzione quadro delle Nazioni Unite sui cambiamenti climatici (UNFCCC) è il principale forum internazionale intergovernativo per negoziare la risposta globale al cambiamento climatico.
Il decennio tra il 2010 e il 2019 è stato il decennio più caldo mai registrato nella storia. Attualmente il cambiamento climatico sta interessando la comunità globale in ogni nazione del mondo. L’impatto del cambiamento climatico non colpisce solo le economie nazionali, ma anche vite e mezzi di sussistenza, in particolare quelli in condizioni vulnerabili.
Ulteriori informazioni sull’SDG 13 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 13 riceve il 9.70% dei finanziamenti per un totale di 157,245,009.39€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 251, il 97% del totale, investono nel Goal 13.
Il Goal 13 è trainato quantitativamente principalmente dagli interventi sulle Scuole. Le scuole, infatti, contribuiscono a raggiungere il target 13.3: “Sviluppare conoscenze e capacità per far fronte ai cambiamenti climatici.” L’altra categoria determinante per la “Climate Action” è il Dissesto Idrogeologico, Risorse Idriche. Questi interventi soddisfano a pieno il target 13.1: “Rafforzare la resilienza e la capacità di adattamento ai disastri legati al clima.” Questi interventi sono volti sia alla ricostruzione del territorio danneggiato che a dare una maggiore resilienza alle aree colpite affinché non vengano così duramente colpite in caso di calamità future.
Goal 14
L’obiettivo di sviluppo sostenibile 14 (SDG 14) riguarda la “vita sott’acqua”. La formulazione ufficiale è “Conservare e utilizzare in modo sostenibile gli oceani, i mari e le risorse marine per uno sviluppo sostenibile”. L’obiettivo ha dieci obiettivi da raggiungere entro il 2030.
I primi sette obiettivi sono “obiettivi di risultato”: ridurre l’inquinamento marino; proteggere e ripristinare gli ecosistemi; ridurre l’acidificazione degli oceani; pesca sostenibile; conservare le aree costiere e marine; porre fine alle sovvenzioni che contribuiscono alla pesca eccessiva; aumentare i benefici economici derivanti dall’uso sostenibile delle risorse marine. Gli ultimi tre obiettivi sono “mezzi per raggiungere” obiettivi: aumentare la conoscenza scientifica, la ricerca e la tecnologia per la salute degli oceani; sostenere i pescatori di piccola scala; attuare e far rispettare il diritto marittimo internazionale.
Gli oceani e la pesca supportano i bisogni economici, sociali e ambientali della popolazione mondiale. Gli oceani sono la fonte della vita del pianeta e il regolatore del sistema climatico globale. Gli oceani coprono più di due terzi della superficie terrestre e contengono il 97% dell’acqua del pianeta. Sono essenziali per rendere vivibile il pianeta. L’acqua piovana, l’acqua potabile e il clima sono tutti regolati dalle temperature e dalle correnti oceaniche. Tuttavia, c’è stato un aumento del 26% dell’acidificazione dalla rivoluzione industriale. Sono necessarie strategie efficaci per mitigare gli effetti negativi dell’aumento dell’acidificazione degli oceani per promuovere l’uso sostenibile degli oceani.
Ulteriori informazioni sull’SDG 14 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 14 riceve lo 0.0036% dei finanziamenti per un totale di $58,120.00€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 4, l’1.5% del totale, investono nel Goal 13.
Il risultato relativo al Goal 14 non è inaspettato: si tratta infatti di un Obiettivo che si riferisce alle aree marittime o costiere, mentre gli interventi di ricostruzione qui analizzati si rifanno principalmente ad aree montane. Ciononostante, alcuni interventi di Dissestro Idrogeologico e Risorse Idriche vanno comunque a impattare questo Goal. Infatti, alcune di queste opere, impattano indirettamente, e con una bassa magnitudo, il target 14.1: “Ridurre l’inquinamento marino.” Questo perché alcune opere di Dissesto Idrogeologico sono state effettuate su torrenti e fiumi di acqua dolce che vanno poi a raggiungere il mare. Poiché l’"Indice di eutrofizzazione costiera (ICEP), si riferisce agli apporti di nutrienti (azoto, fosforo e silice) dai fiumi, questi interventi vanno indirettamente a impatare, anche se in modo lieve, sul Goal 14.
Goal 15
L’obiettivo 15 di sviluppo sostenibile (SDG 15) riguarda la “vita sulla terra”. La formulazione ufficiale è: “Proteggere, ripristinare e promuovere l’uso sostenibile degli ecosistemi terrestri, gestire in modo sostenibile le foreste, combattere la desertificazione, arrestare e invertire il degrado del suolo e arrestare la perdita di biodiversità”. L’obiettivo prevede 12 target (o obiettivi) da raggiungere entro il 2030. I progressi verso gli obiettivi saranno misurati da 14 indicatori.
I nove “obiettivi finali” includono: Conservare e ripristinare gli ecosistemi terrestri e d’acqua dolce; porre fine alla deforestazione e ripristinare le foreste degradate; porre fine alla desertificazione e ripristinare i terreni degradati; garantire la conservazione degli ecosistemi montani, proteggere la biodiversità e gli habitat naturali; proteggere l’accesso alle risorse genetiche e l’equa ripartizione dei benefici; eliminare il bracconaggio e il traffico di specie protette; prevenire le specie aliene invasive sulla terra e negli ecosistemi acquatici; e integrare l’ecosistema e la biodiversità nella pianificazione governativa.
I tre target, “mezzi per raggiungere gli obiettivi”, includono: aumentare le risorse finanziarie per conservare e utilizzare in modo sostenibile l’ecosistema e la biodiversità; finanziare e incentivare la gestione forestale sostenibile; combattere il bracconaggio globale e la tratta.
Ulteriori informazioni sull’SDG 15 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 15 riceve il 3.45% dei finanziamenti per un totale di 55,863,644.80€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 214, l’83% del totale, investono nel Goal 15.
La quasi totalità di investimenti sul Goal 15 arriva dalla categoria del Dissesto Idrogeologico, Risorse Idriche. Gli interventi all’interno di questa categoria, infatti, soddisfano a pieno i target 15.1: “Conservare e ripristinare gli ecosistemi terrestri e d’acqua dolce” e 15.3: “Porre fine alla desertificazione e ripristinare i terreni degradati”. Inoltre, impattano direttamente, anche se con una magnitudo inferiore, i target 15.2: “Porre fine alla deforestazione e ripristinare le foreste degradate” e 15.4: “Garantire la conservazione degli ecosistemi montani”.
Goal 16
L’Obiettivo di Sviluppo Sostenibile 16 (SDG 16) riguarda “pace, giustizia e istituzioni forti”. La formulazione ufficiale è: “Promuovere società pacifiche e inclusive per lo sviluppo sostenibile, fornire accesso alla giustizia per tutti e costruire istituzioni efficaci, responsabili e inclusive a tutti i livelli”. Il Goal prevede 12 target (o obiettivi) da raggiungere entro il 2030. I progressi verso gli obiettivi saranno misurati da 23 indicatori.
Il Goal ha dieci “obiettivi finali”: ridurre la violenza; proteggere i bambini da abusi, sfruttamento, tratta e violenza; promuovere lo stato di diritto e garantire la parità di accesso alla giustizia; combattere la criminalità organizzata e i flussi finanziari e di armi illeciti, ridurre sostanzialmente la corruzione e le tangenti; sviluppare istituzioni efficaci, responsabili e trasparenti; garantire un processo decisionale reattivo, inclusivo e rappresentativo; rafforzare la partecipazione alla governance globale; fornire identità giuridica universale; garantire l’accesso del pubblico alle informazioni e tutelare le libertà fondamentali.
Esistono anche due target considerati “mezzi per raggiungere gli obiettivi”: rafforzare le istituzioni nazionali per prevenire la violenza e combattere la criminalità e il terrorismo; promuovere e applicare leggi e politiche non discriminatorie.
Ridurre la criminalità violenta, il sex trafficking, il lavoro forzato e gli abusi sui minori sono obiettivi globali chiari. La Comunità Internazionale apprezza la pace e la giustizia e chiede sistemi giudiziari più forti che applichino le leggi e lavorino per una società più pacifica e giusta.
Ulteriori informazioni sull’SDG 16 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 16 ottiene il 4.01% dei finanziamenti per un totale di 65,046,248.29€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 182, il 70% del totale, investono nel Goal 16.
La maggior parte degli inteventi che contribuiscono al Goal 16 rientrano nella categoria “Altro.” Questo perché, in questa categoria, sono state incluse le opere mirate alle infrastrutture comunali orientate alle funzioni politiche, i municipi e le caserme, siano queste di Polizia o dei Vigili del Fuoco. Sono questi gli interventi che impattano i target del Goal 16 sulla riduzione della violenza, la protezione dei più deboli, in particolare dei bambini, la promozione di uno stato di diritto,garantire la parità di accesso alla giustizia e la protezione delle libertà fondamentali.
Goal 17
L’obiettivo di sviluppo sostenibile 17 (SDG 17) riguarda le “partnership per gli obiettivi”. La formulazione ufficiale è: “Rafforzare i mezzi di attuazione e rivitalizzare il partenariato globale per lo sviluppo sostenibile”. L’Obiettivo prevede 17 obiettivi da raggiungere entro il 2030, suddivisi in cinque categorie: finanza, tecnologia, sviluppo delle capacità, commercio e questioni sistemiche. I progressi verso gli obiettivi saranno misurati da 25 indicatori.
L’SDG 17 fa riferimento alla necessità di una collaborazione intersettoriale e internazionale nel perseguimento di tutti gli obiettivi entro il 2030. È un invito ai paesi ad allineare le politiche. L’SDG 17 è una visione per un commercio migliore e più equo, nonché iniziative di investimento coordinate per promuovere lo sviluppo sostenibile oltre i confini. Si tratta di rafforzare e snellire la cooperazione tra gli stati-nazione, sia sviluppati che in via di sviluppo, utilizzando gli SDGs come un quadro condiviso e una visione condivisa per definire quel modo di procedere collaborativo. Mira a promuovere il commercio internazionale e ad aiutare i paesi in via di sviluppo ad aumentare le loro esportazioni per garantire un sistema commerciale equo e basato su regole universale che sia equo, aperto e vantaggioso per tutti.
Ulteriori informazioni sull’SDG 17 si possono trovare cliccando qui.
Mappa Interattiva
Commento:
Il Goal 17 riceve lo 0.71% dei finanziamenti per un totale di 11,583,995.86€. Dei 259 Comuni coinvolti nei Piani di Ricostruzione, 177, il 68% del totale, investono nel Goal 17.
Sono le Scuole a sospingere questo Goal con 7.5 milioni sugli 11.5 totali. Le scuole, infatti, hanno un impatto indiretto sul target 17.6: “Condivisione delle conoscenze e cooperazione per l’accesso alla scienza, alla tecnologia e all’innovazione”. Dopodiché, all’interno della categoria “Altro”, vi sono le Caserme che, facendo rispettare le leggi, contribuiscono alla realizzazione del target 17.1: “Mobilitare le risorse per migliorare la riscossione delle entrate nazionali”.
Riferimenti
Autorità di Bacino Distrettuale dell’Appennino Centrale, Il progetto ReSTART, Data di ultimo accesso: 09/11/2021 [Disponibile al link: https://www.autoritadistrettoac.it/restart]
Cavalli, L., Sanna, S., Alibegovic, M., Arras, F., Cocco, G., Farnia, L., Manca, E., Mulas, L. F., Onnis, M., Ortu, S., Romani, I. G., & Testa, M., The Contribution of the European Cohesion Policy to the 2030 Agenda: an Application to the Autonomous Region of Sardinia, FEEM Working Paper, 2020 [Disponibile al link: https://www.feem.it/en/publications/feem-working-papers-note-di-lavoro-series/the-contribution-of-the-european-cohesion-policy-to-the-2030-agenda-an-application-to-the-autonomous-region-of-sardinia/]
Cavalli, L., Sanna, S., Alibegovic, M., Arras, F., Cocco, G., Farnia, L., Manca, E., Mulas, L. F., Onnis, M., Ortu, S., Romani, I. G., & Testa, M., Sustainable Development Goals and the European Cohesion Policy: an application to the Autonomous Region of Sardinia., Journal of Urban Ecology, forthcoming
Farnia L., Cavalli L., Lizzi, G., & Vergalli, S., Methodological Insights to Measure the Agenda 2030 at Urban Level in Italy, Sustainability 2019, 11(17), 4598, 2019 [Disponibile al link: https://doi.org/10.3390/su11174598]
Organizzazione delle Nazioni Unite (ONU), Trasformare il nostro mondo: l’Agenda 2030 per lo Sviluppo Sostenibile, A/RES/70/1, 21 ottobre 2015 [Disponibile al link: https://unric.org/it/wp-content/uploads/sites/3/2019/11/Agenda-2030-Onu-italia.pdf]
Presidenza del Consiglio dei Ministri, Il Commissario Straordinario del Governo ai fini della ricostruzione nei territori interessati dagli eventi sismici verificatesi a far data dal 24 Agosto 2016, Ordinanza n. 109 del 23 dicembre 2020. Approvazione elenco unico dei programmi delle opere pubbliche nonché disposizioni organizzative e definizione delle procedure di semplificazione e accelerazione della ricostruzione pubblica, 23 dicembre 2020 [Disponibile al link: https://sisma2016.gov.it/wp-content/uploads/2020/12/109_ORDINANZA_OPERE-PUBBLICHE_DEFINITIVA_signed.pdf]
LS0tCnRpdGxlOiAiQ0lUSTRHUkVFTiIKYXV0aG9yOiAiQWdlbmRhIDIwMzAgJiBzdXN0YWluYWJsZSBkZXZlbG9wbWVudCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBlcnJvciA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKa25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBub3JtYWxpemVQYXRoKCIvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0iKSkKYGBgCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZ2RhbCkKbGlicmFyeSh0bWFwKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShzZikKbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkocmdlb3MpCmxpYnJhcnkoZ2dtYXApCmxpYnJhcnkoRFQpCmxpYnJhcnkoZGV2dG9vbHMpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoc3ApCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShodG1sdG9vbHMpCmxpYnJhcnkobGVhZmxlZ2VuZCkKYGBgCgojIElsIGNvbnRyaWJ1dG8gZGVnbGkgaW50ZXJ2ZW50aSBkaSByaWNvc3RydXppb25lIGUgcmlwcmlzdGlubyBuZWxsZSBSZWdpb25pIGl0YWxpYW5lIGNvbHBpdGUgZGFsIHNpc21hIGRlbCAyMDE2LTIwMTcgYWdsaSBPYmlldHRpdmkgZGkgU3ZpbHVwcG8gU29zdGVuaWJpbGUgZGVsbOKAmUFnZW5kYSAyMDMwIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9CgombmJzcDsgIAoKKipMYXVyYSBDYXZhbGxpKiogKEZvbmRhemlvbmUgRW5pIEVucmljbyBNYXR0ZWkpLCAqKkZlcm5hbmRvIE5hcmRpKiogKEZvbmRhemlvbmUgRW5pIEVucmljbyBNYXR0ZWkpLCAqKk1pYSBBbGliZWdvdmljKiogKEZvbmRhemlvbmUgRW5pIEVucmljbyBNYXR0ZWkpLCAqKkRhdmlkZSBWYWNjYXJpKiogKEZvbmRhemlvbmUgRW5pIEVucmljbyBNYXR0ZWkpLCAqKkFuZHJlYSBTcGFzaWFubyoqIChXQVJSRURPQykuCgombmJzcDsgIAoKIVtdKC9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL1NjaGVybWF0YSAyMDIyLTA1LTMwIGFsbGUgMjMuMjYuMjAucG5nKSAhW10oL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vY2l0aS5wbmcpICFbXSgvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0vQ0lUSTRHUkVFTi9TY2hlcm1hdGEgMjAyMS0xMS0zMCBhbGxlIDAwLjE2LjI5LnBuZykKCiZuYnNwOyAgCgoqTGEgc2VndWVudGUgw6ggdW5hIHBpYXR0YWZvcm1hIG9ubGluZSBwZXIgaWwgUHJvZ2V0dG8gQ0lUSTRHUkVFTiBjaGUgaGEgbG8gc2NvcG8gZGkgYXBwcm9mb25kaXJlLCBhIGxpdmVsbG8gQ29tdW5hbGUsIGkgcmlzdWx0YXRpIHB1YmJsaWNhdGkgbmVsIFBvbGljeSBCcmllZiBkaXNwb25pYmlsZSBzdWwgc2l0byBkZWxsYSBGb25kYXppb25lLiogICAgCgoqSWwgcHJvZ2V0dG8gQ0lUSTRHUkVFTiBoYSByaWNldnV0byBmaW5hbnppYW1lbnRpIGRhbGwnVW5pb25lIEV1cm9wZWEgKEdyYW50IEFncmVlbWVudCBuLiAyMDIwQ0UxNkJBVDEyNSkuIFF1ZXN0byBwYXBlciByaWZsZXR0ZSB1bmljYW1lbnRlIGxhIHBvc2l6aW9uZSBkZWdsaSBhdXRvcmkuIExhIENvbW1pc3Npb25lIEV1cm9wZWEgbm9uIMOoIHJlc3BvbnNhYmlsZSBwZXIgcXVhbHVucXVlIHV0aWxpenpvIHBvc3NhIGVzc2VyZSBmYXR0byBkZWxsZSBpbmZvcm1hemlvbmkgcXVpIGNvbnRlbnV0ZS4qIAoKIyBBYnN0cmFjdAoKTmVsbOKAmWFtYml0byBkZWwgcHJvZ2V0dG8gQ0lUSTRHUkVFTiwgaWwgcHJlc2VudGUgZG9jdW1lbnRvIGludGVuZGUgaW52ZXN0aWdhcmUgbOKAmWltcGF0dG8gY2hlIGdsaSBpbnRlcnZlbnRpIGRpIHJpY29zdHJ1emlvbmUsIHJpcGFyYXppb25lIGUgcmlwcmlzdGlubyBkZWxsZSBvcGVyZSBwdWJibGljaGUgbmVpIHRlcnJpdG9yaSBkZWxsZSBSZWdpb25pIEFicnV6em8sIExhemlvLCBNYXJjaGUgZWQgVW1icmlhIGludGVyZXNzYXRpIGRhZ2xpIGV2ZW50aSBzaXNtaWNpIHZlcmlmaWNhdGlzaSB0cmEgaWwgMjAxNiBlIGlsIDIwMTcsIGhhbm5vIHN1bGzigJlBZ2VuZGEgMjAzMC4gQXR0cmF2ZXJzbyBs4oCZYXBwbGljYXppb25lIGRpIHVuYSBtZXRvZG9sb2dpYSBzdmlsdXBwYXRhIGRhIEZvbmRhemlvbmUgRW5pIEVucmljbyBNYXR0ZWkgKEZFRU0pIG5lbCBjb250ZXN0byBkZWxsYSBQb2xpdGljYSBkaSBDb2VzaW9uZSwgdmVuZ29ubyBhbmFsaXp6YXRlIGxlIGludGVyY29ubmVzc2lvbmkgdHJhIGkgc2luZ29saSB0YXJnZXQgZGVsbOKAmUFnZW5kYSAyMDMwIGUgZ2xpIGludGVydmVudGkgZGVsIHByb2dldHRvIFJlU1RBUlQg4oCcUmVzaWxpZW56YSBUZXJyaXRvcmlhbGUgQXBwZW5uaW5vIENlbnRyYWxlIFJpY29zdHJ1emlvbmUgVGVycmVtb3Rv4oCdIHBlciBjb21wcmVuZGVyZSBhIGZvbmRvIHF1YW50byBsZSBhemlvbmkgZGkgcmljb3N0cnV6aW9uZSBzdGlhbm8gZmFjaWxpdGFuZG8gaWwgcmFnZ2l1bmdpbWVudG8gZGVpIHRhcmdldCBkaSBzb3N0ZW5pYmlsaXTDoCBwcmVzZW50aSBuZWxs4oCZQWdlbmRhIGludGVybmF6aW9uYWxlLgoKCiMgMS4gSW50cm9kdXppb25lCgpUcmEgaWwgMjAxNiBlIGlsIDIwMTcgdW4gdGVycml0b3JpbyBjb21wcmVzbyB0cmEgbGUgcmVnaW9uaSBNYXJjaGUsIFVtYnJpYSwgQWJydXp6byBlIExhemlvLCBzdSBjdWkgc29yZ29ubyAxMzggY29tdW5pIGUgaW4gY3VpIHJpc2llZG9ubyBjaXJjYSA1NzUgbWlsYSBhYml0YW50aSwgw6ggc3RhdG8gZHVyYW1lbnRlIGNvbHBpdG8gZGEgdGVycmVtb3RpIGNoZSBoYW5ubyBkZXZhc3RhdG8gaSBzaW5nb2xpIHRlcnJpdG9yaSBjYXVzYW5kbyBtb3J0aSwgZWRpZmljaSBkaXN0cnV0dGksIGUgZ3Jvc3NpIGRhbm5pIGVjb25vbWljaS4gRGFsIDIwMTcsIGzigJlBdXRvcml0w6AgZGkgQmFjaW5vIERpc3RyZXR0dWFsZSBkZWxs4oCZQXBwZW5uaW5vIENlbnRyYWxlIGhhIGludGVuc2lmaWNhdG8gaWwgbGF2b3JvIGNvbiBsZSBSZWdpb25pIGludGVyZXNzYXRlIGRhbCBzaXNtYSBhdnZpYW5kbyBuZWxs4oCZYXV0dW5ubyBkZWwgMjAxOCBpbCAqKnByb2dldHRvIFJlU1RBUlQqKiDigJwqUmVzaWxpZW56YSBUZXJyaXRvcmlhbGUgQXBwZW5uaW5vIENlbnRyYWxlIFJpY29zdHJ1emlvbmUgVGVycmVtb3RvKuKAnSBzb3N0ZW51dG8gZmluYW56aWFyaWFtZW50ZSBkYWxsYSBQb2xpdGljYSBkaSBDb2VzaW9uZSAyMDE0LTIwMjAsIGNoZSBwcm9nZXR0YSwgcmVhbGl6emEgZSBwcm9tdW92ZSBpbnRlcnZlbnRpIGRpIG1pdGlnYXppb25lIGRlbGxlIHJpc29yc2UgZSBkZWkgcmlzY2hpIHRlcnJpdG9yaWFsaSBlIGRlbGxlIGFjcXVlIHZlcmRpLWF6enVycmUgcGVyIGZhdm9yaXJlIGxhIHJpbmFzY2l0YSBkZWxsJ2Vjb25vbWlhIGUgbGEgY29lc2lvbmUgc29jaWFsZSBlIHBlciBldml0YXJlIGwnYWJiYW5kb25vIGRpIGFyZWUgbWFyZ2luYWxpLCByZW1vdGUgZSBtb250dW9zZSBjb2xwaXRlIGRhaSB0ZXJyZW1vdGkuICAKCk5lbCAyMDIwLCBuYXNjZSBpbCBwcm9nZXR0byAqKkNJVEk0R1JFRU4qKiwgZmluYW56aWF0byBuZWxs4oCZYW1iaXRvIGRpIEVVIERHIFJFR0lPTiBDb2hlc2lvbiBQb2xpY3kgMjAyMC4gRXNzbyB2dW9sZSByYWNjb2dsaWVyZSBpIGRhdGkgZSBnbGkgZXNpdGkgZGVsIHByb2dldHRvIFJlU1RBUlQgZGVsbOKAmUF1dG9yaXTDoCBkaSBCYWNpbm8gRGlzdHJldHR1YWxlIGRlbGzigJlBcHBlbm5pbm8gQ2VudHJhbGUsIGltcGVnbmFuZG8gaSBjaXR0YWRpbmkgcGVyIHVuYSBtaWdsaW9yZSBjb21wcmVuc2lvbmUgZSBjby12YWx1dGF6aW9uZSBpbiBwcmltaXMgZGVsbGEgc29zdGVuaWJpbGl0w6AgZSBkZWxsZSBtaXN1cmUgZ3JlZW4gZSBibHVlIGF0dHVhdGUgcGVyIGxhIHByb3RlemlvbmUgc29jaWFsZSBlZCBlY29ub21pY2EsIGxhIGNvZXNpb25lIGUgbG8gc3ZpbHVwcG8gZGVsbGUgYXJlZSBkZWwgQ2VudHJvIEl0YWxpYSBjb2xwaXRlIGRhbCBzaXNtYS4gU3BlY2lmaWNhdGFtZW50ZSwgcGVyIGNvLXZhbHV0YXppb25lIHNpIGludGVuZGUgbOKAmWluc2llbWUgZGkgYXppb25pIGUgc2ZvcnppIGNvb3JkaW5hdGkgZSBjb25naXVudGkgZGkgcmljZXJjYXRvcmksIHN0YWtlaG9sZGVyIGUgY2l0aXplbiBmaW5hbGl6emF0aSBhbGxhIGNvbnNhcGV2b2xlenphIGNvbmRpdmlzYSBkZWkgbW9sdGVwbGljaSBiZW5lZmljaSBkaSBhemlvbmkgaXNwaXJhdGUgYSBwcmluY2lwaSBkZWxsYSBncmVlbiBlY29ub215IGUgZGVsbGEgc29zdGVuaWJpbGl0w6AgYW1iaWVudGFsZSBwZXIgZmF2b3JpcmUgbGEgcmVzaWxpZW56YSBjbGltYXRpY2EgZSBsYSBwcm90ZXppb25lIGFtYmllbnRhbGUsIHNvY2lhbGUgZWQgZWNvbm9taWNhLiAKCgpgYGB7ciwgcmVzdWx0cz0naGlkZSd9Cml0YWx5IDwtIHJlYWRPR1IoZHNuID0gJy9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL2dhZG0zNl9JVEFfc2hwJywgbGF5ZXIgPSAiZ2FkbTM2X0lUQV8zIikKYGBgCgoKYGBge3IsIHJlc3VsdHM9J2hpZGUnfQp0bV9zaGFwZShpdGFseSkgKwogIHRtX2ZpbGwoKSArCiAgdG1fYm9yZGVycygpIApgYGAKCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KdW5pcXVlKGl0YWx5JE5BTUVfMSkKYGBgCgpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CkFicnV6em8gPC0gc3Vic2V0KGl0YWx5LCBpdGFseSROQU1FXzE9PSdBYnJ1enpvJykKCnRtX3NoYXBlKEFicnV6em8pICsKICB0bV9maWxsKCkgKwogIHRtX2JvcmRlcnMoKSAKYGBgCgpgYGB7ciwgcmVzdWx0cz0naGlkZSd9ClVtYnJpYSA8LSBzdWJzZXQoaXRhbHksIGl0YWx5JE5BTUVfMT09J1VtYnJpYScpCgp0bV9zaGFwZShVbWJyaWEpICsKICB0bV9maWxsKCkgKwogIHRtX2JvcmRlcnMoKSAKYGBgCgpgYGB7ciwgcmVzdWx0cz0naGlkZSd9Ck1hcmNoZSA8LSBzdWJzZXQoaXRhbHksIGl0YWx5JE5BTUVfMT09J01hcmNoZScpCgp0bV9zaGFwZShNYXJjaGUpICsKICB0bV9maWxsKCkgKwogIHRtX2JvcmRlcnMoKSAKYGBgCgpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CkxhemlvIDwtIHN1YnNldChpdGFseSwgaXRhbHkkTkFNRV8xPT0nTGF6aW8nKQoKdG1fc2hhcGUoTGF6aW8pICsKICB0bV9maWxsKCkgKwogIHRtX2JvcmRlcnMoKSAKYGBgCgpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CnF1YXR0cm8gPC0gc3Vic2V0KGl0YWx5LCBpdGFseSROQU1FXzE9PSdMYXppbycgfCBpdGFseSROQU1FXzE9PSdVbWJyaWEnfGl0YWx5JE5BTUVfMT09J0FicnV6em8nfGl0YWx5JE5BTUVfMT09J01hcmNoZScpCgp0bV9zaGFwZShWYWxmb3JuYWNlKSArCiAgdG1fZmlsbCgpICsKICB0bV9ib3JkZXJzKCkgCmBgYAoKCiMjIEFuYWxpc2kgZGVnbGkgaW52ZXN0aW1lbnRpIGUgZGVnbGkgaW1wYXR0aSBzdWxsZSBxdWF0dHJvIHJlZ2lvbmkgY29pbnZvbHRlCkNJVEk0R1JFRU4gYW5hbGl6emEgbCdpbXBhdHRvIGRpIDEyNzggaW52ZXN0aW1lbnRpLCBjb2xsb2NhdGkgdHJhIGxlIHJlZ2lvbmkgQWJydXp6bywgTGF6aW8sIE1hcmNoZSwgVW1icmlhLCBzdWxsJ0FnZW5kYSAyMDMwLiBTaSB0cmF0dGEgZGkgaW52ZXN0aW1lbnRpIGNvbnRlbnV0aSBhbGwnaW50ZXJubyBkaSBPcmRpbmFuemUgcGVyIGxhIHJpY29zdHJ1emlvbmUgZGVpIGJlbmkgY29scGl0aSBkYWwgc2lzbWEuIEluIHRvdGFsZSwgc2kgcGFybGEgZGkgMSw2MTgsNTkxLDM3OC44OOKCrCBkaSBpbnZlc3RpbWVudGksIGRpc3RyaWJ1aXRpIGluIDI1OSBjb211bmkuICAKCkxhIHJpcGFydGl6aW9uZSBkZWxsZSByaXNvcnNlIGZpbmFuemlhcmUgdHJhIGkgQ29tdW5pIMOoIG1vc3RyYXRhIG5lbGxhIHNlZ3VlbnRlICoqTWFwcGEgSW50ZXJhdHRpdmEqKi4gIAoKw4ggcG9zc2liaWxlIHpvb21tYXJlIGUgY2xpY2NhcmUgc3Ugb2duaSBzaW5nb2xvIENvbXVuZSBjb3PDrCBkYSBvdHRlcmUgbCdpbmZvcm1hemlvbmUgZGV0dGFnbGlhdGEgZGVnbGkgaW52ZXN0aW1lbnRpIHBlciBDb211bmUuCgoKYGBge3IsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFfQpkZiA8LSByZWFkX2NzdignL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vbWF0cmljZV9wcm9kb3R0byAtIG1hdHJpY2VfcHJvZG90dG8gc29sbyBHb2Fscy5jc3YnKQpgYGAKCmBgYHtyfQojIEZpeGluZyBuYW1lcwpkZiRDb211bmUgPC0gZ3N1YigiQ2FtcG9yb3RvbmRvIERpIEZpYXN0ciIsICJDYW1wb3JvdG9uZG8gRGkgRmlhc3Ryb25lIiwgZGYkQ29tdW5lKQpkZiRDb211bmUgPC0gZ3N1YigiQ2FtcG9yb3RvbmRvIERpIEZpYXN0cm9uZW9uZSIsICJDYW1wb3JvdG9uZG8gRGkgRmlhc3Ryb25lIiwgZGYkQ29tdW5lKQpkZiRDb211bmUgPC0gZ3N1YigiU2FuIFZhbGVudGlubyBJbiBBYnJ1enpvIENpdCIsICJTYW4gVmFsZW50aW5vIEluIEFicnV6em8gQ2l0ZXJpb3JlIiwgZGYkQ29tdW5lKQoKaW52ZXN0aW1lbnRpJENvbXVuZSA8LSBzdHJfcmVwbGFjZV9hbGwoaW52ZXN0aW1lbnRpJENvbXVuZSwgIicgIiwgIiciKQpgYGAKCmBgYHtyfQpxdWF0dHJvJE5BTUVfMyA8LSBzdHJfcmVwbGFjZV9hbGwocXVhdHRybyROQU1FXzMsICInICIsICInIikKcXVhdHRybyROQU1FXzMgPC0gZ3N1YigiQ2VycmV0byBkJ0VzaSIsICJDZXJyZXRvIEQnRXNpIiwgcXVhdHRybyROQU1FXzMpCnF1YXR0cm8kTkFNRV8zIDwtIGdzdWIoIkZyYW5jYXZpbGxhIGQnRXRlIiwgIkZyYW5jYXZpbGxhIEQnRXRlIiwgcXVhdHRybyROQU1FXzMpCnF1YXR0cm8kTkFNRV8zIDwtIGdzdWIoIlNhbnQnRWdpZGlvIGFsbGEgVmlicmF0YSIsICJTYW50J0VnaWRpbyBBbGxhIFZpYnJhdGEiLCBxdWF0dHJvJE5BTUVfMykKcXVhdHRybyROQU1FXzMgPC0gZ3N1YigiU2VycmEgZGUnQ29udGkiLCAiU2VycmEgRGUnIENvbnRpIiwgcXVhdHRybyROQU1FXzMpCnF1YXR0cm8kTkFNRV8zIDwtIGdzdWIoIkNpdHTDoCBkaSBDYXN0ZWxsbyIsICJDaXR0w6AgRGkgQ2FzdGVsbG8iLCBxdWF0dHJvJE5BTUVfMykKcXVhdHRybyROQU1FXzMgPC0gZ3N1YigiR2lhbm8gZGVsbCdVbWJyaWEiLCAiR2lhbm8gRGVsbCdVbWJyaWEiLCBxdWF0dHJvJE5BTUVfMykKcXVhdHRybyROQU1FXzMgPC0gZ3N1YigiSXNvbGEgZGVsIEdyYW4gU2Fzc28gZCdJdGFsaWEiLCAiSXNvbGEgRGVsIEdyYW4gU2Fzc28gRCdJdGFsaWEiLCBxdWF0dHJvJE5BTUVfMykKcXVhdHRybyROQU1FXzMgPC0gZ3N1YigiU2FudCdBbmF0b2xpYSBkaSBOYXJjbyIsICJTYW50J0FuYXRvbGlhIERpIE5hcmNvIiwgcXVhdHRybyROQU1FXzMpCnF1YXR0cm8kTkFNRV8zIDwtIGdzdWIoIlNhbnQnQW5nZWxvIGluIFBvbnRhbm8iLCAiU2FudCdBbmdlbG8gSW4gUG9udGFubyIsIHF1YXR0cm8kTkFNRV8zKQpxdWF0dHJvJE5BTUVfMyA8LSBnc3ViKCJTYW50J0VscGlkaW8gYSBNYXJlIiwgIlNhbnQnRWxwaWRpbyBBIE1hcmUiLCBxdWF0dHJvJE5BTUVfMykKcXVhdHRybyROQU1FXzMgPC0gZ3N1YigiVG9ycmUgRGUnUGFzc2VyaSIsICJUb3JyZSBEZScgUGFzc2VyaSIsIHF1YXR0cm8kTkFNRV8zKQpgYGAKCgpgYGB7cn0KZGYkSW1wb3J0b19wcm9ncmFtbWF0byA8LSBwYXJzZV9udW1iZXIoZGYkSW1wb3J0b19wcm9ncmFtbWF0bykKZGYkQWdlbmRhXzIwMzBfYXZnIDwtIHBhcnNlX251bWJlcihkZiRBZ2VuZGFfMjAzMF9hdmcpCmRmJEdvYWxfMSA8LSBwYXJzZV9udW1iZXIoZGYkR29hbF8xKQpkZiRHb2FsXzIgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMikKZGYkR29hbF8zIDwtIHBhcnNlX251bWJlcihkZiRHb2FsXzMpCmRmJEdvYWxfNCA8LSBwYXJzZV9udW1iZXIoZGYkR29hbF80KQpkZiRHb2FsXzUgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfNSkKZGYkR29hbF82IDwtIHBhcnNlX251bWJlcihkZiRHb2FsXzYpCmRmJEdvYWxfNyA8LSBwYXJzZV9udW1iZXIoZGYkR29hbF83KQpkZiRHb2FsXzggPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfOCkKZGYkR29hbF85IDwtIHBhcnNlX251bWJlcihkZiRHb2FsXzkpCmRmJEdvYWxfMTAgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTApCmRmJEdvYWxfMTEgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTEpCmRmJEdvYWxfMTIgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTIpCmRmJEdvYWxfMTMgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTMpCmRmJEdvYWxfMTQgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTQpCmRmJEdvYWxfMTUgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTUpCmRmJEdvYWxfMTYgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTYpCmRmJEdvYWxfMTcgPC0gcGFyc2VfbnVtYmVyKGRmJEdvYWxfMTcpCmBgYAoKYGBge3J9CmludmVzdGltZW50aSA8LSBkZiAlPiUKICBkcGx5cjo6c2VsZWN0KENvbXVuZSxHb2FsXzEsR29hbF8yLEdvYWxfMyxHb2FsXzQsR29hbF81LEdvYWxfNixHb2FsXzcsR29hbF84LEdvYWxfOSxHb2FsXzEwLEdvYWxfMTEsR29hbF8xMixHb2FsXzEzLEdvYWxfMTQsR29hbF8xNSxHb2FsXzE2LCBHb2FsXzE3LCBJbXBvcnRvX3Byb2dyYW1tYXRvLCBBZ2VuZGFfMjAzMF9hdmcsIEFnZW5kYV8yMDMwKQoKaW52ZXN0aW1lbnRpJEdvYWxfMV9zY2FsYXRvIDwtIGRmJEltcG9ydG9fcHJvZ3JhbW1hdG8qZGYkR29hbF8xLzEwMAppbnZlc3RpbWVudGkkR29hbF8yX3NjYWxhdG8gPC0gZGYkSW1wb3J0b19wcm9ncmFtbWF0bypkZiRHb2FsXzIvMTAwCmludmVzdGltZW50aSRHb2FsXzNfc2NhbGF0byA8LSBkZiRJbXBvcnRvX3Byb2dyYW1tYXRvKmRmJEdvYWxfMy8xMDAKaW52ZXN0aW1lbnRpJEdvYWxfNF9zY2FsYXRvIDwtIGRmJEltcG9ydG9fcHJvZ3JhbW1hdG8qZGYkR29hbF80LzEwMAppbnZlc3RpbWVudGkkR29hbF81X3NjYWxhdG8gPC0gZGYkSW1wb3J0b19wcm9ncmFtbWF0bypkZiRHb2FsXzUvMTAwCmludmVzdGltZW50aSRHb2FsXzZfc2NhbGF0byA8LSBkZiRJbXBvcnRvX3Byb2dyYW1tYXRvKmRmJEdvYWxfNi8xMDAKaW52ZXN0aW1lbnRpJEdvYWxfN19zY2FsYXRvIDwtIGRmJEltcG9ydG9fcHJvZ3JhbW1hdG8qZGYkR29hbF83LzEwMAppbnZlc3RpbWVudGkkR29hbF84X3NjYWxhdG8gPC0gZGYkSW1wb3J0b19wcm9ncmFtbWF0bypkZiRHb2FsXzgvMTAwCmludmVzdGltZW50aSRHb2FsXzlfc2NhbGF0byA8LSBkZiRJbXBvcnRvX3Byb2dyYW1tYXRvKmRmJEdvYWxfOS8xMDAKaW52ZXN0aW1lbnRpJEdvYWxfMTBfc2NhbGF0byA8LSBkZiRJbXBvcnRvX3Byb2dyYW1tYXRvKmRmJEdvYWxfMTAvMTAwCmludmVzdGltZW50aSRHb2FsXzExX3NjYWxhdG8gPC0gZGYkSW1wb3J0b19wcm9ncmFtbWF0bypkZiRHb2FsXzExLzEwMAppbnZlc3RpbWVudGkkR29hbF8xMl9zY2FsYXRvIDwtIGRmJEltcG9ydG9fcHJvZ3JhbW1hdG8qZGYkR29hbF8xMi8xMDAKaW52ZXN0aW1lbnRpJEdvYWxfMTNfc2NhbGF0byA8LSBkZiRJbXBvcnRvX3Byb2dyYW1tYXRvKmRmJEdvYWxfMTMvMTAwCmludmVzdGltZW50aSRHb2FsXzE0X3NjYWxhdG8gPC0gZGYkSW1wb3J0b19wcm9ncmFtbWF0bypkZiRHb2FsXzE0LzEwMAppbnZlc3RpbWVudGkkR29hbF8xNV9zY2FsYXRvIDwtIGRmJEltcG9ydG9fcHJvZ3JhbW1hdG8qZGYkR29hbF8xNS8xMDAKaW52ZXN0aW1lbnRpJEdvYWxfMTZfc2NhbGF0byA8LSBkZiRJbXBvcnRvX3Byb2dyYW1tYXRvKmRmJEdvYWxfMTYvMTAwCmludmVzdGltZW50aSRHb2FsXzE3X3NjYWxhdG8gPC0gZGYkSW1wb3J0b19wcm9ncmFtbWF0bypkZiRHb2FsXzE3LzEwMAoKaW52ZXN0aW1lbnRpIDwtIGludmVzdGltZW50aSAlPiUKICBncm91cF9ieShDb211bmUpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoYEludmVzdGltZW50byBUb3RhbGVgID0gc3VtKGBJbXBvcnRvX3Byb2dyYW1tYXRvYCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYEltcGF0dG8gTWVkaW8gQWdlbmRhIDIwMzBgID0gbWVhbihgQWdlbmRhXzIwMzBfYXZnYCksCiAgICAgICAgICAgIGBJbXBhdHRvIFRvdGFsZSBBZ2VuZGEgMjAzMGAgPSBzdW0oYEFnZW5kYV8yMDMwYCksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMWAgPSBzdW0oR29hbF8xX3NjYWxhdG8pLAogICAgICAgICAgICBgSW1wYXR0byBHb2FsIDJgID0gc3VtKEdvYWxfMl9zY2FsYXRvKSwKICAgICAgICAgICAgYEltcGF0dG8gR29hbCAzYCA9IHN1bShHb2FsXzNfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgNGAgPSBzdW0oR29hbF80X3NjYWxhdG8pLAogICAgICAgICAgICBgSW1wYXR0byBHb2FsIDVgID0gc3VtKEdvYWxfNV9zY2FsYXRvKSwKICAgICAgICAgICAgYEltcGF0dG8gR29hbCA2YCA9IHN1bShHb2FsXzZfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgN2AgPSBzdW0oR29hbF83X3NjYWxhdG8pLAogICAgICAgICAgICBgSW1wYXR0byBHb2FsIDhgID0gc3VtKEdvYWxfOF9zY2FsYXRvKSwKICAgICAgICAgICAgYEltcGF0dG8gR29hbCA5YCA9IHN1bShHb2FsXzlfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTBgID0gc3VtKEdvYWxfMTBfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTFgID0gc3VtKEdvYWxfMTFfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTJgID0gc3VtKEdvYWxfMTJfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTNgID0gc3VtKEdvYWxfMTNfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTRgID0gc3VtKEdvYWxfMTRfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTVgID0gc3VtKEdvYWxfMTVfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTZgID0gc3VtKEdvYWxfMTZfc2NhbGF0byksCiAgICAgICAgICAgIGBJbXBhdHRvIEdvYWwgMTdgID0gc3VtKEdvYWxfMTdfc2NhbGF0bykpICMlPiUKICAjbXV0YXRlKG5ld19uYW1lID0gaWZlbHNlKGBJbnZlc3RpbWVudG8gVG90YWxlYCA+IDYwMDAwMDAwLCBhcy5jaGFyYWN0ZXIoQ29tdW5lKSwgIiIpKQoKaW52ZXN0aW1lbnRpW2ludmVzdGltZW50aSA9PSAwXSA8LSBOQQpgYGAKCgpgYGB7cn0KdG90IDwtIGxpc3QoaW52ZXN0aW1lbnRpJENvbXVuZSkKbWFwcGluZSA8LSBsaXN0KG1hcHBhX3F1YXR0cm8kTkFNRV8zKQp0b3QgPC0gdG90W1sxXV0KbWFwcGluZSA8LSBtYXBwaW5lW1sxXV0KI21hcHBpbmUKI3RvdApzZXRkaWZmKHRvdCwgbWFwcGluZSkKYGBgCgpgYGB7cn0KZ3JlcChwYXR0ZXJuID0gIlZhbGZvcm5hY2UiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgdmFsdWUgPSBUUlVFKQpgYGAKCmBgYHtyfQojIFVuaXJlIEZpb3JkaW1vbnRlIGUgUGlldmVib3ZpZ2xpYW5hIGluIFZhbGZvcm5hY2UKbWFwcGFfcXVhdHRybyROQU1FXzNbODIzXQptYXBwYV9xdWF0dHJvJE5BTUVfM1s4NDNdCmBgYAoKYGBge3J9CkZpb3JkaW1vbnRlIDwtIHF1YXR0cm9bcXVhdHRyb0BkYXRhJE5BTUVfMyA9PSAiRmlvcmRpbW9udGUiLF0KUGlldmVib3ZpZ2xpYW5hIDwtIHF1YXR0cm9bcXVhdHRyb0BkYXRhJE5BTUVfMyA9PSAiUGlldmVib3ZpZ2xpYW5hIixdCgpWYWxmb3JuYWNlIDwtIGFnZ3JlZ2F0ZShyYmluZChGaW9yZGltb250ZSwgUGlldmVib3ZpZ2xpYW5hKSkKVmFsZm9ybmFjZSROQU1FXzMgPC0gIlZhbGZvcm5hY2UiCgpxdWF0dHJvIDwtIGJpbmQocXVhdHRybywgVmFsZm9ybmFjZSkKYGBgCgoKYGBge3J9CiMgRmFyZSBpIGNvbmZpbmkgcmVnaW9uYWxpCm1hcHBhX3F1YXR0cm8gPC0gIG1lcmdlKHF1YXR0cm8sIGludmVzdGltZW50aSwgYnkueCA9ICJOQU1FXzMiLCBieS55ID0gIkNvbXVuZSIsIGFsbC54ID0gVFJVRSwgZHVwbGljYXRlR2VvbXMgPSBUUlVFKQpgYGAKCmBgYHtyfQptYXBwYV9xdWF0dHJvIDwtIHN1YnNldChtYXBwYV9xdWF0dHJvLCAhaXMubmEobWFwcGFfcXVhdHRybyRgSW52ZXN0aW1lbnRvIFRvdGFsZWApKQpgYGAKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dCA8LSBpZmVsc2UoaXMubmEobWFwcGFfcXVhdHRybyRgSW52ZXN0aW1lbnRvIFRvdGFsZWApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVzc3VuIEludmVzdGltZW50byIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbnZlc3RpbWVudG8gVG90YWxlYC8xMDAwMDAwLCAyKSwgIiBtIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKYGBgCgpgYGB7cn0KbWFwcGFfcXVhdHRybyRwb3B1cHRleHQgPC0gYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW52ZXN0aW1lbnRvIFRvdGFsZWAvMTAwMDAwMCwgMiksICIgbSIpCmBgYAoKYGBge3IsIHJlc3VsdHM9J2hpZGUnLCBpbmNsdWRlPUZBTFNFfQpwYWwgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyMwOTg5NEQnKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW52ZXN0aW1lbnRvIFRvdGFsZWApKSwgCiAgZG9tYWluID0gaW52ZXN0aW1lbnRpJGBJbnZlc3RpbWVudG8gVG90YWxlYCkKCiNwYWxfbm9OQSA8LSBjb2xvck51bWVyaWMoCiAjIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyMwOTg5NEQnKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW52ZXN0aW1lbnRvIFRvdGFsZWApKSwgCiAgI2RvbWFpbiA9IGludmVzdGltZW50aSRgSW52ZXN0aW1lbnRvIFRvdGFsZWAsCiAgI25hLmNvbG9yID0gTkEKIykKYGBgCgpgYGB7cn0KbGVhZmxldChoZWlnaHQ9NzcwLCB3aWR0aD03NzApICU+JQogIHNldFZpZXcobG5nID0gMTIuOTk1ODM5LCBsYXQgPSA0Mi41NDk1NTAsIHpvb20gPSA4KSAlPiUKICAKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLkRhcmtNYXR0ZXJOb0xhYmVscykgJT4lCiAgCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1hcHBhX3F1YXR0cm8sIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICB3ZWlnaHQgPSAwLjUsIAogICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsCiAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwoYEludmVzdGltZW50byBUb3RhbGVgKSwKICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAicmVkIiwgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpbmdUb0Zyb250ID0gVFJVRSksCiAgICAgICAgICAgIHBvcHVwID0gfnBvcHVwdGV4dCAsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsLCAKICAgICAgICAgICAgdmFsdWVzID0gbWFwcGFfcXVhdHRybyRgSW52ZXN0aW1lbnRvIFRvdGFsZWAsCiAgICAgICAgICAgIHRpdGxlID0gIkludmVzdGltZW50byBUb3RhbGUiLAogICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChwcmVmaXggPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIgbWlsaW9uaSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCiMgMi4gTWV0b2RvbG9naWEKCkxhIG1ldG9kb2xvZ2lhIHV0aWxpenphdGEgcGVyIHF1ZXN0YSBhbmFsaXNpIGZhIHJpZmVyaW1lbnRvIGFsIG1ldG9kbyBzdmlsdXBwYXRvIGRhbGxhIEZvbmRhemlvbmUgRW5pIEVucmljbyBNYXR0ZWkgKEZFRU0pIGluIGNvbGxhYm9yYXppb25lIGNvbiBsYSBSZWdpb25lIEF1dG9ub21hIGRlbGxhIFNhcmRlZ25hIChSQVMpICgqQ2F2YWxsaSBldCBhbC4sIDIwMjAqKSwgZmluYWxpenphdG8gYWxsYSBjcmVhemlvbmUgZGkgdW4gbW9kZWxsbyBwZXIgaWwgbW9uaXRvcmFnZ2lvIGUgbGEgdmFsdXRhemlvbmUgZGVsbGEgc29zdGVuaWJpbGl0w6AgZGVsbGEgc3Blc2EgZGVpIFByb2dyYW1taSBPcGVyYXRpdmkgUmVnaW9uYWxpIChQT1IpIGNvZmluYW56aWF0aSBkYWxs4oCZVUUgbmVsbOKAmWFtYml0byBkZWxsYSBQb2xpdGljYSBkaSBDb2VzaW9uZSBpbiByaWZlcmltZW50byBhaSAxNyBPYmlldHRpdmkgZGkgU3ZpbHVwcG8gU29zdGVuaWJpbGUgZGVsbOKAmUFnZW5kYSAyMDMwLiAgIAoKTmVsbG8gc3BlY2lmaWNvLCBpbCBtb2RlbGxvIGltcGxlbWVudGF0byBzaSBwb25lIGzigJlvYmlldHRpdm8gZGkgaW5kYWdhcmUgbGUgaW50ZXJjb25uZXNzaW9uaSB0cmEgaSAxNjkgdGFyZ2V0IGRlbGzigJlBZ2VuZGEgMjAzMCBlIGkgc2V0dG9yaSBkaSBpbnRlcnZlbnRvIChJbnRlcnZlbnRpb24gZmllbGRzLCBJRnMpIHByb3Bvc3RpIGRhbGxhIENvbW1pc3Npb25lIGV1cm9wZWEgcGVyIGzigJlhdHR1YXppb25lIGRlaSBQcm9ncmFtbWkgMjAyMS0yMDI3IGRlaSBmb25kaSBTdHJ1dHR1cmFsaSBlIGRpIEludmVzdGltZW50byBFdXJvcGVpIChTSUUpLCBncmF6aWUgYWxsYSBjcmVhemlvbmUgZGkgZHVlIG1hdHJpY2kgcGVyIGFuYWxpenphcmUgZ2xpIGltcGF0dGksIGxlIGxvcm8gZW50aXTDoCBlZCBpbCBsb3JvIG9yaWVudGFtZW50bywgZSB1bmEgdGVyemEgbWF0cmljZSBwcm9kb3R0bywgYXR0YSBhIHJpbGV2YXJlIGlsIGNvbnRyaWJ1dG8gZmluYWxlIGRlaSBmb25kaSBhZ2xpIFNER3MuICAKCkFsIGZpbmUgZGkgbWlzdXJhcmUgbOKAmW9yaWVudGFtZW50byBkZWdsaSBpbnRlcnZlbnRpIHZlcnNvIGzigJlBZ2VuZGEgMjAzMCwgc29ubyBzdGF0ZSBjb3N0cnVpdGUgdW5hIHNlcmllIGRpIG1pc3VyZSBzaW50ZXRpY2hlIGluIGdyYWRvIGRpIGNvZ2xpZXJlIG5vbiBzb2xvIGzigJlpbXBhdHRvIGFnZ3JlZ2F0byBkaSBjaWFzY3VuIGludGVydmVudG8gc3VpIHNpbmdvbGkgdGFyZ2V0IGUgR29hbCBtYSBhbmNoZSBzdWxs4oCZaW50ZXJhIEFnZW5kYSAyMDMwLiBQcmltYSBkaSB0dXR0bywgcGVyIG9nbmkgaW50ZXJ2ZW50byDDqCBzdGF0YSBjYWxjb2xhdGEgbGEgcmlzcGV0dGl2YSBtZWRpYSBhcml0bWV0aWNhIGRlZ2xpIGltcGF0dGkgc3VpIHRhcmdldCBhcHBhcnRlbmVudGkgYWwgbWVkZXNpbW8gR29hbDsgZG9wb2RpY2jDqSwgc2kgw6ggcHJvY2VkdXRvIGFsIGNhbGNvbG8gZGVsbGEgc29tbWF0b3JpYSBkZWkgcmlzcGV0dGl2aSBpbXBhdHRpIHN1aSBHb2FsLCBkb3ZlIHRhbnRvIHBpw7kgYWx0byDDqCBxdWVzdG8gdmFsb3JlLCB0YW50byBwacO5IGzigJlpbnZlc3RpbWVudG8gaW4gdW4gY2FtcG8gZGkgaW50ZXJ2ZW50byDDqCBpZG9uZW8gYWxs4oCZQWdlbmRhLiAKRG9wbyBhdmVyIGNhbGNvbGF0byBpIGNvZWZmaWNpZW50aSBmaW5hbGksIHF1ZXN0aSBzb24gc3RhdGkgbW9sdGlwbGljYXRpIHBlciBsZSByaXNvcnNlIHByb2dyYW1tYXRlIHBlciBvZ25pIGludGVydmVudG8gY29zw6wgY29tZSBlc3BsaWNpdGF0ZSBuZWxs4oCZQWxsZWdhdG8gSSBkZWxs4oCZT3JkaW5hbnphIG4uIDEwOSBkZWwgMjMgZGljZW1icmUgMjAyMC4KCmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vTWV0b2RvbG9naWEucG5nIikKYGBgCgojIDMuIFJpc3VsdGF0aSBHZW5lcmFsaQogCkxhIHByZXNlbnRlIHNlemlvbmUgbW9zdHJhIGdsaSBlc2l0aSBkZWxs4oCZYXBwbGljYXppb25lIGRlbCBtb2RlbGxvIHNvcHJhY2l0YXRvICgqQ2F2YWxsaSBldCBhbC4sIDIwMjAqKSwgZ3VhcmRhbmRvIGluIHByaW1pcyBhaSByaXN1bHRhdGkgYWwgbmV0dG8gZGVnbGkgaW52ZXN0aW1lbnRpIGRlcml2YXRpIGRhbCBtb2RlbGxvIHN0ZXNzbyBlLCBpbiBzZWNvbmRvIGx1b2dvLCBhaSByaXN1bHRhdGkgZGVyaXZhdGkgZGFsbGEgbW9sdGlwbGljYXppb25lIGRlaSBjb2VmZmljaWVudGkgZmluYWxpIGNvbiBsZSByaXNvcnNlIHByb2dyYW1tYXRlLiAgCgpEYWxsYSBGaWd1cmEgMSBlbWVyZ2UgY2hpYXJhbWVudGUgY2hlIGdsaSBpbnRlcnZlbnRpIGRpIHJpY29zdHJ1emlvbmUsIHJpcGFyYXppb25lIGUgcmlwcmlzdGlubyBkZWxsZSBvcGVyZSBwdWJibGljaGUgbmVpIHRlcnJpdG9yaSBkZWxsZSBSZWdpb25pIEFicnV6em8sIExhemlvLCBNYXJjaGUgZWQgVW1icmlhIGNvbnRyaWJ1aXNjb25vIHBlciBsbyBwacO5IGFsIEdvYWwgMTEg4oCcKipDaXR0w6AgZSBjb211bml0w6Agc29zdGVuaWJpbGkqKuKAnS4gSWwgdGFyZ2V0IDExLjQg4oCcKlBvdGVuemlhcmUgZ2xpIHNmb3J6aSBwZXIgcHJvdGVnZ2VyZSBlIHNhbHZhZ3VhcmRhcmUgaWwgcGF0cmltb25pbyBjdWx0dXJhbGUgZSBuYXR1cmFsZSBkZWwgbW9uZG8q4oCdLCBpbmZhdHRpLCB2aWVuZSBpbXBhdHRhdG8gZGFsIDk3JSBkZWdsaSBpbnRlcnZlbnRpIHRvdGFsaS4gIAoKQWwgc2Vjb25kbyBwb3N0byBpbiB0ZXJtaW5pIGRpIGltcGF0dG8sIHRyb3ZpYW1vIGlsIEdvYWwgNCDigJwqKklzdHJ1emlvbmUgZGkgcXVhbGl0w6AqKuKAnSBncmF6aWUgYWkgMTk5IGludGVydmVudGkgc3VsbGUgU2N1b2xlIGNoZSB0cmFpbmFubyBsYSBsaXN0YSBjb24gdW4gcmFnZ2l1bmdpbWVudG8gbWVkaW8gZGVsIEdvYWwgNCBkZWwgNzQlIGFuZGFuZG8gYSB0b2NjYXJlIGxhIG1hZ2dpb3IgcGFydGUgZGVpIHJlbGF0aXZpIHRhcmdldC4gIAoKU2VndW9ubyBpIEdvYWwgMTMg4oCcKipBZ2lyZSBwZXIgaWwgY2xpbWEqKuKAnSBlIDYg4oCcKipBY3F1YSBwdWxpdGEgZSBpZ2llbmUqKuKAnSBjb24gdW5hIHJlYWxpenphemlvbmUgbWVkaWEgZGVsbOKAmTgsOTglIGUgZGVsIDcsOTElLiBFbnRyYW1iaSBzb3NwaW50aSBkYWxsYSBjYXRlZ29yaWEgZGVsIOKAnERpc3Nlc3RvIElkcm9nZW9sb2dpY28sIFJpc29yc2UgSWRyaWNoZeKAnSBjaGUgb3R0aWVuZSwgcmlzcGV0dGl2YW1lbnRlLCB1biByYWdnaXVuZ2ltZW50byBtZWRpbyBkZWwgMjAlIGUgZGVsIDYyJS4KCgpgYGB7ciwgb3V0LndpZHRoID0gIjQwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL25ldF9vZi5wbmciKQpgYGAKCkEgc2VndWlyZSwgbGEgRmlndXJhIDIgbW9zdHJhIGxhIG51b3ZhIGRpc3RyaWJ1emlvbmUgZGVnbGkgaW1wYXR0aSBzdWxs4oCZQWdlbmRhIDIwMzAgY2hlIGhhIHRlbnV0byBjb250byBpbiBxdWVzdG8gY2FzbyBkZWdsaSBpbXBvcnRpIHByb2dyYW1tYXRpIHBlciBjaWFzY3VuIGludGVydmVudG8uICAKCiAKTWVudHJlIGluIHRlcm1pbmkgYXNzb2x1dGkgaWwgR29hbCAxMSDigJwqKkNpdHTDoCBlIGNvbXVuaXTDoCBzb3N0ZW5pYmlsaSoq4oCdIMOoIHF1ZWxsbyBjb24gdW5hIHJlYWxpenphemlvbmUgbWVkaWEgcGnDuSBhbHRhLCB1bmEgdm9sdGEgY29uc2lkZXJhdGUgbGUgYWxsb2NhemlvbmkgZmluYW56aWFyaWUsIGlsIEdvYWwgcGnDuSBpbXBhdHRhdG8gZGl2ZW50YSBpbCBHb2FsIDQg4oCcKipJc3RydXppb25lIGRpIHF1YWxpdMOgKirigJ0uIFF1ZXN0byBwZXJjaMOpIGxlIFNjdW9sZSwgc3BpbnRhIHByaW5jaXBhbGUgZGVsIEdvYWwgNCwgc2kgYWdnaXVkaWNhbm8gaWwgMzEsNSUgZGVsbGUgcmlzb3JzZSBmaW5hbnppYXJpZSB0b3RhbGkgcHJldmlzdGUgZGFsbGUgT3JkaW5hbnplIHBlciBsYSByaWNvc3RydXppb25lLiBDb25zZWd1ZW50ZW1lbnRlLCBpbCBHb2FsIDQg4oCcSXN0cnV6aW9uZSBkaSBxdWFsaXTDoOKAnSBzaSBhZ2dpdWRpY2EgaWwgcHJpbW8gcG9zdG8gY29uIGlsIDIzLDklIGRlbCB0b3RhbGUgZGVnbGkgaW1wYXR0aSBzdWxs4oCZQWdlbmRhIDIwMzAuIElsIEdvYWwgMTEg4oCcQ2l0dMOgIGUgY29tdW5pdMOgIHNvc3RlbmliaWxp4oCdIHJpbWFuZSBjb211bnF1ZSBpbiBidW9uYSBwb3NpemlvbmUsIGFnZ2l1ZGljYW5kb3NpIGlsIHNlY29uZG8gcG9zdG8gY29uIGlsIDIwLDclIGRlZ2xpIGludmVzdGltZW50aSB0b3RhbGkuIFNlZ3Vvbm8gcG9pIGlsIEdvYWwgMTMg4oCcQWdpcmUgcGVyIGlsIGNsaW1h4oCdIGUgaWwgR29hbCA2IOKAnEFjcXVhIHB1bGl0YSBlIGlnaWVuZeKAnSwgdHJhaW5hdGkgZGFnbGkgaW52ZXN0aW1lbnRpIHBlciDigJxEaXNzZXN0byBJZHJvZ2VvbG9naWNvLCBSaXNvcnNlIElkcmljaGXigJ0sIGNvbiByaXNwZXR0aXZhbWVudGUgaWwgOSw2IGUgaWwgNiw5JSBkZWxsZSByaXNvcnNlIGZpbmFuemlhcmllIGNoZSBjb250cmlidWlzY29ubyBhbGzigJlBZ2VuZGEuCgpgYGB7ciwgb3V0LndpZHRoID0gIjQwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL2ludmVzdC5wbmciKQpgYGAKCgojIDQuIFZpc3VhbGl6emF6aW9uaSBkZWdsaSBpbXBhdHRpIGRpIG9nbmkgc2luZ29sbyBHb2FsCgpMZSBzZWd1ZW50aSBtYXBwZSBpbnRlcmF0dGl2ZSByaXBvcnRhbm8gZ2xpIGltcGF0dGkgZGVpIFBpYW5pIGRpIFJpY29zdHJ1emlvbmUgc3Ugb2dudWdubyBkZWkgMTcgU3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQgR29hbHMuICAKCsOIIHBvc3NpYmlsZSB6b29tbWFyZSBlIGNsaWNjYXJlIHN1IG9nbmkgc2luZ29sbyBDb211bmUgY29zw6wgZGEgb3R0ZXJlIGwnaW5mb3JtYXppb25lIGRldHRhZ2xpYXRhIGRlZ2xpIGludmVzdGltZW50aSBwZXJ0aW5lbnRpIGlsIEdvYWwgc2NlbHRvIHBlciBvZ25pIENvbXVuZS4KCiMjIEdvYWwgMQoKPGRpdiBzdHlsZT0gImZsb2F0OmxlZnQ7cG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDBweDsgcGFkZGluZy1yaWdodDogMzBweCI+CmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vc2RnMS5wbmciKQpgYGAKPC9kaXY+CgpMJ09iaWV0dGl2byBkaSBTdmlsdXBwbyBTb3N0ZW5pYmlsZSAxIChTREcgMSBvIE9iaWV0dGl2byBHbG9iYWxlIDEpLCB1bm8gZGVpIDE3IE9iaWV0dGl2aSBkaSBTdmlsdXBwbyBTb3N0ZW5pYmlsZSBzdGFiaWxpdGkgZGFsbGUgTmF6aW9uaSBVbml0ZSBuZWwgMjAxNSwgY2hpZWRlIGxhIGZpbmUgZGVsbGEgcG92ZXJ0w6AgaW4gdHV0dGUgbGUgc3VlIGZvcm1lLiBMYSBkaWNpdHVyYSB1ZmZpY2lhbGUgw6g6ICIqKk5vIFBvdmVydHkqKiIuIEkgcGFlc2kgbWVtYnJpIHNpIHNvbm8gaW1wZWduYXRpIGEgIk5vbiBsYXNjaWFyZSBpbmRpZXRybyBuZXNzdW5vIjogYWxsYSBiYXNlIGRlbGwnb2JpZXR0aXZvIGMnw6ggdW4gImZvcnRlIGltcGVnbm8gYSBub24gbGFzY2lhcmUgaW5kaWV0cm8gbmVzc3VubyBlIGEgcmFnZ2l1bmdlcmUgcGVyIHByaW1pIGNoaSDDqCBwacO5IGluZGlldHJvIi4gTCdTREcgMSBtaXJhIGEgc3JhZGljYXJlIG9nbmkgZm9ybWEgZGkgcG92ZXJ0w6AgZXN0cmVtYSwgY29tcHJlc2EgbGEgbWFuY2FuemEgZGkgY2libywgYWNxdWEgcG90YWJpbGUgZSBzZXJ2aXppIGlnaWVuaWNvLXNhbml0YXJpLiBJbCByYWdnaXVuZ2ltZW50byBkaSBxdWVzdG8gb2JpZXR0aXZvIGluY2x1ZGUgbGEgcmljZXJjYSBkaSBzb2x1emlvbmkgYWxsZSBudW92ZSBtaW5hY2NlIGNhdXNhdGUgZGFsIGNhbWJpYW1lbnRvIGNsaW1hdGljbyBlIGRhaSBjb25mbGl0dGkuIEwnU0RHIDEgc2kgY29uY2VudHJhIG5vbiBzb2xvIHN1bGxlIHBlcnNvbmUgY2hlIHZpdm9ubyBpbiBwb3ZlcnTDoCwgbWEgYW5jaGUgc3VpIHNlcnZpemkgc3UgY3VpIGxlIHBlcnNvbmUgZmFubm8gYWZmaWRhbWVudG8gZSBzdWxsZSBwb2xpdGljaGUgc29jaWFsaSBjaGUgcHJvbXVvdm9ubyBvIHByZXZlbmdvbm8gbGEgcG92ZXJ0w6AuICAKClVsdGVyaW9yaSBpbmZvcm1hemlvbmkgc3VsbCdTREcgMSBzaSBwb3Nzb25vIHRyb3ZhcmUgW2NsaWNjYW5kbyBxdWldKGh0dHBzOi8vc2Rncy51bi5vcmcvZ29hbHMvZ29hbDEpLgoKJm5ic3A7ICAKJm5ic3A7ICAKJm5ic3A7ICAKJm5ic3A7ICAKJm5ic3A7ICAKCioqTWFwcGEgSW50ZXJhdHRpdmEqKgoKYGBge3J9Cm1hcHBhX3F1YXR0cm8kcG9wdXB0ZXh0MSA8LSBpZmVsc2UoaXMubmEobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDFgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMWAgPiAxMDAwMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxYC8xMDAwMDAwLCAyKSwgIiBtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMWAvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsMSA8LSBjb2xvck51bWVyaWMoCiAgcGFsZXR0ZSA9IGNvbG9yUmFtcFBhbGV0dGUoYygnd2hpdGUnLCAnI0U0MUIyQycpKShsZW5ndGgoaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgMWApKSwgCiAgZG9tYWluID0gaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgMWApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMShgSW1wYXR0byBHb2FsIDFgKSwKICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAicmVkIiwgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpbmdUb0Zyb250ID0gVFJVRSksCiAgICAgICAgICAgIHBvcHVwID0gfnBvcHVwdGV4dDEsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMSwgCiAgICAgICAgICAgIHZhbHVlcyA9IG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxYCwKICAgICAgICAgICAgdGl0bGUgPSAiSW1wYXR0byBzdWwgR29hbCAxIiwKICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQocHJlZml4ID0gIiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiIG1pbGlvbmkgZGkg4oKsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24gKHgpIHgvMTAwMDAwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5sYWJlbCA9ICJOZXNzdW4gSW52ZXN0LiIpIAogICAKYGBgCgoqKkNvbW1lbnRvOioqICAKSWwgR29hbCAxIHJpY2V2ZSBpbCA2LjMxJSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDEwMiwyOTEsODM1Ljcw4oKsLiBEZWkgMjU5IENvbXVuaSBjb2ludm9sdGkgbmVpIFBpYW5pIGRpIFJpY29zdHJ1emlvbmUsIDE5MCwgaWwgNzMlIGRlbCB0b3RhbGUsIGludmVzdG9ubyBuZWwgR29hbCAxLiAgCgpJbCBHb2FsIDEgw6ggcHJpbmNpcGFsbWVudGUgaW1wYXR0YXRvLCBhbCBuZXR0byBkZWdsaSBpbnZlc3RpbWVudGksIGRhbGxlIFN0cnV0dHVyZSBTb2NpbyBTYW5pdGFyaWUsIG92dmVybyBnbGkgT3NwZWRhbGksIGdsaSBBbWJ1bGF0b3JpLCBsZSBjYXNlIGRpIHJpcG9zbyBlIGxlIGNhc2UgZmFtaWdsaWEuIFVuYSB2b2x0YSBjb25zaWRlcmF0aSBnbGkgaW52ZXN0aW1lbnRpLCBwZXLDsiwgc29ubyBsZSBTY3VvbGUgbGEgY2F0ZWdvcmlhIGEgaW1wYXR0YXJlIGRpIHBpw7kgY29uIDU1IG1pbGlvbmkgZGkgRXVybyBjb250cm8gaSAyOCBkZWxsZSBTdHJ1dHR1cmUgU2FuaXRhcmllLiBRdWVzdG8gcGVyY2jDqSwgYW5jaGUgc2UgbGUgU3RydXR0dXJlIFNvY2lvLVNhbml0YXJpZSBoYW5ubyB1biBpbXBhdHRvIG5ldHRvIG1hZ2dpb3JlIHN1bCBHb2FsIDEsIGJpc29nbmEgdGVuZXJlIGNvbnRvIGNoZSBsZSBzdHJ1dHR1cmUgYWRpYml0ZSBhbGwnaW5zZWduYW1lbnRvIHJpY2V2b25vIDUwOSBtaWxpb25pIGRlaSAxNjE4IG1lc3NpIGEgZGlzcG9zaXppb25lIGRhaSBQaWFuaSBkaSBSaWNvc3RydXppb25lLgoKX19fCgojIyBHb2FsIDIKCjxkaXYgc3R5bGU9ICJmbG9hdDpsZWZ0O3Bvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAwcHg7IHBhZGRpbmctcmlnaHQ6IDMwcHgiPgpgYGB7ciwgb3V0LndpZHRoID0gIjQwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL3NkZzIucG5nIikKYGBgCjwvZGl2PgoKTCdPYmlldHRpdm8gZGkgU3ZpbHVwcG8gU29zdGVuaWJpbGUgMiAoU0RHIDIpIG1pcmEgYSByYWdnaXVuZ2VyZSBsYSAiZmFtZSB6ZXJvIi4gTGEgZm9ybXVsYXppb25lIHVmZmljaWFsZSDDqDogIioqUG9ycmUgZmluZSBhbGxhIGZhbWUsIHJhZ2dpdW5nZXJlIGxhIHNpY3VyZXp6YSBhbGltZW50YXJlIGUgbWlnbGlvcmFyZSBsYSBudXRyaXppb25lIGUgcHJvbXVvdmVyZSBsJ2Fncmljb2x0dXJhIHNvc3RlbmliaWxlKioiLiBMJ1NERyAyIGV2aWRlbnppYSBsZSBjb21wbGVzc2UgaW50ZXJjb25uZXNzaW9uaSB0cmEgc2ljdXJlenphIGFsaW1lbnRhcmUsIG51dHJpemlvbmUsIHRyYXNmb3JtYXppb25lIHJ1cmFsZSBlIGFncmljb2x0dXJhIHNvc3RlbmliaWxlLiBTZWNvbmRvIGxlIE5hemlvbmkgVW5pdGUsIGNpIHNvbm8gY2lyY2EgNjkwIG1pbGlvbmkgZGkgcGVyc29uZSBjaGUgc29mZnJvbm8gbGEgZmFtZSwgcGFyaSBhbCAxMCUgZGVsbGEgcG9wb2xhemlvbmUgbW9uZGlhbGUuCgpMJ1NERyAyIGhhIG90dG8gdGFyZ2V0IGUgMTQgaW5kaWNhdG9yaSBwZXIgbWlzdXJhcmUgaSBwcm9ncmVzc2kuIEkgY2lucXVlICJvYmlldHRpdmkgZmluYWxpIiBzb25vOiBwb3JyZSBmaW5lIGFsbGEgZmFtZSBlIG1pZ2xpb3JhcmUgbCdhY2Nlc3NvIGFsIGNpYm87IHBvcnJlIGZpbmUgYSB0dXR0ZSBsZSBmb3JtZSBkaSBtYWxudXRyaXppb25lOyBwcm9kdXR0aXZpdMOgIGFncmljb2xhOyBzaXN0ZW1pIGRpIHByb2R1emlvbmUgYWxpbWVudGFyZSBzb3N0ZW5pYmlsaSBlIHByYXRpY2hlIGFncmljb2xlIHJlc2lsaWVudGk7IGUgbGEgZGl2ZXJzaXTDoCBnZW5ldGljYSBkZWkgc2VtaSwgZGVsbGUgcGlhbnRlIGNvbHRpdmF0ZSBlIGRlZ2xpIGFuaW1hbGkgZCdhbGxldmFtZW50byBlIGFkZG9tZXN0aWNhdGk7IGludmVzdGltZW50aSwgcmljZXJjYSBlIHRlY25vbG9naWEuIEkgdHJlICJtZXp6aSBwZXIgcmFnZ2l1bmdlcmUiIGdsaSBvYmlldHRpdmkgaW5jbHVkb25vOiBhZmZyb250YXJlIGxlIHJlc3RyaXppb25pIGNvbW1lcmNpYWxpIGUgbGUgZGlzdG9yc2lvbmkgbmVpIG1lcmNhdGkgYWdyaWNvbGkgbW9uZGlhbGkgZSBuZWkgbWVyY2F0aSBkZWkgcHJvZG90dGkgYWxpbWVudGFyaSBlIGRlaSBsb3JvIGRlcml2YXRpLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyAyIHNpIHBvc3Nvbm8gdHJvdmFyZSBbY2xpY2NhbmRvIHF1aV0oaHR0cHM6Ly9zZGdzLnVuLm9yZy9nb2Fscy9nb2FsMikuCgombmJzcDsgIAombmJzcDsgIAoKKipNYXBwYSBJbnRlcmF0dGl2YSoqCgpgYGB7cn0KbWFwcGFfcXVhdHRybyRwb3B1cHRleHQyIDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMmApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lc3N1biBJbnZlc3RpbWVudG8iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAyYCA+IDEwMDAwMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDJgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAyYC8xMDAwLCAyKSwgIiBtaWxhIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQpgYGAKCmBgYHtyfQpwYWwyIDwtIGNvbG9yTnVtZXJpYygKICBwYWxldHRlID0gY29sb3JSYW1wUGFsZXR0ZShjKCd3aGl0ZScsICcjQ0M5QjI4JykpKGxlbmd0aChpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAyYCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAyYCkKYGBgCgpgYGB7cn0KbGVhZmxldChoZWlnaHQ9NzcwLCB3aWR0aD03NzApICU+JQogIHNldFZpZXcobG5nID0gMTIuOTk1ODM5LCBsYXQgPSA0Mi41NDk1NTAsIHpvb20gPSA4KSAlPiUKICAKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLkRhcmtNYXR0ZXJOb0xhYmVscykgJT4lCiAgCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1hcHBhX3F1YXR0cm8sIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICB3ZWlnaHQgPSAwLjUsIAogICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsCiAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwyKGBJbXBhdHRvIEdvYWwgMmApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0MiAsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMiwgCiAgICAgICAgICAgIHZhbHVlcyA9IG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAyYCwKICAgICAgICAgICAgdGl0bGUgPSAiSW1wYXR0byBzdWwgR29hbCAyIiwKICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQocHJlZml4ID0gIiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiIG1pZ2xpYWlhIGRpIOKCrCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZ1bmN0aW9uICh4KSB4LzEwMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEubGFiZWwgPSAiTmVzc3VuIEludmVzdC4iKSAKICAgCmBgYAoKKipDb21tZW50bzoqKiAgCklsIEdvYWwgMiByaWNldmUgaWwgMC43MCUgZGVpIGZpbmFuemlhbWVudGkgcGVyIHVuIHRvdGFsZSBkaSAxMSwzMjgsMDYzLjg14oKsLiBEZWkgMjU5IENvbXVuaSBjb2ludm9sdGkgbmVpIFBpYW5pIGRpIFJpY29zdHJ1emlvbmUsIDEzNCwgIGlsIDUyJSBkZWwgdG90YWxlLCBpbnZlc3Rvbm8gbmVsIEdvYWwgMi4gIAoKSWwgR29hbCAyIMOoIHByaW5jaXBhbG1lbnRlIGltcGF0dGF0bywgc2lhIHF1YWxpdGF0aXZhbWVudGUgY2hlIHF1YW50aXRhdGl2YW1lbnRlLCBkYWxsZSBvcGVyZSByaWd1YXJkYW50aSBpbCBEaXNzZXN0byBJZHJvZ2VvbG9naWNvIGUgbGUgcmlzb3JzZSBpZHJpY2hlLiBHbGkgaW50ZXJ2ZW50aSBhbGwnaW50ZXJubyBkaSBxdWVzdGEgY2F0ZWdvcmlhLCBpbmZhdHRpLCBwZXJtZXR0b25vIGRpIHJpYXNzZXN0YXJlIGxlIGFyZWUgcmlzZXJ2YXRlIGFsbCdhZ3JpY29sdHVyYSBlIHJlbmRlcmxlIG1hZ2dpb3JtZW50ZSByZXNpbGllbnRpLiBJbm9sdHJlLCBsYSBncmFuZGUgbWFnZ2lvcmFuemEgZGVnbGkgaW50ZXJ2ZW50aSDDqCBhIGZhdm9yZSBkZWkgcGljY29saSBwcm9kdXR0b3JpLgoKX19fCgoKIyMgR29hbCAzCgoKPGRpdiBzdHlsZT0gImZsb2F0OmxlZnQ7cG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDBweDsgcGFkZGluZy1yaWdodDogMzBweCI+CmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vc2RnMy5wbmciKQpgYGAKPC9kaXY+CgoKTCdvYmlldHRpdm8gZGkgc3ZpbHVwcG8gc29zdGVuaWJpbGUgMyAoU0RHIDMpIHJpZ3VhcmRhIGxhICJCdW9uYSBzYWx1dGUgZSBiZW5lc3NlcmUiLiBMYSBmb3JtdWxhemlvbmUgdWZmaWNpYWxlIMOoOiAiKipQZXIgZ2FyYW50aXJlIHVuYSB2aXRhIHNhbmEgZSBwcm9tdW92ZXJlIGlsIGJlbmVzc2VyZSBwZXIgdHV0dGkgYSB0dXR0ZSBsZSBldMOgKirCuy4gR2xpIG9iaWV0dGl2aSBkZWxsJ1NERyAzIGNvcHJvbm8gZSBzaSBjb25jZW50cmFubyBzdSB2YXJpIGFzcGV0dGkgZGVsbGEgdml0YSBzYW5hIGUgZGVsbG8gc3RpbGUgZGkgdml0YSBzYW5vLgoKTCdTREcgMyBoYSAxMyBvYmlldHRpdmkgZSAyOCBpbmRpY2F0b3JpIHBlciBtaXN1cmFyZSBpIHByb2dyZXNzaSB2ZXJzbyBnbGkgb2JpZXR0aXZpLiBJIHByaW1pIG5vdmUgb2JpZXR0aXZpIHNvbm8gIm9iaWV0dGl2aSBmaW5hbGkiLiBRdWVzdGkgc29ubzogcmlkdXppb25lIGRlbGxhIG1vcnRhbGl0w6AgbWF0ZXJuYTsgcG9ycmUgZmluZSBhIHR1dHRlIGxlIG1vcnRpIGV2aXRhYmlsaSBhbCBkaSBzb3R0byBkZWkgY2lucXVlIGFubmkgZGkgZXTDoDsgY29tYmF0dGVyZSBsZSBtYWxhdHRpZSB0cmFzbWlzc2liaWxpOyBhc3NpY3VyYXJlIGxhIHJpZHV6aW9uZSBkZWxsYSBtb3J0YWxpdMOgIHBlciBtYWxhdHRpZSBub24gdHJhc21pc3NpYmlsaSBlIHByb211b3ZlcmUgbGEgc2FsdXRlIG1lbnRhbGU7IHByZXZlbmlyZSBlIGN1cmFyZSBsJ2FidXNvIGRpIHNvc3RhbnplOyByaWR1cnJlIGdsaSBpbmNpZGVudGkgc3RyYWRhbGkgZSBpIGRlY2Vzc2k7IGdhcmFudGlyZSBsJ2FjY2Vzc28gdW5pdmVyc2FsZSBhbGwnYXNzaXN0ZW56YSBzZXNzdWFsZSBlIHJpcHJvZHV0dGl2YSwgYWxsYSBwaWFuaWZpY2F6aW9uZSBmYW1pbGlhcmUgZSBhbGwnaXN0cnV6aW9uZTsgb3R0ZW5lcmUgdW5hIGNvcGVydHVyYSBzYW5pdGFyaWEgdW5pdmVyc2FsZTsgZSByaWR1cnJlIGxlIG1hbGF0dGllIGUgaSBkZWNlc3NpIGNhdXNhdGkgZGEgc29zdGFuemUgY2hpbWljaGUgcGVyaWNvbG9zZSBlIGlucXVpbmFtZW50by4KCkwnU0RHIDMgbWlyYSBhIHJhZ2dpdW5nZXJlIHVuYSBjb3BlcnR1cmEgc2FuaXRhcmlhIHVuaXZlcnNhbGUsIGNoZSBjZXJjYSB1biBhY2Nlc3NvIGVxdW8gYWkgc2Vydml6aSBzYW5pdGFyaSBwZXIgdHV0dGkgZ2xpIHVvbWluaSBlIGxlIGRvbm5lLiBQcm9wb25lIGRpIHBvcnJlIGZpbmUgYWxsYSBtb3J0ZSBwcmV2ZW5pYmlsZSBkaSBuZW9uYXRpLCBsYXR0YW50aSBlIGJhbWJpbmkgc290dG8gaSBjaW5xdWUgYW5uaSAobW9ydGFsaXTDoCBpbmZhbnRpbGUpIGUgZGkgcG9ycmUgZmluZSBhbGxlIGVwaWRlbWllLgoKTGEgYnVvbmEgc2FsdXRlIMOoIGVzc2VuemlhbGUgcGVyIGxvIHN2aWx1cHBvIHNvc3RlbmliaWxlIGUgbCdBZ2VuZGEgMjAzMC4gU2kgY29uY2VudHJhIHN1IHBpw7kgYW1waWUgZGlzdWd1YWdsaWFuemUgZWNvbm9taWNoZSBlIHNvY2lhbGksIHVyYmFuaXp6YXppb25lLCBjcmlzaSBjbGltYXRpY2EsIGNhcmljbyBjb250aW51byBkaSBISVYgZSBhbHRyZSBtYWxhdHRpZSBpbmZldHRpdmUsIHNlbnphIGRpbWVudGljYXJlIGxlIHNmaWRlIGVtZXJnZW50aSBjb21lIGxlIG1hbGF0dGllIG5vbiB0cmFzbWlzc2liaWxpLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyAzIHNpIHBvc3Nvbm8gdHJvdmFyZSBbY2xpY2NhbmRvIHF1aV0oaHR0cHM6Ly9zZGdzLnVuLm9yZy9nb2Fscy9nb2FsMykuCgoKKipNYXBwYSBJbnRlcmF0dGl2YSoqCgpgYGB7cn0KbWFwcGFfcXVhdHRybyRwb3B1cHRleHQzIDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgM2ApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lc3N1biBJbnZlc3RpbWVudG8iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAzYCA+IDEwMDAwMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDNgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAzYC8xMDAwLCAyKSwgIiBtaWxhIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQpgYGAKCmBgYHtyfQpwYWwzIDwtIGNvbG9yTnVtZXJpYygKICBwYWxldHRlID0gY29sb3JSYW1wUGFsZXR0ZShjKCd3aGl0ZScsICcjMjg5QjQ4JykpKGxlbmd0aChpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAzYCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAzYCkKYGBgCgpgYGB7cn0KbGVhZmxldChoZWlnaHQ9NzcwLCB3aWR0aD03NzApICU+JQogIHNldFZpZXcobG5nID0gMTIuOTk1ODM5LCBsYXQgPSA0Mi41NDk1NTAsIHpvb20gPSA4KSAlPiUKICAKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLkRhcmtNYXR0ZXJOb0xhYmVscykgJT4lCiAgCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1hcHBhX3F1YXR0cm8sIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICB3ZWlnaHQgPSAwLjUsIAogICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsCiAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwzKGBJbXBhdHRvIEdvYWwgM2ApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0MyAsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMywgCiAgICAgICAgICAgIHZhbHVlcyA9IG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAzYCwKICAgICAgICAgICAgdGl0bGUgPSAiSW1wYXR0byBzdWwgR29hbCAzIiwKICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQocHJlZml4ID0gIiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiIG1pbGlvbmkgZGkg4oKsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24gKHgpIHgvMTAwMDAwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5sYWJlbCA9ICJOZXNzdW4gSW52ZXN0LiIpIAogICAKYGBgCgoKKipDb21tZW50bzoqKiAgCklsIEdvYWwgMyByaWNldmUgaWwgNC4wOCUgZGVpIGZpbmFuemlhbWVudGkgcGVyIHVuIHRvdGFsZSBkaSA2NiwxNzYsNjkxLjgw4oKsLiBEZWkgMjU5IENvbXVuaSBjb2ludm9sdGkgbmVpIFBpYW5pIGRpIFJpY29zdHJ1emlvbmUsIDEzNiwgaWwgNTMlIGRlbCB0b3RhbGUsIGludmVzdG9ubyBuZWwgR29hbCAzLiAgCgpJbCBHb2FsIDMgw6gsIGNvbWUgcHJldmVkaWJpbGUsIHByaW5jaXBhbG1lbnRlIHRyYW5pYXRvIGRhZ2xpIGludGVydmVudGkgcmlndWFyZGFudGkgbGUgU3RydXR0dXJlIFNvY2lvLVNhbml0YXJpZS4gTGUgb3BlcmUgYWxsJ2ludGVybm8gZGkgcXVlc3RhIGNhdGVnb3JpYSBzb2RkaXNmYW5vLCBpbiBtZWRpYSwgaWwgMzQlIGRlaSB0YXJnZXQgcG9zdGkgZGFsbGUgTmF6aW9uaSBVbml0ZS4gUHXDsiBzZW1icmFyZSB1biByaXN1bHRhdG8gYmFzc28sIG1hIHF1ZXN0byBkaXBlbmRlIGRhbCBmYXR0byBjaGUgbW9sdGkgZGVpIHRhcmdldCBzb25vIGluIHJlYWx0w6Agcml2b2x0aSBhIFBhZXNpIGluIHZpYSBkaSBzdmlsdXBwby4gR2xpIGludmVzdGltZXRuaSBuZWxsZSBTdHJ1dHR1cmUgU29jaW8tU2FuaXRhcmllIGltcGF0dGFubyBpbiBHb2FsIDMgY29uIDM2LDA4OSwzNDguNDbigqwuIE5vbm9zdGFudGUgbGUgc2N1b2xlIHNvZGRpc2Zpbm8sIGluIG1lZGlhLCBpIHRhcmdldCBkZWwgR29hbCAzIGFsIDUlIChjb250cmlidWlzY29ubyBpbmZhdHRpIGFsbCdlZHVjYXppb25lIGFsbGEgc2FsdXRlIGUgYWwgYmVuZXNzZXJlIHBzaWNvLWZpc2ljbyksIGxhIG1vbGUgZGkgaW52ZXN0aW1lbnRpIGluIHF1ZXN0YSBjYXRlZ29yaWEgbGUgcG9ydGEgYSBjb250cmlidWlyZSBhbCBHb2FsIDMgY29uIDI1LDA5OSwzMjYuOTXigqwuCgpfX18KCiMjIEdvYWwgNAoKCjxkaXYgc3R5bGU9ICJmbG9hdDpsZWZ0O3Bvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAwcHg7IHBhZGRpbmctcmlnaHQ6IDMwcHgiPgpgYGB7ciwgb3V0LndpZHRoID0gIjQwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL3NkZzQucG5nIikKYGBgCjwvZGl2PgoKCkwnT2JpZXR0aXZvIGRpIFN2aWx1cHBvIFNvc3RlbmliaWxlIDQgKFNERyA0KSByaWd1YXJkYSB1bidpc3RydXppb25lIGRpIHF1YWxpdMOgLiBJbCB0aXRvbG8gY29tcGxldG8gZGVsbCdTREcgNCDDqCAiKipHYXJhbnRpcmUgdW4naXN0cnV6aW9uZSBkaSBxdWFsaXTDoCBpbmNsdXNpdmEgZWQgZXF1YSBlIHByb211b3ZlcmUgb3Bwb3J0dW5pdMOgIGRpIGFwcHJlbmRpbWVudG8gcGVybWFuZW50ZSBwZXIgdHV0dGkqKiIuCgpMJ1NERyA0IGhhIGRpZWNpIG9iaWV0dGl2aSBjaGUgc29ubyBtaXN1cmF0aSBkYSAxMSBpbmRpY2F0b3JpLiBJIHNldHRlICJyaXN1bHRhdGkgZmluYWxpIiBzb25vOiBpc3RydXppb25lIHByaW1hcmlhIGUgc2Vjb25kYXJpYSBncmF0dWl0YTsgcGFyaSBhY2Nlc3NvIGEgdW4naXN0cnV6aW9uZSBwcmVwcmltYXJpYSBkaSBxdWFsaXTDoDsgaXN0cnV6aW9uZSB0ZWNuaWNhLCBwcm9mZXNzaW9uYWxlIGUgc3VwZXJpb3JlIGEgcHJlenppIGFjY2Vzc2liaWxpOyBhdW1lbnRvIGRlbCBudW1lcm8gZGkgcGVyc29uZSBjb24gY29tcGV0ZW56ZSByaWxldmFudGkgcGVyIGlsIHN1Y2Nlc3NvIGZpbmFuemlhcmlvOyBlbGltaW5hemlvbmUgZGkgb2duaSBkaXNjcmltaW5hemlvbmUgbmVsbCdpc3RydXppb25lOyBhbGZhYmV0aXp6YXppb25lIGUgY2FsY29sbyB1bml2ZXJzYWxpOyBlIGwnZWR1Y2F6aW9uZSBhbGxvIHN2aWx1cHBvIHNvc3RlbmliaWxlIGUgYWxsYSBjaXR0YWRpbmFuemEgZ2xvYmFsZS4gSSB0cmUgIm1lenppIHBlciByYWdnaXVuZ2VyZSBnbGkgb2JpZXR0aXZpIiBzb25vOiBjb3N0cnVpcmUgZSBtaWdsaW9yYXJlIHNjdW9sZSBpbmNsdXNpdmUgZSBzaWN1cmU7IGFtcGxpYXJlIGxlIGJvcnNlIGRpIHN0dWRpbyBwZXIgbCdpc3RydXppb25lIHN1cGVyaW9yZSBwZXIgaSBwYWVzaSBpbiB2aWEgZGkgc3ZpbHVwcG87IGUgYXVtZW50YXJlIGwnb2ZmZXJ0YSBkaSBpbnNlZ25hbnRpIHF1YWxpZmljYXRpIG5laSBwYWVzaSBpbiB2aWEgZGkgc3ZpbHVwcG8uCgpMJ1NERyA0IG1pcmEgYSBmb3JuaXJlIGFpIGJhbWJpbmkgZSBhaSBnaW92YW5pIHVuJ2lzdHJ1emlvbmUgZGkgcXVhbGl0w6AgZSBmYWNpbG1lbnRlIGFjY2Vzc2liaWxlIG9sdHJlIGFkIGFsdHJlIG9wcG9ydHVuaXTDoCBkaSBhcHByZW5kaW1lbnRvLiBVbm8gZGVpIHN1b2kgb2JpZXR0aXZpIMOoIHJhZ2dpdW5nZXJlIGwnYWxmYWJldGl6emF6aW9uZSBlIGxhIG1hdGVtYXRpY2EgdW5pdmVyc2FsaS4gVW5hIGNvbXBvbmVudGUgaW1wb3J0YW50ZSBuZWxsJ2FjcXVpc2l6aW9uZSBkaSBjb25vc2NlbnplIGUgYWJpbGl0w6AgcHJlemlvc2UgbmVsbCdhbWJpZW50ZSBkaSBhcHByZW5kaW1lbnRvLiBEYSBxdWkgbCd1cmdlbnRlIG5lY2Vzc2l0w6AgZGkgY29zdHJ1aXJlIHBpw7kgc3RydXR0dXJlIGVkdWNhdGl2ZSBlIGFuY2hlIGRpIGFnZ2lvcm5hcmUgcXVlbGxlIGF0dHVhbGkgcGVyIGZvcm5pcmUgYW1iaWVudGkgZGkgYXBwcmVuZGltZW50byBzaWN1cmksIGluY2x1c2l2aSBlZCBlZmZpY2FjaSBwZXIgdHV0dGkuCgpVbHRlcmlvcmkgaW5mb3JtYXppb25pIHN1bGwnU0RHIDQgc2kgcG9zc29ubyB0cm92YXJlIFtjbGljY2FuZG8gcXVpXShodHRwczovL3NkZ3MudW4ub3JnL2dvYWxzL2dvYWw0KS4KCioqTWFwcGEgSW50ZXJhdHRpdmEqKgoKYGBge3J9Cm1hcHBhX3F1YXR0cm8kcG9wdXB0ZXh0NCA8LSBpZmVsc2UoaXMubmEobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDRgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgNGAgPiAxMDAwMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA0YC8xMDAwMDAwLCAyKSwgIiBtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgNGAvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsNCA8LSBjb2xvck51bWVyaWMoCiAgcGFsZXR0ZSA9IGNvbG9yUmFtcFBhbGV0dGUoYygnd2hpdGUnLCAnI0JGMTkyQycpKShsZW5ndGgoaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgNGApKSwgCiAgZG9tYWluID0gaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgNGApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsNChgSW1wYXR0byBHb2FsIDRgKSwKICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAicmVkIiwgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpbmdUb0Zyb250ID0gVFJVRSksCiAgICAgICAgICAgIHBvcHVwID0gfnBvcHVwdGV4dDQgLAogICAgICAgICAgICBsYWJlbCA9IH5odG1sRXNjYXBlKGFzLmNoYXJhY3RlcihOQU1FXzMpKSkgJT4lCiAgCiAgYWRkTGVnZW5kKHBvc2l0aW9uID0gInRvcHJpZ2h0IiwgCiAgICAgICAgICAgIHBhbCA9IHBhbDQsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgNGAsCiAgICAgICAgICAgIHRpdGxlID0gIkltcGF0dG8gc3VsIEdvYWwgNCIsCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHByZWZpeCA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIiBtaWxpb25pIGRpIOKCrCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZ1bmN0aW9uICh4KSB4LzEwMDAwMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEubGFiZWwgPSAiTmVzc3VuIEludmVzdC4iKSAKICAgCmBgYAoKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDQgcmljZXZlIGlsIDI0LjE4JSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDM5MiwwNDAsMzUyLjg34oKsLiBEZWkgMjU5IENvbXVuaSBjb2ludm9sdGkgbmVpIFBpYW5pIGRpIFJpY29zdHJ1emlvbmUsIDE4NywgaWwgNzIlIGRlbCB0b3RhbGUsIGludmVzdG9ubyBuZWwgR29hbCA0LgoKSWwgR29hbCA0IMOoIHRyYW5pYXRvIGRhZ2xpIGludGVydmVudGkgcmlndWFyZGFudGkgbGUgU2N1b2xlLiBJbiBtZWRpYSwgdW4gaW50ZXJ2ZW50byBzdSB1bmEgc3RydXR0dXJhIHNjb2xhc3RpY2Egc29kZGlzZmEgaWwgNzQlIGRlaSB0YXJnZXQgcG9zdGkgZGFsbGUgTmF6aW9uaSBVbml0ZSBwZXIgaWwgR29hbCA0LiAzNzcgbWlsaW9uaSBkZWkgMzkyIHJpc2VydmF0aSBhbCBHb2FsIDQgZGVyaXZhbm8gZGFsbGUgU2N1b2xlLgoKX19fCgojIyBHb2FsIDUKCgo8ZGl2IHN0eWxlPSAiZmxvYXQ6bGVmdDtwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMHB4OyBwYWRkaW5nLXJpZ2h0OiAzMHB4Ij4KYGBge3IsIG91dC53aWR0aCA9ICI0MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0vQ0lUSTRHUkVFTi9zZGc1LnBuZyIpCmBgYAo8L2Rpdj4KCkwnb2JpZXR0aXZvIGRpIHN2aWx1cHBvIHNvc3RlbmliaWxlIDUgKFNERyA1KSByaWd1YXJkYSBsJ3VndWFnbGlhbnphIGRpIGdlbmVyZSBlZCDDqCBpbCBxdWludG8gZGVpIDE3IG9iaWV0dGl2aSBkaSBzdmlsdXBwbyBzb3N0ZW5pYmlsZSBzdGFiaWxpdGkgZGFsbGUgTmF6aW9uaSBVbml0ZSBuZWwgMjAxNS4gTGEgZm9ybXVsYXppb25lIHVmZmljaWFsZSBkZWxsJ1NERyA1IMOoICIqKlJhZ2dpdW5nZXJlIGwndWd1YWdsaWFuemEgZGkgZ2VuZXJlIGUgcmVzcG9uc2FiaWxpenphcmUgdHV0dGUgbGUgZG9ubmUgZSBsZSByYWdhenplKioiLgoKTCdTREcgNSBoYSBub3ZlIG9iaWV0dGl2aSBlIDE0IGluZGljYXRvcmkuIFNlaSBkZWdsaSBvYmlldHRpdmkgc29ubyAib3JpZW50YXRpIGFsIHJpc3VsdGF0byI6IHBvcnJlIGZpbmUgYSB0dXR0ZSBsZSBmb3JtZSBkaSBkaXNjcmltaW5hemlvbmUgY29udHJvIHR1dHRlIGxlIGRvbm5lIGUgbGUgcmFnYXp6ZSBvdnVucXVlOyBwb3JyZSBmaW5lIGFsbGEgdmlvbGVuemEgZSBhbGxvIHNmcnV0dGFtZW50byBkaSBkb25uZSBlIHJhZ2F6emU7IGVsaW1pbmFyZSBwcmF0aWNoZSBkYW5ub3NlIGNvbWUgaWwgbWF0cmltb25pbyBpbmZhbnRpbGUsIHByZWNvY2UgZSBmb3J6YXRvIGUgbGUgbXV0aWxhemlvbmkgZ2VuaXRhbGkgZmVtbWluaWxpOyB2YWxvcml6emFyZSBsJ2Fzc2lzdGVuemEgbm9uIHJldHJpYnVpdGEgZSBwcm9tdW92ZXJlIHJlc3BvbnNhYmlsaXTDoCBkb21lc3RpY2hlIGNvbmRpdmlzZTsgZ2FyYW50aXJlIGxhIHBpZW5hIHBhcnRlY2lwYXppb25lIGRlbGxlIGRvbm5lIGFsbGEgbGVhZGVyc2hpcCBlIGFsIHByb2Nlc3NvIGRlY2lzaW9uYWxlOyBlIGdhcmFudGlyZSBsJ2FjY2Vzc28gYWkgZGlyaXR0aSByaXByb2R1dHRpdmkgdW5pdmVyc2FsaSBlIGFsbGEgc2FsdXRlLiBJIHRyZSAibWV6emkgcGVyIHJhZ2dpdW5nZXJlIiBnbGkgb2JpZXR0aXZpIHNvbm86IHByb211b3ZlcmUgbGEgcGFyaXTDoCBkaSBkaXJpdHRpIGFsbGUgcmlzb3JzZSBlY29ub21pY2hlLCBhbGxhIHByb3ByaWV0w6AgZSBhaSBzZXJ2aXppIGZpbmFuemlhcmkgcGVyIGxlIGRvbm5lOyBwcm9tdW92ZXJlIGwnZW1hbmNpcGF6aW9uZSBkZWxsZSBkb25uZSBhdHRyYXZlcnNvIGxhIHRlY25vbG9naWE7IGUgbCdhZG96aW9uZSwgaWwgcmFmZm9yemFtZW50byBkZWxsZSBwb2xpdGljaGUgZSBsJ2FwcGxpY2F6aW9uZSBkZWxsYSBsZWdpc2xhemlvbmUgcGVyIGxhIHBhcml0w6AgZGkgZ2VuZXJlLgoKTCdTREcgNSBtaXJhIGEgZ2FyYW50aXJlIGEgZG9ubmUgZSByYWdhenplIHBhcmkgZGlyaXR0aSwgb3Bwb3J0dW5pdMOgIGRpIHZpdmVyZSBsaWJlcmkgc2VuemEgZGlzY3JpbWluYXppb25pLCBjb21wcmVzYSBsYSBkaXNjcmltaW5hemlvbmUgc3VsIHBvc3RvIGRpIGxhdm9ybyBvIHF1YWxzaWFzaSB2aW9sZW56YS4gUXVlc3RvIHBlciByYWdnaXVuZ2VyZSBsJ3VndWFnbGlhbnphIGRpIGdlbmVyZSBlIGRhcmUgcG90ZXJlIGEgdHV0dGUgbGUgZG9ubmUgZSBsZSByYWdhenplLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyA1IHNpIHBvc3Nvbm8gdHJvdmFyZSBbY2xpY2NhbmRvIHF1aV0oaHR0cHM6Ly9zZGdzLnVuLm9yZy9nb2Fscy9nb2FsNSkuCgoKKipNYXBwYSBJbnRlcmF0dGl2YSoqCgpgYGB7cn0KbWFwcGFfcXVhdHRybyRwb3B1cHRleHQ1IDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgNWApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lc3N1biBJbnZlc3RpbWVudG8iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA1YCA+IDEwMDAwMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDVgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA1YC8xMDAwLCAyKSwgIiBtaWxhIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQpgYGAKCmBgYHtyfQpwYWw1IDwtIGNvbG9yTnVtZXJpYygKICBwYWxldHRlID0gY29sb3JSYW1wUGFsZXR0ZShjKCd3aGl0ZScsICcjRUY0MDJEJykpKGxlbmd0aChpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCA1YCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCA1YCkKYGBgCgpgYGB7cn0KbGVhZmxldChoZWlnaHQ9NzcwLCB3aWR0aD03NzApICU+JQogIHNldFZpZXcobG5nID0gMTIuOTk1ODM5LCBsYXQgPSA0Mi41NDk1NTAsIHpvb20gPSA4KSAlPiUKICAKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLkRhcmtNYXR0ZXJOb0xhYmVscykgJT4lCiAgCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1hcHBhX3F1YXR0cm8sIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICB3ZWlnaHQgPSAwLjUsIAogICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsCiAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWw1KGBJbXBhdHRvIEdvYWwgNWApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0NSwKICAgICAgICAgICAgbGFiZWwgPSB+aHRtbEVzY2FwZShhcy5jaGFyYWN0ZXIoTkFNRV8zKSkpICU+JQogIAogIGFkZExlZ2VuZChwb3NpdGlvbiA9ICJ0b3ByaWdodCIsIAogICAgICAgICAgICBwYWwgPSBwYWw1LCAKICAgICAgICAgICAgdmFsdWVzID0gbWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDVgLAogICAgICAgICAgICB0aXRsZSA9ICJJbXBhdHRvIHN1bCBHb2FsIDUiLAogICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChwcmVmaXggPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIgbWlsaW9uaSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDUgcmljZXZlIGlsIDUuMjUlIGRlaSBmaW5hbnppYW1lbnRpIHBlciB1biB0b3RhbGUgZGkgODUsMTgwLDkwOS45OeKCrC4gRGVpIDI1OSBDb211bmkgY29pbnZvbHRpIG5laSBQaWFuaSBkaSBSaWNvc3RydXppb25lLCAxMjIsIGlsIDQ3JSBkZWwgdG90YWxlLCBpbnZlc3Rvbm8gbmVsIEdvYWwgNS4KClRyYSBnbGkgaW50ZXZlbnRpIHByZXNlbnRpLCBwcmluY2lwYWxtZW50ZSBzb25vIGxlIFNjdW9sZSBlIGxlIFN0cnV0dHVyZSBTb2Npby1TYW5pdGFyaWUgYSBjb250cmlidWlyZSBhbCBHb2FsIDUuICAKTGEgc2N1b2xhIGhhIHNvcHJhdHR1dHRvIHVuIGltcGF0dG8gaW5kaXJldHRvIHN1bCB0YXJnZXQgNS5iOiAiUHJvbXVvdmVyZSBsJ2VtYW5jaXBhemlvbmUgZGVsbGUgZG9ubmUgYXR0cmF2ZXJzbyBsYSB0ZWNub2xvZ2lhLiIgIApMZSBzdHJ1dHR1cmUgc29jaW8gc2FuaXRhcmllLCBpbnZlY2UsIGNvbnRyaWJ1aXNjb25vIGF0dHJhdmVyc28gaWwgdGFyZ2V0IDUuNjogIkFjY2Vzc28gdW5pdmVyc2FsZSBhaSBkaXJpdHRpIHJpcHJvZHV0dGl2aSBlIGFsbGEgc2FsdXRlLiIKCl9fXwoKIyMgR29hbCA2Cgo8ZGl2IHN0eWxlPSAiZmxvYXQ6bGVmdDtwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMHB4OyBwYWRkaW5nLXJpZ2h0OiAzMHB4Ij4KYGBge3IsIG91dC53aWR0aCA9ICI0MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0vQ0lUSTRHUkVFTi9zZGc2LnBuZyIpCmBgYAo8L2Rpdj4KCkwnT2JpZXR0aXZvIGRpIFN2aWx1cHBvIFNvc3RlbmliaWxlIDYgKFNERyA2KSByaWd1YXJkYSAiYWNxdWEgcHVsaXRhIGUgc2Vydml6aSBpZ2llbmljby1zYW5pdGFyaSBwZXIgdHV0dGkiLiBMYSBkaWNpdHVyYSB1ZmZpY2lhbGUgw6g6ICIqKkdhcmFudGlyZSBsYSBkaXNwb25pYmlsaXTDoCBlIGxhIGdlc3Rpb25lIHNvc3RlbmliaWxlIGRlbGwnYWNxdWEgZSBkZWkgc2Vydml6aSBpZ2llbmljby1zYW5pdGFyaSBwZXIgdHV0dGkqKiIuIEwnb2JpZXR0aXZvIHByZXZlZGUgb3R0byB0YXJnZXQgZGEgcmFnZ2l1bmdlcmUgYWxtZW5vIGVudHJvIGlsIDIwMzAuIEkgcHJvZ3Jlc3NpIHZlcnNvIGdsaSBvYmlldHRpdmkgc2FyYW5ubyBtaXN1cmF0aSB1dGlsaXp6YW5kbyB1bmRpY2kgaW5kaWNhdG9yaS4KCkkgc2VpICJvYmlldHRpdmkgZmluYWxpIiBpbmNsdWRvbm86IEFjcXVhIHBvdGFiaWxlIHNpY3VyYSBlIGNvbnZlbmllbnRlOyBwb3JyZSBmaW5lIGFsbGEgZGVmZWNhemlvbmUgYWxsJ2FwZXJ0byBlIGZvcm5pcmUgYWNjZXNzbyBhIHNlcnZpemkgaWdpZW5pY28tc2FuaXRhcmksIG1pZ2xpb3JhcmUgbGEgcXVhbGl0w6AgZGVsbCdhY3F1YSwgaWwgdHJhdHRhbWVudG8gZGVsbGUgYWNxdWUgcmVmbHVlIGUgaWwgcml1dGlsaXp6byBzaWN1cm8sIGF1bWVudGFyZSBsJ2VmZmljaWVuemEgbmVsbCd1c28gZGVsbCdhY3F1YSBlIGdhcmFudGlyZSBsJ2FwcHJvdnZpZ2lvbmFtZW50byBkaSBhY3F1YSBkb2xjZSwgaW1wbGVtZW50YXJlIGwnSVdSTSwgcHJvdGVnZ2VyZSBlIHJpcHJpc3RpbmFyZSBnbGkgZWNvc2lzdGVtaSBsZWdhdGkgYWxsJ2FjcXVhLiBJIG1lenppIHBlciByYWdnaXVuZ2VyZSBnbGkgb2JpZXR0aXZpIHNvbm8gZXNwYW5kZXJlIGlsIHNvc3RlZ25vIGlkcmljbyBlIGlnaWVuaWNvLXNhbml0YXJpbyBhaSBwYWVzaSBpbiB2aWEgZGkgc3ZpbHVwcG8gZSBzb3N0ZW5lcmUgbCdpbXBlZ25vIGxvY2FsZSBuZWxsYSBnZXN0aW9uZSBkZWxsJ2FjcXVhIGUgZGVpIHNlcnZpemkgaWdpZW5pY28tc2FuaXRhcmkuCgpOZWwgMjAxNywgMiwyIG1pbGlhcmRpIGRpIHBlcnNvbmUgbm9uIGF2ZXZhbm8gYWNxdWEgcG90YWJpbGUgZ2VzdGl0YSBpbiBtb2RvIHNpY3VybyBlIDQsMiBtaWxpYXJkaSBkaSBwZXJzb25lIG5vbiBhdmV2YW5vIHNlcnZpemkgaWdpZW5pY28tc2FuaXRhcmkgZ2VzdGl0aSBpbiBtb2RvIHNpY3Vyby4gVHJlIG1pbGlhcmRpIGRpIHBlcnNvbmUgaW4gdHV0dG8gaWwgbW9uZG8gbm9uIGRpc3Bvbmdvbm8gZGkgc3RydXR0dXJlIGRpIGJhc2UgcGVyIGlsIGxhdmFnZ2lvIGRlbGxlIG1hbmkgYSBjYXNhLiBEdWUgc3RydXR0dXJlIHNhbml0YXJpZSBzdSBjaW5xdWUgaW4gdHV0dG8gaWwgbW9uZG8gbm9uIGhhbm5vIGFjcXVhIGUgc2Fwb25lLCBuw6kgc2FuaWZpY2F0b3JpIHBlciBsZSBtYW5pIGEgYmFzZSBkaSBhbGNvbCAoMjAxNikuIExhIHBhbmRlbWlhIGRpIENPVklELTE5IGhhIHJlc28gcXVlc3RvIG9iaWV0dGl2byBzZW1wcmUgcGnDuSBpbXBvcnRhbnRlLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyA2IHNpIHBvc3Nvbm8gdHJvdmFyZSBbY2xpY2NhbmRvIHF1aV0oaHR0cHM6Ly9zZGdzLnVuLm9yZy9nb2Fscy9nb2FsNikuCgoqKk1hcHBhIEludGVyYXR0aXZhKioKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDYgPC0gaWZlbHNlKGlzLm5hKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA2YCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVzc3VuIEludmVzdGltZW50byIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDZgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgNmAvMTAwMDAwMCwgMiksICIgbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDZgLzEwMDAsIDIpLCAiIG1pbGEiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCmBgYAoKYGBge3J9CnBhbDYgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyMwMEFFRDknKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDZgKSksIAogIGRvbWFpbiA9IGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDZgKQpgYGAKCmBgYHtyfQpsZWFmbGV0KGhlaWdodD03NzAsIHdpZHRoPTc3MCkgJT4lCiAgc2V0VmlldyhsbmcgPSAxMi45OTU4MzksIGxhdCA9IDQyLjU0OTU1MCwgem9vbSA9IDgpICU+JQogIAogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuRGFya01hdHRlck5vTGFiZWxzKSAlPiUKICAKICBhZGRQb2x5Z29ucyhkYXRhID0gbWFwcGFfcXVhdHRybywgCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgCiAgICAgICAgICAgIHdlaWdodCA9IDAuNSwgCiAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuMywKICAgICAgICAgICAgb3BhY2l0eSA9IDAuNywgCiAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMSwKICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbDYoYEltcGF0dG8gR29hbCA2YCksCiAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gInJlZCIsIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLAogICAgICAgICAgICBwb3B1cCA9IH5wb3B1cHRleHQ2LAogICAgICAgICAgICBsYWJlbCA9IH5odG1sRXNjYXBlKGFzLmNoYXJhY3RlcihOQU1FXzMpKSkgJT4lCiAgCiAgYWRkTGVnZW5kKHBvc2l0aW9uID0gInRvcHJpZ2h0IiwgCiAgICAgICAgICAgIHBhbCA9IHBhbDYsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgNmAsCiAgICAgICAgICAgIHRpdGxlID0gIkltcGF0dG8gc3VsIEdvYWwgNiIsCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHByZWZpeCA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIiBtaWxpb25pIGRpIOKCrCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZ1bmN0aW9uICh4KSB4LzEwMDAwMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEubGFiZWwgPSAiTmVzc3VuIEludmVzdC4iKSAKICAgCmBgYAoKKipDb21tZW50bzoqKiAgCklsIEdvYWwgNiByaWNldmUgaWwgNy4wMCUgZGVpIGZpbmFuemlhbWVudGkgcGVyIHVuIHRvdGFsZSBkaSAxMTMsNDg1LDA0MS44NOKCrC4gRGVpIDI1OSBDb211bmkgY29pbnZvbHRpIG5laSBQaWFuaSBkaSBSaWNvc3RydXppb25lLCAxMzgsIGlsIDUzJSBkZWwgdG90YWxlLCBpbnZlc3Rvbm8gbmVsIEdvYWwgNi4KCklsIEdvYWwgNiDDqCB0cmFpbmF0byBzaWEgcXVhbGl0YXRpdmFtZW50ZSBjaGUgcXVhbnRpdGF0aXZhbWVudGUgZGFnbGkgaW50ZXJ2ZW50aSBhcHBhcnRlbmVudGkgYWxsYSBjYXRlZ29yaWEgZGVsIERpc3Nlc3RvIElkcm9nZW9sb2dpY28gZSBwZXIgbGUgUmlzb3JzZSBJZHJpY2hlLiAgCkdsaSBpbnRlcnZlbnRpIGFwcGFydGVudGVudGkgYSBxdWVzdGEgY2F0ZWdvcmlhIHNvZGRpZmFubywgaW4gbWVkaWEsIGkgdGFyZ2V0IGRlbCBHb2FsIDYgYWwgNjIlLiAgClF1YW50aXRhdGl2YW1lbnRlLCBsYSBjYXRlZ29yaWEgZGVsIERpc3Nlc3RvIElkcm9nZW9sb2dpY28gY29udHJpYnVpc2NlIGNvbiA5MyBtaWxpb25pIHN1bCB0b3RhbGUgZGkgMTEzLjUuCgpfX18KCiMjIEdvYWwgNwoKPGRpdiBzdHlsZT0gImZsb2F0OmxlZnQ7cG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDBweDsgcGFkZGluZy1yaWdodDogMzBweCI+CmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vc2RnNy5wbmciKQpgYGAKPC9kaXY+CgpMJ09iaWV0dGl2byBkaSBTdmlsdXBwbyBTb3N0ZW5pYmlsZSA3IChTREcgNykgbWlyYSBhICIqKkdhcmFudGlyZSBsJ2FjY2Vzc28gYSB1bidlbmVyZ2lhIGVjb25vbWljYSwgYWZmaWRhYmlsZSwgc29zdGVuaWJpbGUgZSBtb2Rlcm5hIHBlciB0dXR0aSoqIi4gTCdhY2Nlc3NvIGFsbCdlbmVyZ2lhIMOoIHVuIHBpbGFzdHJvIG1vbHRvIGltcG9ydGFudGUgcGVyIGlsIGJlbmVzc2VyZSBkZWxsZSBwZXJzb25lLCBsbyBzdmlsdXBwbyBlY29ub21pY28gZSBsYSByaWR1emlvbmUgZGVsbGEgcG92ZXJ0w6AuCgpMJ29iaWV0dGl2byBwcmV2ZWRlIGNpbnF1ZSB0YXJnZXQgZGEgcmFnZ2l1bmdlcmUgZW50cm8gaWwgMjAzMC4gSSBwcm9ncmVzc2kgdmVyc28gZ2xpIG9iaWV0dGl2aSBzb25vIG1pc3VyYXRpIGRhIHNlaSBpbmRpY2F0b3JpLiBUcmUgZGVpIGNpbnF1ZSBvYmlldHRpdmkgc29ubyAib2JpZXR0aXZpIGZpbmFsaSI6IEFjY2Vzc28gdW5pdmVyc2FsZSBhbGwnZW5lcmdpYSBtb2Rlcm5hOyBhdW1lbnRhcmUgbGEgcGVyY2VudHVhbGUgZ2xvYmFsZSBkaSBlbmVyZ2lhIHJpbm5vdmFiaWxlOyByYWRkb3BwaWFyZSBpbCBtaWdsaW9yYW1lbnRvIGRlbGwnZWZmaWNpZW56YSBlbmVyZ2V0aWNhLiBJIHJlc3RhbnRpIGR1ZSBvYmlldHRpdmkgc29ubyBtZXp6aSBwZXIgcmFnZ2l1bmdlcmUgZ2xpIGFsdHJpIHRhcmdldDogcHJvbXVvdmVyZSBsJ2FjY2Vzc28gYWxsYSByaWNlcmNhLCBhbGxhIHRlY25vbG9naWEgZSBhZ2xpIGludmVzdGltZW50aSBpbiBlbmVyZ2lhIHB1bGl0YTsgZWQgZXNwYW5kZXJlIGUgYWdnaW9ybmFyZSBpIHNlcnZpemkgZW5lcmdldGljaSBwZXIgaSBwYWVzaSBpbiB2aWEgZGkgc3ZpbHVwcG8uCgpJbiBhbHRyZSBwYXJvbGUsIHF1ZXN0aSB0YXJnZXQgaW5jbHVkb25vIGwnYWNjZXNzbyBhIHVuJ2VuZXJnaWEgZWNvbm9taWNhIGUgYWZmaWRhYmlsZSwgYXVtZW50YW5kbyBhbCBjb250ZW1wbyBsYSBxdW90YSBkaSBlbmVyZ2lhIHJpbm5vdmFiaWxlIG5lbCBtaXggZW5lcmdldGljbyBnbG9iYWxlLiBDacOyIGNvbXBvcnRlcmViYmUgaWwgbWlnbGlvcmFtZW50byBkZWxsJ2VmZmljaWVuemEgZW5lcmdldGljYSBlIGlsIHJhZmZvcnphbWVudG8gZGVsbGEgY29vcGVyYXppb25lIGludGVybmF6aW9uYWxlIHBlciBmYWNpbGl0YXJlIHVuIGFjY2Vzc28gcGnDuSBhcGVydG8gYWxsYSB0ZWNub2xvZ2lhIGRlbGwnZW5lcmdpYSBwdWxpdGEgZSBtYWdnaW9yaSBpbnZlc3RpbWVudGkgbmVsbGUgaW5mcmFzdHJ1dHR1cmUgcGVyIGwnZW5lcmdpYSBwdWxpdGEuCgpVbHRlcmlvcmkgaW5mb3JtYXppb25pIHN1bGwnU0RHIDcgc2kgcG9zc29ubyB0cm92YXJlIFtjbGljY2FuZG8gcXVpXShodHRwczovL3NkZ3MudW4ub3JnL2dvYWxzL2dvYWw3KS4KCioqTWFwcGEgSW50ZXJhdHRpdmEqKgoKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDcgPC0gaWZlbHNlKGlzLm5hKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA3YCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVzc3VuIEludmVzdGltZW50byIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDdgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgN2AvMTAwMDAwMCwgMiksICIgbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDdgLzEwMDAsIDIpLCAiIG1pbGEiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCmBgYAoKYGBge3J9CnBhbDcgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyNGREI5MEInKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDdgKSksIAogIGRvbWFpbiA9IGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDdgKQpgYGAKCmBgYHtyfQpsZWFmbGV0KGhlaWdodD03NzAsIHdpZHRoPTc3MCkgJT4lCiAgc2V0VmlldyhsbmcgPSAxMi45OTU4MzksIGxhdCA9IDQyLjU0OTU1MCwgem9vbSA9IDgpICU+JQogIAogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuRGFya01hdHRlck5vTGFiZWxzKSAlPiUKICAKICBhZGRQb2x5Z29ucyhkYXRhID0gbWFwcGFfcXVhdHRybywgCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgCiAgICAgICAgICAgIHdlaWdodCA9IDAuNSwgCiAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuMywKICAgICAgICAgICAgb3BhY2l0eSA9IDAuNywgCiAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMSwKICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbDcoYEltcGF0dG8gR29hbCA3YCksCiAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gInJlZCIsIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLAogICAgICAgICAgICBwb3B1cCA9IH5wb3B1cHRleHQ3LAogICAgICAgICAgICBsYWJlbCA9IH5odG1sRXNjYXBlKGFzLmNoYXJhY3RlcihOQU1FXzMpKSkgJT4lCiAgCiAgYWRkTGVnZW5kKHBvc2l0aW9uID0gInRvcHJpZ2h0IiwgCiAgICAgICAgICAgIHBhbCA9IHBhbDcsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgN2AsCiAgICAgICAgICAgIHRpdGxlID0gIkltcGF0dG8gc3VsIEdvYWwgNyIsCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHByZWZpeCA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIiBtaWdsaWFpYSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDcgcmljZXZlIGxvIDAuMDElIGRlaSBmaW5hbnppYW1lbnRpIHBlciB1biB0b3RhbGUgZGkgMTU4LDA0NS42MDTigqwuIERlaSAyNTkgQ29tdW5pIGNvaW52b2x0aSBuZWkgUGlhbmkgZGkgUmljb3N0cnV6aW9uZSwgc29sbyAyIGludmVzdG9ubyBuZWwgR29hbCA3LgoKSWwgR29hbCA3IMOoIGlsIHBlbnVsdGltbyBHb2FsLCBkb3BvIGlsIDE0LCBwZXIgbnVtZXJvIGRpIGludmVzdGltZW50aS4gIAoKUXVlc3RvIHJpc3VsdGF0byBkZXJpdmEgZGFsIGZhdHRvIGNoZSBnbGkgaW50ZXJ2ZW50aSBkaSByaWNvc3RydXppb25lIGFuYWxpenphdGkgbm9uIGVzcGxpY2l0YW5vIHNlIGzigJlhdHR1YXppb25lIGRlZ2xpIHN0ZXNzaSBhdnZlcnLDoCBpbiB1buKAmW90dGljYSBzb3N0ZW5pYmlsZSwgcXVpbmRpIHNlIGFkIGVzZW1waW8sIGxhIGNvc3RydXppb25lIGRpIGVkaWZpY2kgaW5jbHVkYSBhbmNoZSBs4oCZZWZmaWNpZW50YW1lbnRvIGVuZXJnZXRpY28gbyBs4oCZaW5zdGFsbGF6aW9uZSBkaSBwYW5uZWxsaSBzb2xhcmkgbyBpbiBnZW5lcmFsZSBs4oCZdXRpbGl6em8gZGVsIEVjb2JvbnVzIDExMCUuIENvbnNlZ3VlbnRlbWVudGUsIG5vbiBhcHBlbmEgc2FyYW5ubyBjaGlhcmUgbGUgbW9kYWxpdMOgIGRpIGF0dHVhemlvbmUgZGVnbGkgaW50ZXJ2ZW50aSwgc2kgcG90csOgIHJpY2FsaWJyYXJlIGlsIG1vZGVsbG8gc3VsbGEgYmFzZSBkZWdsaSBpbnZlc3RpbWVudGkgZmluYWxpenphdGkuICAKClRyYSBnbGkgaW50ZXJ2ZW50aSBhbmFsaXp6YXRpLCBzb2xvIGR1ZSBpbXBhdHRhbm8gaWwgR29hbCA3LiBRdWVzdGkgc29ubzogbGUgY2VudHJhbGkgaWRyb2VsZXR0cmljaGUgZGkgQ2FzdGVsIFNhbnTigJlBbmdlbG8gbmVsIExhemlvIGUgQXJxdWF0YSBkZWwgVHJvbnRvIG5lbGxlIE1hcmNoZS4gQWxsYSBwcmltYSBzb25vIHJpc2VydmF0aSBjaXJjYSA0OSBtaWxhIOKCrCwgYWxsYSBzZWNvbmRhIGNpcmNhIDEwOSBtaWxhIOKCrC4KCl9fXwoKIyMgR29hbCA4Cgo8ZGl2IHN0eWxlPSAiZmxvYXQ6bGVmdDtwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMHB4OyBwYWRkaW5nLXJpZ2h0OiAzMHB4Ij4KYGBge3IsIG91dC53aWR0aCA9ICI0MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0vQ0lUSTRHUkVFTi9zZGc4LnBuZyIpCmBgYAo8L2Rpdj4KCkwnT2JpZXR0aXZvIGRpIFN2aWx1cHBvIFNvc3RlbmliaWxlIDggKFNERyA4KSByaWd1YXJkYSAibGF2b3JvIGRpZ25pdG9zbyBlIGNyZXNjaXRhIGVjb25vbWljYSIuIElsIHRpdG9sbyBjb21wbGV0byDDqDogIioqRmF2b3JpcmUgdW5hIGNyZXNjaXRhIGVjb25vbWljYSBzb3N0ZW51dGEsIGluY2x1c2l2YSBlIHNvc3RlbmliaWxlLCB1bidvY2N1cGF6aW9uZSBwaWVuYSBlIHByb2R1dHRpdmEgZSB1biBsYXZvcm8gZGlnbml0b3NvIHBlciB0dXR0aSoqIi4gSSBwcm9ncmVzc2kgdmVyc28gZ2xpIG9iaWV0dGl2aSBzb25vIG1pc3VyYXRpLCBtb25pdG9yYXRpIGUgdmFsdXRhdGkgZGEgMTcgaW5kaWNhdG9yaS4KCkwnU0RHIDggaGEgZG9kaWNpIHRhcmdldCAobyBvYmlldHRpdmkpIGluIHRvdGFsZSBkYSByYWdnaXVuZ2VyZSBlbnRybyBpbCAyMDMwLiBBbGN1bmkgb2JpZXR0aXZpIHNvbm8gcGVyIGlsIDIwMzA7IGFsdHJpIGVyYW5vIHBlciBpbCAyMDIwLiBJIHByaW1pIGRpZWNpIHNvbm8gIm9iaWV0dGl2aSBmaW5hbGkiLiBRdWVzdGkgc29ubzogY3Jlc2NpdGEgZWNvbm9taWNhIHNvc3RlbmliaWxlOyBkaXZlcnNpZmljYXJlLCBpbm5vdmFyZSBlIG1pZ2xpb3JhcmUgcGVyIGxhIHByb2R1dHRpdml0w6AgZWNvbm9taWNhOyBwcm9tdW92ZXJlIHBvbGl0aWNoZSBhIHNvc3RlZ25vIGRlbGxhIGNyZWF6aW9uZSBkaSBwb3N0aSBkaSBsYXZvcm8gZSBkZWxsZSBpbXByZXNlIGluIGNyZXNjaXRhOyBtaWdsaW9yYXJlIGwnZWZmaWNpZW56YSBkZWxsZSByaXNvcnNlIG5lbCBjb25zdW1vIGUgbmVsbGEgcHJvZHV6aW9uZTsgcGllbmEgb2NjdXBhemlvbmUgZSBsYXZvcm8gZGlnbml0b3NvIGEgcGFyaXTDoCBkaSByZXRyaWJ1emlvbmU7IHByb211b3ZlcmUgbCdvY2N1cGF6aW9uZSBnaW92YW5pbGUsIGwnaXN0cnV6aW9uZSBlIGxhIGZvcm1hemlvbmU7IHBvcnJlIGZpbmUgYWxsYSBzY2hpYXZpdMO5IG1vZGVybmEsIGFsbGEgdHJhdHRhIGUgYWwgbGF2b3JvIG1pbm9yaWxlOyBwcm90ZWdnZXJlIGkgZGlyaXR0aSBkZWkgbGF2b3JhdG9yaSBlIHByb211b3ZlcmUgYW1iaWVudGkgZGkgbGF2b3JvIHNpY3VyaTsgcHJvbXVvdmVyZSB1biB0dXJpc21vIGJlbmVmaWNvIGUgc29zdGVuaWJpbGU7IGFjY2Vzc28gdW5pdmVyc2FsZSBhaSBzZXJ2aXppIGJhbmNhcmksIGFzc2ljdXJhdGl2aSBlIGZpbmFuemlhcmkuIElub2x0cmUsIGNpIHNvbm8gYW5jaGUgZHVlIG9iaWV0dGl2aSBjb25zaWRlcmF0aSAibWV6emkiIHBlciByYWdnaXVuZ2VyZSBpbCBmaW5lLCBjaGUgc29ubzogYXVtZW50YXJlIGdsaSBhaXV0aSBwZXIgaWwgc29zdGVnbm8gYWwgY29tbWVyY2lvOyBzdmlsdXBwYXJlIHVuYSBzdHJhdGVnaWEgZ2xvYmFsZSBwZXIgbCdvY2N1cGF6aW9uZSBnaW92YW5pbGUuCgpRdWVzdG8gb2JpZXR0aXZvIG1pcmEgYSBnYXJhbnRpcmUgY2hlIGlsIHNldHRvcmUgZWNvbm9taWNvIGRpIG9nbmkgcGFlc2UgZm9ybmlzY2EgaWwgbmVjZXNzYXJpbyBiaXNvZ25vIHBlciBpIHN1b2kgY2l0dGFkaW5pIGRpIGF2ZXJlIHVuYSBidW9uYSB2aXRhIGluZGlwZW5kZW50ZW1lbnRlIGRhbCBsb3JvIGJhY2tncm91bmQsIHJhenphIG8gY3VsdHVyYS4gQ2lyY2EgbGEgbWV0w6AgZGVsbGEgcG9wb2xhemlvbmUgbW9uZGlhbGUgdml2ZSBhbmNvcmEgY29uIGwnZXF1aXZhbGVudGUgZGkgY2lyY2EgMiBkb2xsYXJpIGFsIGdpb3Juby4gSW4gbW9sdGkgbHVvZ2hpLCBhdmVyZSB1biBsYXZvcm8gbm9uIGdhcmFudGlzY2UgbGEgcG9zc2liaWxpdMOgIGRpIHVzY2lyZSBkYWxsYSBwb3ZlcnTDoC4gUXVlc3RvIHByb2dyZXNzbyBsZW50byBlIGRpc2VndWFsZSBwb3RyZWJiZSByaWNoaWVkZXJlIGEgdHV0dGkgZGkgcmlwZW5zYXJlIGUgcmlvcmdhbml6emFyZSBsZSBwb2xpdGljaGUgZWNvbm9taWNoZSBlIHNvY2lhbGkgdm9sdGUgYSBzcmFkaWNhcmUgbGEgcG92ZXJ0w6AuCgpVbHRlcmlvcmkgaW5mb3JtYXppb25pIHN1bGwnU0RHIDggc2kgcG9zc29ubyB0cm92YXJlIFtjbGljY2FuZG8gcXVpXShodHRwczovL3NkZ3MudW4ub3JnL2dvYWxzL2dvYWw4KS4KCioqTWFwcGEgSW50ZXJhdHRpdmEqKgoKYGBge3J9Cm1hcHBhX3F1YXR0cm8kcG9wdXB0ZXh0OCA8LSBpZmVsc2UoaXMubmEobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDhgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgOGAgPiAxMDAwMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA4YC8xMDAwMDAwLCAyKSwgIiBtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgOGAvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsOCA8LSBjb2xvck51bWVyaWMoCiAgcGFsZXR0ZSA9IGNvbG9yUmFtcFBhbGV0dGUoYygnd2hpdGUnLCAnIzhGMTgyRScpKShsZW5ndGgoaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgOGApKSwgCiAgZG9tYWluID0gaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgOGApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsOChgSW1wYXR0byBHb2FsIDhgKSwKICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAicmVkIiwgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpbmdUb0Zyb250ID0gVFJVRSksCiAgICAgICAgICAgIHBvcHVwID0gfnBvcHVwdGV4dDgsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsOCwgCiAgICAgICAgICAgIHZhbHVlcyA9IG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA4YCwKICAgICAgICAgICAgdGl0bGUgPSAiSW1wYXR0byBzdWwgR29hbCA4IiwKICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQocHJlZml4ID0gIiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiIG1pbGlvbmkgZGkg4oKsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24gKHgpIHgvMTAwMDAwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5sYWJlbCA9ICJOZXNzdW4gSW52ZXN0LiIpIAogICAKYGBgCgoqKkNvbW1lbnRvOioqICAKSWwgR29hbCA4IHJpY2V2ZSBpbCA1LjQxJSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDg3LDcyMyw3MDMuMDbigqwuIERlaSAyNTkgQ29tdW5pIGNvaW52b2x0aSBuZWkgUGlhbmkgZGkgUmljb3N0cnV6aW9uZSwgMTk3IGludmVzdG9ubyBuZWwgR29hbCA4LgoKSWwgR29hbCA4IMOoIHNvc3BpbnRvIGRhZ2xpIGludmVzdGltZW50aSBuZWxsZSBTY3VvbGUsIG5lbGxlIEF0dGl2aXTDoCBQcm9kdXR0aXZlIGUgbmVpIEJlbmkgQ3VsdHVyYWxpLiAgCk1lbnRyZSBsZSBTY3VvbGUgZSBsZSBBdHRpdml0w6AgUHJvZHV0dGl2ZSBzb2RkaXNmYW5vIGkgdGFyZ2V0IGNoZSBwcm9tdW92b25vIGwnb2NjdXBhemlvbmUgZ2lvdmFuaWxlLCBsJ2lzdHJ1emlvbmUgZSBsYSBmb3JtYXppb25lLCBlIGxhIGRpdmVyc2lmaWNhemlvbmUsIGwnaW5ub3ZhemlvbmUgZSBsJ2FnZ2lvcm5hbWVudG8gIGRlbGxhIHByb2R1dHRpdml0w6AgZWNvbm9taWNhLCBpIEJlbmkgQ3VsdHVyYWxpIGZhdm9yaXNjb25vIGxhIHByb21vemlvbmUgZGkgdW4gdHVyaXNtbyBzb3N0ZW5pYmlsZSBjaGUgYmVuZWZpY2kgbGUgem9uZSBjb2xwaXRlIGRhbCBzaXNtYS4KCl9fXwoKIyMgR29hbCA5Cgo8ZGl2IHN0eWxlPSAiZmxvYXQ6bGVmdDtwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMHB4OyBwYWRkaW5nLXJpZ2h0OiAzMHB4Ij4KYGBge3IsIG91dC53aWR0aCA9ICI0MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0vQ0lUSTRHUkVFTi9zZGc5LnBuZyIpCmBgYAo8L2Rpdj4KCkwnT2JpZXR0aXZvIGRpIFN2aWx1cHBvIFNvc3RlbmliaWxlIDkgKE9iaWV0dGl2byA5KSByaWd1YXJkYSAiKipsJ2luZHVzdHJpYSwgbCdpbm5vdmF6aW9uZSBlIGxlIGluZnJhc3RydXR0dXJlKioiLiBNaXJhIGEgY29zdHJ1aXJlIGluZnJhc3RydXR0dXJlIHJlc2lsaWVudGksIHByb211b3ZlcmUgbCdpbmR1c3RyaWFsaXp6YXppb25lIHNvc3RlbmliaWxlIGUgZmF2b3JpcmUgbCdpbm5vdmF6aW9uZS4KCkwnU0RHIDkgaGEgb3R0byB0YXJnZXQgZSBpIHByb2dyZXNzaSBzb25vIG1pc3VyYXRpIGRhIGRvZGljaSBpbmRpY2F0b3JpLiBJIHByaW1pIGNpbnF1ZSBvYmlldHRpdmkgc29ubyAib2JpZXR0aXZpIGZpbmFsaSI6IHN2aWx1cHBhcmUgaW5mcmFzdHJ1dHR1cmUgc29zdGVuaWJpbGksIHJlc2lsaWVudGkgZSBpbmNsdXNpdmU7IHByb211b3ZlcmUgdW4naW5kdXN0cmlhbGl6emF6aW9uZSBpbmNsdXNpdmEgZSBzb3N0ZW5pYmlsZTsgYXVtZW50YXJlIGwnYWNjZXNzbyBhaSBzZXJ2aXppIGUgYWkgbWVyY2F0aSBmaW5hbnppYXJpOyBhZ2dpb3JuYXJlIHR1dHRlIGxlIGluZHVzdHJpZSBlIGxlIGluZnJhc3RydXR0dXJlIHBlciBsYSBzb3N0ZW5pYmlsaXTDoDsgcG90ZW56aWFyZSBsYSByaWNlcmNhIGUgYWdnaW9ybmFyZSBsZSB0ZWNub2xvZ2llIGluZHVzdHJpYWxpLiBJIHJlc3RhbnRpIHRyZSB0YXJnZXQgc29ubyAibWV6emkgcGVyIHJhZ2dpdW5nZXJlIiBvYmlldHRpdmk6IEZhY2lsaXRhcmUgbG8gc3ZpbHVwcG8gZGkgaW5mcmFzdHJ1dHR1cmUgc29zdGVuaWJpbGkgcGVyIGkgcGFlc2kgaW4gdmlhIGRpIHN2aWx1cHBvOyBzb3N0ZW5lcmUgbG8gc3ZpbHVwcG8gdGVjbm9sb2dpY28gbmF6aW9uYWxlIGUgbGEgZGl2ZXJzaWZpY2F6aW9uZSBpbmR1c3RyaWFsZTsgYWNjZXNzbyB1bml2ZXJzYWxlIGFsbGUgdGVjbm9sb2dpZSBkZWxsJ2luZm9ybWF6aW9uZSBlIGRlbGxhIGNvbXVuaWNhemlvbmUuCgpMJ29iaWV0dGl2byBoYSBpbnRlcmNvbm5lc3Npb25pIGNvbiBhbHRyaSBTREdzLiBNZW50cmUgbCdpbmR1c3RyaWFsaXp6YXppb25lIMOoIGNvbGxlZ2F0YSBhbGwnU0RHIDggKGxhdm9ybyBkaWduaXRvc28gZSBjcmVzY2l0YSBlY29ub21pY2EpIGUgYWxsJ1NERyAxMSAoY2l0dMOgIGUgY29tdW5pdMOgIHNvc3RlbmliaWxpKSwgbCdpbm5vdmF6aW9uZSBlIGxvIHN2aWx1cHBvIGRpIG51b3ZlIGNvbXBldGVuemUgYWl1dGVyYW5ubyBhIHJlYWxpenphcmUgbCdTREcgMiAoZmFtZSB6ZXJvKSwgbCdTREcgNiAoYWNxdWEgcHVsaXRhIGUgc2Vydml6aSBpZ2llbmljby1zYW5pdGFyaSksIGwnU0RHIDcgKGVuZXJnaWEgYWNjZXNzaWJpbGUgZSBwdWxpdGEpIGUgU0RHIDExIChjaXR0w6AgZSBjb211bml0w6Agc29zdGVuaWJpbGkpLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyA5IHNpIHBvc3Nvbm8gdHJvdmFyZSBbY2xpY2NhbmRvIHF1aV0oaHR0cHM6Ly9zZGdzLnVuLm9yZy9nb2Fscy9nb2FsOSkuCgoqKk1hcHBhIEludGVyYXR0aXZhKioKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDkgPC0gaWZlbHNlKGlzLm5hKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCA5YCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVzc3VuIEludmVzdGltZW50byIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDlgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgOWAvMTAwMDAwMCwgMiksICIgbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDlgLzEwMDAsIDIpLCAiIG1pbGEiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCmBgYAoKYGBge3J9CnBhbDkgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyNGMzZEMjUnKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDlgKSksIAogIGRvbWFpbiA9IGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDlgKQpgYGAKCmBgYHtyfQpsZWFmbGV0KGhlaWdodD03NzAsIHdpZHRoPTc3MCkgJT4lCiAgc2V0VmlldyhsbmcgPSAxMi45OTU4MzksIGxhdCA9IDQyLjU0OTU1MCwgem9vbSA9IDgpICU+JQogIAogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuRGFya01hdHRlck5vTGFiZWxzKSAlPiUKICAKICBhZGRQb2x5Z29ucyhkYXRhID0gbWFwcGFfcXVhdHRybywgCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgCiAgICAgICAgICAgIHdlaWdodCA9IDAuNSwgCiAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuMywKICAgICAgICAgICAgb3BhY2l0eSA9IDAuNywgCiAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMSwKICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbDkoYEltcGF0dG8gR29hbCA5YCksCiAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gInJlZCIsIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLAogICAgICAgICAgICBwb3B1cCA9IH5wb3B1cHRleHQ5LAogICAgICAgICAgICBsYWJlbCA9IH5odG1sRXNjYXBlKGFzLmNoYXJhY3RlcihOQU1FXzMpKSkgJT4lCiAgCiAgYWRkTGVnZW5kKHBvc2l0aW9uID0gInRvcHJpZ2h0IiwgCiAgICAgICAgICAgIHBhbCA9IHBhbDksIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgOWAsCiAgICAgICAgICAgIHRpdGxlID0gIkltcGF0dG8gc3VsIEdvYWwgOSIsCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHByZWZpeCA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIiBtaWxpb25pIGRpIOKCrCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZ1bmN0aW9uICh4KSB4LzEwMDAwMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEubGFiZWwgPSAiTmVzc3VuIEludmVzdC4iKSAKICAgCmBgYAoKKipDb21tZW50bzoqKiAgCklsIEdvYWwgOSByaWNldmUgbCcxLjE4JSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDE5LDE0MCwyMTUuODPigqwuIERlaSAyNTkgQ29tdW5pIGNvaW52b2x0aSBuZWkgUGlhbmkgZGkgUmljb3N0cnV6aW9uZSwgMTkwIGludmVzdG9ubyBuZWwgR29hbCA5LgoKSWwgR29hbCA5IMOoIHBlciBsbyBwacO5IGltcGF0dGF0byBkYWxsZSBvcGVyZSBkaSBVcmJhbml6emF6aW9uZS4gR2xpIGludGVydmVudGkgYXBwYXJ0ZW5lbnRpIGEgcXVlc3RhIGNhdGVnb3JpYSwgaW5mYXR0aSwgc29kZGlzZmFubyBhbCAxMDAlIGlsIHByaW1vIHRhcmdldCBkZWwgR29hbCA5OiBTdmlsdXBwYXJlIGluZnJhc3RydXR0dXJlIHNvc3RlbmliaWxpLCByZXNpbGllbnRpIGUgaW5jbHVzaXZlLgoKX19fCgojIyBHb2FsIDEwCgo8ZGl2IHN0eWxlPSAiZmxvYXQ6bGVmdDtwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMHB4OyBwYWRkaW5nLXJpZ2h0OiAzMHB4Ij4KYGBge3IsIG91dC53aWR0aCA9ICI0MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0vQ0lUSTRHUkVFTi9zZGcxMC5wbmciKQpgYGAKPC9kaXY+CgpMJ09iaWV0dGl2byBkaSBTdmlsdXBwbyBTb3N0ZW5pYmlsZSAxMCAoU0RHIDEwKSByaWd1YXJkYSBsYSByaWR1emlvbmUgZGVsbGEgZGlzdWd1YWdsaWFuemEuIElsIHRpdG9sbyBjb21wbGV0byDDqDogIioqUmlkdXJyZSBsYSBkaXN1Z3VhZ2xpYW56YSBhbGwnaW50ZXJubyBlIHRyYSBpIHBhZXNpKioiLgoKTCdvYmlldHRpdm8gaGEgZGllY2kgdGFyZ2V0IGRhIHJhZ2dpdW5nZXJlIGVudHJvIGlsIDIwMzAuIEkgcHJpbWkgc2V0dGUgb2JpZXR0aXZpIHNvbm8gIm9iaWV0dGl2aSBmaW5hbGkiOiByaWR1cnJlIGxlIGRpc3VndWFnbGlhbnplIGRpIHJlZGRpdG87IHByb211b3ZlcmUgbCdpbmNsdXNpb25lIHNvY2lhbGUsIGVjb25vbWljYSBlIHBvbGl0aWNhIHVuaXZlcnNhbGU7IGdhcmFudGlyZSBwYXJpIG9wcG9ydHVuaXTDoCBlIHBvcnJlIGZpbmUgYWxsYSBkaXNjcmltaW5hemlvbmU7IGFkb3R0YXJlIHBvbGl0aWNoZSBmaXNjYWxpIGUgc29jaWFsaSBjaGUgcHJvbXVvdmFubyBsJ3VndWFnbGlhbnphOyB1bmEgbWlnbGlvcmUgcmVnb2xhbWVudGF6aW9uZSBkZWkgbWVyY2F0aSBmaW5hbnppYXJpIGdsb2JhbGkgZSBkZWxsZSBpc3RpdHV6aW9uaTsgdW5hIG1hZ2dpb3JlIHJhcHByZXNlbnRhbnphIGRlaSBwYWVzaSBpbiB2aWEgZGkgc3ZpbHVwcG8gbmVsbGUgaXN0aXR1emlvbmkgZmluYW56aWFyaWU7IHBvbGl0aWNoZSBtaWdyYXRvcmllIHJlc3BvbnNhYmlsaSBlIGJlbiBnZXN0aXRlLiBHbGkgYWx0cmkgdHJlIG9iaWV0dGl2aSBzb25vIG9iaWV0dGl2aSB2aXN0aSBjb21lICJtZXp6aSBkaSByYWdnaXVuZ2ltZW50byI6IHRyYXR0YW1lbnRvIHNwZWNpYWxlIGUgZGlmZmVyZW56aWF0byBwZXIgaSBwYWVzaSBpbiB2aWEgZGkgc3ZpbHVwcG87IGluY29yYWdnaWFyZSBsJ2Fzc2lzdGVuemEgYWxsbyBzdmlsdXBwbyBlIGdsaSBpbnZlc3RpbWVudGkgbmVpIHBhZXNpIG1lbm8gc3ZpbHVwcGF0aTsgcmlkdXJyZSBpIGNvc3RpIGRpIHRyYW5zYXppb25lIHBlciBsZSByaW1lc3NlIGRlaSBtaWdyYW50aS4KCkwnb2JpZXR0aXZvIDEwLjEgw6ggInNvc3RlbmVyZSBsYSBjcmVzY2l0YSBkZWwgcmVkZGl0byBkZWwgNDAlIHBpw7kgcG92ZXJvIGRlbGxhIHBvcG9sYXppb25lIGEgdW4gdGFzc28gc3VwZXJpb3JlIGFsbGEgbWVkaWEgbmF6aW9uYWxlIi4gUXVlc3RvIG9iaWV0dGl2bywgbm90byBjb21lICJwcm9zcGVyaXTDoCBjb25kaXZpc2EiLCDDqCBjb21wbGVtZW50YXJlIGFsbCdTREcgMSwgbCdlbGltaW5hemlvbmUgZGVsbGEgcG92ZXJ0w6AgZXN0cmVtYSwgZWQgw6ggcmlsZXZhbnRlIHBlciB0dXR0aSBpIHBhZXNpIGRlbCBtb25kby4KClVsdGVyaW9yaSBpbmZvcm1hemlvbmkgc3VsbCdTREcgMTAgc2kgcG9zc29ubyB0cm92YXJlIFtjbGljY2FuZG8gcXVpXShodHRwczovL3NkZ3MudW4ub3JnL2dvYWxzL2dvYWwxMCkuCgoqKk1hcHBhIEludGVyYXR0aXZhKioKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDEwIDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTBgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTBgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTBgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxMGAvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsMTAgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyNERDEzNjcnKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDEwYCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAxMGApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMTAoYEltcGF0dG8gR29hbCAxMGApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0MTAsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMTAsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTBgLAogICAgICAgICAgICB0aXRsZSA9ICJJbXBhdHRvIEdvYWwgMTAiLAogICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChwcmVmaXggPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIgbWlsaW9uaSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDEwIHJpY2V2ZSBpbCA0LjMxJSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDY5LDg4OSw4MzkuNzPigqwuIERlaSAyNTkgQ29tdW5pIGNvaW52b2x0aSBuZWkgUGlhbmkgZGkgUmljb3N0cnV6aW9uZSwgMTcxIGludmVzdG9ubyBuZWwgR29hbCAxMC4KCklsIEdvYWwgMTAgw6ggcGVyIGxvIHBpw7kgc29zcGludG8gZGFnbGkgaW52ZXN0aW1lbnRpIHN1bGxlIFNjdW9sZS4gUXVlc3RhIGNhdGVnb3JpYSwgaW5mYXR0aSwgY29udHJpYnVpc2NlIGFsbGEgcmVhbGl6emF6aW9uZSBkZWwgVGFyZ2V0IDEwLjI6ICJQcm9tdW92ZXJlIGwnaW5jbHVzaW9uZSBzb2NpYWxlLCBlY29ub21pY2EgZSBwb2xpdGljYSB1bml2ZXJzYWxlLiIKCl9fXwoKIyMgR29hbCAxMQoKPGRpdiBzdHlsZT0gImZsb2F0OmxlZnQ7cG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDBweDsgcGFkZGluZy1yaWdodDogMzBweCI+CmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vc2RnMTEucG5nIikKYGBgCjwvZGl2PgoKTCdPYmlldHRpdm8gZGkgU3ZpbHVwcG8gU29zdGVuaWJpbGUgMTEgKFNERyAxMSkgcmlndWFyZGEgImNpdHTDoCBlIGNvbXVuaXTDoCBzb3N0ZW5pYmlsaSIuIEwnU0RHIDExIMOoICIqKlJlbmRlcmUgbGUgY2l0dMOgIGluY2x1c2l2ZSwgc2ljdXJlLCByZXNpbGllbnRpIGUgc29zdGVuaWJpbGkqKiIuCgpMJ1NERyAxMSBoYSAxMCB0YXJnZXQgZGEgcmFnZ2l1bmdlcmUgZSBxdWVzdG8gdmllbmUgbWlzdXJhdG8gY29uIDE1IGluZGljYXRvcmkuIEkgc2V0dGUgIm9iaWV0dGl2aSBmaW5hbGkiIGluY2x1ZG9ubzogYWxsb2dnaSBzaWN1cmkgZSBjb252ZW5pZW50aSwgc2lzdGVtaSBkaSB0cmFzcG9ydG8gY29udmVuaWVudGkgZSBzb3N0ZW5pYmlsaTsgdXJiYW5penphemlvbmUgaW5jbHVzaXZhIGUgc29zdGVuaWJpbGU7IHByb3RlZ2dlcmUgaWwgcGF0cmltb25pbyBjdWx0dXJhbGUgZSBuYXR1cmFsZSBtb25kaWFsZTsgcmlkdXJyZSBnbGkgZWZmZXR0aSBuZWdhdGl2aSBkZWkgZGlzYXN0cmkgbmF0dXJhbGk7IHJpZHVycmUgZ2xpIGltcGF0dGkgYW1iaWVudGFsaSBkZWxsZSBjaXR0w6A7IGZvcm5pcmUgYWNjZXNzbyBhIHNwYXppIHZlcmRpIGUgcHViYmxpY2kgc2ljdXJpIGUgaW5jbHVzaXZpLiBJIHRyZSB0YXJnZXQgdmlzdGkgY29tZSAibWV6emkgcGVyIHJhZ2dpdW5nZXJlIiBnbGkgb2JpZXR0aXZpIGluY2x1ZG9ubzogdW5hIGZvcnRlIHBpYW5pZmljYXppb25lIGRlbGxvIHN2aWx1cHBvIG5hemlvbmFsZSBlIHJlZ2lvbmFsZTsgYXR0dWFyZSBwb2xpdGljaGUgcGVyIGwnaW5jbHVzaW9uZSwgbCdlZmZpY2llbnphIGRlbGxlIHJpc29yc2UgZSBsYSByaWR1emlvbmUgZGVsIHJpc2NoaW8gZGkgY2F0YXN0cm9maTsgc29zdGVuZXJlIGkgcGFlc2kgbWVubyBzdmlsdXBwYXRpIG5lbGwnZWRpbGl6aWEgc29zdGVuaWJpbGUgZSByZXNpbGllbnRlLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyAxMSBzaSBwb3Nzb25vIHRyb3ZhcmUgW2NsaWNjYW5kbyBxdWldKGh0dHBzOi8vc2Rncy51bi5vcmcvZ29hbHMvZ29hbDExKS4KCiZuYnNwOwombmJzcDsKJm5ic3A7CiZuYnNwOyAgCiZuYnNwOyAgCiZuYnNwOyAgCiZuYnNwOyAgCgoqKk1hcHBhIEludGVyYXR0aXZhKioKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDExIDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTFgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTFgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTFgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxMWAvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsMTEgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyNGOTlEMjYnKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDExYCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAxMWApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMTEoYEltcGF0dG8gR29hbCAxMWApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0MTEsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMTEsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTFgLAogICAgICAgICAgICB0aXRsZSA9ICJJbXBhdHRvIEdvYWwgMTEiLAogICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChwcmVmaXggPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIgbWlsaW9uaSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDExIHJpY2V2ZSBpbCAxOS44MSUgZGVpIGZpbmFuemlhbWVudGkgcGVyIHVuIHRvdGFsZSBkaSAzMjEsMjkwLDY1OS44OOKCrC4gRGVpIDI1OSBDb211bmkgY29pbnZvbHRpIG5laSBQaWFuaSBkaSBSaWNvc3RydXppb25lLCAyNTQsIGlsIDk4JSBkZWwgdG90YWxlLCBpbnZlc3Rvbm8gbmVsIEdvYWwgMTEuCgpJbCBHb2FsIDExIMOoIHByaW5jaXBhbG1lbnRlIGltcGF0dGF0byBkYWxsZSBjYXRlZ29yaWUgRWRpbGl6aWEsIERpc3Nlc3RvIElkcm9nZW9sb2dpY28sIGUgQmVuaSBDdWx0dXJhbGkuIFF1ZXN0bywgaW5mYXR0aSwgaGEgYWwgc3VvIGludGVybm8gaWwgdGFyZ2V0IDExLjEg4oCcRW50cm8gaWwgMjAzMCwgZ2FyYW50aXJlIGEgdHV0dGkgbOKAmWFjY2Vzc28gYWQgYWxsb2dnaSBhZGVndWF0aSwgc2ljdXJpIGUgY29udmVuaWVudGkgZSBhaSBzZXJ2aXppIGRpIGJhc2UgZSByaXF1YWxpZmljYXJlIGkgcXVhcnRpZXJpIHBvdmVyaeKAnSBhIGN1aSBjb250cmlidWlzY29ubyBnbGkgaW50ZXJ2ZW50aSBwZXIgbGEgY29zdHJ1emlvbmUgZSByaWNvc3RydXppb25lIGRpIGNhc2UgcG9wb2xhcmkgc290dG8gbGEgY2F0ZWdvcmlhIEVkaWxpemlhKS4gSW5vbHRyZSwgaWwgdGFyZ2V0IDExLjQg4oCcUG90ZW56aWFyZSBnbGkgc2ZvcnppIHBlciBwcm90ZWdnZXJlIGUgc2FsdmFndWFyZGFyZSBpbCBwYXRyaW1vbmlvIGN1bHR1cmFsZSBlIG5hdHVyYWxlIGRlbCBtb25kb+KAnSB2aWVuZSBpbXBhdHRhdG8gZGFsIDk3JSBkZWdsaSBpbnRlcnZlbnRpIHRvdGFsaTogZGEgdW5hIHBhcnRlLCBnbGkgaW50ZXJ2ZW50aSBhbGzigJlpbnRlcm5vIGRlbGxhIGNhdGVnb3JpYSBCZW5pIEN1bHR1cmFsaSBzb2RkaXNmYW5vIGxhIGNvbXBvbmVudGUgZGkgc2FsdmFndWFyZGlhIGRlbCBwYXRyaW1vbmlvIGN1bHR1cmFsZSBkZWwgdGFyZ2V0IGluIHF1ZXN0aW9uZTsgZGFsbOKAmWFsdHJhLCBnbGkgaW50ZXJ2ZW50aSBkaSDigJxEaXNzZXN0byBJZHJvZ2VvbG9naWNvLCBSaXNvcnNlIElkcmljaGXigJ0gY29pbnZvbGdvbm8gbOKAmWFzcGV0dG8gZGkgcHJvdGV6aW9uZSBuZWkgY29uZnJvbnRpIGRlbCBwYXRyaW1vbmlvIG5hdHVyYWxlIHByZXNlbnRlIG5lbCB0YXJnZXQuICAKCl9fXwoKIyMgR29hbCAxMgoKPGRpdiBzdHlsZT0gImZsb2F0OmxlZnQ7cG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDBweDsgcGFkZGluZy1yaWdodDogMzBweCI+CmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vc2RnMTIucG5nIikKYGBgCjwvZGl2PgoKTCdvYmlldHRpdm8gMTIgZGkgc3ZpbHVwcG8gc29zdGVuaWJpbGUgKFNERyAxMiksIGludGl0b2xhdG8gIioqR2FyYW50aXJlIG1vZGVsbGkgZGkgY29uc3VtbyBlIHByb2R1emlvbmUgc29zdGVuaWJpbGkqKiIsIMOoIGludGVzbyBhIGdhcmFudGlyZSB1biBidW9uIHVzbyBkZWxsZSByaXNvcnNlLCBtaWdsaW9yYXJlIGwnZWZmaWNpZW56YSBlbmVyZ2V0aWNhLCBpbmZyYXN0cnV0dHVyZSBzb3N0ZW5pYmlsaSBlIGZvcm5pcmUgYWNjZXNzbyBhaSBzZXJ2aXppIGRpIGJhc2UsIHBvc3RpIGRpIGxhdm9ybyB2ZXJkaSBlIGRpZ25pdG9zaSBlIGdhcmFudGlyZSB1bmEgbWlnbGlvcmUgcXVhbGl0w6AgZGVsbGEgdml0YSBwZXIgdHV0dGkuIEwnU0RHIDEyIGhhIDExIHRhcmVnZXQgZGEgcmFnZ2l1bmdlcmUgYWxtZW5vIGVudHJvIGlsIDIwMzAuCgpJIHByaW1pIDggc29ubyAib2JpZXR0aXZpIGZpbmFsaSIsIGNoZSBzb25vOiBhdHR1YXJlIGlsIHF1YWRybyBkZWNlbm5hbGUgZGVpIHByb2dyYW1taSBzdWkgbW9kZWxsaSBkaSBjb25zdW1vIGUgcHJvZHV6aW9uZSBzb3N0ZW5pYmlsaTsgcmFnZ2l1bmdlcmUgbGEgZ2VzdGlvbmUgc29zdGVuaWJpbGUgZSBsJ3VzbyBlZmZpY2llbnRlIGRlbGxlIHJpc29yc2UgbmF0dXJhbGk7IGxhIHJpZHV6aW9uZSBkZWxsYSBtZXTDoCBkZWxsbyBzcHJlY28gYWxpbWVudGFyZSBnbG9iYWxlIHBybyBjYXBpdGUgYSBsaXZlbGxvIGRpIHZlbmRpdGEgYWwgZGV0dGFnbGlvIGUgZGkgY29uc3VtbyBlIGxhIHJpZHV6aW9uZSBkZWxsZSBwZXJkaXRlIGFsaW1lbnRhcmkgbHVuZ28gbGUgY2F0ZW5lIGRpIHByb2R1emlvbmUgZSBmb3JuaXR1cmEsIGNvbXByZXNlIGxlIHBlcmRpdGUgcG9zdC1yYWNjb2x0YTsgcmFnZ2l1bmdlcmUgdW5hIGdlc3Rpb25lIGVjb2xvZ2ljYW1lbnRlIGNvcnJldHRhIGRlbGxlIHNvc3RhbnplIGNoaW1pY2hlIGUgZGkgdHV0dGkgaSByaWZpdXRpIGR1cmFudGUgdHV0dG8gaWwgbG9ybyBjaWNsbyBkaSB2aXRhOyByaWR1cnJlIGxhIHByb2R1emlvbmUgZGkgcmlmaXV0aSBhdHRyYXZlcnNvIGxhIHByZXZlbnppb25lLCBsYSByaWR1emlvbmUsIGlsIHJpY2ljbGFnZ2lvIGUgaWwgcml1dGlsaXp6bzsgaW5jb3JhZ2dpYXJlIGxlIGF6aWVuZGUgYWQgYWRvdHRhcmUgcHJhdGljaGUgc29zdGVuaWJpbGk7IHByb211b3ZlcmUgcHJhdGljaGUgZGkgYXBwYWx0aSBwdWJibGljaSBzb3N0ZW5pYmlsaTsgZSBnYXJhbnRpcmUgY2hlIGxlIHBlcnNvbmUgaW4gdHV0dG8gaWwgbW9uZG8gYWJiaWFubyBsZSBpbmZvcm1hemlvbmkgZSBsYSBjb25zYXBldm9sZXp6YSBwZXJ0aW5lbnRpIHBlciBsbyBzdmlsdXBwbyBzb3N0ZW5pYmlsZS4KCkkgdHJlIG9iaWV0dGl2aSAibWV6emkgZGkgcmFnZ2l1bmdpbWVudG8iIHNvbm86IHNvc3RlbmVyZSBpIHBhZXNpIGluIHZpYSBkaSBzdmlsdXBwbyBwZXIgcmFmZm9yemFyZSBsYSBsb3JvIGNhcGFjaXTDoCBzY2llbnRpZmljYSBlIHRlY25vbG9naWNhOyBzdmlsdXBwYXJlIGUgaW1wbGVtZW50YXJlIHN0cnVtZW50aSBwZXIgbW9uaXRvcmFyZSBnbGkgaW1wYXR0aSBkZWxsbyBzdmlsdXBwbyBzb3N0ZW5pYmlsZTsgZSByaW11b3ZlcmUgbGUgZGlzdG9yc2lvbmkgZGVsIG1lcmNhdG8sIGNvbWUgaSBzdXNzaWRpIGFpIGNvbWJ1c3RpYmlsaSBmb3NzaWxpLCBjaGUgaW5jb3JhZ2dpYW5vIGxvIHNwcmVjby4KClVsdGVyaW9yaSBpbmZvcm1hemlvbmkgc3VsbCdTREcgMTIgc2kgcG9zc29ubyB0cm92YXJlIFtjbGljY2FuZG8gcXVpXShodHRwczovL3NkZ3MudW4ub3JnL2dvYWxzL2dvYWwxMikuCgoqKk1hcHBhIEludGVyYXR0aXZhKioKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDEyIDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTJgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTJgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTJgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxMmAvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsMTIgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyNEMDhFMjYnKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDEyYCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAxMmApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMTIoYEltcGF0dG8gR29hbCAxMmApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0MTIsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMTIsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTJgLAogICAgICAgICAgICB0aXRsZSA9ICJJbXBhdHRvIEdvYWwgMTIiLAogICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChwcmVmaXggPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIgbWlsaW9uaSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDEyIHJpY2V2ZSBpbCAzLjg5JSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDYzLDAzMiw1OTMuMzPigqwuIERlaSAyNTkgQ29tdW5pIGNvaW52b2x0aSBuZWkgUGlhbmkgZGkgUmljb3N0cnV6aW9uZSwgMjI2LCBsJzg3JSBkZWwgdG90YWxlLCBpbnZlc3Rvbm8gbmVsIEdvYWwgMTIuCgpJbCBHb2FsIDEyIHZpZW5lIHByaW5jaXBhbG1lbnRlIGltcGF0dGF0byBkYWdsaSBpbnRlcnZlbnRpIGFsbCdpbnRlcm5vIGRlbGxlIGNhdGVnb3JpZSBFZGlsaXppYSBlIFNjdW9sZS4gTWVudHJlIGxlIHNjdW9sZSBjb250cmlidWlzY29ubyBhbGxhIGZvcm1hemlvbmUgZGVnbGkgc3R1ZGVudGkgcmlndWFyZG8gaWwgY29uc3VtbyByZXNwb25zYWJpbGUsIGdsaSBpbnZlc3RpbWVudGkgaW4gZWRpbGl6aWEgdmFubm8gYSBpbXBhdHRhcmUgZGlyZXR0YW1lbnRlIHVuYSBkaW1pbnV6aW9uZSBkZWxsbyBzcHJlY28gZSB1bmEgbWlnbGlvciBnZXN0aW9uZSBkZWkgcmlmaXV0aSBzb2RkaXNmYW5kbyBpbCB0YXJnZXQgMTIuNTogIlJpZHVycmUgc29zdGFuemlhbG1lbnRlIGxhIHByb2R1emlvbmUgZGkgcmlmaXV0aS4iIE1hIG5vbiBzb2xvLCBsYSB0cmFzcGFyZW56YSBjb24gY3VpIHNvbm8gc3RhdGUgZWZmZXR0dWF0aSBxdWVzdGkgaW50ZXJ2ZW50aSBzb2RkaWZzYSBhIHBpZW5vIGlsIHRhcmdldCAxMi43OiAiUHJvbXVvdmVyZSBwcmF0aWNoZSBzb3N0ZW5pYmlsaSBpbiBtYXRlcmlhIGRpIGFwcGFsdGkgcHViYmxpY2kuIgoKX19fCgojIyBHb2FsIDEzCgo8ZGl2IHN0eWxlPSAiZmxvYXQ6bGVmdDtwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMHB4OyBwYWRkaW5nLXJpZ2h0OiAzMHB4Ij4KYGBge3IsIG91dC53aWR0aCA9ICI0MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvZGF2aWRldjcvRG9jdW1lbnRzL0ZFRU0vQ0lUSTRHUkVFTi9zZGcxMy5wbmciKQpgYGAKPC9kaXY+CgpMJ29iaWV0dGl2byBkaSBzdmlsdXBwbyBzb3N0ZW5pYmlsZSAxMyAoU0RHIDEzKSByaWd1YXJkYSBsJ2F6aW9uZSBwZXIgaWwgY2xpbWEuIExhIGZvcm11bGF6aW9uZSB1ZmZpY2lhbGUgw6ggIioqQWRvdHRhcmUgbWlzdXJlIHVyZ2VudGkgcGVyIGNvbWJhdHRlcmUgaWwgY2FtYmlhbWVudG8gY2xpbWF0aWNvIGUgaSBzdW9pIGltcGF0dGkqKiIuIEwnU0RHIDEzIGhhIG9iaWV0dGl2aSBjaGUgZGV2b25vIGVzc2VyZSByYWdnaXVudGkgZW50cm8gaWwgMjAzMC4KCkNpIHNvbm8gNSB0YXJnZXQgaW4gdG90YWxlLCBjaGUgY29wcm9ubyB1bidhbXBpYSBnYW1tYSBkaSBxdWVzdGlvbmkgcmVsYXRpdmUgYWxsJ2F6aW9uZSBwZXIgaWwgY2xpbWEuIEkgcHJpbWkgdHJlIG9iaWV0dGl2aSBzb25vICJvYmlldHRpdmkgZmluYWxpIjogcmFmZm9yemFyZSBsYSByZXNpbGllbnphIGUgbGEgY2FwYWNpdMOgIGRpIGFkYXR0YW1lbnRvIGFpIGRpc2FzdHJpIGxlZ2F0aSBhbCBjbGltYTsgaW50ZWdyYXJlIGxlIG1pc3VyZSBpbiBtYXRlcmlhIGRpIGNhbWJpYW1lbnRvIGNsaW1hdGljbyBuZWxsZSBwb2xpdGljaGUgZSBuZWxsYSBwaWFuaWZpY2F6aW9uZTsgY29zdHJ1aXJlIGNvbm9zY2VuemUgZSBjYXBhY2l0w6AgcGVyIGFmZnJvbnRhcmUgaWwgY2FtYmlhbWVudG8gY2xpbWF0aWNvLiBJIHJlc3RhbnRpIGR1ZSB0YXJnZXQgc29ubyAibWV6emkgcGVyIHJhZ2dpdW5nZXJlIiBnbGkgb2JpZXR0aXZpOiBhdHR1YXJlIGxhIENvbnZlbnppb25lIHF1YWRybyBkZWxsZSBOYXppb25pIFVuaXRlIHN1aSBjYW1iaWFtZW50aSBjbGltYXRpY2k7IGUgcHJvbXVvdmVyZSBtZWNjYW5pc21pIHBlciBhdW1lbnRhcmUgbGEgY2FwYWNpdMOgIGRpIHBpYW5pZmljYXppb25lIGUgZ2VzdGlvbmUuIExhIENvbnZlbnppb25lIHF1YWRybyBkZWxsZSBOYXppb25pIFVuaXRlIHN1aSBjYW1iaWFtZW50aSBjbGltYXRpY2kgKFVORkNDQykgw6ggaWwgcHJpbmNpcGFsZSBmb3J1bSBpbnRlcm5hemlvbmFsZSBpbnRlcmdvdmVybmF0aXZvIHBlciBuZWdvemlhcmUgbGEgcmlzcG9zdGEgZ2xvYmFsZSBhbCBjYW1iaWFtZW50byBjbGltYXRpY28uCgpJbCBkZWNlbm5pbyB0cmEgaWwgMjAxMCBlIGlsIDIwMTkgw6ggc3RhdG8gaWwgZGVjZW5uaW8gcGnDuSBjYWxkbyBtYWkgcmVnaXN0cmF0byBuZWxsYSBzdG9yaWEuIEF0dHVhbG1lbnRlIGlsIGNhbWJpYW1lbnRvIGNsaW1hdGljbyBzdGEgaW50ZXJlc3NhbmRvIGxhIGNvbXVuaXTDoCBnbG9iYWxlIGluIG9nbmkgbmF6aW9uZSBkZWwgbW9uZG8uIEwnaW1wYXR0byBkZWwgY2FtYmlhbWVudG8gY2xpbWF0aWNvIG5vbiBjb2xwaXNjZSBzb2xvIGxlIGVjb25vbWllIG5hemlvbmFsaSwgbWEgYW5jaGUgdml0ZSBlIG1lenppIGRpIHN1c3Npc3RlbnphLCBpbiBwYXJ0aWNvbGFyZSBxdWVsbGkgaW4gY29uZGl6aW9uaSB2dWxuZXJhYmlsaS4KClVsdGVyaW9yaSBpbmZvcm1hemlvbmkgc3VsbCdTREcgMTMgc2kgcG9zc29ubyB0cm92YXJlIFtjbGljY2FuZG8gcXVpXShodHRwczovL3NkZ3MudW4ub3JnL2dvYWxzL2dvYWwxMykuCgoqKk1hcHBhIEludGVyYXR0aXZhKioKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDEzIDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTNgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTNgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTNgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxM2AvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsMTMgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyM0ODc3M0UnKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDEzYCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAxM2ApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMTMoYEltcGF0dG8gR29hbCAxM2ApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0MTMsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMTMsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTNgLAogICAgICAgICAgICB0aXRsZSA9ICJJbXBhdHRvIEdvYWwgMTMiLAogICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChwcmVmaXggPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIgbWlsaW9uaSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDEzIHJpY2V2ZSBpbCA5LjcwJSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDE1NywyNDUsMDA5LjM54oKsLiBEZWkgMjU5IENvbXVuaSBjb2ludm9sdGkgbmVpIFBpYW5pIGRpIFJpY29zdHJ1emlvbmUsIDI1MSwgaWwgOTclIGRlbCB0b3RhbGUsIGludmVzdG9ubyBuZWwgR29hbCAxMy4KCklsIEdvYWwgMTMgw6ggdHJhaW5hdG8gcXVhbnRpdGF0aXZhbWVudGUgcHJpbmNpcGFsbWVudGUgZGFnbGkgaW50ZXJ2ZW50aSBzdWxsZSBTY3VvbGUuIExlIHNjdW9sZSwgaW5mYXR0aSwgY29udHJpYnVpc2Nvbm8gYSByYWdnaXVuZ2VyZSBpbCB0YXJnZXQgMTMuMzogIlN2aWx1cHBhcmUgY29ub3NjZW56ZSBlIGNhcGFjaXTDoCBwZXIgZmFyIGZyb250ZSBhaSBjYW1iaWFtZW50aSBjbGltYXRpY2kuIiBMJ2FsdHJhIGNhdGVnb3JpYSBkZXRlcm1pbmFudGUgcGVyIGxhICJDbGltYXRlIEFjdGlvbiIgw6ggaWwgRGlzc2VzdG8gSWRyb2dlb2xvZ2ljbywgUmlzb3JzZSBJZHJpY2hlLiBRdWVzdGkgaW50ZXJ2ZW50aSBzb2RkaXNmYW5vIGEgcGllbm8gaWwgdGFyZ2V0IDEzLjE6ICJSYWZmb3J6YXJlIGxhIHJlc2lsaWVuemEgZSBsYSBjYXBhY2l0w6AgZGkgYWRhdHRhbWVudG8gYWkgZGlzYXN0cmkgbGVnYXRpIGFsIGNsaW1hLiIgUXVlc3RpIGludGVydmVudGkgc29ubyB2b2x0aSBzaWEgYWxsYSByaWNvc3RydXppb25lIGRlbCB0ZXJyaXRvcmlvIGRhbm5lZ2dpYXRvIGNoZSBhIGRhcmUgdW5hIG1hZ2dpb3JlIHJlc2lsaWVuemEgYWxsZSBhcmVlIGNvbHBpdGUgYWZmaW5jaMOpIG5vbiB2ZW5nYW5vIGNvc8OsIGR1cmFtZW50ZSBjb2xwaXRlIGluIGNhc28gZGkgY2FsYW1pdMOgIGZ1dHVyZS4KCl9fXwoKCiMjIEdvYWwgMTQKCjxkaXYgc3R5bGU9ICJmbG9hdDpsZWZ0O3Bvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAwcHg7IHBhZGRpbmctcmlnaHQ6IDMwcHgiPgpgYGB7ciwgb3V0LndpZHRoID0gIjQwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL3NkZzE0LnBuZyIpCmBgYAo8L2Rpdj4KCkwnb2JpZXR0aXZvIGRpIHN2aWx1cHBvIHNvc3RlbmliaWxlIDE0IChTREcgMTQpIHJpZ3VhcmRhIGxhICJ2aXRhIHNvdHQnYWNxdWEiLiBMYSBmb3JtdWxhemlvbmUgdWZmaWNpYWxlIMOoICIqKkNvbnNlcnZhcmUgZSB1dGlsaXp6YXJlIGluIG1vZG8gc29zdGVuaWJpbGUgZ2xpIG9jZWFuaSwgaSBtYXJpIGUgbGUgcmlzb3JzZSBtYXJpbmUgcGVyIHVubyBzdmlsdXBwbyBzb3N0ZW5pYmlsZSoqIi4gTCdvYmlldHRpdm8gaGEgZGllY2kgb2JpZXR0aXZpIGRhIHJhZ2dpdW5nZXJlIGVudHJvIGlsIDIwMzAuCgpJIHByaW1pIHNldHRlIG9iaWV0dGl2aSBzb25vICJvYmlldHRpdmkgZGkgcmlzdWx0YXRvIjogcmlkdXJyZSBsJ2lucXVpbmFtZW50byBtYXJpbm87IHByb3RlZ2dlcmUgZSByaXByaXN0aW5hcmUgZ2xpIGVjb3Npc3RlbWk7IHJpZHVycmUgbCdhY2lkaWZpY2F6aW9uZSBkZWdsaSBvY2Vhbmk7IHBlc2NhIHNvc3RlbmliaWxlOyBjb25zZXJ2YXJlIGxlIGFyZWUgY29zdGllcmUgZSBtYXJpbmU7IHBvcnJlIGZpbmUgYWxsZSBzb3Z2ZW56aW9uaSBjaGUgY29udHJpYnVpc2Nvbm8gYWxsYSBwZXNjYSBlY2Nlc3NpdmE7IGF1bWVudGFyZSBpIGJlbmVmaWNpIGVjb25vbWljaSBkZXJpdmFudGkgZGFsbCd1c28gc29zdGVuaWJpbGUgZGVsbGUgcmlzb3JzZSBtYXJpbmUuIEdsaSB1bHRpbWkgdHJlIG9iaWV0dGl2aSBzb25vICJtZXp6aSBwZXIgcmFnZ2l1bmdlcmUiIG9iaWV0dGl2aTogYXVtZW50YXJlIGxhIGNvbm9zY2VuemEgc2NpZW50aWZpY2EsIGxhIHJpY2VyY2EgZSBsYSB0ZWNub2xvZ2lhIHBlciBsYSBzYWx1dGUgZGVnbGkgb2NlYW5pOyBzb3N0ZW5lcmUgaSBwZXNjYXRvcmkgZGkgcGljY29sYSBzY2FsYTsgYXR0dWFyZSBlIGZhciByaXNwZXR0YXJlIGlsIGRpcml0dG8gbWFyaXR0aW1vIGludGVybmF6aW9uYWxlLgoKR2xpIG9jZWFuaSBlIGxhIHBlc2NhIHN1cHBvcnRhbm8gaSBiaXNvZ25pIGVjb25vbWljaSwgc29jaWFsaSBlIGFtYmllbnRhbGkgZGVsbGEgcG9wb2xhemlvbmUgbW9uZGlhbGUuIEdsaSBvY2Vhbmkgc29ubyBsYSBmb250ZSBkZWxsYSB2aXRhIGRlbCBwaWFuZXRhIGUgaWwgcmVnb2xhdG9yZSBkZWwgc2lzdGVtYSBjbGltYXRpY28gZ2xvYmFsZS4gR2xpIG9jZWFuaSBjb3Byb25vIHBpw7kgZGkgZHVlIHRlcnppIGRlbGxhIHN1cGVyZmljaWUgdGVycmVzdHJlIGUgY29udGVuZ29ubyBpbCA5NyUgZGVsbCdhY3F1YSBkZWwgcGlhbmV0YS4gU29ubyBlc3NlbnppYWxpIHBlciByZW5kZXJlIHZpdmliaWxlIGlsIHBpYW5ldGEuIEwnYWNxdWEgcGlvdmFuYSwgbCdhY3F1YSBwb3RhYmlsZSBlIGlsIGNsaW1hIHNvbm8gdHV0dGkgcmVnb2xhdGkgZGFsbGUgdGVtcGVyYXR1cmUgZSBkYWxsZSBjb3JyZW50aSBvY2VhbmljaGUuIFR1dHRhdmlhLCBjJ8OoIHN0YXRvIHVuIGF1bWVudG8gZGVsIDI2JSBkZWxsJ2FjaWRpZmljYXppb25lIGRhbGxhIHJpdm9sdXppb25lIGluZHVzdHJpYWxlLiBTb25vIG5lY2Vzc2FyaWUgc3RyYXRlZ2llIGVmZmljYWNpIHBlciBtaXRpZ2FyZSBnbGkgZWZmZXR0aSBuZWdhdGl2aSBkZWxsJ2F1bWVudG8gZGVsbCdhY2lkaWZpY2F6aW9uZSBkZWdsaSBvY2VhbmkgcGVyIHByb211b3ZlcmUgbCd1c28gc29zdGVuaWJpbGUgZGVnbGkgb2NlYW5pLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyAxNCBzaSBwb3Nzb25vIHRyb3ZhcmUgW2NsaWNjYW5kbyBxdWldKGh0dHBzOi8vc2Rncy51bi5vcmcvZ29hbHMvZ29hbDE0KS4KCioqTWFwcGEgSW50ZXJhdHRpdmEqKgoKYGBge3J9Cm1hcHBhX3F1YXR0cm8kcG9wdXB0ZXh0MTQgPC0gaWZlbHNlKGlzLm5hKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNGApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lc3N1biBJbnZlc3RpbWVudG8iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNGAgPiAxMDAwMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNGAvMTAwMDAwMCwgMiksICIgbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDE0YC8xMDAwLCAyKSwgIiBtaWxhIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQpgYGAKCmBgYHtyfQpwYWwxNCA8LSBjb2xvck51bWVyaWMoCiAgcGFsZXR0ZSA9IGNvbG9yUmFtcFBhbGV0dGUoYygnd2hpdGUnLCAnIzAwN0RCQycpKShsZW5ndGgoaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgMTRgKSksIAogIGRvbWFpbiA9IGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDE0YCkKYGBgCgpgYGB7cn0KbGVhZmxldChoZWlnaHQ9NzcwLCB3aWR0aD03NzApICU+JQogIHNldFZpZXcobG5nID0gMTIuOTk1ODM5LCBsYXQgPSA0Mi41NDk1NTAsIHpvb20gPSA4KSAlPiUKICAKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLkRhcmtNYXR0ZXJOb0xhYmVscykgJT4lCiAgCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1hcHBhX3F1YXR0cm8sIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICB3ZWlnaHQgPSAwLjUsIAogICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsCiAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwxNChgSW1wYXR0byBHb2FsIDE0YCksCiAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gInJlZCIsIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLAogICAgICAgICAgICBwb3B1cCA9IH5wb3B1cHRleHQxNCwKICAgICAgICAgICAgbGFiZWwgPSB+aHRtbEVzY2FwZShhcy5jaGFyYWN0ZXIoTkFNRV8zKSkpICU+JQogIAogIGFkZExlZ2VuZChwb3NpdGlvbiA9ICJ0b3ByaWdodCIsIAogICAgICAgICAgICBwYWwgPSBwYWwxNCwgCiAgICAgICAgICAgIHZhbHVlcyA9IG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNGAsCiAgICAgICAgICAgIHRpdGxlID0gIkltcGF0dG8gR29hbCAxNCIsCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHByZWZpeCA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIiBtaWdsaWFpYSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDE0IHJpY2V2ZSBsbyAwLjAwMzYlIGRlaSBmaW5hbnppYW1lbnRpIHBlciB1biB0b3RhbGUgZGkgJDU4LDEyMC4wMOKCrC4gRGVpIDI1OSBDb211bmkgY29pbnZvbHRpIG5laSBQaWFuaSBkaSBSaWNvc3RydXppb25lLCA0LCBsJzEuNSUgZGVsIHRvdGFsZSwgaW52ZXN0b25vIG5lbCBHb2FsIDEzLgoKSWwgcmlzdWx0YXRvIHJlbGF0aXZvIGFsIEdvYWwgMTQgbm9uIMOoIGluYXNwZXR0YXRvOiBzaSB0cmF0dGEgaW5mYXR0aSBkaSB1biBPYmlldHRpdm8gY2hlIHNpIHJpZmVyaXNjZSBhbGxlIGFyZWUgbWFyaXR0aW1lIG8gY29zdGllcmUsIG1lbnRyZSBnbGkgaW50ZXJ2ZW50aSBkaSByaWNvc3RydXppb25lIHF1aSBhbmFsaXp6YXRpIHNpIHJpZmFubm8gcHJpbmNpcGFsbWVudGUgYWQgYXJlZSBtb250YW5lLiBDaW9ub25vc3RhbnRlLCBhbGN1bmkgaW50ZXJ2ZW50aSBkaSBEaXNzZXN0cm8gSWRyb2dlb2xvZ2ljbyBlIFJpc29yc2UgSWRyaWNoZSB2YW5ubyBjb211bnF1ZSBhIGltcGF0dGFyZSBxdWVzdG8gR29hbC4gSW5mYXR0aSwgYWxjdW5lIGRpIHF1ZXN0ZSBvcGVyZSwgaW1wYXR0YW5vIGluZGlyZXR0YW1lbnRlLCBlIGNvbiB1bmEgYmFzc2EgbWFnbml0dWRvLCBpbCB0YXJnZXQgMTQuMTogIlJpZHVycmUgbCdpbnF1aW5hbWVudG8gbWFyaW5vLiIgUXVlc3RvIHBlcmNow6kgYWxjdW5lIG9wZXJlIGRpIERpc3Nlc3RvIElkcm9nZW9sb2dpY28gc29ubyBzdGF0ZSBlZmZldHR1YXRlIHN1IHRvcnJlbnRpIGUgZml1bWkgZGkgYWNxdWEgZG9sY2UgY2hlIHZhbm5vIHBvaSBhIHJhZ2dpdW5nZXJlIGlsIG1hcmUuIFBvaWNow6kgbCciSW5kaWNlIGRpIGV1dHJvZml6emF6aW9uZSBjb3N0aWVyYSAoSUNFUCksIHNpIHJpZmVyaXNjZSBhZ2xpIGFwcG9ydGkgZGkgbnV0cmllbnRpIChhem90bywgZm9zZm9ybyBlIHNpbGljZSkgZGFpIGZpdW1pLCBxdWVzdGkgaW50ZXJ2ZW50aSB2YW5ubyBpbmRpcmV0dGFtZW50ZSBhIGltcGF0YXJlLCBhbmNoZSBzZSBpbiBtb2RvIGxpZXZlLCBzdWwgR29hbCAxNC4KCl9fXwoKCiMjIEdvYWwgMTUKCjxkaXYgc3R5bGU9ICJmbG9hdDpsZWZ0O3Bvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAwcHg7IHBhZGRpbmctcmlnaHQ6IDMwcHgiPgpgYGB7ciwgb3V0LndpZHRoID0gIjQwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9kYXZpZGV2Ny9Eb2N1bWVudHMvRkVFTS9DSVRJNEdSRUVOL3NkZzE1LnBuZyIpCmBgYAo8L2Rpdj4KCkwnb2JpZXR0aXZvIDE1IGRpIHN2aWx1cHBvIHNvc3RlbmliaWxlIChTREcgMTUpIHJpZ3VhcmRhIGxhICJ2aXRhIHN1bGxhIHRlcnJhIi4gTGEgZm9ybXVsYXppb25lIHVmZmljaWFsZSDDqDogIioqUHJvdGVnZ2VyZSwgcmlwcmlzdGluYXJlIGUgcHJvbXVvdmVyZSBsJ3VzbyBzb3N0ZW5pYmlsZSBkZWdsaSBlY29zaXN0ZW1pIHRlcnJlc3RyaSwgZ2VzdGlyZSBpbiBtb2RvIHNvc3RlbmliaWxlIGxlIGZvcmVzdGUsIGNvbWJhdHRlcmUgbGEgZGVzZXJ0aWZpY2F6aW9uZSwgYXJyZXN0YXJlIGUgaW52ZXJ0aXJlIGlsIGRlZ3JhZG8gZGVsIHN1b2xvIGUgYXJyZXN0YXJlIGxhIHBlcmRpdGEgZGkgYmlvZGl2ZXJzaXTDoCoqIi4gTCdvYmlldHRpdm8gcHJldmVkZSAxMiB0YXJnZXQgKG8gb2JpZXR0aXZpKSBkYSByYWdnaXVuZ2VyZSBlbnRybyBpbCAyMDMwLiBJIHByb2dyZXNzaSB2ZXJzbyBnbGkgb2JpZXR0aXZpIHNhcmFubm8gbWlzdXJhdGkgZGEgMTQgaW5kaWNhdG9yaS4KCkkgbm92ZSAib2JpZXR0aXZpIGZpbmFsaSIgaW5jbHVkb25vOiBDb25zZXJ2YXJlIGUgcmlwcmlzdGluYXJlIGdsaSBlY29zaXN0ZW1pIHRlcnJlc3RyaSBlIGQnYWNxdWEgZG9sY2U7IHBvcnJlIGZpbmUgYWxsYSBkZWZvcmVzdGF6aW9uZSBlIHJpcHJpc3RpbmFyZSBsZSBmb3Jlc3RlIGRlZ3JhZGF0ZTsgcG9ycmUgZmluZSBhbGxhIGRlc2VydGlmaWNhemlvbmUgZSByaXByaXN0aW5hcmUgaSB0ZXJyZW5pIGRlZ3JhZGF0aTsgZ2FyYW50aXJlIGxhIGNvbnNlcnZhemlvbmUgZGVnbGkgZWNvc2lzdGVtaSBtb250YW5pLCBwcm90ZWdnZXJlIGxhIGJpb2RpdmVyc2l0w6AgZSBnbGkgaGFiaXRhdCBuYXR1cmFsaTsgcHJvdGVnZ2VyZSBsJ2FjY2Vzc28gYWxsZSByaXNvcnNlIGdlbmV0aWNoZSBlIGwnZXF1YSByaXBhcnRpemlvbmUgZGVpIGJlbmVmaWNpOyBlbGltaW5hcmUgaWwgYnJhY2NvbmFnZ2lvIGUgaWwgdHJhZmZpY28gZGkgc3BlY2llIHByb3RldHRlOyBwcmV2ZW5pcmUgbGUgc3BlY2llIGFsaWVuZSBpbnZhc2l2ZSBzdWxsYSB0ZXJyYSBlIG5lZ2xpIGVjb3Npc3RlbWkgYWNxdWF0aWNpOyBlIGludGVncmFyZSBsJ2Vjb3Npc3RlbWEgZSBsYSBiaW9kaXZlcnNpdMOgIG5lbGxhIHBpYW5pZmljYXppb25lIGdvdmVybmF0aXZhLgoKSSB0cmUgdGFyZ2V0LCAibWV6emkgcGVyIHJhZ2dpdW5nZXJlIGdsaSBvYmlldHRpdmkiLCBpbmNsdWRvbm86IGF1bWVudGFyZSBsZSByaXNvcnNlIGZpbmFuemlhcmllIHBlciBjb25zZXJ2YXJlIGUgdXRpbGl6emFyZSBpbiBtb2RvIHNvc3RlbmliaWxlIGwnZWNvc2lzdGVtYSBlIGxhIGJpb2RpdmVyc2l0w6A7IGZpbmFuemlhcmUgZSBpbmNlbnRpdmFyZSBsYSBnZXN0aW9uZSBmb3Jlc3RhbGUgc29zdGVuaWJpbGU7IGNvbWJhdHRlcmUgaWwgYnJhY2NvbmFnZ2lvIGdsb2JhbGUgZSBsYSB0cmF0dGEuCgpVbHRlcmlvcmkgaW5mb3JtYXppb25pIHN1bGwnU0RHIDE1IHNpIHBvc3Nvbm8gdHJvdmFyZSBbY2xpY2NhbmRvIHF1aV0oaHR0cHM6Ly9zZGdzLnVuLm9yZy9nb2Fscy9nb2FsMTUpLgoKKipNYXBwYSBJbnRlcmF0dGl2YSoqCgoKYGBge3J9Cm1hcHBhX3F1YXR0cm8kcG9wdXB0ZXh0MTUgPC0gaWZlbHNlKGlzLm5hKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNWApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lc3N1biBJbnZlc3RpbWVudG8iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNWAgPiAxMDAwMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNWAvMTAwMDAwMCwgMiksICIgbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDE1YC8xMDAwLCAyKSwgIiBtaWxhIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQpgYGAKCmBgYHtyfQpwYWwxNSA8LSBjb2xvck51bWVyaWMoCiAgcGFsZXR0ZSA9IGNvbG9yUmFtcFBhbGV0dGUoYygnd2hpdGUnLCAnIzU2QzAyQicpKShsZW5ndGgoaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgMTVgKSksIAogIGRvbWFpbiA9IGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDE1YCkKYGBgCgpgYGB7cn0KbGVhZmxldChoZWlnaHQ9NzcwLCB3aWR0aD03NzApICU+JQogIHNldFZpZXcobG5nID0gMTIuOTk1ODM5LCBsYXQgPSA0Mi41NDk1NTAsIHpvb20gPSA4KSAlPiUKICAKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLkRhcmtNYXR0ZXJOb0xhYmVscykgJT4lCiAgCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1hcHBhX3F1YXR0cm8sIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICB3ZWlnaHQgPSAwLjUsIAogICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsCiAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwxNShgSW1wYXR0byBHb2FsIDE1YCksCiAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gInJlZCIsIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLAogICAgICAgICAgICBwb3B1cCA9IH5wb3B1cHRleHQxNSwKICAgICAgICAgICAgbGFiZWwgPSB+aHRtbEVzY2FwZShhcy5jaGFyYWN0ZXIoTkFNRV8zKSkpICU+JQogIAogIGFkZExlZ2VuZChwb3NpdGlvbiA9ICJ0b3ByaWdodCIsIAogICAgICAgICAgICBwYWwgPSBwYWwxNSwgCiAgICAgICAgICAgIHZhbHVlcyA9IG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNWAsCiAgICAgICAgICAgIHRpdGxlID0gIkltcGF0dG8gR29hbCAxNSIsCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHByZWZpeCA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIiBtaWxpb25pIGRpIOKCrCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZ1bmN0aW9uICh4KSB4LzEwMDAwMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEubGFiZWwgPSAiTmVzc3VuIEludmVzdC4iKSAKICAgCmBgYAoKKipDb21tZW50bzoqKiAgCklsIEdvYWwgMTUgcmljZXZlIGlsIDMuNDUlIGRlaSBmaW5hbnppYW1lbnRpIHBlciB1biB0b3RhbGUgZGkgNTUsODYzLDY0NC44MOKCrC4gRGVpIDI1OSBDb211bmkgY29pbnZvbHRpIG5laSBQaWFuaSBkaSBSaWNvc3RydXppb25lLCAyMTQsIGwnODMlIGRlbCB0b3RhbGUsIGludmVzdG9ubyBuZWwgR29hbCAxNS4KCkxhIHF1YXNpIHRvdGFsaXTDoCBkaSBpbnZlc3RpbWVudGkgc3VsIEdvYWwgMTUgYXJyaXZhIGRhbGxhIGNhdGVnb3JpYSBkZWwgRGlzc2VzdG8gSWRyb2dlb2xvZ2ljbywgUmlzb3JzZSBJZHJpY2hlLiBHbGkgaW50ZXJ2ZW50aSBhbGwnaW50ZXJubyBkaSBxdWVzdGEgY2F0ZWdvcmlhLCBpbmZhdHRpLCBzb2RkaXNmYW5vIGEgcGllbm8gaSB0YXJnZXQgMTUuMTogIkNvbnNlcnZhcmUgZSByaXByaXN0aW5hcmUgZ2xpIGVjb3Npc3RlbWkgdGVycmVzdHJpIGUgZCdhY3F1YSBkb2xjZSIgZSAxNS4zOiAiUG9ycmUgZmluZSBhbGxhIGRlc2VydGlmaWNhemlvbmUgZSByaXByaXN0aW5hcmUgaSB0ZXJyZW5pIGRlZ3JhZGF0aSIuIElub2x0cmUsIGltcGF0dGFubyBkaXJldHRhbWVudGUsIGFuY2hlIHNlIGNvbiB1bmEgbWFnbml0dWRvIGluZmVyaW9yZSwgaSB0YXJnZXQgMTUuMjogIlBvcnJlIGZpbmUgYWxsYSBkZWZvcmVzdGF6aW9uZSBlIHJpcHJpc3RpbmFyZSBsZSBmb3Jlc3RlIGRlZ3JhZGF0ZSIgZSAxNS40OiAiR2FyYW50aXJlIGxhIGNvbnNlcnZhemlvbmUgZGVnbGkgZWNvc2lzdGVtaSBtb250YW5pIi4KCl9fXwoKIyMgR29hbCAxNgoKPGRpdiBzdHlsZT0gImZsb2F0OmxlZnQ7cG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDBweDsgcGFkZGluZy1yaWdodDogMzBweCI+CmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vc2RnMTYucG5nIikKYGBgCjwvZGl2PgoKTCdPYmlldHRpdm8gZGkgU3ZpbHVwcG8gU29zdGVuaWJpbGUgMTYgKFNERyAxNikgcmlndWFyZGEgInBhY2UsIGdpdXN0aXppYSBlIGlzdGl0dXppb25pIGZvcnRpIi4gTGEgZm9ybXVsYXppb25lIHVmZmljaWFsZSDDqDogIioqUHJvbXVvdmVyZSBzb2NpZXTDoCBwYWNpZmljaGUgZSBpbmNsdXNpdmUgcGVyIGxvIHN2aWx1cHBvIHNvc3RlbmliaWxlLCBmb3JuaXJlIGFjY2Vzc28gYWxsYSBnaXVzdGl6aWEgcGVyIHR1dHRpIGUgY29zdHJ1aXJlIGlzdGl0dXppb25pIGVmZmljYWNpLCByZXNwb25zYWJpbGkgZSBpbmNsdXNpdmUgYSB0dXR0aSBpIGxpdmVsbGkqKiIuIElsIEdvYWwgcHJldmVkZSAxMiB0YXJnZXQgKG8gb2JpZXR0aXZpKSBkYSByYWdnaXVuZ2VyZSBlbnRybyBpbCAyMDMwLiBJIHByb2dyZXNzaSB2ZXJzbyBnbGkgb2JpZXR0aXZpIHNhcmFubm8gbWlzdXJhdGkgZGEgMjMgaW5kaWNhdG9yaS4KCklsIEdvYWwgaGEgZGllY2kgIm9iaWV0dGl2aSBmaW5hbGkiOiByaWR1cnJlIGxhIHZpb2xlbnphOyBwcm90ZWdnZXJlIGkgYmFtYmluaSBkYSBhYnVzaSwgc2ZydXR0YW1lbnRvLCB0cmF0dGEgZSB2aW9sZW56YTsgcHJvbXVvdmVyZSBsbyBzdGF0byBkaSBkaXJpdHRvIGUgZ2FyYW50aXJlIGxhIHBhcml0w6AgZGkgYWNjZXNzbyBhbGxhIGdpdXN0aXppYTsgY29tYmF0dGVyZSBsYSBjcmltaW5hbGl0w6Agb3JnYW5penphdGEgZSBpIGZsdXNzaSBmaW5hbnppYXJpIGUgZGkgYXJtaSBpbGxlY2l0aSwgcmlkdXJyZSBzb3N0YW56aWFsbWVudGUgbGEgY29ycnV6aW9uZSBlIGxlIHRhbmdlbnRpOyBzdmlsdXBwYXJlIGlzdGl0dXppb25pIGVmZmljYWNpLCByZXNwb25zYWJpbGkgZSB0cmFzcGFyZW50aTsgZ2FyYW50aXJlIHVuIHByb2Nlc3NvIGRlY2lzaW9uYWxlIHJlYXR0aXZvLCBpbmNsdXNpdm8gZSByYXBwcmVzZW50YXRpdm87IHJhZmZvcnphcmUgbGEgcGFydGVjaXBhemlvbmUgYWxsYSBnb3Zlcm5hbmNlIGdsb2JhbGU7IGZvcm5pcmUgaWRlbnRpdMOgIGdpdXJpZGljYSB1bml2ZXJzYWxlOyBnYXJhbnRpcmUgbCdhY2Nlc3NvIGRlbCBwdWJibGljbyBhbGxlIGluZm9ybWF6aW9uaSBlIHR1dGVsYXJlIGxlIGxpYmVydMOgIGZvbmRhbWVudGFsaS4gIApFc2lzdG9ubyBhbmNoZSBkdWUgdGFyZ2V0IGNvbnNpZGVyYXRpICJtZXp6aSBwZXIgcmFnZ2l1bmdlcmUgZ2xpIG9iaWV0dGl2aSI6IHJhZmZvcnphcmUgbGUgaXN0aXR1emlvbmkgbmF6aW9uYWxpIHBlciBwcmV2ZW5pcmUgbGEgdmlvbGVuemEgZSBjb21iYXR0ZXJlIGxhIGNyaW1pbmFsaXTDoCBlIGlsIHRlcnJvcmlzbW87IHByb211b3ZlcmUgZSBhcHBsaWNhcmUgbGVnZ2kgZSBwb2xpdGljaGUgbm9uIGRpc2NyaW1pbmF0b3JpZS4KClJpZHVycmUgbGEgY3JpbWluYWxpdMOgIHZpb2xlbnRhLCBpbCBzZXggdHJhZmZpY2tpbmcsIGlsIGxhdm9ybyBmb3J6YXRvIGUgZ2xpIGFidXNpIHN1aSBtaW5vcmkgc29ubyBvYmlldHRpdmkgZ2xvYmFsaSBjaGlhcmkuIExhIENvbXVuaXTDoCBJbnRlcm5hemlvbmFsZSBhcHByZXp6YSBsYSBwYWNlIGUgbGEgZ2l1c3RpemlhIGUgY2hpZWRlIHNpc3RlbWkgZ2l1ZGl6aWFyaSBwacO5IGZvcnRpIGNoZSBhcHBsaWNoaW5vIGxlIGxlZ2dpIGUgbGF2b3Jpbm8gcGVyIHVuYSBzb2NpZXTDoCBwacO5IHBhY2lmaWNhIGUgZ2l1c3RhLgoKVWx0ZXJpb3JpIGluZm9ybWF6aW9uaSBzdWxsJ1NERyAxNiBzaSBwb3Nzb25vIHRyb3ZhcmUgW2NsaWNjYW5kbyBxdWldKGh0dHBzOi8vc2Rncy51bi5vcmcvZ29hbHMvZ29hbDE2KS4KCioqTWFwcGEgSW50ZXJhdHRpdmEqKgoKCmBgYHtyfQptYXBwYV9xdWF0dHJvJHBvcHVwdGV4dDE2IDwtIGlmZWxzZShpcy5uYShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTZgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXNzdW4gSW52ZXN0aW1lbnRvIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTZgID4gMTAwMDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlOjpwYXN0ZTAoIjxiPiIsICJDb211bmUgZGkgIiwgbWFwcGFfcXVhdHRybyROQU1FXzMsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGI+IiwgIkludmVzdGltZW50byB0b3RhbGU6ICIsICI8L2I+PGJyIC8+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTZgLzEwMDAwMDAsIDIpLCAiIG0iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxNmAvMTAwMCwgMiksICIgbWlsYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKYGBgCgpgYGB7cn0KcGFsMTYgPC0gY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3doaXRlJywgJyMwMjU1OEInKSkobGVuZ3RoKGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDE2YCkpLCAKICBkb21haW4gPSBpbnZlc3RpbWVudGkkYEltcGF0dG8gR29hbCAxNmApCmBgYAoKYGBge3J9CmxlYWZsZXQoaGVpZ2h0PTc3MCwgd2lkdGg9NzcwKSAlPiUKICBzZXRWaWV3KGxuZyA9IDEyLjk5NTgzOSwgbGF0ID0gNDIuNTQ5NTUwLCB6b29tID0gOCkgJT4lCiAgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMpICU+JQogIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBwYV9xdWF0dHJvLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgd2VpZ2h0ID0gMC41LCAKICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4zLAogICAgICAgICAgICBvcGFjaXR5ID0gMC43LCAKICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLAogICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMTYoYEltcGF0dG8gR29hbCAxNmApLAogICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJyZWQiLCB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgICAgICAgICAgcG9wdXAgPSB+cG9wdXB0ZXh0MTYsCiAgICAgICAgICAgIGxhYmVsID0gfmh0bWxFc2NhcGUoYXMuY2hhcmFjdGVyKE5BTUVfMykpKSAlPiUKICAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAidG9wcmlnaHQiLCAKICAgICAgICAgICAgcGFsID0gcGFsMTYsIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBwYV9xdWF0dHJvJGBJbXBhdHRvIEdvYWwgMTZgLAogICAgICAgICAgICB0aXRsZSA9ICJJbXBhdHRvIEdvYWwgMTYiLAogICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChwcmVmaXggPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIgbWlsaW9uaSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDE2IG90dGllbmUgaWwgNC4wMSUgZGVpIGZpbmFuemlhbWVudGkgcGVyIHVuIHRvdGFsZSBkaSA2NSwwNDYsMjQ4LjI54oKsLiBEZWkgMjU5IENvbXVuaSBjb2ludm9sdGkgbmVpIFBpYW5pIGRpIFJpY29zdHJ1emlvbmUsIDE4MiwgaWwgNzAlIGRlbCB0b3RhbGUsIGludmVzdG9ubyBuZWwgR29hbCAxNi4KCkxhIG1hZ2dpb3IgcGFydGUgZGVnbGkgaW50ZXZlbnRpIGNoZSBjb250cmlidWlzY29ubyBhbCBHb2FsIDE2IHJpZW50cmFubyBuZWxsYSBjYXRlZ29yaWEgIkFsdHJvLiIgUXVlc3RvIHBlcmNow6ksIGluIHF1ZXN0YSBjYXRlZ29yaWEsIHNvbm8gc3RhdGUgaW5jbHVzZSBsZSBvcGVyZSBtaXJhdGUgYWxsZSBpbmZyYXN0cnV0dHVyZSBjb211bmFsaSBvcmllbnRhdGUgYWxsZSBmdW56aW9uaSBwb2xpdGljaGUsIGkgbXVuaWNpcGkgZSBsZSBjYXNlcm1lLCBzaWFubyBxdWVzdGUgZGkgUG9saXppYSBvIGRlaSBWaWdpbGkgZGVsIEZ1b2NvLiBTb25vIHF1ZXN0aSBnbGkgaW50ZXJ2ZW50aSBjaGUgaW1wYXR0YW5vIGkgdGFyZ2V0IGRlbCBHb2FsIDE2IHN1bGxhIHJpZHV6aW9uZSBkZWxsYSB2aW9sZW56YSwgbGEgcHJvdGV6aW9uZSBkZWkgcGnDuSBkZWJvbGksIGluIHBhcnRpY29sYXJlIGRlaSBiYW1iaW5pLCBsYSBwcm9tb3ppb25lIGRpIHVubyBzdGF0byBkaSBkaXJpdHRvLGdhcmFudGlyZSBsYSBwYXJpdMOgIGRpIGFjY2Vzc28gYWxsYSBnaXVzdGl6aWEgZSBsYSBwcm90ZXppb25lIGRlbGxlIGxpYmVydMOgIGZvbmRhbWVudGFsaS4KCl9fXwoKIyMgR29hbCAxNwoKPGRpdiBzdHlsZT0gImZsb2F0OmxlZnQ7cG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDBweDsgcGFkZGluZy1yaWdodDogMzBweCI+CmBgYHtyLCBvdXQud2lkdGggPSAiNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2RhdmlkZXY3L0RvY3VtZW50cy9GRUVNL0NJVEk0R1JFRU4vc2RnMTcucG5nIikKYGBgCjwvZGl2PgoKTCdvYmlldHRpdm8gZGkgc3ZpbHVwcG8gc29zdGVuaWJpbGUgMTcgKFNERyAxNykgcmlndWFyZGEgbGUgInBhcnRuZXJzaGlwIHBlciBnbGkgb2JpZXR0aXZpIi4gTGEgZm9ybXVsYXppb25lIHVmZmljaWFsZSDDqDogIioqUmFmZm9yemFyZSBpIG1lenppIGRpIGF0dHVhemlvbmUgZSByaXZpdGFsaXp6YXJlIGlsIHBhcnRlbmFyaWF0byBnbG9iYWxlIHBlciBsbyBzdmlsdXBwbyBzb3N0ZW5pYmlsZSoqIi4gTCdPYmlldHRpdm8gcHJldmVkZSAxNyBvYmlldHRpdmkgZGEgcmFnZ2l1bmdlcmUgZW50cm8gaWwgMjAzMCwgc3VkZGl2aXNpIGluIGNpbnF1ZSBjYXRlZ29yaWU6IGZpbmFuemEsIHRlY25vbG9naWEsIHN2aWx1cHBvIGRlbGxlIGNhcGFjaXTDoCwgY29tbWVyY2lvIGUgcXVlc3Rpb25pIHNpc3RlbWljaGUuIEkgcHJvZ3Jlc3NpIHZlcnNvIGdsaSBvYmlldHRpdmkgc2FyYW5ubyBtaXN1cmF0aSBkYSAyNSBpbmRpY2F0b3JpLgoKTCdTREcgMTcgZmEgcmlmZXJpbWVudG8gYWxsYSBuZWNlc3NpdMOgIGRpIHVuYSBjb2xsYWJvcmF6aW9uZSBpbnRlcnNldHRvcmlhbGUgZSBpbnRlcm5hemlvbmFsZSBuZWwgcGVyc2VndWltZW50byBkaSB0dXR0aSBnbGkgb2JpZXR0aXZpIGVudHJvIGlsIDIwMzAuIMOIIHVuIGludml0byBhaSBwYWVzaSBhZCBhbGxpbmVhcmUgbGUgcG9saXRpY2hlLiBMJ1NERyAxNyDDqCB1bmEgdmlzaW9uZSBwZXIgdW4gY29tbWVyY2lvIG1pZ2xpb3JlIGUgcGnDuSBlcXVvLCBub25jaMOpIGluaXppYXRpdmUgZGkgaW52ZXN0aW1lbnRvIGNvb3JkaW5hdGUgcGVyIHByb211b3ZlcmUgbG8gc3ZpbHVwcG8gc29zdGVuaWJpbGUgb2x0cmUgaSBjb25maW5pLiBTaSB0cmF0dGEgZGkgcmFmZm9yemFyZSBlIHNuZWxsaXJlIGxhIGNvb3BlcmF6aW9uZSB0cmEgZ2xpIHN0YXRpLW5hemlvbmUsIHNpYSBzdmlsdXBwYXRpIGNoZSBpbiB2aWEgZGkgc3ZpbHVwcG8sIHV0aWxpenphbmRvIGdsaSBTREdzIGNvbWUgdW4gcXVhZHJvIGNvbmRpdmlzbyBlIHVuYSB2aXNpb25lIGNvbmRpdmlzYSBwZXIgZGVmaW5pcmUgcXVlbCBtb2RvIGRpIHByb2NlZGVyZSBjb2xsYWJvcmF0aXZvLiBNaXJhIGEgcHJvbXVvdmVyZSBpbCBjb21tZXJjaW8gaW50ZXJuYXppb25hbGUgZSBhZCBhaXV0YXJlIGkgcGFlc2kgaW4gdmlhIGRpIHN2aWx1cHBvIGFkIGF1bWVudGFyZSBsZSBsb3JvIGVzcG9ydGF6aW9uaSBwZXIgZ2FyYW50aXJlIHVuIHNpc3RlbWEgY29tbWVyY2lhbGUgZXF1byBlIGJhc2F0byBzdSByZWdvbGUgdW5pdmVyc2FsZSBjaGUgc2lhIGVxdW8sIGFwZXJ0byBlIHZhbnRhZ2dpb3NvIHBlciB0dXR0aS4KClVsdGVyaW9yaSBpbmZvcm1hemlvbmkgc3VsbCdTREcgMTcgc2kgcG9zc29ubyB0cm92YXJlIFtjbGljY2FuZG8gcXVpXShodHRwczovL3NkZ3MudW4ub3JnL2dvYWxzL2dvYWwxNykuCgoqKk1hcHBhIEludGVyYXR0aXZhKioKYGBge3J9Cm1hcHBhX3F1YXR0cm8kcG9wdXB0ZXh0MTcgPC0gaWZlbHNlKGlzLm5hKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxN2ApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lc3N1biBJbnZlc3RpbWVudG8iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxN2AgPiAxMDAwMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2U6OnBhc3RlMCgiPGI+IiwgIkNvbXVuZSBkaSAiLCBtYXBwYV9xdWF0dHJvJE5BTUVfMywgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj4iLCAiSW52ZXN0aW1lbnRvIHRvdGFsZTogIiwgIjwvYj48YnIgLz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxN2AvMTAwMDAwMCwgMiksICIgbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTo6cGFzdGUwKCI8Yj4iLCAiQ29tdW5lIGRpICIsIG1hcHBhX3F1YXR0cm8kTkFNRV8zLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxiPiIsICJJbnZlc3RpbWVudG8gdG90YWxlOiAiLCAiPC9iPjxiciAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWFwcGFfcXVhdHRybyRgSW1wYXR0byBHb2FsIDE3YC8xMDAwLCAyKSwgIiBtaWxhIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQpgYGAKCmBgYHtyfQpwYWwxNyA8LSBjb2xvck51bWVyaWMoCiAgcGFsZXR0ZSA9IGNvbG9yUmFtcFBhbGV0dGUoYygnd2hpdGUnLCAnIzE4MzY2OCcpKShsZW5ndGgoaW52ZXN0aW1lbnRpJGBJbXBhdHRvIEdvYWwgMTdgKSksIAogIGRvbWFpbiA9IGludmVzdGltZW50aSRgSW1wYXR0byBHb2FsIDE3YCkKYGBgCgpgYGB7cn0KbGVhZmxldChoZWlnaHQ9NzcwLCB3aWR0aD03NzApICU+JQogIHNldFZpZXcobG5nID0gMTIuOTk1ODM5LCBsYXQgPSA0Mi41NDk1NTAsIHpvb20gPSA4KSAlPiUKICAKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLkRhcmtNYXR0ZXJOb0xhYmVscykgJT4lCiAgCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1hcHBhX3F1YXR0cm8sIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICB3ZWlnaHQgPSAwLjUsIAogICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsCiAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwxNyhgSW1wYXR0byBHb2FsIDE3YCksCiAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gInJlZCIsIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLAogICAgICAgICAgICBwb3B1cCA9IH5wb3B1cHRleHQxNywKICAgICAgICAgICAgbGFiZWwgPSB+aHRtbEVzY2FwZShhcy5jaGFyYWN0ZXIoTkFNRV8zKSkpICU+JQogIAogIGFkZExlZ2VuZChwb3NpdGlvbiA9ICJ0b3ByaWdodCIsIAogICAgICAgICAgICBwYWwgPSBwYWwxNywgCiAgICAgICAgICAgIHZhbHVlcyA9IG1hcHBhX3F1YXR0cm8kYEltcGF0dG8gR29hbCAxN2AsCiAgICAgICAgICAgIHRpdGxlID0gIkltcGF0dG8gR29hbCAxNyIsCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHByZWZpeCA9ICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIiBtaWdsaWFpYSBkaSDigqwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmdW5jdGlvbiAoeCkgeC8xMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmxhYmVsID0gIk5lc3N1biBJbnZlc3QuIikgCiAgIApgYGAKCioqQ29tbWVudG86KiogIApJbCBHb2FsIDE3IHJpY2V2ZSBsbyAwLjcxJSBkZWkgZmluYW56aWFtZW50aSBwZXIgdW4gdG90YWxlIGRpIDExLDU4Myw5OTUuODbigqwuIERlaSAyNTkgQ29tdW5pIGNvaW52b2x0aSBuZWkgUGlhbmkgZGkgUmljb3N0cnV6aW9uZSwgMTc3LCBpbCA2OCUgZGVsIHRvdGFsZSwgaW52ZXN0b25vIG5lbCBHb2FsIDE3LgoKU29ubyBsZSBTY3VvbGUgYSBzb3NwaW5nZXJlIHF1ZXN0byBHb2FsIGNvbiA3LjUgbWlsaW9uaSBzdWdsaSAxMS41IHRvdGFsaS4gTGUgc2N1b2xlLCBpbmZhdHRpLCBoYW5ubyB1biBpbXBhdHRvIGluZGlyZXR0byBzdWwgdGFyZ2V0IDE3LjY6ICJDb25kaXZpc2lvbmUgZGVsbGUgY29ub3NjZW56ZSBlIGNvb3BlcmF6aW9uZSBwZXIgbCdhY2Nlc3NvIGFsbGEgc2NpZW56YSwgYWxsYSB0ZWNub2xvZ2lhIGUgYWxsJ2lubm92YXppb25lIi4gRG9wb2RpY2jDqSwgYWxsJ2ludGVybm8gZGVsbGEgY2F0ZWdvcmlhICJBbHRybyIsIHZpIHNvbm8gbGUgQ2FzZXJtZSBjaGUsIGZhY2VuZG8gcmlzcGV0dGFyZSBsZSBsZWdnaSwgY29udHJpYnVpc2Nvbm8gYWxsYSByZWFsaXp6YXppb25lIGRlbCB0YXJnZXQgMTcuMTogIk1vYmlsaXRhcmUgbGUgcmlzb3JzZSBwZXIgbWlnbGlvcmFyZSBsYSByaXNjb3NzaW9uZSBkZWxsZSBlbnRyYXRlIG5hemlvbmFsaSIuCgpfX18KCiMgRGlzY3Vzc2lvbmUKCkNvbnNpZGVyYW5kbyBkdW5xdWUgcXVhbnRvIGVtZXJzbywgc2kgcHJlc2VudGFubyBkaSBzZWd1aXRvIGFsY3VuZSByaWZsZXNzaW9uaSBkaSBwb2xpY3kuICAKCkRhbGzigJlhbmFsaXNpIGVtZXJnZSBjaGlhcmFtZW50ZSBjb21lIGkgdHJlIHBpbGFzdHJpIGRlbGxvIHN2aWx1cHBvIHNvc3RlbmliaWxlIOKAkyBhbWJpZW50YWxlLCBzb2NpYWxlIGVkIGVjb25vbWljbyDigJMgdmVuZ2FubyB0b2NjYXRpIGludGVncmFsbWVudGUgbmVpIHJpc3VsdGF0aS4gw4ggaW1wb3J0YW50ZSBzb3R0b2xpbmVhcmUgaW5mYXR0aSBjb21lIGxhIG1ldG9kb2xvZ2lhIHV0aWxpenphdGEgcmllc2NhIGEgY2FwdGFyZSBub24gc29sbyBnbGkgaW1wYXR0aSBjaGUgdW4gaW50ZXJ2ZW50byBoYSBkaXJldHRhbWVudGUgc3UgdW5vIHNwZWNpZmljbyB0YXJnZXQsIG1hIGFuY2hlIGdsaSBpbXBhdHRpIGluZGlyZXR0aSwgc290dG9saW5lYW5kbyBwcm9wcmlvIGxhIG5hdHVyYSBpbnRlcmNvbm5lc3NhIGVkIGluZGl2aXNpYmlsZSBkZWxsZSB0cmUgc2ZlcmUsIGUgZHVucXVlIGRlZ2xpIE9iaWV0dGl2aSBkZWxs4oCZQWdlbmRhIDIwMzAuIAoKQW5kYW5kbyBuZWwgZGV0dGFnbGlvIGRpIGNpw7IgY2hlIMOoIGVtZXJnZSwgbGEgKipzb3N0ZW5pYmlsaXTDoCBhbWJpZW50YWxlKiogdmllbmUgcXVpIHRyYWluYXRhIGRhbCAqKkdvYWwgMTMg4oCcQWdpcmUgcGVyIGlsIGNsaW1h4oCdKiogZSBkYWwgKipHb2FsIDYg4oCcQWNxdWEgcHVsaXRhIGUgaWdpZW5l4oCdKiogcGVyIGxvIHBpw7kgYXR0cmF2ZXJzbyBnbGkgaW50ZXJ2ZW50aSBkaSAq4oCcRGlzc2VzdG8gSWRyb2dlb2xvZ2ljbywgUmlzb3JzZSBpZHJpY2hl4oCdKi4gROKAmWFsdHJhIHBhcnRlLCBzb25vIGlsIEdvYWwgMTQg4oCcTGEgdml0YSBzb3R04oCZYWNxdWHigJ0gZSBpbCBHb2FsIDcg4oCcRW5lcmdpYSBwdWxpdGEgZSBhY2Nlc3NpYmlsZeKAnSBhZCBlc3NlcmUgbWVubyBpbXBhdHRhdGkuIFF1ZXN04oCZdWx0aW1vIHJpc3VsdGF0byBpbiBwYXJ0aWNvbGFyZSByaWxldmEgY29tZSBsYSBzb3N0ZW5pYmlsaXTDoCBhbWJpZW50YWxlIHNpYSBxdWkgZGVjbGluYXRhIGNvbiB1biBhcHByb2NjaW8gdm9sdG8gYWxsYSByaXF1YWxpZmljYXppb25lIGUgYWxsYSByZXNpbGllbnphIGRlbCBwYXRyaW1vbmlvIG5hdHVyYWxlIGNoZSBub24gYWxsYSB0cmFuc2l6aW9uZSBlbmVyZ2V0aWNhLCBvZ2dpZ2lvcm5vLCBjb21lIHBpw7kgdm9sdGUgcmlwcmVzbyBhbmNoZSBkYWwgR3JlZW4gRGVhbCBldXJvcGVvIGUgZGFsIE5leHQgR2VuZXJhdGlvbiBFVSwgY29uZGl6aW9uZSBmb25kYW1lbnRhbGUgcGVyIHVubyBzdmlsdXBwbyBzb3N0ZW5pYmlsZS4gQ2lvbm9ub3N0YW50ZSwgY29tZSBzcGVjaWZpY2F0byBpbiBjb21tZW50byBhbCBHb2FsIDcsIHF1ZXN0byByaXN1bHRhdG8gZGVyaXZhIGRhbCBmYXR0byBjaGUgZ2xpIGludGVydmVudGkgZGkgcmljb3N0cnV6aW9uZSBhbmFsaXp6YXRpIG5vbiBlc3BsaWNpdGFubyBzZSBs4oCZYXR0dWF6aW9uZSBkZWdsaSBzdGVzc2kgYXZ2ZXJyw6AgaW4gdW7igJlvdHRpY2Egc29zdGVuaWJpbGUsIHF1aW5kaSBzZSBhZCBlc2VtcGlvLCBsYSBjb3N0cnV6aW9uZSBkaSBlZGlmaWNpIGluY2x1ZGEgYW5jaGUgbOKAmWVmZmljaWVudGFtZW50byBlbmVyZ2V0aWNvIG8gbOKAmWluc3RhbGxhemlvbmUgZGkgcGFubmVsbGkgc29sYXJpIG8gaW4gZ2VuZXJhbGUgbOKAmXV0aWxpenpvIGRlbCBFY29ib251cyAxMTAlLiBDb25zZWd1ZW50ZW1lbnRlLCBub24gYXBwZW5hIHNhcmFubm8gY2hpYXJlIGxlIG1vZGFsaXTDoCBkaSBhdHR1YXppb25lIGRlZ2xpIGludGVydmVudGksIHNpIHBvdHLDoCByaWNhbGlicmFyZSBpbCBtb2RlbGxvIHN1bGxhIGJhc2UgZGVnbGkgaW52ZXN0aW1lbnRpIGZpbmFsaXp6YXRpLiAgCgpOZWxsbyBzdGVzc28gbW9kbywgbGEgKipzb3N0ZW5pYmlsaXTDoCBzb2NpYWxlKiogdmllbmUgdG9jY2F0YSBuZWdsaSBlc2l0aSBkZWwgKipHb2FsIDQg4oCcSXN0cnV6aW9uZSBkaSBxdWFsaXTDoOKAnSoqIOKAkyB1bm8gZGVpIEdvYWwgY29uc2lkZXJhdGkgdHJhIGkgcGnDuSBpbmZsdWVudGkgbmVsIHJhZ2dpdW5naW1lbnRvIGRlbGzigJlBZ2VuZGEgMjAzMCAoRmFybmlhIGV0IGFsLiwgMjAxOSkg4oCTIGdyYXppZSBhZ2xpIGludGVydmVudGkgc3VsbGUgU2N1b2xlLCBlIGRlbCAqKkdvYWwgMTEg4oCcQ2l0dMOgIGUgY29tdW5pdMOgIHNvc3RlbmliaWxp4oCdKiogZ3JhemllIGFnbGkgaW52ZXN0aW1lbnRpIHN1bGzigJlFZGlsaXppYSBlIHN1aSBCZW5pIEN1bHR1cmFsaSwgY29udGVuZW50aSBsdW9naGkgZGkgYWdncmVnYXppb25lIGZvbmRhbWVudGFsaSBwZXIgbGUgY29tdW5pdMOgIGxvY2FsaSwgcXVhbGkgY2hpZXNlLCB0ZWF0cmksIGNpbmVtYSwgZSBjZW50cmkgc3BvcnRpdmksIG1vdG9yaSBlIGZhY2lsaXRhdG9yaSBwZXIgbGEgY29lc2lvbmUgZSBsbyBzdmlsdXBwbyBsb2NhbGUgc29jaWFsZS4KCkluZmluZSwgcGVyIGNpw7IgY2hlIGNvbmNlcm5lIGxhICoqZGltZW5zaW9uZSBlY29ub21pY2EgZGVsbGEgc29zdGVuaWJpbGl0w6AqKiwgcXVlc3RhIHJpc3VsdGEgdG9jY2F0YSwgc2VwcHVyIGluIG1pc3VyYSBtaW5vcmUgcmlzcGV0dG8gYWxsZSBhbHRyZSBzZmVyZSwgbmVpIHJpc3VsdGF0aSByZWxhdGl2aSBhbCAqKkdvYWwgOCDigJxMYXZvcm8gZGlnbml0b3NvIGUgY3Jlc2NpdGEgZWNvbm9taWNh4oCdKiogZWQgaW4gdmlhIGluZGlyZXR0YSBhbCAqKkdvYWwgMSDigJxQb3ZlcnTDoCB6ZXJv4oCdKiouIElsIHJpc3VsdGF0byDDqCBjb25zZWd1ZW56YSBkaSB1bmEgcHJlc2VuemEgaW5mZXJpb3JlIGRpIGludGVydmVudGkgYSBjYXJhdHRlcmUgaW1wcmVuZGl0b3JpYWxlIGVkIGluZHVzdHJpYWxlLCBk4oCZaW5ub3ZhemlvbmUsIGRpIGNvbnN1bW8gZSBwcm9kdXppb25lIHJlc3BvbnNhYmlsZSwgZSBkaSB0dXJpc21vIHNvc3RlbmliaWxlOyBxdWVzdGkgZG92cmFubm8gbmVjZXNzYXJpYW1lbnRlIHJpZmFyc2kgYWxs4oCZYXVzaWxpbyBkaSBhbHRyaSBzdHJ1bWVudGkgZSBmb250aSBmaW5hbnppYXJpZSBjb23igJlhbmNoZSBkaSBhbHRyZSBwb2xpdGljaGUgY2hlIHJpY29tcHJlbmRhbm8gbOKAmWluY2x1c2lvbmUgZGkgdHV0dGkgZ2xpIGF0dG9yaSBkZWwgdGVycml0b3JpbyBwcm9wcmlvIHBlciBhc3NpY3VyYXJlIHVubyBzdmlsdXBwbyBzb3N0ZW5pYmlsZSBpbnRlZ3JhdG8uIAoKUGVyIGNvbmNsdWRlcmUsIHNpIHJpbWFyY2EgcXVpIGzigJlpbXBvcnRhbnphIHBlciBpIGRpdmVyc2kgdGVycml0b3JpIGRpIHN2aWx1cHBhcmUgc3RyYXRlZ2llIGNoZSB0ZW5nYW5vIGNvbnRvIGRlbGxlIGRpcmV0dGl2ZSBkZWkgZGlmZmVyZW50aSBsaXZlbGxpIGRpIGdvdmVybmFuY2UgYWwgZmluZSBkaSBjb29yZGluYXJlIGFsIG1lZ2xpbyBsZSBkaXZlcnNlIHBvbGl0aWNoZSBlIHN0cnVtZW50aSBwZXIgbGEgbG9jYWxpenphemlvbmUsIGzigJlpbnRlZ3JhemlvbmUsIGzigJlhdHR1YXppb25lIGUgaWwgcmFnZ2l1bmdpbWVudG8gaW50ZWdyYWxlIGRlZ2xpIE9iaWV0dGl2aSBkaSBTdmlsdXBwbyBTb3N0ZW5pYmlsZSBkZWxs4oCZQWdlbmRhIDIwMzAsIHF1YWxpIGd1aWRhIGFsbGEgcmljb3N0cnV6aW9uZSBpbiB1buKAmW90dGljYSBub24gc29sYW1lbnRlIGRpIHJpcHJpc3Rpbm8gZGVsbGEgc2l0dWF6aW9uZSBleCBhbnRlLCBtYSBhbmNoZSBkaSB0cmFuc2l6aW9uZSB2ZXJzbyB1bmEgc29jaWV0w6AgcGnDuSByZXNpbGllbnRlLCBncmVlbiBlIGluY2x1c2l2YSwgcGnDuSBwcm9udGEgYWxsZSBzZmlkZSBhdHR1YWxpIGUgZnV0dXJlLgoKCiMgUmlmZXJpbWVudGkKCioqQXV0b3JpdMOgIGRpIEJhY2lubyBEaXN0cmV0dHVhbGUgZGVsbOKAmUFwcGVubmlubyBDZW50cmFsZSoqLCBJbCBwcm9nZXR0byBSZVNUQVJULCBEYXRhIGRpIHVsdGltbyBhY2Nlc3NvOiAwOS8xMS8yMDIxIFtEaXNwb25pYmlsZSBhbCBsaW5rOiBodHRwczovL3d3dy5hdXRvcml0YWRpc3RyZXR0b2FjLml0L3Jlc3RhcnRdCgoqKkNhdmFsbGksIEwuLCBTYW5uYSwgUy4sIEFsaWJlZ292aWMsIE0uLCBBcnJhcywgRi4sIENvY2NvLCBHLiwgRmFybmlhLCBMLiwgTWFuY2EsIEUuLCBNdWxhcywgTC4gRi4sIE9ubmlzLCBNLiwgT3J0dSwgUy4sIFJvbWFuaSwgSS4gRy4sICYgVGVzdGEsIE0uKiosIFRoZSBDb250cmlidXRpb24gb2YgdGhlIEV1cm9wZWFuIENvaGVzaW9uIFBvbGljeSB0byB0aGUgMjAzMCBBZ2VuZGE6IGFuIEFwcGxpY2F0aW9uIHRvIHRoZSBBdXRvbm9tb3VzIFJlZ2lvbiBvZiBTYXJkaW5pYSwgRkVFTSBXb3JraW5nIFBhcGVyLCAyMDIwIFtEaXNwb25pYmlsZSBhbCBsaW5rOiBodHRwczovL3d3dy5mZWVtLml0L2VuL3B1YmxpY2F0aW9ucy9mZWVtLXdvcmtpbmctcGFwZXJzLW5vdGUtZGktbGF2b3JvLXNlcmllcy90aGUtY29udHJpYnV0aW9uLW9mLXRoZS1ldXJvcGVhbi1jb2hlc2lvbi1wb2xpY3ktdG8tdGhlLTIwMzAtYWdlbmRhLWFuLWFwcGxpY2F0aW9uLXRvLXRoZS1hdXRvbm9tb3VzLXJlZ2lvbi1vZi1zYXJkaW5pYS9dCgoqKkNhdmFsbGksIEwuLCBTYW5uYSwgUy4sIEFsaWJlZ292aWMsIE0uLCBBcnJhcywgRi4sIENvY2NvLCBHLiwgRmFybmlhLCBMLiwgTWFuY2EsIEUuLCBNdWxhcywgTC4gRi4sIE9ubmlzLCBNLiwgT3J0dSwgUy4sIFJvbWFuaSwgSS4gRy4sICYgVGVzdGEsIE0uKiosIFN1c3RhaW5hYmxlIERldmVsb3BtZW50IEdvYWxzIGFuZCB0aGUgRXVyb3BlYW4gQ29oZXNpb24gUG9saWN5OiBhbiBhcHBsaWNhdGlvbiB0byB0aGUgQXV0b25vbW91cyBSZWdpb24gb2YgU2FyZGluaWEuLCBKb3VybmFsIG9mIFVyYmFuIEVjb2xvZ3ksIGZvcnRoY29taW5nCgoqKkZhcm5pYSBMLiwgQ2F2YWxsaSBMLiwgTGl6emksIEcuLCAmIFZlcmdhbGxpLCBTLioqLCBNZXRob2RvbG9naWNhbCBJbnNpZ2h0cyB0byBNZWFzdXJlIHRoZSBBZ2VuZGEgMjAzMCBhdCBVcmJhbiBMZXZlbCBpbiBJdGFseSwgU3VzdGFpbmFiaWxpdHkgMjAxOSwgMTEoMTcpLCA0NTk4LCAyMDE5IFtEaXNwb25pYmlsZSBhbCBsaW5rOiBodHRwczovL2RvaS5vcmcvMTAuMzM5MC9zdTExMTc0NTk4XQoKCioqT3JnYW5penphemlvbmUgZGVsbGUgTmF6aW9uaSBVbml0ZSAoT05VKSoqLCBUcmFzZm9ybWFyZSBpbCBub3N0cm8gbW9uZG86IGzigJlBZ2VuZGEgMjAzMCBwZXIgbG8gU3ZpbHVwcG8gU29zdGVuaWJpbGUsIEEvUkVTLzcwLzEsIDIxIG90dG9icmUgMjAxNSBbRGlzcG9uaWJpbGUgYWwgbGluazogaHR0cHM6Ly91bnJpYy5vcmcvaXQvd3AtY29udGVudC91cGxvYWRzL3NpdGVzLzMvMjAxOS8xMS9BZ2VuZGEtMjAzMC1PbnUtaXRhbGlhLnBkZl0gCgoqKlByZXNpZGVuemEgZGVsIENvbnNpZ2xpbyBkZWkgTWluaXN0cmkqKiwgSWwgQ29tbWlzc2FyaW8gU3RyYW9yZGluYXJpbyBkZWwgR292ZXJubyBhaSBmaW5pIGRlbGxhIHJpY29zdHJ1emlvbmUgbmVpIHRlcnJpdG9yaSBpbnRlcmVzc2F0aSBkYWdsaSBldmVudGkgc2lzbWljaSB2ZXJpZmljYXRlc2kgYSBmYXIgZGF0YSBkYWwgMjQgQWdvc3RvIDIwMTYsIE9yZGluYW56YSBuLiAxMDkgZGVsIDIzIGRpY2VtYnJlIDIwMjAuIEFwcHJvdmF6aW9uZSBlbGVuY28gdW5pY28gZGVpIHByb2dyYW1taSBkZWxsZSBvcGVyZSBwdWJibGljaGUgbm9uY2jDqSBkaXNwb3Npemlvbmkgb3JnYW5penphdGl2ZSBlIGRlZmluaXppb25lIGRlbGxlIHByb2NlZHVyZSBkaSBzZW1wbGlmaWNhemlvbmUgZSBhY2NlbGVyYXppb25lIGRlbGxhIHJpY29zdHJ1emlvbmUgcHViYmxpY2EsIDIzIGRpY2VtYnJlIDIwMjAgW0Rpc3BvbmliaWxlIGFsIGxpbms6IGh0dHBzOi8vc2lzbWEyMDE2Lmdvdi5pdC93cC1jb250ZW50L3VwbG9hZHMvMjAyMC8xMi8xMDlfT1JESU5BTlpBX09QRVJFLVBVQkJMSUNIRV9ERUZJTklUSVZBX3NpZ25lZC5wZGZdIAoKCgo=