/*!************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/bodyPage.css ***!
  \************************************************************************************************************************/
/* ============================================
   BODY PAGE - Conteneur principal
   ============================================ */

#bodyPage {
    max-width: 1280px;
    margin: 10px auto;
}

hr {
    margin: 25px 0;
    border-top: var(--border);
    border-bottom: none;
}

/* ============================================
   BLOCS PLEINE LARGEUR
   #bodyPage reste la règle : une colonne de 1280px centrée. Un bloc peut en sortir pour
   aller d'un bord à l'autre de la fenêtre (marges latérales négatives, voir le bandeau de
   ilotScenes.css). Sa largeur est alors 100vw, qui COMPTE la barre de défilement
   verticale : sans la règle ci-dessous, il dépasserait à droite et la page gagnerait un
   défilement horizontal. `clip` coupe sans créer de contexte de défilement, contrairement
   à `hidden`.
   ============================================ */
html {
    overflow-x: clip;
}

/*!************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/hautDePage.css ***!
  \************************************************************************************************************************/
/* ============================================
   HAUT DE PAGE - Structure partagée
   Fichier noyau : structure et layout uniquement
   Les couleurs sont définies dans chaque espace
   ============================================ */

#hautDePage {
    display: flex;
    align-items: center;
    justify-content: space-between;
    position: relative;
    height: 42px;
    padding: 0 40px;
    z-index: 1000;
}

/* ============================================
   LOGO À GAUCHE
   ============================================ */

.headerLogo {
    flex-shrink: 0;
    display: flex;
    align-items: center;
}

.headerLogo a {
    display: flex;
    align-items: center;
    width: 100%;
    height: 100%;
}

.headerLogo svg {
    height: 35px;
    aspect-ratio: 245 / 36;
}

/* ============================================
   NAVIGATION PRINCIPALE AU CENTRE
   ============================================ */

#headerNav {
    flex-grow: 1;
    display: flex;
    justify-content: center;
    align-items: center;
}

#headerNav ul {
    display: flex;
    list-style: none;
    align-items: center;
    margin: 0;
    padding: 0;
}

#headerNav ul li {
    position: relative;
}

#headerNav ul li a {
    font-weight: 500;
    font-size: 16px;
    padding: 8px 16px;
    transition: all 0.3s ease;
    display: block;
    position: relative;
}

#headerNav ul li a::before {
    background: transparent;
    border-radius: 5px 5px 0 0;
    bottom: -2px;
    content: "";
    display: block;
    left: 8px;
    position: absolute;
    right: 8px;
    top: 4px;
    transition: .3s;
    z-index: -1;
}

/* ============================================
   BOUTONS À DROITE
   ============================================ */

#headerActions {
    flex-shrink: 0;
    display: flex;
    gap: var(--gapLarge); /* aligné 16 -> 20px (échelle PO 2026-07-18) */
    align-items: center;
}

#headerActions a,
#headerActions .btUrl {
    padding: 12px 24px;
    border-radius: 5px 5px 0 0;
    font-weight: 700;
    transition: all 0.3s ease;
    display: block;
}

/* ============================================
   BOUTON BURGER
   ============================================ */

#burgerBtn {
    display: none;
    flex-direction: column;
    justify-content: space-between;
    width: 30px;
    height: 24px;
    background: transparent;
    border: none;
    cursor: pointer;
    padding: 0;
    z-index: 1002;
}

#burgerBtn span {
    width: 100%;
    height: 3px;
    border-radius: 2px;
    transition: all 0.3s ease;
    transform-origin: center;
}

/* Scene du burger en X */
#burgerBtn.active span:nth-child(1) {
    transform: translateY(10.5px) rotate(45deg);
}

#burgerBtn.active span:nth-child(2) {
    opacity: 0;
}

#burgerBtn.active span:nth-child(3) {
    transform: translateY(-10.5px) rotate(-45deg);
}

/* ============================================
   MENU MOBILE FUSIONNÉ (nav + actions)
   ============================================ */

/* Caché par défaut sur desktop */
#mobileMenu {
    display: none;
}

/* Overlay pour fermer le menu */
#burgerOverlay {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: var(--cOverlay);
    z-index: 998;
}

#burgerOverlay.active {
    display: block;
}

/* Cacher les éléments destinés au burger menu sur desktop */
/* inutilisé 2026-06-13
.forBurgerMenu {
    display: none;
}
*/

/* ============================================
   MODE BURGER FORCÉ (quand le menu déborde)
   ============================================ */

#hautDePage.forceBurger #burgerBtn {
    display: flex;
}

#hautDePage.forceBurger #headerNav,
#hautDePage.forceBurger #headerActions {
    display: none;
}

#hautDePage.forceBurger #mobileMenu {
    display: block;
    position: fixed;
    top: 0;
    right: -100%;
    width: 80%;
    max-width: 300px;
    height: 100vh;
    box-shadow: -2px 0 8px var(--cOmbre);
    transition: right 0.3s ease;
    z-index: 1001;
    padding-top: 60px;
    overflow-y: auto;
}

#hautDePage.forceBurger #mobileMenu.open {
    right: 0;
}

#hautDePage.forceBurger #mobileMenu ul {
    list-style: none;
    margin: 0;
    padding: 0;
}

#hautDePage.forceBurger #mobileMenu ul li a {
    display: block;
    padding: 16px 24px;
    font-weight: 500;
    transition: background-color 0.2s ease;
}

/* inutilisé 2026-06-13
#hautDePage.forceBurger .mobileMenuActions {
    padding: 16px;
    display: flex;
    flex-direction: column;
    gap: var(--gapDefaut);
}

#hautDePage.forceBurger .mobileMenuActions a,
#hautDePage.forceBurger .mobileMenuActions .btUrl {
    display: block;
    text-align: center;
    padding: 16px;
    border-radius: var(--borderR1);
    font-weight: 700;
    transition: all 0.3s ease;
}
*/

/* inutilisé 2026-06-13
#hautDePage.forceBurger .forBurgerMenu {
    display: block;
}
*/

/* ============================================
   RESPONSIVE - TABLET ET MOBILE
   ============================================ */

@media (max-width: 1024px) {
    #hautDePage {
        padding: 0 15px;
    }

    #headerNav ul {
        gap: var(--gapLarge); /* aligné 16 -> 20px (échelle PO 2026-07-18) */
    }

    #headerActions a,
#headerActions .btUrl {
        padding: 8px 16px;
        font-size: 14px;
    }
}

@media (max-width: 1200px) {
    #hautDePage {
        padding: 8px 16px;
    }

    /* Afficher le bouton burger */
    #burgerBtn {
        display: flex;
    }

    /* Cacher nav et actions desktop */
    #headerNav,
    #headerActions {
        display: none;
    }

    /* Afficher le menu mobile */
    #mobileMenu {
        display: block;
        position: fixed;
        top: 0;
        right: -100%;
        width: 80%;
        max-width: 300px;
        height: 100vh;
        box-shadow: -2px 0 8px var(--cOmbre);
        transition: right 0.3s ease;
        z-index: 1001;
        padding-top: 60px;
        overflow-y: auto;
    }

    #mobileMenu.open {
        right: 0;
    }

    #mobileMenu ul {
        list-style: none;
        margin: 0;
        padding: 0;
    }

    #mobileMenu ul li a {
        display: block;
        padding: 16px 24px;
        font-weight: 500;
        transition: background-color 0.2s ease;
    }

    /* inutilisé 2026-06-13
    .mobileMenuActions {
        padding: 16px;
        display: flex;
        flex-direction: column;
        gap: var(--gapDefaut);
    }

    .mobileMenuActions a,
    .mobileMenuActions .btUrl {
        display: block;
        text-align: center;
        padding: 16px;
        border-radius: var(--borderR1);
        font-weight: 700;
        transition: all 0.3s ease;
    }
    */

    .headerLogo svg {
        max-height: 40px;
    }

    /* Afficher les éléments .forBurgerMenu dans le menu mobile */
    /* inutilisé 2026-06-13
    .forBurgerMenu {
        display: block;
    }
    */
}
/*!**************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/hautDePage.css ***!
  \**************************************************************************************************************************/
/* ============================================
   HAUT DE PAGE - Vitrine
   Import de la structure noyau + couleurs vitrine
   ============================================ */

/* ============================================
   COULEURS VITRINE
   ============================================ */

#hautDePage {
    background-color: var(--cBg);
    border-bottom: 1px solid var(--cBlanc3);
}

/* Navigation */
#headerNav ul {
    font: var(--fMenu14);
}

#headerNav ul li a {
    color: var(--cNoir3);
    text-decoration: none;
}

#headerNav ul li a:hover::before {
    background-color: var(--cAccent3);
    left: 0;
    right: 0;
    top: 0;
}

#headerNav ul li a:hover {
    color: var(--cBlanc);
}

#headerNav ul li a.active::before {
    background-color: var(--cAccent3);
    left: 0;
    right: 0;
    top: 0;
}

#headerNav ul li a.active {
    color: var(--cBlanc);
}

/* État estompé quand on survole un autre onglet */
#headerNav ul li a.active.estompe::before {
    background-color: var(--cAccent3);
    left: 2px;
    right: 1px;
    top: 2px;
    opacity: .8;
}

/* Onglet Tarifs : or, comme les boutons de la page Tarifs
   (survol et actif), pour ne pas ajouter une couleur de plus. */
#headerNav ul li a.navTarifs:hover::before {
    background-color: var(--cOr4);
}

#headerNav ul li a.navTarifs:hover {
    color: var(--cOrt);
}

#headerNav ul li a.navTarifs.active::before,
#headerNav ul li a.navTarifs.active.estompe::before {
    background-color: var(--cOr3);
}

#headerNav ul li a.navTarifs.active {
    color: var(--cOrt);
}

/* Boutons actions */
#headerActions a,
#headerActions .btUrl {
    font: var(--fMenu14);
    text-decoration: none;
}

/* Le bouton de l'en-tête, règle de base : bleu administration (décision chef de projet
   2026-09-06). La couleur vient de la classe accentAdministration (10_font.css) : ici on
   lit Accent, on n'écrit aucune teinte. Depuis le 2026-09-16, l'état NON CONNECTÉ passe en
   jaune (.btnSeConnecter, plus bas) — ce bleu ne sert plus qu'au survol de « Mon compte ». */
#headerActions #btnAccesServices {
    background-color: var(--cAccent3);
    color: var(--cAccentt);
}

#headerActions #btnAccesServices:hover {
    background-color: var(--cAccent4);
    color: var(--cAccentt);
}

#headerActions #btnAccesServices.active {
    background-color: var(--cAccent3);
    color: var(--cAccentt);
}

/* NON CONNECTÉ : « Se connecter », en JAUNE, texte NOIR (décision chef de projet
   2026-09-16). Le bleu des deux états ne disait pas au visiteur qu'il était déconnecté —
   et un visiteur déconnecté voit les cœurs « J'aime » sans pouvoir les toucher, sans
   comprendre pourquoi. Le jaune est celui de « Tarifs » (--cOr3 au repos, --cOr4 au
   survol) : deux couleurs pour deux états, lisibles de loin.
   Texte --cNoir1, pas --cOrt (blanc) comme dans « Tarifs » : le blanc sur ce jaune manque
   de contraste (le chef de projet le relève pour « Tarifs », qui reste en blanc pour
   l'instant). Le noir sur --cOr3 et sur --cOr4 est largement lisible.
   Une classe de plus que les règles bleues ci-dessus : elle l'emporte quel que soit l'ordre. */
#headerActions #btnAccesServices.btnSeConnecter,
#headerActions #btnAccesServices.btnSeConnecter.active {
    background-color: var(--cOr3);
    color: var(--cNoir1);
}

#headerActions #btnAccesServices.btnSeConnecter:hover {
    background-color: var(--cOr4);
    color: var(--cNoir1);
}

/* Connecté : le bouton devient « Mon compte », neutre au repos, bleu au survol. */
#headerActions #btnAccesServices.btnMonCompte {
    background-color: transparent;
    color: var(--cNoir1);
}

#headerActions #btnAccesServices.btnMonCompte:hover {
    background-color: var(--cAccent4);
    color: var(--cAccentt);
}

/* Burger button */
#burgerBtn span {
    background-color: var(--cNoir3);
}

.burgerBtnDark #burgerBtn span,
#burgerBtn.burgerBtnDark span {
    background-color: #fff;
}

/* ============================================
   MENU MOBILE - COULEURS VITRINE
   ============================================ */

#hautDePage.forceBurger #mobileMenu {
    background-color: var(--cBg);
}

#hautDePage.forceBurger #mobileMenu ul li {
    border-bottom: 1px solid var(--cBlanc5);
}

#hautDePage.forceBurger #mobileMenu ul li a {
    color: var(--cNoir3);
    font: var(--fMenu14);
    text-decoration: none;
}

#hautDePage.forceBurger #mobileMenu ul li a:hover {
    background-color: var(--cAccent3);
    color: var(--cBlanc);
}

#hautDePage.forceBurger #mobileMenu ul li a.active {
    background-color: var(--cAccent3);
    color: var(--cBlanc);
}

#hautDePage.forceBurger #mobileMenu ul li a.navTarifs:hover {
    background-color: var(--cOr4);
    color: var(--cOrt);
}

#hautDePage.forceBurger #mobileMenu ul li a.navTarifs.active {
    background-color: var(--cOr3);
    color: var(--cOrt);
}

#hautDePage.forceBurger .mobileMenuActions a,
#hautDePage.forceBurger .mobileMenuActions .btUrl {
    font: var(--fMenu14);
    text-decoration: none;
}

/* Le bouton d'accès aux services du menu mobile : bleu administration, comme son jumeau
   du bureau (#btnAccesServices) — la teinte vient de la classe accentAdministration posée
   sur le lien (décision chef de projet 2026-09-06). Remplace les règles #mobileConnexion /
   #mobileInscription, deux boutons qui n'existaient plus dans le gabarit. */
#hautDePage.forceBurger #mobileAccesServices {
    background-color: var(--cAccent3);
    color: var(--cAccentt);
}

#hautDePage.forceBurger #mobileAccesServices:hover {
    background-color: var(--cAccent4);
    color: var(--cAccentt);
}

/* Non connecté : le jaune et le noir du bouton du bureau (#btnAccesServices.btnSeConnecter). */
#hautDePage.forceBurger #mobileAccesServices.btnSeConnecter {
    background-color: var(--cOr3);
    color: var(--cNoir1);
}

#hautDePage.forceBurger #mobileAccesServices.btnSeConnecter:hover {
    background-color: var(--cOr4);
    color: var(--cNoir1);
}

/* ============================================
   RESPONSIVE MOBILE - COULEURS
   ============================================ */

@media (max-width: 768px) {
    #mobileMenu {
        background-color: var(--cBg);
    }

    #mobileMenu ul li {
        border-bottom: 1px solid var(--cBlanc5);
    }

    #mobileMenu ul li a {
        color: var(--cNoir3);
        font: var(--fMenu14);
        text-decoration: none;
    }

    #mobileMenu ul li a:hover {
        background-color: var(--cAccent3);
        color: var(--cBlanc);
    }

    #mobileMenu ul li a.active {
        background-color: var(--cAccent3);
        color: var(--cBlanc);
    }

    #mobileMenu ul li a.navTarifs:hover {
        background-color: var(--cOr4);
        color: var(--cOrt);
    }

    #mobileMenu ul li a.navTarifs.active {
        background-color: var(--cOr3);
        color: var(--cOrt);
    }

    .mobileMenuActions a,
    .mobileMenuActions .btUrl {
        font: var(--fMenu14);
        text-decoration: none;
    }

    /* Même bouton, même bleu, sur écran étroit sans classe forceBurger. */
    #mobileAccesServices {
        background-color: var(--cAccent3);
        color: var(--cAccentt);
    }

    #mobileAccesServices:hover {
        background-color: var(--cAccent4);
        color: var(--cAccentt);
    }

    /* Non connecté : jaune et noir, comme sur le bureau. */
    #mobileAccesServices.btnSeConnecter {
        background-color: var(--cOr3);
        color: var(--cNoir1);
    }

    #mobileAccesServices.btnSeConnecter:hover {
        background-color: var(--cOr4);
        color: var(--cNoir1);
    }
}
/*!**********************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/00_reset.css ***!
  \**********************************************************************************************************************/
*, ::after, ::before {
    box-sizing: border-box;
}

body {
    margin: 0;
}

ul {
    list-style-type: none;
    padding-inline-start: 0;
}
/*!*********************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/10_font.css ***!
  \*********************************************************************************************************************/
html {
    /* Il est interdit de rajouter des couleurs sans demander l'accord du PO */
    --cBlanc1: var(--cBlanc);
    /* inutilisé 2026-06-13  --cBlanc1p: #E0E0E0; */
    --cBlanc02: #F5F5F5;
    --cBlanc2: #F0F0F0;
    --cBlanc03: #dce1ea;
    --cBlanc3: #CCCFCC;
    /* inutilisé 2026-06-13  --cBlanc4: #AAAFAA; */
    --cBlanc5: #999C99;


    /* ============================================
       COULEURS TEXTE NOIR - UTILISATION OBLIGATOIRE
       ============================================ */

    /* --cNoir1 : ÉLÉMENTS D'EMPHASE
       - Titres : h1, h2, h3
       - Texte des boutons (quand pas de couleur définie)
       - Labels obligatoires (required)
       - Menus de navigation
       - Checkbox et radio boutons
       - Valeur principale dans les compteurs (ex: "3" dans "3 / 5")
    */
    --cNoir1: #181818;
    /* inutilisé 2026-06-13  --cNoir1o: #18181855; */

    /* --cNoir2 : CORPS DE TEXTE
       - Paragraphes <p>
       - Listes <li>, énumérations
       - Labels facultatifs
       - Texte saisi dans les inputs
       - Titres h4, h5, h6
       - Valeur secondaire dans les compteurs (ex: "/ 5" dans "3 / 5")
    */
    --cNoir2: #282828;

    /* --cNoir3 : TEXTE TERTIAIRE
       - Placeholders
       - Messages d'aide discrets
       - Texte désactivé
    */
    --cNoir3: #555;

    /* --cNoir4-5 : TEXTE TRÈS ATTÉNUÉ
       - Éléments désactivés
       - Texte décoratif
    */
    --cNoir4: #999;
    --cNoir5: #BBB;
    --cBlanc: #FFF;
    --cNoir: #000;
    --cTexte1: #222;
    /* inutilisé 2026-06-13  --cTexte2: #444; */
    --cForm: #000;
    /* inutilisé 2026-06-13  --cForm_b: #555; */

    /* ============================================
       PALETTES DE RÔLE — une seule forme, 8 paliers, toujours nommés pareil
       0 fond très pâle · 1 fond pâle · 2 bordure / moyen · 3 couleur pleine (bouton, lien,
       onglet actif, indicateur) · 4 foncé / survol · _a dégradé · _ah dégradé au survol ·
       t texte posé sur la couleur pleine.
       Accent est la couleur de l'espace où l'on est : elle change par une classe sur <body>
       (voir le bloc après html{}). Or, Rouge et Succes ne changent jamais.
       Décision PO 2026-09-05. Aucune autre couleur de rôle n'est admise.
       ============================================ */

    /* Accent : voir le bloc body { } après html { }. Elle vit sur body, pas ici — une
       variable dérivée (dégradé, halo) se calcule là où elle est déclarée, et doit donc
       être déclarée sur le même élément que la classe qui change la couleur. */

    /* Or — s'inscrire, connexion, tarif, mise en avant */
    --cOr0: #fefce8;
    --cOr1: #fef3c7;
    --cOr2: #f5d96b;
    --cOr3: #FFD814; /* l'or d'Amazon, texte foncé dessus (décision chef de projet 2026-10-07) */
    --cOr4: #FFCE12; /* son survol */
    --cOr_a: linear-gradient(to bottom, var(--cOr3), var(--cOr4) 100%);
    --cOr_ah: linear-gradient(to bottom, var(--cOr3), var(--cOr3) 100%);
    --cOrt: #181818; /* foncé : le blanc sur --cOr3 ne faisait que 2,0:1 de contraste, 8,8:1 ainsi (décision chef de projet 2026-10-07) */

    /* Rouge — erreur, alerte, suppression, geste dangereux */
    --cRouge0: #fdf3f2;
    --cRouge1: #fbe2df;
    --cRouge2: #f5aaa3;
    --cRouge3: #f15b4e;
    --cRouge4: #930000;
    --cRouge_a: linear-gradient(to bottom, var(--cRouge3), var(--cRouge4) 100%);
    --cRouge_ah: linear-gradient(to bottom, var(--cRouge3), var(--cRouge3) 100%);
    --cRouget: #FFF;

    /* Cœur « J'aime » — un rouge à lui, sang, bordeaux foncé : le rouge de la famille dit
       l'alerte et le danger, pas l'affection (décision chef de projet 2026-09-16).
       Deux crans, comme les autres familles : le pâle du survol, la couleur du cœur. */
    --cCoeur0: #f6e4e7;
    --cCoeur3: #c1192f;

    /* Succes — validation, confirmation */
    --cSucces0: #f0fbff;
    --cSucces1: #ddf1fa;
    --cSucces2: #93d3ea;
    --cSucces3: #0e9dc9;
    --cSucces4: #0b5f7a;
    --cSucces_a: linear-gradient(to bottom, var(--cSucces3), var(--cSucces4) 100%);
    --cSucces_ah: linear-gradient(to bottom, var(--cSucces3), var(--cSucces3) 100%);
    --cSuccest: #FFF;

    --cBackground: var(--cBlanc);

    /* Le bandeau des aperçus (pageRubrique.css, ≥ 1600px). UN PLATEAU UNI AU CENTRE, le dégradé
       sur les bords seulement (décision chef de projet 2026-09-24) : l'ancien dégradé allait
       du gris des bords au blanc du centre, et des cartes blanches identiques paraissaient
       blanches sur le gris et ternes sur le blanc. Sur le plateau, toutes se détachent
       pareil. Deux halos de couleur, tenus dans les bords, donnent un peu de vie : le bleu
       du site en haut à gauche, l'orange des illustrations en bas à droite. */
    --cBackgroundGrand:
        radial-gradient(14% 40% at 0% 25%, #436bc11f, transparent),
        radial-gradient(14% 40% at 100% 75%, #f39c341f, transparent),
        linear-gradient(90deg, #E8EBF0 0%, #F4F5F7 12%, #F4F5F7 88%, #E8EBF0 100%);

    /* Layout */
    --largeur: 1360px;
    /* inutilisé 2026-06-13  --maxWidth: 760px; */
    --cBg: var(--cBlanc);
    /* inutilisé 2026-06-13  --cBg_b: #CCC; */

    /* Noir transparent — ombres */
    --cOmbre: #0002;            /* environ 15% */
    --cOmbreForte: #0004;       /* environ 30% */

    /* transparent — overlays */
    --cOverlay: #0008;          /* environ 50% */
    --cBlancOverlay: #FFFC;     /* environ 80% */
    --cBlancVerre: #FFFFFF8C;   /* environ 55% — verre dépoli, toujours avec un flou (barre et bulle de l'aperçu) */

    /* Ombres composées */
    --ombrePortee: 0 4px 12px var(--cOmbre);
    --ombrePortee2: 0 0px 25px #000;
    --ombreModale: 0 10px 40px var(--cOmbreForte);
    --ombreInterne: 0 0 10px 10px inset var(--cBlanc02);

    /* Couleurs Noir gradients */
    /* inutilisé 2026-06-13  --cNoir3_a: linear-gradient(to bottom, #505858, #303838 100%); */
    /* inutilisé 2026-06-13  --cNoir3_ah: linear-gradient(to bottom, #505858, #505858 100%); */
    /* inutilisé 2026-06-13  --cNoir3_ahLight: linear-gradient(to bottom, #707878, #707878 100%); */
    /* inutilisé 2026-06-13  --cNoir3_at: #FFF; */


    /* inutilisé 2026-06-13  --sAlerte_s: #DEC4C4; */
    /* inutilisé 2026-06-13  --cTuto: #C6F; */
    /* inutilisé 2026-06-13  --cTuto_t: #000; */
    /* inutilisé 2026-06-13  --cTuto_ah: #d79af2; */
    /* inutilisé 2026-06-13  --cBlanc1_t: #181818; */
    /* inutilisé 2026-06-13  --cPlacehoder: #888; */
    /* inutilisé 2026-06-13  --cForm_s: #FFF; */
    /* inutilisé 2026-06-13  --bsCta: 0 7px 14px #3352, 0 3px 6px #0001; */

    /* Formulaires utilisateur */
    /* inutilisé 2026-06-13  --cFormUsr: #EEFAFF; */
    /* inutilisé 2026-06-13  --cFormUsr_b: #334; */
    /* inutilisé 2026-06-13  --cFormUsr_h: #FFF; */
    /* inutilisé 2026-06-13  --cFormUsr_bf: #0AF; */
    /* inutilisé 2026-06-13  --cFormUsr_cb: #059; */
    /* inutilisé 2026-06-13  --cForm_bf: #3C0; */
    /* inutilisé 2026-06-13  --cForm_cb: #590; */
    /* inutilisé 2026-06-13  --cKo_b: #F88; */

    /* Logo */
    /* inutilisé 2026-06-13  --cLogo1: #EBF7E4; */
    /* inutilisé 2026-06-13  --cLogo2: #C6E9AF; */

    --ffBase: 'Noto Sans', Arial, sans-serif;
    --ffMono: 'JetBrainsMono', 'Verdana', monospace;
    /* Police standard de l'écran public (tout ce qui est projeté) — seule source, lue aussi
       par les canvas via policeEcran() (kitPlugin/shared/police.ts). Décision 2026-08-29 :
       Noto Sans seule, pas de Scada ni Montserrat sur ce que voit le public. */
    --ffEcran: 'Noto Sans', sans-serif;
    /* Police des chiffres de l'écran public (tirages, compte à rebours, panneaux à volets) —
       chiffres monolarges garantis aux deux familles, lue par les canvas via policeChiffres().
       Décision 2026-08-29 : remplace 'Courier New' (police machine, absente d'Android/Linux). */
    --ffChiffres: 'Ubuntu Sans', 'Noto Sans', sans-serif;

    /* Il est interdit de rajouter des styles typo sans demander l'accord du PO */
    /* inutilisé 2026-06-13  --fTitre: normal normal 700 32px 'Scada', sans-serif; */
    --fH1: normal normal 700 32px 'Scada', sans-serif;
    --fH2: normal normal 700 24px 'Scada', sans-serif;
    --fH3: normal normal 400 22px 'Scada', sans-serif;
    --fH4: normal normal 400 18px 'Scada', sans-serif;
    /* Titre de l'événement sur l'écran public (.zoneTitreTexte) : police de l'écran, pas Scada.
       La taille est recalée à l'affichage par GestionnaireFondEnTete. Décision chef de projet 2026-09-14. */
    --fTitreEcran: normal normal 700 32px var(--ffEcran);
    --fMenu14: normal normal 400 14px 'Montserrat', sans-serif;
    /* Cran compact de la barre de pilotage (AdaptationBarre.ts) : la barre redéfinit --fMenu14 avec
       celle-ci pour son seul périmètre. Décision du chef de projet 2026-09-03. */
    --fMenu13: normal normal 400 13px 'Montserrat', sans-serif;
    --fCta16: normal normal 700 18px 'Montserrat', sans-serif;
    /* Remise en service le 2026-09-16 (décision chef de projet) : le mono d'un LIBELLÉ, par
       opposition à --fMono24b qui est le mono d'un GROS CHIFFRE (codes d'accès, compteurs).
       Première usagère : l'étiquette d'une scène sur la Vitrine (composants/etiquetteJaime.css).
       Le repli 'Courier New' est une vraie chasse fixe — celui de --ffMono (Verdana) n'en est
       pas une. */
    --fMono16: normal normal 400 16px 'JetBrainsMono', 'Courier New', Courier, monospace;
    /* inutilisé 2026-06-13  --fMono24: normal normal 400 24px 'JetBrainsMono', 'Courier New', Courier, monospace; */
    --fMono24b: normal normal 700 24px 'JetBrainsMono', 'Courier New', Courier, monospace;
    --fCta20: normal normal 700 20px 'Montserrat', sans-serif;
    /* inutilisé 2026-06-13  --fLegend16: normal normal 400 20px 'Scada', sans-serif; */
    --fLight14: italic normal 200 14px 'Noto Sans', Verdana, Geneva, Arial, sans-serif;
    --fMini11: italic normal 200 11px 'Noto Sans', Verdana, Geneva, Arial, sans-serif;
    --fText16: normal normal 400 16px 'Noto Sans', Verdana, Geneva, Arial, sans-serif;
    --fText16Strong: normal normal 700 16px 'Noto Sans', Verdana, Geneva, Arial, sans-serif;
    --fItalic16: italic normal 400 16px 'Noto Sans', Verdana, Geneva, Arial, sans-serif;
    --fAlerte16: italic small-caps 700 20px 'Noto Sans', Verdana, Geneva, Arial, sans-serif;
    --fLabel: normal normal 400 14px 'Noto Sans', Verdana, Geneva, Arial, sans-serif;

    --border: 1px solid #dce1ea;
    --borderR0: 3px;
    --borderR1: 5px;
    --borderR2: 7px;
    --borderCarte: 1px solid var(--cNoir4);
    --borderForm: 1px solid var(--cNoir5);
    --borderInput: 1px solid var(--cNoir5);

    /* Espacements — nommés par rôle (comme les bordures), accord PO 2026-07-03.
       Migration progressive : ne remplacer une valeur en dur que si le rôle ET la valeur
       correspondent (no-op visuel) ; aligner une dérive de valeur = décision à part. */
    --gapListe: 32px;   /* entre les éléments d'une liste. La colonne qui borde la liste (ex. panneau de filtres) prend le MÊME gap : deux rythmes différents côte à côte, c'est moche */
    --paddingCorps: 20px;   /* intérieur d'un corps de bloc / panneau / modale */
    --gapDefaut: 8px;       /* espace standard entre éléments frères (flex/grid) */
    --gapReduit: 4px;       /* variante volontairement plus serrée : listes compactes, groupes de boutons */
    --gapMoyen: 12px;    /* espacement intermédiaire entre éléments frères */
    --gapLarge: 20px;    /* espacement généreux entre groupes d'éléments */
    --gapColonnes: 4rem; /* entre deux colonnes de page de nature différente : le texte et son image, le menu et son contenu (décision chef de projet 2026-09-17) */
    --gapBlocs: 10rem;   /* le blanc entre deux blocs empilés d'une même colonne de lecture : l'article, ses questions, ses scénarios ; deux chapitres (décision chef de projet 2026-09-17) */
    --paddingMiniDiv: 8px 16px; /* padding de tout les blocs avec fond colorées */
    --paddingEtiquette: 3px 6px; /* padding des span et autres etiquette */
    --paddingCarte: 16px 20px;   /* intérieur d'une CARTE — son corps comme sa barre d'actions. La carte existe en trois exemplaires jumeaux (blocs.css, ilotScenarios.css, 55_scenariosCompatibles.css) : chacun recopiait le chiffre, ils lisent maintenant la même variable (décision chef de projet 2026-09-07) */
    --paddingCarteEtroit: 12px 20px; /* la même carte en fenêtre étroite, quand la barre d'actions passe sous le corps */
    --paddingCta: 15px 20px;     /* LE grand bouton : pleine largeur, min-width 180px, fonte --fCta16. La silhouette compacte, elle, prend --paddingCta14 (décision chef de projet 2026-09-07) */
    --paddingBadge: 4px 16px;    /* un badge en pilule, posé sur un bloc — pas la petite étiquette inline d'un récap, qui garde --paddingEtiquette */
    --paddingPastille: 6px 14px; /* une pastille NON cliquable : une étape, un état, un filtre posé */
    --paddingInput: 10px 12px;   /* l'intérieur d'un champ de saisie (--borderInput dit sa bordure) */
    --paddingCellule: 8px 16px 8px 0; /* une cellule de tableau : rien à gauche, la colonne commence au texte */
    --paddingCode: 12px 16px;    /* un bloc de code à recopier */
    --paddingLigneListe: 16px 0; /* une ligne LARGE d'une liste — une question qu'on déplie, un état vide. Les lignes ordinaires prennent --gapDefaut 0 */
    --paddingRecap: 10px 14px;   /* le rythme intérieur du récapitulatif de composition (blocs, actions, encadrés) */
    --paddingPage: 30px 40px;    /* l'enveloppe d'une page : .contenu, et les colonnes du bas de page */
    --paddingCarteLarge: 30px 25px; /* une carte qui doit respirer : une offre, une catégorie d'aperçu */
    --paddingRappel: 20px 40px 25px; /* une carte de rappel du compte (.divRappel), et tout bloc posé à côté d'elles sur la même page (.aide, .enAttente) : les titres et les textes tombent à l'aplomb */
    --paddingBandeau: 4rem;      /* le bandeau des aperçus, qui traverse la fenêtre sur grand écran */
    --retraitListeCourt: 20px;   /* le retrait d'un ul de liste courte — récap, progression, ul générique. Le retrait FRANC du rédactionnel est --retraitListe */
    --retraitListe: 40px;        /* le retrait d'un ul rédactionnel — article, chapitre, réponse de FAQ. Ce retrait franc dit que ces lignes sont un bloc à part, et non la suite du paragraphe */

    /* Boutons : un bouton ne choisit NI son padding, NI sa bordure, NI sa couleur
       (décision PO 2026-07-18). Il prend ces variables — ou pas de bordure, ou la
       couleur d'un rôle (primaire, danger, aperçu) — jamais une valeur à lui. */
    --paddingCta14V: 8px;                 /* l'air vertical d'un bouton compact, seul : la barre de pilotage en déduit sa hauteur (_studioIntegree.css) */
    --paddingCta14: var(--paddingCta14V) 16px; /* padding de tout bouton compact (.cta14, .ctaDiscret, toggles) */
    --borderCta: 1px solid var(--cNoir4); /* LA bordure d'un bouton : celle-ci ou aucune */
    --cCtaTexte: var(--cNoir2);         /* LE texte d'un bouton neutre : ce noir ou une couleur de rôle */
}

/* ============================================
   ACCENT — la couleur de l'espace où l'on est. Déclarée sur body, JAMAIS sur html
   ou :root : une variable dérivée (--cAccent_a, --cFormFocusHalo…) se calcule sur
   l'élément où elle est déclarée ; sur html elle figerait le bleu par défaut et la
   classe du body ne changerait plus que les valeurs directes.
   La classe du <body> choisit la teinte ; sans classe : bleu administration.
   Vitrine : baseVitrinePublic.twig pose bodyPageVitrine.
   Studio : studio/base.twig pose modeTester ou modeDiffuser selon l'onglet principal
   (la page se recharge à chaque changement de mode, pas de Turbo).
   Une règle qui a besoin d'Accent au niveau :root doit lire var(--cAccent…) sur
   l'élément concerné, pas déclarer une variable dérivée à la racine.
   ============================================ */

/* Bleu administration : compte, tarifs, données, Studio hors mode, onglet Préparer */
body {
    --cAccent0: #f1f4f8;
    --cAccent1: #e3eef8;
    --cAccent2: #accee8;
    --cAccent3: #436bc1;
    --cAccent4: #335bb1;
    --cAccent_a: linear-gradient(to bottom, var(--cAccent3), var(--cAccent4) 100%);
    --cAccent_ah: linear-gradient(to bottom, var(--cAccent3), var(--cAccent3) 100%);
    --cAccentt: #FFF;

    /* Focus des champs : l'accent, et son halo à 15 % */
    --cFormFocus: var(--cAccent3);
    --cFormFocusHalo: color-mix(in srgb, var(--cAccent3) 15%, transparent);
}

/* Vitrine, pages publiques : vert */
.bodyPageVitrine {
    --cAccent0: #f0f9f4;
    --cAccent1: #dcf2e5;
    --cAccent2: #9fd9b8;
    --cAccent3: #08914c;
    --cAccent4: #075524;
}

/* Studio, onglet Tester : violet */
.modeTester {
    --cAccent0: #f7f1f9;
    --cAccent1: #ecdcf3;
    --cAccent2: #d2a8e0;
    --cAccent3: #9b59b6;
    --cAccent4: #783b92;
}

/* Studio, onglet Diffuser : bleu diffusion */
.modeDiffuser {
    --cAccent0: #f0f6fb;
    --cAccent1: #e0eef8;
    --cAccent2: #a6cdea;
    --cAccent3: #308ed1;
    --cAccent4: #2572a9;
}

/* Bleu administration POSÉ SUR UN ÉLÉMENT, dans un autre espace (décision chef de projet
   2026-09-06) : un geste d'administration au milieu d'une page publique — créer un événement
   depuis la page d'une scène ou la page Configurer d'un scénario — se dit en bleu, pas dans
   la couleur de la page. Mêmes cinq valeurs que le body sans classe : c'est le même espace,
   ramené sur l'élément qui le porte (le bouton lui-même, pas sa barre : les voisins gardent
   la couleur de la page). Une règle qui lit var(--cAccent…) sur cet élément voit le bleu. */
.accentAdministration {
    --cAccent0: #f1f4f8;
    --cAccent1: #e3eef8;
    --cAccent2: #accee8;
    --cAccent3: #436bc1;
    --cAccent4: #335bb1;
}

/* ============================================
   TITRES ET TYPOGRAPHIE
   ============================================ */

h1, h2, h3 {
    color: var(--cNoir1);
}

h4 {
    color: var(--cNoir2);
}

h5, h6 {
    color: var(--cNoir3);
}

p, li {
    color: var(--cNoir2);
}

h1, h2, h3, h4, h5, h6 {
    font: var(--fH1);
}

button {
    font: var(--fCta16);
}

h1 {
    font: var(--fH1);
    margin: 10px 15px 5px 0;
    padding: 0;
}

h2 {
    font: var(--fH2);
    margin: 15px 10px 5px 0;
    padding: 0;
}

h3 {
    font: var(--fH3);
    padding: 0;
    margin: 25px 0 15px;
}

h4, h5 {
    font: var(--fH4);
}

h4, h5, h6 {
    margin: 25px 0 7px;
}

/* <i> est utilisée comme balise de suffixe (#2, #3…) sur les noms d'éléments.
   La balise <em> remplace <i> pour l'italique sémantique. */
i {
    display: inline-block;
    font-size: 75%;
    font-weight: 700;
    font-style: italic;
    font-family: var(--ffMono);
}
/*!********************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/31_cta.css ***!
  \********************************************************************************************************************/
button {
    user-select: none;
    -webkit-user-select: none;
    display: inline-block;
    cursor: pointer;
    margin: 0;
    color: var(--cAccent3);
    font: var(--fCta16);
    text-decoration: none;
}

button.ctaAnnuler {
    font: var(--fText16);
    color: var(--cAccent3);
    background: transparent;
    border: transparent;
    text-decoration: none;
}

/* button.lienBouton : un <button> qui a le visuel d'un lien (templates/CLAUDE.md, « Bouton
   ou lien ? ») — il prend exactement le style de a (décision chef de projet 2026-09-14) */
a,
button.lienBouton {
    color: var(--cAccent3);
    display: inline-block;
    text-decoration: none;
    padding: var(--gapReduit) 0;
}

button.lienBouton {
    font: var(--fText16);
    background: none;
    border: none;
}

a:focus,
button.lienBouton:focus {
    outline: none;
}

a:focus-visible,
button.lienBouton:focus-visible {
    box-shadow: 0 0 0 3px var(--cFormFocus);
}


button.ctaAnnuler,
a.ctaAnnuler {
    text-decoration: none;
    display: block;
    margin: 20px 0;
    padding: 0;
    color: var(--cNoir3);
}

button.btn, a.btn {
    min-width: 180px;
    cursor: pointer;
    border: 0;
    color: var(--cAccentt);
    background-color: var(--cAccent3);
    font: var(--fCta16);
    text-align: center;
    transition: all 0.3s;
    position: relative;
    padding: var(--paddingCta);
    margin: 10px 0;
    border-radius: var(--borderR1);
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    text-decoration: none;
    gap: var(--gapMoyen); /* aligné 10 -> 12px (échelle PO 2026-07-18) */
}

a.btn:hover, button.btn:hover {
    color: var(--cAccentt);
    background-color: var(--cAccent4);

}

/* inutilisé 2026-06-13
button.btn2, a.btn2 {
    min-width: 100px;
    display: block;
    cursor: pointer;
    border: 0;
    font: var(--fCta20);
    padding: 20px 40px;
    margin: 20px auto;
    text-align: center;
    transition: all 0.3s;
    color: var(--cTexte1);
    position: relative;
    background-repeat: round;
    width: fit-content;
    border-radius: 12px;
}

button#redirection.btn2 {
    background-color: transparent;
}

button#redirection.btn2:hover,
a.btn2:hover, button.btn2:hover {
    color: var(--cAccentt);
    background-color: var(--cAccent4);
}
*/

/* ============================================
   CTA COMPACT — socle .cta14

   LA silhouette des boutons d'action compacts (barres d'action, cartes) :
   forme, police, dimensions définies ici et nulle part ailleurs. Modèle :
   le bouton de la barre de contrôle aperçu (décision PO 2026-07-18).
   Se pose à côté du rôle qui apporte sa couleur : class="cta14 ctaPreviewControle".
   14 = la taille de police (--fMenu14). Silhouette formulaire à venir : .cta18.
   ============================================ */

.cta14 {
    display: inline-block; /* un <a> hors barre flex reste un bouton (padding vertical réel) */
    padding: var(--paddingCta14);
    font: var(--fMenu14);
    border: none;
    border-radius: var(--borderR1);
    cursor: pointer;
    /* Un bouton n'est jamais souligné, quelle que soit sa balise : la Vitrine souligne tous
       ses liens (vitrine.css, décision PO 2026-08-25), un <a class="cta14"> y était souligné
       comme un lien de paragraphe (décision chef de projet 2026-09-06). */
    text-decoration: none;
    transition: background 0.2s, color 0.2s, border-color 0.2s;
}

/* La silhouette compacte GAGNE sur un rôle qui porte aussi une silhouette : la page des
   tarifs de la Vitrine redéfinit .ctaOr en grand bouton de carte (offres.css : display block,
   grand padding, police 16), ce qui écrasait « cta14 ctaOr » — le petit bouton doré qui mène
   à l'offre du dessus (page « Mon studio », scènes réservées à une offre : décision chef de
   projet 2026-10-07). Même composition que « cta14 ctaPrimaire », même taille. */
.cta14.ctaOr {
    display: inline-block;
    width: auto;
    margin: 0;
    padding: var(--paddingCta14);
    font: var(--fMenu14);
    text-align: left;
    /* LE JAUNE PÂLE DU PETIT BOUTON (décision chef de projet 2026-10-08) : le jaune plein
       d'Amazon (--cOr3) est fait pour les gros boutons et l'onglet « Tarifs » ; sur un petit
       bouton posé dans une page aux tons neutres et pastel, il prenait le dessus sur tout le
       reste. Fond pâle (--cOr1), et une bordure jaune pour qu'on le voie comme un bouton et
       comme du jaune : c'est elle, plus que le fond, qui le détache de la page. Même épaisseur
       que les autres boutons (--borderCta), seule la couleur change. */
    background: var(--cOr1);
    border: var(--borderCta);
    border-color: var(--cOr3);
}

.cta14.ctaOr:hover {
    background: var(--cOr2);
    border-color: var(--cOr4);
}

/* LE PETIT BOUTON EN JAUNE PLEIN (décision chef de projet 2026-10-14) : la même silhouette
   compacte, les couleurs du gros bouton des tarifs (.ctaOr). Pour le bouton qui est SEUL et
   doit se voir : « Mon studio », la limite d'événements atteinte du Studio. Là où il revient
   souvent (vignettes, listes de scénarios, page d'une scène), le jaune pâle reste. */
.cta14.ctaOr.ctaOrPlein {
    background: var(--cOr3);
    border-color: var(--cOr3);
    color: var(--cOrt);
}

.cta14.ctaOr.ctaOrPlein:hover {
    background: var(--cOr4);
    border-color: var(--cOr4);
}

.cta14:disabled {
    opacity: 0.4;
    cursor: auto;
}

/* Rôle action principale : LE bouton qui fait la chose pour laquelle la page existe
   (créer un événement…), en Accent — la couleur de l'espace, ou celle qu'un
   .accentAdministration pose sur lui. Un seul rôle, défini ici et nulle part ailleurs
   (décision chef de projet 2026-09-06) : pas de CSS par bouton. */
.ctaPrimaire {
    background: var(--cAccent3);
    color: var(--cAccentt);
}

.ctaPrimaire:hover {
    background: var(--cAccent4);
    color: var(--cAccentt);
}

/* Rôle offre : LE bouton qui mène aux offres et aux tarifs — Or, la couleur du prix et de
   l'inscription (couleurs.md). L'encadré « limite d'événements » du Studio. */
.ctaOr {
    background: var(--cOr3);
    color: var(--cOrt);
}

.ctaOr:hover {
    background: var(--cOr4);
    color: var(--cOrt);
}

/* Rôle aperçu : LE bouton qui lance un aperçu — violet aperçu, partout
   (catalogue, page Modifier, fiches d'animation). Un aperçu = violet,
   décision PO 2026-07-18. */
.ctaPreview {
    background: var(--cAccent_a);
    color: var(--cBlanc);
}

.ctaPreview:hover {
    background: var(--cAccent_ah);
}

/* ============================================
   BADGE MODE TEST - Réutilisable partout
   ============================================ */

.badgeModeTest {
    display: inline-block;
    padding: var(--paddingBadge);
    font: var(--fLabel);
    color: var(--cBlanc);
    background: var(--cAccent3);
    border-radius: 10px;
    margin: 10px 0;
}
/*!****************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/composants/boutonFermeture.css ***!
  \****************************************************************************************************************************************/
/* ============================================
   BOUTON DE FERMETURE (.modaleClose) — source unique (docs/designSystem/boutonFermeture.md)

   La croix est dessinée par ::before (mask SVG ci-dessous) : en HTML le bouton reste VIDE —
   ne JAMAIS y mettre × / &times; / texte. Réutilisable : VIDE = croix centrée ; avec un
   enfant .modaleCloseTexte = la même boîte s'élargit et un libellé s'ajoute à GAUCHE de la
   croix (ex. « Prendre la main ✕ »). Pas de padding horizontal : la croix a déjà ~6px de
   marge interne à droite (mask 6→18 sur viewBox 24), c'est .modaleCloseTexte qui redonne
   le même air à gauche → équilibré.

   Ici la silhouette GÉNÉRALE (boîte souple, croix 20px — barre d'aperçu écran). Les
   contextes n'écrivent que leurs écarts, APRÈS leur @import de ce fichier :
   - modales Studio (56_scenario/_modale.css) : boîte fixe 44×44, croix 24 ;
   - surcouche aperçu (composants/surcouchePreview.css) : idem + masque « plein écran ».
   ============================================ */

.modaleClose {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 25px;
    padding: var(--gapDefaut) var(--gapReduit); /* vertical aligné sur .cta14 (même rythme dans la barre aperçu) */
    gap: var(--gapDefaut);
    border: none;
    border-radius: var(--borderR1);
    background: transparent;
    cursor: pointer;
    transition: background 0.2s;
}

.modaleClose::before {
    content: '';
    order: 1; /* croix à droite d'un éventuel .modaleCloseTexte (seule = centrée, inchangé) */
    width: 20px;
    height: 20px;
    background-color: var(--cNoir1);
    mask: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27black%27 stroke-width=%271.5%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cline x1=%2718%27 y1=%276%27 x2=%276%27 y2=%2718%27/%3E%3Cline x1=%276%27 y1=%276%27 x2=%2718%27 y2=%2718%27/%3E%3C/svg%3E") center / contain no-repeat;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27black%27 stroke-width=%271.5%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cline x1=%2718%27 y1=%276%27 x2=%276%27 y2=%2718%27/%3E%3Cline x1=%276%27 y1=%276%27 x2=%2718%27 y2=%2718%27/%3E%3C/svg%3E") center / contain no-repeat;
}

.modaleClose:hover {
    background: var(--cBlanc02);
}

/* Libellé optionnel à gauche de la croix (cf. en-tête). Le padding gauche donne au texte
   le même air (~6px) que la marge interne de la croix à droite → visuellement équilibré. */
.modaleCloseTexte {
    padding-left: var(--gapReduit);
    font: var(--fMenu14);
    color: var(--cNoir1); /* même teinte que la croix */
}

/*!*****************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/composants/surcouchePreview.css ***!
  \*****************************************************************************************************************************************/
/* ============================================
   SURCOUCHE APERÇU — pop-up iframe (composant noyau)

   Ouvre un aperçu (animation ou scénario) dans la page quand la fenêtre est
   assez grande, au lieu d'un nouvel onglet. Un seul système pour tous les
   aperçus, Studio comme Vitrine (décision PO 2026-07-18).

   Boutons : base .modaleClose (composants/boutonFermeture.css, source unique de la croix),
   surcouche = uniquement l'écart de taille ci-dessous.

   Markup généré par surcouchePreview.ts (noyau) sur les déclencheurs [data-preview]
   (liens href ou boutons data-url), aucun template :
   .surcouche > .surcoucheContenu > .surcoucheBarre (plein écran + croix) + .surcoucheIframe

   Les seuils d'ouverture (iframe 16/9 d'au moins 960×540 + marges 80/120)
   vivent dans surcouchePreview.ts — garder TS et dimensionnement CSS alignés.
   ============================================ */

/* Boutons de la barre : base .modaleClose (composant, croix comprise) — posée par le TS sur
   les deux boutons. Ici uniquement l'écart surcouche (44×44, icônes 24) + le masque plein écran. */

.surcouche {
    border: none;
    border-radius: var(--borderR1);
    padding: 0;
    box-shadow: var(--ombreModale);
    background: transparent;
}

.surcouche::backdrop {
    background: var(--cOverlay);
}

.surcoucheContenu {
    background: var(--cBlanc);
    border-radius: var(--borderR1);
    overflow: hidden;
    display: flex;
    flex-direction: column;
}

.surcoucheBarre {
    position: relative; /* les onglets se centrent sur elle */
    display: flex;
    align-items: center;
    justify-content: flex-end;
    /* Pas de trait sous la barre : il ressortait sur la bulle de l'aperçu collée dessous
       (chef de projet, 2026-09-17). */
}

/* POC (chef de projet, 2026-09-16) : les onglets de l'aperçu dans la barre de titre, à gauche
   (surcouchePreview.ts, alimentés par l'aperçu). Même air que la barre de l'aperçu : marge de
   8, écart de 8. Sobres, c'est une barre de titre : aucun fond, le gris du texte tertiaire
   (cNoir3) au repos, un contour de cette couleur ; l'onglet dont la vue est ouverte prend la
   couleur des icônes de la barre, le noir de la croix (chef de projet, 2026-09-16). */
/* CENTRÉS sur la barre de titre, pas calés à gauche (chef de projet, 2026-09-16) : centrés,
   on les voit ; et quand un onglet s'ajoute à la fin de l'aperçu, le groupe se recentre et
   bouge — c'est voulu, le mouvement dit qu'il se passe quelque chose là-haut. Hors flux pour
   que les deux icônes de droite ne pèsent pas dans le centrage. */
.surcoucheOnglets {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    align-items: center;
    gap: var(--gapDefaut);
}

/* Sans contour au repos ; le contour paraît au survol et reste sur l'onglet actif — c'est
   lui qui dit lequel est ouvert (chef de projet, 2026-09-16). La bordure est là dès le
   repos, transparente : elle garde son épaisseur, rien ne bouge et rien ne se troue. */
.surcoucheOnglet {
    color: var(--cNoir3);
    background: transparent;
    border: 1px solid transparent;
}

.surcoucheOnglet:hover {
    border-color: currentColor;
}

.surcoucheOngletActif {
    color: var(--cNoir1);
    border-color: currentColor;
}

/* Les deux boutons portent la classe .modaleClose (posée par le TS) : silhouette, croix et
   hover viennent du composant. Ici l'écart surcouche : boîte fixe 44×44, icônes 24. */
.surcoucheClose,
.surcouchePleinEcran {
    width: 44px;
    height: 44px;
    padding: 0;
}

.surcoucheClose::before,
.surcouchePleinEcran::before {
    width: 24px;
    height: 24px;
}

.surcouchePleinEcran::before {
    mask: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27black%27 stroke-width=%271.5%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cpath d=%27M8 3H5a2 2 0 0 0-2 2v3%27/%3E%3Cpath d=%27M21 8V5a2 2 0 0 0-2-2h-3%27/%3E%3Cpath d=%27M3 16v3a2 2 0 0 0 2 2h3%27/%3E%3Cpath d=%27M16 21h3a2 2 0 0 0 2-2v-3%27/%3E%3C/svg%3E") center / contain no-repeat;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27black%27 stroke-width=%271.5%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cpath d=%27M8 3H5a2 2 0 0 0-2 2v3%27/%3E%3Cpath d=%27M21 8V5a2 2 0 0 0-2-2h-3%27/%3E%3Cpath d=%27M3 16v3a2 2 0 0 0 2 2h3%27/%3E%3Cpath d=%27M16 21h3a2 2 0 0 0 2-2v-3%27/%3E%3C/svg%3E") center / contain no-repeat;
}

/* 16/9, aussi grand que la fenêtre le permet (marges : 80 en largeur, 120 en
   hauteur — la barre de la surcouche + l'air autour). */
.surcoucheIframe {
    display: block;
    border: none;
    width: min(calc(100vw - 80px), calc((100vh - 120px) * 16 / 9));
    aspect-ratio: 16 / 9;
}

/*!******************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/composants/jaime.css ***!
  \******************************************************************************************************************************/
/* ============================================
   LE CŒUR « J'AIME » ET SON COMPTEUR — brique noyau _jaime.twig, Vitrine comme Studio
   (décision chef de projet 2026-09-12)

   Quatre états, façon X, tous ici et nulle part ailleurs :
     1. éteint            — contour gris, chiffre gris ;
     2. survol (actif)    — cœur et chiffre en rouge, un disque pâle derrière le cœur ;
     3. allumé            — cœur PLEIN, rouge, un peu plus grand — un peu seulement, ça se
                            joue à très peu (chef de projet) ;
     4. allumé au survol  — le même, avec le disque pâle.
   Plus l'inactif (`disabled`) : le visiteur non connecté voit le cœur et le nombre, il ne
   peut pas y toucher. Ni survol, ni curseur, et À MOITIÉ ESTOMPÉ (décision chef de projet
   2026-09-16, qui défait le « pas grisé » du 2026-09-12) : un cœur plein et net se lit comme
   une commande, et le visiteur déconnecté cliquait dessus sans comprendre pourquoi rien ne
   se passait.

   Le rouge est celui du cœur (--cCoeur3, --cCoeur0 pour le survol, 10_font.css) : un rouge
   sang, bordeaux foncé, à lui — le rouge de la famille --cRouge dit l'alerte et le danger,
   pas l'affection (décision chef de projet 2026-09-16, qui remplace le --cRouge3 du 12).
   Aucune couleur en dur (docs/designSystem/couleurs.md).

   Le bouton ne pose ni bordure ni fond : c'est une icône et un chiffre posés à même la page,
   comme le lien « En savoir plus » d'une tuile (.lienScenePlus). Padding : --gapReduit, la
   même variable que ce lien — une valeur nommée, jamais un chiffre (assets/vitrine/css/CLAUDE.md).
   ============================================ */
.toggleJaime {
    display: inline-flex;
    align-items: center;
    gap: var(--gapReduit);
    padding: var(--gapReduit) 0;
    border: none;
    background: none;
    font: var(--fMenu14);
    color: var(--cNoir3);
    cursor: pointer;
    user-select: none;
    /* `opacity` : le passage de 25 % à 50 % ou à 100 %, quand la réponse de fin de page
       arrive, se fait en fondu et non d'un coup — le cœur ne clignote plus (décision chef de
       projet 2026-09-16). `color` : le survol, comme avant. */
    transition: color 0.2s, opacity 0.4s;
}

/* Le disque pâle du survol est un pseudo-élément derrière le cœur : le cœur reste à sa
   place, seul le fond apparaît. `isolation` + `z-index` pour qu'il passe DERRIÈRE le tracé
   du cœur sans sortir du bouton. */
.toggleJaimeCoeur {
    position: relative;
    isolation: isolate;
    flex: none;
    width: 20px;
    height: 20px;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linejoin: round;
    overflow: visible;
    transition: transform 0.2s, fill 0.2s, stroke 0.2s;
}

.toggleJaimeCoeur::before {
    content: '';
    position: absolute;
    z-index: -1;
    inset: -8px;
    border-radius: 50%;
    background: var(--cCoeur0);
    opacity: 0;
    transition: opacity 0.2s;
}

/* Le chiffre ne réserve aucune largeur : à zéro il est vide, le cœur est seul. */
.toggleJaimeNombre {
    font-variant-numeric: tabular-nums;
}

/* 2 — survol, bouton ACTIF seulement */
.toggleJaime:not(:disabled):hover {
    color: var(--cCoeur3);
}

.toggleJaime:not(:disabled):hover .toggleJaimeCoeur::before {
    opacity: 1;
}

/* 3 — allumé : cœur plein, à peine plus grand */
.toggleJaime[aria-pressed="true"] {
    color: var(--cCoeur3);
}

.toggleJaime[aria-pressed="true"] .toggleJaimeCoeur {
    fill: currentColor;
    transform: scale(1.08);
}

/* Le petit rebond quand on clique : le cœur grossit puis revient. Posé par le JavaScript
   au moment du geste, retiré à la fin de l'animation — jamais au chargement, sinon trente
   cœurs rebondiraient en chœur à l'ouverture de la page. */
.toggleJaimeAnime .toggleJaimeCoeur {
    animation: toggleJaimeRebond 0.35s ease-out;
}

@keyframes toggleJaimeRebond {
    0%   { transform: scale(1); }
    40%  { transform: scale(1.35); }
    100% { transform: scale(1.08); }
}

/* Inactif : pas de survol, pas de curseur, et ESTOMPÉ À 50 % (décision chef de projet
   2026-09-16). Le visiteur doit VOIR qu'il ne peut pas cliquer : sans l'estompe, un cœur
   inactif ressemblait trait pour trait à un cœur actif au repos.
   Le 2026-09-12 avait tranché l'inverse (« pas grisé, c'est une information ») : le chiffre
   reste lisible à 50 %, l'information est toujours là.
   Sur le Studio, l'utilisateur est toujours connecté : cet état n'y apparaît pas. */
.toggleJaime:disabled {
    cursor: default;
    opacity: 0.5;
}

/* EN ATTENTE : 25 % (décision chef de projet 2026-09-16). Le cœur tel que le serveur
   l'écrit, avant que la requête de fin de page ait répondu. Le JavaScript retire la classe
   dès la réponse : le cœur passe alors à 50 % (déconnecté, `disabled` ci-dessus) ou à 100 %
   (connecté). Trois paliers, pour qu'aucun ne se confonde avec un autre.
   ⚠️ Même poids que `.toggleJaime:disabled` (une classe + une classe, une classe + une
   pseudo-classe) : c'est l'ORDRE qui tranche. Cette règle doit rester APRÈS celle-là. */
.toggleJaime.toggleJaimeAttente {
    opacity: 0.25;
}

/* Le même halo de focus que les liens et boutons du site (31_cta.css). */
.toggleJaime:focus {
    outline: none;
}

.toggleJaime:focus-visible {
    box-shadow: 0 0 0 3px var(--cFormFocus);
    border-radius: 999px;
}

@media (prefers-reduced-motion: reduce) {
    .toggleJaime,
    .toggleJaimeCoeur,
    .toggleJaimeCoeur::before {
        transition: none;
    }

    .toggleJaimeAnime .toggleJaimeCoeur {
        animation: none;
    }
}

/*!***************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/composants/etiquetteJaime.css ***!
  \***************************************************************************************************************************************/
/* ============================================
   L'ÉTIQUETTE ET SON CŒUR « J'AIME » — brique noyau _etiquetteJaime.twig
   (décision chef de projet 2026-09-16)

   Une boîte, deux pièces, une largeur qui ne change JAMAIS. C'est tout le travail de ce
   fichier : rendre le bloc immobile, pour qu'on puisse le poser n'importe où sur la Vitrine
   sans qu'il bouge au clic.

   CE FICHIER NE PLACE RIEN. Pas de marge, pas d'alignement, pas de largeur imposée : la
   brique dit comment le bloc est construit, la page qui l'accueille dit où il se pose.
   C'est ce partage qui la rend placardable partout.

   ⚠️ Il ne touche pas à composants/jaime.css : le cœur garde sa seule et unique source. Tout
   ce qui est écrit ici est porté par `.etiquetteJaime`, donc n'atteint QUE ce bloc — les
   sept autres endroits où le cœur vit sont inchangés.
   ============================================ */

/* `inline-flex` : la boîte prend exactement la largeur de son contenu, ni plus ni moins.
   C'est ce qui permet à l'appelant de la centrer (align-self, text-align, justify-content…)
   sans qu'elle s'étire à toute la colonne.
   --gapLarge (20px) : à 8px (--gapDefaut) puis à 12px (--gapMoyen), le mot et le cœur se
   lisaient comme un seul bloc serré (décision chef de projet 2026-09-16). Une valeur nommée,
   jamais un chiffre (assets/vitrine/css/CLAUDE.md). */
.etiquetteJaime {
    display: inline-flex;
    align-items: center;
    gap: var(--gapLarge);
}

/* L'ÉTIQUETTE EN CHASSE FIXE (décision chef de projet 2026-09-16). C'est le nom du dossier
   de la scène — `RafflePluck` —, pas une phrase : du PascalCase que personne ne traduit. Le
   mono dit « ceci est un identifiant » sans qu'on ait à l'écrire.
   C'est le geste que le Studio fait déjà sur les étiquettes de l'organisateur (.etiquetteMono,
   studio/56_scenario/_etiquettes.css, décision PO 2026-06-10) — là-bas la chasse fixe
   distingue le mot de l'utilisateur des libellés du système ; ici elle distingue
   l'identifiant du texte rédigé. Même outil, intention voisine.

   --fMono16 et pas --fMono24b : le mono d'un LIBELLÉ, pas celui d'un gros chiffre. La
   variable dormait, commentée « inutilisé » depuis le 2026-06-13 ; elle est remise en
   service pour ce bloc (10_font.css), aucune valeur nouvelle n'entre dans le système.
   Sur la page d'une scène, l'étiquette était jusqu'ici au corps d'un H2 : 24px gras, plus
   lourde que le vrai titre de la page juste au-dessus. */
.etiquetteJaimeTexte {
    font: var(--fMono16);
    color: var(--cNoir2);
}

/* LA CASE DU CHIFFRE — le cœur de l'affaire (décision chef de projet 2026-09-16).
   Dans sa brique, le compteur « ne réserve aucune largeur » : à zéro il est vide, le cœur est
   seul. C'est juste là où le cœur finit la ligne. Ça ne l'est plus dès qu'il a un voisin : le
   premier « J'aime » élargissait le bouton, et tout ce qui l'entourait glissait.
   Ici le chiffre a sa case, et il ne la quitte pas. Deux caractères — de 0 à 99, la case
   suffit ; au-delà elle s'élargit, et c'est assumé.
   `ch` : la largeur d'un chiffre dans la fonte du bouton. Ce n'est pas une mesure inventée en
   pixels, c'est la case que le texte occupe — et `font-variant-numeric: tabular-nums`, déjà
   posé sur ce span, garantit que tous les chiffres ont la même.
   Porté par `.etiquetteJaime` : les cœurs des autres pages ne réservent toujours rien. */
.etiquetteJaime .toggleJaimeNombre {
    min-width: 2ch;
}

/*!**********************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/offres.css ***!
  \**********************************************************************************************************************/
/* ==========================================================================
   Page des offres (pricing) - Design sobre
   ========================================================================== */

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

.pageOffres h1 {
    text-align: center;
    color: var(--cNoir1);
}

/* Le bas des pages d'offres (_basOffres.twig) : un seul rythme, celui d'une liste
   (--gapListe), entre le texte, les questions fréquentes, le trait et les notes. Le blanc de
   faq.css (8rem, le rythme des îlots) et --gapBlocs (10rem) creusaient un trou au milieu
   d'une page qui se lit d'un trait (vu par le chef de projet 2026-10-15). */
.pageOffres > .faq {
    margin-top: var(--gapListe);
}

.offresNotesSeparateur {
    margin: var(--gapListe) 0 20px;
    border: none;
    border-top: var(--border);
}

/* Le titre et la phrase d'introduction des tarifs, centrés comme la grille qu'ils annoncent
   (chef de projet 2026-10-15). Le texte sous la grille reste à gauche : il se lit. */
.tarifsIntro {
    text-align: center;
}

/* Aucune largeur maximale ici, et aucune marge automatique : la grille prend toute la
   largeur que lui laisse son conteneur. C'est .contenu (padding latéral) à l'intérieur
   de #bodyPage (max-width) qui décide des marges de la page, ici comme partout ailleurs.
   La grille doit donc TOUJOURS être placée dans un .contenu. */
/* LA GRILLE NE DOIT RIEN À LA PAGE QUI L'ACCUEILLE. Elle s'affiche sur les tarifs publics
   (paquet vitrine : body en line-height 1.6, li à 8px de marge, vitrine.css) et sur « Mes
   offres » (paquet vitrineCompte : body en --fText16, line-height normal, li sans marge,
   30_base.css). Tant qu'elle héritait, les lignes n'avaient pas le même espacement d'une page
   à l'autre (vu par le chef de projet 2026-10-15). Elle pose donc elle-même sa police (hauteur
   de ligne normale, comprise dans --fText16) et la marge de ses lignes : la même grille
   partout, au pixel près. L'espacement retenu est le SERRÉ, celui de « Mes offres » (décision
   chef de projet 2026-10-15). */
.gridOffres {
    font: var(--fText16);
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
    margin: 40px 0;
}

/* Trois cartes : en dessous de trois colonnes on passe directement à une seule, sinon la
   troisième se retrouve orpheline en bas de page. */
/* En une colonne, la carte ne prend pas toute la page : 600px au plus, centrée (décision chef
   de projet 2026-10-15). Le bouton, qui prend la largeur de la carte, en reste à une taille de
   bouton. */
@media (max-width: 1023px) {
    .gridOffres {
        grid-template-columns: minmax(0, 600px);
        justify-content: center;
    }
}

/* Carte offre */
.carteOffre {
    background: var(--cBlanc1);
    border: 1px solid var(--cBlanc3);
    border-radius: var(--borderR2);
    padding: var(--paddingCarteLarge);
    display: flex;
    flex-direction: column;
    position: relative;
}

/* Les petits boutons ↑ ↓ des coins de la carte (_carteOffre.twig) : discrets — un rond fin,
   gris — mais visibles. Chacun ne paraît que si offres.ts lui a posé .offreNavVisible : cartes
   empilées et offre visée hors de l'écran. L'offre visée vient se caler en haut de l'écran
   (scroll-margin-top, plus bas). */
.offreNav {
    display: flex;
    visibility: hidden;
    opacity: 0;
    transition: opacity 0.3s, visibility 0.3s;
    position: absolute;
    top: 12px;
    width: 32px;
    height: 32px;
    align-items: center;
    justify-content: center;
    border: var(--border);
    border-radius: 50%;
    background: var(--cBlanc);
    color: var(--cNoir2);
}

.offreNav svg {
    width: 18px;
    height: 18px;
}

.offreNav:hover,
.offreNav:focus-visible {
    background: var(--cBlanc2);
    color: var(--cNoir1);
}

.offreNavPrecedente {
    left: 12px;
}

.offreNavSuivante {
    right: 12px;
}

/* Il paraît et s'efface en fondu : il va et vient pendant qu'on défile, ça ne doit pas sauter
   aux yeux (décision chef de projet 2026-10-15). visibility le retire aussi du clavier et des
   lecteurs d'écran quand il est caché. */
.offreNav.offreNavVisible {
    visibility: visible;
    opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
    .offreNav {
        transition: none;
    }
}

.carteOffre {
    scroll-margin-top: 20px;
}

/* Le NOM de l'offre s'efface devant le prix et la durée : petite taille, capitales
   (décision chef de projet 2026-09-12). */
.carteOffre h2 {
    font: var(--fH4);
    text-transform: uppercase;
    margin: 0 0 15px 0;
    color: var(--cNoir1);
    text-align: center;
}

/* Prix */
.offrePrix {
    margin-bottom: 15px;
    text-align: center;
}

.prixMontant {
    position: relative;
    font: var(--fH1);
    color: var(--cNoir1);
}

/* Les centimes ne pèsent pas autant que les euros : 5,99 doit se lire « cinq », pas
   « cinq mille » (décision chef de projet 2026-09-12). Centimes et symbole de la monnaie
   sont à la TAILLE DU TEXTE courant, pas à un pourcentage du titre (décision chef de
   projet 2026-09-14) : la même taille sur toutes les cartes, quel que soit le chiffre. */
.prixDecimales,
.prixDevise {
    font-size: 16px;
}

.prixDecimales {
    vertical-align: super;
}

/* Le symbole de la monnaie s'efface : même taille que les centimes, mais en maigre. Il
   SORT DU FLUX (décision chef de projet 2026-10-15, qui remplace celle du 2026-09-14) :
   c'est le CHIFFRE qui se centre dans la carte, le symbole pend à côté, en haut. Dans le
   flux, il décentrait le chiffre et, monté en exposant, le faisait descendre. Le
   formateur (MontantStripe::formaterHtml) l'a débarrassé de son espace : le petit écart
   est rendu ici, du côté où il se pose. */
.prixDevise {
    position: absolute;
    top: 0.4em;
    font-weight: 200;
}

.prixDeviseApres {
    left: 100%;
    margin-left: 0.2em;
}

.prixDeviseAvant {
    right: 100%;
    margin-right: 0.2em;
}

/* Sous-titre : la DURÉE de l'offre (MENSUEL, ANNUEL). Elle se lit en même temps que le
   prix, d'où la taille de titre et les capitales — c'est la comparaison qu'on veut
   provoquer entre les deux offres payantes. */
.offreSousTitre {
    font: var(--fH2);
    color: var(--cNoir1);
    text-transform: uppercase;
    margin: 0 0 15px 0;
    text-align: center;
}

/* Le prix de renouvellement, en léger (décision chef de projet 2026-10-15) : deux prix en
   même graisse se lisent comme deux montants à payer. Scada n'a pas de graisse légère : la
   ligne prend le Noto Sans du texte, en 200, sans les capitales du sous-titre. */
.offreRenouvellement {
    display: block;
    margin-top: 5px;
    font: var(--fText16);
    font-weight: 200;
    text-transform: none;
}

/* Trait entre le haut centré de la carte et son bas aligné à gauche (_carteOffre.twig). */
.offreSeparateur {
    margin: 0 0 20px;
    border: none;
    border-top: var(--border);
}

/* L'accroche, sous le bouton : la police du texte, pas celle du second plan — c'est
   l'argument de l'offre, elle doit se lire. */
.offreDescription {
    font: var(--fText16);
    color: var(--cNoir1);
    margin: 0 0 20px;
    text-align: center;
}

/* Bas de carte : soit la liste de détails, soit le bloc sur mesure (Premium). Les deux sont
   INTERCHANGEABLES et partagent ici la même géométrie — même marge, même occupation de
   l'espace restant. C'est ce qui garantit que tout ce qui est AU-DESSUS d'eux (titre, prix,
   sous-titre, action, description) tombe au même pixel dans les quatre cartes, alors même
   que le CONTENU du bloc sur mesure, lui, ne s'aligne sur rien.
   ⛔ Ne jamais séparer ces deux sélecteurs : la carte Premium décrocherait des autres. */
.offreDetails,
.offreSurMesure {
    margin: 0 0 25px 0;
    flex-grow: 1;
}

/* Liste des details */
.offreDetails {
    list-style: none;
    padding: 0;
}

/* Un seul trait, clair, partout dans la liste : entre deux lignes comme sous un titre de
   chapitre (--cBlanc2, décision chef de projet 2026-10-14). */
.offreDetails li {
    margin: 0;
    padding: var(--gapDefaut) 0;
    border-bottom: 1px solid var(--cBlanc2);
    color: var(--cNoir2);
}

.offreDetails li:last-child {
    border-bottom: none;
}

/* Sous-ligne : elle détaille la ligne du dessus (sous les participants, combien par QR
   code, combien aux jeux interactifs). Le retrait et l'absence de filet au-dessus d'elle
   disent qu'elle en est la suite, pas un droit de plus. */
.offreDetails li.offreSousLigne {
    padding-left: var(--retraitListeCourt);
}

.offreDetails li:has(+ li.offreSousLigne) {
    border-bottom: none;
}

/* Ligne sans texte : elle ne sert qu'à tenir le rang entre cartes côte à côte. Sur une
   seule colonne il n'y a plus rien en face, elle ne laisserait qu'un trou. La ligne qui la
   précède ferme alors le bloc : elle reprend le filet que la ligne vide portait. */
@media (max-width: 1023px) {
    .offreDetails li.offreDetailVide {
        display: none;
    }

    .offreDetails li:has(+ li.offreDetailVide) {
        border-bottom: 1px solid var(--cBlanc2);
    }
}

/* Encadré « Uniquement sur l'offre Pro » (_encartOffrePro.twig), posé hors de la page des
   tarifs : sur la page de la rubrique Quiz. Il reprend le fond et la bordure de
   la carte Pro mise en avant (.carteOffreEnAvant), pour qu'on reconnaisse l'offre, et tient
   dans la largeur de lecture. */
.encartOffrePro {
    max-width: var(--largeurTexte);
    margin: 0 0 1em;
    padding: var(--paddingCarte);
    background: var(--cOr0);
    border: 1px solid var(--cOr3);
    border-radius: var(--borderR2);
    color: var(--cNoir2);
}

.encartOffrePro p {
    margin: 0;
}

.encartOffrePro .encartOffreProTitre {
    margin: 0 0 var(--gapReduit);
    font: var(--fText16Strong);
    color: var(--cNoir1);
}

/* Les deux liens d'une note, à la façon de Wikipédia : le « ¹ » de la ligne et la « ↑ » de la
   note. Un chiffre en exposant est une cible minuscule : la zone de clic déborde du signe
   (--paddingEtiquette), et le survol la montre d'un fond (décision chef de projet 2026-10-14). */
.lienRenvoi {
    display: inline-block;
    padding: var(--paddingEtiquette);
    border-radius: var(--borderR1);
    text-decoration: none;
}

.lienRenvoi:hover,
.lienRenvoi:focus-visible {
    background: var(--cAccent1);
}

/* Note sous la grille, où renvoie le « ¹ » d'une ligne. Dans la fonte NORMALE du texte,
   pas la fonte fine du second plan (chef de projet 2026-10-01) : elle rassure sur la tenue
   du serveur, elle doit se lire, pas se cacher comme des petites lignes. */
.offresNote {
    font: var(--fText16);
    color: var(--cNoir2);
}

/* Précision sous une ligne de détail : elle passe à la ligne et s'efface — c'est la fonte
   du second plan, celle qui informe sans arrêter la lecture. */
.offrePrecision {
    display: block;
    font: var(--fLight14);
    color: var(--cNoir3);
}

/* Titre de chapitre dans la liste de détails (« Par événement »). C'est une ligne de la
   liste comme les autres — même rang, donc même alignement d'une carte à l'autre — mais
   elle annonce les lignes qui suivent au lieu d'énoncer un droit : pas de trait de
   séparation sous elle, et de l'air au-dessus pour détacher le chapitre du précédent. */
.offreDetails li.offreChapitre {
    /* L'air est AU-DESSUS et nulle part ailleurs : il détache le chapitre de celui qui
       précède, et rien ne vient s'intercaler entre le titre et son groupe. */
    margin: 24px 0 0;
    padding: 0 0 var(--gapDefaut);
    border-bottom-color: var(--cBlanc2);
    font: var(--fText16Strong);
    color: var(--cNoir1);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

/* Le premier point d'un chapitre est COLLÉ à son titre : c'est ce collage qui dit qu'il lui
   appartient. On lui retire la marge haute qu'il tient de la liste, et seulement elle : son
   retrait de 8px reste, sinon le texte viendrait toucher le filet du titre. Le rythme normal
   reprend dès la ligne suivante, qui n'est plus voisine d'un titre. */
.offreDetails li.offreChapitre + li {
    margin-top: 0;
}

.offreDetails li.offreChapitre:first-child {
    margin-top: 0;
}

/* Bloc sur mesure (Premium) : remplace la liste de détails. Texte à la taille des lignes de
   détail d'en face, donc plus gros que la description qui le précède. Sa géométrie de bloc
   est plus haut, avec .offreDetails. */
.offreSurMesure {
    font: var(--fText16);
    color: var(--cNoir2);
}

/* Exactement le rythme vertical d'une ligne de détail (li : sans marge, padding 8px) :
   la première phrase démarre à la hauteur de la première ligne de la carte d'à côté. */
.offreSurMesure p {
    margin: 0;
    padding: var(--gapDefaut) 0;
}

/* Action (après le sous-titre, avant description) */
.offreAction {
    margin-bottom: 15px;
}

/* CTA pour les offres. Largeur explicite : le même bouton est un lien pour le visiteur
   déconnecté et un <button> d'action pour le connecté (_carteOffre.twig), et un <button> en
   display: block garde la largeur de son texte, là où un lien prend toute la carte (vu en
   production le 2026-10-13). Le formulaire autour du <button> ne compte pas : il ne prend
   aucune place (form.formBoutonAction, form.css). Le petit « cta14 ctaOr » garde sa largeur automatique (31_cta.css,
   deux classes, prioritaire). */
.ctaOr {
    display: block;
    width: 100%;
    padding: var(--paddingCta);
    background: var(--cOr3);
    color: var(--cOrt);
    border: none;
    border-radius: var(--borderR1);
    font: var(--fCta16);
    cursor: pointer;
    text-decoration: none;
    text-align: center;
}

.ctaOr:hover {
    background: var(--cOr4);
    color: var(--cOrt);
}

/* ==========================================================================
   OFFRE ACTIVE (possédée par l'utilisateur)
   ========================================================================== */

.carteOffreActive {
    border: 2px solid var(--cNoir);
    box-shadow: var(--ombrePortee);
}

.badgeOffreActive {
    position: absolute;
    top: -12px;
    left: 50%;
    transform: translateX(-50%);
    background: var(--cNoir);
    color: var(--cBlanc);
    padding: var(--paddingBadge);
    border-radius: var(--borderPilule);
    font: var(--fText14);
    font-weight: 600;
    white-space: nowrap;
}

.offreStatut {
    text-align: center;
}

.offreRenouvellement,
.offreExpiration {
    font: var(--fText16);
}

/* Offre indisponible */
.offreIndisponible {
    display: block;
    text-align: center;
    padding: var(--paddingCta);
    background: var(--cBlanc2);
    color: var(--cNoir4);
    border-radius: var(--borderR1);
    font: var(--fLight14);
}


/*!*************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/titrePage.css ***!
  \*************************************************************************************************************************/
/* ==========================================================================
   LE TITRE DE PAGE — UNE SEULE RÈGLE, pour toutes les pages de la Vitrine
   (décision du chef de projet, 2026-10-15)

   Avant : le noyau laissait 10px au-dessus d'un h1 (partagé avec le Studio, on ne le touche
   pas), et chaque gabarit corrigeait de son côté — 3rem ici, rien là — si bien que le titre
   tombait à 40px, 78px ou 136px sous la barre selon la page et selon qu'on était connecté.

   Maintenant : le titre d'une page est le premier enfant de .contenu, et il se pose à la
   même hauteur partout — var(--paddingPage) du haut + --margeTitrePage. Ce fichier est
   chargé par les DEUX paquets (vitrine et vitrineCompte) : c'est ce qui garantit que
   l'espace Compte et le public ne diffèrent plus.

   ALIGNEMENT : à gauche, partout. Seule exception, voulue : le titre de la grille des offres
   (offres.css), qui est centré parce que la grille l'est.
   ========================================================================== */

:root {
    --margeTitrePage: 3rem;
}

/* Le même padding de page dans le public et dans le compte (le noyau, lui, donne 10px 40px à
   .contenu : c'est pour le Studio). */
.contenu {
    padding: var(--paddingPage);
}

.contenu > h1,
.pageOffres > h1 {
    margin-block: var(--margeTitrePage);
}

/* La zone des messages flash ne réserve plus rien quand elle est vide. Elle est écrite par le
   serveur (aucun JS ne l'insère après coup) : la place gardée ne servait à rien, et poussait
   le titre de 58px sous la barre. Sous un message, le titre redescend de la hauteur du
   message, comme il se doit. Ici et pas dans le noyau : le Studio garde la sienne. */
.zoneFlash {
    min-height: 0;
    margin-bottom: 0;
}

.zoneFlash:has(> div) {
    margin-bottom: 20px;
}

/*!*****************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/ilotRubriques.css ***!
  \*****************************************************************************************************************************/
/* ============================================
   ÎLOT DES RUBRIQUES D'APERÇU (Home)
   Include : vitrine/_/_ilotRubriques.twig
   Même patron que ilotScenes.css : une section, un
   H2, sa liste. L'écart avec ce qui précède
   appartient à la section, pas à son titre.
   ============================================ */

/* La section se déclare CONTENEUR DE REQUÊTE : la disposition (liste à côté
   de l'image, ou dessous) et la taille de l'image se décident sur la place
   réellement offerte à l'îlot, pas sur la largeur de
   la fenêtre. Une media query obligerait à deviner ce que la page prend
   déjà en marges — et à la corriger le jour où la page change. */
.ilotRubriques {
    margin-top: 8rem;
    container: ilotRubriques / inline-size;
}

.ilotRubriques > h2 {
    margin-top: 0;
    margin-bottom: 1.5rem;
}

/* Le markdown de `intro`, à la place du H2. Son titre est DANS le bloc, donc la règle
   `.ilotRubriques > h2` ci-dessus ne l'atteint pas : c'est ce bloc qui porte l'écart. */
.ilotRubriquesIntro {
    margin-bottom: 1.5rem;
}

/* Sans ça, la marge du titre du markdown s'ajoute à celle du bloc et creuse un trou. */
.ilotRubriquesIntro > *:first-child {
    margin-top: 0;
}

.ilotRubriquesIntro > *:last-child {
    margin-bottom: 0;
}

/* LA LISTE À CÔTÉ DE L'IMAGE (décision chef de projet 2026-09-24). Une rubrique par ligne :
   la grille de tuiles donnait des rangées bancales (3 + 1 pour quatre rubriques) et des
   cartes de hauteurs différentes. Une liste prend deux rubriques comme six sans changer de
   forme, et l'œil la lit d'un seul trait, du haut vers le bas.

   La liste a une largeur BORNÉE, l'image prend la sienne, et c'est le COUPLE qu'on centre :
   la liste reste collée à son image (loi de proximité), que l'image soit presque carrée ou
   en largeur.

   UNE SEULE ÉCHELLE POUR TOUTE LA SÉRIE (règle de taille de série, directionArtistiqueImages.md) :
   les personnages gardent la même taille d'une image à l'autre. Les images sont exportées à
   la hauteur de leur cadre d'origine (941px, rognées en largeur seulement) et affichées
   toutes à la MÊME hauteur. Cette hauteur est celle qui laisse tenir la plus large de la
   série (1604 × 941, capturer-des-leads) dans ce que la liste et l'écart laissent de
   l'îlot : (100cqi − liste − écart) × 941 / 1604 ; au-delà, un plafond de 420px.
   cqi se mesure sur l'îlot (.ilotRubriques, conteneur de requête) : aucun conteneur ne doit
   s'intercaler entre lui et l'image. */
.ilotRubriquesCorps {
    /* 45% de l'îlot, entre 440 et 640px : sur un îlot étroit la liste cède un peu de place
       pour que l'image ne rapetisse pas trop. */
    --largeurListe: clamp(440px, 45cqi, 640px);
    --ecartCorps: 64px;
    display: grid;
    grid-template-columns: minmax(0, var(--largeurListe)) auto;
    justify-content: center;
    align-items: center;
    gap: var(--ecartCorps);
}

.ilotRubriquesIllustration img {
    display: block;
    width: auto;
    height: min(420px, calc((100cqi - var(--largeurListe) - var(--ecartCorps)) * 941 / 1604));
}

/* Image à gauche, liste à droite (`illustrationAGauche`). Seul l'ordre VISUEL change :
   l'image est décorative, le HTML garde la liste en premier. */
.ilotRubriquesCorpsInverse {
    grid-template-columns: auto minmax(0, var(--largeurListe));
}

.ilotRubriquesCorpsInverse .ilotRubriquesIllustration {
    order: -1;
}

/* Îlot étroit : l'image passe au-dessus de la liste, toutes deux centrées. En dessous de
   1000px, l'image posée à côté tomberait sous les 290px de haut. */
@container ilotRubriques (max-width: 999px) {
    .ilotRubriquesCorps,
    .ilotRubriquesCorpsInverse {
        grid-template-columns: minmax(0, 1fr);
        gap: var(--gapListe);
    }

    .ilotRubriquesIllustration {
        grid-row: 1;
        justify-self: center;
    }

    .ilotRubriquesIllustration img {
        max-width: 100%;
        height: min(340px, calc(100cqi * 941 / 1604));
    }

    .ilotRubriquesListe {
        justify-self: center;
        width: 100%;
        max-width: 640px;
    }
}

/* Sans illustration, la liste seule, centrée. */
.ilotRubriques > .ilotRubriquesListe {
    max-width: 640px;
    margin-inline: auto;
}

.ilotRubriquesListe {
    display: flex;
    flex-direction: column;
    gap: var(--gapMoyen);
}

/* UNE LIGNE = un lien : l'icône, puis le nom et l'accroche dessous.
   Même hauteur minimale partout : d'un îlot à l'autre, les lignes ont la même taille,
   quel que soit leur nombre. */
.carteRubrique {
    display: grid;
    grid-template-columns: auto 1fr;
    grid-template-rows: auto auto;
    align-content: center;
    align-items: center;
    row-gap: 2px;
    column-gap: 20px;
    min-height: 96px;
    padding: 14px 24px;
    background-color: var(--cBlanc);
    border: var(--border);
    border-radius: var(--borderR2);
    color: var(--cNoir1);
    text-decoration: none;
    transition: background-color 0.3s, box-shadow 0.3s;
}

/* L'ombre au survol dit « objet cliquable ». Pas de flèche au bout de la ligne : essayée,
   refusée par le chef de projet le 2026-09-24. */
.carteRubrique:hover {
    background-color: var(--cBlanc02);
    box-shadow: var(--ombrePortee);
}

.carteRubrique > * {
    margin: 0;
}

/* Placements explicites : le twig n'affiche l'icône que si la rubrique en a une, et sans
   ces règles le titre glisserait en colonne 1. Le titre de ligne reste un h3 (sous le h2
   de l'îlot : hiérarchie juste pour le SEO), à la fonte du h2. */
.carteRubrique h3 {
    grid-column: 2;
    font: var(--fH2);
}

/* Accroche en gris : sans écart de couleur avec le titre, les deux pèsent pareil. */
.carteRubrique p {
    grid-column: 2;
    grid-row: 2;
    color: var(--cNoir3);
}

/* Icône SVG inline (stroke: currentColor → colorée par la propriété color) */
.iconeRubrique {
    grid-column: 1;
    grid-row: 1 / span 2;
    color: var(--cAccent3);
}

.iconeRubrique svg {
    width: 52px;
    height: 52px;
    display: block;
}

/* Téléphone : la ligne se resserre, l'icône aussi. */
@container ilotRubriques (max-width: 531px) {
    .carteRubrique {
        column-gap: 14px;
        padding: 12px 16px;
    }

    .iconeRubrique svg {
        width: 40px;
        height: 40px;
    }
}

/* ============================================
   DANS LE BANDEAU — grands écrans seulement (pageRubrique.css)
   Même règle que l'intro d'un îlot de scènes (ilotScenes.css) : le paragraphe est borné à
   la largeur de lecture et c'est le BLOC qu'on centre ; son texte reste aligné à gauche.
   Le titre, lui, est centré par pageRubrique.css.
   ============================================ */
@media (min-width: 1600px) {
    .pageRubriquePreview .ilotRubriquesIntro p {
        max-width: var(--largeurTexte);
        margin-inline: auto;
        text-align: left;
    }
}

/*!***********************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/chapitresHorizontal.css ***!
  \***********************************************************************************************************************************/
/* ============================================
   MENU DES CHAPITRES, À L'HORIZONTALE — .chapitresHorizontal
   Usages : la Home (les trois familles de rubriques), Tirage au sort (scènes, absents,
   scénarios).

   Le frère couché du menu des chapitres (.chapitres, pageChapitres.css) : même script
   (chapitres.ts), même pavé bleu qui glisse sur la partie où l'on se trouve. Une
   CLASSE et non un identifiant : une page peut en porter plusieurs, chacun ne suit que
   les sections qu'il liste.

   DEUX ÉTATS (chef de projet 2026-09-23) :
   - AU REPOS, il flotte juste au-dessus des îlots qu'il dessert et mord un peu dans leur
     bandeau : la loi de proximité dit qu'il leur appartient. Sa place se règle sur le début
     des îlots, jamais sur le texte qui précède.
   - COLLÉ (`chapitresColle`, posé par chapitres.ts au pixel près, quand ses entrées
     arrivent à leur place dans le bandeau), il devient un bandeau de verre d'un bord à l'autre du navigateur, dont le
     haut — l'air du dessus et l'ombre — sort par le haut de la fenêtre.
   Après la dernière section, il disparaît (`chapitresPasses`, chapitres.ts).

   LE <nav> EST UNE ANCRE DE HAUTEUR NULLE, posée exactement au début des îlots : il ne
   prend aucune place dans la page, le blanc au-dessus des îlots reste le leur. La boîte
   visible, c'est le <ul> : il déborde VERS LE HAUT de l'ancre (align-items: flex-end sur une
   hauteur nulle).

   Matière : celle de la barre et de la bulle des aperçus (noyau/salle/ecran/css/
   _preview.css) — même verre, même flou, même grand air, même repli. Son ombre, le menu
   ne la prend que collé : au repos, un simple contour.
   ============================================ */

.chapitresHorizontal {
    /* Dans un article (grille texte | image), l'ancre prend toute la largeur comme les
       îlots qu'elle dessert : c'est articleVitrine.css qui le dit, là où il pèse assez. */
    display: flex;
    justify-content: center;
    align-items: flex-end;
    height: 0;
    /* Le blanc qui sépare l'article des îlots : celui que le bandeau porte d'ordinaire
       (pageRubrique.css). L'ancre le prend, le bandeau qui la suit rend le sien (plus
       bas) — le total ne change pas. */
    margin-top: 8rem;
    /* Ce que la boîte mord dans le bandeau. */
    --chapitresRecouvrement: var(--paddingCorps);
    transition: opacity .3s, visibility .3s;
}

.chapitresHorizontal + .pageRubriquePreview {
    margin-top: 0;
}

/* EN DESSOUS DE 1600px, PAS DE MENU (chef de projet 2026-10-04) : hors bandeau, le menu
   n'a pas toujours la place de ses entrées — sur un téléphone il se coupait et défilait de
   côté. Il disparaît donc avec le bandeau, sur toutes les pages qui le portent. L'ancre
   reste, de hauteur nulle, avec son blanc : l'écart entre l'article et les îlots ne change
   pas. */
@media (max-width: 1599px) {
    .chapitresHorizontal {
        visibility: hidden;
    }
}

/* Les sections sont derrière nous : le menu n'a plus rien à désigner. */
.chapitresHorizontal.chapitresPasses {
    opacity: 0;
    visibility: hidden;
}

/* LA BOÎTE. AUCUN écart entre les entrées, comme le menu vertical : un blanc suffit à
   éteindre le survol quand la souris passe d'une entrée à l'autre, et le pavé clignote.
   `position: relative` : c'est dans cette boîte que chapitres.ts place le pavé. */
.chapitresHorizontal ul {
    display: flex;
    gap: 0;
    position: relative;
    z-index: 10;
    max-width: 100%;
    margin: 0 0 calc(-1 * var(--chapitresRecouvrement));
    /* Le grand air intérieur de la barre des aperçus (chef de projet 2026-09-23). */
    padding: var(--paddingCorps);
    list-style: none;
    background: var(--cBlancOverlay);
    /* Au repos, posé sur l'îlot : sobre, le contour habituel et rien d'autre, à la couleur
       du trait du bandeau (pageRubrique.css) — le menu et le bandeau où il mord ont le même
       bord. L'ombre portée n'arrive qu'avec le bandeau collé (plus bas) — chef de projet
       2026-09-23. */
    border: var(--border);
    border-color: var(--cNoir4);
    border-radius: var(--borderR2);
}

@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
    .chapitresHorizontal ul {
        background: var(--cBlancVerre);
        -webkit-backdrop-filter: blur(10px) saturate(1.4);
        backdrop-filter: blur(10px) saturate(1.4);
    }
}

/* COLLÉ : le bandeau de verre d'un bord à l'autre du navigateur. Il remonte de son air
   du dessus moins l'air d'un bouton : le haut de la boîte et son ombre sortent de la
   fenêtre, il reste juste de quoi ne pas coller les entrées au bord.
   AUCUNE ANIMATION : le passage se fait au pixel près, à l'instant où les entrées de la
   boîte atteignent leur place dans le bandeau (chapitres.ts). Les entrées ne bougent pas,
   seul le verre s'élargit (chef de projet 2026-09-23). */
.chapitresHorizontal.chapitresColle ul {
    position: fixed;
    top: calc(var(--paddingCta14V) - var(--paddingCorps));
    left: 0;
    right: 0;
    justify-content: center;
    margin: 0;
    border: 0;
    border-radius: 0;
    box-shadow: var(--ombrePortee2);
}

/* Le texte passe au-dessus du pavé. */
.chapitresHorizontal li {
    position: relative;
    margin: 0;
}

/* Le texte du menu vertical des chapitres (.chapitres a, pageChapitres.css) : léger, gris.
   Il avait été passé en gras noir de bouton pour qu'on voie le menu ; depuis que le pavé
   bleu dit où l'on est, c'est lui qui porte le regard, et le gras alourdissait
   (chef de projet 2026-09-23). */
.chapitresHorizontal a {
    display: block;
    padding: var(--paddingCta14);
    border-radius: var(--borderR1);
    font: var(--fMenu14);
    font-size: 15px;
    color: var(--cNoir3);
    white-space: nowrap;
    text-decoration: none;
    transition: .3s;
}

.chapitresHorizontal a:hover {
    color: var(--cNoir1);
    background: var(--cBlanc2);
}

/* La partie où l'on se trouve : c'est le pavé glissant (.chapitresCurseur,
   pageChapitres.css) qui la remplit, le lien ne porte plus que la couleur du texte. */
.chapitresHorizontal a.actif,
.chapitresHorizontal a.actif:hover {
    color: var(--cAccentt);
    background: transparent;
}

.chapitresHorizontal a:focus {
    outline: none;
}

.chapitresHorizontal a:focus-visible {
    box-shadow: 0 0 0 3px var(--cFormFocus) inset;
}

/* Une section atteinte par le menu ne s'arrête pas SOUS la barre collée : son titre
   s'arrête juste en dessous. Les îlots qu'un menu dessert : rubriques (Home), scènes et
   scénarios (Tirage au sort). */
.ilotRubriques[id],
.ilotScenes[id],
.ilotScenarios[id] {
    scroll-margin-top: 7rem;
}

/*!******************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/articleVitrine.css ***!
  \******************************************************************************************************************************/
/* ============================================
   ARTICLE DE LA VITRINE
   Le corps rédigé d'un article : texte à gauche,
   image à droite. Home et mères de cocon.
   ============================================ */

/* Deux colonnes franches, pas de contournement de texte : une ligne pleine largeur
   sous l'image serait trop longue pour se lire. La colonne de texte est bornée en ch,
   donc en caractères, ce qui est la seule mesure qui compte pour la lecture.
   Le blanc éventuel sous l'image est voulu. */
.articleVitrine {
    display: grid;
    /* Le bloc prend TOUTE la largeur : l'image est collée à droite, le texte occupe
       ce qui reste. La lisibilité n'est pas obtenue en bridant la colonne mais en
       bornant le texte lui-même (max-width plus bas), sinon l'image se poserait au
       milieu de la page. */
    /* min() : la colonne image est proportionnelle, donc elle rétrécit DÈS que la fenêtre
       rétrécit — un max-width fixe, lui, restait à 450px en écrasant le texte.
       37.5% et pas 35% : le conteneur de contenu fait 1200px (#bodyPage 1280 moins les
       2×40px de padding de .contenu), et 450/1200 = 37.5%. À 35% l'image plafonnait à 420px.
       Le min() garde le plafond si la largeur du conteneur change un jour. */
    grid-template-columns: 1fr min(450px, 37.5%);
    /* row-gap à 0 : l'image s'étend sur 100 lignes (voir plus bas), et un gap non nul
       serait multiplié par autant de lignes vides — 100 em de blanc avant l'îlot.
       L'écart entre paragraphes est porté par leur marge basse. */
    gap: 0 var(--gapColonnes);
    align-items: start;
}

/* ⚠️ line-height : le CLAUDE.md CSS l'interdit par défaut. Exception demandée par le chef
   de projet, limitée à ce conteneur — le body du site reste à 1.6.
   Le body dilatait les lignes AU SEIN d'un paragraphe autant que les paragraphes entre eux :
   plus rien ne se détachait. On resserre la ligne et on écarte les blocs, pour que le blanc
   marque une séparation au lieu d'être partout. */
.articleVitrine {
    line-height: 1.4;
}

/* Marge basse seulement : dans une grille les marges ne fusionnent pas, deux demi-marges
   feraient un plein écart. Un seul côté, donc un seul chiffre à lire. */
/* LA LARGEUR DE LECTURE (--largeurTexte, vitrine.css), la même que l'intro d'un îlot et
   que la réponse d'une question (décision chef de projet 2026-09-07).
   Quand l'article a une image, la colonne de la grille donne déjà ce chiffre : la borne ne
   change alors rien. Elle sert à l'article SANS image — la grille repasse à une seule
   colonne (tout en bas de ce fichier) et le texte courait sur les 1200 de la page, deux fois
   plus large que le même texte sur la page voisine.
   ⚠️ Jamais en `ch` : cette unité vaut la largeur du glyphe « 0 » de la police, pas celle du
   texte écrit. Un idéogramme chinois fait ~2ch, le thaï empile ses signes, et un changement
   de police de repli déplacerait la colonne. Une mise en page sur 31 langues ne peut pas
   dépendre du dessin d'un chiffre. */
.articleVitrine > p {
    margin-block: 0 1em;
    max-width: var(--largeurTexte);
}

/* Tout le rédactionnel en colonne de gauche. */
.articleVitrine > * {
    grid-column: 1;
}

/* Le titre court sur toute la largeur : l'image ne le coupe pas, elle commence au niveau
   du texte.
   Le noyau ne laisse que 5px sous un h1 (h1 { margin: 10px 15px 5px 0 }) : le texte se colle
   au titre. On surcharge ici, jamais dans le noyau, qui est partagé avec le Studio. */
.articleVitrine > h1 {
    grid-column: 1 / -1;
    margin-block: var(--margeTitrePage);
}

/* L'image du markdown arrive dans son propre <p> : on la sort en colonne de droite,
   sur toute la hauteur du texte. Les lignes non occupées ont une hauteur nulle. */
.articleVitrine > p:has(img) {
    grid-column: 2;
    grid-row: 2 / span 100;
    margin: 0;
}

/* L'image épouse sa colonne, elle n'impose pas sa taille : c'est la piste de grille qui
   plafonne à 450px et se réduit quand la fenêtre se resserre. Un max-width fixe resterait
   à 450px en écrasant le texte. */
.articleVitrine > p:has(img) img {
    width: 100%;
    height: auto;
    border-radius: var(--borderR1);
}

/* Ce qui est écrit sur la ligne qui suit l'image, dans le même paragraphe du markdown, se
   pose SOUS l'image, dans la police du texte (le renvoi LinkedIn de la page de contact,
   chef de projet 2026-10-16) : à cette place, il ne passe pas devant le formulaire. L'image
   en bloc suffit à faire passer la ligne dessous ; le lien n'est que le mot qui agit. */
.articleVitrine > p:has(img) img {
    display: block;
}

.articleVitrine > p:has(img) img:not(:last-child) {
    margin-bottom: var(--gapDefaut);
}

/* Les puces sont RENDUES : le reset du noyau (00_reset.css) les efface pour tout le
   site, parce que la plupart des <ul> y sont des menus. Ici c'est une vraie liste de
   lecture, écrite dans le markdown de l'article, elle porte donc ses puces.
   Même règle et même retrait franc que .chapitreCorps ul (pageChapitres.css) : c'est le
   retrait qui dit que ces lignes sont un bloc à part, et non la suite du paragraphe.
   « Deux endroits, une seule décision » est maintenant tenu par le CSS lui-même :
   --retraitListe (décision chef de projet 2026-09-07). Si le chiffre bouge, tout suit. */
.articleVitrine > ul {
    margin-block: 0 1em;
    max-width: var(--largeurTexte);
    padding-left: var(--retraitListe);
    list-style-type: disc;
}

/* Les lignes se SUIVENT : à l'intérieur d'une liste, l'air dessert, il fait croire à
   plusieurs blocs séparés au lieu d'une énumération. */
.articleVitrine > ul li {
    margin-block: var(--gapReduit);
}

/* LES TITRES DU CORPS DE L'ARTICLE — h2 et h3 écrits dans le markdown. Ceux d'un îlot sont
   gérés par l'îlot, qui porte lui-même son écart avec ce qui précède.

   DEUX RÉGIMES À NE PAS CONFONDRE (décision chef de projet 2026-09-07). Un titre qui sépare
   de VRAIS blocs distincts — un îlot, les questions, les scénarios — mérite un grand blanc :
   c'est lui qui dit qu'on change de sujet. Un titre DANS un article ne sépare rien du tout,
   il ponctue un texte qui se suit. Il doit donc être serré : du blanc à cet endroit-là casse
   la lecture, et l'article cesse de se lire comme un article.
   D'où 1em au-dessus, .5em en dessous. EN EM, à dessein : la mesure suit le corps du titre,
   donc un h3 se serre plus qu'un h2, sans qu'on ait deux chiffres à tenir.

   LE CHIFFRE ÉCRIT EST LE BLANC OBTENU. Dans une grille les marges ne fusionnent PAS : sans
   la règle qui suit, le paragraphe qui précède ajoutait son propre 1em et l'écart au-dessus
   d'un titre valait 16 + 24 = 40px, pendant que le CSS annonçait 24. Des marges qui
   s'additionnent ne se règlent pas : on croit resserrer, ça reste grand
   (décision chef de projet 2026-09-07). */
.articleVitrine > h2,
.articleVitrine > h3 {
    margin: 1em 0 .5em;
}

/* CE QUI PRÉCÈDE UN TITRE NE POUSSE PAS. Le blanc au-dessus d'un titre est celui du TITRE,
   et lui seul : n'importe quel enfant direct suivi d'un titre rend sa marge basse.
   `*` et non `p` : ça vaut aussi pour une liste, et pour un titre suivi d'un autre titre
   (le h2 est alors le voisin qui se tait, et seul le 1.5em du h3 compte).
   ⚠️ Repose sur `:has(+ …)`, comme la mise en colonnes de ce fichier repose déjà sur
   `p:has(img)` : c'est le même socle de navigateurs, pas une dépendance de plus. */
.articleVitrine > *:has(+ h2),
.articleVitrine > *:has(+ h3) {
    margin-bottom: 0;
}

/* Un îlot reprend toute la largeur, sous les deux colonnes — celui des scènes sur les
   pages de rubriques, celui des rubriques sur la Home. La foire aux questions suit la
   même règle : elle se pose sous le texte, pas dans sa colonne. Le menu des chapitres
   horizontal aussi : posé dans son propre fichier, son `grid-column` perdait face à
   `.articleVitrine > *` (même poids, chargé après) — le menu tombait dans la colonne de
   texte, décentré et coupé à droite. */
.articleVitrine .chapitresHorizontal,
.articleVitrine .ilotScenes,
.articleVitrine .ilotScenarios,
.articleVitrine .ilotRubriques,
.articleVitrine .faq,
.articleVitrine .pageRubriquePreview {
    grid-column: 1 / -1;
}

/* ============================================
   MOBILE ET FENÊTRES ÉTROITES
   Sous ce seuil, l'image et le texte ne tiennent
   plus côte à côte : l'image passerait à 400 px
   et le texte à un mot par ligne.
   ============================================ */
@media (max-width: 767px) {
    .articleVitrine {
        grid-template-columns: 1fr;
    }

    /* L'image reprend sa place dans le flux, juste après le titre. */
    .articleVitrine > p:has(img) {
        grid-column: 1;
        grid-row: auto;
        margin-block: 0 1em;
    }
}

/* Un article sans visuel n'a pas de seconde colonne à remplir : sans ça, 37.5% de la
   largeur resteraient vides à droite du texte. */
.articleVitrine:not(:has(img)) {
    grid-template-columns: 1fr;
}

/* ============================================
   UNE IMAGE ENTRE DEUX ARTICLES — #imageEntreArticles
   Usage : la page Scénarios (le déroulé, entre les deux articles).
   Une image en bandeau, bien plus large que haute : elle prend toute la largeur
   disponible et ne la dépasse jamais. La colonne de droite d'un article (450px au
   plus) la rendrait illisible.
   ============================================ */
#imageEntreArticles {
    display: block;
    width: 100%;
    max-width: 900px;
    height: auto;
    /* L'enveloppe des articles (.contenu) : l'image commence au bord gauche du texte. */
    padding: var(--paddingPage);
}

/*!*****************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/pageChapitres.css ***!
  \*****************************************************************************************************************************/
/* ============================================
   GABARIT « PAGE À CHAPITRES » — titre, menu à gauche, articles à droite

   Le CSS du gabarit templates/vitrine/public/basePageChapitre.twig, et de rien
   d'autre : toute page qui étend ce gabarit prend cette géométrie, sans la
   redéclarer. Ce qu'une page a de PROPRE (des tuiles, une grille, un formulaire)
   vit dans son fichier à elle.

   ⚠️ Les identifiants HTML sont en anglais (#chapters, #chapterXxx) parce qu'ils
   finissent dans l'URL. Les classes, elles, restent dans la langue du code.
   ============================================ */

/* Le titre se pose à la même hauteur que celui de la Home, et respire pareil :
   3rem au-dessus et au-dessous, exactement la valeur de `.articleVitrine > h1`.
   Le noyau ne laisse que 5px sous un h1 (partagé avec le Studio, on ne le touche
   pas) — d'où la surcharge ici. */
.pageChapitres h1 {
    margin-block: var(--margeTitrePage);
}

/* Le chapeau : le titre de la page et les deux phrases qui l'accompagnent, quand la
   page en a un. Il vient du markdown, donc sans classe — tout se cible d'ici.
   Le h1 reprend son écart au chapeau (1rem au lieu de 3rem) : les deux se lisent
   ensemble, c'est SOUS le chapeau que la page respire. */
.chapeauPage {
    margin-bottom: 3rem;
}

.chapeauPage h1 {
    margin-block: var(--margeTitrePage) 1rem;
}

.chapeauPage p {
    margin: 0;
}

/* La rangée : menu à gauche, articles à droite. */
.chapitresZone {
    display: flex;
    /* 4rem, et non --gapListe (32px) comme la zone de filtres : ici les deux
       colonnes ne sont pas de même nature — à gauche un menu, à droite le contenu.
       C'est le blanc qui doit le dire (décision PO 2026-08-25). --gapColonnes : le
       même blanc que le texte d'un article et son image (décision chef de projet
       2026-09-17). */
    gap: var(--gapColonnes);
    align-items: flex-start;
}

/* ── Le menu des chapitres ────────────────────────────────────────────────── */

/* Le menu suit le défilement : il descend avec la page, puis se cale en haut. */
.chapitres {
    flex: 0 0 220px;
    position: sticky;
    top: 20px;
}

.chapitres ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    position: relative;
    /* AUCUN écart entre les lignes : un blanc de deux pixels suffit à éteindre le
       survol quand la souris passe d'une ligne à l'autre, et le pavé clignote. Un
       menu n'a pas de trous — il y a toujours une ligne sous le curseur. */
    gap: 0;
}

.chapitres ul li {
    padding: 0;
    margin: 0;
}

/* Chaque ligne occupe TOUTE la largeur du menu (220px). C'est ce qui rend la colonne
   lisible : le pavé de la ligne active dessine sa largeur, on voit d'un coup
   d'œil où le menu s'arrête et où le contenu commence.
   Couleurs : l'Accent de la page (--cAccent3 / --cAccentt), comme le menu des
   sous-rubriques. Aucune couleur nouvelle — le noyau l'interdit sans accord. */
.chapitres a {
    display: block;
    padding: var(--paddingCta14);
    border-radius: var(--borderR1);
    font: var(--fMenu14);
    font-size: 15px;
    line-height: 21px;
    color: var(--cNoir3);
    text-decoration: none;
    transition: .3s;
}

.chapitres a:hover {
    color: var(--cNoir1);
    background: var(--cBlanc2);
}

/* Le pavé du chapitre actif. UN SEUL pour tout le menu : il ne s'allume pas
   ligne par ligne, il GLISSE de l'une à l'autre. C'est le déplacement qui dit
   qu'on a changé de chapitre, pas l'apparition.
   Posé par chapitres.ts, qui lui donne sa taille et sa position. Le menu horizontal
   (.chapitresHorizontal) a le même. */
.chapitresCurseur {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 0;
    border-radius: var(--borderR1);
    background: var(--cAccent3);
    transition: transform .3s ease, width .3s ease, height .3s ease;
    pointer-events: none;
}

/* Le texte passe au-dessus du pavé. */
.chapitres li {
    position: relative;
}

/* Le chapitre où l'on se trouve : c'est le pavé glissant qui le remplit, le lien
   ne porte plus que la couleur de son texte. */
.chapitres a.actif,
.chapitres a.actif:hover {
    color: var(--cAccentt);
    background: transparent;
}

/* L'anneau de focus ne se montre qu'au CLAVIER. `:focus` se déclenche aussi à la
   souris — l'anneau restait après un clic, sans que personne l'ait demandé.
   `:focus-visible` est la même chose, mais le navigateur décide : clavier oui,
   souris non. */
.chapitres a:focus {
    outline: none;
}

.chapitres a:focus-visible {
    box-shadow: 0 0 0 3px var(--cFormFocus) inset;
}

/* ── La colonne des articles ──────────────────────────────────────────────── */

.chapitresArticles {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    /* Sans cadre, 32px (le rythme de liste) ne suffisent pas à dire où un bloc
       finit — c'est le blanc qui fait la séparation. --gapBlocs : le blanc entre deux
       blocs empilés (décision chef de projet 2026-09-17). */
    gap: var(--gapBlocs);
    /* AUCUN plafond de largeur : la colonne prend tout l'espace laissé par le menu
       (décision PO 2026-08-25). Ce n'est plus la largeur qui tient la longueur de
       ligne, c'est la structure du contenu — phrases courtes et listes. */
}

.chapitre {
    /* Le défilement vers une ancre ne colle pas le bloc au bord haut. */
    scroll-margin-top: 20px;
}

/* Aucun cadre, aucune marge intérieure : c'est du texte libre. Ce sont les blancs
   entre les chapitres qui les séparent, pas un trait. */
.chapitreCorps {
    padding: 0;
}

.chapitreCorps h2 {
    margin: 0 0 8px;
}

/* ── Le texte d'un chapitre, et ses liens ─────────────────────────────────
   Le texte d'un chapitre vient du MARKDOWN : il n'a donc aucune classe à lui, et
   ne peut pas en avoir. Tout se cible depuis le conteneur — c'est le même parti
   pris que `.articleVitrine` pour les pages de rubrique. */

/* Aucun plafond de largeur : ce n'est pas la largeur qui tient la longueur de
   ligne, c'est la structure du texte — phrases courtes et listes (décision PO
   2026-08-25). */
.chapitreCorps p {
    margin: 0;
}

/* Deux paragraphes respirent, mais le dernier reste collé à SA liste : « Le soir
   venu… » et les lignes qui suivent sont un seul bloc de sens. */
.chapitreCorps p + p {
    margin-top: var(--gapMoyen);
}

/* Les puces sont RENDUES : le reset du noyau (00_reset.css) les efface pour tout
   le site, parce que la plupart des <ul> y sont des menus. Ici c'est une vraie
   liste de lecture, elle porte donc ses puces.
   Le retrait est FRANC (--retraitListe, 40px) : c'est lui qui dit que ces lignes sont
   un bloc à part, et non la suite du paragraphe. 20px suffisaient à poser la puce, pas
   à séparer. Le chiffre ne vit plus ici : la même variable sert au ul d'un article et à
   la réponse d'une question (décision chef de projet 2026-09-07). */
.chapitreCorps ul {
    margin: var(--gapDefaut) 0 0;
    padding-left: var(--retraitListe);
    list-style-type: disc;
}

/* Les lignes se SUIVENT : --gapReduit (4px). À l'intérieur d'un chapitre, l'air
   dessert — il fait croire à plusieurs blocs séparés au lieu d'une liste. Le grand
   blanc, c'est entre les chapitres (--gapBlocs), pas dedans. */
.chapitreCorps li {
    margin: var(--gapReduit) 0;
}

/* Les liens DANS le texte — paragraphes et listes seulement. Les tuiles, elles,
   sont des boutons (.ctaDiscret) et vivent hors des paragraphes.
   Souligné permanent : le système de soulignement vitrine (vitrine.css) s'applique. */
.chapitreCorps p a,
.chapitreCorps li a {
    color: var(--cAccent3);
    transition: .3s;
}

/* Comme pour le menu : l'anneau de focus au CLAVIER seulement. */
.chapitreCorps p a:focus,
.chapitreCorps li a:focus {
    outline: none;
}

.chapitreCorps p a:focus-visible,
.chapitreCorps li a:focus-visible {
    box-shadow: 0 0 0 3px var(--cFormFocus);
    border-radius: var(--borderR1);
}

/* Le bouton du bas de chapitre : il suit le texte, il ne le colle pas — --gapLarge
   (20px), l'écart « entre deux groupes », pas celui entre deux frères. */
.chapitreCta {
    display: inline-block;
    margin-top: var(--gapLarge);
    text-decoration: none;
}

/*!****************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/pageRubrique.css ***!
  \****************************************************************************************************************************/
/* ============================================
   PAGE DE RUBRIQUE — LE BANDEAU DES APERÇUS
   Gabarit : vitrine/rubrique/basePageRubrique.twig. Ce fichier ne s'occupe que de
   l'enveloppe `.pageRubriquePreview`, celle qui reçoit les îlots (scènes, scénarios, FAQ).

   À partir de 1600px de fenêtre (décision chef de projet 2026-09-03), les aperçus changent
   d'espace : l'enveloppe quitte la colonne de 1280 et se pose sur un fond gris qui va d'un
   bord à l'autre de la fenêtre. Le fond COLLE aux bords, c'est le but — « j'ai pris tout
   l'espace » — mais pas son contenu : titres, intros et grilles gardent au moins 100px de
   chaque côté, et les titres sont CENTRÉS. C'est le centrage, plus le fond, qui dit au
   visiteur qu'il n'est plus dans l'article.
   En dessous de 1600, rien de tout ça : pas de fond, textes à gauche (les titres gardent
   leur fonte et leurs capitales, voir en fin de fichier), îlots dans la
   colonne. La mise en page d'origine est celle-là, le bandeau est l'exception.

   UN SEUL BANDEAU POUR TOUS LES ÎLOTS (décision chef de projet 2026-09-03). Le bandeau
   a d'abord été posé sur chaque îlot : quand deux ou trois se suivaient, chacun avait son
   fond et il restait des bandes blanches entre eux. Il est donc porté par l'ENVELOPPE, une
   par page, et les îlots se suivent dedans, plus espacés qu'ailleurs (12rem au lieu de 8 :
   sur un même fond, il faut plus de vide pour que deux îlots se lisent comme deux). Seul le
   premier perd sa marge haute : c'est le padding du bandeau qui l'espace du bord.
   L'îlot de SCÉNARIOS est dans le bandeau lui aussi, sous sa forme centrée
   (_ilotScenariosBandeau.twig, décision chef de projet 2026-09-18) : il en était sorti le
   2026-09-03, le temps d'y réfléchir.

   ⚠️ 1600 n'est pas l'un des quatre paliers du CLAUDE.md CSS : c'est un cinquième, réservé
   aux très grands écrans, posé sur décision du chef de projet. À 1280, le plus haut des
   quatre, le bandeau ferait 1080 de contenu — moins que la colonne qu'il remplace.

   LA SORTIE DE COLONNE : des marges latérales négatives. `50%` est la moitié du conteneur,
   `50vw` la moitié de la fenêtre : la différence est ce qui manque pour atteindre le bord,
   quel que soit le padding de .contenu, puisque tout est centré. Le bloc reste dans le
   flux, à sa place verticale. `html { overflow-x: clip }` (bodyPage.css) absorbe la barre
   de défilement que 100vw compte en trop.

   LE PLAFOND : le fond suit la fenêtre, le contenu non. Au-delà de 1800px de fenêtre, la
   marge latérale grandit au lieu du contenu — quatre vignettes de 600px n'aideraient
   personne. C'est le `max()` : 100px, ou ce qu'il faut pour tenir le contenu à 1800.
   ============================================ */
@media (min-width: 1600px) {
    .pageRubriquePreview {
        width: 100vw;
        margin-top: 8rem;
        margin-inline: calc(50% - 50vw);
        padding-block: var(--paddingBandeau);
        padding-inline: max(100px, calc((100vw - 1800px) / 2));
        background: var(--cBackgroundGrand);
        border-block: var(--border);
        border-block-color: var(--cNoir4);
    }

    /* Le premier îlot ne se détache plus de l'article : c'est le bandeau qui s'en détache
       (margin-top ci-dessus) et son padding qui espace l'îlot du trait. */
    .pageRubriquePreview > :first-child {
        margin-top: 0;
    }

    /* Entre deux îlots du bandeau, 12rem (décision chef de projet 2026-09-03) : les 8rem
       de partout suffisent quand le fond blanc de la page les sépare déjà ; sur le même
       fond gris, il faut plus de vide.
       `:not(:first-child)` et non `* + *` : les deux disent la même chose, mais `* + *` pèse
       autant que `.ilotScenes { margin-top: 8rem }`, chargé APRÈS ce fichier, qui gagnait
       alors — les 12rem ne s'appliquaient pas. La pseudo-classe fait pencher la balance. */
    .pageRubriquePreview > :not(:first-child) {
        margin-top: 12rem;
    }

    /* LES TITRES DES ÎLOTS, centrés dans le bandeau. Leur fonte et leurs capitales valent
       à toutes les tailles : voir la règle hors media query, plus bas. */
    .pageRubriquePreview > section > h2,
    .pageRubriquePreview .ilotScenesIntro h2,
    .pageRubriquePreview .ilotScenesIntro h3,
    .pageRubriquePreview .ilotScenariosIntro h2,
    .pageRubriquePreview .ilotScenariosIntro h3,
    .pageRubriquePreview .ilotRubriquesIntro h2,
    .pageRubriquePreview .ilotRubriquesIntro h3 {
        text-align: center;
        /* Aucune marge ici : l'écart sous le titre est celui de l'îlot (--ilotEcart,
           ilotScenes.css), le même en bandeau et hors bandeau. */
    }
}

/* LES TITRES DES ÎLOTS, À LA TAILLE DE L'ESPACE (décision chef de projet 2026-09-03) : sur
   un bandeau qui traverse la page, un H2 ordinaire de 24px se perdait — un titre comme un
   autre pour un espace qui n'en est pas un. Il reste un H2 dans le HTML, mais prend la fonte
   du H1 (32px, même Scada en gras : un cran du design system, pas une taille inventée), en
   capitales. Sans espacement des lettres : essayé, refusé par le chef de projet le 2026-09-03.
   À TOUTES LES TAILLES D'ÉCRAN (décision chef de projet 2026-09-22) : d'abord réservée au
   bandeau (≥ 1600), la forme se perdait en dessous et le titre d'îlot redevenait un H2
   comme un autre — la structure de la page changeait avec la largeur. Seul le centrage
   dépend du bandeau (règle plus haut, dans la media query).
   Trois cas : le H2 posé par `titre` (enfant direct de l'îlot), et le `## Titre` ou
   `### Titre` du markdown d'`intro` — H2 et H3, même combat : le niveau est pour Google
   et la hiérarchie du document, pas pour l'œil, qui voit le même titre.
   Les questions de la FAQ ne sont pas visées : elles ne sont ni enfant direct de l'îlot
   ni dans une intro. */
.pageRubriquePreview > section > h2,
.pageRubriquePreview .ilotScenesIntro h2,
.pageRubriquePreview .ilotScenariosIntro h2,
.pageRubriquePreview .ilotScenariosIntro h3,
.pageRubriquePreview .ilotRubriquesIntro h2,
.pageRubriquePreview .ilotRubriquesIntro h3 {
    font: var(--fH1);
    text-transform: uppercase;
    /* Le H2 de base du noyau porte 10px de marge à droite et 0 à gauche (10_font.css) : centré,
       son texte partait 5px à gauche de celui d'un H3, dont les marges sont symétriques. */
    margin-inline: 0;
}

/* LE H3 D'UN ÎLOT DE SCÈNES, à la fonte du H2 (chef de projet 2026-10-02) : sur la page
   Tombola, un H2 « Scènes de tombola » porte trois sous-titres en H3. Gardés à la taille du
   H2, ils ne se distinguaient plus de lui — un cran plus petit, la hiérarchie se lit. */
.pageRubriquePreview .ilotScenesIntro h3 {
    font: var(--fH2);
    text-transform: uppercase;
}

/*!******************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/pageCategories.css ***!
  \******************************************************************************************************************************/
/* ============================================
   PAGE CATÉGORIES — ce qu'elle a de PROPRE

   La géométrie de la page (titre, menu des chapitres, colonne des articles) n'est
   plus ici : elle est dans pageChapitres.css, avec le gabarit qui la porte. Ce
   fichier ne garde que les tuiles de lien, qui n'existent que sur cette page.

   ⚠️ BROUILLON, comme la page : les tuiles disparaîtront peut-être au profit du
   texte à liens du premier chapitre.
   ============================================ */

/* ── Les tuiles de lien ───────────────────────────────────────────────────
   Un chapitre ne porte pas de texte : il porte des LIENS. La tuile EST le lien,
   elle ne contient rien qui ne soit cliquable — icône et titre, point.

   ⚠️ LE COMPORTEMENT DE BOUTON N'EST PAS REDÉFINI ICI. La tuile porte
   `.ctaDiscret` dans le template : trait, fond, survol, transition et couleur
   de texte viennent de là, comme tous les boutons discrets du site. Ce fichier
   n'ajoute QUE ce qu'une tuile a de plus : poser une icône devant le texte.

   Le sélecteur double (.tuileLien.ctaDiscret) est nécessaire : ctaDiscret.css
   est importé APRÈS ce fichier, donc à spécificité égale c'est lui qui gagne. */
.tuilesLiens {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gapDefaut);
}

.tuileLien.ctaDiscret {
    display: flex;
    align-items: center;
    gap: 8px;
    text-decoration: none;
}

/* ⚠️ Ces SVG n'ont pas de dimension à eux, seulement un `viewBox`. Sans largeur
   ET hauteur imposées ici, ils prennent toute la place qu'on leur laisse. */
.tuileLienIcone {
    display: block;
    flex: 0 0 auto;
    color: var(--cAccent3);
}

.tuileLienIcone svg {
    display: block;
    width: 20px;
    height: 20px;
}

/*!******************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/composants/menuSousRubriques.css ***!
  \******************************************************************************************************************************************/
/* ============================================
   MENU DES SOUS-RUBRIQUES
   Barre de navigation entre les pages sœurs d'une rubrique
   (Bingo 75 / Bingo 90…).

   Trois états, trois rôles distincts :
     - souligné fin gris : sépare les sœurs les unes des autres ;
     - souligné épais    : la sœur où l'on se trouve ;
     - pavé plein        : la sœur survolée, couverte comme un bouton.

   PARTAGÉ Vitrine / Studio. Le balisage diffère des deux côtés (liens posés
   à la main côté Vitrine, dérivés du tag de sous-rubrique côté Studio), la
   géométrie est la même, et la couleur est l'Accent de la page (--cAccent3,
   texte --cAccentt) : verte en Vitrine, bleue en Studio, par la classe du body.

   Transcrit du menu de tirage-au-sort.net (référence chef de projet).
   ============================================ */

#menuSousRubriques {
    padding: var(--gapReduit);
}

#menuSousRubriques li {
    display: inline-block;
    margin: 7px 0 0;
    vertical-align: top;
}

#menuSousRubriques a {
    display: block;
    position: relative;
    /* Contient le pavé de survol : sans ça, son z-index négatif le ferait passer
       derrière le fond de la page au lieu de rester derrière le texte. */
    isolation: isolate;
    margin: 0 4px;
    padding: var(--paddingCta14);
    font: var(--fMenu14);
    font-size: 15px;
    line-height: 23px;
    color: var(--cNoir3);
    border-bottom: 1px solid var(--cBlanc3);
    text-decoration: none;
    cursor: pointer;
    transition: .3s;
}

@media (max-width: 1023px) {
    /* La silhouette ne change plus en fenêtre étroite : seul le corps du texte descend.
       Un bouton ne choisit pas son padding (décision PO 2026-07-18). */
    #menuSousRubriques a {
        font-size: 14px;
    }
}

/* La sœur où l'on se trouve. */
#menuSousRubriques a.actif {
    color: var(--cNoir1);
    border-bottom: 2px solid var(--cAccent3);
}

/* Le pavé de survol : au repos il est rentré à l'intérieur du texte, et transparent. */
#menuSousRubriques a::before {
    content: "";
    display: block;
    position: absolute;
    top: 4px;
    right: 8px;
    bottom: -2px;
    left: 8px;
    z-index: -100;
    border-radius: var(--borderR1);
    background: transparent;
    transition: .3s;
}

/* Focus clavier : anneau intérieur, pas d'outline — le lien n'a pas de soulignement
   qui signalerait le parcours au clavier. */
#menuSousRubriques a:focus {
    outline: none;
    box-shadow: 0 0 0 3px var(--cFormFocus) inset;
}

#menuSousRubriques a:hover {
    color: var(--cAccentt);
    border-bottom-color: transparent;
}

/* Au survol il déborde du texte et se remplit : c'est ce débordement qui fait le zoom. */
#menuSousRubriques a:hover::before {
    top: -2px;
    right: -8px;
    bottom: -2px;
    left: -8px;
    background: var(--cAccent3);
}

/*!*********************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/menuSousRubriques.css ***!
  \*********************************************************************************************************************************/
/* ============================================
   MENU DES SOUS-RUBRIQUES - Vitrine
   Import de la structure noyau. La couleur du menu est l'Accent de la page (classe du body),
   rien à déclarer ici. Jumeau : noyau/css/studio/58_menuSousRubriques.css.
   ============================================ */

/*!**************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/ilotScenes.css ***!
  \**************************************************************************************************************************/
/* ============================================
   ÎLOT D'APERÇUS DE SCÈNE
   Une vignette, son nom, ce qu'elle montre.
   ============================================ */

/* L'écart avec ce qui précède appartient à la section, pas à son titre : c'est l'îlot
   entier qu'on détache de l'article. */
.ilotScenes {
    margin-top: 8rem;
    /* UN SEUL ÉCART VERTICAL dans l'îlot (décision chef de projet 2026-09-03) : entre le
       titre et la grille, entre le titre et le paragraphe d'intro, entre ce paragraphe et
       la grille. Avant, chacun avait le sien (1.5rem, 2.5rem, la marge par défaut du
       titre) et un îlot avec intro ne respirait pas comme un îlot sans. Tout ce qui
       espace dans l'îlot lit cette variable, rien d'autre. */
    --ilotEcart: 2rem;
}

.ilotScenes > h2 {
    margin-top: 0;
    margin-bottom: var(--ilotEcart);
}

/* Le markdown de `intro`, à la place du H2. Son titre est DANS le bloc, donc la règle
   `.ilotScenes > h2` ci-dessus ne l'atteint pas : c'est ce bloc qui porte l'écart avec la
   grille — le même que celui d'un titre seul. */
.ilotScenesIntro {
    margin-bottom: var(--ilotEcart);
}

/* LE TEXTE S'AJUSTE À SON CONTENU et se centre (chef de projet 2026-10-02 ; sans grille
   depuis le 2026-10-04). Chaque bloc de texte prend la largeur de son contenu, plafonnée à
   la largeur de lecture, et ses marges automatiques le centrent sous le titre. Un texte
   court donne un bloc étroit ; un texte long remplit la largeur de lecture ; le texte reste
   aligné à gauche dans le bloc. Le TITRE n'est pas concerné : il garde toute la largeur. */
.ilotScenesIntro > :not(h2, h3) {
    width: fit-content;
    max-width: var(--largeurTexte);
    margin-inline: auto;
}

/* Le titre du markdown et son premier paragraphe : le même écart, encore. Le titre pose
   la marge, le paragraphe n'en ajoute aucune — deux marges qui se touchent fusionnent en
   la plus grande, et on ne veut pas dépendre de laquelle gagne. */
.ilotScenesIntro > h2,
.ilotScenesIntro > h3 {
    margin-bottom: var(--ilotEcart);
}

.ilotScenesIntro > h2 + p,
.ilotScenesIntro > h3 + p {
    margin-top: 0;
}

/* Sans ça, la marge du titre du markdown s'ajoute à celle du bloc et creuse un trou. */
.ilotScenesIntro > *:first-child {
    margin-top: 0;
}

.ilotScenesIntro > *:last-child {
    margin-bottom: 0;
}

/* L'îlot est la SECTION : son titre et sa grille. La grille est dedans, pas confondue
   avec lui — sinon le titre deviendrait une cellule parmi les vignettes. */
/* TROIS COLONNES AU MAXIMUM, jamais quatre (décision chef de projet 2026-08-23) : sur un
   grand écran, `auto-fill` fabriquait une quatrième colonne et donc quatre vignettes
   minuscules, où le visiteur ne distingue plus ce sur quoi il s'apprête à cliquer. Le
   nombre de colonnes est donc POSÉ, pas déduit d'une largeur minimale : une colonne, puis
   deux, puis trois, et on s'arrête là. La vignette grandit avec l'écran au lieu de se
   multiplier. */
.ilotScenesGrid {
    display: grid;
    grid-template-columns: 1fr;
    /* Le MÊME écart dans les deux sens, 1.5rem (décision chef de projet 2026-09-03). Le 23
       août, l'écart vertical avait été triplé (4.5rem) pour qu'on sache à quelle vignette
       appartient un titre — sous une vignette, il y a le titre de la suivante. Revu à
       l'écran avec les vignettes de 1000px et le bandeau : le triple creusait des trous,
       et le titre collé sous son image (marge de .5rem, contre 1.5rem au-dessus de la
       suivante) suffit à dire à qui il est. */
    gap: 1.5rem;
}

@media (min-width: 560px) {
    .ilotScenesGrid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 900px) {
    .ilotScenesGrid {
        grid-template-columns: repeat(3, 1fr);
    }
}

/* Les propriétés du repos qui ne servent qu'au survol (halo de largeur nulle, fond
   transparent) sont ici plutôt que dans la section « LE SURVOL » plus bas : une transition
   n'a lieu que si l'état de départ est ÉCRIT — un outline absent ne s'anime pas, un
   outline de 0 si.
   UNE DEMI-SECONDE, et c'est voulu (décision chef de projet 2026-08-23) : le halo n'annonce
   rien, il ne fait que confirmer « votre souris est ici ». À 0.2s il claquait à chaque
   vignette traversée et le catalogue clignotait sous le curseur. À .5s en `ease-out`, le
   visiteur qui ne fait que passer voit à peine le fond bouger ; celui qui s'arrête voit le
   halo s'installer. Le lent est ici plus lisible que le rapide.
   La couleur du halo est TRANSPARENTE au repos, pas nulle : sans ça, l'outline partait déjà
   à sa couleur pleine et seule sa LARGEUR montait — le bleu surgissait d'un coup sur un
   liseré d'un pixel, puis s'élargissait. En partant de `transparent`, la couleur monte en
   même temps que la largeur, et le halo se teinte au lieu d'apparaître. */
/* LA VIGNETTE EST UNE BOÎTE, PLUS UN LIEN (décision chef de projet 2026-10-07) : l'image est
   un lien qui joue l'aperçu (.ilotSceneVisuel), le texte est un lien qui mène à la fiche
   (.ilotSceneTexte). La boîte ne porte que le halo du survol. */
.ilotScene {
    display: flex;
    flex-direction: column;
    color: inherit;
    border-radius: var(--borderR1);
    outline: 0 solid transparent;
    background: transparent;
    transition: outline-width .5s ease-out, outline-color .5s ease-out, background-color .5s ease-out;
}

/* LA COULEUR DU HALO : le fond de la vignette, éclaircie (décision chef de projet
   2026-10-07). Elle sert à la vignette de l'îlot ET au visuel de la page d'une scène
   (.sceneVisuelLien, pageScene.css) : une seule formule pour les deux.
   `--couleurFondVisuel` est posée par le gabarit, calculée sur l'image
   (ApercuSceneService::couleurFond) ; le PHP ne donne que la couleur brute, c'est ici
   qu'on dit à quel point on l'éclaircit. 40 % de la couleur, le reste en blanc : assez
   pour qu'on reconnaisse le vert, l'orange ou le bleu de la scène, assez pâle pour que le
   texte reste lisible dessus. Sans vignette, l'Accent : sur Accent2, ce mélange donne à
   peu près l'ancien halo. */
.ilotScene,
.sceneVisuelLien {
    --couleurHalo: color-mix(in srgb, var(--couleurFondVisuel, var(--cAccent2)) 40%, var(--cBlanc));
}

/* Le lien de l'image : il joue l'aperçu. Pas de soulignement — l'image n'a pas de texte, et le
   `a` de la Vitrine (vitrine.css) le soulignerait au moindre espace. */
.ilotSceneVisuel {
    text-decoration: none;
    cursor: pointer;
    box-shadow: 0 0 0 0 transparent;
    transition: box-shadow .5s ease-out;
    display: flex;
    align-items: center;
    justify-content: center;
    aspect-ratio: 16 / 9;
    border-radius: var(--borderR1);
    background: #fff;
    border: 1px solid #dde5ee;
    overflow: hidden;
}

/* L'îlot ne fait jamais flotter : il vient après le texte de l'article. */
.ilotSceneVisuel img {
    float: none;
    width: 100%;
    height: 100%;
    max-width: none;
    object-fit: cover;
    border-radius: 0;
    margin: 0;
}

/* Le lien du texte : le nom et la description, collés, sous l'image. Il mène à la fiche.
   Aucun soulignement au repos — c'est le nom, seul, qui se souligne quand on le survole ou
   qu'on le focalise : il dit « ceci est un lien », alors que l'image dit « ceci joue ».
   Le soulignement est posé sur LE NOM, pas sur le lien : un soulignement posé sur le lien
   se propagerait à la description et ne pourrait plus en être retiré.
   Même système de soulignement que les liens de la Vitrine (vitrine.css). */
.ilotSceneTexte {
    display: flex;
    flex-direction: column;
    text-decoration: none;
    color: inherit;
}

.ilotSceneTexte:hover .ilotSceneNom,
.ilotSceneTexte:focus-visible .ilotSceneNom {
    text-decoration: underline;
    text-underline-offset: 5px;
    text-decoration-thickness: 1px;
    text-decoration-color: var(--cNoir5);
}

/* Les deux lignes de texte sont COLLÉES (décision chef de projet 2026-08-23) : elles
   parlent de la même vignette, elles doivent se lire comme un seul bloc. Aucune hauteur
   réservée ici — une hauteur figée sur un nom d'une seule ligne creusait un trou d'une
   ligne entière entre le nom et le texte, et ce trou détachait à l'œil ce qui va
   ensemble. C'est l'écart vertical de la grille qui sépare les vignettes, pas du vide à
   l'intérieur de chacune.
   `line-clamp` reste, lui : il coupe ce qui déborde. Les deux syntaxes sont posées : la
   standard, et la -webkit- que Safari et Chrome réclament encore pour le mode boîte
   vertical. */
.ilotSceneNom,
.ilotSceneApercu {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    overflow: hidden;
    line-clamp: 2;
    -webkit-line-clamp: 2;
}

/* DEUX NIVEAUX, DEUX FONTES DU DESIGN SYSTEM (décision chef de projet 2026-09-03). Le nom
   de la scène ne s'affiche plus : le nom de l'aperçu a pris sa place et sa graisse, la
   description a pris la place et le corps du nom de l'aperçu. */

/* Le nom de l'APERÇU — il titre la vignette. Sa marge haute est le seul écart du bloc :
   elle détache le texte de l'image, sans l'en séparer. */
.ilotSceneNom {
    margin-top: .5rem;
    font: var(--fText16Strong);
}

/* La description de l'aperçu, au corps du nom d'aperçu d'avant : 16px, graisse normale.
   Elle n'est PAS un texte secondaire — c'est elle qui dit ce que la vignette montre.
   Deux lignes au maximum : elle fait jusqu'à 80 signes, une seule ligne en couperait la
   moitié dans une colonne de vignette. */
.ilotSceneApercu {
    font: var(--fText16);
}

/* ============================================
   LE SURVOL
   Sur un catalogue, le visiteur attend qu'une vignette RÉPONDE quand il la survole : c'est
   ce qui lui dit qu'elle est cliquable, avant même qu'il ait vu le curseur changer. La
   réponse est un halo, et il DIT OÙ MÈNE LE CLIC (décision chef de projet 2026-10-07) :
     • sur l'IMAGE, le halo n'entoure que l'image — elle va jouer l'aperçu ;
     • sur le TEXTE, le halo entoure toute la vignette, image comprise — le texte va ouvrir
       la fiche, qui regroupe tout ce que la vignette montre.
   Les deux halos sont de la couleur du fond de la vignette, éclaircie (--couleurHalo).

   TOUTE LA VIGNETTE : un `outline` et un fond, sur la boîte. L'outline se dessine EN DEHORS
   de la boîte, il ne pousse donc pas les vignettes voisines et ne décale la grille d'aucun
   pixel. Sa largeur et sa couleur montent en .5s (état de repos et durée posés sur
   `.ilotScene`) : le halo s'installe lentement, il n'apparaît jamais d'un coup.
   L'IMAGE SEULE : un `box-shadow` d'étalement 15px, de même largeur, et non un outline —
   l'outline se peint PAR-DESSUS le contenu et masquerait le début du texte qui suit ; l'ombre
   se peint dessous, le texte reste lisible. Au focus clavier, l'anneau de focus des liens
   (31_cta.css) reste posé par-dessus, le halo s'ajoute derrière.
   ============================================ */
.ilotScene:has(.ilotSceneTexte:hover),
.ilotScene:has(.ilotSceneTexte:focus-visible) {
    outline: 15px solid var(--couleurHalo);
    background: var(--couleurHalo);
}

.ilotSceneVisuel:hover {
    box-shadow: 0 0 0 15px var(--couleurHalo);
}

.ilotSceneVisuel:focus-visible {
    box-shadow: 0 0 0 3px var(--cFormFocus), 0 0 0 15px var(--couleurHalo);
}

/* ============================================
   DANS LE BANDEAU — grands écrans seulement
   Le bandeau (fond gris d'un bord à l'autre, contenu centré à partir de 1600px) n'est PAS
   porté par l'îlot : il est porté par l'enveloppe `.pageRubriquePreview` du gabarit de
   rubrique, voir pageRubrique.css. Raison (décision chef de projet 2026-09-03) : plusieurs
   îlots se suivent souvent, et un bandeau par îlot laissait des bandes blanches entre eux.
   Un seul bandeau, tous les îlots dedans. Ne restent ici que les réglages de CET îlot
   quand il est dans le bandeau.
   ============================================ */
@media (min-width: 1600px) {
    /* Le BLOC de l'intro se centre (plus haut) ; son texte reste aligné à gauche (décision
       chef de projet 2026-09-03) : un paragraphe centré se lit mal, chaque ligne repart d'un
       endroit différent. Seul le titre est centré (pageRubrique.css). */
    .pageRubriquePreview .ilotScenesIntro p {
        text-align: left;
    }

    /* La vignette, elle, reste écrite à gauche : ses trois lignes de texte se lisent en
       bloc sous l'image, un centrage les ferait flotter. Seul ce qui parle de la SECTION
       (titre, intro) se centre. */
    .pageRubriquePreview .ilotScene {
        text-align: start;
    }

    /* QUATRE COLONNES dans le bandeau (décision chef de projet 2026-09-03). La règle des
       trois colonnes au maximum (plus haut, 2026-08-23) protégeait des vignettes minuscules
       sur un écran ordinaire ; dans le bandeau, avec au moins 1400px de contenu, quatre
       vignettes font encore 330px chacune — plus que trois vignettes à 1024. Le bandeau est
       l'autre espace, il a son propre nombre de colonnes. */
    .pageRubriquePreview .ilotScenesGrid {
        grid-template-columns: repeat(4, 1fr);
    }
}

/* ============================================
   LA CASE — la vignette et, sous elle, la ligne du lien vers le studio et du cœur
   La grille range des cases ; la vignette (la boîte) est dedans, la ligne aussi, l'une sous
   l'autre. Sans case, cette ligne serait une cellule de la grille à elle seule.
   Elle est à 1.25rem sous la vignette : le halo du survol déborde de 15px, la ligne doit
   rester en dehors, sinon le survol de la vignette a l'air de la couvrir.

   UN LIEN, PLUS UN BOUTON (décision chef de projet 2026-09-07). Il portait la silhouette
   de bouton des cartes de scénario (.ctaDiscret) : bordure, fond blanc, rembourrage. Sous
   une vignette, cette silhouette pesait trop pour un geste secondaire.
   Il ne pose donc plus RIEN d'autre que sa place et sa taille : la couleur d'accent et le
   soulignement viennent du `a` de la vitrine (vitrine.css), la taille reste celle qu'avait
   le bouton (--fMenu14), pour que seule la silhouette change.
   `align-items: flex-start` (ci-dessous) le garde à la largeur de son texte : étiré sur
   toute la case, il offrirait au clic une bande de vide à sa droite.
   `justify-content: space-between` (décision chef de projet 2026-09-13) : les cases d'une
   même rangée ont la hauteur de la plus haute (la grille les étire), mais leurs textes n'ont
   pas tous deux lignes. La vignette reste en haut, la ligne descend en bas de la case : elle
   tombe à la même hauteur sur toute la rangée.
   ============================================ */
.ilotSceneCase {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: space-between;
}

.ilotSceneCase .ilotScene {
    align-self: stretch;
}

/* LA LIGNE SOUS LA VIGNETTE (décision chef de projet 2026-09-12) : le lien vers le studio à
   gauche, le cœur « J'aime » (brique noyau _jaime, composants/jaime.css) à droite. Elle
   prend toute la largeur de la case pour que le cœur se cale à droite ; son margin-top la
   tient à 1.25rem sous la vignette, hors du halo de survol. Quand la ligne est éteinte
   (`ligneAction`), elle n'existe pas : le cœur suit le lien (_ilotScenes.twig). */
.ilotSceneCase .ilotSceneLigne {
    align-self: stretch;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--gapDefaut);
    margin-top: 1.25rem;
}

.ilotSceneCase .ilotSceneLigne .toggleJaime {
    margin-left: auto;
}

/* LE LIEN VERS LE STUDIO (décision chef de projet 2026-10-07) : « Me connecter », « Créer un
   studio » ou « Utiliser dans mon studio » selon qui regarde. C'est un VRAI lien (`<a>`) :
   il mène à l'aiguillage « créer un événement », qui redirige. Il ne pose que sa taille et
   le padding vertical des liens (31_cta.css) ; la couleur d'Accent, le soulignement et le
   halo de focus viennent du `a` de la Vitrine, comme pour tout lien du site. */
.ilotSceneCase .ctaTuileStudio {
    padding: var(--gapReduit) 0;
    font: var(--fMenu14);
}

/*!*****************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/ilotScenarios.css ***!
  \*****************************************************************************************************************************/
/* ============================================
   ÎLOT DE SCÉNARIOS — L'ENVELOPPE SEULEMENT
   Include : vitrine/_/_ilotScenarios.twig
   Même patron que ilotScenes.css et ilotRubriques.css : une section, un H2, sa liste.
   L'écart avec ce qui précède appartient à la section, pas à son titre.

   ⚠️ LA CARTE N'EST PLUS ICI. Elle vit dans la brique noyau, studio/55_scenariosCompatibles.css
   (décision chef de projet 2026-09-07). Ce fichier portait sa propre copie du patron sous le
   namespace `carteScenario*` — même flex, même corps, mêmes polices, même colonne d'actions,
   même bascule : une correction faite d'un côté ne partait pas de l'autre. Il ne reste ici
   que ce qui appartient vraiment à l'îlot : la section, son titre, son intro markdown.
   ============================================ */

.ilotScenarios {
    margin-top: 8rem;
}

.ilotScenarios > h2 {
    margin-top: 0;
    margin-bottom: 1.5rem;
}

/* Le markdown de `intro`, à la place du H2. Son titre est DANS le bloc, donc la règle
   `.ilotScenarios > h2` ci-dessus ne l'atteint pas : c'est ce bloc qui porte l'écart. */
.ilotScenariosIntro {
    margin-bottom: 1.5rem;
}

/* La MÊME largeur de lecture que partout (--largeurTexte, vitrine.css) : cette intro n'avait
   aucune borne, elle courait donc sur les 1200 de la page pendant que l'article au-dessus se
   lisait sur 710 (décision chef de projet 2026-09-07). */
.ilotScenariosIntro p,
.ilotScenariosIntro ul,
.ilotScenariosIntro ol {
    max-width: var(--largeurTexte);
}

/* Sans ça, la marge du titre du markdown s'ajoute à celle du bloc et creuse un trou. */
.ilotScenariosIntro > *:first-child {
    margin-top: 0;
}

.ilotScenariosIntro > *:last-child {
    margin-bottom: 0;
}

/*!************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/ilotScenariosBandeau.css ***!
  \************************************************************************************************************************************/
/* ============================================
   ÎLOT DE SCÉNARIOS DANS LE BANDEAU — vitrine/_/_ilotScenariosBandeau.twig
   (décision chef de projet 2026-09-18)

   Pages rubriques Tirage au sort, Tombola, Constitution d'équipes, et page d'une scène
   (les scénarios où la jouer). La section garde la classe
   `.ilotScenarios` (ilotScenarios.css) : son écart, son titre et son intro viennent de là,
   et le bandeau (pageRubrique.css) centre déjà son H2 à partir de 1600px.

   UN SCÉNARIO PAR LIGNE, SANS CADRE : posé sur le fond du bandeau, les pièces les unes sous
   les autres — nom et description (un seul lien vers la fiche), commandes, déroulé.
   Entre deux scénarios, un grand blanc et, au milieu, un petit trait : ils se lisent comme
   deux choses distinctes sans qu'il faille les enfermer dans une boîte.

   CENTRÉ DANS LE BANDEAU SEULEMENT, comme les titres d'îlots : à partir de 1600px, là où le
   bandeau existe. En dessous, pas de fond, tout reste aligné à gauche, comme le reste de la
   page.
   ============================================ */

/* `container-type: inline-size` : LA LARGEUR DE LA LISTE VIENT DE LA PAGE, JAMAIS DE SON
   CONTENU. Sans lui, la liste annonçait comme largeur minimale celle de son déroulé le plus
   long (cinq briques ≈ 860px, qui ne passent jamais à la ligne) et celle du trait (710px).
   La page de rubrique est une grille (`1fr`, articleVitrine.css), et une colonne de grille ne
   descend pas sous la largeur minimale de ce qu'elle contient : toute la page restait bloquée
   à cette mesure, sans pouvoir descendre jusqu'à 400px (chef de projet 2026-09-18).
   Contenue, la liste prend la largeur qu'on lui donne ; le trait se borne à 100%, et le
   déroulé trop long glisse dans sa propre largeur, comme prévu par sa brique.
   Même geste que la liste de l'ancienne carte (55_scenariosCompatibles.css). */
.scenariosBandeauListe {
    container-type: inline-size;
    display: flex;
    flex-direction: column;
}

/* PLUS D'AIR ENTRE L'INTRO ET LE PREMIER SCÉNARIO : l'écart de l'îlot (1.5rem,
   ilotScenarios.css) collait le premier scénario au texte de l'article. Ici la moitié de
   --gapBlocs, le même blanc que de part et d'autre du trait entre deux scénarios : le
   premier respire comme les suivants (chef de projet 2026-09-18). */
.ilotScenariosBandeau .ilotScenariosIntro,
.ilotScenariosBandeau > h2 {
    margin-bottom: calc(var(--gapBlocs) / 2);
}

.scenarioBandeau {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--gapMoyen);
}

/* LE BLANC ET LE TRAIT ENTRE DEUX SCÉNARIOS. Le blanc total est --gapBlocs (le blanc entre
   deux blocs empilés), coupé en deux par le trait : une moitié au-dessus, une en dessous.
   Le trait est un pseudo-élément du scénario qui suit, pas une balise : il n'existe
   qu'entre deux scénarios, jamais avant le premier ni après le dernier. C'est la première
   pièce de la colonne du scénario : il suit donc son alignement, à gauche ou au centre.
   Le trait de --border, le filet clair des cartes, à la largeur du texte (--largeurTexte) :
   essayé à 120px et au gris des bords du bandeau (--cNoir4), il faisait un petit tiret
   noir, trop foncé et trop court pour séparer quoi que ce soit (chef de projet 2026-09-18).
   Le fond du bandeau est blanc en son milieu : le filet clair s'y voit. */
.scenarioBandeau + .scenarioBandeau {
    margin-top: calc(var(--gapBlocs) / 2);
}

.scenarioBandeau + .scenarioBandeau::before {
    content: '';
    display: block;
    width: var(--largeurTexte);
    max-width: 100%;
    margin-bottom: calc(var(--gapBlocs) / 2);
    border-top: var(--border);
}

/* LE NOM ET LE TEXTE, UN SEUL LIEN VERS LA FICHE (décision chef de projet 2026-10-18). Au
   survol, le halo d'une vignette de scène (ilotScenes.css, « LE SURVOL ») : un `outline` et un
   fond de la même couleur, qui montent en .5s ; l'outline se dessine hors de la boîte, il ne
   pousse rien. La couleur est celle du halo d'une vignette sans fond propre (--cAccent2
   éclairci). Pas de soulignement : c'est le halo qui dit « ceci est un lien ».
   Le nom et le texte gardent leur écart d'avant, celui de l'article (--gapMoyen). */
.scenarioBandeauFiche {
    --couleurHalo: color-mix(in srgb, var(--cAccent2) 40%, var(--cBlanc));
    display: flex;
    flex-direction: column;
    gap: var(--gapMoyen);
    width: 100%;
    max-width: var(--largeurTexte);
    color: inherit;
    text-decoration: none;
    border-radius: var(--borderR1);
    outline: 0 solid transparent;
    background: transparent;
    transition: outline-width .5s ease-out, outline-color .5s ease-out, background-color .5s ease-out;
}

.scenarioBandeauFiche:hover,
.scenarioBandeauFiche:focus-visible {
    outline: 15px solid var(--couleurHalo);
    background: var(--couleurHalo);
}

/* Un H3 dans le HTML, mais la fonte du H2 (24px gras) : au corps d'un H3, le nom d'un
   scénario ne se voyait pas assez (chef de projet 2026-09-18). Avec le blanc et le trait,
   c'est lui qui marque le début d'un nouveau scénario. */
.scenarioBandeauNom {
    font: var(--fH2);
    color: var(--cNoir1);
    margin: 0;
}

/* La même largeur de lecture que partout (--largeurTexte, vitrine.css). */
.scenarioBandeauTexte {
    font: var(--fText16);
    color: var(--cNoir3);
    max-width: var(--largeurTexte);
    margin: 0;
}

/* LA LIGNE DE COMMANDES — le modèle de celle d'une page de scène (.pageSceneCommandes,
   pageScene.css) : les boutons à gauche, l'étiquette et son cœur à droite, --gapLarge
   entre les deux groupes. Elle prend la largeur du texte, pas celle du bandeau : les deux
   bouts restent à portée de l'œil. */
.scenarioBandeauCommandes {
    align-self: stretch;
    max-width: var(--largeurTexte);
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    gap: var(--gapLarge);
    margin-top: var(--gapDefaut);
}

.scenarioBandeauBoutons {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gapDefaut);
}

/* Le déroulé, tel quel : on ne règle que sa place. Sa largeur est celle de ses briques, bornée
   à celle de la ligne — au-delà, il glisse, comme partout. */
.scenarioBandeau > .derouleScenario {
    max-width: 100%;
    margin-top: var(--gapLarge);
}

@media (min-width: 1600px) {
    /* CENTRÉ, MAIS ALIGNÉ À GAUCHE : les pièces se posent au centre de la colonne, le nom est
       centré, le texte non — il tient souvent sur deux lignes, il se lit mieux fer à gauche
       (chef de projet 2026-09-18). Le paragraphe est donc un bloc de la largeur de lecture,
       centré dans le bandeau, dont le texte part de la gauche du bloc. */
    .pageRubriquePreview .scenarioBandeau {
        align-items: center;
    }

    .pageRubriquePreview .scenarioBandeauNom {
        text-align: center;
    }

    .pageRubriquePreview .scenarioBandeauTexte {
        width: 100%;
        text-align: left;
    }

    /* Le déroulé centré : la brique a 32px à droite pour son œil (_deroule.css) ; la même
       marge à gauche, ici seulement, pour que la ligne des tuiles soit au centre. Hors
       bandeau, pas de marge gauche : le déroulé se cale au bord comme le reste. */
    .pageRubriquePreview .scenarioBandeau > .derouleScenario {
        padding-left: 32px;
    }

    /* Au centre, `stretch` collerait la ligne à gauche (sa largeur est bornée) : elle prend
       toute la largeur permise, et c'est `align-self: center` qui la pose au milieu. */
    .pageRubriquePreview .scenarioBandeauCommandes {
        align-self: center;
        width: 100%;
    }

    /* L'intro, s'il y en a une : ses blocs centrés à la largeur de lecture, son titre centré
       (pageRubrique.css), ses paragraphes fer à gauche — même règle que la description d'un
       scénario. */
    .pageRubriquePreview .ilotScenariosBandeau .ilotScenariosIntro > * {
        margin-inline: auto;
    }

    .pageRubriquePreview .ilotScenariosBandeau .ilotScenariosIntro p,
    .pageRubriquePreview .ilotScenariosBandeau .ilotScenariosIntro ul,
    .pageRubriquePreview .ilotScenariosBandeau .ilotScenariosIntro ol {
        text-align: left;
    }
}

/*!*****************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/faq.css ***!
  \*****************************************************************************************************************/
/* ============================================
   FOIRE AUX QUESTIONS
   Include : noyau/_/_faq.twig (partagé : la Vitrine et « Mon abonnement » du studio)
   Même patron que ilotScenes.css / ilotScenarios.css : une section, un H2, sa liste.

   Pas de carte, pas de cadre autour du bloc. Une question FERMÉE porte le léger gris des
   boutons discrets (--cBlanc02, ctaDiscret.css) ; une question OUVERTE revient au fond de la
   page : on voit tout de suite ce qu'on vient d'ouvrir, sans le confondre avec les autres
   questions (décision chef de projet 2026-09-22 — les filets qui séparaient les questions
   sont partis avec). Pas le fond plein d'un .btn : essayé, beaucoup trop lourd.

   ⚠️ Aucun JavaScript ici : <details>/<summary> ouvrent et ferment nativement, l'attribut
   `name` referme la question précédente. Le CSS ne fait que l'habillage.
   ============================================ */

.faq {
    margin-top: 8rem;
    /* La largeur du bloc décide si l'image a sa place (voir .faqCorps) : la même FAQ vit
       pleine page sur une rubrique et dans une colonne étroite sur la page d'une scène. */
    container-type: inline-size;
}

/* LES QUESTIONS ET L'IMAGE — le même système que l'image d'un article (articleVitrine.css) :
   deux colonnes franches, l'image collée à droite dans une colonne qui se réduit avec la
   fenêtre, le même écart --gapColonnes. Colonne DEUX FOIS plus étroite que celle d'un
   article (225px au lieu de 450, 18.75% au lieu de 37.5%) : à 450, le personnage prenait
   trop de place à côté des questions (chef de projet 2026-09-22). */
.faqCorps {
    display: grid;
    grid-template-columns: 1fr min(225px, 18.75%);
    gap: 0 var(--gapColonnes);
    align-items: start;
}

.faqCorps > * {
    grid-column: 1;
}

/* L'image démarre à la hauteur du TITRE, pas des questions : elle occupe la colonne de
   droite sur toute la hauteur, titre compris (chef de projet 2026-09-22). Sans titre, elle
   démarre avec la première question. */
.faqCorps > .faqImage {
    grid-column: 2;
    grid-row: 1 / span 2;
}

.faqImage {
    width: 100%;
    height: auto;
    border-radius: var(--borderR1);
}

/* FAUTE DE PLACE, L'IMAGE PART — c'est la différence avec un article, où elle reste
   (décision chef de projet 2026-09-22). Sous 900px de bloc, la colonne des questions
   tomberait sous les 500px : les questions reprennent toute la largeur. */
@container (max-width: 899px) {
    .faqCorps {
        grid-template-columns: 1fr;
    }

    .faqCorps > .faqImage {
        display: none;
    }
}

.faqCorps > h2 {
    margin-top: 0;
    margin-bottom: 1.5rem;
}

/* CHAPÔ MARKDOWN — il prend la place du H2 quand `intro` est donné. Le titre vient alors du
   markdown lui-même : il est DANS ce bloc, la règle ci-dessus ne l'atteint pas. */
.faqIntro {
    margin-bottom: 1.5rem;
}

/* La MÊME largeur de lecture que partout (--largeurTexte, vitrine.css) : le chapô n'avait
   aucune borne, il courait donc sur toute la page (décision chef de projet 2026-09-07). */
.faqIntro p,
.faqIntro ul,
.faqIntro ol {
    max-width: var(--largeurTexte);
}

.faqIntro > *:first-child {
    margin-top: 0;
}

.faqIntro > *:last-child {
    margin-bottom: 0;
}

/* Les questions fermées sont des pavés de couleur : un peu d'air entre elles suffit à les
   séparer, sans filet. */
.faqListe {
    display: flex;
    flex-direction: column;
    gap: var(--gapMoyen);
}

.faqEntree {
    /* Autorise l'animation de hauteur vers `auto` — voir « LE DÉPLIAGE » plus bas. */
    interpolate-size: allow-keywords;
}

/* LA QUESTION. Fermée, elle a le fond gris et le coin arrondi d'un bouton discret, et le
   padding des boutons compacts (--paddingCta14) — le même quand elle est ouverte, pour que
   le texte ne bouge pas d'un pixel en changeant de fond. Le marqueur par défaut du navigateur est retiré (les deux syntaxes sont
   nécessaires : ::marker pour les moteurs récents, ::-webkit-details-marker pour Safari) et
   remplacé par un chevron dessiné en CSS, à droite. */
.faqQuestion {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--gapMoyen);
    padding: var(--paddingCta14);
    font: var(--fText16Strong);
    color: var(--cNoir1);
    background-color: var(--cBlanc02);
    border-radius: var(--borderR1);
    cursor: pointer;
    list-style: none;
    transition: background-color 0.25s ease, color 0.25s ease;
}

.faqQuestion::-webkit-details-marker {
    display: none;
}

/* Le H3 de la question ne se voit pas : il est là pour le plan du document et la navigation
   par titres, pas pour peser. C'est le <summary> qui porte la fonte et la couleur — le titre
   ne fait que les hériter, sans ses marges ni sa taille par défaut. */
.faqQuestion h3 {
    margin: 0;
    font: inherit;
    color: inherit;
}

.faqQuestion:hover {
    background-color: var(--cBlanc03);
}

/* Ouverte : le fond de la page — la question se lit comme le titre de sa réponse, et non
   plus comme un bouton. */
.faqEntree[open] .faqQuestion {
    background-color: transparent;
}

.faqEntree[open] .faqQuestion:hover {
    color: var(--cAccent3);
}

/* Le chevron : un carré dont deux côtés seulement portent un filet, tourné de 45°. Il pointe
   vers le bas quand la question est fermée, vers le haut quand elle est ouverte. */
.faqQuestion::after {
    content: '';
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    margin-right: 4px;
    /* La couleur du texte, qui suit le survol de la question ouverte. */
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: translateY(-2px) rotate(45deg);
    transition: transform 0.25s ease;
}

.faqEntree[open] .faqQuestion::after {
    transform: translateY(2px) rotate(-135deg);
}

/* LE DÉPLIAGE — 0,25 s à l'ouverture comme à la fermeture, la même durée que le chevron :
   la question descend, prend sa place, et la reprend à l'identique en remontant.

   ⚠️ Toujours aucun JavaScript. C'est le navigateur qui anime, par trois mécanismes récents :
     - `::details-content` désigne le contenu d'un <details>, qui n'avait pas de sélecteur ;
     - `interpolate-size: allow-keywords` autorise l'animation vers `auto`, c'est-à-dire vers
       la hauteur réelle de la réponse — sans lui, il n'y a rien à animer entre 0 et `auto` ;
     - `transition-behavior: allow-discrete` retarde le passage caché → visible, sinon le
       contenu disparaîtrait d'un coup à la fermeture, avant que la hauteur ait fini de courir.
   Un navigateur qui ignore l'un des trois ouvre et ferme d'un coup, comme avant : la question
   reste lisible et repliable, seule l'animation manque. */
.faqEntree::details-content {
    block-size: 0;
    overflow: hidden;
    transition: block-size 0.25s ease, content-visibility 0.25s ease;
    transition-behavior: allow-discrete;
}

.faqEntree[open]::details-content {
    block-size: auto;
}

/* LA RÉPONSE. Elle est écrite en Markdown : elle peut porter des paragraphes, des listes,
   des sous-titres à partir de ###, et un tableau.
   RETRAIT À GAUCHE (décision chef de projet 2026-09-07) : la réponse est décalée sous sa
   question, elle ne repart pas du même bord. C'est le retrait qui dit qu'elle dépend de la
   question au-dessus, et non qu'elle est un bloc de plus dans la page. 40px, le même retrait
   franc que les listes d'un article (articleVitrine.css) : deux endroits, un seul chiffre à
   l'œil.
   MÊME CHIFFRE EN BAS, 40px et non plus 20 (décision chef de projet 2026-09-07) : la réponse
   ouverte finissait trop près de la question suivante, et les deux se lisaient comme un seul
   bloc. L'écart entre les questions (.faqListe) s'ajoute encore par-dessus. */
.faqReponse {
    padding: 0 0 40px var(--retraitListe);
    font: var(--fText16);
    color: var(--cNoir3);
}

/* La MÊME largeur de lecture que le texte d'un article et l'intro d'un îlot
   (--largeurTexte, vitrine.css). C'est le TEXTE qui est borné, pas la liste : les filets
   qui séparent les questions gardent la largeur de la colonne, ils ferment le bloc.
   Le tableau et le bloc de code plus bas ne sont pas visés : ils défilent tout seuls et
   n'ont pas à se plier à une largeur de lecture (décision chef de projet 2026-09-07). */
.faqReponse p,
.faqReponse ul,
.faqReponse ol {
    max-width: var(--largeurTexte);
}

/* Les puces sont RENDUES : le reset du noyau (00_reset.css) les efface pour tout le site.
   Même règle et même retrait que les listes d'un article (articleVitrine.css). */
.faqReponse ul,
.faqEncadreReponse ul {
    margin-block: 0 1em;
    padding-left: var(--retraitListe);
    list-style-type: disc;
}

.faqReponse li,
.faqEncadreReponse li {
    margin-block: var(--gapReduit);
}

.faqReponse > *:first-child {
    margin-top: 0;
}

.faqReponse > *:last-child {
    margin-bottom: 0;
}

/* H4 et non H3 : la question qui coiffe cette réponse est déjà un H3 (_faq.twig). Le fichier
   de réponse, lui, écrit `###` — c'est le convertisseur qui recale, la réponse ne sait pas où
   elle est affichée (FaqRuntime::NIVEAU_TITRE_REPONSE). */
.faqReponse h4 {
    margin: 20px 0 8px;
    font: var(--fText16Strong);
    color: var(--cNoir1);
}

/* Un tableau dans une réponse : pleine largeur, filets horizontaux seulement — le même
   parti que le reste du bloc. Il défile tout seul quand il est trop large pour la colonne,
   plutôt que d'élargir la page. */
.faqReponse table {
    display: block;
    overflow-x: auto;
    width: 100%;
    border-collapse: collapse;
    margin: 12px 0;
}

.faqReponse th,
.faqReponse td {
    padding: var(--paddingCellule);
    border-bottom: var(--border);
    text-align: left;
    vertical-align: top;
}

.faqReponse th {
    font: var(--fText16Strong);
    color: var(--cNoir1);
}

/* Un bloc de code dans une réponse : une saisie à recopier telle quelle (la syntaxe des
   plages de numéros, par exemple). Aucune règle n'existe pour `pre` ailleurs sur le site —
   c'est ici la première, et elle ne vaut que dans une réponse. Il défile plutôt que de
   déborder, comme le tableau. */
.faqReponse pre {
    overflow-x: auto;
    margin: 12px 0;
    padding: var(--paddingCode);
    background: var(--cBlanc02);
    border-radius: var(--borderR1);
}

.faqReponse pre code,
.faqReponse code {
    font-family: var(--ffMono);
    font-size: 14px;
    color: var(--cNoir1);
}

/* ============================================
   UNE QUESTION MISE EN ÉVIDENCE — balise Markdown `faq:identifiant` (BaliseFaq, noyau)
   Un cadre au fil d'un article : la question en tête, la réponse dessous, toujours visible.
   Rien ne se replie — on met en évidence, on ne cache pas (décision du chef de projet,
   2026-09-05). Le HTML est celui du noyau, le même que dans un panneau d'aide du Studio
   (_faqEncadre.css) ; seul l'habillage est d'ici.
   La réponse porte les mêmes règles que .faqReponse : elle est écrite avec le même droit
   aux sous-titres, listes, tableaux et blocs de code.
   ============================================ */

.faqEncadre {
    margin: 32px 0;
    padding: var(--paddingCorps);
    border: var(--borderCarte);
    border-radius: var(--borderR1);
}

.faqEncadre .faqEncadreQuestion {
    margin: 0 0 12px;
    font: var(--fText16Strong);
    color: var(--cNoir1);
}

.faqEncadreReponse {
    font: var(--fText16);
    color: var(--cNoir3);
}

.faqEncadreReponse > *:first-child {
    margin-top: 0;
}

.faqEncadreReponse > *:last-child {
    margin-bottom: 0;
}

.faqEncadreReponse h3 {
    margin: 20px 0 8px;
    font: var(--fText16Strong);
    color: var(--cNoir1);
}

.faqEncadreReponse table {
    display: block;
    overflow-x: auto;
    width: 100%;
    border-collapse: collapse;
    margin: 12px 0;
}

.faqEncadreReponse th,
.faqEncadreReponse td {
    padding: var(--paddingCellule);
    border-bottom: var(--border);
    text-align: left;
    vertical-align: top;
}

.faqEncadreReponse th {
    font: var(--fText16Strong);
    color: var(--cNoir1);
}

.faqEncadreReponse pre {
    overflow-x: auto;
    margin: 12px 0;
    padding: var(--paddingCode);
    background: var(--cBlanc02);
    border-radius: var(--borderR1);
}

.faqEncadreReponse pre code,
.faqEncadreReponse code {
    font-family: var(--ffMono);
    font-size: 14px;
    color: var(--cNoir1);
}

/*!*********************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/blocs.css ***!
  \*********************************************************************************************************************/
/* ============================================
   BLOCS — carte « titre + texte + actions » (page aperçu)

   ⚠️ COPIE ASSUMÉE (SOUS-ENSEMBLE) — jumelle partielle de
   studioRegie/assets/noyau/css/studio/53_blocs.css.
   Ne reprend QUE la partie « carte » utilisée par la liste des scénarios
   (.bloc / .blocCorps / .blocTitre / .blocTexte / .blocActions + responsive).
   Le composant studio complet porte en plus des zones outil (stats, compteur,
   liste d'items, réordonnancement, formulaires) qui n'ont pas leur place dans
   le funnel — volontairement non reprises.

   Toute modification ici → demander au PO s'il faut la répercuter sur le jumeau
   studio. Les deux copies peuvent diverger selon les besoins de chaque côté.

   Structure HTML :
   <div class="bloc">
       <div class="blocCorps">
           <h4 class="blocTitre">...</h4>
           <p class="blocTexte">...</p>
       </div>
       <div class="blocActions">...</div>
   </div>
   ============================================ */

.bloc {
    display: flex;
    align-items: stretch;
    max-width: 600px;
    background: var(--cBlanc);
    border: var(--borderForm);
    border-radius: var(--borderR1);
    overflow: hidden;
    transition: box-shadow 0.2s;
}

.blocCorps {
    flex: 1;
    padding: var(--paddingCarte);
    display: flex;
    flex-direction: column;
    gap: var(--gapReduit);
}

.blocTitre {
    font: var(--fH3);
    color: var(--cNoir1);
    margin-top: 0;
}

.blocTexte {
    font: var(--fText16);
    color: var(--cNoir3);
    margin: 0;
}

.blocActions {
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    gap: var(--gapDefaut);
    padding: var(--paddingCarte);
    border-left: var(--border);
    min-width: 240px;
}

@media (max-width: 600px) {
    .bloc {
        flex-direction: column;
    }

    .blocActions {
        flex-direction: column;
        align-items: flex-end;
        border-left: none;
        border-top: var(--border);
        padding: var(--paddingCarteEtroit);
    }
}

/*!**************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/ctaDiscret.css ***!
  \**************************************************************************************************************************/
/* ============================================
   BOUTON DISCRET — .ctaDiscret (boutons des cartes de scénario, page aperçu)

   ⚠️ COPIE ASSUMÉE (SOUS-ENSEMBLE) — jumelle partielle de la définition
   .ctaDiscret de studioRegie/assets/noyau/css/studio/56_scenario/_modale.css.
   Reprend la base + le survol + les états désactivés. Les variantes contextuelles
   (.ctaDiscret.actif dans .modaleParticipants / .modaleScenes / …) sont propres
   aux modales du studio et volontairement non reprises.

   Toute modification ici → demander au PO s'il faut la répercuter sur le jumeau studio.
   Les deux copies peuvent diverger selon les besoins de chaque côté
   (vitrine = funnel public, cachable, SEO ; studio = outil connecté).
   ============================================ */

.ctaDiscret {
    display: inline-block;
    text-decoration: none;
    padding: var(--paddingCta14);
    text-align: center;
    border: var(--borderCta);
    border-radius: var(--borderR1);
    background: var(--cBlanc);
    font: var(--fMenu14);
    color: var(--cCtaTexte);
    cursor: pointer;
    user-select: none;
    transition: background 0.2s, color 0.2s, border-color 0.2s;
}

.ctaDiscret:hover {
    background: var(--cBlanc02);
}

.ctaDiscret:disabled {
    opacity: 0.4;
    cursor: auto;
}

/* Variante <a> désactivé (un lien ne connaît pas :disabled) */
.ctaDiscret.disabled {
    opacity: 0.4;
    pointer-events: none;
}

.ctaDiscret:disabled:hover {
    background: var(--cBlanc);
}

/*!***********************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/filtres.css ***!
  \***********************************************************************************************************************/
/* ============================================
   FILTRES — panneau de filtres de la liste des scénarios (page aperçu)

   ⚠️ COPIE ASSUMÉE — jumelle de studioRegie/assets/noyau/css/studio/55_filtres.css.
   Identique au départ. Toute modification ici → demander au PO s'il faut la répercuter
   sur le jumeau studio. Les deux copies peuvent diverger selon les besoins de chaque côté
   (vitrine = funnel public, cachable, SEO ; studio = outil connecté).

   .divFiltreZone     la rangée : panneau à gauche, contenu filtré à droite
   .divFiltre         le panneau vertical de filtres
   .titreFiltre       titre du panneau
   .divFiltreGroupe   groupe de puces (+ .plie : replié, seuls les actifs restent visibles)
   .titreGroupeFiltre titre d'un groupe, cliquable (chevron), replie/déplie (pliageFiltres.ts)
   .filtre            la puce cliquable (+ .actif : fond gris + coche ✓ à droite)
   ============================================ */

.divFiltreZone {
    display: flex;
    gap: var(--gapListe);
    align-items: flex-start;
}

.divFiltre {
    flex: 0 0 280px;
    display: flex;
    flex-direction: column;
    gap: var(--gapDefaut);
    padding: var(--paddingCorps);
    background: var(--cBlanc02);
    border: var(--border);
    border-radius: var(--borderR2);
}

.titreFiltre {
    font: var(--fH4);
    color: var(--cNoir1);
    padding-bottom: var(--gapDefaut);
    border-bottom: var(--border);
}

.divFiltreGroupe {
    display: flex;
    flex-direction: column;
    gap: var(--gapReduit);
}

/* Titre de groupe : cliquable, replie/déplie son groupe (TS pliageFiltres.ts pose .plie) */
.titreGroupeFiltre {
    position: relative;
    font: var(--fLabel);
    color: var(--cNoir3);
    margin-top: var(--gapDefaut);
    padding-right: var(--paddingCorps); /* place du chevron */
    cursor: pointer;
    user-select: none;
}

.titreGroupeFiltre:hover {
    color: var(--cNoir1);
}

/* Chevron dessiné en CSS (aucune icône chevron n'existe dans l'appli) : ▾ ouvert, ▸ plié */
.titreGroupeFiltre::after {
    content: '';
    position: absolute;
    right: 4px;
    top: 50%;
    width: 7px;
    height: 7px;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: translateY(-70%) rotate(45deg);
    transition: transform 0.2s;
}

.divFiltreGroupe.plie .titreGroupeFiltre::after {
    transform: translateY(-50%) rotate(-45deg);
}

/* Groupe plié : seuls les filtres actifs restent apparents */
.divFiltreGroupe.plie .filtre:not(.actif) {
    display: none;
}

/* La puce : du texte, pas un bouton — le contour et le fond bleu plein appartiennent aux cta */
.filtre {
    position: relative;
    padding: var(--paddingPastille);
    padding-right: 26px; /* place réservée à droite pour la coche : rien ne bouge à la sélection */
    background: transparent;
    border: none; /* neutralise l'habillage natif des puces <button> */
    border-radius: var(--borderR1);
    color: var(--cNoir2);
    font: var(--fMenu14);
    text-align: left;
    cursor: pointer;
    user-select: none;
    transition: background 0.15s, color 0.15s;
}

/* Actif = le fond du survol qui reste (--cBlanc03 : fond existant des boutons discrets) */
.filtre:hover,
.filtre.actif {
    background: var(--cBlanc03);
    color: var(--cNoir1);
}

.filtre.actif::after {
    content: '✓';
    position: absolute;
    right: 8px;
    top: 50%;
    transform: translateY(-50%);
    color: var(--cNoir1);
}

/*!**********************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/scenariosCatalogue.css ***!
  \**********************************************************************************************************************************/
/* ============================================
   LISTE DES SCÉNARIOS D'UNE CATÉGORIE (page aperçu) — catalogue + filtres

   ⚠️ COPIE ASSUMÉE — jumelle de studioRegie/assets/noyau/css/studio/55_scenariosCatalogue.css.
   Identique au départ. Toute modification ici → demander au PO s'il faut la répercuter
   sur le jumeau studio. Les deux copies peuvent diverger selon les besoins de chaque côté
   (vitrine = funnel public, cachable, SEO ; studio = outil connecté).

   Namespace « creerScenario » exclusif à cette page.
   ============================================ */

/* Le design du panneau de filtres vient du composant commun (filtres.css). */
#creerScenario {
    margin-top: 30px;
}

/* La liste des scénarios est longue : le panneau suit le défilement. */
#divFiltreScenario {
    position: sticky;
    top: 20px;
}

/* Liste des scénarios */
#creerScenarioListe {
    flex: 1;
    min-width: 0;
    max-width: 800px;
    display: flex;
    flex-direction: column;
    gap: var(--gapListe);
}

/* La carte EST un bloc (composant blocs.css) : la classe ne sert plus qu'au filtrage TS
   et aux réglages propres à la page. */
.creerScenarioCarte {
    max-width: none; /* la liste (800px) commande, pas le clamp 600px du bloc */
}

/* Icône du scénario : toujours à DROITE, et SANS fond (décision PO 2026-07-31) —
   contrairement à .recapTitreIcone, dont le fond code une famille de scènes.
   Le SVG est inliné (iconeScenario), pas en <img> : scenarios/{dossier}/icone.svg est
   hors public/. 64px de dessin, la grande des deux tailles d'icône de scène du projet
   (Studio, assets/noyau/css/studio/54_icones.css), sans air — comme le Studio.
   Servie ici pour les deux pages du parcours aperçu (catalogue + composition). */
.scenarioIcone {
    flex: 0 0 auto;
    align-self: flex-start;
    margin-left: auto;
    width: 64px;
    height: 64px;
    box-sizing: border-box;
}

.scenarioIcone svg {
    display: block;
    width: 100%;
    height: 100%;
}

/* Dans une carte du catalogue, l'icône se cale sur le padding du corps du bloc. */
.creerScenarioCarte .scenarioIcone {
    margin: 16px 20px 16px auto;
}

.creerScenarioVide {
    font: var(--fText16);
    color: var(--cNoir3);
}

/* Masquage par le filtre */
.creerScenarioMasque {
    display: none !important;
}

/*!**************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/salle/ecran/css/_toggleScene.css ***!
  \**************************************************************************************************************************************/
/* ============================================
   Toggle animation (choix exclusif)
   ============================================ */

.toggleSceneGroupe {
    display: flex;
    position: relative;
    /* Les plans internes du toggle (indicateur 0, boutons 1) restent confinés au groupe :
       sans cela, les boutons montaient dans l'échelle de la barre de pilotage et passaient
       au-dessus de son voile (#barrePilotage::before, z 1 — _barreFin.css). */
    isolation: isolate;
    background: var(--cBlanc03);
    border-radius: var(--borderR1);
}

/* Hors flux : le titre ne réserve aucune hauteur, il ne doit pas gêner la lecture de la barre */
.toggleSceneTitre {
    position: absolute;
    top: 2px;
    left: 3px;
    transform: translateY(-100%);
    font: var(--fMini11);
    color: var(--cNoir4);
    white-space: nowrap;
    pointer-events: none;
}

.toggleSceneIndicateur {
    position: absolute;
    top: 0;
    bottom: 0;
    background: var(--cBlanc1);
    transition: left 0.35s cubic-bezier(0.4, 0, 0.2, 1),
                width 0.35s cubic-bezier(0.4, 0, 0.2, 1),
                border-radius 0.35s cubic-bezier(0.4, 0, 0.2, 1);
    z-index: 0;
    border: 1px solid  var(--cNoir1);
    pointer-events: none;
}

.toggleSceneBtn {
    position: relative;
    z-index: 1;
    padding: var(--paddingCta14); /* même hauteur que les cta de la barre d'actions */
    border: none;
    font: var(--fMenu14);
    cursor: pointer;
    background: transparent;
    color: var(--cNoir3);
    border-radius: var(--borderR1);
}

.toggleSceneBtn:hover:not(.selectionne):not(:disabled) {
    color: var(--cNoir1);
}

.toggleSceneBtn.selectionne {
    color: var(--cNoir1);
    cursor: default;
}

.toggleSceneBtn:disabled {
    opacity: 0.4;
    cursor: auto;
}

/* Groupe qui n'offre plus de choix (au plus un bouton actif, ou figé par verrouillerChoix) */
.toggleSceneGroupe.sansChoix .toggleSceneBtn,
.toggleSceneGroupe.sansChoix .toggleSceneIndicateur {
    opacity: 0.4;
}

.toggleSceneGroupe.sansChoix .toggleSceneBtn {
    cursor: auto;
    pointer-events: none;
}

/*!****************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/studio/55_scenarioModifier.css ***!
  \****************************************************************************************************************************************/
/* ============================================
   COMPOSITION D'UN SCÉNARIO — Composition par famille

   Namespace « modifierScenario » exclusif aux deux pages jumelles de la brique
   _compositionScenario : « Modifier ce scénario » (Studio) et « Configurer »
   (Vitrine) — décision PO 2026-08-14. Le stepper et les détails
   Entrées/Sorties réutilisent les classes du récapitulatif (56_scenario/_recapitulatif.css) ;
   ici uniquement le carrousel de remplaçantes, les fiches et la barre d'actions.
   ============================================ */

/* Le toggle à choix exclusif de la barre de pilotage de l'écran (.toggleSceneGroupe),
   réemployé tel quel dans la barre d'actions — un seul exemplaire du composant, importé
   ici plutôt que dans chacune des trois entrées qui servent cette page. */

#modifierScenario {
    margin-top: 30px;
}

/* Les blocs de la page sont des .bloc (composant commun 53_blocs.css, décision
   PO 2026-07-18) ; ici uniquement les réglages propres à la page. */
#modifierScenario .bloc {
    /* inutilisé 2026-08-11 — ancrait l'icône absolue .recapTitreIcone des blocs sans
       remplaçante, remplacée par la tuile façon carrousel (décision PO).
    position: relative; */
    max-width: none; /* les tuiles du carrousel dépassent le clamp 600px du bloc */
}

/* Classe et non id : un carrousel par bloc, répété dans la page. */
.divActionChangerScene {
    display: flex;
    align-items: center;
    margin-bottom: 10px;
    gap: var(--gapReduit); /* le padding vient du blocCorps */
}

.actionChangerScene {
    flex: 0 0 auto;
    width: 36px;
    height: 74px; /* même hauteur que les tuiles */
    background: var(--cBlanc);
    border: var(--borderCta);
    border-radius: var(--borderR1);
    color: var(--cCtaTexte);
    font: var(--fMenu14);
    cursor: pointer;
    transition: border-color 0.2s, color 0.2s;
}

.actionChangerScene:hover:not(:disabled) {
    border-color: var(--cAccent3);
    color: var(--cAccent3);
}

.actionChangerScene:disabled {
    opacity: 0.35;
    cursor: default;
}

/* Posée par modifierScenario.ts quand toutes les tuiles tiennent sans scroll : les
   flèches ne servent alors à rien, et leur absence aligne la rangée sur le bord
   gauche, comme la tuile des blocs sans remplaçante (décision PO 2026-08-11). */
.divActionChangerSceneSansFleches .actionChangerScene {
    display: none;
}

.modifierScenarioIcones {
    display: flex;
    gap: var(--gapReduit);
    overflow-x: auto;
    /* 8,5 icônes visibles au maximum : la demi-icône coupée signale qu'il y a une suite */
    max-width: calc(74px * 8.5 + var(--gapReduit) * 8);
}

.modifierScenarioIcone {
    flex: 0 0 auto;
    width: 74px;
    height: 74px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--cBlanc);
    border: var(--borderCarte);
    border-radius: var(--borderR1);
    cursor: pointer;
    transition: border-color 0.2s, background 0.2s, opacity 0.2s, filter 0.2s;
}

/* Survol d'une tuile non retenue : ton clair de la famille (~50 % du fond), aperçu de
   l'activation. Défaut = animation, .recapBlocAffichage sur le bloc bascule en affichage. */
.modifierScenarioIcone:not(.actif):hover {
    background: var(--cAccent0);
}

.recapBlocAffichage .modifierScenarioIcone:not(.actif):hover {
    background: var(--cAccent0);
}

/* Tuile retenue : fond plein de la famille + bordure CTA nette et halo. */
.modifierScenarioIcone.actif {
    background: var(--cAccent1);
    border-color: var(--cNoir1);
    box-shadow: 0 0 0 2px var(--cFormFocusHalo);
    border-width: 2px;
}

.recapBlocAffichage .modifierScenarioIcone.actif {
    background: var(--cAccent1);
}

/* Carte « changement de fond » (brique _compositionScenario) : carte blanche comme les
   autres — la couleur de famille est sur la tuile, le fond lavande plein reste l'affaire
   des bandeaux du récap (56_scenario/_recapitulatif.css). L'id l'emporte sur l'ordre
   d'import, identique ou non entre studio et vitrine. */
#modifierScenario .bloc.recapBlocConfigurations {
    background: var(--cBlanc);
}

.recapBlocConfigurations .modifierScenarioIcone.actif {
    background: var(--cAccent1);
}

/* 64px de dessin, la grande des deux tailles du projet (54_icones.css) ; la tuile de 74
   met l'air autour. */
.modifierScenarioIcone img,
.modifierScenarioIcone svg {
    width: 64px;
    height: 64px;
}

/* Tuile de la scène unique (bloc sans remplaçante) : même silhouette « actif » que le
   carrousel, mais rien à cliquer — un span, curseur normal. */
.modifierScenarioIconeSeule {
    cursor: default;
}

/* Carte SUIVEUSE (brique _compositionScenario, décision chef de projet 2026-09-13) : elle
   propose la même liste de scènes qu'une carte plus haut, la cheffe, et c'est là-haut qu'on
   choisit. Plus de menu ici : flèches et tuiles non retenues disparaissent, seule la tuile
   active reste — la même silhouette que la tuile d'une carte sans remplaçante. Les tuiles
   sont désactivées dans le Twig ; c'est le TS qui déplace `actif` quand la cheffe change. */
.modifierScenarioBlocSuiveur .actionChangerScene,
.modifierScenarioBlocSuiveur .modifierScenarioIcone:not(.actif) {
    display: none;
}

.modifierScenarioBlocSuiveur .modifierScenarioIcone {
    cursor: default;
}

/* Cue retirée (tuile croix sélectionnée, classe posée par modifierScenario.ts) : le bloc
   « s'éteint » et se REPLIE sur sa rangée de tuiles — scènes et flèches en grisé estompé,
   SEULE la croix reste pleine, colonne récap fermée. La croix n'a pas de fiche (décision
   PO 2026-08-14 : pas de texte, le bloc replié parle de lui-même — et quatre cues
   retirées ne mangent plus l'écran). Tout reste cliquable, un clic ramène la cue. La
   hauteur du repli est animée par le TS (mettreAJourEtatRetire) : le CSS ne sait pas
   animer vers auto. */
.modifierScenarioBlocRetire .modifierScenarioIcone:not(.modifierScenarioIconeFacultative),
.modifierScenarioBlocRetire .actionChangerScene {
    opacity: 0.35;
    filter: grayscale(1);
}

.modifierScenarioBlocRetire .recapComposition {
    display: none;
}

/* L'extinction des tuiles et flèches se fait en douceur — les tuiles portent déjà
   opacity/filter dans leur propre transition. */
.actionChangerScene {
    transition: opacity 0.2s, filter 0.2s;
}

.modifierScenarioFiche {
    display: none;
}

.modifierScenarioFiche.actif {
    display: block;
}

/* Barre d'action de la fiche : sépare le bouton du descriptif (un bouton nu
   collé au texte, décision PO 2026-07-18). */
.divActionFiche {
    margin-top: var(--gapDefaut);
}

/* Dans la FICHE du carrousel, la barre est une ligne : « Jouer la scène » à gauche, le cœur
   « J'aime » à droite (brique noyau _jaime, décision chef de projet 2026-09-12). Seulement
   là — la galerie d'illustrations (.recapCompositionIllustration) range la sienne autrement. */
.modifierScenarioFiche .divActionFiche {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--gapDefaut);
}

/* inutilisé 2026-08-11 — réservait la colonne de droite à l'icône absolue .recapTitreIcone
   des blocs sans remplaçante, remplacée par la tuile façon carrousel (décision PO).
#modifierScenario .bloc:not(.modifierScenarioBloc) .blocTexte {
    padding-right: 78px;
}
*/

/* ── Colonne récap de composition (Entrées/Sorties, décision PO 2026-08-11) ──
   Largeur FIXE identique sur tous les blocs : l'alignement vertical des colonnes prime.
   Zone bien séparée : un trait fin + de l'air, pas d'encadré — la hiérarchie vient des
   tags du récap (56_scenario). Contenu rendu par le client (recapComposition.ts). */
#modifierScenario .blocCorps {
    flex-direction: row;
    gap: 18px; /* = les marges latérales du blocCorps : même air partout autour de l'illustration */
}

/* Reprend la pile verticale que .blocCorps assurait avant son passage en rangée. */
.modifierScenarioPrincipal {
    flex: 1;
    min-width: 0; /* autorise la rangée de tuiles à rétrécir (overflow → flèches) */
    display: flex;
    flex-direction: column;
    gap: var(--gapReduit);
}

/* Contenu : des .recapCompositionSection (un h4 + sa liste) espacées par le gap — les
   styles h4/ul/li viennent du récap (56_scenario/_recapitulatif.css, sélecteurs élargis). */
/* 292px = 273 d'illustration + les 18 du padding + le trait : c'est l'illustration qui commande
   la largeur de la colonne (décision PO 2026-08-14), et les deux affichages la partagent pour que
   rien ne bouge quand on bascule de l'un à l'autre. */
.recapComposition,
.recapCompositionIllustration {
    flex: 0 0 292px;
    border-left: var(--borderCarte);
    padding-left: var(--retraitListeCourt); /* = le padding droit du blocCorps : trait centré entre les deux zones */
}

/* La hauteur des entrées/sorties est RÉSERVÉE : basculer d'un affichage à l'autre ne doit
   déplacer aucune carte (décision PO 2026-08-14). Sans ça, la colonne dicte la hauteur du
   bloc et tout ce qui suit remonte au changement d'affichage — on clique ici, ça bouge
   ailleurs. C'est la hauteur d'une illustration, pour que les deux se correspondent.
   Les cartes de changement de fond en sont exclues : plus courtes par nature.
   L'emplacement d'illustration, lui, ne réserve RIEN : vide, il ne prend aucune hauteur
   (décision PO 2026-08-14) — une cue retirée ou une scène sans illustration garderait
   sinon une carte gonflée par un rectangle qui ne montre rien. */
.recapBlocScene .recapComposition {
    min-height: calc(273px * 9 / 16);
}

.recapComposition {
    display: flex;
    flex-direction: column;
    gap: var(--gapReduit);
}

/* Le ratio est imposé, jamais subi : une capture recadrée au pixel près n'est pas toujours
   exactement 16:9, et une hauteur qui varie d'une carte à l'autre casserait l'alignement de
   la colonne. Le fichier fait 1000px de large pour 273 affichés : la taille est celle de la
   vitrine, qui les montre bien plus grandes ; ici le navigateur réduit, proprement. */
.recapCompositionIllustration img {
    display: block;
    width: 100%;
    aspect-ratio: 16 / 9;
    object-fit: cover;
    border-radius: var(--borderR1);
}

/* Barre de la galerie, SOUS l'image : flèche · points · flèche, étalée sur toute la largeur
   (décision PO 2026-08-14). Rien par-dessus l'image, elle est déjà petite. Les flèches sont
   des .ctaDiscret dans la même .divActionFiche que le bouton « Jouer la scène » de la fiche
   voisine — même niveau, même écart. Toute la barre n'apparaît qu'à partir de deux
   illustrations : avec une seule, il n'y a rien à parcourir ni à compter. */
.recapCompositionIllustration .divActionFiche {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--gapDefaut);
}

.recapIllustrationPoints {
    display: flex;
    gap: var(--gapReduit);
}

/* Un point par illustration : dit combien il y en a et où l'on en est. Cliquable — c'est
   l'attente devant une pastille de galerie, et ça évite d'enchaîner les clics de flèche.

   Le BOUTON est la zone de clic (24×24, invisible), le rond n'est que son dessin : viser
   un disque de 10px à la souris est pénible, et deux zones qui se touchent font cliquer à
   côté. D'où la surface généreuse ET le gap entre elles (décision PO 2026-08-14). */
.recapIllustrationPoint {
    width: 24px;
    height: 24px;
    padding: 0;
    border: none;
    background: none;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
}

.recapIllustrationPoint::before {
    content: '';
    width: 10px;
    height: 10px;
    border: 2px solid var(--cNoir4); /* 2px et non la bordure de bouton : un rond de 10px doit se voir */
    border-radius: 50%;
    background: var(--cBlanc);
    transition: background 0.2s, border-color 0.2s;
}

/* Le point plein est NOIR, pas à la couleur d'accent (chef de projet 2026-09-18) : un repère
   de position, pas un bouton d'action — vaut pour la galerie d'illustrations et pour la barre
   de choix du déroulé d'un scénario (_deroule.css), qui reprend ces points. */
.recapIllustrationPointActif::before {
    background: var(--cNoir1);
    border-color: var(--cNoir1);
}

/* L'illustration d'abord, les entrées et sorties sur demande (décision PO 2026-08-14) : une
   illustration permet de se projeter, une liste de sorties est une lecture d'expert. Le choix
   n'est pas mémorisé — on revient à l'illustration à chaque arrivée. La classe vient du toggle
   de la barre d'actions (toggleAffichageCarte.ts) ; les cartes de changement de fond ne
   sont pas concernées, leur colonne vide reste et tient la géométrie. */
.recapBlocScene .recapComposition {
    display: none;
}

.modifierScenarioAfficheEntrees .recapCompositionIllustration {
    display: none;
}

.modifierScenarioAfficheEntrees .recapBlocScene .recapComposition {
    display: flex;
}

/* Le toggle occupe la droite de la barre, les deux boutons restent à gauche. */
.divActionModifierScenario .toggleSceneGroupe {
    margin-left: auto;
}

/* Écran étroit : on ne réduit pas, on retire (décision PO 2026-08-14). La colonne de
   droite passée sous le contenu s'étirait sur toute la largeur — une illustration 16:9 géante,
   et des entrées/sorties qui n'ont rien d'un contenu de première lecture. Ni l'un ni
   l'autre, donc, et pas de toggle non plus : il ne commanderait plus rien. Reste la
   carte : sa tuile, son titre, son texte. Même seuil que le numéro de place et le repère
   de défilement, qui disparaissent ici aussi — la page se simplifie d'un bloc.
   L'ID est nécessaire : sans lui, la règle qui MONTRE les entrées en mode « entrées »
   (.modifierScenarioAfficheEntrees .recapBlocScene .recapComposition) l'emporterait, et
   la colonne reviendrait à qui a basculé avant de réduire sa fenêtre. */
@media (max-width: 900px) {
    #modifierScenario .recapComposition,
    #modifierScenario .recapCompositionIllustration,
    .divActionModifierScenario .toggleSceneGroupe {
        display: none;
    }
}

/* ── Numéro de place, dans la marge en regard de chaque carte (décision PO 2026-08-14) ──
   Douze cartes se ressemblent en défilant : le numéro dit où l'on en est. Il vit dans la
   rangée, PAS dans la carte : .bloc coupe ce qui dépasse (overflow hidden), et la carte
   garde ainsi sa géométrie au pixel près. Même gouttière, même gris et même chasse que le
   repère de défilement : un seul langage de chiffres dans cette marge. */
.modifierScenarioRangee {
    position: relative;
}

.modifierScenarioNumero {
    display: none;
    position: absolute;
    left: -36px;
    top: 16px; /* = padding haut du blocCorps : le numéro s'aligne sur la rangée de tuiles */
    width: 32px;
    text-align: center;
    font: var(--fMenu14);
    color: var(--cNoir5);
}

@media (min-width: 900px) {
    .modifierScenarioNumero {
        display: block;
    }
}

/* ── Repère de défilement (marge gauche du scénario, décision PO 2026-08-14) ──
   Sa zone longe le stepper sur toute sa hauteur, dans le padding gauche de .contenu (40px) :
   le repère ne recouvre donc aucune carte, et se cale sur le scénario quelle que soit la
   largeur de la fenêtre. Le repère y est STICKY : il colle au bas de la fenêtre tant qu'il
   reste des cartes, puis s'arrête à la fin du scénario — au bas de la PAGE il se retrouverait
   à côté des CTA, où il n'a rien à faire. Sous 900px la page n'a plus de marge à lui donner
   (la colonne récap passe déjà sous le contenu) : masqué. */
#modifierScenario .recapStepper {
    position: relative;
}

#indicateurDefilementZone {
    display: none;
    position: absolute;
    top: 0;
    bottom: 0;
    left: -36px;
    width: 32px;
}

/* Place naturelle du repère : le BAS de la zone, d'où le sticky le remonte au bas de la
   fenêtre tant que le scénario continue. Posé en haut, il n'aurait rien à remonter : le
   sticky ne retient un élément que vers sa contrainte, il ne le pousse jamais plus loin. */
@media (min-width: 900px) {
    #indicateurDefilementZone {
        display: flex;
        flex-direction: column;
        justify-content: flex-end;
        align-items: center;
    }
}

#indicateurDefilement:not([hidden]) {
    display: flex;
    position: sticky;
    /* Au-dessus de la barre d'actions collante, jamais à hauteur des boutons (décision
       PO 2026-08-14). --hauteurBarreAction est mesurée par barreActionCollante.ts ; le
       repli à 0px vaut le temps de la première mesure. */
    bottom: calc(var(--hauteurBarreAction, 0px) + var(--gapLarge));
    flex-direction: column;
    align-items: center;
    gap: 0; /* l'espace vient du padding des boutons, qui est aussi leur cible de clic */
    /* Le gris des bordures de cartes : un repère de lecture ne pèse pas plus que le
       contenu qu'il sert (décision PO 2026-08-14). */
    color: var(--cNoir5);
    /* Fond de page opaque : les numéros de place défilent DERRIÈRE le repère, ils ne
       viennent pas se superposer à lui. */
    background: var(--cBackground);
    padding: var(--gapReduit) 0;
}

/* Enfant direct = la souris ; les chevrons vivent dans les boutons. */
#indicateurDefilement > svg {
    display: block;
    width: 22px;
}

/* Bouton nu, mais cible LARGE : le chevron ne fait que 12×8, on ne vise pas ça à la
   souris. Le bouton prend toute la gouttière et s'ouvre en hauteur — c'est son padding qui
   fait aussi l'espace jusqu'à la souris (d'où le gap 0 du conteneur) : la cible grandit,
   le dessin ne bouge pas. La couleur CTA n'arrive qu'au survol, quand le repère devient
   une action. */
.indicateurDefilementAction {
    display: flex;
    align-self: stretch;
    justify-content: center;
    background: none;
    border: none;
    padding: var(--gapDefaut) 0;
    color: inherit;
    cursor: pointer;
    transition: color 0.2s;
}

.indicateurDefilementAction:hover:not(:disabled) {
    color: var(--cAccent3);
}

/* Bout de course : le chevron s'efface, sa place reste (décision PO 2026-08-14 — pas de
   flèche qui ne mène nulle part, mais pas de souris qui saute non plus). */
.indicateurDefilementAction:disabled {
    visibility: hidden;
}

.indicateurDefilementChevron {
    display: block;
    width: 12px;
}

/* Alignés à gauche, comme toute barre d'action (décision PO 2026-07-18 : pas
   d'alignement qui varie d'une barre à l'autre).

   Collée au bas de la fenêtre tant que sa vraie place est plus bas, posée dans le flux
   dès qu'on l'atteint (décision PO 2026-08-14) : la page est une page d'atterrissage,
   le visiteur qui arrive doit voir « Jouer le scénario » sans avoir rien défilé. En bas
   et pas en haut, parce que ces boutons agissent sur ce qui les précède — le lien porte
   le ?remplacer= construit à partir des tuiles choisies.

   Le sticky remonte l'élément vers sa contrainte, il ne le pousse jamais : ça marche ici
   parce que sa place naturelle est DÉJÀ le bas de #modifierScenario. Le padding remplace
   l'ancien margin-top pour que le fond couvre aussi l'air au-dessus des boutons. */
.divActionModifierScenario {
    display: flex;
    position: sticky;
    bottom: 0;
    align-items: center;
    gap: var(--gapDefaut);
    padding: var(--paddingCorps) 0;
}

/* Un CTA ne se comprime pas : sans ça, tout ce qu'on ajoute dans la barre écrase les
   deux boutons et casse leur libellé sur deux lignes. */
.divActionModifierScenario > * {
    flex-shrink: 0;
}

/* Fond et trait vont d'un bord à l'autre de la PAGE — la largeur de #bodyPage, pas celle
   de l'écran : le haut de page fait exactement ça, sans effort, parce qu'il est enfant
   direct de #bodyPage (décision PO 2026-08-14). La barre, elle, vit dans .contenu : le
   pseudo-élément rattrape donc son padding horizontal, et rien de plus. Ce débordement
   couvre au passage la gouttière de gauche, sinon les numéros de place des cartes qui
   passent dessous resteraient à découvert sous le trait. Fond opaque obligatoire : sans
   lui les cartes défilent en transparence sous les boutons.
   Les -40px/-20px sont le padding de .contenu (30_base.css) au signe près : les deux
   valeurs changent ensemble. */
.divActionModifierScenario::before {
    content: '';
    position: absolute;
    z-index: -1;
    top: 0;
    bottom: 0;
    left: -40px;
    right: -40px;
    background: var(--cBackground);
}

/* Épinglée : elle flotte au-dessus des cartes, un trait l'en détache. Posée en bas du
   scénario, elle est à sa place et ne tranche rien — la classe est posée par
   barreActionCollante.ts, aucun sélecteur CSS ne distingue les deux états. */
.divActionModifierScenarioCollee::before {
    border-top: var(--border);
}

/* Fondu au-dessus de la barre épinglée (décision PO 2026-08-14) : la coupure nette du
   contenu était brutale, et le contenu qui s'efface au lieu de s'arrêter dit qu'il en
   reste dessous. Disparaît en même temps que le trait, quand la barre se pose : là, il
   n'y a plus rien à estomper. Devant le contenu, donc pas de z-index négatif ici —
   l'ordre du DOM suffit ; pointer-events: none, il ne mange pas les clics des cartes. */
.divActionModifierScenarioCollee::after {
    content: '';
    position: absolute;
    bottom: 100%;
    left: -40px;
    right: -40px;
    height: 40px;
    background: linear-gradient(to top, var(--cBackground), transparent);
    pointer-events: none;
}

/* Miroir de la media query de .contenu (30_base.css) : son padding tombe à 20px, le
   débordement des deux pseudo-éléments avec lui — sinon la barre sort de la page. */
@media (max-width: 800px) {
    .divActionModifierScenario::before,
    .divActionModifierScenarioCollee::after {
        left: -20px;
        right: -20px;
    }
}

/* CÔTÉ STUDIO, « Créer votre événement » vit dans un <form> (il POSTe la composition
   `remplacer`). display:contents efface la boîte du form : le gap de la barre s'applique aux
   boutons eux-mêmes (même solution que le catalogue).
   Côté VITRINE, le même bouton est un <a> qui porte la composition dans son href (le parcours
   passe par la connexion, qui ne revient qu'en GET) : pas de form, donc rien à effacer — il
   est déjà enfant direct de la barre. */
.divActionModifierScenario form {
    display: contents;
}

/* « Créer cet événement » : seule action primaire de la page — silhouette .cta14 et rôle
   .ctaPrimaire (31_cta.css), en bleu administration (.accentAdministration, 10_font.css) :
   plus aucune couleur écrite ici (décision chef de projet 2026-09-06, avant : classe locale
   .ctaModifierScenarioCreer). « Aperçu » qui le suit est un .ctaDiscret neutre, le même que
   le catalogue (décision PO 2026-07-18). */

/*!***********************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/studio/56_scenario/_recapitulatif.css ***!
  \***********************************************************************************************************************************************/
/* ============================================
   RÉCAPITULATIF SCÉNARIO (stepper vertical)
   ============================================ */

/* Container du stepper */
.recapStepper {
    display: flex;
    flex-direction: column;
    gap: 0;
}
#scenarioPanneau .recapStepper > .recapActions + .recapBloc {
    margin-top: 32px;
}

/* Connecteur vertical entre les blocs */
.recapConnecteur {
    width: 3px;
    height: 24px;
    background: var(--cBlanc03);
    margin-left: 20px;
}

/* Bloc individuel du stepper */
.recapBloc {
    position: relative;
    border-radius: var(--borderR1);
    border: var(--borderCarte);
    min-height: 66px;
    overflow: hidden;
}

/* Titre du bloc (h3) */
.recapBloc h3 {
    display: flex;
    align-items: center;
    gap: var(--gapMoyen); /* aligné 10 -> 12px (échelle PO 2026-07-18) */
    padding: var(--paddingRecap);
    padding-bottom: 0;
    font: var(--fH4);
    margin: 0;
}

/* Étiquettes du récap : un SEUL style, qu'elles soient cliquables (<a>/<button> en mode
   Préparer / progression) ou statiques. Fond clair de catégorie, texte noir, bordure légère
   (choix PO 2026-07-20 : plus de pastille foncée à texte blanc — l'onglet Diffuser fait foi).
   .recapTagSortie = blanc, la couleur du « produit d'une scène » (conservée en entrée).
   .recapTagSortieSecondaire = sortie déclarée `secondaire` par le contrat d'une scène, en
   retrait — page d'une scène seulement (Vitrine) : un scénario n'affiche pas ses sorties
   inutilisées (décision chef de projet 2026-09-16). */
.recapTagGroupes,
.recapTagDistributions,
.recapTagSortie,
.recapTagSortieSecondaire,
.recapLienGroupes,
.recapLienDistributions {
    display: inline-block;
    margin: 2px 0;
    padding: var(--paddingEtiquette);
    border-radius: var(--borderR0);
    border: 1px solid currentColor;
    color: var(--cNoir3);
}

.recapTagSortieSecondaire {
    color: var(--cNoir4);
}

.recapTagGroupes,
.recapLienGroupes { background: var(--cAccent1); }

.recapTagDistributions,
.recapLienDistributions { background: var(--cAccent1); }

/* Titre d'animation/affichage cliquable (mode Préparer) : lien sobre, sans pastille colorée,
   pour ne pas perturber la lecture — même sobriété que le titre non cliquable de la progression. */
.recapLienScenes,
.recapLienAffichages {
    color: inherit;
}

/* Affordance « cliquable » : soulignement au survol (étiquettes d'entrée + titres) */
.recapLienGroupes:hover,
.recapLienDistributions:hover,
.recapLienScenes:hover,
.recapLienAffichages:hover {
    text-decoration: underline;
}

/* Sous-titre dans le bloc (h4) — élargi à la colonne récap de composition
   (55_scenarioModifier.css), qui reprend la grammaire du récap hors panneau. */
.recapBloc h4,
.recapComposition h4 {
    font: var(--fH4);
    margin: 0;
    color: var(--cNoir3);
}

/* Listes à puces dans le bloc */
.recapBloc ul,
.recapComposition ul {
    margin: 4px 0;
    padding-left: var(--retraitListeCourt);
}

/* Colonne récap de composition (largeur fixe étroite) : pas de puces — chaque ligne
   est déjà un tag — et un « Étiquette : Label » ne se plie JAMAIS sur deux lignes
   (décision PO 2026-08-11) ; au-delà de la colonne, ellipse. */
.recapComposition ul {
    list-style: none;
    padding-left: 0;
}

.recapComposition .recapTagGroupes,
.recapComposition .recapTagSortie,
.recapComposition .recapTagSortieSecondaire {
    white-space: nowrap;
    max-width: 100%;
    box-sizing: border-box;
    overflow: hidden;
    text-overflow: ellipsis;
}

.recapBloc li,
.recapComposition li {
    font: var(--fText16);
    color: var(--cNoir3);
}

/* Détails du bloc */
.recapBlocDetail {
    padding: var(--paddingRecap);
    padding-top: var(--gapReduit);
    font: var(--fText16);
    color: var(--cNoir3);
}

.recapBlocDetail p {
    margin: 2px 0;
}

.recapBlocDetail hr {
    border: none;
    border-top: var(--borderCarte);
    margin: 20px 0;
}

/* Icône de l'animation en rappel dans le coin haut-droit du bloc.
   Case 80 et 8px d'air : dessin 64, la grande des deux tailles du projet (54_icones.css).
   Hors flux (absolute) pour ne pas gonfler la hauteur du titre — calée sur le padding du h3. */
.recapTitreIcone {
    position: absolute;
    top: 0;
    right: 0;
    width: 80px;
    height: 80px;
    padding: var(--gapDefaut);
    border-radius: var(--borderR1);
}

/* Colonne de l'icône (chef de projet, 2026-09-22) : l'icône tient toute la hauteur du bloc, à
   droite, séparée du contenu par un filet ; le contenu s'arrête avant elle, rien ne passe
   dessous. Le dessin reste en haut de la colonne (object-fit). Ne vaut que pour le bloc du
   récapitulatif (.recapBloc) : la composition de scénario porte aussi .recapBlocScene. */
.recapBloc.recapBlocScene {
    min-height: 80px; /* la colonne ne descend jamais sous la case de l'icône */
    padding-right: 80px;
}

.recapBloc.recapBlocScene .recapTitreIcone {
    bottom: 0;
    height: auto;
    object-fit: contain;
    object-position: top;
    border-radius: 0;
    border-left: var(--borderCarte);
}

/* Variantes couleur par type */
.recapBlocGroupes /* .recapBlocDistributions (inutilisé 2026-06-13) */ {
    background: var(--cBlanc1);
}

.recapBlocScene .recapTitreIcone {
    background: var(--cAccent1);
}

.recapBlocScene.recapBlocAffichage .recapTitreIcone {
    background: var(--cAccent1);
}

.recapBlocConfigurations {
    background: var(--cAccent1);
}

/* inutilisé 2026-06-13
.recapBlocFinal {
    background: var(--cBlanc02);
}
*/

/* Lien "Modifier" sous le récap */
.recapActions {
    padding: var(--paddingRecap);
}

/* Même couleur qu'Annuler des formulaires (noyau 31_cta.css) : les actions neutres sont
   noires, les couleurs restent réservées aux actions marquées (Supprimer). */
.recapActions a {
    color: var(--cNoir3);
}

.recapActions a:hover {
    text-decoration: underline;
}

/* Image dans un bloc récap */
.recapImage {
    max-width: 100%;
    border-radius: var(--borderR1);
}

/* Pastilles couleurs dans le récap */
.recapCouleurs {
    display: flex;
    gap: var(--gapDefaut);
    margin-top: 6px;
}

.recapCouleurPastille {
    width: 28px;
    height: 28px;
    border-radius: 50%;
    border: var(--border);
}

/* Message vide */
.recapVide {
    font: var(--fItalic16);
    color: var(--cNoir3);
    padding: var(--paddingLigneListe);
}

/* Source list dans les détails */
/* inutilisé 2026-06-13
.recapSources {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
*/

/* Alerte insuffisance */
.recapAlerte {
    color: var(--cRouge3);
    font: var(--fAlerte16);
}

/* Brique récapitulatif dans la grille du scénario */
/* inutilisé 2026-06-13
.brique.briqueRecap {
    background: var(--cBlanc02);
    border-color: var(--cBlanc03);
}
*/

/* inutilisé 2026-06-15 - concept recap.js retiré
.recapAnimConfig:empty {
    display: none;
}
*/

.recapEncadre {
    margin: 10px 0;
    padding: var(--paddingRecap);
    border: var(--borderCarte);
    border-radius: var(--borderR1);
    background: #FFF8;
}

/* inutilisé 2026-06-15 - concept recap.js retiré
.recapAnimConfig h4 {
    font: var(--fH4);
    margin: 20px 0 4px;
}

.recapAnimConfig h4:first-child {
    margin-top: 0;
}

.recapAnimConfig p {
    font: var(--fText16);
    color: var(--cNoir3);
    margin: 2px 0;
}

.recapAnimConfig ul,
.recapAnimConfig ol {
    margin: 4px 0;
    padding-left: 20px;
}

.recapAnimConfig li {
    font: var(--fText16);
    color: var(--cNoir3);
}

.recapAnimConfig table {
    width: 100%;
    border-collapse: collapse;
    margin: 6px 0;
    font: var(--fText16);
    color: var(--cNoir3);
}

.recapAnimConfig th,
.recapAnimConfig td {
    padding: 4px 8px;
    text-align: left;
    border-bottom: var(--borderCarte);
}

.recapAnimConfig th {
    font-weight: 600;
}

.recapAnimConfig hr {
    border: none;
    border-top: var(--borderCarte);
    margin: 8px 0;
}
*/

/* Boutons participants cliquables dans la progression : même étiquette que les autres
   (contour compris, cf. bloc du haut), on n'ajuste que l'interactivité. */
button.recapTagGroupes {
    cursor: pointer;
    font: inherit;
}

button.recapTagGroupes:hover {
    text-decoration: underline;
}

/* ============================================
   PROGRESSION — États des blocs
   ============================================ */

/* Seules les cues à venir sont atténuées : celles déjà jouées restent pleines, elles ont été
   actives (chef de projet, 2026-09-22). */
#progression .recapBlocScene {
    transition: opacity 0.3s;
}

#progression .recapBlocScene.recapBlocFutur {
    opacity: .5;
}

/* Nombre d'éléments d'une pastille d'entrée ou de sortie (peintureProgression.ts), séparé du
   libellé par un filet de la couleur de la pastille. Absent tant que le nombre n'est pas connu. */
.recapCompte {
    margin-left: 6px;
    padding-left: 6px;
    border-left: 1px solid currentColor;
    font: var(--fText16Strong);
}

/* Section « Progression » de la cue active : une section du bloc comme Entrées et Sorties
   (.recapBlocDetail, même titre, même marge), servie cachée par le template. */
.progressionEtat[hidden] {
    display: none;
}

/* La barre et son compte au retrait des listes d'Entrées et de Sorties. */
.progressionEtatBlocs {
    margin: 4px 0;
    padding-left: var(--retraitListeCourt);
}

/* Cue à venir (après la cue active) : son titre et son icône seulement — ses entrées et ses
   sorties ne disent rien tant qu'elle n'a pas commencé (chef de projet, 2026-09-22). */
#progression .recapBlocFutur .progressionContenu {
    display: none;
}

/* Aération de secours quand le bloc n'a aucune section visible */
.progressionContenu:not(:has(> :not([hidden]))) {
    padding-bottom: var(--gapMoyen);
}

/* Blocs de progression émis par l'animation (obtenirProgression → rendu unique peintureProgression.ts) */
.progressionBlocTitre {
    font: var(--fH4);
    color: var(--cNoir3);
    margin: 6px 0 2px;
}

.progressionBlocTexte {
    font: var(--fText16);
    color: var(--cNoir3);
    margin: 2px 0;
}

.progressionBlocListe {
    margin: 4px 0;
    padding-left: var(--retraitListeCourt);
}

.progressionBlocListe li {
    font: var(--fText16);
    color: var(--cNoir3);
}

/* Barre sobre (chef de projet, 2026-09-22) : la cue active se voit déjà à l'opacité, la barre
   n'a pas à crier. Fine, bouts droits comme la police, noire sans couleur d'accent, la moitié
   du bloc ; le compte en petit gris à côté. */
.progressionBlocBarre {
    display: flex;
    align-items: center;
    gap: var(--gapMoyen);
    margin: 4px 0;
}

.progressionBlocBarrePiste {
    flex: 0 1 50%;
    height: 4px;
    background: var(--cBlanc03);
    overflow: hidden;
}

.progressionBlocBarreJauge {
    height: 100%;
    background: var(--cNoir);
    transition: width 0.3s;
}

.progressionBlocBarreLabel {
    font: var(--fLabel);
    color: var(--cNoir3);
}

/*!********************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/studio/56_scenario/_etiquettes.css ***!
  \********************************************************************************************************************************************/
/* ============================================
   ÉTIQUETTES - Marquage typographique
   ============================================

   Les étiquettes données par l'organisateur (animations, sorties, groupes)
   sont enveloppées dans .etiquetteMono par le filtre Twig `etiquetteHtml`.
   La chasse fixe les distingue des libellés du système (décision PO 2026-06-10).
*/

.etiquetteMono {
    font-family: var(--ffMono);
}

/* Marqueur d'une source provisoire, accolé à l'étiquette par le même filtre */
.etiquetteAConfigurer {
    font: var(--fLight14);
    color: var(--cRouge4);
}

.recapBlocDetail .etiquetteAConfigurer {
    color: unset;
}

/*!********************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/studio/55_scenariosCompatibles.css ***!
  \********************************************************************************************************************************************/
/* ============================================
   CARTES DES PAGES SCÈNE / SCÉNARIO — briques _scenariosCompatibles et _scenesDuScenario

   Deux namespaces, un patron : « scenarioCompatible » pour la brique posée sur la page d'une
   scène (les scénarios où la jouer — décision chef de projet 2026-09-06), « sceneDuScenario »
   pour sa symétrique posée sur la page d'un scénario (les scènes qu'il joue — 2026-09-15).
   Vitrine aujourd'hui, Studio le jour où il a ses pages. Chaque règle vise les deux : une
   correction faite pour l'une vaut pour l'autre. Une carte par ligne : ça se lit, ça ne se
   survole pas.
   Même patron que la carte de l'îlot de scénarios de la Vitrine (ilotScenarios.css),
   les NOMS non : là-bas c'est un îlot éditorial, ici une brique partagée qui doit
   s'afficher des deux côtés sans dépendre d'un CSS de page. Importé par l'entrée CSS
   de chaque site qui pose la brique.
   ============================================ */

/* La liste est le CONTENEUR de mesure : le passage des actions sous le texte dépend de la
   largeur de la CARTE, pas de celle de la fenêtre. Sur la page d'une scène, la carte vit dans
   la colonne de gauche d'une grille à deux colonnes (`1fr min(450px, 37.5%)`,
   articleVitrine.css) : à 1000px de fenêtre elle n'en fait que ~570, et un @media sur la
   fenêtre laissait le texte s'écraser bien avant de basculer. */
.scenariosCompatiblesListe,
.scenesDuScenarioListe {
    container: cartesCatalogue / inline-size;
    display: flex;
    flex-direction: column;
    gap: var(--gapListe);
}

/* Le texte prend ce qui reste ; les actions sont à taille fixe, à droite. `stretch`
   fait descendre le filet des actions sur toute la hauteur, quelle que soit la longueur
   de la description. */
.scenarioCompatible,
.sceneDuScenario {
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    background: var(--cBlanc);
    border: var(--borderForm);
    border-radius: var(--borderR1);
    overflow: hidden;
}

/* 450px de large au minimum pour le nom et la description (décision chef de projet
   2026-09-07) : en deçà le texte n'est plus lisible, la carte préfère passer ses actions
   dessous. `min()` borne ce minimum à la carte elle-même, pour qu'un écran étroit ne fasse
   jamais déborder le corps. */
.scenarioCompatibleCorps,
.sceneDuScenarioCorps {
    flex: 1;
    min-width: min(450px, 100%);
    padding: var(--paddingCarte);
    display: flex;
    flex-direction: column;
    gap: var(--gapReduit);
}

/* Le déroulé du scénario (brique noyau _derouleScenario) : toute la largeur de la carte,
   SOUS le corps et les actions, qui se rangent comme avant (le titre au-dessus, les cases en
   dessous — décision chef de projet 2026-09-18). Le dessin reste à affiner. */
.scenarioCompatible > .derouleScenario {
    flex: 0 0 100%;
    padding: var(--paddingCarte) 32px var(--paddingCarte) var(--paddingCarte);
    border-top: var(--border);
}

.scenarioCompatibleNom,
.sceneDuScenarioNom {
    font: var(--fH3);
    color: var(--cNoir1);
    margin: 0;
}

.scenarioCompatibleTexte,
.sceneDuScenarioTexte {
    font: var(--fText16);
    color: var(--cNoir3);
    margin: 0;
}

.divActionScenarioCompatible,
.divActionSceneDuScenario {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    gap: var(--gapDefaut);
    padding: var(--paddingCarte);
    border-left: var(--border);
    min-width: 240px;
}

/* 450 (le texte) + 240 (les actions) : sous 690px de CARTE les deux colonnes ne tiennent
   plus, les actions passent sous le texte — au moment exact où le flex les y renvoie.
   Alignées à GAUCHE (décision chef de projet 2026-09-07), sous le début du texte : la carte
   se lit d'un seul bord, du nom aux gestes. */
@container cartesCatalogue (max-width: 690px) {
    .divActionScenarioCompatible,
    .divActionSceneDuScenario {
        flex: 1 0 100%;
        flex-direction: row;
        justify-content: flex-start;
        border-left: none;
        border-top: var(--border);
        padding: var(--paddingCarteEtroit);
    }
}

/*!*****************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/noyau/css/studio/56_scenario/_deroule.css ***!
  \*****************************************************************************************************************************************/
/* ============================================
   DÉROULÉ D'UN SCÉNARIO — brique noyau _derouleScenario.twig

   Le dessin de la grille de l'onglet Scénario (brique 162×100, icône 64, nom en dessous,
   trait et flèche), dans un code à part : ici on découvre un scénario, on ne le règle pas
   (décision chef de projet 2026-09-18). Feuille AUTONOME : elle ne dépend pas de
   _grille.css, que la Vitrine ne charge pas sur ses pages — les mesures sont recopiées,
   les règles d'interaction (survol, glisser-déposer, formulaire actif) ne le sont pas.
   Chargée par 56_scenario.css (Studio) et vitrine.css (Vitrine).
   ============================================ */

/* Le déroulé : une marge de 32px à DROITE seulement, où vit la bascule icônes / visuels,
   hors de la ligne des tuiles (décision chef de projet 2026-09-18 : l'icône vient en plus,
   léger, à droite). À gauche, rien : le déroulé se cale au bord comme le reste de la page.
   Là où la page CENTRE le déroulé (le bandeau des pages rubriques à partir de 1600px), c'est
   à la feuille de cette page d'ajouter la même marge à gauche, pour que la ligne des tuiles
   reste centrée (ilotScenariosBandeau.css) : la brique ne sait pas si elle est centrée. */
.derouleScenario {
    position: relative;
    padding-right: 32px;
}

/* La bascule : un œil, discret, collé à droite de la DERNIÈRE tuile (dans son emplacement,
   hors du flux : il la suit où qu'elle passe à la ligne, et ne prend pas de place dans la
   rangée — la marge droite du déroulé lui garde les 32px quand la tuile est au bord), aligné
   sur le haut de la tuile, NOIR en toute circonstance — ni survol ni état enfoncé ne le
   colorent (décision chef de projet 2026-09-18) : ce sont les tuiles qui montrent le mode,
   pas l'icône. aria-pressed=true = visuels. */
.derouleBascule {
    position: absolute;
    top: 0;
    left: calc(100% + 6px);
    width: 28px;
    height: 28px;
    padding: 4px;
    border: none;
    background: none;
    color: var(--cNoir1);
    cursor: pointer;
}

.derouleBascule svg {
    width: 100%;
    height: 100%;
}

/* Le corps du déroulé : la ligne des tuiles et, par-dessus, le calque du trait.
   `position: relative` est ici et non seulement dans _grille.css : la Vitrine ne charge pas
   cette feuille, et sans lui le calque SVG s'absolutisait contre la carte. */
.derouleCorps {
    position: relative;
}

/* Le calque des traits (scenarioLignes.ts) : mêmes règles que .scenarioLignesSvg dans
   _grille.css, recopiées parce que la Vitrine ne charge pas _grille.css. Sans elles le SVG
   restait dans le flux, large de 300px par défaut, et coupait le trait (constat du chef de
   projet 2026-09-18). */
.derouleScenario .scenarioLignesSvg {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    pointer-events: none;
    overflow: visible;
    z-index: 0;
}

/* UNE LIGNE TANT QU'ELLE TIENT, PLUSIEURS SINON (décision chef de projet 2026-09-18 : on
   voulait éviter le retour à la ligne, mais sous 900px un scénario long se coupait, et un
   défilement horizontal aux barres invisibles n'est pas lisible). Le trait suit : le module
   scenarioLignes.ts dessine une ligne par rangée, avec les prolongements qui disent « ça
   continue », exactement comme la grille du Studio. L'écart entre rangées laisse la place
   du trait et de la barre de choix sous chaque tuile. */
.derouleScenarioLigne {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gapLarge) var(--gapMoyen);
}

/* L'emplacement, de haut en bas : la brique, le trait, la barre de choix (décision chef de
   projet 2026-09-18). Le trait est dessiné 10px sous la brique (scenarioLignes.ts) : l'air
   de 24px entre la brique et la barre lui laisse la place, la barre commence sous lui. */
.derouleEmplacement {
    position: relative; /* l'œil de la dernière tuile s'y accroche */
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    gap: 24px;
    width: 162px;
}

/* Brique : mêmes mesures que .brique (_grille.css), sans main ni ombre — rien ne se
   clique sur la brique elle-même ; le choix se fait dans la barre, dessous. Rien ne s'y
   SÉLECTIONNE non plus (ni l'étiquette, ni l'icône, ni le visuel — comme `.brique *` dans
   _grille.css) : une tuile qui se surligne au passage de la souris fait texte, elle n'en est
   pas un (décision chef de projet 2026-09-18). */
.derouleBrique,
.derouleBrique * {
    user-select: none;
    -webkit-user-select: none;
}

.derouleBrique img,
.derouleBrique svg {
    pointer-events: none;
    -webkit-user-drag: none;
}

.derouleBrique {
    flex: 0 0 auto;
    width: 162px;
    height: 100px;
    background: var(--cAccent1);
    border-radius: var(--borderR1);
    border: var(--borderCarte);
    position: relative;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    align-items: flex-start;
    color: inherit;
    overflow: hidden;
    box-sizing: border-box;
}

/* La face : l'icône ou le visuel, et l'étiquette — ce que le script remplace à chaque choix.
   Elle remplit TOUTE la tuile, pas seulement la hauteur de son contenu : c'est sur elle que
   le visuel prend ses 100 % de hauteur ; à 90px de contenu, l'image laissait une bande en
   bas de la tuile (constat du chef de projet 2026-09-18). */
.derouleBriqueFace {
    flex: 1 1 auto;
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    align-items: flex-start;
}

/* MODE VISUELS (.derouleVisuels, posé par derouleScenario.ts sur tous les déroulés de la
   page) : la tuile GARDE SA FORME, 162×100, et l'illustration la remplit (recadrée, elle est
   en 16/9) ; l'icône et l'étiquette disparaissent — tant pis pour le nom, la forme prime
   (décision chef de projet 2026-09-18 : pas des tuiles carrées à côté des rectangulaires).
   La croix et une scène sans illustration gardent leur dessin. */
.derouleBriqueVisuel {
    display: none;
}

.derouleVisuels .derouleBriqueVisuel {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.derouleVisuels .derouleBriqueIcone:not(.derouleBriqueIconeSeule),
.derouleVisuels .derouleBriqueIcone:not(.derouleBriqueIconeSeule) ~ .derouleBriqueTitre {
    display: none;
}

/* La barre de choix : flèche · points · flèche — le dessin de la galerie d'illustrations de
   la page « Configurer » (.divActionFiche sous l'image, 55_scenarioModifier.css), avec les
   mêmes .ctaDiscret et .recapIllustrationPoint. Les flèches sont ramenées à la hauteur des
   points : la barre est fine, elle ne fait pas bouton. Groupée au CENTRE, flèches contre les
   points, et non étalée sur la largeur : deux points seuls faisaient vide, et le groupe dit
   mieux « c'est le choix de cette case » ; à cinq points le groupe prend de lui-même presque
   toute la largeur (décision chef de projet 2026-09-18). */
.derouleBarre {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    height: 24px;
}

/* Points resserrés : la zone de clic reste 24px de haut, mais 16px de large, sans écart —
   au doigt on ne clique pas ici, c'est un site d'ordinateur. */
.derouleBarre .recapIllustrationPoints {
    gap: 0;
}

.derouleBarre .recapIllustrationPoint {
    width: 16px;
}

/* Au-delà de cinq positions : « 3/6 » à la place des points. */
.derouleCompteur {
    font: var(--fMenu14);
    color: var(--cNoir2);
    padding: 0 4px;
}

.derouleBarre .ctaDiscret {
    min-height: 0;
    height: 24px;
    padding: 0 8px;
    line-height: 22px;
}

.derouleBarre .ctaDiscret:disabled {
    color: var(--cNoir4);
    border-color: var(--cNoir5);
    cursor: default;
}

/* Icône de scène : la case 64 de tout le projet (54_icones.css), 6px d'air = dessin 52.
   La croix a la même case, dans les deux modes. SANS fond propre : l'icône prend la couleur
   de sa tuile, quelle qu'elle soit (décision chef de projet 2026-09-18, pour la mise en
   avant ci-dessous). */
.derouleBriqueIcone,
.derouleBriqueCroix {
    width: 64px;
    height: 64px;
    padding: 6px;
    object-fit: contain;
    border-radius: var(--borderR1);
    box-sizing: border-box;
}

/* MISE EN AVANT D'UNE SCÈNE (.derouleAvecMiseEnAvant, page d'une scène) : seule la tuile
   qui porte la scène de la page garde la couleur, les autres deviennent TRANSPARENTES — le
   fond de la page passe au travers, on voit d'un coup d'œil où la scène joue dans le
   scénario (décision chef de projet 2026-09-18). Pas de blanc : blanc à bord, c'est le
   dessin des boutons, et une tuile n'est pas cliquable. La classe suit le choix du
   visiteur (derouleScenario.ts). */
.derouleAvecMiseEnAvant .derouleBrique {
    background: transparent;
}

.derouleAvecMiseEnAvant .derouleBrique.derouleBriqueMiseEnAvant {
    background: var(--cAccent1);
}

.derouleBriqueTitre {
    font: var(--fMenu14);
    color: var(--cNoir1);
    padding: 8px 10px 0 10px;
    width: 100%;
    box-sizing: border-box;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Emplacement retiré (croix) : la brique reste à sa place, éteinte. */
.derouleBriqueRetiree {
    background: var(--cBlanc);
    border-style: dashed;
}

.derouleBriqueRetiree .derouleBriqueTitre {
    color: var(--cNoir3);
}

/*!*************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/pageScene.css ***!
  \*************************************************************************************************************************/
/* ============================================
   PAGE D'UNE SCÈNE — /scene/{dossier}
   Template : vitrine/public/vitrineScene.twig

   LA GRILLE EST SUR LA PAGE, PAS SUR L'ARTICLE (décision chef de projet 2026-09-07). C'est
   la clé de tout ce fichier. Quatre pièces, et quatre seulement, enfants directs de
   l'enveloppe :
     • `.pageScene`         — l'enveloppe : le padding de page (.contenu) ET la grille à deux
                              colonnes. Elle ne contient que les quatre pièces ci-dessous.
     • `<h1>`               — la première ligne, SUR TOUTE LA LARGEUR comme le titre d'un
                              article (décision chef de projet 2026-09-16).
     • `.pageSceneCommandes` — les deux boutons, l'étiquette de la scène et son cœur, juste
                              sous le titre (décision chef de projet 2026-09-17).
     • `.pageSceneVisuel`   — la colonne de droite : l'image cliquable et le cadre. Elle
                              commence à la LIGNE 3, celle de la colonne de lecture — c'est ce
                              qui la fait démarrer à hauteur de L'ARTICLE, et non du titre ou
                              de l'étiquette. Étirée sur toute la hauteur de la page, donc
                              collante du haut en bas.
     • `.pageSceneColonne`  — la colonne de gauche : l'article, les questions, les scénarios.
                              Ligne 3.

   ⚠️ LES LIGNES SE COMPTENT : h1 = 1, commandes = 2, article = 3, et le visuel s'aligne sur
   l'article. Toute pièce ajoutée entre le titre et l'article décale le visuel d'autant — sa
   `grid-row` est à corriger dans le même geste, sinon l'image remonte au-dessus du texte.

   POURQUOI PAS SUR L'ARTICLE. Deux défauts, l'un après l'autre :
     — la grille sur l'article, questions et scénarios DEDANS : il fallait les en extraire
       (`grid-column`) puis annuler leur écart d'îlot, sur trois fichiers qui se corrigeaient
       l'un l'autre, et aucun réglage de marge ne tenait ;
     — la grille sur l'article, questions et scénarios DEHORS : ils prenaient la page entière,
       et le visuel collant s'arrêtait avec l'article — un élément collant ne dépasse jamais
       son conteneur.
   Une seule grille, sur la page, règle les deux : les trois blocs de lecture sont dans la
   même colonne, donc à la même largeur, et le visuel a toute la page pour descendre.

   L'ARTICLE GARDE `articleVitrine`, mais pour sa TYPOGRAPHIE seule — marges, largeur de
   lecture, titres, puces d'un vrai texte rédigé. Sa grille à lui ne s'arme pas : il n'a plus
   d'image, et `.articleVitrine:not(:has(img))` (articleVitrine.css) le remet sur une colonne.

   ⚠️ Un sélecteur qui vise la grille écrit `.pageScene >` ; `.pageScene` en ancêtre (sans
   `>`) reste juste, il désigne la page entière.

   TOUT CE QU'ON CLIQUE EST À DROITE (décision chef de projet 2026-09-07) : le visuel ouvre
   l'aperçu, et le cadre sous le visuel porte l'icône, le nom de la scène et LES DEUX
   BOUTONS. La barre d'actions qui coupait la colonne de lecture entre la description et la
   présentation a disparu — la colonne de gauche ne contient plus que du texte, et se lit
   d'un trait.
   ============================================ */

/* ============================================
   QUATRE PALIERS, NOMMÉS UN PAR UN (décision chef de projet 2026-09-07)

   ⚠️ DEPUIS LE 2026-09-17, SOUS 1150 L'ICÔNE ET LES BOUTONS SONT MASQUÉS (bloc « NI ICÔNE
   NI BOUTONS », plus bas), et l'encadré disparaît avec eux. `palierIconeLigne` et
   `palierIconePleineLargeur` n'ont plus d'usage, et les largeurs
   de cadre citées ci-dessous (384px, 240px) ne valent plus que pour la maquette d'article.
   Le tableau et les calculs sont à reprendre quand l'écran étroit sera arrêté.

   Cette page a plus d'états qu'un article, et chacun tient à une mesure DIFFÉRENTE. On ne
   cherche donc pas une cascade unique : chaque palier répond à UNE question, il porte un
   nom qui dit laquelle, et ils se combinent.

       palierCadreScene         1150px   la colonne de droite d'un article loge-t-elle le cadre ?
       palierIconeLigne          800px   l'icône tient-elle dans le cadre POSÉ EN LIGNE, à côté du visuel ?
       palierVisuelCadre         650px   le visuel et le cadre tiennent-ils côte à côte ?
       palierIconePleineLargeur  460px   l'icône tient-elle dans le cadre EN PLEINE LARGEUR ?

   CE QUE ÇA DONNE À L'ÉCRAN, du plus large au plus étroit :

     ≥ 1150   maquette d'article : le texte à gauche, le visuel et son cadre collants à
              droite. Icône présente. Cadre 384px, colonne d'article 401px et plus.
     800→1149 une seule colonne. Le titre, puis SUR UNE MÊME LIGNE le visuel à gauche et le
              cadre à droite, puis le texte. Icône présente, cadre 384px.
     650→799  la même ligne, MAIS SANS L'ICÔNE, ET SANS LE CADRE : plus de filet ni de
              padding, le bloc tombe à 240px — la largeur nue de sa colonne. C'est ce qui
              laisse au visuel de quoi rester lisible jusqu'à 650.
     460→649  tout empilé, ET DANS L'AUTRE SENS : le bloc AU-DESSUS, le visuel EN DESSOUS.
              L'icône revient — en pleine largeur, la place est là de nouveau. Toujours sans
              filet ni padding.
     < 460    le même empilement, sans l'icône.

   ⚠️ LE « CADRE » N'EN EST UN QU'AU-DESSUS DE 800 (décision chef de projet 2026-09-07) : en
   dessous, il perd son filet et son padding et n'est plus qu'un groupe d'éléments. Le nom de
   classe reste `.sceneCarte` — c'est le même bloc, il n'a plus le même habillage. Les
   mesures ci-dessus en tiennent compte : sous 800, retirer le padding rend 40px.

   ⚠️ L'ICÔNE N'EST PAS MONOTONE : présente, absente, présente, absente. Ce n'est pas une
   incohérence, c'est la conséquence des deux formes du cadre. En ligne à côté du visuel, le
   cadre doit être maigre — l'icône coûte 104px (84 + le gap) que le visuel n'a plus. En
   pleine largeur, ces 104px ne coûtent rien à personne : l'icône revient. Puis la fenêtre
   devient si étroite que même là ils ne tiennent plus.

   ⚠️ SANS PRÉPROCESSEUR, un palier ne peut pas être une variable : le projet n'a ni PostCSS
   ni Sass, et `@media (min-width: var(--x))` est invalide — la règle est ignorée EN SILENCE.
   Le nom est donc porté par un jeton `@palier <nom>` en commentaire sur CHAQUE media query
   qui l'emploie. `grep -rn "@palier" assets/` les trouve toutes.

   ⚠️ AUCUN de ces quatre n'est une des constantes du projet (640, 768, 1024, 1280 —
   assets/vitrine/css/CLAUDE.md, qui dit encore « quatre paliers, pas un de plus »). Chacun
   est calculé, et le calcul est écrit à côté : ils bougent avec la largeur de la colonne
   (240px), celle de l'icône (84px) et les paddings. Si l'une de ces trois valeurs change,
   TOUS sont à refaire.
   ============================================ */

/* ============================================
   LA GRILLE DE PAGE
   Les deux colonnes d'un article, recopiées ici parce qu'elles portent la PAGE et non
   l'article : `articleVitrine` ne peut pas les fournir sans imposer du même coup ses règles
   de paragraphe à l'enveloppe. Les deux chiffres sont ceux d'articleVitrine.css, à dessein —
   la page doit se lire comme un article :
     min(450px, 37.5%)  la colonne de droite, proportionnelle et plafonnée ;
     gap 0 --gapColonnes aucun écart entre les lignes (le visuel s'étire sur 100 d'entre
                        elles), --gapColonnes (4rem) entre les colonnes.
   `align-items: start` : sans lui, un élément de grille est étiré sur toute la hauteur de sa
   rangée et `position: sticky` n'a plus de quoi jouer.
   Sous palierCadreScene, tout ceci est démonté — voir le palier suivant.
   ============================================ */
.pageScene {
    display: grid;
    grid-template-columns: 1fr min(450px, 37.5%);
    gap: 0 var(--gapColonnes);
    align-items: start;
}

/* LE TITRE COURT SUR TOUTE LA LARGEUR (décision chef de projet 2026-09-16) — exactement
   comme celui d'un article ou d'une page de rubrique : `.articleVitrine > h1` est en
   `grid-column: 1 / -1` (articleVitrine.css), et la page d'une scène doit se lire comme un
   article. Rien ne justifiait qu'un titre de scène soit le seul du site à s'arrêter au
   milieu.

   ET ÇA NE DÉPLACE RIEN. Le commentaire qui vivait ici affirmait que c'était le titre, en
   restant dans la colonne de gauche, qui faisait commencer le visuel AU NIVEAU DU TEXTE.
   C'était faux : ce qui le fait, c'est la `grid-row` posée sur le visuel lui-même, juste en
   dessous — une place explicite, que la largeur du titre n'atteint pas. C'est le motif
   d'articleVitrine.css, où le titre est pleine largeur ET l'image placée à la ligne du texte.

   LES MARGES. 3rem au-dessus, comme un titre d'article. En dessous, --gapDefaut : le titre
   n'est plus seul, l'étiquette de la scène le suit immédiatement et forme avec lui UN bloc
   de tête. C'est l'étiquette qui porte les 3rem jusqu'au texte — la distance totale du titre
   au premier paragraphe est donc inchangée. */
.pageScene > h1 {
    grid-column: 1 / -1;
    margin-block: var(--margeTitrePage) var(--gapDefaut);
}

/* LA LIGNE DE COMMANDES, SOUS LE TITRE (décision chef de projet 2026-09-17) : « Jouer la
   scène » et « Utiliser » d'un côté, l'étiquette et son cœur (brique noyau
   `.etiquetteJaime`) de l'autre, poussés chacun contre son bord.
   Ligne 2, colonne 1 : sur la largeur de la colonne de lecture, pas celle du titre.
   `flex-wrap` : si la ligne ne tient plus, l'étiquette passe dessous plutôt que de déborder.
   La marge basse est celle que le titre n'a plus : ensemble ils font 3rem jusqu'au texte.
   ⚠️ BOUTONS À GAUCHE OU À DROITE : à trancher (chef de projet). Pour essayer l'autre
   côté, `flex-direction: row-reverse` sur cette règle. */
.pageScene > .pageSceneCommandes {
    grid-column: 1;
    grid-row: 2;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    /* --gapLarge dans les deux sens (décision chef de projet 2026-09-17) : les boutons et
       l'étiquette sont deux choses distinctes, passés l'un sous l'autre ils restent séparés. */
    gap: var(--gapLarge);
    margin-bottom: 3rem;
}

/* Les deux boutons côte à côte, à leur largeur naturelle. --gapDefaut dans les deux sens
   (décision chef de projet 2026-09-17) : ils vont ensemble, côte à côte comme l'un sous
   l'autre. */
.pageSceneBoutons {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gapDefaut);
}

/* La colonne de lecture : l'article, les questions, les scénarios, tous à la même largeur.
   LIGNE 3, ÉCRITE ET NON DEVINÉE : c'est la ligne sur laquelle le visuel s'aligne. Le
   placement automatique la trouvait déjà (le titre occupe la 1, les commandes la 2), mais il
   la trouvait par accident — la poser noir sur blanc met les deux colonnes d'accord de
   façon visible, plutôt que de faire dépendre l'alignement de l'ordre des balises. */
.pageScene > .pageSceneColonne {
    grid-column: 1;
    grid-row: 3;
}

/* LE VISUEL, colonne de droite, À PARTIR DE LA LIGNE 3 — donc au niveau de L'ARTICLE, pas
   du titre ni de l'étiquette. C'est le motif de `.articleVitrine > p:has(img)` : l'image
   d'un article commence à hauteur de son texte, et celle d'une scène doit faire pareil.

   ⚠️ LIGNE 3, ET PAS 2 (correction chef de projet 2026-09-16). La règle disait 2 tant que la
   grille n'avait que trois pièces — le titre en 1, le texte en 2. L'étiquette est venue
   s'intercaler en ligne 2 le même jour : le visuel s'est donc retrouvé à SA hauteur, au-
   dessus du premier paragraphe. Une ligne de plus dans la colonne de gauche = une ligne de
   plus ici, sinon l'image décolle du texte.
   Le compte se lit dans l'en-tête du fichier : h1 = 1, commandes = 2, colonne de lecture = 3.

   Étiré sur 100 lignes : les lignes vides ont une hauteur nulle, et cette aire lui donne de
   quoi courir jusqu'au bas de la page. */
.pageScene > .pageSceneVisuel {
    grid-column: 2;
    grid-row: 3 / span 100;
}

/* L'image épouse sa colonne, elle n'impose pas sa taille : c'est la piste de grille qui
   plafonne à 450px et se réduit quand la fenêtre se resserre. Cette règle venait
   d'articleVitrine.css, qui ne voit plus ce visuel. */
.pageSceneVisuel img {
    width: 100%;
    height: auto;
    border-radius: var(--borderR1);
}

/* ============================================
   LES AUTRES APERÇUS (décision chef de projet 2026-09-07)
   Une scène a souvent deux aperçus, parfois quatre, et chacun montre autre chose. Leurs
   images se posent à la suite, sous le cadre, dans la colonne de droite. Elles MONTRENT
   seulement : aucune n'est cliquable (décision chef de projet 2026-09-07).

   CACHÉES PAR DÉFAUT, montrées seulement là où il y a une colonne de droite. C'est le sens
   de la règle : sans cette colonne elles ne seraient plus à côté de rien, et rallongeraient
   la page avant sa première ligne de texte. Le `display: none` de base + le rétablissement
   sous palierCadreScene, plutôt que l'inverse : ainsi tout nouveau palier les laisse cachées
   tant qu'on ne l'a pas décidé.
   Avec `loading="lazy"` (posé dans le Twig), cachées elles ne sont pas même téléchargées.
   ============================================ */
.pageSceneVisuelSuite {
    display: none;
}

/* ============================================
   `palierCadreScene` — 1150px
   AU-DESSUS, la colonne de droite d'un article loge le cadre de la scène ; EN DESSOUS, non.

   LE CALCUL. Le cadre mesure 384px : 20 de padding + 84 d'icône + 20 de gap + 240 de colonne
   + 20 de padding. La colonne de droite d'un article vaut `min(450px, 37.5%)` du conteneur
   (articleVitrine.css), et le conteneur vaut la fenêtre moins les 2×40px de .contenu,
   plafonnée à 1200. Il faut donc :
       (fenêtre − 80) × 37.5% ≥ 384   →   fenêtre ≥ 1104
   1150 laisse 46px de marge : à 1150 la colonne fait 401px pour un cadre de 384.
   Aucune constante du projet ne tombe entre 1104 et 1280 : à 1024 la colonne fait 354px et
   le cadre déborde de 30px — c'est le défaut qu'on voyait à l'écran ; à 1280 on perdait la
   maquette d'article sur 130px où elle tenait très bien.
   ============================================ */
/* @palier palierCadreScene */
@media (min-width: 1150px) {
    /* LE VISUEL SUIT LE DÉFILEMENT, DU HAUT EN BAS DE LA PAGE. Au repos il commence AU
       NIVEAU DU TEXTE et non du titre — c'est la ligne 2 de la grille de page, posée plus
       haut. Puis, quand on descend, il se cale en haut de la fenêtre et y reste : son aire
       est étirée sur 100 lignes, elle couvre donc tout ce que la colonne de gauche empile,
       les questions et les scénarios compris.
       C'est ce qui fait tenir les deux boutons : ils sont DANS ce bloc, ils restent donc
       sous les yeux du visiteur jusqu'en bas, sans barre collante à part.
       ⚠️ C'est précisément pour ça que la grille est sur la PAGE et non sur l'article : un
       élément collant ne dépasse jamais son conteneur, et le visuel s'arrêtait avec le texte
       de la scène (défaut relevé par le chef de projet 2026-09-07).
       20px du bord, comme le menu des chapitres et le panneau de filtres (pageChapitres.css,
       scenariosCatalogue.css) : trois blocs collants, un seul écart.

       TOUJOURS LISIBLE EN ENTIER (décision chef de projet 2026-09-16). `top` s'adapte à la
       hauteur de la colonne, mesurée par visuelCollant.ts (--hauteurVisuel) :
         • elle tient dans la fenêtre → 20px : calée en haut ;
         • elle dépasse → négatif : elle défile avec la page jusqu'à montrer son bas, puis se
           cale par le bas, à 20px. On ne défile pas à l'intérieur d'un élément collant :
           sans ça, tout ce qui dépasse serait inatteignable.
       Sans JavaScript, la variable manque et vaut 0 : `top` retombe à 20px, le comportement
       d'avant. */
    .pageScene > .pageSceneVisuel {
        position: sticky;
        top: min(20px, calc(100vh - var(--hauteurVisuel, 0px) - 20px));
    }

    /* Les autres aperçus apparaissent : c'est ici, et ici seulement, qu'il y a une colonne
       de droite pour les recevoir. `display: block` — la largeur et l'arrondi leur viennent
       déjà de `.pageSceneVisuel img`. */
    .pageSceneVisuelSuite {
        display: block;
        margin-top: var(--gapLarge);
    }

    /* Il n'y a plus de règle « ne colle plus dès qu'il y a d'autres aperçus » (2026-09-07) :
       elle DEVINAIT la hauteur de la colonne. La hauteur est maintenant mesurée, et une
       colonne trop haute colle par le bas (règle ci-dessus, visuelCollant.ts). */
}

/* ============================================
   < palierCadreScene — LA GRILLE DE PAGE EST DÉFAITE
   Une seule colonne. Le visuel reprend sa place dans le flux, juste après le titre — c'est
   son rang dans le document, et c'est pour cela que le Twig l'écrit là —, et il cesse d'être
   collant : il n'a plus de colonne de texte à côté de lui pour courir.
   ============================================ */
/* @palier palierCadreScene − 1 */
@media (max-width: 1149px) {
    .pageScene {
        grid-template-columns: 1fr;
    }

    .pageScene > .pageSceneVisuel {
        grid-column: 1;
        grid-row: auto;
        position: static;
        /* --gapColonnes sous le bloc visuel + branchement (décision chef de projet 2026-09-17) :
           c'est le blanc qui le séparait du texte quand il était à côté ; empilé, la relation
           ne change pas. Ce n'est PAS un blanc entre deux blocs (--gapBlocs). */
        margin-block: 0 var(--gapColonnes);
    }

    /* ⚠️ ET LA COLONNE DE LECTURE REPASSE EN AUTOMATIQUE AVEC LUI. Sur deux colonnes, elle
       est clouée à la ligne 3 pour que le visuel s'aligne sur elle. Ici il n'y a plus qu'une
       colonne : le visuel, redevenu automatique, tomberait lui aussi sur la ligne 3 — la
       première libre après le titre et l'étiquette — et les deux blocs se superposeraient,
       ce qu'une grille autorise sans rien dire. Remises toutes deux en automatique, les
       quatre pièces s'empilent dans l'ordre du document : titre, commandes, visuel, texte. */
    .pageScene > .pageSceneColonne {
        grid-row: auto;
    }
}

/* ============================================
   `palierVisuelCadre` — 650px
   AU-DESSUS (et sous palierCadreScene), le visuel et le cadre tiennent CÔTE À CÔTE, sous le
   titre. EN DESSOUS, plus rien ne tient sur une ligne.

   LE CALCUL. Sous 800px le bloc perd son icône (palierIconeLigne) ET son padding : il ne
   mesure plus que 240px, la largeur nue de sa colonne. Avec le gap de 20, pour que le visuel
   garde au moins 270px :
       (fenêtre − 80) − 260 ≥ 270   →   fenêtre ≥ 610
   650 est donc tenu avec 40px de marge : à 650, contenu 570, bloc 240, gap 20, visuel 310.
   (Le palier valait déjà 650 quand le padding était encore là — il rendait alors 270px de
   visuel tout juste. Retirer le padding ne l'a pas déplacé, il l'a rendu confortable.)

   Les deux sont dans le MÊME bloc : la ligne se fait donc dedans, sans rien déplacer dans le
   document.
   ============================================ */
/* @palier palierVisuelCadre → palierCadreScene − 1 */
@media (min-width: 650px) and (max-width: 1149px) {
    /* --gapColonnes entre le visuel et le bloc (décision chef de projet 2026-09-17) : deux
       zones côte à côte, le même blanc que le texte d'un article et son image. */
    .pageScene > .pageSceneVisuel {
        display: flex;
        align-items: flex-start;
        gap: var(--gapColonnes);
    }

    /* Le visuel prend ce que le cadre laisse. `min-width: 0` : sans lui, un élément flex ne
       descend pas sous la largeur naturelle de l'image, qui pousserait la ligne. */
    .pageScene .sceneVisuelLien {
        flex: 1;
        min-width: 0;
    }

    /* MOITIÉ-MOITIÉ AVEC LE VISUEL (décision chef de projet 2026-09-17). Le bloc ne prend
       plus sa largeur naturelle : celle-ci se calcule pastilles bout à bout, et une longue
       liste écrasait le visuel jusqu'à zéro, les pastilles sortant de l'écran. À largeur
       imposée, les pastilles passent à la ligne. `min-width: 0` : sans lui, un élément flex
       ne descend pas sous la largeur de son contenu.
       Il n'est plus sous le visuel, sa marge haute n'a plus lieu d'être. */
    .pageScene .sceneCarte {
        flex: 1;
        min-width: 0;
        margin-top: 0;
    }
}

/* ============================================
   < palierVisuelCadre — EMPILÉ, ET LE CADRE PASSE DEVANT
   Le cadre AU-DESSUS, le visuel EN DESSOUS (décision chef de projet 2026-09-07). Sur un
   téléphone, l'écran ne montre qu'un bloc à la fois : c'est le nom de la scène et ses deux
   boutons qu'on veut y trouver, pas une image qu'il faudrait dépasser pour agir.

   ⚠️ `column-reverse` inverse l'ORDRE VISUEL, pas l'ordre du document : le visuel reste écrit
   avant le cadre, donc la tabulation l'atteint avant les boutons alors qu'il est affiché
   dessous. C'est le prix d'un seul régime inversé sur quatre. L'autre solution — écrire le
   cadre en premier dans le Twig — obligerait à inverser DEUX régimes (la maquette d'article
   et la ligne visuel/cadre), ceux où se trouve presque tout le monde. Signalé au chef de
   projet le 2026-09-07.
   ============================================ */
/* @palier palierVisuelCadre − 1 */
@media (max-width: 649px) {
    .pageScene > .pageSceneVisuel {
        display: flex;
        flex-direction: column-reverse;
        gap: var(--gapLarge);
    }

    /* L'écart entre les deux est porté par le `gap` : la marge du cadre ferait double emploi,
       et elle se retrouverait AU-DESSUS de lui, en tête de pile. */
    .pageScene .sceneCarte {
        margin-top: 0;
    }
}

/* ============================================
   < palierCadreScene — NI ICÔNE NI BOUTONS (décision chef de projet 2026-09-17)
   Dès que la grille de page est défaite, le cadre ne garde que le branchement entre scènes
   et les résultats. L'icône et les deux boutons disparaissent ; la façon de rendre les
   boutons sur écran étroit reste à décider (chef de projet, à venir).

   POURQUOI. Depuis que le branchement est entré dans le cadre (2026-09-16), la carte est
   une rangée flex qui passe à la ligne : sa largeur naturelle se calcule comme si tout
   tenait sur UNE ligne — icône + colonne de boutons + toutes les pastilles. Posée à côté
   du visuel, elle réclamait ~700px et l'image tombait à ~180px. Sans l'icône ni les
   boutons, il ne reste que le bloc de pastilles, et le visuel reprend sa place.

   L'icône est décorative (alt=""), la retirer ne coûte rien à un lecteur d'écran.
   ============================================ */
/* @palier palierCadreScene − 1 */
@media (max-width: 1149px) {
    .pageScene .sceneIcone,
    .pageScene .sceneVisuelColonne {
        display: none;
    }

    /* PLUS D'ENCADRÉ (décision chef de projet 2026-09-17) : ni filet ni padding. Le filet du
       premier chapitre, lui, reste — il ouvre le bloc. */
    .pageScene .sceneCarte {
        padding: 0;
        border: none;
    }
}

/* La description, sous le titre. Elle n'a plus d'enveloppe : l'en-tête en deux parties
   (.sceneEntete) n'avait plus qu'elle dedans depuis que l'icône est descendue sous le visuel
   (décision chef de projet 2026-09-07). C'est donc un paragraphe de plus dans la colonne de
   gauche, et il prend les mêmes marges que le premier paragraphe d'un article. */
.sceneIntro {
    font: var(--fText16);
    color: var(--cNoir3);
}

/* ============================================
   LE VISUEL CLIQUABLE (décision chef de projet 2026-09-07)
   Il ouvre l'aperçu dans la surcouche, comme la vignette du catalogue : c'est le geste que
   le visiteur tente de lui-même devant l'image d'une scène.
   ============================================ */
/* `display: block` et padding remis à zéro : le noyau donne à TOUT <a> un `inline-block` et
   4px de padding vertical (31_cta.css), ce qui laissait un liseré sous l'image et
   l'empêchait d'épouser sa colonne.
   LE HALO AU SURVOL est celui des vignettes de l'îlot de scènes (ilotScenes.css) : même
   geste, même signal, même couleur (--couleurHalo, le fond de l'image éclairci, posée par
   ilotScenes.css d'après --couleurFondVisuel que le gabarit pose sur le lien) — sauf la
   largeur, --gapDefaut ici contre 15px là-bas, parce qu'une image de 450px n'a pas besoin
   du même halo qu'une vignette de tuile. */
.sceneVisuelLien {
    display: block;
    padding: 0;
    border-radius: var(--borderR1);
    outline: 0 solid transparent;
    transition: outline-width .5s ease-out, outline-color .5s ease-out;
}

.sceneVisuelLien:hover,
.sceneVisuelLien:focus-visible {
    outline: var(--gapDefaut) solid var(--couleurHalo);
}

/* ============================================
   SOUS LE VISUEL — l'icône, le nom de la scène et les deux boutons
   Le bloc est écrit DANS le <p> du visuel : il se colle donc en haut de la fenêtre avec lui
   au défilement, au lieu de rester en arrière.
   ============================================ */
/* Un CADRE autour de l'ensemble (décision chef de projet 2026-09-07) : le filet et l'arrondi
   des formulaires, ceux du design system, pas de valeurs inventées ici. Le padding non plus :
   --paddingCorps, l'intérieur d'un corps de bloc.
   DEUX COLONNES (décision chef de projet 2026-09-07) : l'ICÔNE À GAUCHE, et à DROITE une
   seule colonne qui porte l'étiquette puis les deux boutons (.sceneVisuelColonne). C'est ce
   qui aligne le cadre — tout ce qui n'est pas l'icône partage une largeur et un axe.
   Le cadre portait avant trois éléments frères, l'icône et l'étiquette poussées chacune
   contre son bord par un `space-between`, les boutons en travers du cadre en dessous : trois
   axes différents dans un cadre de 450px.
   ALIGNÉES PAR LE HAUT : l'icône fait 84px, l'étiquette une ligne ; centrées, elles ne
   partageaient aucune ligne de référence — par le haut, elles commencent ensemble. */
/* ⚠️ Le filet et le padding ne valent QUE au-dessus de palierIconeLigne (800px) : sous ce
   palier ils sont retirés, voir le bloc « PLUS DE FILET NI DE PADDING » plus haut. */
.sceneCarte {
    display: flex;
    align-items: flex-start;
    gap: var(--gapLarge);
    margin-top: var(--gapDefaut);
    padding: var(--paddingCarte); /* c'est une carte : même intérieur que .blocCorps. Les côtés restent à 20px, les paliers ne bougent pas */
    border: var(--borderForm);
    border-radius: var(--borderR1);
}

/* Case 80 et 8px d'air : dessin 64, la grande des deux tailles d'icône de scène du projet
   (Studio, assets/noyau/css/studio/54_icones.css). Le SVG est servi en <img>.
   LE FOND (décision chef de projet 2026-09-07) : --cAccent1, le bleu clair de l'espace
   administration — celui de l'onglet Préparer du Studio, du compte et des tarifs. C'est
   pour le lire ici que le <span> porte `accentAdministration` : sur une page publique,
   --cAccent1 vaut le vert de la Vitrine ; la classe ramène le bleu sur cet élément seul
   (10_font.css), sans toucher ses voisins.
   Le padding décolle le dessin du bord, l'arrondi est le plus discret des trois (--borderR0) :
   une pastille, pas une carte. */
.sceneIcone {
    flex: 0 0 auto;
    width: 80px;
    height: 80px;
    box-sizing: border-box;
    padding: var(--gapDefaut);
    border-radius: var(--borderR0);
    background: var(--cAccent1);
}

/* LA COLONNE DE DROITE — l'étiquette ET les deux boutons dans la même boîte (décision chef
   de projet 2026-09-07). C'est elle qui fait tout l'alignement du cadre : l'étiquette et les
   boutons partagent une largeur et un axe, donc l'étiquette centrée tombe pile sur le texte
   des boutons. Sans cette enveloppe, les trois éléments étaient frères de l'icône et il
   fallait recentrer l'étiquette à la main, à coups de marge miroir.

   240px (décision chef de projet 2026-09-07). Ce n'est pas un chiffre inventé ici :
   c'est la MÊME mesure que la colonne d'actions d'une carte de scénario compatible, plus bas
   sur la même page (.divActionScenarioCompatible, min-width 240px,
   noyau/css/studio/55_scenariosCompatibles.css). Les deux blocs se ressemblent, leurs boutons
   font désormais la même largeur.
   Sans ce plafond, la colonne prenait tout ce que l'icône lui laissait — 306px dans un cadre
   à pleine taille — et les boutons s'étiraient jusque-là.
   `margin-left: auto` pousse la colonne contre le bord droit : l'icône garde le bord gauche,
   la colonne le bord droit, et le mou tombe entre les deux plutôt qu'à la fin. Le cadre reste
   rempli, comme il l'était avec l'ancien `space-between`.

   C'est une LARGEUR, pas un plafond : posée en `width`, elle donne au cadre une largeur
   naturelle quand il se retrouve à côté du visuel entre 768px et palierCadreScene. Elle reste
   compressible — `min-width: 0` autorise la colonne à descendre sous 240 quand la fenêtre
   l'exige, au lieu de déborder ; sans lui, un élément flex refuse de passer sous la largeur
   de son contenu. */
.sceneVisuelColonne {
    width: 240px;
    min-width: 0;
    margin-left: auto;
    display: flex;
    flex-direction: column;
    gap: var(--gapMoyen);
}

/* ⚠️ Sélecteur plus précis qu'il n'en a l'air, et il le faut : l'icône est maintenant dans
   le <p> du visuel, où `.articleVitrine > p:has(img) img` (articleVitrine.css) étire toute
   image à 100% de la colonne. Sans ce poids-là, l'icône passerait à 450px. */
.pageScene .sceneIcone img {
    display: block;
    width: 100%;
    height: 100%;
    border-radius: 0;
}

/* L'ÉTIQUETTE N'EST PLUS DANS LE CADRE (décision chef de projet 2026-09-16) : elle est
   remontée sous le TITRE de la page, où sa règle est écrite (dans `.pageScene > .pageSceneCommandes`,
   plus haut dans ce fichier). Le cadre ne porte donc plus que l'icône et les deux boutons.

   Ce qui vivait ici, en deux temps et pour mémoire :
     — jusqu'au 2026-09-16, `.sceneEtiquette` au corps d'un H2 et `.sceneEtiquetteLigne` en
       `space-between` : l'étiquette était centrée dans ce qui RESTAIT une fois le cœur posé
       à droite. Un clic faisait apparaître le chiffre, le cœur s'élargissait, l'étiquette
       glissait ; le déclic la ramenait (constat du chef de projet) ;
     — le même jour, la brique `_etiquetteJaime` a collé les deux en un objet de largeur
       constante, centré ici par un `align-self: center` ;
     — puis le bloc est monté sous le titre : c'est l'identité de la scène, elle appartient
       au titre, pas aux commandes. Plus rien à régler dans le cadre. */

/* LES DEUX BOUTONS — jouer la scène, puis s'en servir (décision chef de projet
   2026-09-07). Ils étaient sous la description, en travers de la colonne de lecture ; ils
   sont maintenant dans le cadre, sous le nom de la scène qu'ils font agir.
   `flex: 1 0 100%` : la ligne entière du cadre, donc une deuxième ligne sous l'identité,
   quelle que soit la place qui restait à droite de l'icône.
   L'UN SOUS L'AUTRE, ET DE MÊME LARGEUR (décision chef de projet 2026-09-07) : exactement
   la barre d'actions d'une carte de scénario compatible, juste en dessous sur la même page
   (.divActionScenarioCompatible, noyau/css/studio/55_scenariosCompatibles.css) — mêmes
   `flex-direction: column` et `gap`, donc même dessin. Côte à côte, ils avaient deux largeurs
   différentes et deux libellés qui ne commençaient pas au même endroit : rien ne s'alignait
   sur la page.
   La largeur égale n'est pas réglée, elle est donnée : en colonne, un élément flex s'étire à
   la largeur du conteneur (`align-items: stretch` par défaut) — ici la colonne de droite, pas
   le cadre entier : les boutons commencent où commence l'étiquette. Les libellés changent de
   longueur — selon le visiteur, et selon la langue —, les boutons non. */
.sceneVisuelActions {
    display: flex;
    flex-direction: column;
    gap: var(--gapDefaut);
}

/* LE TEXTE CENTRÉ : les boutons sont étirés à la largeur de la colonne. « Jouer la scène » est
   un .ctaDiscret, qui centre déjà son texte ; le bouton de conversion est un .cta14 (bleu ou
   or, décision chef de projet 2026-10-07), qui ne le centre pas — et .cta14.ctaOr le pose même
   à gauche (31_cta.css). Une classe de plus que .cta14.ctaOr : la règle l'emporte. */
.sceneVisuelActions > .cta14 {
    text-align: center;
}

/* ============================================
   BRANCHEMENT ENTRE SCÈNES ET RÉSULTATS (décision chef de projet 2026-09-16)
   Deux chapitres. « Branchement entre scènes » : ce que la scène demande (Participants,
   Numéros, Lots) et ce qu'elle produit (Gagnants, Restants, Annulés) —
   SceneContratService::branchements. « Résultats » : ce que montrent sa publication, son
   téléchargement et son constat — PageSceneService::recuperable.

   SUR TOUTE LA LARGEUR DE LA CARTE, sous l'icône et les boutons. Placé dans la colonne des
   boutons, le bloc laissait la colonne de l'icône vide sur toute sa hauteur. La carte est une
   rangée flex : elle passe à la ligne (`flex-wrap`), et le bloc prend la rangée entière
   (`flex-basis: 100%`). La largeur de la carte ne change pas — les paliers responsive,
   calculés sur elle, restent justes.

   UNE SECTION = DEUX LIGNES : le titre seul sur la sienne, puis toutes les pastilles à la
   suite sur la suivante (décision chef de projet 2026-09-16). Les pastilles passent à la
   ligne quand la carte est trop étroite.

   LES PASTILLES VIENNENT DU RÉCAPITULATIF de composition (.recapTagSortie,
   .recapTagSortieSecondaire, 56_scenario/_recapitulatif.css) : même dessin qu'à la
   composition d'un scénario. Le CONTENEUR, lui, est propre à cette carte : `.recapComposition`
   porte la mise en page de la page de composition (292px en flex, filet à gauche).
   ============================================ */
.sceneCarte:has(.sceneBranchements),
.sceneCarte:has(.sceneOffrePro) {
    flex-wrap: wrap;
}

/* L'ÉCHELLE DES ESPACES DU BLOC (décision chef de projet 2026-09-16) — trois valeurs, et
   chacune a UN rôle ; c'est ce qui fait voir d'un coup d'œil ce qui va ensemble :
     --gapReduit  4px   un titre de rubrique → ses pastilles ; une pastille → la suivante
     --gapMoyen  12px   une rubrique → la suivante ; le filet → le titre du chapitre ;
                        le titre du chapitre → sa première rubrique
     --gapLarge  20px   un chapitre → le suivant (avant son filet) ; les boutons → le
                        premier filet (c'est le `gap` de la carte, qui passe à la ligne)
   Aucune autre marge ne s'ajoute : celles que le Noyau pose sur les titres et les `li`
   sont redéfinies ci-dessous. */
.sceneBranchements {
    flex: 1 0 100%;
    display: flex;
    flex-direction: column;
    gap: var(--gapLarge);
}

/* « Uniquement sur l'offre Pro », dans la carte d'un jeu interactif : une ligne entière de la
   carte, avant les branchements. En police LÉGÈRE, comme « (Offre Pro uniquement) » plus bas
   (.sceneBranchementsOffre) : une mention, pas une alerte. L'écart vient du `gap` de la carte. */
.sceneOffrePro {
    flex: 1 0 100%;
    margin: 0;
    font: var(--fLight14);
}

/* UN CHAPITRE, SOUS UN FILET HORIZONTAL (décision chef de projet 2026-09-16). Le filet est
   celui qui sépare les deux colonnes d'une carte de scénario compatible (--border,
   noyau/css/studio/55_scenariosCompatibles.css), posé à l'horizontale comme cette carte le
   fait sur écran étroit. */
.sceneBranchementsChapitre {
    padding-top: var(--gapMoyen);
    border-top: var(--border);
}

/* Le titre d'un chapitre, au corps d'un H4 (18px) et non plus d'un H3 (22px) : dans une
   carte de cette largeur, le H3 pesait plus que tout le reste. Sa place lui vient du
   `padding-top` du chapitre ; l'écart qui le suit, de la marge haute de la rubrique. */
.sceneBranchements h3 {
    font: var(--fH4);
    margin: 0;
    color: var(--cNoir2);
}

.sceneBranchementsSection {
    display: flex;
    flex-direction: column;
}

/* Le titre d'une rubrique GARDE SES MARGES (décision chef de projet 2026-09-16) — mais à
   l'échelle du bloc : --gapMoyen au-dessus (l'écart entre rubriques), --gapReduit en
   dessous (collé à ses pastilles). Celles de la règle générale (`h4, h5, h6 { margin: 25px
   0 7px }`, Noyau) sont faites pour un article, pas pour une carte.
   Au corps d'un libellé (14px), comme ses pastilles : le titre de chapitre, au-dessus, est
   le seul texte plus grand du bloc. */
.sceneBranchements h4 {
    font: var(--fLabel);
    margin: var(--gapMoyen) 0 var(--gapReduit);
    color: var(--cNoir3);
}

.sceneBranchements ul {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gapReduit);
    list-style: none;
    margin: 0;
    padding-left: 0;
}

/* « (Offre Pro uniquement) », à la suite du titre d'une rubrique réservée : en police
   LÉGÈRE (décision chef de projet 2026-09-16), la même que le marqueur « (à configurer) »
   du Studio (.etiquetteAConfigurer) — une précision, pas un titre. */
.sceneBranchementsOffre {
    font: var(--fLight14);
}

/* `margin: 0` : la règle générale `li { margin: 8px 0 }` du Noyau mettait 16px entre deux
   rangées de pastilles, et 8px sous chaque titre. Ici l'écart entre pastilles est le seul
   `gap` de la liste. */
.sceneBranchements li {
    margin: 0;
    font: var(--fLabel);
    color: var(--cNoir3);
}

/* Même raison : la pastille du récapitulatif porte `margin: 2px 0`, utile dans sa colonne
   empilée, parasite dans une liste en ligne dont le `gap` règle déjà l'écart. */
.sceneBranchements .recapTagSortie,
.sceneBranchements .recapTagSortieSecondaire {
    margin: 0;
}

/* ============================================
   LA PRÉSENTATION — la SUITE du texte, pas un bloc à part
   (décision chef de projet 2026-09-07)

   Elle n'a plus d'enveloppe : ses paragraphes, ses titres et ses listes sont enfants directs
   de l'article, comme ceux d'un article rédigé. Il n'y a donc RIEN à régler ici pour eux —
   `.articleVitrine > p`, `> h2`, `> ul` (articleVitrine.css) leur donnent les marges, la
   largeur de lecture et les puces d'un vrai texte. C'est ce que l'enveloppe leur retirait :
   il fallait reborner les paragraphes à la main, les listes perdaient leurs puces sous le
   reset du noyau, et un `margin-top: 8rem` — le rythme des ÎLOTS, ces blocs qui traversent
   la page — creusait un trou entre la description et sa suite.

   Ne reste que le mot « Présentation », ci-dessous.
   ============================================ */

/* LE MOT « PRÉSENTATION ». Un <p> qui se lit comme un H2 sans en être un : le plan du
   document ne doit pas porter un titre qui ne dit rien de la scène (décision chef de projet
   2026-09-07, motif SEO). On lui donne donc EXACTEMENT ce qu'aurait un H2 d'article — la
   fonte et la couleur d'un titre (10_font.css), et les marges serrées des titres de corps
   d'article, 1em / .5em (`.articleVitrine > h2`, articleVitrine.css). Le chiffre est
   recopié, pas hérité : ce <p> ne peut pas tomber sur le sélecteur des titres. Si le rythme
   des titres d'article bouge là-bas, il bouge ici aussi.
   À l'oeil, rien ne le distingue d'un vrai titre.
   ⚠️ Sélecteur en deux morceaux, et il le faut : `.articleVitrine > p` (0,1,1) impose
   `margin-block: 0 1em` à tout paragraphe de l'article. Une classe seule (0,1,0) perdait. */
.pageSceneArticle > .sceneTitrePresentation {
    margin: 1em 0 .5em;
    font: var(--fH2);
    color: var(--cNoir1);
}

/* Et ce qui le précède ne pousse pas non plus : le pendant, pour ce faux titre, de
   `.articleVitrine > *:has(+ h2)` (articleVitrine.css). Il faut l'écrire à part, et c'est
   le prix du <p> : la règle de l'article ne reconnaît que de vraies balises de titre.
   Sans elle, la description ajoutait son 1em et le blanc au-dessus de « Présentation » ne
   valait pas ce que le CSS annonce. */
.pageSceneArticle > *:has(+ .sceneTitrePresentation) {
    margin-bottom: 0;
}

/* La foire aux questions. Le blanc de faq.css (8rem, le rythme des îlots) est remplacé ICI,
   sur cette page seulement, par --gapBlocs : le blanc entre deux blocs de la colonne de
   lecture (décision chef de projet 2026-09-17). La brique sert aussi les rubriques et la
   Home, où elle suit vraiment un îlot. */
.pageSceneColonne > .faq {
    margin-top: var(--gapBlocs);
}

/*!****************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/pageScenario.css ***!
  \****************************************************************************************************************************/
/* ============================================
   PAGE D'UN SCÉNARIO — /preview/scenario/{dossier}/configure
   Template : vitrine/public/vitrinePreviewScenarioComposition.twig

   LA MÊME GRILLE QUE LA PAGE D'UNE SCÈNE (pageScene.css, décision chef de projet
   2026-09-18) : le titre sur toute la largeur, la ligne de commandes et la colonne de lecture
   à gauche, à droite (à la place du visuel) le cadre de ce qu'il faut configurer et des
   résultats. Mêmes colonnes, mêmes marges, même palier : les deux pages se ressemblent.
   Sous la grille, sur toute la largeur, l'outil de composition garde ses feuilles
   (55_scenarioModifier.css, 56_scenario/_recapitulatif.css).
   ============================================ */

.pageScenario {
    display: grid;
    grid-template-columns: 1fr min(450px, 37.5%);
    gap: 0 var(--gapColonnes);
    align-items: start;
}

/* Le titre : les marges du titre d'une scène. Sans cette règle il prenait celles de tout h1
   du site (10_font.css : 10px au-dessus, 5px dessous). */
.pageScenario > h1 {
    grid-column: 1 / -1;
    margin-block: var(--margeTitrePage) var(--gapDefaut);
}

/* Les deux boutons à gauche, l'étiquette et son cœur à droite (pageScene.css,
   .pageSceneCommandes : mêmes valeurs). */
.pageScenario > .pageScenarioCommandes {
    grid-column: 1;
    grid-row: 2;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    gap: var(--gapLarge);
    margin-bottom: 3rem;
}

.pageScenarioBoutons {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gapDefaut);
}

.pageScenario > .pageScenarioColonne {
    grid-column: 1;
    grid-row: 3;
}

/* LE CADRE DE DROITE — ce qu'il faut configurer, les résultats — à la place du visuel d'une
   scène. Son dessin est celui du pavé d'une scène (pageScene.css : .sceneCarte,
   .sceneBranchements…) ; ne s'écrit ici que ce qui diffère. */
.pageScenario > .pageScenarioVisuel {
    grid-column: 2;
    grid-row: 3;
}

/* Sur la page d'une scène le cadre suit le visuel, d'où sa marge haute ; ici il ouvre la
   colonne. */
.pageScenarioVisuel .sceneCarte {
    margin-top: 0;
}

/* Le premier chapitre ouvre le cadre : pas de filet au-dessus de rien (sur la page d'une
   scène, il sépare le chapitre de l'icône et des boutons). */
.pageScenarioVisuel .sceneBranchementsChapitre:first-child {
    padding-top: 0;
    border-top: none;
}

/* « À configurer » n'a pas de rubrique (h4) sous son titre : les pastilles, ou la
   phrase « Rien à configurer », prennent l'écart qu'aurait eu la rubrique — --gapMoyen, le titre du
   chapitre → sa première rubrique (échelle des espaces, pageScene.css). */
.pageScenarioVisuel .sceneBranchementsChapitre > ul,
.pageScenarioRien {
    margin-top: var(--gapMoyen);
}

/* Même corps et même couleur que les pastilles qu'elle remplace. */
.pageScenarioRien {
    margin-bottom: 0;
    font: var(--fLabel);
    color: var(--cNoir3);
}

/* Sous le palier de la page d'une scène (1150px), une seule colonne. Le cadre reste — ce
   qu'il faut configurer compte autant sur un petit écran — et se pose entre la ligne de
   commandes et le texte, comme le visuel d'une scène au même palier. */
@media (max-width: 1149px) {
    .pageScenario {
        grid-template-columns: 1fr;
    }

    .pageScenario > .pageScenarioCommandes,
    .pageScenario > .pageScenarioColonne {
        grid-row: auto;
    }

    .pageScenario > .pageScenarioVisuel {
        grid-column: 1;
        grid-row: auto;
        margin-bottom: var(--gapColonnes);
    }
}

/* Le mot « Présentation » — un <p> qui se lit comme un titre (pageScene.css, même règle,
   mêmes raisons). ⚠️ Sélecteur en deux morceaux : `.articleVitrine > p` (0,1,1) impose
   `margin-block: 0 1em` à tout paragraphe de l'article, une classe seule (0,1,0) perdait. */
.pageScenarioArticle > .sceneTitrePresentation {
    margin: 1em 0 .5em;
    font: var(--fH2);
    color: var(--cNoir1);
}

.pageScenarioArticle > *:has(+ .sceneTitrePresentation) {
    margin-bottom: 0;
}

/* La foire aux questions : le blanc de faq.css (8rem, le rythme des îlots) remplacé ici par
   --gapBlocs, comme sur la page d'une scène. */
.pageScenarioColonne > .faq {
    margin-top: var(--gapBlocs);
}

/* L'outil de composition, sous la grille. */
#modifierScenario {
    margin-top: var(--gapBlocs);
}


/*!***************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/pageLangues.css ***!
  \***************************************************************************************************************************/
/* ============================================
   PAGE « CHOISIR VOTRE LANGUE »
   Les grandes régions se suivent, chacune avec sa grille de langues.
   La grille s'adapte seule au nombre de colonnes : pas de media query.
   ============================================ */

#pageLangues .titreRegionLangues {
    margin: 50px 0 0 0;
    padding: 0 0 var(--gapDefaut);
    border-bottom: var(--border);
}

/* ============================================
   GRILLE DES LANGUES
   ============================================ */

.grilleLangues {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: var(--gapReduit) var(--gapMoyen);
    margin: 20px 0 0 0;
    padding: 0;
    list-style: none;
}

.grilleLangues li {
    margin: 0;
    padding: 0;
}

.grilleLangues a {
    display: block;
    padding: var(--paddingCta14);
    font: var(--fText16);
    color: var(--cNoir2);
    border: none;
    border-radius: var(--borderR1);
    text-decoration: none;
}

.grilleLangues a:hover {
    color: var(--cAccentt);
    background-color: var(--cAccent4);
}

/* La langue affichée actuellement : signalée, et non cliquable au regard. */
.grilleLangues a[aria-current] {
    background-color: var(--cBlanc2);
    color: var(--cNoir1);
}

/*!***************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/pageContact.css ***!
  \***************************************************************************************************************************/
/* ============================================
   PAGE « NOUS CONTACTER »
   Colonne unique, étroite : un formulaire se lit mieux resserré
   qu'étalé sur toute la largeur de l'écran.
   ============================================ */

#pageContact {
    max-width: 560px;
}

/* ============================================
   FORMULAIRE
   ============================================ */

#formulaireContact {
    margin-top: 30px;
}

#formulaireContact label {
    display: block;
    margin-bottom: 6px;
    font: var(--fLabel);
    color: var(--cNoir2);
}

#formulaireContact input,
#formulaireContact textarea {
    width: 100%;
    margin-bottom: 20px;
    padding: var(--paddingInput);
    font: var(--fText16);
    color: var(--cNoir1);
    background-color: var(--cBlanc);
    border: var(--borderInput);
    border-radius: var(--borderR1);
}

#formulaireContact textarea {
    resize: vertical;
}

#formulaireContact input:focus,
#formulaireContact textarea:focus {
    outline: none;
    border-color: var(--cFormFocus);
    box-shadow: 0 0 0 3px var(--cFormFocusHalo);
}

/* ============================================
   ERREURS DE SAISIE
   ============================================ */

#formulaireContact .form-error-message {
    display: block;
    margin: -14px 0 20px 0;
    font: var(--fAlerte16);
    color: var(--cRouge3);
}

/* ============================================
   ANTISPAM — LES CINQ DÉS
   Chaque dé tourne lentement sur lui-même, à sa propre vitesse : cinq durées
   premières entre elles, pour qu'ils ne se resynchronisent jamais.
   Le dessin est posé par assets/vitrine/ts/antiSpamDes.ts.
   ============================================ */

#consigneDes {
    margin-bottom: 20px;
    font: var(--fLabel);
    color: var(--cNoir2);
}

#lesDes {
    display: flex;
    gap: 14px;
    margin-bottom: 25px;
}

.unDe {
    flex: 1;
    text-align: center;
}

.unDe label {
    display: block;
    cursor: pointer;
}

#lesDes svg {
    width: 100%;
    max-width: 56px;
    height: auto;
}

/* Le dé garde son ID : c'est sa vitesse de rotation qui le distingue. */
#deDessin0 { animation: tournerDe 15s linear infinite; }
#deDessin1 { animation: tournerDe 17s linear infinite; }
#deDessin2 { animation: tournerDe 19s linear infinite; }
#deDessin3 { animation: tournerDe 21s linear infinite; }
#deDessin4 { animation: tournerDe 23s linear infinite; }

#deDessin0,
#deDessin1,
#deDessin2,
#deDessin3,
#deDessin4 {
    display: block;
}

@keyframes tournerDe {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
}

/* Le roulement, au chargement : le dé fait deux tours avant de s'arrêter.
   Il se compose avec la rotation lente du <span> qui le porte. */
.deRoule {
    animation: roulerDe 1.75s ease-out;
}

@keyframes roulerDe {
    from { transform: rotate(0deg); }
    to { transform: rotate(720deg); }
}

/* La case sous chaque dé : un seul chiffre, au centre. */
#formulaireContact #lesDes input {
    width: 100%;
    margin: 8px 0 0;
    padding: var(--gapDefaut) 0;
    font: var(--fText16);
    text-align: center;
}

/* Qui a demandé à son système de réduire les animations reçoit des dés immobiles :
   la face reste lisible, c'est tout ce dont on a besoin pour la recopier. */
@media (prefers-reduced-motion: reduce) {
    #deDessin0,
    #deDessin1,
    #deDessin2,
    #deDessin3,
    #deDessin4,
    .deRoule {
        animation: none;
    }
}

/* ============================================
   BOUTON D'ENVOI
   Invisible tant qu'il n'est pas arrivé à l'écran : c'est en apparaissant
   qu'il fait remplir le mot secret (antiSpamDes.ts). Sans JavaScript, il
   reste caché — et rien ne part, c'est voulu.
   ============================================ */

#envoyerContact {
    opacity: 0;
    transition: opacity 0.3s ease-in;
}

#envoyerContact.devoile {
    opacity: 1;
}

/* ============================================
   RÉPONSE APRÈS ENVOI
   ============================================ */

.reponseContact {
    margin-top: 30px;
    font: var(--fText16);
}

/*!*************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/basDePage.css ***!
  \*************************************************************************************************************************/
/* ============================================
   BAS DE PAGE
   Présent sur toutes les pages, publiques et compte.
   Colonnes qui se réempilent seules : chaque colonne a une
   largeur plancher, le flex-wrap fait le reste — pas de media query.
   ============================================ */

#basDePage {
    margin: 60px 0 0 0;
    padding: 0 var(--paddingCorps) var(--gapLarge);
    border-top: var(--border);
}

/* ============================================
   RANGÉE DE COLONNES
   ============================================ */

#colonnesBasDePage {
    max-width: var(--largeur);
    margin: 0 auto;
    padding: var(--paddingPage);
    padding-bottom: var(--gapLarge);
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 60px 30px;
    text-align: left;
}

.colonneBasDePage {
    min-width: 250px;
    max-width: 300px;
}

/* ============================================
   COLONNE LOGO
   Le logo d'entête repris tel quel : dessin large
   (viewBox 245x36), on ne contraint que la largeur.
   ============================================ */

#logoBasDePage svg {
    width: 180px;
    max-width: 100%;
    height: auto;
}

/* ============================================
   TITRE DE COLONNE
   ============================================ */

.titreColonneBasDePage {
    margin: 0;
    padding: 0;
    font: var(--fH4);
    color: var(--cNoir2);
}

/* ============================================
   LIENS
   ============================================ */

.liensColonneBasDePage {
    margin: 0;
    padding: 0;
    list-style: none;
}

.liensColonneBasDePage li {
    margin: 0;
    padding: 0;
}

.liensColonneBasDePage a {
    display: inline-block;
    margin: 8px 0;
    padding: var(--gapReduit) 0;
    font: var(--fLight14);
    color: var(--cNoir3);
    border: none;
}

.liensColonneBasDePage a:hover {
    color: var(--cAccent4);
}

/*!***********************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/vitrine/css/vitrine.css ***!
  \***********************************************************************************************************************/
/* ============================================
   VITRINE PUBLIQUE - Styles pages SEO
   Pages : home, fonctionnalités, tarifs, FAQ, offres

   Note : L'espace connecté (compte, auth) utilise
   le bundle "studio" via baseVitrineCompte.twig
   ============================================ */

/* Import des styles noyau (variables, reset, titres, CTA) */
/* L'étiquette et son cœur collés en un seul objet (brique noyau _etiquetteJaime.twig).
   APRÈS jaime.css : ce fichier réserve la case du chiffre du cœur, il suppose donc le cœur
   déjà stylé. Pas d'import côté Studio : aucune de ses pages ne pose encore cette brique. */

/* Import de la page des offres */
/* Le titre de page, une seule règle (avant pageScene/pageScenario, qui n'en changent que le bas). */

/* Import de la grille des catégories d'aperçu (Home) */

/* Import du menu d'ancres de la Home (collé en haut, verre dépoli) */

/* Import de l'article d'une mère de cocon (rubriques) */

/* Import du gabarit « page à chapitres » : titre, menu à gauche, articles à droite */

/* Import du gabarit « page de rubrique » : le bandeau des aperçus sur grand écran */

/* Import de la page des catégories d'événement — BROUILLON */

/* Import du menu des sous-rubriques (pages sœurs d'une rubrique) */

/* Import de l'îlot d'aperçus de scène */

/* Import de l'îlot de scénarios */

/* Import de la foire aux questions dépliable */

/* Import de la liste des scénarios d'une catégorie (copies assumées jumelles studio) */

/* Import de la page de composition d'un scénario d'aperçu : les fichiers NOYAU de la page
   studio « Modifier ce scénario » — pages jumelles au pixel (décision PO 2026-08-14),
   le stepper récap et le carrousel sont la même brique _compositionScenario.
   Même ordre que le studio (studio.js : 55 avant 56/_recapitulatif) : cascade identique. */
/* La chasse fixe des étiquettes (.etiquetteMono) que le récapitulatif pose sur chaque nom de
   scène. Sans cet import, la classe était écrite dans le HTML de la Vitrine mais ne portait
   aucune règle : les étiquettes s'affichaient dans la police du texte (constat du chef de
   projet 2026-09-16). Le fichier ne contient que les règles d'étiquette. */

/* Import de la page d'une scène (/scene/{dossier}), de la page d'un scénario
   (/preview/scenario/{dossier}/configure) et des cartes NOYAU qu'elles posent (scénarios
   compatibles d'une scène, scènes d'un scénario) — le Studio importera les mêmes briques le
   jour où il a ses pages. */
/* Le déroulé posé dans chaque carte de scénario (brique noyau _derouleScenario) : feuille
   autonome, elle n'entraîne pas la grille du Studio. */

/* Import de la page « Choisir votre langue » */

/* Import de la page « Nous contacter » */

/* Import du bas de page */

/* ============================================
   LA LARGEUR DE LECTURE
   UN SEUL CHIFFRE pour tout le texte rédigé de la vitrine (décision chef de projet
   2026-09-07) : le corps d'un article, l'intro d'un îlot, la réponse d'une question.
   Avant, chaque bloc avait la sienne — la colonne de l'article (710), l'intro d'îlot (800),
   la FAQ et l'îlot de scénarios (rien du tout, donc les 1200 de la page) : trois mesures
   pour le même texte, sur la même page.

   710px, parce que c'est la seule des trois qu'on ne pouvait pas changer : c'est ce que
   laisse la colonne de l'article quand l'image occupe sa part (1200 de contenu, moins 450
   d'image, moins les 40 de gouttière). Les autres blocs s'y rangent.

   ⚠️ En pixels, jamais en `ch` : cette unité vaut la largeur du glyphe « 0 » de la police,
   pas celle du texte écrit — un idéogramme chinois fait ~2ch, le thaï empile ses signes.
   Une mise en page sur 31 langues ne peut pas dépendre du dessin d'un chiffre
   (voir articleVitrine.css).
   ============================================ */
:root {
    --largeurTexte: 710px;
}

body {
    font-family: var(--ffBase);
    line-height: 1.6;
    color: var(--cNoir1);
    background-color: var(--cBg);
}

/* Couleur de l'espace : LE BLEU ADMINISTRATION, comme partout ailleurs (décision chef de
   projet 2026-09-07). Le body ne porte plus aucune classe d'espace, il prend donc la palette
   Accent par défaut du noyau (10_font.css > body).
   Jusqu'au 2026-09-07 il portait `bodyPageVitrine`, qui la basculait en vert (décision PO
   2026-09-05). Le vert distinguait le public de l'administration, mais il fallait ramener le
   bleu à la main sur tout ce qui menait à un geste d'administration — un lien, un bouton, un
   onglet. Une seule couleur, plus rien à ramener.
   ⚠️ La palette verte est toujours DÉFINIE dans le noyau (10_font.css > .bodyPageVitrine),
   plus rien ne la pose. À supprimer sur accord du chef de projet : c'est un fichier partagé
   avec le Studio. */

/* Système de soulignement des liens — VITRINE UNIQUEMENT (décision PO 2026-08-25) :
   le noyau (31_cta.css) laisse les a en text-decoration: none.
   button.lienBouton suit : c'est un bouton qui a le visuel d'un lien (31_cta.css,
   templates/CLAUDE.md « Bouton ou lien ? »), il doit se souligner comme les liens de la
   Vitrine — sinon la même classe donne un autre bouton ici que dans le Studio (décision chef
   de projet 2026-09-14). */
a,
button.lienBouton {
    text-decoration: underline;
    text-underline-offset: 5px;
    text-decoration-thickness: 1px;
    text-decoration-color: var(--cNoir5);
}

/* ============================================
   CONTENEUR PRINCIPAL
   ============================================ */

.contenu {
    padding: var(--paddingPage);
}

/* ============================================
   LISTES
   ============================================ */

ul, ol {
    margin: 15px 0;
    padding-left: var(--retraitListeCourt);
}

li {
    margin: 8px 0;
}

/* ============================================
   BLOCS EXEMPLE ET TUTO
   ============================================ */

.exempleDiv, .tutoDiv {
    border-left: 2px solid var(--cAccent3);
    margin: 40px 2px;
    padding: var(--gapReduit) 0 var(--gapReduit) var(--retraitListeCourt);
}

/* ============================================
   HEADER ET NAVIGATION
   ============================================ */
/* Lien masqué à Google (`<span class="btUrl">`, composants/lienMasque.ts, décision chef de projet
   2026-10-18) : un <span> n'a ni le curseur d'un lien ni celui d'un bouton. */
.btUrl {
    cursor: pointer;
    user-select: none;
}


/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBRUE7O2lEQUVpRDs7QUFFakQ7SUFDSSxzQ0FBc0M7SUFDdEMsZ0JBQWdCO0lBQ2hCLHFFQUFxRTtBQUN6RTs7QUFFQTs7aURBRWlEO0FBQ2pEOzhFQUM4RTtBQUM5RTtJQUNJLGVBQWU7SUFDZixpQkFBaUI7QUFDckIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3MvYm9keVBhZ2UuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3MvaGF1dERlUGFnZS5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL2hhdXREZVBhZ2UuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3MvMDBfcmVzZXQuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3MvMTBfZm9udC5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL25veWF1L2Nzcy8zMV9jdGEuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3MvY29tcG9zYW50cy9ib3V0b25GZXJtZXR1cmUuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3MvY29tcG9zYW50cy9zdXJjb3VjaGVQcmV2aWV3LmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvbm95YXUvY3NzL2NvbXBvc2FudHMvamFpbWUuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3MvY29tcG9zYW50cy9ldGlxdWV0dGVKYWltZS5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL29mZnJlcy5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL3RpdHJlUGFnZS5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL2lsb3RSdWJyaXF1ZXMuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9jaGFwaXRyZXNIb3Jpem9udGFsLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3MvYXJ0aWNsZVZpdHJpbmUuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9wYWdlQ2hhcGl0cmVzLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3MvcGFnZVJ1YnJpcXVlLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3MvcGFnZUNhdGVnb3JpZXMuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3MvY29tcG9zYW50cy9tZW51U291c1J1YnJpcXVlcy5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL21lbnVTb3VzUnVicmlxdWVzLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3MvaWxvdFNjZW5lcy5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL2lsb3RTY2VuYXJpb3MuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9pbG90U2NlbmFyaW9zQmFuZGVhdS5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL25veWF1L2Nzcy9mYXEuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9ibG9jcy5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL2N0YURpc2NyZXQuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9maWx0cmVzLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3Mvc2NlbmFyaW9zQ2F0YWxvZ3VlLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvbm95YXUvc2FsbGUvZWNyYW4vY3NzL190b2dnbGVTY2VuZS5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL25veWF1L2Nzcy9zdHVkaW8vNTVfc2NlbmFyaW9Nb2RpZmllci5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL25veWF1L2Nzcy9zdHVkaW8vNTZfc2NlbmFyaW8vX3JlY2FwaXR1bGF0aWYuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy9ub3lhdS9jc3Mvc3R1ZGlvLzU2X3NjZW5hcmlvL19ldGlxdWV0dGVzLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvbm95YXUvY3NzL3N0dWRpby81NV9zY2VuYXJpb3NDb21wYXRpYmxlcy5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL25veWF1L2Nzcy9zdHVkaW8vNTZfc2NlbmFyaW8vX2Rlcm91bGUuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9wYWdlU2NlbmUuY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9wYWdlU2NlbmFyaW8uY3NzIiwid2VicGFjazovL3NvZi8uL2Fzc2V0cy92aXRyaW5lL2Nzcy9wYWdlTGFuZ3Vlcy5jc3MiLCJ3ZWJwYWNrOi8vc29mLy4vYXNzZXRzL3ZpdHJpbmUvY3NzL3BhZ2VDb250YWN0LmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3MvYmFzRGVQYWdlLmNzcyIsIndlYnBhY2s6Ly9zb2YvLi9hc3NldHMvdml0cmluZS9jc3Mvdml0cmluZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEJPRFkgUEFHRSAtIENvbnRlbmV1ciBwcmluY2lwYWxcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiNib2R5UGFnZSB7XG4gICAgbWF4LXdpZHRoOiAxMjgwcHg7XG4gICAgbWFyZ2luOiAxMHB4IGF1dG87XG59XG5cbmhyIHtcbiAgICBtYXJnaW46IDI1cHggMDtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1ib3JkZXIpO1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBCTE9DUyBQTEVJTkUgTEFSR0VVUlxuICAgI2JvZHlQYWdlIHJlc3RlIGxhIHLDqGdsZSA6IHVuZSBjb2xvbm5lIGRlIDEyODBweCBjZW50csOpZS4gVW4gYmxvYyBwZXV0IGVuIHNvcnRpciBwb3VyXG4gICBhbGxlciBkJ3VuIGJvcmQgw6AgbCdhdXRyZSBkZSBsYSBmZW7DqnRyZSAobWFyZ2VzIGxhdMOpcmFsZXMgbsOpZ2F0aXZlcywgdm9pciBsZSBiYW5kZWF1IGRlXG4gICBpbG90U2NlbmVzLmNzcykuIFNhIGxhcmdldXIgZXN0IGFsb3JzIDEwMHZ3LCBxdWkgQ09NUFRFIGxhIGJhcnJlIGRlIGTDqWZpbGVtZW50XG4gICB2ZXJ0aWNhbGUgOiBzYW5zIGxhIHLDqGdsZSBjaS1kZXNzb3VzLCBpbCBkw6lwYXNzZXJhaXQgw6AgZHJvaXRlIGV0IGxhIHBhZ2UgZ2FnbmVyYWl0IHVuXG4gICBkw6lmaWxlbWVudCBob3Jpem9udGFsLiBgY2xpcGAgY291cGUgc2FucyBjcsOpZXIgZGUgY29udGV4dGUgZGUgZMOpZmlsZW1lbnQsIGNvbnRyYWlyZW1lbnRcbiAgIMOgIGBoaWRkZW5gLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbmh0bWwge1xuICAgIG92ZXJmbG93LXg6IGNsaXA7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgSEFVVCBERSBQQUdFIC0gU3RydWN0dXJlIHBhcnRhZ8OpZVxuICAgRmljaGllciBub3lhdSA6IHN0cnVjdHVyZSBldCBsYXlvdXQgdW5pcXVlbWVudFxuICAgTGVzIGNvdWxldXJzIHNvbnQgZMOpZmluaWVzIGRhbnMgY2hhcXVlIGVzcGFjZVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2hhdXREZVBhZ2Uge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogNDJweDtcbiAgICBwYWRkaW5nOiAwIDQwcHg7XG4gICAgei1pbmRleDogMTAwMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExPR08gw4AgR0FVQ0hFXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4uaGVhZGVyTG9nbyB7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uaGVhZGVyTG9nbyBhIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uaGVhZGVyTG9nbyBzdmcge1xuICAgIGhlaWdodDogMzVweDtcbiAgICBhc3BlY3QtcmF0aW86IDI0NSAvIDM2O1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTkFWSUdBVElPTiBQUklOQ0lQQUxFIEFVIENFTlRSRVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2hlYWRlck5hdiB7XG4gICAgZmxleC1ncm93OiAxO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuI2hlYWRlck5hdiB1bCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbiNoZWFkZXJOYXYgdWwgbGkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuI2hlYWRlck5hdiB1bCBsaSBhIHtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuI2hlYWRlck5hdiB1bCBsaSBhOjpiZWZvcmUge1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDVweCA1cHggMCAwO1xuICAgIGJvdHRvbTogLTJweDtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGxlZnQ6IDhweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDhweDtcbiAgICB0b3A6IDRweDtcbiAgICB0cmFuc2l0aW9uOiAuM3M7XG4gICAgei1pbmRleDogLTE7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBCT1VUT05TIMOAIERST0lURVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2hlYWRlckFjdGlvbnMge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiB2YXIoLS1nYXBMYXJnZSk7IC8qIGFsaWduw6kgMTYgLT4gMjBweCAow6ljaGVsbGUgUE8gMjAyNi0wNy0xOCkgKi9cbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4jaGVhZGVyQWN0aW9ucyBhLFxuI2hlYWRlckFjdGlvbnMgLmJ0VXJsIHtcbiAgICBwYWRkaW5nOiAxMnB4IDI0cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQk9VVE9OIEJVUkdFUlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2J1cmdlckJ0biB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHotaW5kZXg6IDEwMDI7XG59XG5cbiNidXJnZXJCdG4gc3BhbiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzcHg7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XG4gICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xufVxuXG4vKiBTY2VuZSBkdSBidXJnZXIgZW4gWCAqL1xuI2J1cmdlckJ0bi5hY3RpdmUgc3BhbjpudGgtY2hpbGQoMSkge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMC41cHgpIHJvdGF0ZSg0NWRlZyk7XG59XG5cbiNidXJnZXJCdG4uYWN0aXZlIHNwYW46bnRoLWNoaWxkKDIpIHtcbiAgICBvcGFjaXR5OiAwO1xufVxuXG4jYnVyZ2VyQnRuLmFjdGl2ZSBzcGFuOm50aC1jaGlsZCgzKSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMC41cHgpIHJvdGF0ZSgtNDVkZWcpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTUVOVSBNT0JJTEUgRlVTSU9OTsOJIChuYXYgKyBhY3Rpb25zKVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogQ2FjaMOpIHBhciBkw6lmYXV0IHN1ciBkZXNrdG9wICovXG4jbW9iaWxlTWVudSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogT3ZlcmxheSBwb3VyIGZlcm1lciBsZSBtZW51ICovXG4jYnVyZ2VyT3ZlcmxheSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNPdmVybGF5KTtcbiAgICB6LWluZGV4OiA5OTg7XG59XG5cbiNidXJnZXJPdmVybGF5LmFjdGl2ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8qIENhY2hlciBsZXMgw6lsw6ltZW50cyBkZXN0aW7DqXMgYXUgYnVyZ2VyIG1lbnUgc3VyIGRlc2t0b3AgKi9cbi8qIGludXRpbGlzw6kgMjAyNi0wNi0xM1xuLmZvckJ1cmdlck1lbnUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4qL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTU9ERSBCVVJHRVIgRk9SQ8OJIChxdWFuZCBsZSBtZW51IGTDqWJvcmRlKVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgI2J1cmdlckJ0biB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgI2hlYWRlck5hdixcbiNoYXV0RGVQYWdlLmZvcmNlQnVyZ2VyICNoZWFkZXJBY3Rpb25zIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4jaGF1dERlUGFnZS5mb3JjZUJ1cmdlciAjbW9iaWxlTWVudSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogLTEwMCU7XG4gICAgd2lkdGg6IDgwJTtcbiAgICBtYXgtd2lkdGg6IDMwMHB4O1xuICAgIGhlaWdodDogMTAwdmg7XG4gICAgYm94LXNoYWRvdzogLTJweCAwIDhweCB2YXIoLS1jT21icmUpO1xuICAgIHRyYW5zaXRpb246IHJpZ2h0IDAuM3MgZWFzZTtcbiAgICB6LWluZGV4OiAxMDAxO1xuICAgIHBhZGRpbmctdG9wOiA2MHB4O1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbiNoYXV0RGVQYWdlLmZvcmNlQnVyZ2VyICNtb2JpbGVNZW51Lm9wZW4ge1xuICAgIHJpZ2h0OiAwO1xufVxuXG4jaGF1dERlUGFnZS5mb3JjZUJ1cmdlciAjbW9iaWxlTWVudSB1bCB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbn1cblxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgI21vYmlsZU1lbnUgdWwgbGkgYSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZzogMTZweCAyNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2U7XG59XG5cbi8qIGludXRpbGlzw6kgMjAyNi0wNi0xM1xuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgLm1vYmlsZU1lbnVBY3Rpb25zIHtcbiAgICBwYWRkaW5nOiAxNnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcERlZmF1dCk7XG59XG5cbiNoYXV0RGVQYWdlLmZvcmNlQnVyZ2VyIC5tb2JpbGVNZW51QWN0aW9ucyBhLFxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgLm1vYmlsZU1lbnVBY3Rpb25zIC5idFVybCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcbn1cbiovXG5cbi8qIGludXRpbGlzw6kgMjAyNi0wNi0xM1xuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgLmZvckJ1cmdlck1lbnUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFJFU1BPTlNJVkUgLSBUQUJMRVQgRVQgTU9CSUxFXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5AbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7XG4gICAgI2hhdXREZVBhZ2Uge1xuICAgICAgICBwYWRkaW5nOiAwIDE1cHg7XG4gICAgfVxuXG4gICAgI2hlYWRlck5hdiB1bCB7XG4gICAgICAgIGdhcDogdmFyKC0tZ2FwTGFyZ2UpOyAvKiBhbGlnbsOpIDE2IC0+IDIwcHggKMOpY2hlbGxlIFBPIDIwMjYtMDctMTgpICovXG4gICAgfVxuXG4gICAgI2hlYWRlckFjdGlvbnMgYSxcbiNoZWFkZXJBY3Rpb25zIC5idFVybCB7XG4gICAgICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XG4gICAgI2hhdXREZVBhZ2Uge1xuICAgICAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICB9XG5cbiAgICAvKiBBZmZpY2hlciBsZSBib3V0b24gYnVyZ2VyICovXG4gICAgI2J1cmdlckJ0biB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgLyogQ2FjaGVyIG5hdiBldCBhY3Rpb25zIGRlc2t0b3AgKi9cbiAgICAjaGVhZGVyTmF2LFxuICAgICNoZWFkZXJBY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG5cbiAgICAvKiBBZmZpY2hlciBsZSBtZW51IG1vYmlsZSAqL1xuICAgICNtb2JpbGVNZW51IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogLTEwMCU7XG4gICAgICAgIHdpZHRoOiA4MCU7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGhlaWdodDogMTAwdmg7XG4gICAgICAgIGJveC1zaGFkb3c6IC0ycHggMCA4cHggdmFyKC0tY09tYnJlKTtcbiAgICAgICAgdHJhbnNpdGlvbjogcmlnaHQgMC4zcyBlYXNlO1xuICAgICAgICB6LWluZGV4OiAxMDAxO1xuICAgICAgICBwYWRkaW5nLXRvcDogNjBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICB9XG5cbiAgICAjbW9iaWxlTWVudS5vcGVuIHtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgfVxuXG4gICAgI21vYmlsZU1lbnUgdWwge1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuXG4gICAgI21vYmlsZU1lbnUgdWwgbGkgYSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlO1xuICAgIH1cblxuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xM1xuICAgIC5tb2JpbGVNZW51QWN0aW9ucyB7XG4gICAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogdmFyKC0tZ2FwRGVmYXV0KTtcbiAgICB9XG5cbiAgICAubW9iaWxlTWVudUFjdGlvbnMgYSxcbiAgICAubW9iaWxlTWVudUFjdGlvbnMgLmJ0VXJsIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xuICAgIH1cbiAgICAqL1xuXG4gICAgLmhlYWRlckxvZ28gc3ZnIHtcbiAgICAgICAgbWF4LWhlaWdodDogNDBweDtcbiAgICB9XG5cbiAgICAvKiBBZmZpY2hlciBsZXMgw6lsw6ltZW50cyAuZm9yQnVyZ2VyTWVudSBkYW5zIGxlIG1lbnUgbW9iaWxlICovXG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzXG4gICAgLmZvckJ1cmdlck1lbnUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgKi9cbn0iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgSEFVVCBERSBQQUdFIC0gVml0cmluZVxuICAgSW1wb3J0IGRlIGxhIHN0cnVjdHVyZSBub3lhdSArIGNvdWxldXJzIHZpdHJpbmVcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbkBpbXBvcnQgJy4uLy4uL25veWF1L2Nzcy9oYXV0RGVQYWdlLmNzcyc7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDT1VMRVVSUyBWSVRSSU5FXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4jaGF1dERlUGFnZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0JnKTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY0JsYW5jMyk7XG59XG5cbi8qIE5hdmlnYXRpb24gKi9cbiNoZWFkZXJOYXYgdWwge1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xufVxuXG4jaGVhZGVyTmF2IHVsIGxpIGEge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuI2hlYWRlck5hdiB1bCBsaSBhOmhvdmVyOjpiZWZvcmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbn1cblxuI2hlYWRlck5hdiB1bCBsaSBhOmhvdmVyIHtcbiAgICBjb2xvcjogdmFyKC0tY0JsYW5jKTtcbn1cblxuI2hlYWRlck5hdiB1bCBsaSBhLmFjdGl2ZTo6YmVmb3JlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jQWNjZW50Myk7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDA7XG59XG5cbiNoZWFkZXJOYXYgdWwgbGkgYS5hY3RpdmUge1xuICAgIGNvbG9yOiB2YXIoLS1jQmxhbmMpO1xufVxuXG4vKiDDiXRhdCBlc3RvbXDDqSBxdWFuZCBvbiBzdXJ2b2xlIHVuIGF1dHJlIG9uZ2xldCAqL1xuI2hlYWRlck5hdiB1bCBsaSBhLmFjdGl2ZS5lc3RvbXBlOjpiZWZvcmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbiAgICBsZWZ0OiAycHg7XG4gICAgcmlnaHQ6IDFweDtcbiAgICB0b3A6IDJweDtcbiAgICBvcGFjaXR5OiAuODtcbn1cblxuLyogT25nbGV0IFRhcmlmcyA6IG9yLCBjb21tZSBsZXMgYm91dG9ucyBkZSBsYSBwYWdlIFRhcmlmc1xuICAgKHN1cnZvbCBldCBhY3RpZiksIHBvdXIgbmUgcGFzIGFqb3V0ZXIgdW5lIGNvdWxldXIgZGUgcGx1cy4gKi9cbiNoZWFkZXJOYXYgdWwgbGkgYS5uYXZUYXJpZnM6aG92ZXI6OmJlZm9yZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY09yNCk7XG59XG5cbiNoZWFkZXJOYXYgdWwgbGkgYS5uYXZUYXJpZnM6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS1jT3J0KTtcbn1cblxuI2hlYWRlck5hdiB1bCBsaSBhLm5hdlRhcmlmcy5hY3RpdmU6OmJlZm9yZSxcbiNoZWFkZXJOYXYgdWwgbGkgYS5uYXZUYXJpZnMuYWN0aXZlLmVzdG9tcGU6OmJlZm9yZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY09yMyk7XG59XG5cbiNoZWFkZXJOYXYgdWwgbGkgYS5uYXZUYXJpZnMuYWN0aXZlIHtcbiAgICBjb2xvcjogdmFyKC0tY09ydCk7XG59XG5cbi8qIEJvdXRvbnMgYWN0aW9ucyAqL1xuI2hlYWRlckFjdGlvbnMgYSxcbiNoZWFkZXJBY3Rpb25zIC5idFVybCB7XG4gICAgZm9udDogdmFyKC0tZk1lbnUxNCk7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4vKiBMZSBib3V0b24gZGUgbCdlbi10w6p0ZSwgcsOoZ2xlIGRlIGJhc2UgOiBibGV1IGFkbWluaXN0cmF0aW9uIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXRcbiAgIDIwMjYtMDktMDYpLiBMYSBjb3VsZXVyIHZpZW50IGRlIGxhIGNsYXNzZSBhY2NlbnRBZG1pbmlzdHJhdGlvbiAoMTBfZm9udC5jc3MpIDogaWNpIG9uXG4gICBsaXQgQWNjZW50LCBvbiBuJ8OpY3JpdCBhdWN1bmUgdGVpbnRlLiBEZXB1aXMgbGUgMjAyNi0wOS0xNiwgbCfDqXRhdCBOT04gQ09OTkVDVMOJIHBhc3NlIGVuXG4gICBqYXVuZSAoLmJ0blNlQ29ubmVjdGVyLCBwbHVzIGJhcykg4oCUIGNlIGJsZXUgbmUgc2VydCBwbHVzIHF1J2F1IHN1cnZvbCBkZSDCqyBNb24gY29tcHRlIMK7LiAqL1xuI2hlYWRlckFjdGlvbnMgI2J0bkFjY2VzU2VydmljZXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudHQpO1xufVxuXG4jaGVhZGVyQWN0aW9ucyAjYnRuQWNjZXNTZXJ2aWNlczpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDQpO1xuICAgIGNvbG9yOiB2YXIoLS1jQWNjZW50dCk7XG59XG5cbiNoZWFkZXJBY3Rpb25zICNidG5BY2Nlc1NlcnZpY2VzLmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDMpO1xuICAgIGNvbG9yOiB2YXIoLS1jQWNjZW50dCk7XG59XG5cbi8qIE5PTiBDT05ORUNUw4kgOiDCqyBTZSBjb25uZWN0ZXIgwrssIGVuIEpBVU5FLCB0ZXh0ZSBOT0lSIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXRcbiAgIDIwMjYtMDktMTYpLiBMZSBibGV1IGRlcyBkZXV4IMOpdGF0cyBuZSBkaXNhaXQgcGFzIGF1IHZpc2l0ZXVyIHF1J2lsIMOpdGFpdCBkw6ljb25uZWN0w6kg4oCUXG4gICBldCB1biB2aXNpdGV1ciBkw6ljb25uZWN0w6kgdm9pdCBsZXMgY8WTdXJzIMKrIEonYWltZSDCuyBzYW5zIHBvdXZvaXIgbGVzIHRvdWNoZXIsIHNhbnNcbiAgIGNvbXByZW5kcmUgcG91cnF1b2kuIExlIGphdW5lIGVzdCBjZWx1aSBkZSDCqyBUYXJpZnMgwrsgKC0tY09yMyBhdSByZXBvcywgLS1jT3I0IGF1XG4gICBzdXJ2b2wpIDogZGV1eCBjb3VsZXVycyBwb3VyIGRldXggw6l0YXRzLCBsaXNpYmxlcyBkZSBsb2luLlxuICAgVGV4dGUgLS1jTm9pcjEsIHBhcyAtLWNPcnQgKGJsYW5jKSBjb21tZSBkYW5zIMKrIFRhcmlmcyDCuyA6IGxlIGJsYW5jIHN1ciBjZSBqYXVuZSBtYW5xdWVcbiAgIGRlIGNvbnRyYXN0ZSAobGUgY2hlZiBkZSBwcm9qZXQgbGUgcmVsw6h2ZSBwb3VyIMKrIFRhcmlmcyDCuywgcXVpIHJlc3RlIGVuIGJsYW5jIHBvdXJcbiAgIGwnaW5zdGFudCkuIExlIG5vaXIgc3VyIC0tY09yMyBldCBzdXIgLS1jT3I0IGVzdCBsYXJnZW1lbnQgbGlzaWJsZS5cbiAgIFVuZSBjbGFzc2UgZGUgcGx1cyBxdWUgbGVzIHLDqGdsZXMgYmxldWVzIGNpLWRlc3N1cyA6IGVsbGUgbCdlbXBvcnRlIHF1ZWwgcXVlIHNvaXQgbCdvcmRyZS4gKi9cbiNoZWFkZXJBY3Rpb25zICNidG5BY2Nlc1NlcnZpY2VzLmJ0blNlQ29ubmVjdGVyLFxuI2hlYWRlckFjdGlvbnMgI2J0bkFjY2VzU2VydmljZXMuYnRuU2VDb25uZWN0ZXIuYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jT3IzKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cblxuI2hlYWRlckFjdGlvbnMgI2J0bkFjY2VzU2VydmljZXMuYnRuU2VDb25uZWN0ZXI6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNPcjQpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG4vKiBDb25uZWN0w6kgOiBsZSBib3V0b24gZGV2aWVudCDCqyBNb24gY29tcHRlIMK7LCBuZXV0cmUgYXUgcmVwb3MsIGJsZXUgYXUgc3Vydm9sLiAqL1xuI2hlYWRlckFjdGlvbnMgI2J0bkFjY2VzU2VydmljZXMuYnRuTW9uQ29tcHRlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cblxuI2hlYWRlckFjdGlvbnMgI2J0bkFjY2VzU2VydmljZXMuYnRuTW9uQ29tcHRlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jQWNjZW50NCk7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnR0KTtcbn1cblxuLyogQnVyZ2VyIGJ1dHRvbiAqL1xuI2J1cmdlckJ0biBzcGFuIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jTm9pcjMpO1xufVxuXG4uYnVyZ2VyQnRuRGFyayAjYnVyZ2VyQnRuIHNwYW4sXG4jYnVyZ2VyQnRuLmJ1cmdlckJ0bkRhcmsgc3BhbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIE1FTlUgTU9CSUxFIC0gQ09VTEVVUlMgVklUUklORVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgI21vYmlsZU1lbnUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNCZyk7XG59XG5cbiNoYXV0RGVQYWdlLmZvcmNlQnVyZ2VyICNtb2JpbGVNZW51IHVsIGxpIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY0JsYW5jNSk7XG59XG5cbiNoYXV0RGVQYWdlLmZvcmNlQnVyZ2VyICNtb2JpbGVNZW51IHVsIGxpIGEge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgI21vYmlsZU1lbnUgdWwgbGkgYTpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDMpO1xuICAgIGNvbG9yOiB2YXIoLS1jQmxhbmMpO1xufVxuXG4jaGF1dERlUGFnZS5mb3JjZUJ1cmdlciAjbW9iaWxlTWVudSB1bCBsaSBhLmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDMpO1xuICAgIGNvbG9yOiB2YXIoLS1jQmxhbmMpO1xufVxuXG4jaGF1dERlUGFnZS5mb3JjZUJ1cmdlciAjbW9iaWxlTWVudSB1bCBsaSBhLm5hdlRhcmlmczpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY09yNCk7XG4gICAgY29sb3I6IHZhcigtLWNPcnQpO1xufVxuXG4jaGF1dERlUGFnZS5mb3JjZUJ1cmdlciAjbW9iaWxlTWVudSB1bCBsaSBhLm5hdlRhcmlmcy5hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNPcjMpO1xuICAgIGNvbG9yOiB2YXIoLS1jT3J0KTtcbn1cblxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgLm1vYmlsZU1lbnVBY3Rpb25zIGEsXG4jaGF1dERlUGFnZS5mb3JjZUJ1cmdlciAubW9iaWxlTWVudUFjdGlvbnMgLmJ0VXJsIHtcbiAgICBmb250OiB2YXIoLS1mTWVudTE0KTtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi8qIExlIGJvdXRvbiBkJ2FjY8OocyBhdXggc2VydmljZXMgZHUgbWVudSBtb2JpbGUgOiBibGV1IGFkbWluaXN0cmF0aW9uLCBjb21tZSBzb24ganVtZWF1XG4gICBkdSBidXJlYXUgKCNidG5BY2Nlc1NlcnZpY2VzKSDigJQgbGEgdGVpbnRlIHZpZW50IGRlIGxhIGNsYXNzZSBhY2NlbnRBZG1pbmlzdHJhdGlvbiBwb3PDqWVcbiAgIHN1ciBsZSBsaWVuIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNikuIFJlbXBsYWNlIGxlcyByw6hnbGVzICNtb2JpbGVDb25uZXhpb24gL1xuICAgI21vYmlsZUluc2NyaXB0aW9uLCBkZXV4IGJvdXRvbnMgcXVpIG4nZXhpc3RhaWVudCBwbHVzIGRhbnMgbGUgZ2FiYXJpdC4gKi9cbiNoYXV0RGVQYWdlLmZvcmNlQnVyZ2VyICNtb2JpbGVBY2Nlc1NlcnZpY2VzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jQWNjZW50Myk7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnR0KTtcbn1cblxuI2hhdXREZVBhZ2UuZm9yY2VCdXJnZXIgI21vYmlsZUFjY2VzU2VydmljZXM6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNBY2NlbnQ0KTtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudHQpO1xufVxuXG4vKiBOb24gY29ubmVjdMOpIDogbGUgamF1bmUgZXQgbGUgbm9pciBkdSBib3V0b24gZHUgYnVyZWF1ICgjYnRuQWNjZXNTZXJ2aWNlcy5idG5TZUNvbm5lY3RlcikuICovXG4jaGF1dERlUGFnZS5mb3JjZUJ1cmdlciAjbW9iaWxlQWNjZXNTZXJ2aWNlcy5idG5TZUNvbm5lY3RlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY09yMyk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbiNoYXV0RGVQYWdlLmZvcmNlQnVyZ2VyICNtb2JpbGVBY2Nlc1NlcnZpY2VzLmJ0blNlQ29ubmVjdGVyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jT3I0KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFJFU1BPTlNJVkUgTU9CSUxFIC0gQ09VTEVVUlNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAgICNtb2JpbGVNZW51IHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0JnKTtcbiAgICB9XG5cbiAgICAjbW9iaWxlTWVudSB1bCBsaSB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jQmxhbmM1KTtcbiAgICB9XG5cbiAgICAjbW9iaWxlTWVudSB1bCBsaSBhIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG4gICAgICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgfVxuXG4gICAgI21vYmlsZU1lbnUgdWwgbGkgYTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWNCbGFuYyk7XG4gICAgfVxuXG4gICAgI21vYmlsZU1lbnUgdWwgbGkgYS5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jQWNjZW50Myk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1jQmxhbmMpO1xuICAgIH1cblxuICAgICNtb2JpbGVNZW51IHVsIGxpIGEubmF2VGFyaWZzOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY09yNCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1jT3J0KTtcbiAgICB9XG5cbiAgICAjbW9iaWxlTWVudSB1bCBsaSBhLm5hdlRhcmlmcy5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jT3IzKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWNPcnQpO1xuICAgIH1cblxuICAgIC5tb2JpbGVNZW51QWN0aW9ucyBhLFxuICAgIC5tb2JpbGVNZW51QWN0aW9ucyAuYnRVcmwge1xuICAgICAgICBmb250OiB2YXIoLS1mTWVudTE0KTtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIH1cblxuICAgIC8qIE3Dqm1lIGJvdXRvbiwgbcOqbWUgYmxldSwgc3VyIMOpY3JhbiDDqXRyb2l0IHNhbnMgY2xhc3NlIGZvcmNlQnVyZ2VyLiAqL1xuICAgICNtb2JpbGVBY2Nlc1NlcnZpY2VzIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDMpO1xuICAgICAgICBjb2xvcjogdmFyKC0tY0FjY2VudHQpO1xuICAgIH1cblxuICAgICNtb2JpbGVBY2Nlc1NlcnZpY2VzOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDQpO1xuICAgICAgICBjb2xvcjogdmFyKC0tY0FjY2VudHQpO1xuICAgIH1cblxuICAgIC8qIE5vbiBjb25uZWN0w6kgOiBqYXVuZSBldCBub2lyLCBjb21tZSBzdXIgbGUgYnVyZWF1LiAqL1xuICAgICNtb2JpbGVBY2Nlc1NlcnZpY2VzLmJ0blNlQ29ubmVjdGVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY09yMyk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIH1cblxuICAgICNtb2JpbGVBY2Nlc1NlcnZpY2VzLmJ0blNlQ29ubmVjdGVyOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY09yNCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIH1cbn0iLCIqLCA6OmFmdGVyLCA6OmJlZm9yZSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuYm9keSB7XG4gICAgbWFyZ2luOiAwO1xufVxuXG51bCB7XG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAwO1xufSIsImh0bWwge1xuICAgIC8qIElsIGVzdCBpbnRlcmRpdCBkZSByYWpvdXRlciBkZXMgY291bGV1cnMgc2FucyBkZW1hbmRlciBsJ2FjY29yZCBkdSBQTyAqL1xuICAgIC0tY0JsYW5jMTogdmFyKC0tY0JsYW5jKTtcbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY0JsYW5jMXA6ICNFMEUwRTA7ICovXG4gICAgLS1jQmxhbmMwMjogI0Y1RjVGNTtcbiAgICAtLWNCbGFuYzI6ICNGMEYwRjA7XG4gICAgLS1jQmxhbmMwMzogI2RjZTFlYTtcbiAgICAtLWNCbGFuYzM6ICNDQ0NGQ0M7XG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNCbGFuYzQ6ICNBQUFGQUE7ICovXG4gICAgLS1jQmxhbmM1OiAjOTk5Qzk5O1xuXG5cbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgIENPVUxFVVJTIFRFWFRFIE5PSVIgLSBVVElMSVNBVElPTiBPQkxJR0FUT0lSRVxuICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgICAvKiAtLWNOb2lyMSA6IMOJTMOJTUVOVFMgRCdFTVBIQVNFXG4gICAgICAgLSBUaXRyZXMgOiBoMSwgaDIsIGgzXG4gICAgICAgLSBUZXh0ZSBkZXMgYm91dG9ucyAocXVhbmQgcGFzIGRlIGNvdWxldXIgZMOpZmluaWUpXG4gICAgICAgLSBMYWJlbHMgb2JsaWdhdG9pcmVzIChyZXF1aXJlZClcbiAgICAgICAtIE1lbnVzIGRlIG5hdmlnYXRpb25cbiAgICAgICAtIENoZWNrYm94IGV0IHJhZGlvIGJvdXRvbnNcbiAgICAgICAtIFZhbGV1ciBwcmluY2lwYWxlIGRhbnMgbGVzIGNvbXB0ZXVycyAoZXg6IFwiM1wiIGRhbnMgXCIzIC8gNVwiKVxuICAgICovXG4gICAgLS1jTm9pcjE6ICMxODE4MTg7XG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNOb2lyMW86ICMxODE4MTg1NTsgKi9cblxuICAgIC8qIC0tY05vaXIyIDogQ09SUFMgREUgVEVYVEVcbiAgICAgICAtIFBhcmFncmFwaGVzIDxwPlxuICAgICAgIC0gTGlzdGVzIDxsaT4sIMOpbnVtw6lyYXRpb25zXG4gICAgICAgLSBMYWJlbHMgZmFjdWx0YXRpZnNcbiAgICAgICAtIFRleHRlIHNhaXNpIGRhbnMgbGVzIGlucHV0c1xuICAgICAgIC0gVGl0cmVzIGg0LCBoNSwgaDZcbiAgICAgICAtIFZhbGV1ciBzZWNvbmRhaXJlIGRhbnMgbGVzIGNvbXB0ZXVycyAoZXg6IFwiLyA1XCIgZGFucyBcIjMgLyA1XCIpXG4gICAgKi9cbiAgICAtLWNOb2lyMjogIzI4MjgyODtcblxuICAgIC8qIC0tY05vaXIzIDogVEVYVEUgVEVSVElBSVJFXG4gICAgICAgLSBQbGFjZWhvbGRlcnNcbiAgICAgICAtIE1lc3NhZ2VzIGQnYWlkZSBkaXNjcmV0c1xuICAgICAgIC0gVGV4dGUgZMOpc2FjdGl2w6lcbiAgICAqL1xuICAgIC0tY05vaXIzOiAjNTU1O1xuXG4gICAgLyogLS1jTm9pcjQtNSA6IFRFWFRFIFRSw4hTIEFUVMOJTlXDiVxuICAgICAgIC0gw4lsw6ltZW50cyBkw6lzYWN0aXbDqXNcbiAgICAgICAtIFRleHRlIGTDqWNvcmF0aWZcbiAgICAqL1xuICAgIC0tY05vaXI0OiAjOTk5O1xuICAgIC0tY05vaXI1OiAjQkJCO1xuICAgIC0tY0JsYW5jOiAjRkZGO1xuICAgIC0tY05vaXI6ICMwMDA7XG4gICAgLS1jVGV4dGUxOiAjMjIyO1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1jVGV4dGUyOiAjNDQ0OyAqL1xuICAgIC0tY0Zvcm06ICMwMDA7XG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNGb3JtX2I6ICM1NTU7ICovXG5cbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgIFBBTEVUVEVTIERFIFLDlExFIOKAlCB1bmUgc2V1bGUgZm9ybWUsIDggcGFsaWVycywgdG91am91cnMgbm9tbcOpcyBwYXJlaWxcbiAgICAgICAwIGZvbmQgdHLDqHMgcMOibGUgwrcgMSBmb25kIHDDomxlIMK3IDIgYm9yZHVyZSAvIG1veWVuIMK3IDMgY291bGV1ciBwbGVpbmUgKGJvdXRvbiwgbGllbixcbiAgICAgICBvbmdsZXQgYWN0aWYsIGluZGljYXRldXIpIMK3IDQgZm9uY8OpIC8gc3Vydm9sIMK3IF9hIGTDqWdyYWTDqSDCtyBfYWggZMOpZ3JhZMOpIGF1IHN1cnZvbCDCt1xuICAgICAgIHQgdGV4dGUgcG9zw6kgc3VyIGxhIGNvdWxldXIgcGxlaW5lLlxuICAgICAgIEFjY2VudCBlc3QgbGEgY291bGV1ciBkZSBsJ2VzcGFjZSBvw7kgbCdvbiBlc3QgOiBlbGxlIGNoYW5nZSBwYXIgdW5lIGNsYXNzZSBzdXIgPGJvZHk+XG4gICAgICAgKHZvaXIgbGUgYmxvYyBhcHLDqHMgaHRtbHt9KS4gT3IsIFJvdWdlIGV0IFN1Y2NlcyBuZSBjaGFuZ2VudCBqYW1haXMuXG4gICAgICAgRMOpY2lzaW9uIFBPIDIwMjYtMDktMDUuIEF1Y3VuZSBhdXRyZSBjb3VsZXVyIGRlIHLDtGxlIG4nZXN0IGFkbWlzZS5cbiAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgLyogQWNjZW50IDogdm9pciBsZSBibG9jIGJvZHkgeyB9IGFwcsOocyBodG1sIHsgfS4gRWxsZSB2aXQgc3VyIGJvZHksIHBhcyBpY2kg4oCUIHVuZVxuICAgICAgIHZhcmlhYmxlIGTDqXJpdsOpZSAoZMOpZ3JhZMOpLCBoYWxvKSBzZSBjYWxjdWxlIGzDoCBvw7kgZWxsZSBlc3QgZMOpY2xhcsOpZSwgZXQgZG9pdCBkb25jXG4gICAgICAgw6p0cmUgZMOpY2xhcsOpZSBzdXIgbGUgbcOqbWUgw6lsw6ltZW50IHF1ZSBsYSBjbGFzc2UgcXVpIGNoYW5nZSBsYSBjb3VsZXVyLiAqL1xuXG4gICAgLyogT3Ig4oCUIHMnaW5zY3JpcmUsIGNvbm5leGlvbiwgdGFyaWYsIG1pc2UgZW4gYXZhbnQgKi9cbiAgICAtLWNPcjA6ICNmZWZjZTg7XG4gICAgLS1jT3IxOiAjZmVmM2M3O1xuICAgIC0tY09yMjogI2Y1ZDk2YjtcbiAgICAtLWNPcjM6ICNGRkQ4MTQ7IC8qIGwnb3IgZCdBbWF6b24sIHRleHRlIGZvbmPDqSBkZXNzdXMgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTEwLTA3KSAqL1xuICAgIC0tY09yNDogI0ZGQ0UxMjsgLyogc29uIHN1cnZvbCAqL1xuICAgIC0tY09yX2E6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHZhcigtLWNPcjMpLCB2YXIoLS1jT3I0KSAxMDAlKTtcbiAgICAtLWNPcl9haDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdmFyKC0tY09yMyksIHZhcigtLWNPcjMpIDEwMCUpO1xuICAgIC0tY09ydDogIzE4MTgxODsgLyogZm9uY8OpIDogbGUgYmxhbmMgc3VyIC0tY09yMyBuZSBmYWlzYWl0IHF1ZSAyLDA6MSBkZSBjb250cmFzdGUsIDgsODoxIGFpbnNpIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0xMC0wNykgKi9cblxuICAgIC8qIFJvdWdlIOKAlCBlcnJldXIsIGFsZXJ0ZSwgc3VwcHJlc3Npb24sIGdlc3RlIGRhbmdlcmV1eCAqL1xuICAgIC0tY1JvdWdlMDogI2ZkZjNmMjtcbiAgICAtLWNSb3VnZTE6ICNmYmUyZGY7XG4gICAgLS1jUm91Z2UyOiAjZjVhYWEzO1xuICAgIC0tY1JvdWdlMzogI2YxNWI0ZTtcbiAgICAtLWNSb3VnZTQ6ICM5MzAwMDA7XG4gICAgLS1jUm91Z2VfYTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdmFyKC0tY1JvdWdlMyksIHZhcigtLWNSb3VnZTQpIDEwMCUpO1xuICAgIC0tY1JvdWdlX2FoOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB2YXIoLS1jUm91Z2UzKSwgdmFyKC0tY1JvdWdlMykgMTAwJSk7XG4gICAgLS1jUm91Z2V0OiAjRkZGO1xuXG4gICAgLyogQ8WTdXIgwqsgSidhaW1lIMK7IOKAlCB1biByb3VnZSDDoCBsdWksIHNhbmcsIGJvcmRlYXV4IGZvbmPDqSA6IGxlIHJvdWdlIGRlIGxhIGZhbWlsbGUgZGl0XG4gICAgICAgbCdhbGVydGUgZXQgbGUgZGFuZ2VyLCBwYXMgbCdhZmZlY3Rpb24gKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KS5cbiAgICAgICBEZXV4IGNyYW5zLCBjb21tZSBsZXMgYXV0cmVzIGZhbWlsbGVzIDogbGUgcMOibGUgZHUgc3Vydm9sLCBsYSBjb3VsZXVyIGR1IGPFk3VyLiAqL1xuICAgIC0tY0NvZXVyMDogI2Y2ZTRlNztcbiAgICAtLWNDb2V1cjM6ICNjMTE5MmY7XG5cbiAgICAvKiBTdWNjZXMg4oCUIHZhbGlkYXRpb24sIGNvbmZpcm1hdGlvbiAqL1xuICAgIC0tY1N1Y2NlczA6ICNmMGZiZmY7XG4gICAgLS1jU3VjY2VzMTogI2RkZjFmYTtcbiAgICAtLWNTdWNjZXMyOiAjOTNkM2VhO1xuICAgIC0tY1N1Y2NlczM6ICMwZTlkYzk7XG4gICAgLS1jU3VjY2VzNDogIzBiNWY3YTtcbiAgICAtLWNTdWNjZXNfYTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdmFyKC0tY1N1Y2NlczMpLCB2YXIoLS1jU3VjY2VzNCkgMTAwJSk7XG4gICAgLS1jU3VjY2VzX2FoOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB2YXIoLS1jU3VjY2VzMyksIHZhcigtLWNTdWNjZXMzKSAxMDAlKTtcbiAgICAtLWNTdWNjZXN0OiAjRkZGO1xuXG4gICAgLS1jQmFja2dyb3VuZDogdmFyKC0tY0JsYW5jKTtcblxuICAgIC8qIExlIGJhbmRlYXUgZGVzIGFwZXLDp3VzIChwYWdlUnVicmlxdWUuY3NzLCDiiaUgMTYwMHB4KS4gVU4gUExBVEVBVSBVTkkgQVUgQ0VOVFJFLCBsZSBkw6lncmFkw6lcbiAgICAgICBzdXIgbGVzIGJvcmRzIHNldWxlbWVudCAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMjQpIDogbCdhbmNpZW4gZMOpZ3JhZMOpIGFsbGFpdFxuICAgICAgIGR1IGdyaXMgZGVzIGJvcmRzIGF1IGJsYW5jIGR1IGNlbnRyZSwgZXQgZGVzIGNhcnRlcyBibGFuY2hlcyBpZGVudGlxdWVzIHBhcmFpc3NhaWVudFxuICAgICAgIGJsYW5jaGVzIHN1ciBsZSBncmlzIGV0IHRlcm5lcyBzdXIgbGUgYmxhbmMuIFN1ciBsZSBwbGF0ZWF1LCB0b3V0ZXMgc2UgZMOpdGFjaGVudFxuICAgICAgIHBhcmVpbC4gRGV1eCBoYWxvcyBkZSBjb3VsZXVyLCB0ZW51cyBkYW5zIGxlcyBib3JkcywgZG9ubmVudCB1biBwZXUgZGUgdmllIDogbGUgYmxldVxuICAgICAgIGR1IHNpdGUgZW4gaGF1dCDDoCBnYXVjaGUsIGwnb3JhbmdlIGRlcyBpbGx1c3RyYXRpb25zIGVuIGJhcyDDoCBkcm9pdGUuICovXG4gICAgLS1jQmFja2dyb3VuZEdyYW5kOlxuICAgICAgICByYWRpYWwtZ3JhZGllbnQoMTQlIDQwJSBhdCAwJSAyNSUsICM0MzZiYzExZiwgdHJhbnNwYXJlbnQpLFxuICAgICAgICByYWRpYWwtZ3JhZGllbnQoMTQlIDQwJSBhdCAxMDAlIDc1JSwgI2YzOWMzNDFmLCB0cmFuc3BhcmVudCksXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgI0U4RUJGMCAwJSwgI0Y0RjVGNyAxMiUsICNGNEY1RjcgODglLCAjRThFQkYwIDEwMCUpO1xuXG4gICAgLyogTGF5b3V0ICovXG4gICAgLS1sYXJnZXVyOiAxMzYwcHg7XG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLW1heFdpZHRoOiA3NjBweDsgKi9cbiAgICAtLWNCZzogdmFyKC0tY0JsYW5jKTtcbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY0JnX2I6ICNDQ0M7ICovXG5cbiAgICAvKiBOb2lyIHRyYW5zcGFyZW50IOKAlCBvbWJyZXMgKi9cbiAgICAtLWNPbWJyZTogIzAwMDI7ICAgICAgICAgICAgLyogZW52aXJvbiAxNSUgKi9cbiAgICAtLWNPbWJyZUZvcnRlOiAjMDAwNDsgICAgICAgLyogZW52aXJvbiAzMCUgKi9cblxuICAgIC8qIHRyYW5zcGFyZW50IOKAlCBvdmVybGF5cyAqL1xuICAgIC0tY092ZXJsYXk6ICMwMDA4OyAgICAgICAgICAvKiBlbnZpcm9uIDUwJSAqL1xuICAgIC0tY0JsYW5jT3ZlcmxheTogI0ZGRkM7ICAgICAvKiBlbnZpcm9uIDgwJSAqL1xuICAgIC0tY0JsYW5jVmVycmU6ICNGRkZGRkY4QzsgICAvKiBlbnZpcm9uIDU1JSDigJQgdmVycmUgZMOpcG9saSwgdG91am91cnMgYXZlYyB1biBmbG91IChiYXJyZSBldCBidWxsZSBkZSBsJ2FwZXLDp3UpICovXG5cbiAgICAvKiBPbWJyZXMgY29tcG9zw6llcyAqL1xuICAgIC0tb21icmVQb3J0ZWU6IDAgNHB4IDEycHggdmFyKC0tY09tYnJlKTtcbiAgICAtLW9tYnJlUG9ydGVlMjogMCAwcHggMjVweCAjMDAwO1xuICAgIC0tb21icmVNb2RhbGU6IDAgMTBweCA0MHB4IHZhcigtLWNPbWJyZUZvcnRlKTtcbiAgICAtLW9tYnJlSW50ZXJuZTogMCAwIDEwcHggMTBweCBpbnNldCB2YXIoLS1jQmxhbmMwMik7XG5cbiAgICAvKiBDb3VsZXVycyBOb2lyIGdyYWRpZW50cyAqL1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1jTm9pcjNfYTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzUwNTg1OCwgIzMwMzgzOCAxMDAlKTsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY05vaXIzX2FoOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNTA1ODU4LCAjNTA1ODU4IDEwMCUpOyAqL1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1jTm9pcjNfYWhMaWdodDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzcwNzg3OCwgIzcwNzg3OCAxMDAlKTsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY05vaXIzX2F0OiAjRkZGOyAqL1xuXG5cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tc0FsZXJ0ZV9zOiAjREVDNEM0OyAqL1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1jVHV0bzogI0M2RjsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY1R1dG9fdDogIzAwMDsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY1R1dG9fYWg6ICNkNzlhZjI7ICovXG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNCbGFuYzFfdDogIzE4MTgxODsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY1BsYWNlaG9kZXI6ICM4ODg7ICovXG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNGb3JtX3M6ICNGRkY7ICovXG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWJzQ3RhOiAwIDdweCAxNHB4ICMzMzUyLCAwIDNweCA2cHggIzAwMDE7ICovXG5cbiAgICAvKiBGb3JtdWxhaXJlcyB1dGlsaXNhdGV1ciAqL1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1jRm9ybVVzcjogI0VFRkFGRjsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY0Zvcm1Vc3JfYjogIzMzNDsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY0Zvcm1Vc3JfaDogI0ZGRjsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY0Zvcm1Vc3JfYmY6ICMwQUY7ICovXG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNGb3JtVXNyX2NiOiAjMDU5OyAqL1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1jRm9ybV9iZjogIzNDMDsgKi9cbiAgICAvKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTMgIC0tY0Zvcm1fY2I6ICM1OTA7ICovXG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNLb19iOiAjRjg4OyAqL1xuXG4gICAgLyogTG9nbyAqL1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1jTG9nbzE6ICNFQkY3RTQ7ICovXG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWNMb2dvMjogI0M2RTlBRjsgKi9cblxuICAgIC0tZmZCYXNlOiAnTm90byBTYW5zJywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgLS1mZk1vbm86ICdKZXRCcmFpbnNNb25vJywgJ1ZlcmRhbmEnLCBtb25vc3BhY2U7XG4gICAgLyogUG9saWNlIHN0YW5kYXJkIGRlIGwnw6ljcmFuIHB1YmxpYyAodG91dCBjZSBxdWkgZXN0IHByb2pldMOpKSDigJQgc2V1bGUgc291cmNlLCBsdWUgYXVzc2lcbiAgICAgICBwYXIgbGVzIGNhbnZhcyB2aWEgcG9saWNlRWNyYW4oKSAoa2l0UGx1Z2luL3NoYXJlZC9wb2xpY2UudHMpLiBEw6ljaXNpb24gMjAyNi0wOC0yOSA6XG4gICAgICAgTm90byBTYW5zIHNldWxlLCBwYXMgZGUgU2NhZGEgbmkgTW9udHNlcnJhdCBzdXIgY2UgcXVlIHZvaXQgbGUgcHVibGljLiAqL1xuICAgIC0tZmZFY3JhbjogJ05vdG8gU2FucycsIHNhbnMtc2VyaWY7XG4gICAgLyogUG9saWNlIGRlcyBjaGlmZnJlcyBkZSBsJ8OpY3JhbiBwdWJsaWMgKHRpcmFnZXMsIGNvbXB0ZSDDoCByZWJvdXJzLCBwYW5uZWF1eCDDoCB2b2xldHMpIOKAlFxuICAgICAgIGNoaWZmcmVzIG1vbm9sYXJnZXMgZ2FyYW50aXMgYXV4IGRldXggZmFtaWxsZXMsIGx1ZSBwYXIgbGVzIGNhbnZhcyB2aWEgcG9saWNlQ2hpZmZyZXMoKS5cbiAgICAgICBEw6ljaXNpb24gMjAyNi0wOC0yOSA6IHJlbXBsYWNlICdDb3VyaWVyIE5ldycgKHBvbGljZSBtYWNoaW5lLCBhYnNlbnRlIGQnQW5kcm9pZC9MaW51eCkuICovXG4gICAgLS1mZkNoaWZmcmVzOiAnVWJ1bnR1IFNhbnMnLCAnTm90byBTYW5zJywgc2Fucy1zZXJpZjtcblxuICAgIC8qIElsIGVzdCBpbnRlcmRpdCBkZSByYWpvdXRlciBkZXMgc3R5bGVzIHR5cG8gc2FucyBkZW1hbmRlciBsJ2FjY29yZCBkdSBQTyAqL1xuICAgIC8qIGludXRpbGlzw6kgMjAyNi0wNi0xMyAgLS1mVGl0cmU6IG5vcm1hbCBub3JtYWwgNzAwIDMycHggJ1NjYWRhJywgc2Fucy1zZXJpZjsgKi9cbiAgICAtLWZIMTogbm9ybWFsIG5vcm1hbCA3MDAgMzJweCAnU2NhZGEnLCBzYW5zLXNlcmlmO1xuICAgIC0tZkgyOiBub3JtYWwgbm9ybWFsIDcwMCAyNHB4ICdTY2FkYScsIHNhbnMtc2VyaWY7XG4gICAgLS1mSDM6IG5vcm1hbCBub3JtYWwgNDAwIDIycHggJ1NjYWRhJywgc2Fucy1zZXJpZjtcbiAgICAtLWZINDogbm9ybWFsIG5vcm1hbCA0MDAgMThweCAnU2NhZGEnLCBzYW5zLXNlcmlmO1xuICAgIC8qIFRpdHJlIGRlIGwnw6l2w6luZW1lbnQgc3VyIGwnw6ljcmFuIHB1YmxpYyAoLnpvbmVUaXRyZVRleHRlKSA6IHBvbGljZSBkZSBsJ8OpY3JhbiwgcGFzIFNjYWRhLlxuICAgICAgIExhIHRhaWxsZSBlc3QgcmVjYWzDqWUgw6AgbCdhZmZpY2hhZ2UgcGFyIEdlc3Rpb25uYWlyZUZvbmRFblRldGUuIETDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE0LiAqL1xuICAgIC0tZlRpdHJlRWNyYW46IG5vcm1hbCBub3JtYWwgNzAwIDMycHggdmFyKC0tZmZFY3Jhbik7XG4gICAgLS1mTWVudTE0OiBub3JtYWwgbm9ybWFsIDQwMCAxNHB4ICdNb250c2VycmF0Jywgc2Fucy1zZXJpZjtcbiAgICAvKiBDcmFuIGNvbXBhY3QgZGUgbGEgYmFycmUgZGUgcGlsb3RhZ2UgKEFkYXB0YXRpb25CYXJyZS50cykgOiBsYSBiYXJyZSByZWTDqWZpbml0IC0tZk1lbnUxNCBhdmVjXG4gICAgICAgY2VsbGUtY2kgcG91ciBzb24gc2V1bCBww6lyaW3DqHRyZS4gRMOpY2lzaW9uIGR1IGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDMuICovXG4gICAgLS1mTWVudTEzOiBub3JtYWwgbm9ybWFsIDQwMCAxM3B4ICdNb250c2VycmF0Jywgc2Fucy1zZXJpZjtcbiAgICAtLWZDdGExNjogbm9ybWFsIG5vcm1hbCA3MDAgMThweCAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG4gICAgLyogUmVtaXNlIGVuIHNlcnZpY2UgbGUgMjAyNi0wOS0xNiAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0KSA6IGxlIG1vbm8gZCd1biBMSUJFTEzDiSwgcGFyXG4gICAgICAgb3Bwb3NpdGlvbiDDoCAtLWZNb25vMjRiIHF1aSBlc3QgbGUgbW9ubyBkJ3VuIEdST1MgQ0hJRkZSRSAoY29kZXMgZCdhY2PDqHMsIGNvbXB0ZXVycykuXG4gICAgICAgUHJlbWnDqHJlIHVzYWfDqHJlIDogbCfDqXRpcXVldHRlIGQndW5lIHNjw6huZSBzdXIgbGEgVml0cmluZSAoY29tcG9zYW50cy9ldGlxdWV0dGVKYWltZS5jc3MpLlxuICAgICAgIExlIHJlcGxpICdDb3VyaWVyIE5ldycgZXN0IHVuZSB2cmFpZSBjaGFzc2UgZml4ZSDigJQgY2VsdWkgZGUgLS1mZk1vbm8gKFZlcmRhbmEpIG4nZW4gZXN0XG4gICAgICAgcGFzIHVuZS4gKi9cbiAgICAtLWZNb25vMTY6IG5vcm1hbCBub3JtYWwgNDAwIDE2cHggJ0pldEJyYWluc01vbm8nLCAnQ291cmllciBOZXcnLCBDb3VyaWVyLCBtb25vc3BhY2U7XG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWZNb25vMjQ6IG5vcm1hbCBub3JtYWwgNDAwIDI0cHggJ0pldEJyYWluc01vbm8nLCAnQ291cmllciBOZXcnLCBDb3VyaWVyLCBtb25vc3BhY2U7ICovXG4gICAgLS1mTW9ubzI0Yjogbm9ybWFsIG5vcm1hbCA3MDAgMjRweCAnSmV0QnJhaW5zTW9ubycsICdDb3VyaWVyIE5ldycsIENvdXJpZXIsIG1vbm9zcGFjZTtcbiAgICAtLWZDdGEyMDogbm9ybWFsIG5vcm1hbCA3MDAgMjBweCAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzICAtLWZMZWdlbmQxNjogbm9ybWFsIG5vcm1hbCA0MDAgMjBweCAnU2NhZGEnLCBzYW5zLXNlcmlmOyAqL1xuICAgIC0tZkxpZ2h0MTQ6IGl0YWxpYyBub3JtYWwgMjAwIDE0cHggJ05vdG8gU2FucycsIFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgLS1mTWluaTExOiBpdGFsaWMgbm9ybWFsIDIwMCAxMXB4ICdOb3RvIFNhbnMnLCBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgIC0tZlRleHQxNjogbm9ybWFsIG5vcm1hbCA0MDAgMTZweCAnTm90byBTYW5zJywgVmVyZGFuYSwgR2VuZXZhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICAtLWZUZXh0MTZTdHJvbmc6IG5vcm1hbCBub3JtYWwgNzAwIDE2cHggJ05vdG8gU2FucycsIFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgLS1mSXRhbGljMTY6IGl0YWxpYyBub3JtYWwgNDAwIDE2cHggJ05vdG8gU2FucycsIFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgLS1mQWxlcnRlMTY6IGl0YWxpYyBzbWFsbC1jYXBzIDcwMCAyMHB4ICdOb3RvIFNhbnMnLCBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgIC0tZkxhYmVsOiBub3JtYWwgbm9ybWFsIDQwMCAxNHB4ICdOb3RvIFNhbnMnLCBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBzYW5zLXNlcmlmO1xuXG4gICAgLS1ib3JkZXI6IDFweCBzb2xpZCAjZGNlMWVhO1xuICAgIC0tYm9yZGVyUjA6IDNweDtcbiAgICAtLWJvcmRlclIxOiA1cHg7XG4gICAgLS1ib3JkZXJSMjogN3B4O1xuICAgIC0tYm9yZGVyQ2FydGU6IDFweCBzb2xpZCB2YXIoLS1jTm9pcjQpO1xuICAgIC0tYm9yZGVyRm9ybTogMXB4IHNvbGlkIHZhcigtLWNOb2lyNSk7XG4gICAgLS1ib3JkZXJJbnB1dDogMXB4IHNvbGlkIHZhcigtLWNOb2lyNSk7XG5cbiAgICAvKiBFc3BhY2VtZW50cyDigJQgbm9tbcOpcyBwYXIgcsO0bGUgKGNvbW1lIGxlcyBib3JkdXJlcyksIGFjY29yZCBQTyAyMDI2LTA3LTAzLlxuICAgICAgIE1pZ3JhdGlvbiBwcm9ncmVzc2l2ZSA6IG5lIHJlbXBsYWNlciB1bmUgdmFsZXVyIGVuIGR1ciBxdWUgc2kgbGUgcsO0bGUgRVQgbGEgdmFsZXVyXG4gICAgICAgY29ycmVzcG9uZGVudCAobm8tb3AgdmlzdWVsKSA7IGFsaWduZXIgdW5lIGTDqXJpdmUgZGUgdmFsZXVyID0gZMOpY2lzaW9uIMOgIHBhcnQuICovXG4gICAgLS1nYXBMaXN0ZTogMzJweDsgICAvKiBlbnRyZSBsZXMgw6lsw6ltZW50cyBkJ3VuZSBsaXN0ZS4gTGEgY29sb25uZSBxdWkgYm9yZGUgbGEgbGlzdGUgKGV4LiBwYW5uZWF1IGRlIGZpbHRyZXMpIHByZW5kIGxlIE3Dik1FIGdhcCA6IGRldXggcnl0aG1lcyBkaWZmw6lyZW50cyBjw7R0ZSDDoCBjw7R0ZSwgYydlc3QgbW9jaGUgKi9cbiAgICAtLXBhZGRpbmdDb3JwczogMjBweDsgICAvKiBpbnTDqXJpZXVyIGQndW4gY29ycHMgZGUgYmxvYyAvIHBhbm5lYXUgLyBtb2RhbGUgKi9cbiAgICAtLWdhcERlZmF1dDogOHB4OyAgICAgICAvKiBlc3BhY2Ugc3RhbmRhcmQgZW50cmUgw6lsw6ltZW50cyBmcsOocmVzIChmbGV4L2dyaWQpICovXG4gICAgLS1nYXBSZWR1aXQ6IDRweDsgICAgICAgLyogdmFyaWFudGUgdm9sb250YWlyZW1lbnQgcGx1cyBzZXJyw6llIDogbGlzdGVzIGNvbXBhY3RlcywgZ3JvdXBlcyBkZSBib3V0b25zICovXG4gICAgLS1nYXBNb3llbjogMTJweDsgICAgLyogZXNwYWNlbWVudCBpbnRlcm3DqWRpYWlyZSBlbnRyZSDDqWzDqW1lbnRzIGZyw6hyZXMgKi9cbiAgICAtLWdhcExhcmdlOiAyMHB4OyAgICAvKiBlc3BhY2VtZW50IGfDqW7DqXJldXggZW50cmUgZ3JvdXBlcyBkJ8OpbMOpbWVudHMgKi9cbiAgICAtLWdhcENvbG9ubmVzOiA0cmVtOyAvKiBlbnRyZSBkZXV4IGNvbG9ubmVzIGRlIHBhZ2UgZGUgbmF0dXJlIGRpZmbDqXJlbnRlIDogbGUgdGV4dGUgZXQgc29uIGltYWdlLCBsZSBtZW51IGV0IHNvbiBjb250ZW51IChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNykgKi9cbiAgICAtLWdhcEJsb2NzOiAxMHJlbTsgICAvKiBsZSBibGFuYyBlbnRyZSBkZXV4IGJsb2NzIGVtcGlsw6lzIGQndW5lIG3Dqm1lIGNvbG9ubmUgZGUgbGVjdHVyZSA6IGwnYXJ0aWNsZSwgc2VzIHF1ZXN0aW9ucywgc2VzIHNjw6luYXJpb3MgOyBkZXV4IGNoYXBpdHJlcyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTcpICovXG4gICAgLS1wYWRkaW5nTWluaURpdjogOHB4IDE2cHg7IC8qIHBhZGRpbmcgZGUgdG91dCBsZXMgYmxvY3MgYXZlYyBmb25kIGNvbG9yw6llcyAqL1xuICAgIC0tcGFkZGluZ0V0aXF1ZXR0ZTogM3B4IDZweDsgLyogcGFkZGluZyBkZXMgc3BhbiBldCBhdXRyZXMgZXRpcXVldHRlICovXG4gICAgLS1wYWRkaW5nQ2FydGU6IDE2cHggMjBweDsgICAvKiBpbnTDqXJpZXVyIGQndW5lIENBUlRFIOKAlCBzb24gY29ycHMgY29tbWUgc2EgYmFycmUgZCdhY3Rpb25zLiBMYSBjYXJ0ZSBleGlzdGUgZW4gdHJvaXMgZXhlbXBsYWlyZXMganVtZWF1eCAoYmxvY3MuY3NzLCBpbG90U2NlbmFyaW9zLmNzcywgNTVfc2NlbmFyaW9zQ29tcGF0aWJsZXMuY3NzKSA6IGNoYWN1biByZWNvcGlhaXQgbGUgY2hpZmZyZSwgaWxzIGxpc2VudCBtYWludGVuYW50IGxhIG3Dqm1lIHZhcmlhYmxlIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykgKi9cbiAgICAtLXBhZGRpbmdDYXJ0ZUV0cm9pdDogMTJweCAyMHB4OyAvKiBsYSBtw6ptZSBjYXJ0ZSBlbiBmZW7DqnRyZSDDqXRyb2l0ZSwgcXVhbmQgbGEgYmFycmUgZCdhY3Rpb25zIHBhc3NlIHNvdXMgbGUgY29ycHMgKi9cbiAgICAtLXBhZGRpbmdDdGE6IDE1cHggMjBweDsgICAgIC8qIExFIGdyYW5kIGJvdXRvbiA6IHBsZWluZSBsYXJnZXVyLCBtaW4td2lkdGggMTgwcHgsIGZvbnRlIC0tZkN0YTE2LiBMYSBzaWxob3VldHRlIGNvbXBhY3RlLCBlbGxlLCBwcmVuZCAtLXBhZGRpbmdDdGExNCAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDcpICovXG4gICAgLS1wYWRkaW5nQmFkZ2U6IDRweCAxNnB4OyAgICAvKiB1biBiYWRnZSBlbiBwaWx1bGUsIHBvc8OpIHN1ciB1biBibG9jIOKAlCBwYXMgbGEgcGV0aXRlIMOpdGlxdWV0dGUgaW5saW5lIGQndW4gcsOpY2FwLCBxdWkgZ2FyZGUgLS1wYWRkaW5nRXRpcXVldHRlICovXG4gICAgLS1wYWRkaW5nUGFzdGlsbGU6IDZweCAxNHB4OyAvKiB1bmUgcGFzdGlsbGUgTk9OIGNsaXF1YWJsZSA6IHVuZSDDqXRhcGUsIHVuIMOpdGF0LCB1biBmaWx0cmUgcG9zw6kgKi9cbiAgICAtLXBhZGRpbmdJbnB1dDogMTBweCAxMnB4OyAgIC8qIGwnaW50w6lyaWV1ciBkJ3VuIGNoYW1wIGRlIHNhaXNpZSAoLS1ib3JkZXJJbnB1dCBkaXQgc2EgYm9yZHVyZSkgKi9cbiAgICAtLXBhZGRpbmdDZWxsdWxlOiA4cHggMTZweCA4cHggMDsgLyogdW5lIGNlbGx1bGUgZGUgdGFibGVhdSA6IHJpZW4gw6AgZ2F1Y2hlLCBsYSBjb2xvbm5lIGNvbW1lbmNlIGF1IHRleHRlICovXG4gICAgLS1wYWRkaW5nQ29kZTogMTJweCAxNnB4OyAgICAvKiB1biBibG9jIGRlIGNvZGUgw6AgcmVjb3BpZXIgKi9cbiAgICAtLXBhZGRpbmdMaWduZUxpc3RlOiAxNnB4IDA7IC8qIHVuZSBsaWduZSBMQVJHRSBkJ3VuZSBsaXN0ZSDigJQgdW5lIHF1ZXN0aW9uIHF1J29uIGTDqXBsaWUsIHVuIMOpdGF0IHZpZGUuIExlcyBsaWduZXMgb3JkaW5haXJlcyBwcmVubmVudCAtLWdhcERlZmF1dCAwICovXG4gICAgLS1wYWRkaW5nUmVjYXA6IDEwcHggMTRweDsgICAvKiBsZSByeXRobWUgaW50w6lyaWV1ciBkdSByw6ljYXBpdHVsYXRpZiBkZSBjb21wb3NpdGlvbiAoYmxvY3MsIGFjdGlvbnMsIGVuY2FkcsOpcykgKi9cbiAgICAtLXBhZGRpbmdQYWdlOiAzMHB4IDQwcHg7ICAgIC8qIGwnZW52ZWxvcHBlIGQndW5lIHBhZ2UgOiAuY29udGVudSwgZXQgbGVzIGNvbG9ubmVzIGR1IGJhcyBkZSBwYWdlICovXG4gICAgLS1wYWRkaW5nQ2FydGVMYXJnZTogMzBweCAyNXB4OyAvKiB1bmUgY2FydGUgcXVpIGRvaXQgcmVzcGlyZXIgOiB1bmUgb2ZmcmUsIHVuZSBjYXTDqWdvcmllIGQnYXBlcsOndSAqL1xuICAgIC0tcGFkZGluZ1JhcHBlbDogMjBweCA0MHB4IDI1cHg7IC8qIHVuZSBjYXJ0ZSBkZSByYXBwZWwgZHUgY29tcHRlICguZGl2UmFwcGVsKSwgZXQgdG91dCBibG9jIHBvc8OpIMOgIGPDtHTDqSBkJ2VsbGVzIHN1ciBsYSBtw6ptZSBwYWdlICguYWlkZSwgLmVuQXR0ZW50ZSkgOiBsZXMgdGl0cmVzIGV0IGxlcyB0ZXh0ZXMgdG9tYmVudCDDoCBsJ2FwbG9tYiAqL1xuICAgIC0tcGFkZGluZ0JhbmRlYXU6IDRyZW07ICAgICAgLyogbGUgYmFuZGVhdSBkZXMgYXBlcsOndXMsIHF1aSB0cmF2ZXJzZSBsYSBmZW7DqnRyZSBzdXIgZ3JhbmQgw6ljcmFuICovXG4gICAgLS1yZXRyYWl0TGlzdGVDb3VydDogMjBweDsgICAvKiBsZSByZXRyYWl0IGQndW4gdWwgZGUgbGlzdGUgY291cnRlIOKAlCByw6ljYXAsIHByb2dyZXNzaW9uLCB1bCBnw6luw6lyaXF1ZS4gTGUgcmV0cmFpdCBGUkFOQyBkdSByw6lkYWN0aW9ubmVsIGVzdCAtLXJldHJhaXRMaXN0ZSAqL1xuICAgIC0tcmV0cmFpdExpc3RlOiA0MHB4OyAgICAgICAgLyogbGUgcmV0cmFpdCBkJ3VuIHVsIHLDqWRhY3Rpb25uZWwg4oCUIGFydGljbGUsIGNoYXBpdHJlLCByw6lwb25zZSBkZSBGQVEuIENlIHJldHJhaXQgZnJhbmMgZGl0IHF1ZSBjZXMgbGlnbmVzIHNvbnQgdW4gYmxvYyDDoCBwYXJ0LCBldCBub24gbGEgc3VpdGUgZHUgcGFyYWdyYXBoZSAqL1xuXG4gICAgLyogQm91dG9ucyA6IHVuIGJvdXRvbiBuZSBjaG9pc2l0IE5JIHNvbiBwYWRkaW5nLCBOSSBzYSBib3JkdXJlLCBOSSBzYSBjb3VsZXVyXG4gICAgICAgKGTDqWNpc2lvbiBQTyAyMDI2LTA3LTE4KS4gSWwgcHJlbmQgY2VzIHZhcmlhYmxlcyDigJQgb3UgcGFzIGRlIGJvcmR1cmUsIG91IGxhXG4gICAgICAgY291bGV1ciBkJ3VuIHLDtGxlIChwcmltYWlyZSwgZGFuZ2VyLCBhcGVyw6d1KSDigJQgamFtYWlzIHVuZSB2YWxldXIgw6AgbHVpLiAqL1xuICAgIC0tcGFkZGluZ0N0YTE0VjogOHB4OyAgICAgICAgICAgICAgICAgLyogbCdhaXIgdmVydGljYWwgZCd1biBib3V0b24gY29tcGFjdCwgc2V1bCA6IGxhIGJhcnJlIGRlIHBpbG90YWdlIGVuIGTDqWR1aXQgc2EgaGF1dGV1ciAoX3N0dWRpb0ludGVncmVlLmNzcykgKi9cbiAgICAtLXBhZGRpbmdDdGExNDogdmFyKC0tcGFkZGluZ0N0YTE0VikgMTZweDsgLyogcGFkZGluZyBkZSB0b3V0IGJvdXRvbiBjb21wYWN0ICguY3RhMTQsIC5jdGFEaXNjcmV0LCB0b2dnbGVzKSAqL1xuICAgIC0tYm9yZGVyQ3RhOiAxcHggc29saWQgdmFyKC0tY05vaXI0KTsgLyogTEEgYm9yZHVyZSBkJ3VuIGJvdXRvbiA6IGNlbGxlLWNpIG91IGF1Y3VuZSAqL1xuICAgIC0tY0N0YVRleHRlOiB2YXIoLS1jTm9pcjIpOyAgICAgICAgIC8qIExFIHRleHRlIGQndW4gYm91dG9uIG5ldXRyZSA6IGNlIG5vaXIgb3UgdW5lIGNvdWxldXIgZGUgcsO0bGUgKi9cbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEFDQ0VOVCDigJQgbGEgY291bGV1ciBkZSBsJ2VzcGFjZSBvw7kgbCdvbiBlc3QuIETDqWNsYXLDqWUgc3VyIGJvZHksIEpBTUFJUyBzdXIgaHRtbFxuICAgb3UgOnJvb3QgOiB1bmUgdmFyaWFibGUgZMOpcml2w6llICgtLWNBY2NlbnRfYSwgLS1jRm9ybUZvY3VzSGFsb+KApikgc2UgY2FsY3VsZSBzdXJcbiAgIGwnw6lsw6ltZW50IG/DuSBlbGxlIGVzdCBkw6ljbGFyw6llIDsgc3VyIGh0bWwgZWxsZSBmaWdlcmFpdCBsZSBibGV1IHBhciBkw6lmYXV0IGV0IGxhXG4gICBjbGFzc2UgZHUgYm9keSBuZSBjaGFuZ2VyYWl0IHBsdXMgcXVlIGxlcyB2YWxldXJzIGRpcmVjdGVzLlxuICAgTGEgY2xhc3NlIGR1IDxib2R5PiBjaG9pc2l0IGxhIHRlaW50ZSA7IHNhbnMgY2xhc3NlIDogYmxldSBhZG1pbmlzdHJhdGlvbi5cbiAgIFZpdHJpbmUgOiBiYXNlVml0cmluZVB1YmxpYy50d2lnIHBvc2UgYm9keVBhZ2VWaXRyaW5lLlxuICAgU3R1ZGlvIDogc3R1ZGlvL2Jhc2UudHdpZyBwb3NlIG1vZGVUZXN0ZXIgb3UgbW9kZURpZmZ1c2VyIHNlbG9uIGwnb25nbGV0IHByaW5jaXBhbFxuICAgKGxhIHBhZ2Ugc2UgcmVjaGFyZ2Ugw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgbW9kZSwgcGFzIGRlIFR1cmJvKS5cbiAgIFVuZSByw6hnbGUgcXVpIGEgYmVzb2luIGQnQWNjZW50IGF1IG5pdmVhdSA6cm9vdCBkb2l0IGxpcmUgdmFyKC0tY0FjY2VudOKApikgc3VyXG4gICBsJ8OpbMOpbWVudCBjb25jZXJuw6ksIHBhcyBkw6ljbGFyZXIgdW5lIHZhcmlhYmxlIGTDqXJpdsOpZSDDoCBsYSByYWNpbmUuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBCbGV1IGFkbWluaXN0cmF0aW9uIDogY29tcHRlLCB0YXJpZnMsIGRvbm7DqWVzLCBTdHVkaW8gaG9ycyBtb2RlLCBvbmdsZXQgUHLDqXBhcmVyICovXG5ib2R5IHtcbiAgICAtLWNBY2NlbnQwOiAjZjFmNGY4O1xuICAgIC0tY0FjY2VudDE6ICNlM2VlZjg7XG4gICAgLS1jQWNjZW50MjogI2FjY2VlODtcbiAgICAtLWNBY2NlbnQzOiAjNDM2YmMxO1xuICAgIC0tY0FjY2VudDQ6ICMzMzViYjE7XG4gICAgLS1jQWNjZW50X2E6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHZhcigtLWNBY2NlbnQzKSwgdmFyKC0tY0FjY2VudDQpIDEwMCUpO1xuICAgIC0tY0FjY2VudF9haDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdmFyKC0tY0FjY2VudDMpLCB2YXIoLS1jQWNjZW50MykgMTAwJSk7XG4gICAgLS1jQWNjZW50dDogI0ZGRjtcblxuICAgIC8qIEZvY3VzIGRlcyBjaGFtcHMgOiBsJ2FjY2VudCwgZXQgc29uIGhhbG8gw6AgMTUgJSAqL1xuICAgIC0tY0Zvcm1Gb2N1czogdmFyKC0tY0FjY2VudDMpO1xuICAgIC0tY0Zvcm1Gb2N1c0hhbG86IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jQWNjZW50MykgMTUlLCB0cmFuc3BhcmVudCk7XG59XG5cbi8qIFZpdHJpbmUsIHBhZ2VzIHB1YmxpcXVlcyA6IHZlcnQgKi9cbi5ib2R5UGFnZVZpdHJpbmUge1xuICAgIC0tY0FjY2VudDA6ICNmMGY5ZjQ7XG4gICAgLS1jQWNjZW50MTogI2RjZjJlNTtcbiAgICAtLWNBY2NlbnQyOiAjOWZkOWI4O1xuICAgIC0tY0FjY2VudDM6ICMwODkxNGM7XG4gICAgLS1jQWNjZW50NDogIzA3NTUyNDtcbn1cblxuLyogU3R1ZGlvLCBvbmdsZXQgVGVzdGVyIDogdmlvbGV0ICovXG4ubW9kZVRlc3RlciB7XG4gICAgLS1jQWNjZW50MDogI2Y3ZjFmOTtcbiAgICAtLWNBY2NlbnQxOiAjZWNkY2YzO1xuICAgIC0tY0FjY2VudDI6ICNkMmE4ZTA7XG4gICAgLS1jQWNjZW50MzogIzliNTliNjtcbiAgICAtLWNBY2NlbnQ0OiAjNzgzYjkyO1xufVxuXG4vKiBTdHVkaW8sIG9uZ2xldCBEaWZmdXNlciA6IGJsZXUgZGlmZnVzaW9uICovXG4ubW9kZURpZmZ1c2VyIHtcbiAgICAtLWNBY2NlbnQwOiAjZjBmNmZiO1xuICAgIC0tY0FjY2VudDE6ICNlMGVlZjg7XG4gICAgLS1jQWNjZW50MjogI2E2Y2RlYTtcbiAgICAtLWNBY2NlbnQzOiAjMzA4ZWQxO1xuICAgIC0tY0FjY2VudDQ6ICMyNTcyYTk7XG59XG5cbi8qIEJsZXUgYWRtaW5pc3RyYXRpb24gUE9Tw4kgU1VSIFVOIMOJTMOJTUVOVCwgZGFucyB1biBhdXRyZSBlc3BhY2UgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldFxuICAgMjAyNi0wOS0wNikgOiB1biBnZXN0ZSBkJ2FkbWluaXN0cmF0aW9uIGF1IG1pbGlldSBkJ3VuZSBwYWdlIHB1YmxpcXVlIOKAlCBjcsOpZXIgdW4gw6l2w6luZW1lbnRcbiAgIGRlcHVpcyBsYSBwYWdlIGQndW5lIHNjw6huZSBvdSBsYSBwYWdlIENvbmZpZ3VyZXIgZCd1biBzY8OpbmFyaW8g4oCUIHNlIGRpdCBlbiBibGV1LCBwYXMgZGFuc1xuICAgbGEgY291bGV1ciBkZSBsYSBwYWdlLiBNw6ptZXMgY2lucSB2YWxldXJzIHF1ZSBsZSBib2R5IHNhbnMgY2xhc3NlIDogYydlc3QgbGUgbcOqbWUgZXNwYWNlLFxuICAgcmFtZW7DqSBzdXIgbCfDqWzDqW1lbnQgcXVpIGxlIHBvcnRlIChsZSBib3V0b24gbHVpLW3Dqm1lLCBwYXMgc2EgYmFycmUgOiBsZXMgdm9pc2lucyBnYXJkZW50XG4gICBsYSBjb3VsZXVyIGRlIGxhIHBhZ2UpLiBVbmUgcsOoZ2xlIHF1aSBsaXQgdmFyKC0tY0FjY2VudOKApikgc3VyIGNldCDDqWzDqW1lbnQgdm9pdCBsZSBibGV1LiAqL1xuLmFjY2VudEFkbWluaXN0cmF0aW9uIHtcbiAgICAtLWNBY2NlbnQwOiAjZjFmNGY4O1xuICAgIC0tY0FjY2VudDE6ICNlM2VlZjg7XG4gICAgLS1jQWNjZW50MjogI2FjY2VlODtcbiAgICAtLWNBY2NlbnQzOiAjNDM2YmMxO1xuICAgIC0tY0FjY2VudDQ6ICMzMzViYjE7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBUSVRSRVMgRVQgVFlQT0dSQVBISUVcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmgxLCBoMiwgaDMge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG5oNCB7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMik7XG59XG5cbmg1LCBoNiB7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG5cbnAsIGxpIHtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIyKTtcbn1cblxuaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7XG4gICAgZm9udDogdmFyKC0tZkgxKTtcbn1cblxuYnV0dG9uIHtcbiAgICBmb250OiB2YXIoLS1mQ3RhMTYpO1xufVxuXG5oMSB7XG4gICAgZm9udDogdmFyKC0tZkgxKTtcbiAgICBtYXJnaW46IDEwcHggMTVweCA1cHggMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG5oMiB7XG4gICAgZm9udDogdmFyKC0tZkgyKTtcbiAgICBtYXJnaW46IDE1cHggMTBweCA1cHggMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG5oMyB7XG4gICAgZm9udDogdmFyKC0tZkgzKTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMjVweCAwIDE1cHg7XG59XG5cbmg0LCBoNSB7XG4gICAgZm9udDogdmFyKC0tZkg0KTtcbn1cblxuaDQsIGg1LCBoNiB7XG4gICAgbWFyZ2luOiAyNXB4IDAgN3B4O1xufVxuXG4vKiA8aT4gZXN0IHV0aWxpc8OpZSBjb21tZSBiYWxpc2UgZGUgc3VmZml4ZSAoIzIsICMz4oCmKSBzdXIgbGVzIG5vbXMgZCfDqWzDqW1lbnRzLlxuICAgTGEgYmFsaXNlIDxlbT4gcmVtcGxhY2UgPGk+IHBvdXIgbCdpdGFsaXF1ZSBzw6ltYW50aXF1ZS4gKi9cbmkge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBmb250LXNpemU6IDc1JTtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICBmb250LWZhbWlseTogdmFyKC0tZmZNb25vKTtcbn0iLCJidXR0b24ge1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbiAgICBmb250OiB2YXIoLS1mQ3RhMTYpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuYnV0dG9uLmN0YUFubnVsZXIge1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jQWNjZW50Myk7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi8qIGJ1dHRvbi5saWVuQm91dG9uIDogdW4gPGJ1dHRvbj4gcXVpIGEgbGUgdmlzdWVsIGQndW4gbGllbiAodGVtcGxhdGVzL0NMQVVERS5tZCwgwqsgQm91dG9uXG4gICBvdSBsaWVuID8gwrspIOKAlCBpbCBwcmVuZCBleGFjdGVtZW50IGxlIHN0eWxlIGRlIGEgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE0KSAqL1xuYSxcbmJ1dHRvbi5saWVuQm91dG9uIHtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudDMpO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgcGFkZGluZzogdmFyKC0tZ2FwUmVkdWl0KSAwO1xufVxuXG5idXR0b24ubGllbkJvdXRvbiB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG59XG5cbmE6Zm9jdXMsXG5idXR0b24ubGllbkJvdXRvbjpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuYTpmb2N1cy12aXNpYmxlLFxuYnV0dG9uLmxpZW5Cb3V0b246Zm9jdXMtdmlzaWJsZSB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWNGb3JtRm9jdXMpO1xufVxuXG5cbmJ1dHRvbi5jdGFBbm51bGVyLFxuYS5jdGFBbm51bGVyIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luOiAyMHB4IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuYnV0dG9uLmJ0biwgYS5idG4ge1xuICAgIG1pbi13aWR0aDogMTgwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJvcmRlcjogMDtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudHQpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbiAgICBmb250OiB2YXIoLS1mQ3RhMTYpO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0N0YSk7XG4gICAgbWFyZ2luOiAxMHB4IDA7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgZ2FwOiB2YXIoLS1nYXBNb3llbik7IC8qIGFsaWduw6kgMTAgLT4gMTJweCAow6ljaGVsbGUgUE8gMjAyNi0wNy0xOCkgKi9cbn1cblxuYS5idG46aG92ZXIsIGJ1dHRvbi5idG46aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS1jQWNjZW50dCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDQpO1xuXG59XG5cbi8qIGludXRpbGlzw6kgMjAyNi0wNi0xM1xuYnV0dG9uLmJ0bjIsIGEuYnRuMiB7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyOiAwO1xuICAgIGZvbnQ6IHZhcigtLWZDdGEyMCk7XG4gICAgcGFkZGluZzogMjBweCA0MHB4O1xuICAgIG1hcmdpbjogMjBweCBhdXRvO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcztcbiAgICBjb2xvcjogdmFyKC0tY1RleHRlMSk7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiByb3VuZDtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbn1cblxuYnV0dG9uI3JlZGlyZWN0aW9uLmJ0bjIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG5idXR0b24jcmVkaXJlY3Rpb24uYnRuMjpob3ZlcixcbmEuYnRuMjpob3ZlciwgYnV0dG9uLmJ0bjI6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS1jQWNjZW50dCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0FjY2VudDQpO1xufVxuKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIENUQSBDT01QQUNUIOKAlCBzb2NsZSAuY3RhMTRcblxuICAgTEEgc2lsaG91ZXR0ZSBkZXMgYm91dG9ucyBkJ2FjdGlvbiBjb21wYWN0cyAoYmFycmVzIGQnYWN0aW9uLCBjYXJ0ZXMpIDpcbiAgIGZvcm1lLCBwb2xpY2UsIGRpbWVuc2lvbnMgZMOpZmluaWVzIGljaSBldCBudWxsZSBwYXJ0IGFpbGxldXJzLiBNb2TDqGxlIDpcbiAgIGxlIGJvdXRvbiBkZSBsYSBiYXJyZSBkZSBjb250csO0bGUgYXBlcsOndSAoZMOpY2lzaW9uIFBPIDIwMjYtMDctMTgpLlxuICAgU2UgcG9zZSDDoCBjw7R0w6kgZHUgcsO0bGUgcXVpIGFwcG9ydGUgc2EgY291bGV1ciA6IGNsYXNzPVwiY3RhMTQgY3RhUHJldmlld0NvbnRyb2xlXCIuXG4gICAxNCA9IGxhIHRhaWxsZSBkZSBwb2xpY2UgKC0tZk1lbnUxNCkuIFNpbGhvdWV0dGUgZm9ybXVsYWlyZSDDoCB2ZW5pciA6IC5jdGExOC5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi5jdGExNCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvKiB1biA8YT4gaG9ycyBiYXJyZSBmbGV4IHJlc3RlIHVuIGJvdXRvbiAocGFkZGluZyB2ZXJ0aWNhbCByw6llbCkgKi9cbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ3RhMTQpO1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIC8qIFVuIGJvdXRvbiBuJ2VzdCBqYW1haXMgc291bGlnbsOpLCBxdWVsbGUgcXVlIHNvaXQgc2EgYmFsaXNlIDogbGEgVml0cmluZSBzb3VsaWduZSB0b3VzXG4gICAgICAgc2VzIGxpZW5zICh2aXRyaW5lLmNzcywgZMOpY2lzaW9uIFBPIDIwMjYtMDgtMjUpLCB1biA8YSBjbGFzcz1cImN0YTE0XCI+IHkgw6l0YWl0IHNvdWxpZ27DqVxuICAgICAgIGNvbW1lIHVuIGxpZW4gZGUgcGFyYWdyYXBoZSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDYpLiAqL1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMsIGNvbG9yIDAuMnMsIGJvcmRlci1jb2xvciAwLjJzO1xufVxuXG4vKiBMYSBzaWxob3VldHRlIGNvbXBhY3RlIEdBR05FIHN1ciB1biByw7RsZSBxdWkgcG9ydGUgYXVzc2kgdW5lIHNpbGhvdWV0dGUgOiBsYSBwYWdlIGRlc1xuICAgdGFyaWZzIGRlIGxhIFZpdHJpbmUgcmVkw6lmaW5pdCAuY3RhT3IgZW4gZ3JhbmQgYm91dG9uIGRlIGNhcnRlIChvZmZyZXMuY3NzIDogZGlzcGxheSBibG9jayxcbiAgIGdyYW5kIHBhZGRpbmcsIHBvbGljZSAxNiksIGNlIHF1aSDDqWNyYXNhaXQgwqsgY3RhMTQgY3RhT3Igwrsg4oCUIGxlIHBldGl0IGJvdXRvbiBkb3LDqSBxdWkgbcOobmVcbiAgIMOgIGwnb2ZmcmUgZHUgZGVzc3VzIChwYWdlIMKrIE1vbiBzdHVkaW8gwrssIHNjw6huZXMgcsOpc2VydsOpZXMgw6AgdW5lIG9mZnJlIDogZMOpY2lzaW9uIGNoZWYgZGVcbiAgIHByb2pldCAyMDI2LTEwLTA3KS4gTcOqbWUgY29tcG9zaXRpb24gcXVlIMKrIGN0YTE0IGN0YVByaW1haXJlIMK7LCBtw6ptZSB0YWlsbGUuICovXG4uY3RhMTQuY3RhT3Ige1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogYXV0bztcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0N0YTE0KTtcbiAgICBmb250OiB2YXIoLS1mTWVudTE0KTtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIC8qIExFIEpBVU5FIFDDgkxFIERVIFBFVElUIEJPVVRPTiAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMTAtMDgpIDogbGUgamF1bmUgcGxlaW5cbiAgICAgICBkJ0FtYXpvbiAoLS1jT3IzKSBlc3QgZmFpdCBwb3VyIGxlcyBncm9zIGJvdXRvbnMgZXQgbCdvbmdsZXQgwqsgVGFyaWZzIMK7IDsgc3VyIHVuIHBldGl0XG4gICAgICAgYm91dG9uIHBvc8OpIGRhbnMgdW5lIHBhZ2UgYXV4IHRvbnMgbmV1dHJlcyBldCBwYXN0ZWwsIGlsIHByZW5haXQgbGUgZGVzc3VzIHN1ciB0b3V0IGxlXG4gICAgICAgcmVzdGUuIEZvbmQgcMOibGUgKC0tY09yMSksIGV0IHVuZSBib3JkdXJlIGphdW5lIHBvdXIgcXUnb24gbGUgdm9pZSBjb21tZSB1biBib3V0b24gZXRcbiAgICAgICBjb21tZSBkdSBqYXVuZSA6IGMnZXN0IGVsbGUsIHBsdXMgcXVlIGxlIGZvbmQsIHF1aSBsZSBkw6l0YWNoZSBkZSBsYSBwYWdlLiBNw6ptZSDDqXBhaXNzZXVyXG4gICAgICAgcXVlIGxlcyBhdXRyZXMgYm91dG9ucyAoLS1ib3JkZXJDdGEpLCBzZXVsZSBsYSBjb3VsZXVyIGNoYW5nZS4gKi9cbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jT3IxKTtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlckN0YSk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jT3IzKTtcbn1cblxuLmN0YTE0LmN0YU9yOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jT3IyKTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNPcjQpO1xufVxuXG4vKiBMRSBQRVRJVCBCT1VUT04gRU4gSkFVTkUgUExFSU4gKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTEwLTE0KSA6IGxhIG3Dqm1lIHNpbGhvdWV0dGVcbiAgIGNvbXBhY3RlLCBsZXMgY291bGV1cnMgZHUgZ3JvcyBib3V0b24gZGVzIHRhcmlmcyAoLmN0YU9yKS4gUG91ciBsZSBib3V0b24gcXVpIGVzdCBTRVVMIGV0XG4gICBkb2l0IHNlIHZvaXIgOiDCqyBNb24gc3R1ZGlvIMK7LCBsYSBsaW1pdGUgZCfDqXbDqW5lbWVudHMgYXR0ZWludGUgZHUgU3R1ZGlvLiBMw6Agb8O5IGlsIHJldmllbnRcbiAgIHNvdXZlbnQgKHZpZ25ldHRlcywgbGlzdGVzIGRlIHNjw6luYXJpb3MsIHBhZ2UgZCd1bmUgc2PDqG5lKSwgbGUgamF1bmUgcMOibGUgcmVzdGUuICovXG4uY3RhMTQuY3RhT3IuY3RhT3JQbGVpbiB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY09yMyk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jT3IzKTtcbiAgICBjb2xvcjogdmFyKC0tY09ydCk7XG59XG5cbi5jdGExNC5jdGFPci5jdGFPclBsZWluOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jT3I0KTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNPcjQpO1xufVxuXG4uY3RhMTQ6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNDtcbiAgICBjdXJzb3I6IGF1dG87XG59XG5cbi8qIFLDtGxlIGFjdGlvbiBwcmluY2lwYWxlIDogTEUgYm91dG9uIHF1aSBmYWl0IGxhIGNob3NlIHBvdXIgbGFxdWVsbGUgbGEgcGFnZSBleGlzdGVcbiAgIChjcsOpZXIgdW4gw6l2w6luZW1lbnTigKYpLCBlbiBBY2NlbnQg4oCUIGxhIGNvdWxldXIgZGUgbCdlc3BhY2UsIG91IGNlbGxlIHF1J3VuXG4gICAuYWNjZW50QWRtaW5pc3RyYXRpb24gcG9zZSBzdXIgbHVpLiBVbiBzZXVsIHLDtGxlLCBkw6lmaW5pIGljaSBldCBudWxsZSBwYXJ0IGFpbGxldXJzXG4gICAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDYpIDogcGFzIGRlIENTUyBwYXIgYm91dG9uLiAqL1xuLmN0YVByaW1haXJlIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50Myk7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnR0KTtcbn1cblxuLmN0YVByaW1haXJlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50NCk7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnR0KTtcbn1cblxuLyogUsO0bGUgb2ZmcmUgOiBMRSBib3V0b24gcXVpIG3DqG5lIGF1eCBvZmZyZXMgZXQgYXV4IHRhcmlmcyDigJQgT3IsIGxhIGNvdWxldXIgZHUgcHJpeCBldCBkZVxuICAgbCdpbnNjcmlwdGlvbiAoY291bGV1cnMubWQpLiBMJ2VuY2FkcsOpIMKrIGxpbWl0ZSBkJ8OpdsOpbmVtZW50cyDCuyBkdSBTdHVkaW8uICovXG4uY3RhT3Ige1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNPcjMpO1xuICAgIGNvbG9yOiB2YXIoLS1jT3J0KTtcbn1cblxuLmN0YU9yOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jT3I0KTtcbiAgICBjb2xvcjogdmFyKC0tY09ydCk7XG59XG5cbi8qIFLDtGxlIGFwZXLDp3UgOiBMRSBib3V0b24gcXVpIGxhbmNlIHVuIGFwZXLDp3Ug4oCUIHZpb2xldCBhcGVyw6d1LCBwYXJ0b3V0XG4gICAoY2F0YWxvZ3VlLCBwYWdlIE1vZGlmaWVyLCBmaWNoZXMgZCdhbmltYXRpb24pLiBVbiBhcGVyw6d1ID0gdmlvbGV0LFxuICAgZMOpY2lzaW9uIFBPIDIwMjYtMDctMTguICovXG4uY3RhUHJldmlldyB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0FjY2VudF9hKTtcbiAgICBjb2xvcjogdmFyKC0tY0JsYW5jKTtcbn1cblxuLmN0YVByZXZpZXc6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNBY2NlbnRfYWgpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQkFER0UgTU9ERSBURVNUIC0gUsOpdXRpbGlzYWJsZSBwYXJ0b3V0XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4uYmFkZ2VNb2RlVGVzdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdCYWRnZSk7XG4gICAgZm9udDogdmFyKC0tZkxhYmVsKTtcbiAgICBjb2xvcjogdmFyKC0tY0JsYW5jKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50Myk7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICBtYXJnaW46IDEwcHggMDtcbn0iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQk9VVE9OIERFIEZFUk1FVFVSRSAoLm1vZGFsZUNsb3NlKSDigJQgc291cmNlIHVuaXF1ZSAoZG9jcy9kZXNpZ25TeXN0ZW0vYm91dG9uRmVybWV0dXJlLm1kKVxuXG4gICBMYSBjcm9peCBlc3QgZGVzc2luw6llIHBhciA6OmJlZm9yZSAobWFzayBTVkcgY2ktZGVzc291cykgOiBlbiBIVE1MIGxlIGJvdXRvbiByZXN0ZSBWSURFIOKAlFxuICAgbmUgSkFNQUlTIHkgbWV0dHJlIMOXIC8gJnRpbWVzOyAvIHRleHRlLiBSw6l1dGlsaXNhYmxlIDogVklERSA9IGNyb2l4IGNlbnRyw6llIDsgYXZlYyB1blxuICAgZW5mYW50IC5tb2RhbGVDbG9zZVRleHRlID0gbGEgbcOqbWUgYm/DrnRlIHMnw6lsYXJnaXQgZXQgdW4gbGliZWxsw6kgcydham91dGUgw6AgR0FVQ0hFIGRlIGxhXG4gICBjcm9peCAoZXguIMKrIFByZW5kcmUgbGEgbWFpbiDinJUgwrspLiBQYXMgZGUgcGFkZGluZyBob3Jpem9udGFsIDogbGEgY3JvaXggYSBkw6lqw6AgfjZweCBkZVxuICAgbWFyZ2UgaW50ZXJuZSDDoCBkcm9pdGUgKG1hc2sgNuKGkjE4IHN1ciB2aWV3Qm94IDI0KSwgYydlc3QgLm1vZGFsZUNsb3NlVGV4dGUgcXVpIHJlZG9ubmVcbiAgIGxlIG3Dqm1lIGFpciDDoCBnYXVjaGUg4oaSIMOpcXVpbGlicsOpLlxuXG4gICBJY2kgbGEgc2lsaG91ZXR0ZSBHw4lOw4lSQUxFIChib8OudGUgc291cGxlLCBjcm9peCAyMHB4IOKAlCBiYXJyZSBkJ2FwZXLDp3Ugw6ljcmFuKS4gTGVzXG4gICBjb250ZXh0ZXMgbifDqWNyaXZlbnQgcXVlIGxldXJzIMOpY2FydHMsIEFQUsOIUyBsZXVyIEBpbXBvcnQgZGUgY2UgZmljaGllciA6XG4gICAtIG1vZGFsZXMgU3R1ZGlvICg1Nl9zY2VuYXJpby9fbW9kYWxlLmNzcykgOiBib8OudGUgZml4ZSA0NMOXNDQsIGNyb2l4IDI0IDtcbiAgIC0gc3VyY291Y2hlIGFwZXLDp3UgKGNvbXBvc2FudHMvc3VyY291Y2hlUHJldmlldy5jc3MpIDogaWRlbSArIG1hc3F1ZSDCqyBwbGVpbiDDqWNyYW4gwrsuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4ubW9kYWxlQ2xvc2Uge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtaW4td2lkdGg6IDI1cHg7XG4gICAgcGFkZGluZzogdmFyKC0tZ2FwRGVmYXV0KSB2YXIoLS1nYXBSZWR1aXQpOyAvKiB2ZXJ0aWNhbCBhbGlnbsOpIHN1ciAuY3RhMTQgKG3Dqm1lIHJ5dGhtZSBkYW5zIGxhIGJhcnJlIGFwZXLDp3UpICovXG4gICAgZ2FwOiB2YXIoLS1nYXBEZWZhdXQpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycztcbn1cblxuLm1vZGFsZUNsb3NlOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIG9yZGVyOiAxOyAvKiBjcm9peCDDoCBkcm9pdGUgZCd1biDDqXZlbnR1ZWwgLm1vZGFsZUNsb3NlVGV4dGUgKHNldWxlID0gY2VudHLDqWUsIGluY2hhbmfDqSkgKi9cbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICBtYXNrOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDbGluZSB4MT0nMTgnIHkxPSc2JyB4Mj0nNicgeTI9JzE4Jy8lM0UlM0NsaW5lIHgxPSc2JyB5MT0nNicgeDI9JzE4JyB5Mj0nMTgnLyUzRSUzQy9zdmclM0VcIikgY2VudGVyIC8gY29udGFpbiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDbGluZSB4MT0nMTgnIHkxPSc2JyB4Mj0nNicgeTI9JzE4Jy8lM0UlM0NsaW5lIHgxPSc2JyB5MT0nNicgeDI9JzE4JyB5Mj0nMTgnLyUzRSUzQy9zdmclM0VcIikgY2VudGVyIC8gY29udGFpbiBuby1yZXBlYXQ7XG59XG5cbi5tb2RhbGVDbG9zZTpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jMDIpO1xufVxuXG4vKiBMaWJlbGzDqSBvcHRpb25uZWwgw6AgZ2F1Y2hlIGRlIGxhIGNyb2l4IChjZi4gZW4tdMOqdGUpLiBMZSBwYWRkaW5nIGdhdWNoZSBkb25uZSBhdSB0ZXh0ZVxuICAgbGUgbcOqbWUgYWlyICh+NnB4KSBxdWUgbGEgbWFyZ2UgaW50ZXJuZSBkZSBsYSBjcm9peCDDoCBkcm9pdGUg4oaSIHZpc3VlbGxlbWVudCDDqXF1aWxpYnLDqS4gKi9cbi5tb2RhbGVDbG9zZVRleHRlIHtcbiAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLWdhcFJlZHVpdCk7XG4gICAgZm9udDogdmFyKC0tZk1lbnUxNCk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7IC8qIG3Dqm1lIHRlaW50ZSBxdWUgbGEgY3JvaXggKi9cbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBTVVJDT1VDSEUgQVBFUsOHVSDigJQgcG9wLXVwIGlmcmFtZSAoY29tcG9zYW50IG5veWF1KVxuXG4gICBPdXZyZSB1biBhcGVyw6d1IChhbmltYXRpb24gb3Ugc2PDqW5hcmlvKSBkYW5zIGxhIHBhZ2UgcXVhbmQgbGEgZmVuw6p0cmUgZXN0XG4gICBhc3NleiBncmFuZGUsIGF1IGxpZXUgZCd1biBub3V2ZWwgb25nbGV0LiBVbiBzZXVsIHN5c3TDqG1lIHBvdXIgdG91cyBsZXNcbiAgIGFwZXLDp3VzLCBTdHVkaW8gY29tbWUgVml0cmluZSAoZMOpY2lzaW9uIFBPIDIwMjYtMDctMTgpLlxuXG4gICBCb3V0b25zIDogYmFzZSAubW9kYWxlQ2xvc2UgKGNvbXBvc2FudHMvYm91dG9uRmVybWV0dXJlLmNzcywgc291cmNlIHVuaXF1ZSBkZSBsYSBjcm9peCksXG4gICBzdXJjb3VjaGUgPSB1bmlxdWVtZW50IGwnw6ljYXJ0IGRlIHRhaWxsZSBjaS1kZXNzb3VzLlxuXG4gICBNYXJrdXAgZ8OpbsOpcsOpIHBhciBzdXJjb3VjaGVQcmV2aWV3LnRzIChub3lhdSkgc3VyIGxlcyBkw6ljbGVuY2hldXJzIFtkYXRhLXByZXZpZXddXG4gICAobGllbnMgaHJlZiBvdSBib3V0b25zIGRhdGEtdXJsKSwgYXVjdW4gdGVtcGxhdGUgOlxuICAgLnN1cmNvdWNoZSA+IC5zdXJjb3VjaGVDb250ZW51ID4gLnN1cmNvdWNoZUJhcnJlIChwbGVpbiDDqWNyYW4gKyBjcm9peCkgKyAuc3VyY291Y2hlSWZyYW1lXG5cbiAgIExlcyBzZXVpbHMgZCdvdXZlcnR1cmUgKGlmcmFtZSAxNi85IGQnYXUgbW9pbnMgOTYww5c1NDAgKyBtYXJnZXMgODAvMTIwKVxuICAgdml2ZW50IGRhbnMgc3VyY291Y2hlUHJldmlldy50cyDigJQgZ2FyZGVyIFRTIGV0IGRpbWVuc2lvbm5lbWVudCBDU1MgYWxpZ27DqXMuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBCb3V0b25zIGRlIGxhIGJhcnJlIDogYmFzZSAubW9kYWxlQ2xvc2UgKGNvbXBvc2FudCwgY3JvaXggY29tcHJpc2UpIOKAlCBwb3PDqWUgcGFyIGxlIFRTIHN1clxuICAgbGVzIGRldXggYm91dG9ucy4gSWNpIHVuaXF1ZW1lbnQgbCfDqWNhcnQgc3VyY291Y2hlICg0NMOXNDQsIGljw7RuZXMgMjQpICsgbGUgbWFzcXVlIHBsZWluIMOpY3Jhbi4gKi9cbkBpbXBvcnQgJy4vYm91dG9uRmVybWV0dXJlLmNzcyc7XG5cbi5zdXJjb3VjaGUge1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgcGFkZGluZzogMDtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1vbWJyZU1vZGFsZSk7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG59XG5cbi5zdXJjb3VjaGU6OmJhY2tkcm9wIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jT3ZlcmxheSk7XG59XG5cbi5zdXJjb3VjaGVDb250ZW51IHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnN1cmNvdWNoZUJhcnJlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIGxlcyBvbmdsZXRzIHNlIGNlbnRyZW50IHN1ciBlbGxlICovXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgLyogUGFzIGRlIHRyYWl0IHNvdXMgbGEgYmFycmUgOiBpbCByZXNzb3J0YWl0IHN1ciBsYSBidWxsZSBkZSBsJ2FwZXLDp3UgY29sbMOpZSBkZXNzb3VzXG4gICAgICAgKGNoZWYgZGUgcHJvamV0LCAyMDI2LTA5LTE3KS4gKi9cbn1cblxuLyogUE9DIChjaGVmIGRlIHByb2pldCwgMjAyNi0wOS0xNikgOiBsZXMgb25nbGV0cyBkZSBsJ2FwZXLDp3UgZGFucyBsYSBiYXJyZSBkZSB0aXRyZSwgw6AgZ2F1Y2hlXG4gICAoc3VyY291Y2hlUHJldmlldy50cywgYWxpbWVudMOpcyBwYXIgbCdhcGVyw6d1KS4gTcOqbWUgYWlyIHF1ZSBsYSBiYXJyZSBkZSBsJ2FwZXLDp3UgOiBtYXJnZSBkZVxuICAgOCwgw6ljYXJ0IGRlIDguIFNvYnJlcywgYydlc3QgdW5lIGJhcnJlIGRlIHRpdHJlIDogYXVjdW4gZm9uZCwgbGUgZ3JpcyBkdSB0ZXh0ZSB0ZXJ0aWFpcmVcbiAgIChjTm9pcjMpIGF1IHJlcG9zLCB1biBjb250b3VyIGRlIGNldHRlIGNvdWxldXIgOyBsJ29uZ2xldCBkb250IGxhIHZ1ZSBlc3Qgb3V2ZXJ0ZSBwcmVuZCBsYVxuICAgY291bGV1ciBkZXMgaWPDtG5lcyBkZSBsYSBiYXJyZSwgbGUgbm9pciBkZSBsYSBjcm9peCAoY2hlZiBkZSBwcm9qZXQsIDIwMjYtMDktMTYpLiAqL1xuLyogQ0VOVFLDiVMgc3VyIGxhIGJhcnJlIGRlIHRpdHJlLCBwYXMgY2Fsw6lzIMOgIGdhdWNoZSAoY2hlZiBkZSBwcm9qZXQsIDIwMjYtMDktMTYpIDogY2VudHLDqXMsXG4gICBvbiBsZXMgdm9pdCA7IGV0IHF1YW5kIHVuIG9uZ2xldCBzJ2Fqb3V0ZSDDoCBsYSBmaW4gZGUgbCdhcGVyw6d1LCBsZSBncm91cGUgc2UgcmVjZW50cmUgZXRcbiAgIGJvdWdlIOKAlCBjJ2VzdCB2b3VsdSwgbGUgbW91dmVtZW50IGRpdCBxdSdpbCBzZSBwYXNzZSBxdWVscXVlIGNob3NlIGzDoC1oYXV0LiBIb3JzIGZsdXggcG91clxuICAgcXVlIGxlcyBkZXV4IGljw7RuZXMgZGUgZHJvaXRlIG5lIHDDqHNlbnQgcGFzIGRhbnMgbGUgY2VudHJhZ2UuICovXG4uc3VyY291Y2hlT25nbGV0cyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogdmFyKC0tZ2FwRGVmYXV0KTtcbn1cblxuLyogU2FucyBjb250b3VyIGF1IHJlcG9zIDsgbGUgY29udG91ciBwYXJhw650IGF1IHN1cnZvbCBldCByZXN0ZSBzdXIgbCdvbmdsZXQgYWN0aWYg4oCUIGMnZXN0XG4gICBsdWkgcXVpIGRpdCBsZXF1ZWwgZXN0IG91dmVydCAoY2hlZiBkZSBwcm9qZXQsIDIwMjYtMDktMTYpLiBMYSBib3JkdXJlIGVzdCBsw6AgZMOocyBsZVxuICAgcmVwb3MsIHRyYW5zcGFyZW50ZSA6IGVsbGUgZ2FyZGUgc29uIMOpcGFpc3NldXIsIHJpZW4gbmUgYm91Z2UgZXQgcmllbiBuZSBzZSB0cm91ZS4gKi9cbi5zdXJjb3VjaGVPbmdsZXQge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xufVxuXG4uc3VyY291Y2hlT25nbGV0OmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cblxuLnN1cmNvdWNoZU9uZ2xldEFjdGlmIHtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICBib3JkZXItY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cblxuLyogTGVzIGRldXggYm91dG9ucyBwb3J0ZW50IGxhIGNsYXNzZSAubW9kYWxlQ2xvc2UgKHBvc8OpZSBwYXIgbGUgVFMpIDogc2lsaG91ZXR0ZSwgY3JvaXggZXRcbiAgIGhvdmVyIHZpZW5uZW50IGR1IGNvbXBvc2FudC4gSWNpIGwnw6ljYXJ0IHN1cmNvdWNoZSA6IGJvw650ZSBmaXhlIDQ0w5c0NCwgaWPDtG5lcyAyNC4gKi9cbi5zdXJjb3VjaGVDbG9zZSxcbi5zdXJjb3VjaGVQbGVpbkVjcmFuIHtcbiAgICB3aWR0aDogNDRweDtcbiAgICBoZWlnaHQ6IDQ0cHg7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLnN1cmNvdWNoZUNsb3NlOjpiZWZvcmUsXG4uc3VyY291Y2hlUGxlaW5FY3Jhbjo6YmVmb3JlIHtcbiAgICB3aWR0aDogMjRweDtcbiAgICBoZWlnaHQ6IDI0cHg7XG59XG5cbi5zdXJjb3VjaGVQbGVpbkVjcmFuOjpiZWZvcmUge1xuICAgIG1hc2s6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J004IDNINWEyIDIgMCAwIDAtMiAydjMnLyUzRSUzQ3BhdGggZD0nTTIxIDhWNWEyIDIgMCAwIDAtMi0yaC0zJy8lM0UlM0NwYXRoIGQ9J00zIDE2djNhMiAyIDAgMCAwIDIgMmgzJy8lM0UlM0NwYXRoIGQ9J00xNiAyMWgzYTIgMiAwIDAgMCAyLTJ2LTMnLyUzRSUzQy9zdmclM0VcIikgY2VudGVyIC8gY29udGFpbiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNOCAzSDVhMiAyIDAgMCAwLTIgMnYzJy8lM0UlM0NwYXRoIGQ9J00yMSA4VjVhMiAyIDAgMCAwLTItMmgtMycvJTNFJTNDcGF0aCBkPSdNMyAxNnYzYTIgMiAwIDAgMCAyIDJoMycvJTNFJTNDcGF0aCBkPSdNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zJy8lM0UlM0Mvc3ZnJTNFXCIpIGNlbnRlciAvIGNvbnRhaW4gbm8tcmVwZWF0O1xufVxuXG4vKiAxNi85LCBhdXNzaSBncmFuZCBxdWUgbGEgZmVuw6p0cmUgbGUgcGVybWV0IChtYXJnZXMgOiA4MCBlbiBsYXJnZXVyLCAxMjAgZW5cbiAgIGhhdXRldXIg4oCUIGxhIGJhcnJlIGRlIGxhIHN1cmNvdWNoZSArIGwnYWlyIGF1dG91cikuICovXG4uc3VyY291Y2hlSWZyYW1lIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgd2lkdGg6IG1pbihjYWxjKDEwMHZ3IC0gODBweCksIGNhbGMoKDEwMHZoIC0gMTIwcHgpICogMTYgLyA5KSk7XG4gICAgYXNwZWN0LXJhdGlvOiAxNiAvIDk7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTEUgQ8WSVVIgwqsgSidBSU1FIMK7IEVUIFNPTiBDT01QVEVVUiDigJQgYnJpcXVlIG5veWF1IF9qYWltZS50d2lnLCBWaXRyaW5lIGNvbW1lIFN0dWRpb1xuICAgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTEyKVxuXG4gICBRdWF0cmUgw6l0YXRzLCBmYcOnb24gWCwgdG91cyBpY2kgZXQgbnVsbGUgcGFydCBhaWxsZXVycyA6XG4gICAgIDEuIMOpdGVpbnQgICAgICAgICAgICDigJQgY29udG91ciBncmlzLCBjaGlmZnJlIGdyaXMgO1xuICAgICAyLiBzdXJ2b2wgKGFjdGlmKSAgICDigJQgY8WTdXIgZXQgY2hpZmZyZSBlbiByb3VnZSwgdW4gZGlzcXVlIHDDomxlIGRlcnJpw6hyZSBsZSBjxZN1ciA7XG4gICAgIDMuIGFsbHVtw6kgICAgICAgICAgICDigJQgY8WTdXIgUExFSU4sIHJvdWdlLCB1biBwZXUgcGx1cyBncmFuZCDigJQgdW4gcGV1IHNldWxlbWVudCwgw6dhIHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam91ZSDDoCB0csOocyBwZXUgKGNoZWYgZGUgcHJvamV0KSA7XG4gICAgIDQuIGFsbHVtw6kgYXUgc3Vydm9sICDigJQgbGUgbcOqbWUsIGF2ZWMgbGUgZGlzcXVlIHDDomxlLlxuICAgUGx1cyBsJ2luYWN0aWYgKGBkaXNhYmxlZGApIDogbGUgdmlzaXRldXIgbm9uIGNvbm5lY3TDqSB2b2l0IGxlIGPFk3VyIGV0IGxlIG5vbWJyZSwgaWwgbmVcbiAgIHBldXQgcGFzIHkgdG91Y2hlci4gTmkgc3Vydm9sLCBuaSBjdXJzZXVyLCBldCDDgCBNT0lUScOJIEVTVE9NUMOJIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXRcbiAgIDIwMjYtMDktMTYsIHF1aSBkw6lmYWl0IGxlIMKrIHBhcyBncmlzw6kgwrsgZHUgMjAyNi0wOS0xMikgOiB1biBjxZN1ciBwbGVpbiBldCBuZXQgc2UgbGl0IGNvbW1lXG4gICB1bmUgY29tbWFuZGUsIGV0IGxlIHZpc2l0ZXVyIGTDqWNvbm5lY3TDqSBjbGlxdWFpdCBkZXNzdXMgc2FucyBjb21wcmVuZHJlIHBvdXJxdW9pIHJpZW4gbmVcbiAgIHNlIHBhc3NhaXQuXG5cbiAgIExlIHJvdWdlIGVzdCBjZWx1aSBkdSBjxZN1ciAoLS1jQ29ldXIzLCAtLWNDb2V1cjAgcG91ciBsZSBzdXJ2b2wsIDEwX2ZvbnQuY3NzKSA6IHVuIHJvdWdlXG4gICBzYW5nLCBib3JkZWF1eCBmb25jw6ksIMOgIGx1aSDigJQgbGUgcm91Z2UgZGUgbGEgZmFtaWxsZSAtLWNSb3VnZSBkaXQgbCdhbGVydGUgZXQgbGUgZGFuZ2VyLFxuICAgcGFzIGwnYWZmZWN0aW9uIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNiwgcXVpIHJlbXBsYWNlIGxlIC0tY1JvdWdlMyBkdSAxMikuXG4gICBBdWN1bmUgY291bGV1ciBlbiBkdXIgKGRvY3MvZGVzaWduU3lzdGVtL2NvdWxldXJzLm1kKS5cblxuICAgTGUgYm91dG9uIG5lIHBvc2UgbmkgYm9yZHVyZSBuaSBmb25kIDogYydlc3QgdW5lIGljw7RuZSBldCB1biBjaGlmZnJlIHBvc8OpcyDDoCBtw6ptZSBsYSBwYWdlLFxuICAgY29tbWUgbGUgbGllbiDCqyBFbiBzYXZvaXIgcGx1cyDCuyBkJ3VuZSB0dWlsZSAoLmxpZW5TY2VuZVBsdXMpLiBQYWRkaW5nIDogLS1nYXBSZWR1aXQsIGxhXG4gICBtw6ptZSB2YXJpYWJsZSBxdWUgY2UgbGllbiDigJQgdW5lIHZhbGV1ciBub21tw6llLCBqYW1haXMgdW4gY2hpZmZyZSAoYXNzZXRzL3ZpdHJpbmUvY3NzL0NMQVVERS5tZCkuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLnRvZ2dsZUphaW1lIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogdmFyKC0tZ2FwUmVkdWl0KTtcbiAgICBwYWRkaW5nOiB2YXIoLS1nYXBSZWR1aXQpIDA7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgZm9udDogdmFyKC0tZk1lbnUxNCk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIC8qIGBvcGFjaXR5YCA6IGxlIHBhc3NhZ2UgZGUgMjUgJSDDoCA1MCAlIG91IMOgIDEwMCAlLCBxdWFuZCBsYSByw6lwb25zZSBkZSBmaW4gZGUgcGFnZVxuICAgICAgIGFycml2ZSwgc2UgZmFpdCBlbiBmb25kdSBldCBub24gZCd1biBjb3VwIOKAlCBsZSBjxZN1ciBuZSBjbGlnbm90ZSBwbHVzIChkw6ljaXNpb24gY2hlZiBkZVxuICAgICAgIHByb2pldCAyMDI2LTA5LTE2KS4gYGNvbG9yYCA6IGxlIHN1cnZvbCwgY29tbWUgYXZhbnQuICovXG4gICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycywgb3BhY2l0eSAwLjRzO1xufVxuXG4vKiBMZSBkaXNxdWUgcMOibGUgZHUgc3Vydm9sIGVzdCB1biBwc2V1ZG8tw6lsw6ltZW50IGRlcnJpw6hyZSBsZSBjxZN1ciA6IGxlIGPFk3VyIHJlc3RlIMOgIHNhXG4gICBwbGFjZSwgc2V1bCBsZSBmb25kIGFwcGFyYcOudC4gYGlzb2xhdGlvbmAgKyBgei1pbmRleGAgcG91ciBxdSdpbCBwYXNzZSBERVJSScOIUkUgbGUgdHJhY8OpXG4gICBkdSBjxZN1ciBzYW5zIHNvcnRpciBkdSBib3V0b24uICovXG4udG9nZ2xlSmFpbWVDb2V1ciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGlzb2xhdGlvbjogaXNvbGF0ZTtcbiAgICBmbGV4OiBub25lO1xuICAgIHdpZHRoOiAyMHB4O1xuICAgIGhlaWdodDogMjBweDtcbiAgICBmaWxsOiBub25lO1xuICAgIHN0cm9rZTogY3VycmVudENvbG9yO1xuICAgIHN0cm9rZS13aWR0aDogMjtcbiAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kO1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzLCBmaWxsIDAuMnMsIHN0cm9rZSAwLjJzO1xufVxuXG4udG9nZ2xlSmFpbWVDb2V1cjo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogLTE7XG4gICAgaW5zZXQ6IC04cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNDb2V1cjApO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzO1xufVxuXG4vKiBMZSBjaGlmZnJlIG5lIHLDqXNlcnZlIGF1Y3VuZSBsYXJnZXVyIDogw6AgesOpcm8gaWwgZXN0IHZpZGUsIGxlIGPFk3VyIGVzdCBzZXVsLiAqL1xuLnRvZ2dsZUphaW1lTm9tYnJlIHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuXG4vKiAyIOKAlCBzdXJ2b2wsIGJvdXRvbiBBQ1RJRiBzZXVsZW1lbnQgKi9cbi50b2dnbGVKYWltZTpub3QoOmRpc2FibGVkKTpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLWNDb2V1cjMpO1xufVxuXG4udG9nZ2xlSmFpbWU6bm90KDpkaXNhYmxlZCk6aG92ZXIgLnRvZ2dsZUphaW1lQ29ldXI6OmJlZm9yZSB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLyogMyDigJQgYWxsdW3DqSA6IGPFk3VyIHBsZWluLCDDoCBwZWluZSBwbHVzIGdyYW5kICovXG4udG9nZ2xlSmFpbWVbYXJpYS1wcmVzc2VkPVwidHJ1ZVwiXSB7XG4gICAgY29sb3I6IHZhcigtLWNDb2V1cjMpO1xufVxuXG4udG9nZ2xlSmFpbWVbYXJpYS1wcmVzc2VkPVwidHJ1ZVwiXSAudG9nZ2xlSmFpbWVDb2V1ciB7XG4gICAgZmlsbDogY3VycmVudENvbG9yO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wOCk7XG59XG5cbi8qIExlIHBldGl0IHJlYm9uZCBxdWFuZCBvbiBjbGlxdWUgOiBsZSBjxZN1ciBncm9zc2l0IHB1aXMgcmV2aWVudC4gUG9zw6kgcGFyIGxlIEphdmFTY3JpcHRcbiAgIGF1IG1vbWVudCBkdSBnZXN0ZSwgcmV0aXLDqSDDoCBsYSBmaW4gZGUgbCdhbmltYXRpb24g4oCUIGphbWFpcyBhdSBjaGFyZ2VtZW50LCBzaW5vbiB0cmVudGVcbiAgIGPFk3VycyByZWJvbmRpcmFpZW50IGVuIGNoxZN1ciDDoCBsJ291dmVydHVyZSBkZSBsYSBwYWdlLiAqL1xuLnRvZ2dsZUphaW1lQW5pbWUgLnRvZ2dsZUphaW1lQ29ldXIge1xuICAgIGFuaW1hdGlvbjogdG9nZ2xlSmFpbWVSZWJvbmQgMC4zNXMgZWFzZS1vdXQ7XG59XG5cbkBrZXlmcmFtZXMgdG9nZ2xlSmFpbWVSZWJvbmQge1xuICAgIDAlICAgeyB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9XG4gICAgNDAlICB7IHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7IH1cbiAgICAxMDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxLjA4KTsgfVxufVxuXG4vKiBJbmFjdGlmIDogcGFzIGRlIHN1cnZvbCwgcGFzIGRlIGN1cnNldXIsIGV0IEVTVE9NUMOJIMOAIDUwICUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldFxuICAgMjAyNi0wOS0xNikuIExlIHZpc2l0ZXVyIGRvaXQgVk9JUiBxdSdpbCBuZSBwZXV0IHBhcyBjbGlxdWVyIDogc2FucyBsJ2VzdG9tcGUsIHVuIGPFk3VyXG4gICBpbmFjdGlmIHJlc3NlbWJsYWl0IHRyYWl0IHBvdXIgdHJhaXQgw6AgdW4gY8WTdXIgYWN0aWYgYXUgcmVwb3MuXG4gICBMZSAyMDI2LTA5LTEyIGF2YWl0IHRyYW5jaMOpIGwnaW52ZXJzZSAowqsgcGFzIGdyaXPDqSwgYydlc3QgdW5lIGluZm9ybWF0aW9uIMK7KSA6IGxlIGNoaWZmcmVcbiAgIHJlc3RlIGxpc2libGUgw6AgNTAgJSwgbCdpbmZvcm1hdGlvbiBlc3QgdG91am91cnMgbMOgLlxuICAgU3VyIGxlIFN0dWRpbywgbCd1dGlsaXNhdGV1ciBlc3QgdG91am91cnMgY29ubmVjdMOpIDogY2V0IMOpdGF0IG4neSBhcHBhcmHDrnQgcGFzLiAqL1xuLnRvZ2dsZUphaW1lOmRpc2FibGVkIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgb3BhY2l0eTogMC41O1xufVxuXG4vKiBFTiBBVFRFTlRFIDogMjUgJSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTYpLiBMZSBjxZN1ciB0ZWwgcXVlIGxlIHNlcnZldXJcbiAgIGwnw6ljcml0LCBhdmFudCBxdWUgbGEgcmVxdcOqdGUgZGUgZmluIGRlIHBhZ2UgYWl0IHLDqXBvbmR1LiBMZSBKYXZhU2NyaXB0IHJldGlyZSBsYSBjbGFzc2VcbiAgIGTDqHMgbGEgcsOpcG9uc2UgOiBsZSBjxZN1ciBwYXNzZSBhbG9ycyDDoCA1MCAlIChkw6ljb25uZWN0w6ksIGBkaXNhYmxlZGAgY2ktZGVzc3VzKSBvdSDDoCAxMDAgJVxuICAgKGNvbm5lY3TDqSkuIFRyb2lzIHBhbGllcnMsIHBvdXIgcXUnYXVjdW4gbmUgc2UgY29uZm9uZGUgYXZlYyB1biBhdXRyZS5cbiAgIOKaoO+4jyBNw6ptZSBwb2lkcyBxdWUgYC50b2dnbGVKYWltZTpkaXNhYmxlZGAgKHVuZSBjbGFzc2UgKyB1bmUgY2xhc3NlLCB1bmUgY2xhc3NlICsgdW5lXG4gICBwc2V1ZG8tY2xhc3NlKSA6IGMnZXN0IGwnT1JEUkUgcXVpIHRyYW5jaGUuIENldHRlIHLDqGdsZSBkb2l0IHJlc3RlciBBUFLDiFMgY2VsbGUtbMOgLiAqL1xuLnRvZ2dsZUphaW1lLnRvZ2dsZUphaW1lQXR0ZW50ZSB7XG4gICAgb3BhY2l0eTogMC4yNTtcbn1cblxuLyogTGUgbcOqbWUgaGFsbyBkZSBmb2N1cyBxdWUgbGVzIGxpZW5zIGV0IGJvdXRvbnMgZHUgc2l0ZSAoMzFfY3RhLmNzcykuICovXG4udG9nZ2xlSmFpbWU6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG59XG5cbi50b2dnbGVKYWltZTpmb2N1cy12aXNpYmxlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tY0Zvcm1Gb2N1cyk7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG59XG5cbkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7XG4gICAgLnRvZ2dsZUphaW1lLFxuICAgIC50b2dnbGVKYWltZUNvZXVyLFxuICAgIC50b2dnbGVKYWltZUNvZXVyOjpiZWZvcmUge1xuICAgICAgICB0cmFuc2l0aW9uOiBub25lO1xuICAgIH1cblxuICAgIC50b2dnbGVKYWltZUFuaW1lIC50b2dnbGVKYWltZUNvZXVyIHtcbiAgICAgICAgYW5pbWF0aW9uOiBub25lO1xuICAgIH1cbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBMJ8OJVElRVUVUVEUgRVQgU09OIEPFklVSIMKrIEonQUlNRSDCuyDigJQgYnJpcXVlIG5veWF1IF9ldGlxdWV0dGVKYWltZS50d2lnXG4gICAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTYpXG5cbiAgIFVuZSBib8OudGUsIGRldXggcGnDqGNlcywgdW5lIGxhcmdldXIgcXVpIG5lIGNoYW5nZSBKQU1BSVMuIEMnZXN0IHRvdXQgbGUgdHJhdmFpbCBkZSBjZVxuICAgZmljaGllciA6IHJlbmRyZSBsZSBibG9jIGltbW9iaWxlLCBwb3VyIHF1J29uIHB1aXNzZSBsZSBwb3NlciBuJ2ltcG9ydGUgb8O5IHN1ciBsYSBWaXRyaW5lXG4gICBzYW5zIHF1J2lsIGJvdWdlIGF1IGNsaWMuXG5cbiAgIENFIEZJQ0hJRVIgTkUgUExBQ0UgUklFTi4gUGFzIGRlIG1hcmdlLCBwYXMgZCdhbGlnbmVtZW50LCBwYXMgZGUgbGFyZ2V1ciBpbXBvc8OpZSA6IGxhXG4gICBicmlxdWUgZGl0IGNvbW1lbnQgbGUgYmxvYyBlc3QgY29uc3RydWl0LCBsYSBwYWdlIHF1aSBsJ2FjY3VlaWxsZSBkaXQgb8O5IGlsIHNlIHBvc2UuXG4gICBDJ2VzdCBjZSBwYXJ0YWdlIHF1aSBsYSByZW5kIHBsYWNhcmRhYmxlIHBhcnRvdXQuXG5cbiAgIOKaoO+4jyBJbCBuZSB0b3VjaGUgcGFzIMOgIGNvbXBvc2FudHMvamFpbWUuY3NzIDogbGUgY8WTdXIgZ2FyZGUgc2Egc2V1bGUgZXQgdW5pcXVlIHNvdXJjZS4gVG91dFxuICAgY2UgcXVpIGVzdCDDqWNyaXQgaWNpIGVzdCBwb3J0w6kgcGFyIGAuZXRpcXVldHRlSmFpbWVgLCBkb25jIG4nYXR0ZWludCBRVUUgY2UgYmxvYyDigJQgbGVzXG4gICBzZXB0IGF1dHJlcyBlbmRyb2l0cyBvw7kgbGUgY8WTdXIgdml0IHNvbnQgaW5jaGFuZ8Opcy5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIGBpbmxpbmUtZmxleGAgOiBsYSBib8OudGUgcHJlbmQgZXhhY3RlbWVudCBsYSBsYXJnZXVyIGRlIHNvbiBjb250ZW51LCBuaSBwbHVzIG5pIG1vaW5zLlxuICAgQydlc3QgY2UgcXVpIHBlcm1ldCDDoCBsJ2FwcGVsYW50IGRlIGxhIGNlbnRyZXIgKGFsaWduLXNlbGYsIHRleHQtYWxpZ24sIGp1c3RpZnktY29udGVudOKApilcbiAgIHNhbnMgcXUnZWxsZSBzJ8OpdGlyZSDDoCB0b3V0ZSBsYSBjb2xvbm5lLlxuICAgLS1nYXBMYXJnZSAoMjBweCkgOiDDoCA4cHggKC0tZ2FwRGVmYXV0KSBwdWlzIMOgIDEycHggKC0tZ2FwTW95ZW4pLCBsZSBtb3QgZXQgbGUgY8WTdXIgc2VcbiAgIGxpc2FpZW50IGNvbW1lIHVuIHNldWwgYmxvYyBzZXJyw6kgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KS4gVW5lIHZhbGV1ciBub21tw6llLFxuICAgamFtYWlzIHVuIGNoaWZmcmUgKGFzc2V0cy92aXRyaW5lL2Nzcy9DTEFVREUubWQpLiAqL1xuLmV0aXF1ZXR0ZUphaW1lIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogdmFyKC0tZ2FwTGFyZ2UpO1xufVxuXG4vKiBMJ8OJVElRVUVUVEUgRU4gQ0hBU1NFIEZJWEUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KS4gQydlc3QgbGUgbm9tIGR1IGRvc3NpZXJcbiAgIGRlIGxhIHNjw6huZSDigJQgYFJhZmZsZVBsdWNrYCDigJQsIHBhcyB1bmUgcGhyYXNlIDogZHUgUGFzY2FsQ2FzZSBxdWUgcGVyc29ubmUgbmUgdHJhZHVpdC4gTGVcbiAgIG1vbm8gZGl0IMKrIGNlY2kgZXN0IHVuIGlkZW50aWZpYW50IMK7IHNhbnMgcXUnb24gYWl0IMOgIGwnw6ljcmlyZS5cbiAgIEMnZXN0IGxlIGdlc3RlIHF1ZSBsZSBTdHVkaW8gZmFpdCBkw6lqw6Agc3VyIGxlcyDDqXRpcXVldHRlcyBkZSBsJ29yZ2FuaXNhdGV1ciAoLmV0aXF1ZXR0ZU1vbm8sXG4gICBzdHVkaW8vNTZfc2NlbmFyaW8vX2V0aXF1ZXR0ZXMuY3NzLCBkw6ljaXNpb24gUE8gMjAyNi0wNi0xMCkg4oCUIGzDoC1iYXMgbGEgY2hhc3NlIGZpeGVcbiAgIGRpc3Rpbmd1ZSBsZSBtb3QgZGUgbCd1dGlsaXNhdGV1ciBkZXMgbGliZWxsw6lzIGR1IHN5c3TDqG1lIDsgaWNpIGVsbGUgZGlzdGluZ3VlXG4gICBsJ2lkZW50aWZpYW50IGR1IHRleHRlIHLDqWRpZ8OpLiBNw6ptZSBvdXRpbCwgaW50ZW50aW9uIHZvaXNpbmUuXG5cbiAgIC0tZk1vbm8xNiBldCBwYXMgLS1mTW9ubzI0YiA6IGxlIG1vbm8gZCd1biBMSUJFTEzDiSwgcGFzIGNlbHVpIGQndW4gZ3JvcyBjaGlmZnJlLiBMYVxuICAgdmFyaWFibGUgZG9ybWFpdCwgY29tbWVudMOpZSDCqyBpbnV0aWxpc8OpIMK7IGRlcHVpcyBsZSAyMDI2LTA2LTEzIDsgZWxsZSBlc3QgcmVtaXNlIGVuXG4gICBzZXJ2aWNlIHBvdXIgY2UgYmxvYyAoMTBfZm9udC5jc3MpLCBhdWN1bmUgdmFsZXVyIG5vdXZlbGxlIG4nZW50cmUgZGFucyBsZSBzeXN0w6htZS5cbiAgIFN1ciBsYSBwYWdlIGQndW5lIHNjw6huZSwgbCfDqXRpcXVldHRlIMOpdGFpdCBqdXNxdSdpY2kgYXUgY29ycHMgZCd1biBIMiA6IDI0cHggZ3JhcywgcGx1c1xuICAgbG91cmRlIHF1ZSBsZSB2cmFpIHRpdHJlIGRlIGxhIHBhZ2UganVzdGUgYXUtZGVzc3VzLiAqL1xuLmV0aXF1ZXR0ZUphaW1lVGV4dGUge1xuICAgIGZvbnQ6IHZhcigtLWZNb25vMTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjIpO1xufVxuXG4vKiBMQSBDQVNFIERVIENISUZGUkUg4oCUIGxlIGPFk3VyIGRlIGwnYWZmYWlyZSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTYpLlxuICAgRGFucyBzYSBicmlxdWUsIGxlIGNvbXB0ZXVyIMKrIG5lIHLDqXNlcnZlIGF1Y3VuZSBsYXJnZXVyIMK7IDogw6AgesOpcm8gaWwgZXN0IHZpZGUsIGxlIGPFk3VyIGVzdFxuICAgc2V1bC4gQydlc3QganVzdGUgbMOgIG/DuSBsZSBjxZN1ciBmaW5pdCBsYSBsaWduZS4gw4dhIG5lIGwnZXN0IHBsdXMgZMOocyBxdSdpbCBhIHVuIHZvaXNpbiA6IGxlXG4gICBwcmVtaWVyIMKrIEonYWltZSDCuyDDqWxhcmdpc3NhaXQgbGUgYm91dG9uLCBldCB0b3V0IGNlIHF1aSBsJ2VudG91cmFpdCBnbGlzc2FpdC5cbiAgIEljaSBsZSBjaGlmZnJlIGEgc2EgY2FzZSwgZXQgaWwgbmUgbGEgcXVpdHRlIHBhcy4gRGV1eCBjYXJhY3TDqHJlcyDigJQgZGUgMCDDoCA5OSwgbGEgY2FzZVxuICAgc3VmZml0IDsgYXUtZGVsw6AgZWxsZSBzJ8OpbGFyZ2l0LCBldCBjJ2VzdCBhc3N1bcOpLlxuICAgYGNoYCA6IGxhIGxhcmdldXIgZCd1biBjaGlmZnJlIGRhbnMgbGEgZm9udGUgZHUgYm91dG9uLiBDZSBuJ2VzdCBwYXMgdW5lIG1lc3VyZSBpbnZlbnTDqWUgZW5cbiAgIHBpeGVscywgYydlc3QgbGEgY2FzZSBxdWUgbGUgdGV4dGUgb2NjdXBlIOKAlCBldCBgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtc2AsIGTDqWrDoFxuICAgcG9zw6kgc3VyIGNlIHNwYW4sIGdhcmFudGl0IHF1ZSB0b3VzIGxlcyBjaGlmZnJlcyBvbnQgbGEgbcOqbWUuXG4gICBQb3J0w6kgcGFyIGAuZXRpcXVldHRlSmFpbWVgIDogbGVzIGPFk3VycyBkZXMgYXV0cmVzIHBhZ2VzIG5lIHLDqXNlcnZlbnQgdG91am91cnMgcmllbi4gKi9cbi5ldGlxdWV0dGVKYWltZSAudG9nZ2xlSmFpbWVOb21icmUge1xuICAgIG1pbi13aWR0aDogMmNoO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFBhZ2UgZGVzIG9mZnJlcyAocHJpY2luZykgLSBEZXNpZ24gc29icmVcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi5wYWdlT2ZmcmVzIHtcbiAgICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgICBtYXJnaW46IDAgYXV0bztcbn1cblxuLnBhZ2VPZmZyZXMgaDEge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cblxuLyogTGUgYmFzIGRlcyBwYWdlcyBkJ29mZnJlcyAoX2Jhc09mZnJlcy50d2lnKSA6IHVuIHNldWwgcnl0aG1lLCBjZWx1aSBkJ3VuZSBsaXN0ZVxuICAgKC0tZ2FwTGlzdGUpLCBlbnRyZSBsZSB0ZXh0ZSwgbGVzIHF1ZXN0aW9ucyBmcsOpcXVlbnRlcywgbGUgdHJhaXQgZXQgbGVzIG5vdGVzLiBMZSBibGFuYyBkZVxuICAgZmFxLmNzcyAoOHJlbSwgbGUgcnl0aG1lIGRlcyDDrmxvdHMpIGV0IC0tZ2FwQmxvY3MgKDEwcmVtKSBjcmV1c2FpZW50IHVuIHRyb3UgYXUgbWlsaWV1XG4gICBkJ3VuZSBwYWdlIHF1aSBzZSBsaXQgZCd1biB0cmFpdCAodnUgcGFyIGxlIGNoZWYgZGUgcHJvamV0IDIwMjYtMTAtMTUpLiAqL1xuLnBhZ2VPZmZyZXMgPiAuZmFxIHtcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1nYXBMaXN0ZSk7XG59XG5cbi5vZmZyZXNOb3Rlc1NlcGFyYXRldXIge1xuICAgIG1hcmdpbjogdmFyKC0tZ2FwTGlzdGUpIDAgMjBweDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyKTtcbn1cblxuLyogTGUgdGl0cmUgZXQgbGEgcGhyYXNlIGQnaW50cm9kdWN0aW9uIGRlcyB0YXJpZnMsIGNlbnRyw6lzIGNvbW1lIGxhIGdyaWxsZSBxdSdpbHMgYW5ub25jZW50XG4gICAoY2hlZiBkZSBwcm9qZXQgMjAyNi0xMC0xNSkuIExlIHRleHRlIHNvdXMgbGEgZ3JpbGxlIHJlc3RlIMOgIGdhdWNoZSA6IGlsIHNlIGxpdC4gKi9cbi50YXJpZnNJbnRybyB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4vKiBBdWN1bmUgbGFyZ2V1ciBtYXhpbWFsZSBpY2ksIGV0IGF1Y3VuZSBtYXJnZSBhdXRvbWF0aXF1ZSA6IGxhIGdyaWxsZSBwcmVuZCB0b3V0ZSBsYVxuICAgbGFyZ2V1ciBxdWUgbHVpIGxhaXNzZSBzb24gY29udGVuZXVyLiBDJ2VzdCAuY29udGVudSAocGFkZGluZyBsYXTDqXJhbCkgw6AgbCdpbnTDqXJpZXVyXG4gICBkZSAjYm9keVBhZ2UgKG1heC13aWR0aCkgcXVpIGTDqWNpZGUgZGVzIG1hcmdlcyBkZSBsYSBwYWdlLCBpY2kgY29tbWUgcGFydG91dCBhaWxsZXVycy5cbiAgIExhIGdyaWxsZSBkb2l0IGRvbmMgVE9VSk9VUlMgw6p0cmUgcGxhY8OpZSBkYW5zIHVuIC5jb250ZW51LiAqL1xuLyogTEEgR1JJTExFIE5FIERPSVQgUklFTiDDgCBMQSBQQUdFIFFVSSBMJ0FDQ1VFSUxMRS4gRWxsZSBzJ2FmZmljaGUgc3VyIGxlcyB0YXJpZnMgcHVibGljc1xuICAgKHBhcXVldCB2aXRyaW5lIDogYm9keSBlbiBsaW5lLWhlaWdodCAxLjYsIGxpIMOgIDhweCBkZSBtYXJnZSwgdml0cmluZS5jc3MpIGV0IHN1ciDCqyBNZXNcbiAgIG9mZnJlcyDCuyAocGFxdWV0IHZpdHJpbmVDb21wdGUgOiBib2R5IGVuIC0tZlRleHQxNiwgbGluZS1oZWlnaHQgbm9ybWFsLCBsaSBzYW5zIG1hcmdlLFxuICAgMzBfYmFzZS5jc3MpLiBUYW50IHF1J2VsbGUgaMOpcml0YWl0LCBsZXMgbGlnbmVzIG4nYXZhaWVudCBwYXMgbGUgbcOqbWUgZXNwYWNlbWVudCBkJ3VuZSBwYWdlXG4gICDDoCBsJ2F1dHJlICh2dSBwYXIgbGUgY2hlZiBkZSBwcm9qZXQgMjAyNi0xMC0xNSkuIEVsbGUgcG9zZSBkb25jIGVsbGUtbcOqbWUgc2EgcG9saWNlIChoYXV0ZXVyXG4gICBkZSBsaWduZSBub3JtYWxlLCBjb21wcmlzZSBkYW5zIC0tZlRleHQxNikgZXQgbGEgbWFyZ2UgZGUgc2VzIGxpZ25lcyA6IGxhIG3Dqm1lIGdyaWxsZVxuICAgcGFydG91dCwgYXUgcGl4ZWwgcHLDqHMuIEwnZXNwYWNlbWVudCByZXRlbnUgZXN0IGxlIFNFUlLDiSwgY2VsdWkgZGUgwqsgTWVzIG9mZnJlcyDCuyAoZMOpY2lzaW9uXG4gICBjaGVmIGRlIHByb2pldCAyMDI2LTEwLTE1KS4gKi9cbi5ncmlkT2ZmcmVzIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIDFmcik7XG4gICAgZ2FwOiAyMHB4O1xuICAgIG1hcmdpbjogNDBweCAwO1xufVxuXG4vKiBUcm9pcyBjYXJ0ZXMgOiBlbiBkZXNzb3VzIGRlIHRyb2lzIGNvbG9ubmVzIG9uIHBhc3NlIGRpcmVjdGVtZW50IMOgIHVuZSBzZXVsZSwgc2lub24gbGFcbiAgIHRyb2lzacOobWUgc2UgcmV0cm91dmUgb3JwaGVsaW5lIGVuIGJhcyBkZSBwYWdlLiAqL1xuLyogRW4gdW5lIGNvbG9ubmUsIGxhIGNhcnRlIG5lIHByZW5kIHBhcyB0b3V0ZSBsYSBwYWdlIDogNjAwcHggYXUgcGx1cywgY2VudHLDqWUgKGTDqWNpc2lvbiBjaGVmXG4gICBkZSBwcm9qZXQgMjAyNi0xMC0xNSkuIExlIGJvdXRvbiwgcXVpIHByZW5kIGxhIGxhcmdldXIgZGUgbGEgY2FydGUsIGVuIHJlc3RlIMOgIHVuZSB0YWlsbGUgZGVcbiAgIGJvdXRvbi4gKi9cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDIzcHgpIHtcbiAgICAuZ3JpZE9mZnJlcyB7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDYwMHB4KTtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgfVxufVxuXG4vKiBDYXJ0ZSBvZmZyZSAqL1xuLmNhcnRlT2ZmcmUge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCbGFuYzEpO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNCbGFuYzMpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIyKTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ2FydGVMYXJnZSk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLyogTGVzIHBldGl0cyBib3V0b25zIOKGkSDihpMgZGVzIGNvaW5zIGRlIGxhIGNhcnRlIChfY2FydGVPZmZyZS50d2lnKSA6IGRpc2NyZXRzIOKAlCB1biByb25kIGZpbixcbiAgIGdyaXMg4oCUIG1haXMgdmlzaWJsZXMuIENoYWN1biBuZSBwYXJhw650IHF1ZSBzaSBvZmZyZXMudHMgbHVpIGEgcG9zw6kgLm9mZnJlTmF2VmlzaWJsZSA6IGNhcnRlc1xuICAgZW1waWzDqWVzIGV0IG9mZnJlIHZpc8OpZSBob3JzIGRlIGwnw6ljcmFuLiBMJ29mZnJlIHZpc8OpZSB2aWVudCBzZSBjYWxlciBlbiBoYXV0IGRlIGwnw6ljcmFuXG4gICAoc2Nyb2xsLW1hcmdpbi10b3AsIHBsdXMgYmFzKS4gKi9cbi5vZmZyZU5hdiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIHZpc2liaWxpdHkgMC4zcztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAxMnB4O1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogdmFyKC0tYm9yZGVyKTtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIyKTtcbn1cblxuLm9mZnJlTmF2IHN2ZyB7XG4gICAgd2lkdGg6IDE4cHg7XG4gICAgaGVpZ2h0OiAxOHB4O1xufVxuXG4ub2ZmcmVOYXY6aG92ZXIsXG4ub2ZmcmVOYXY6Zm9jdXMtdmlzaWJsZSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jMik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbi5vZmZyZU5hdlByZWNlZGVudGUge1xuICAgIGxlZnQ6IDEycHg7XG59XG5cbi5vZmZyZU5hdlN1aXZhbnRlIHtcbiAgICByaWdodDogMTJweDtcbn1cblxuLyogSWwgcGFyYcOudCBldCBzJ2VmZmFjZSBlbiBmb25kdSA6IGlsIHZhIGV0IHZpZW50IHBlbmRhbnQgcXUnb24gZMOpZmlsZSwgw6dhIG5lIGRvaXQgcGFzIHNhdXRlclxuICAgYXV4IHlldXggKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTEwLTE1KS4gdmlzaWJpbGl0eSBsZSByZXRpcmUgYXVzc2kgZHUgY2xhdmllciBldCBkZXNcbiAgIGxlY3RldXJzIGQnw6ljcmFuIHF1YW5kIGlsIGVzdCBjYWNow6kuICovXG4ub2ZmcmVOYXYub2ZmcmVOYXZWaXNpYmxlIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG59XG5cbkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7XG4gICAgLm9mZnJlTmF2IHtcbiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTtcbiAgICB9XG59XG5cbi5jYXJ0ZU9mZnJlIHtcbiAgICBzY3JvbGwtbWFyZ2luLXRvcDogMjBweDtcbn1cblxuLyogTGUgTk9NIGRlIGwnb2ZmcmUgcydlZmZhY2UgZGV2YW50IGxlIHByaXggZXQgbGEgZHVyw6llIDogcGV0aXRlIHRhaWxsZSwgY2FwaXRhbGVzXG4gICAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTIpLiAqL1xuLmNhcnRlT2ZmcmUgaDIge1xuICAgIGZvbnQ6IHZhcigtLWZINCk7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBtYXJnaW46IDAgMCAxNXB4IDA7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4vKiBQcml4ICovXG4ub2ZmcmVQcml4IHtcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnByaXhNb250YW50IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZm9udDogdmFyKC0tZkgxKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cblxuLyogTGVzIGNlbnRpbWVzIG5lIHDDqHNlbnQgcGFzIGF1dGFudCBxdWUgbGVzIGV1cm9zIDogNSw5OSBkb2l0IHNlIGxpcmUgwqsgY2lucSDCuywgcGFzXG4gICDCqyBjaW5xIG1pbGxlIMK7IChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xMikuIENlbnRpbWVzIGV0IHN5bWJvbGUgZGUgbGEgbW9ubmFpZVxuICAgc29udCDDoCBsYSBUQUlMTEUgRFUgVEVYVEUgY291cmFudCwgcGFzIMOgIHVuIHBvdXJjZW50YWdlIGR1IHRpdHJlIChkw6ljaXNpb24gY2hlZiBkZVxuICAgcHJvamV0IDIwMjYtMDktMTQpIDogbGEgbcOqbWUgdGFpbGxlIHN1ciB0b3V0ZXMgbGVzIGNhcnRlcywgcXVlbCBxdWUgc29pdCBsZSBjaGlmZnJlLiAqL1xuLnByaXhEZWNpbWFsZXMsXG4ucHJpeERldmlzZSB7XG4gICAgZm9udC1zaXplOiAxNnB4O1xufVxuXG4ucHJpeERlY2ltYWxlcyB7XG4gICAgdmVydGljYWwtYWxpZ246IHN1cGVyO1xufVxuXG4vKiBMZSBzeW1ib2xlIGRlIGxhIG1vbm5haWUgcydlZmZhY2UgOiBtw6ptZSB0YWlsbGUgcXVlIGxlcyBjZW50aW1lcywgbWFpcyBlbiBtYWlncmUuIElsXG4gICBTT1JUIERVIEZMVVggKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTEwLTE1LCBxdWkgcmVtcGxhY2UgY2VsbGUgZHUgMjAyNi0wOS0xNCkgOlxuICAgYydlc3QgbGUgQ0hJRkZSRSBxdWkgc2UgY2VudHJlIGRhbnMgbGEgY2FydGUsIGxlIHN5bWJvbGUgcGVuZCDDoCBjw7R0w6ksIGVuIGhhdXQuIERhbnMgbGVcbiAgIGZsdXgsIGlsIGTDqWNlbnRyYWl0IGxlIGNoaWZmcmUgZXQsIG1vbnTDqSBlbiBleHBvc2FudCwgbGUgZmFpc2FpdCBkZXNjZW5kcmUuIExlXG4gICBmb3JtYXRldXIgKE1vbnRhbnRTdHJpcGU6OmZvcm1hdGVySHRtbCkgbCdhIGTDqWJhcnJhc3PDqSBkZSBzb24gZXNwYWNlIDogbGUgcGV0aXQgw6ljYXJ0XG4gICBlc3QgcmVuZHUgaWNpLCBkdSBjw7R0w6kgb8O5IGlsIHNlIHBvc2UuICovXG4ucHJpeERldmlzZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMC40ZW07XG4gICAgZm9udC13ZWlnaHQ6IDIwMDtcbn1cblxuLnByaXhEZXZpc2VBcHJlcyB7XG4gICAgbGVmdDogMTAwJTtcbiAgICBtYXJnaW4tbGVmdDogMC4yZW07XG59XG5cbi5wcml4RGV2aXNlQXZhbnQge1xuICAgIHJpZ2h0OiAxMDAlO1xuICAgIG1hcmdpbi1yaWdodDogMC4yZW07XG59XG5cbi8qIFNvdXMtdGl0cmUgOiBsYSBEVVLDiUUgZGUgbCdvZmZyZSAoTUVOU1VFTCwgQU5OVUVMKS4gRWxsZSBzZSBsaXQgZW4gbcOqbWUgdGVtcHMgcXVlIGxlXG4gICBwcml4LCBkJ2/DuSBsYSB0YWlsbGUgZGUgdGl0cmUgZXQgbGVzIGNhcGl0YWxlcyDigJQgYydlc3QgbGEgY29tcGFyYWlzb24gcXUnb24gdmV1dFxuICAgcHJvdm9xdWVyIGVudHJlIGxlcyBkZXV4IG9mZnJlcyBwYXlhbnRlcy4gKi9cbi5vZmZyZVNvdXNUaXRyZSB7XG4gICAgZm9udDogdmFyKC0tZkgyKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIG1hcmdpbjogMCAwIDE1cHggMDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi8qIExlIHByaXggZGUgcmVub3V2ZWxsZW1lbnQsIGVuIGzDqWdlciAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMTAtMTUpIDogZGV1eCBwcml4IGVuXG4gICBtw6ptZSBncmFpc3NlIHNlIGxpc2VudCBjb21tZSBkZXV4IG1vbnRhbnRzIMOgIHBheWVyLiBTY2FkYSBuJ2EgcGFzIGRlIGdyYWlzc2UgbMOpZ8OocmUgOiBsYVxuICAgbGlnbmUgcHJlbmQgbGUgTm90byBTYW5zIGR1IHRleHRlLCBlbiAyMDAsIHNhbnMgbGVzIGNhcGl0YWxlcyBkdSBzb3VzLXRpdHJlLiAqL1xuLm9mZnJlUmVub3V2ZWxsZW1lbnQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBmb250LXdlaWdodDogMjAwO1xuICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKiBUcmFpdCBlbnRyZSBsZSBoYXV0IGNlbnRyw6kgZGUgbGEgY2FydGUgZXQgc29uIGJhcyBhbGlnbsOpIMOgIGdhdWNoZSAoX2NhcnRlT2ZmcmUudHdpZykuICovXG4ub2ZmcmVTZXBhcmF0ZXVyIHtcbiAgICBtYXJnaW46IDAgMCAyMHB4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1ib3JkZXIpO1xufVxuXG4vKiBMJ2FjY3JvY2hlLCBzb3VzIGxlIGJvdXRvbiA6IGxhIHBvbGljZSBkdSB0ZXh0ZSwgcGFzIGNlbGxlIGR1IHNlY29uZCBwbGFuIOKAlCBjJ2VzdFxuICAgbCdhcmd1bWVudCBkZSBsJ29mZnJlLCBlbGxlIGRvaXQgc2UgbGlyZS4gKi9cbi5vZmZyZURlc2NyaXB0aW9uIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICBtYXJnaW46IDAgMCAyMHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLyogQmFzIGRlIGNhcnRlIDogc29pdCBsYSBsaXN0ZSBkZSBkw6l0YWlscywgc29pdCBsZSBibG9jIHN1ciBtZXN1cmUgKFByZW1pdW0pLiBMZXMgZGV1eCBzb250XG4gICBJTlRFUkNIQU5HRUFCTEVTIGV0IHBhcnRhZ2VudCBpY2kgbGEgbcOqbWUgZ8Opb23DqXRyaWUg4oCUIG3Dqm1lIG1hcmdlLCBtw6ptZSBvY2N1cGF0aW9uIGRlXG4gICBsJ2VzcGFjZSByZXN0YW50LiBDJ2VzdCBjZSBxdWkgZ2FyYW50aXQgcXVlIHRvdXQgY2UgcXVpIGVzdCBBVS1ERVNTVVMgZCdldXggKHRpdHJlLCBwcml4LFxuICAgc291cy10aXRyZSwgYWN0aW9uLCBkZXNjcmlwdGlvbikgdG9tYmUgYXUgbcOqbWUgcGl4ZWwgZGFucyBsZXMgcXVhdHJlIGNhcnRlcywgYWxvcnMgbcOqbWVcbiAgIHF1ZSBsZSBDT05URU5VIGR1IGJsb2Mgc3VyIG1lc3VyZSwgbHVpLCBuZSBzJ2FsaWduZSBzdXIgcmllbi5cbiAgIOKblCBOZSBqYW1haXMgc8OpcGFyZXIgY2VzIGRldXggc8OpbGVjdGV1cnMgOiBsYSBjYXJ0ZSBQcmVtaXVtIGTDqWNyb2NoZXJhaXQgZGVzIGF1dHJlcy4gKi9cbi5vZmZyZURldGFpbHMsXG4ub2ZmcmVTdXJNZXN1cmUge1xuICAgIG1hcmdpbjogMCAwIDI1cHggMDtcbiAgICBmbGV4LWdyb3c6IDE7XG59XG5cbi8qIExpc3RlIGRlcyBkZXRhaWxzICovXG4ub2ZmcmVEZXRhaWxzIHtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbi8qIFVuIHNldWwgdHJhaXQsIGNsYWlyLCBwYXJ0b3V0IGRhbnMgbGEgbGlzdGUgOiBlbnRyZSBkZXV4IGxpZ25lcyBjb21tZSBzb3VzIHVuIHRpdHJlIGRlXG4gICBjaGFwaXRyZSAoLS1jQmxhbmMyLCBkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0xMC0xNCkuICovXG4ub2ZmcmVEZXRhaWxzIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogdmFyKC0tZ2FwRGVmYXV0KSAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jQmxhbmMyKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIyKTtcbn1cblxuLm9mZnJlRGV0YWlscyBsaTpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xufVxuXG4vKiBTb3VzLWxpZ25lIDogZWxsZSBkw6l0YWlsbGUgbGEgbGlnbmUgZHUgZGVzc3VzIChzb3VzIGxlcyBwYXJ0aWNpcGFudHMsIGNvbWJpZW4gcGFyIFFSXG4gICBjb2RlLCBjb21iaWVuIGF1eCBqZXV4IGludGVyYWN0aWZzKS4gTGUgcmV0cmFpdCBldCBsJ2Fic2VuY2UgZGUgZmlsZXQgYXUtZGVzc3VzIGQnZWxsZVxuICAgZGlzZW50IHF1J2VsbGUgZW4gZXN0IGxhIHN1aXRlLCBwYXMgdW4gZHJvaXQgZGUgcGx1cy4gKi9cbi5vZmZyZURldGFpbHMgbGkub2ZmcmVTb3VzTGlnbmUge1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcmV0cmFpdExpc3RlQ291cnQpO1xufVxuXG4ub2ZmcmVEZXRhaWxzIGxpOmhhcygrIGxpLm9mZnJlU291c0xpZ25lKSB7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuLyogTGlnbmUgc2FucyB0ZXh0ZSA6IGVsbGUgbmUgc2VydCBxdSfDoCB0ZW5pciBsZSByYW5nIGVudHJlIGNhcnRlcyBjw7R0ZSDDoCBjw7R0ZS4gU3VyIHVuZVxuICAgc2V1bGUgY29sb25uZSBpbCBuJ3kgYSBwbHVzIHJpZW4gZW4gZmFjZSwgZWxsZSBuZSBsYWlzc2VyYWl0IHF1J3VuIHRyb3UuIExhIGxpZ25lIHF1aSBsYVxuICAgcHLDqWPDqGRlIGZlcm1lIGFsb3JzIGxlIGJsb2MgOiBlbGxlIHJlcHJlbmQgbGUgZmlsZXQgcXVlIGxhIGxpZ25lIHZpZGUgcG9ydGFpdC4gKi9cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDIzcHgpIHtcbiAgICAub2ZmcmVEZXRhaWxzIGxpLm9mZnJlRGV0YWlsVmlkZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLm9mZnJlRGV0YWlscyBsaTpoYXMoKyBsaS5vZmZyZURldGFpbFZpZGUpIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNCbGFuYzIpO1xuICAgIH1cbn1cblxuLyogRW5jYWRyw6kgwqsgVW5pcXVlbWVudCBzdXIgbCdvZmZyZSBQcm8gwrsgKF9lbmNhcnRPZmZyZVByby50d2lnKSwgcG9zw6kgaG9ycyBkZSBsYSBwYWdlIGRlc1xuICAgdGFyaWZzIDogc3VyIGxhIHBhZ2UgZGUgbGEgcnVicmlxdWUgUXVpei4gSWwgcmVwcmVuZCBsZSBmb25kIGV0IGxhIGJvcmR1cmUgZGVcbiAgIGxhIGNhcnRlIFBybyBtaXNlIGVuIGF2YW50ICguY2FydGVPZmZyZUVuQXZhbnQpLCBwb3VyIHF1J29uIHJlY29ubmFpc3NlIGwnb2ZmcmUsIGV0IHRpZW50XG4gICBkYW5zIGxhIGxhcmdldXIgZGUgbGVjdHVyZS4gKi9cbi5lbmNhcnRPZmZyZVBybyB7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS1sYXJnZXVyVGV4dGUpO1xuICAgIG1hcmdpbjogMCAwIDFlbTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ2FydGUpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNPcjApO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNPcjMpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIyKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIyKTtcbn1cblxuLmVuY2FydE9mZnJlUHJvIHAge1xuICAgIG1hcmdpbjogMDtcbn1cblxuLmVuY2FydE9mZnJlUHJvIC5lbmNhcnRPZmZyZVByb1RpdHJlIHtcbiAgICBtYXJnaW46IDAgMCB2YXIoLS1nYXBSZWR1aXQpO1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTZTdHJvbmcpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG4vKiBMZXMgZGV1eCBsaWVucyBkJ3VuZSBub3RlLCDDoCBsYSBmYcOnb24gZGUgV2lraXDDqWRpYSA6IGxlIMKrIMK5IMK7IGRlIGxhIGxpZ25lIGV0IGxhIMKrIOKGkSDCuyBkZSBsYVxuICAgbm90ZS4gVW4gY2hpZmZyZSBlbiBleHBvc2FudCBlc3QgdW5lIGNpYmxlIG1pbnVzY3VsZSA6IGxhIHpvbmUgZGUgY2xpYyBkw6lib3JkZSBkdSBzaWduZVxuICAgKC0tcGFkZGluZ0V0aXF1ZXR0ZSksIGV0IGxlIHN1cnZvbCBsYSBtb250cmUgZCd1biBmb25kIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0xMC0xNCkuICovXG4ubGllblJlbnZvaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdFdGlxdWV0dGUpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5saWVuUmVudm9pOmhvdmVyLFxuLmxpZW5SZW52b2k6Zm9jdXMtdmlzaWJsZSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0FjY2VudDEpO1xufVxuXG4vKiBOb3RlIHNvdXMgbGEgZ3JpbGxlLCBvw7kgcmVudm9pZSBsZSDCqyDCuSDCuyBkJ3VuZSBsaWduZS4gRGFucyBsYSBmb250ZSBOT1JNQUxFIGR1IHRleHRlLFxuICAgcGFzIGxhIGZvbnRlIGZpbmUgZHUgc2Vjb25kIHBsYW4gKGNoZWYgZGUgcHJvamV0IDIwMjYtMTAtMDEpIDogZWxsZSByYXNzdXJlIHN1ciBsYSB0ZW51ZVxuICAgZHUgc2VydmV1ciwgZWxsZSBkb2l0IHNlIGxpcmUsIHBhcyBzZSBjYWNoZXIgY29tbWUgZGVzIHBldGl0ZXMgbGlnbmVzLiAqL1xuLm9mZnJlc05vdGUge1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjIpO1xufVxuXG4vKiBQcsOpY2lzaW9uIHNvdXMgdW5lIGxpZ25lIGRlIGTDqXRhaWwgOiBlbGxlIHBhc3NlIMOgIGxhIGxpZ25lIGV0IHMnZWZmYWNlIOKAlCBjJ2VzdCBsYSBmb250ZVxuICAgZHUgc2Vjb25kIHBsYW4sIGNlbGxlIHF1aSBpbmZvcm1lIHNhbnMgYXJyw6p0ZXIgbGEgbGVjdHVyZS4gKi9cbi5vZmZyZVByZWNpc2lvbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZm9udDogdmFyKC0tZkxpZ2h0MTQpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xufVxuXG4vKiBUaXRyZSBkZSBjaGFwaXRyZSBkYW5zIGxhIGxpc3RlIGRlIGTDqXRhaWxzICjCqyBQYXIgw6l2w6luZW1lbnQgwrspLiBDJ2VzdCB1bmUgbGlnbmUgZGUgbGFcbiAgIGxpc3RlIGNvbW1lIGxlcyBhdXRyZXMg4oCUIG3Dqm1lIHJhbmcsIGRvbmMgbcOqbWUgYWxpZ25lbWVudCBkJ3VuZSBjYXJ0ZSDDoCBsJ2F1dHJlIOKAlCBtYWlzXG4gICBlbGxlIGFubm9uY2UgbGVzIGxpZ25lcyBxdWkgc3VpdmVudCBhdSBsaWV1IGQnw6lub25jZXIgdW4gZHJvaXQgOiBwYXMgZGUgdHJhaXQgZGVcbiAgIHPDqXBhcmF0aW9uIHNvdXMgZWxsZSwgZXQgZGUgbCdhaXIgYXUtZGVzc3VzIHBvdXIgZMOpdGFjaGVyIGxlIGNoYXBpdHJlIGR1IHByw6ljw6lkZW50LiAqL1xuLm9mZnJlRGV0YWlscyBsaS5vZmZyZUNoYXBpdHJlIHtcbiAgICAvKiBMJ2FpciBlc3QgQVUtREVTU1VTIGV0IG51bGxlIHBhcnQgYWlsbGV1cnMgOiBpbCBkw6l0YWNoZSBsZSBjaGFwaXRyZSBkZSBjZWx1aSBxdWlcbiAgICAgICBwcsOpY8OoZGUsIGV0IHJpZW4gbmUgdmllbnQgcydpbnRlcmNhbGVyIGVudHJlIGxlIHRpdHJlIGV0IHNvbiBncm91cGUuICovXG4gICAgbWFyZ2luOiAyNHB4IDAgMDtcbiAgICBwYWRkaW5nOiAwIDAgdmFyKC0tZ2FwRGVmYXV0KTtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1jQmxhbmMyKTtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2U3Ryb25nKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG59XG5cbi8qIExlIHByZW1pZXIgcG9pbnQgZCd1biBjaGFwaXRyZSBlc3QgQ09MTMOJIMOgIHNvbiB0aXRyZSA6IGMnZXN0IGNlIGNvbGxhZ2UgcXVpIGRpdCBxdSdpbCBsdWlcbiAgIGFwcGFydGllbnQuIE9uIGx1aSByZXRpcmUgbGEgbWFyZ2UgaGF1dGUgcXUnaWwgdGllbnQgZGUgbGEgbGlzdGUsIGV0IHNldWxlbWVudCBlbGxlIDogc29uXG4gICByZXRyYWl0IGRlIDhweCByZXN0ZSwgc2lub24gbGUgdGV4dGUgdmllbmRyYWl0IHRvdWNoZXIgbGUgZmlsZXQgZHUgdGl0cmUuIExlIHJ5dGhtZSBub3JtYWxcbiAgIHJlcHJlbmQgZMOocyBsYSBsaWduZSBzdWl2YW50ZSwgcXVpIG4nZXN0IHBsdXMgdm9pc2luZSBkJ3VuIHRpdHJlLiAqL1xuLm9mZnJlRGV0YWlscyBsaS5vZmZyZUNoYXBpdHJlICsgbGkge1xuICAgIG1hcmdpbi10b3A6IDA7XG59XG5cbi5vZmZyZURldGFpbHMgbGkub2ZmcmVDaGFwaXRyZTpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMDtcbn1cblxuLyogQmxvYyBzdXIgbWVzdXJlIChQcmVtaXVtKSA6IHJlbXBsYWNlIGxhIGxpc3RlIGRlIGTDqXRhaWxzLiBUZXh0ZSDDoCBsYSB0YWlsbGUgZGVzIGxpZ25lcyBkZVxuICAgZMOpdGFpbCBkJ2VuIGZhY2UsIGRvbmMgcGx1cyBncm9zIHF1ZSBsYSBkZXNjcmlwdGlvbiBxdWkgbGUgcHLDqWPDqGRlLiBTYSBnw6lvbcOpdHJpZSBkZSBibG9jXG4gICBlc3QgcGx1cyBoYXV0LCBhdmVjIC5vZmZyZURldGFpbHMuICovXG4ub2ZmcmVTdXJNZXN1cmUge1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjIpO1xufVxuXG4vKiBFeGFjdGVtZW50IGxlIHJ5dGhtZSB2ZXJ0aWNhbCBkJ3VuZSBsaWduZSBkZSBkw6l0YWlsIChsaSA6IHNhbnMgbWFyZ2UsIHBhZGRpbmcgOHB4KSA6XG4gICBsYSBwcmVtacOocmUgcGhyYXNlIGTDqW1hcnJlIMOgIGxhIGhhdXRldXIgZGUgbGEgcHJlbWnDqHJlIGxpZ25lIGRlIGxhIGNhcnRlIGQnw6AgY8O0dMOpLiAqL1xuLm9mZnJlU3VyTWVzdXJlIHAge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiB2YXIoLS1nYXBEZWZhdXQpIDA7XG59XG5cbi8qIEFjdGlvbiAoYXByw6hzIGxlIHNvdXMtdGl0cmUsIGF2YW50IGRlc2NyaXB0aW9uKSAqL1xuLm9mZnJlQWN0aW9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxuXG4vKiBDVEEgcG91ciBsZXMgb2ZmcmVzLiBMYXJnZXVyIGV4cGxpY2l0ZSA6IGxlIG3Dqm1lIGJvdXRvbiBlc3QgdW4gbGllbiBwb3VyIGxlIHZpc2l0ZXVyXG4gICBkw6ljb25uZWN0w6kgZXQgdW4gPGJ1dHRvbj4gZCdhY3Rpb24gcG91ciBsZSBjb25uZWN0w6kgKF9jYXJ0ZU9mZnJlLnR3aWcpLCBldCB1biA8YnV0dG9uPiBlblxuICAgZGlzcGxheTogYmxvY2sgZ2FyZGUgbGEgbGFyZ2V1ciBkZSBzb24gdGV4dGUsIGzDoCBvw7kgdW4gbGllbiBwcmVuZCB0b3V0ZSBsYSBjYXJ0ZSAodnUgZW5cbiAgIHByb2R1Y3Rpb24gbGUgMjAyNi0xMC0xMykuIExlIGZvcm11bGFpcmUgYXV0b3VyIGR1IDxidXR0b24+IG5lIGNvbXB0ZSBwYXMgOiBpbCBuZSBwcmVuZFxuICAgYXVjdW5lIHBsYWNlIChmb3JtLmZvcm1Cb3V0b25BY3Rpb24sIGZvcm0uY3NzKS4gTGUgcGV0aXQgwqsgY3RhMTQgY3RhT3IgwrsgZ2FyZGUgc2EgbGFyZ2V1ciBhdXRvbWF0aXF1ZSAoMzFfY3RhLmNzcyxcbiAgIGRldXggY2xhc3NlcywgcHJpb3JpdGFpcmUpLiAqL1xuLmN0YU9yIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ3RhKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jT3IzKTtcbiAgICBjb2xvcjogdmFyKC0tY09ydCk7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICBmb250OiB2YXIoLS1mQ3RhMTYpO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uY3RhT3I6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNPcjQpO1xuICAgIGNvbG9yOiB2YXIoLS1jT3J0KTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIE9GRlJFIEFDVElWRSAocG9zc8OpZMOpZSBwYXIgbCd1dGlsaXNhdGV1cilcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi5jYXJ0ZU9mZnJlQWN0aXZlIHtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1jTm9pcik7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tb21icmVQb3J0ZWUpO1xufVxuXG4uYmFkZ2VPZmZyZUFjdGl2ZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogLTEycHg7XG4gICAgbGVmdDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jTm9pcik7XG4gICAgY29sb3I6IHZhcigtLWNCbGFuYyk7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0JhZGdlKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJQaWx1bGUpO1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTQpO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLm9mZnJlU3RhdHV0IHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5vZmZyZVJlbm91dmVsbGVtZW50LFxuLm9mZnJlRXhwaXJhdGlvbiB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG59XG5cbi8qIE9mZnJlIGluZGlzcG9uaWJsZSAqL1xuLm9mZnJlSW5kaXNwb25pYmxlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0N0YSk7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jMik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyNCk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGZvbnQ6IHZhcigtLWZMaWdodDE0KTtcbn1cblxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExFIFRJVFJFIERFIFBBR0Ug4oCUIFVORSBTRVVMRSBSw4hHTEUsIHBvdXIgdG91dGVzIGxlcyBwYWdlcyBkZSBsYSBWaXRyaW5lXG4gICAoZMOpY2lzaW9uIGR1IGNoZWYgZGUgcHJvamV0LCAyMDI2LTEwLTE1KVxuXG4gICBBdmFudCA6IGxlIG5veWF1IGxhaXNzYWl0IDEwcHggYXUtZGVzc3VzIGQndW4gaDEgKHBhcnRhZ8OpIGF2ZWMgbGUgU3R1ZGlvLCBvbiBuZSBsZSB0b3VjaGVcbiAgIHBhcyksIGV0IGNoYXF1ZSBnYWJhcml0IGNvcnJpZ2VhaXQgZGUgc29uIGPDtHTDqSDigJQgM3JlbSBpY2ksIHJpZW4gbMOgIOKAlCBzaSBiaWVuIHF1ZSBsZSB0aXRyZVxuICAgdG9tYmFpdCDDoCA0MHB4LCA3OHB4IG91IDEzNnB4IHNvdXMgbGEgYmFycmUgc2Vsb24gbGEgcGFnZSBldCBzZWxvbiBxdSdvbiDDqXRhaXQgY29ubmVjdMOpLlxuXG4gICBNYWludGVuYW50IDogbGUgdGl0cmUgZCd1bmUgcGFnZSBlc3QgbGUgcHJlbWllciBlbmZhbnQgZGUgLmNvbnRlbnUsIGV0IGlsIHNlIHBvc2Ugw6AgbGFcbiAgIG3Dqm1lIGhhdXRldXIgcGFydG91dCDigJQgdmFyKC0tcGFkZGluZ1BhZ2UpIGR1IGhhdXQgKyAtLW1hcmdlVGl0cmVQYWdlLiBDZSBmaWNoaWVyIGVzdFxuICAgY2hhcmfDqSBwYXIgbGVzIERFVVggcGFxdWV0cyAodml0cmluZSBldCB2aXRyaW5lQ29tcHRlKSA6IGMnZXN0IGNlIHF1aSBnYXJhbnRpdCBxdWVcbiAgIGwnZXNwYWNlIENvbXB0ZSBldCBsZSBwdWJsaWMgbmUgZGlmZsOocmVudCBwbHVzLlxuXG4gICBBTElHTkVNRU5UIDogw6AgZ2F1Y2hlLCBwYXJ0b3V0LiBTZXVsZSBleGNlcHRpb24sIHZvdWx1ZSA6IGxlIHRpdHJlIGRlIGxhIGdyaWxsZSBkZXMgb2ZmcmVzXG4gICAob2ZmcmVzLmNzcyksIHF1aSBlc3QgY2VudHLDqSBwYXJjZSBxdWUgbGEgZ3JpbGxlIGwnZXN0LlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuOnJvb3Qge1xuICAgIC0tbWFyZ2VUaXRyZVBhZ2U6IDNyZW07XG59XG5cbi8qIExlIG3Dqm1lIHBhZGRpbmcgZGUgcGFnZSBkYW5zIGxlIHB1YmxpYyBldCBkYW5zIGxlIGNvbXB0ZSAobGUgbm95YXUsIGx1aSwgZG9ubmUgMTBweCA0MHB4IMOgXG4gICAuY29udGVudSA6IGMnZXN0IHBvdXIgbGUgU3R1ZGlvKS4gKi9cbi5jb250ZW51IHtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nUGFnZSk7XG59XG5cbi5jb250ZW51ID4gaDEsXG4ucGFnZU9mZnJlcyA+IGgxIHtcbiAgICBtYXJnaW4tYmxvY2s6IHZhcigtLW1hcmdlVGl0cmVQYWdlKTtcbn1cblxuLyogTGEgem9uZSBkZXMgbWVzc2FnZXMgZmxhc2ggbmUgcsOpc2VydmUgcGx1cyByaWVuIHF1YW5kIGVsbGUgZXN0IHZpZGUuIEVsbGUgZXN0IMOpY3JpdGUgcGFyIGxlXG4gICBzZXJ2ZXVyIChhdWN1biBKUyBuZSBsJ2luc8OocmUgYXByw6hzIGNvdXApIDogbGEgcGxhY2UgZ2FyZMOpZSBuZSBzZXJ2YWl0IMOgIHJpZW4sIGV0IHBvdXNzYWl0XG4gICBsZSB0aXRyZSBkZSA1OHB4IHNvdXMgbGEgYmFycmUuIFNvdXMgdW4gbWVzc2FnZSwgbGUgdGl0cmUgcmVkZXNjZW5kIGRlIGxhIGhhdXRldXIgZHVcbiAgIG1lc3NhZ2UsIGNvbW1lIGlsIHNlIGRvaXQuIEljaSBldCBwYXMgZGFucyBsZSBub3lhdSA6IGxlIFN0dWRpbyBnYXJkZSBsYSBzaWVubmUuICovXG4uem9uZUZsYXNoIHtcbiAgICBtaW4taGVpZ2h0OiAwO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi56b25lRmxhc2g6aGFzKD4gZGl2KSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICDDjkxPVCBERVMgUlVCUklRVUVTIEQnQVBFUsOHVSAoSG9tZSlcbiAgIEluY2x1ZGUgOiB2aXRyaW5lL18vX2lsb3RSdWJyaXF1ZXMudHdpZ1xuICAgTcOqbWUgcGF0cm9uIHF1ZSBpbG90U2NlbmVzLmNzcyA6IHVuZSBzZWN0aW9uLCB1blxuICAgSDIsIHNhIGxpc3RlLiBMJ8OpY2FydCBhdmVjIGNlIHF1aSBwcsOpY8OoZGVcbiAgIGFwcGFydGllbnQgw6AgbGEgc2VjdGlvbiwgcGFzIMOgIHNvbiB0aXRyZS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIExhIHNlY3Rpb24gc2UgZMOpY2xhcmUgQ09OVEVORVVSIERFIFJFUVXDilRFIDogbGEgZGlzcG9zaXRpb24gKGxpc3RlIMOgIGPDtHTDqVxuICAgZGUgbCdpbWFnZSwgb3UgZGVzc291cykgZXQgbGEgdGFpbGxlIGRlIGwnaW1hZ2Ugc2UgZMOpY2lkZW50IHN1ciBsYSBwbGFjZVxuICAgcsOpZWxsZW1lbnQgb2ZmZXJ0ZSDDoCBsJ8OubG90LCBwYXMgc3VyIGxhIGxhcmdldXIgZGVcbiAgIGxhIGZlbsOqdHJlLiBVbmUgbWVkaWEgcXVlcnkgb2JsaWdlcmFpdCDDoCBkZXZpbmVyIGNlIHF1ZSBsYSBwYWdlIHByZW5kXG4gICBkw6lqw6AgZW4gbWFyZ2VzIOKAlCBldCDDoCBsYSBjb3JyaWdlciBsZSBqb3VyIG/DuSBsYSBwYWdlIGNoYW5nZS4gKi9cbi5pbG90UnVicmlxdWVzIHtcbiAgICBtYXJnaW4tdG9wOiA4cmVtO1xuICAgIGNvbnRhaW5lcjogaWxvdFJ1YnJpcXVlcyAvIGlubGluZS1zaXplO1xufVxuXG4uaWxvdFJ1YnJpcXVlcyA+IGgyIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcbn1cblxuLyogTGUgbWFya2Rvd24gZGUgYGludHJvYCwgw6AgbGEgcGxhY2UgZHUgSDIuIFNvbiB0aXRyZSBlc3QgREFOUyBsZSBibG9jLCBkb25jIGxhIHLDqGdsZVxuICAgYC5pbG90UnVicmlxdWVzID4gaDJgIGNpLWRlc3N1cyBuZSBsJ2F0dGVpbnQgcGFzIDogYydlc3QgY2UgYmxvYyBxdWkgcG9ydGUgbCfDqWNhcnQuICovXG4uaWxvdFJ1YnJpcXVlc0ludHJvIHtcbiAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XG59XG5cbi8qIFNhbnMgw6dhLCBsYSBtYXJnZSBkdSB0aXRyZSBkdSBtYXJrZG93biBzJ2Fqb3V0ZSDDoCBjZWxsZSBkdSBibG9jIGV0IGNyZXVzZSB1biB0cm91LiAqL1xuLmlsb3RSdWJyaXF1ZXNJbnRybyA+ICo6Zmlyc3QtY2hpbGQge1xuICAgIG1hcmdpbi10b3A6IDA7XG59XG5cbi5pbG90UnVicmlxdWVzSW50cm8gPiAqOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi8qIExBIExJU1RFIMOAIEPDlFTDiSBERSBMJ0lNQUdFIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0yNCkuIFVuZSBydWJyaXF1ZSBwYXIgbGlnbmUgOlxuICAgbGEgZ3JpbGxlIGRlIHR1aWxlcyBkb25uYWl0IGRlcyByYW5nw6llcyBiYW5jYWxlcyAoMyArIDEgcG91ciBxdWF0cmUgcnVicmlxdWVzKSBldCBkZXNcbiAgIGNhcnRlcyBkZSBoYXV0ZXVycyBkaWZmw6lyZW50ZXMuIFVuZSBsaXN0ZSBwcmVuZCBkZXV4IHJ1YnJpcXVlcyBjb21tZSBzaXggc2FucyBjaGFuZ2VyIGRlXG4gICBmb3JtZSwgZXQgbCfFk2lsIGxhIGxpdCBkJ3VuIHNldWwgdHJhaXQsIGR1IGhhdXQgdmVycyBsZSBiYXMuXG5cbiAgIExhIGxpc3RlIGEgdW5lIGxhcmdldXIgQk9STsOJRSwgbCdpbWFnZSBwcmVuZCBsYSBzaWVubmUsIGV0IGMnZXN0IGxlIENPVVBMRSBxdSdvbiBjZW50cmUgOlxuICAgbGEgbGlzdGUgcmVzdGUgY29sbMOpZSDDoCBzb24gaW1hZ2UgKGxvaSBkZSBwcm94aW1pdMOpKSwgcXVlIGwnaW1hZ2Ugc29pdCBwcmVzcXVlIGNhcnLDqWUgb3VcbiAgIGVuIGxhcmdldXIuXG5cbiAgIFVORSBTRVVMRSDDiUNIRUxMRSBQT1VSIFRPVVRFIExBIFPDiVJJRSAocsOoZ2xlIGRlIHRhaWxsZSBkZSBzw6lyaWUsIGRpcmVjdGlvbkFydGlzdGlxdWVJbWFnZXMubWQpIDpcbiAgIGxlcyBwZXJzb25uYWdlcyBnYXJkZW50IGxhIG3Dqm1lIHRhaWxsZSBkJ3VuZSBpbWFnZSDDoCBsJ2F1dHJlLiBMZXMgaW1hZ2VzIHNvbnQgZXhwb3J0w6llcyDDoFxuICAgbGEgaGF1dGV1ciBkZSBsZXVyIGNhZHJlIGQnb3JpZ2luZSAoOTQxcHgsIHJvZ27DqWVzIGVuIGxhcmdldXIgc2V1bGVtZW50KSBldCBhZmZpY2jDqWVzXG4gICB0b3V0ZXMgw6AgbGEgTcOKTUUgaGF1dGV1ci4gQ2V0dGUgaGF1dGV1ciBlc3QgY2VsbGUgcXVpIGxhaXNzZSB0ZW5pciBsYSBwbHVzIGxhcmdlIGRlIGxhXG4gICBzw6lyaWUgKDE2MDQgw5cgOTQxLCBjYXB0dXJlci1kZXMtbGVhZHMpIGRhbnMgY2UgcXVlIGxhIGxpc3RlIGV0IGwnw6ljYXJ0IGxhaXNzZW50IGRlXG4gICBsJ8OubG90IDogKDEwMGNxaSDiiJIgbGlzdGUg4oiSIMOpY2FydCkgw5cgOTQxIC8gMTYwNCA7IGF1LWRlbMOgLCB1biBwbGFmb25kIGRlIDQyMHB4LlxuICAgY3FpIHNlIG1lc3VyZSBzdXIgbCfDrmxvdCAoLmlsb3RSdWJyaXF1ZXMsIGNvbnRlbmV1ciBkZSByZXF1w6p0ZSkgOiBhdWN1biBjb250ZW5ldXIgbmUgZG9pdFxuICAgcydpbnRlcmNhbGVyIGVudHJlIGx1aSBldCBsJ2ltYWdlLiAqL1xuLmlsb3RSdWJyaXF1ZXNDb3JwcyB7XG4gICAgLyogNDUlIGRlIGwnw65sb3QsIGVudHJlIDQ0MCBldCA2NDBweCA6IHN1ciB1biDDrmxvdCDDqXRyb2l0IGxhIGxpc3RlIGPDqGRlIHVuIHBldSBkZSBwbGFjZVxuICAgICAgIHBvdXIgcXVlIGwnaW1hZ2UgbmUgcmFwZXRpc3NlIHBhcyB0cm9wLiAqL1xuICAgIC0tbGFyZ2V1ckxpc3RlOiBjbGFtcCg0NDBweCwgNDVjcWksIDY0MHB4KTtcbiAgICAtLWVjYXJ0Q29ycHM6IDY0cHg7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCB2YXIoLS1sYXJnZXVyTGlzdGUpKSBhdXRvO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiB2YXIoLS1lY2FydENvcnBzKTtcbn1cblxuLmlsb3RSdWJyaXF1ZXNJbGx1c3RyYXRpb24gaW1nIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogYXV0bztcbiAgICBoZWlnaHQ6IG1pbig0MjBweCwgY2FsYygoMTAwY3FpIC0gdmFyKC0tbGFyZ2V1ckxpc3RlKSAtIHZhcigtLWVjYXJ0Q29ycHMpKSAqIDk0MSAvIDE2MDQpKTtcbn1cblxuLyogSW1hZ2Ugw6AgZ2F1Y2hlLCBsaXN0ZSDDoCBkcm9pdGUgKGBpbGx1c3RyYXRpb25BR2F1Y2hlYCkuIFNldWwgbCdvcmRyZSBWSVNVRUwgY2hhbmdlIDpcbiAgIGwnaW1hZ2UgZXN0IGTDqWNvcmF0aXZlLCBsZSBIVE1MIGdhcmRlIGxhIGxpc3RlIGVuIHByZW1pZXIuICovXG4uaWxvdFJ1YnJpcXVlc0NvcnBzSW52ZXJzZSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIG1pbm1heCgwLCB2YXIoLS1sYXJnZXVyTGlzdGUpKTtcbn1cblxuLmlsb3RSdWJyaXF1ZXNDb3Jwc0ludmVyc2UgLmlsb3RSdWJyaXF1ZXNJbGx1c3RyYXRpb24ge1xuICAgIG9yZGVyOiAtMTtcbn1cblxuLyogw45sb3Qgw6l0cm9pdCA6IGwnaW1hZ2UgcGFzc2UgYXUtZGVzc3VzIGRlIGxhIGxpc3RlLCB0b3V0ZXMgZGV1eCBjZW50csOpZXMuIEVuIGRlc3NvdXMgZGVcbiAgIDEwMDBweCwgbCdpbWFnZSBwb3PDqWUgw6AgY8O0dMOpIHRvbWJlcmFpdCBzb3VzIGxlcyAyOTBweCBkZSBoYXV0LiAqL1xuQGNvbnRhaW5lciBpbG90UnVicmlxdWVzIChtYXgtd2lkdGg6IDk5OXB4KSB7XG4gICAgLmlsb3RSdWJyaXF1ZXNDb3JwcyxcbiAgICAuaWxvdFJ1YnJpcXVlc0NvcnBzSW52ZXJzZSB7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcik7XG4gICAgICAgIGdhcDogdmFyKC0tZ2FwTGlzdGUpO1xuICAgIH1cblxuICAgIC5pbG90UnVicmlxdWVzSWxsdXN0cmF0aW9uIHtcbiAgICAgICAgZ3JpZC1yb3c6IDE7XG4gICAgICAgIGp1c3RpZnktc2VsZjogY2VudGVyO1xuICAgIH1cblxuICAgIC5pbG90UnVicmlxdWVzSWxsdXN0cmF0aW9uIGltZyB7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiBtaW4oMzQwcHgsIGNhbGMoMTAwY3FpICogOTQxIC8gMTYwNCkpO1xuICAgIH1cblxuICAgIC5pbG90UnVicmlxdWVzTGlzdGUge1xuICAgICAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG1heC13aWR0aDogNjQwcHg7XG4gICAgfVxufVxuXG4vKiBTYW5zIGlsbHVzdHJhdGlvbiwgbGEgbGlzdGUgc2V1bGUsIGNlbnRyw6llLiAqL1xuLmlsb3RSdWJyaXF1ZXMgPiAuaWxvdFJ1YnJpcXVlc0xpc3RlIHtcbiAgICBtYXgtd2lkdGg6IDY0MHB4O1xuICAgIG1hcmdpbi1pbmxpbmU6IGF1dG87XG59XG5cbi5pbG90UnVicmlxdWVzTGlzdGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcE1veWVuKTtcbn1cblxuLyogVU5FIExJR05FID0gdW4gbGllbiA6IGwnaWPDtG5lLCBwdWlzIGxlIG5vbSBldCBsJ2FjY3JvY2hlIGRlc3NvdXMuXG4gICBNw6ptZSBoYXV0ZXVyIG1pbmltYWxlIHBhcnRvdXQgOiBkJ3VuIMOubG90IMOgIGwnYXV0cmUsIGxlcyBsaWduZXMgb250IGxhIG3Dqm1lIHRhaWxsZSxcbiAgIHF1ZWwgcXVlIHNvaXQgbGV1ciBub21icmUuICovXG4uY2FydGVSdWJyaXF1ZSB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gMWZyO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBhdXRvO1xuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHJvdy1nYXA6IDJweDtcbiAgICBjb2x1bW4tZ2FwOiAyMHB4O1xuICAgIG1pbi1oZWlnaHQ6IDk2cHg7XG4gICAgcGFkZGluZzogMTRweCAyNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNCbGFuYyk7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIyKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzLCBib3gtc2hhZG93IDAuM3M7XG59XG5cbi8qIEwnb21icmUgYXUgc3Vydm9sIGRpdCDCqyBvYmpldCBjbGlxdWFibGUgwrsuIFBhcyBkZSBmbMOoY2hlIGF1IGJvdXQgZGUgbGEgbGlnbmUgOiBlc3NhecOpZSxcbiAgIHJlZnVzw6llIHBhciBsZSBjaGVmIGRlIHByb2pldCBsZSAyMDI2LTA5LTI0LiAqL1xuLmNhcnRlUnVicmlxdWU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNCbGFuYzAyKTtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1vbWJyZVBvcnRlZSk7XG59XG5cbi5jYXJ0ZVJ1YnJpcXVlID4gKiB7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4vKiBQbGFjZW1lbnRzIGV4cGxpY2l0ZXMgOiBsZSB0d2lnIG4nYWZmaWNoZSBsJ2ljw7RuZSBxdWUgc2kgbGEgcnVicmlxdWUgZW4gYSB1bmUsIGV0IHNhbnNcbiAgIGNlcyByw6hnbGVzIGxlIHRpdHJlIGdsaXNzZXJhaXQgZW4gY29sb25uZSAxLiBMZSB0aXRyZSBkZSBsaWduZSByZXN0ZSB1biBoMyAoc291cyBsZSBoMlxuICAgZGUgbCfDrmxvdCA6IGhpw6lyYXJjaGllIGp1c3RlIHBvdXIgbGUgU0VPKSwgw6AgbGEgZm9udGUgZHUgaDIuICovXG4uY2FydGVSdWJyaXF1ZSBoMyB7XG4gICAgZ3JpZC1jb2x1bW46IDI7XG4gICAgZm9udDogdmFyKC0tZkgyKTtcbn1cblxuLyogQWNjcm9jaGUgZW4gZ3JpcyA6IHNhbnMgw6ljYXJ0IGRlIGNvdWxldXIgYXZlYyBsZSB0aXRyZSwgbGVzIGRldXggcMOoc2VudCBwYXJlaWwuICovXG4uY2FydGVSdWJyaXF1ZSBwIHtcbiAgICBncmlkLWNvbHVtbjogMjtcbiAgICBncmlkLXJvdzogMjtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuLyogSWPDtG5lIFNWRyBpbmxpbmUgKHN0cm9rZTogY3VycmVudENvbG9yIOKGkiBjb2xvcsOpZSBwYXIgbGEgcHJvcHJpw6l0w6kgY29sb3IpICovXG4uaWNvbmVSdWJyaXF1ZSB7XG4gICAgZ3JpZC1jb2x1bW46IDE7XG4gICAgZ3JpZC1yb3c6IDEgLyBzcGFuIDI7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbn1cblxuLmljb25lUnVicmlxdWUgc3ZnIHtcbiAgICB3aWR0aDogNTJweDtcbiAgICBoZWlnaHQ6IDUycHg7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8qIFTDqWzDqXBob25lIDogbGEgbGlnbmUgc2UgcmVzc2VycmUsIGwnaWPDtG5lIGF1c3NpLiAqL1xuQGNvbnRhaW5lciBpbG90UnVicmlxdWVzIChtYXgtd2lkdGg6IDUzMXB4KSB7XG4gICAgLmNhcnRlUnVicmlxdWUge1xuICAgICAgICBjb2x1bW4tZ2FwOiAxNHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgfVxuXG4gICAgLmljb25lUnVicmlxdWUgc3ZnIHtcbiAgICAgICAgd2lkdGg6IDQwcHg7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBEQU5TIExFIEJBTkRFQVUg4oCUIGdyYW5kcyDDqWNyYW5zIHNldWxlbWVudCAocGFnZVJ1YnJpcXVlLmNzcylcbiAgIE3Dqm1lIHLDqGdsZSBxdWUgbCdpbnRybyBkJ3VuIMOubG90IGRlIHNjw6huZXMgKGlsb3RTY2VuZXMuY3NzKSA6IGxlIHBhcmFncmFwaGUgZXN0IGJvcm7DqSDDoFxuICAgbGEgbGFyZ2V1ciBkZSBsZWN0dXJlIGV0IGMnZXN0IGxlIEJMT0MgcXUnb24gY2VudHJlIDsgc29uIHRleHRlIHJlc3RlIGFsaWduw6kgw6AgZ2F1Y2hlLlxuICAgTGUgdGl0cmUsIGx1aSwgZXN0IGNlbnRyw6kgcGFyIHBhZ2VSdWJyaXF1ZS5jc3MuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuQG1lZGlhIChtaW4td2lkdGg6IDE2MDBweCkge1xuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90UnVicmlxdWVzSW50cm8gcCB7XG4gICAgICAgIG1heC13aWR0aDogdmFyKC0tbGFyZ2V1clRleHRlKTtcbiAgICAgICAgbWFyZ2luLWlubGluZTogYXV0bztcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB9XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTUVOVSBERVMgQ0hBUElUUkVTLCDDgCBMJ0hPUklaT05UQUxFIOKAlCAuY2hhcGl0cmVzSG9yaXpvbnRhbFxuICAgVXNhZ2VzIDogbGEgSG9tZSAobGVzIHRyb2lzIGZhbWlsbGVzIGRlIHJ1YnJpcXVlcyksIFRpcmFnZSBhdSBzb3J0IChzY8OobmVzLCBhYnNlbnRzLFxuICAgc2PDqW5hcmlvcykuXG5cbiAgIExlIGZyw6hyZSBjb3VjaMOpIGR1IG1lbnUgZGVzIGNoYXBpdHJlcyAoLmNoYXBpdHJlcywgcGFnZUNoYXBpdHJlcy5jc3MpIDogbcOqbWUgc2NyaXB0XG4gICAoY2hhcGl0cmVzLnRzKSwgbcOqbWUgcGF2w6kgYmxldSBxdWkgZ2xpc3NlIHN1ciBsYSBwYXJ0aWUgb8O5IGwnb24gc2UgdHJvdXZlLiBVbmVcbiAgIENMQVNTRSBldCBub24gdW4gaWRlbnRpZmlhbnQgOiB1bmUgcGFnZSBwZXV0IGVuIHBvcnRlciBwbHVzaWV1cnMsIGNoYWN1biBuZSBzdWl0IHF1ZVxuICAgbGVzIHNlY3Rpb25zIHF1J2lsIGxpc3RlLlxuXG4gICBERVVYIMOJVEFUUyAoY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0yMykgOlxuICAgLSBBVSBSRVBPUywgaWwgZmxvdHRlIGp1c3RlIGF1LWRlc3N1cyBkZXMgw65sb3RzIHF1J2lsIGRlc3NlcnQgZXQgbW9yZCB1biBwZXUgZGFucyBsZXVyXG4gICAgIGJhbmRlYXUgOiBsYSBsb2kgZGUgcHJveGltaXTDqSBkaXQgcXUnaWwgbGV1ciBhcHBhcnRpZW50LiBTYSBwbGFjZSBzZSByw6hnbGUgc3VyIGxlIGTDqWJ1dFxuICAgICBkZXMgw65sb3RzLCBqYW1haXMgc3VyIGxlIHRleHRlIHF1aSBwcsOpY8OoZGUuXG4gICAtIENPTEzDiSAoYGNoYXBpdHJlc0NvbGxlYCwgcG9zw6kgcGFyIGNoYXBpdHJlcy50cyBhdSBwaXhlbCBwcsOocywgcXVhbmQgc2VzIGVudHLDqWVzXG4gICAgIGFycml2ZW50IMOgIGxldXIgcGxhY2UgZGFucyBsZSBiYW5kZWF1KSwgaWwgZGV2aWVudCB1biBiYW5kZWF1IGRlIHZlcnJlIGQndW4gYm9yZCDDoCBsJ2F1dHJlIGR1IG5hdmlnYXRldXIsIGRvbnQgbGVcbiAgICAgaGF1dCDigJQgbCdhaXIgZHUgZGVzc3VzIGV0IGwnb21icmUg4oCUIHNvcnQgcGFyIGxlIGhhdXQgZGUgbGEgZmVuw6p0cmUuXG4gICBBcHLDqHMgbGEgZGVybmnDqHJlIHNlY3Rpb24sIGlsIGRpc3BhcmHDrnQgKGBjaGFwaXRyZXNQYXNzZXNgLCBjaGFwaXRyZXMudHMpLlxuXG4gICBMRSA8bmF2PiBFU1QgVU5FIEFOQ1JFIERFIEhBVVRFVVIgTlVMTEUsIHBvc8OpZSBleGFjdGVtZW50IGF1IGTDqWJ1dCBkZXMgw65sb3RzIDogaWwgbmVcbiAgIHByZW5kIGF1Y3VuZSBwbGFjZSBkYW5zIGxhIHBhZ2UsIGxlIGJsYW5jIGF1LWRlc3N1cyBkZXMgw65sb3RzIHJlc3RlIGxlIGxldXIuIExhIGJvw650ZVxuICAgdmlzaWJsZSwgYydlc3QgbGUgPHVsPiA6IGlsIGTDqWJvcmRlIFZFUlMgTEUgSEFVVCBkZSBsJ2FuY3JlIChhbGlnbi1pdGVtczogZmxleC1lbmQgc3VyIHVuZVxuICAgaGF1dGV1ciBudWxsZSkuXG5cbiAgIE1hdGnDqHJlIDogY2VsbGUgZGUgbGEgYmFycmUgZXQgZGUgbGEgYnVsbGUgZGVzIGFwZXLDp3VzIChub3lhdS9zYWxsZS9lY3Jhbi9jc3MvXG4gICBfcHJldmlldy5jc3MpIOKAlCBtw6ptZSB2ZXJyZSwgbcOqbWUgZmxvdSwgbcOqbWUgZ3JhbmQgYWlyLCBtw6ptZSByZXBsaS4gU29uIG9tYnJlLCBsZSBtZW51XG4gICBuZSBsYSBwcmVuZCBxdWUgY29sbMOpIDogYXUgcmVwb3MsIHVuIHNpbXBsZSBjb250b3VyLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLmNoYXBpdHJlc0hvcml6b250YWwge1xuICAgIC8qIERhbnMgdW4gYXJ0aWNsZSAoZ3JpbGxlIHRleHRlIHwgaW1hZ2UpLCBsJ2FuY3JlIHByZW5kIHRvdXRlIGxhIGxhcmdldXIgY29tbWUgbGVzXG4gICAgICAgw65sb3RzIHF1J2VsbGUgZGVzc2VydCA6IGMnZXN0IGFydGljbGVWaXRyaW5lLmNzcyBxdWkgbGUgZGl0LCBsw6Agb8O5IGlsIHDDqHNlIGFzc2V6LiAqL1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgIGhlaWdodDogMDtcbiAgICAvKiBMZSBibGFuYyBxdWkgc8OpcGFyZSBsJ2FydGljbGUgZGVzIMOubG90cyA6IGNlbHVpIHF1ZSBsZSBiYW5kZWF1IHBvcnRlIGQnb3JkaW5haXJlXG4gICAgICAgKHBhZ2VSdWJyaXF1ZS5jc3MpLiBMJ2FuY3JlIGxlIHByZW5kLCBsZSBiYW5kZWF1IHF1aSBsYSBzdWl0IHJlbmQgbGUgc2llbiAocGx1c1xuICAgICAgIGJhcykg4oCUIGxlIHRvdGFsIG5lIGNoYW5nZSBwYXMuICovXG4gICAgbWFyZ2luLXRvcDogOHJlbTtcbiAgICAvKiBDZSBxdWUgbGEgYm/DrnRlIG1vcmQgZGFucyBsZSBiYW5kZWF1LiAqL1xuICAgIC0tY2hhcGl0cmVzUmVjb3V2cmVtZW50OiB2YXIoLS1wYWRkaW5nQ29ycHMpO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzLCB2aXNpYmlsaXR5IC4zcztcbn1cblxuLmNoYXBpdHJlc0hvcml6b250YWwgKyAucGFnZVJ1YnJpcXVlUHJldmlldyB7XG4gICAgbWFyZ2luLXRvcDogMDtcbn1cblxuLyogRU4gREVTU09VUyBERSAxNjAwcHgsIFBBUyBERSBNRU5VIChjaGVmIGRlIHByb2pldCAyMDI2LTEwLTA0KSA6IGhvcnMgYmFuZGVhdSwgbGUgbWVudVxuICAgbidhIHBhcyB0b3Vqb3VycyBsYSBwbGFjZSBkZSBzZXMgZW50csOpZXMg4oCUIHN1ciB1biB0w6lsw6lwaG9uZSBpbCBzZSBjb3VwYWl0IGV0IGTDqWZpbGFpdCBkZVxuICAgY8O0dMOpLiBJbCBkaXNwYXJhw650IGRvbmMgYXZlYyBsZSBiYW5kZWF1LCBzdXIgdG91dGVzIGxlcyBwYWdlcyBxdWkgbGUgcG9ydGVudC4gTCdhbmNyZVxuICAgcmVzdGUsIGRlIGhhdXRldXIgbnVsbGUsIGF2ZWMgc29uIGJsYW5jIDogbCfDqWNhcnQgZW50cmUgbCdhcnRpY2xlIGV0IGxlcyDDrmxvdHMgbmUgY2hhbmdlXG4gICBwYXMuICovXG5AbWVkaWEgKG1heC13aWR0aDogMTU5OXB4KSB7XG4gICAgLmNoYXBpdHJlc0hvcml6b250YWwge1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgfVxufVxuXG4vKiBMZXMgc2VjdGlvbnMgc29udCBkZXJyacOocmUgbm91cyA6IGxlIG1lbnUgbidhIHBsdXMgcmllbiDDoCBkw6lzaWduZXIuICovXG4uY2hhcGl0cmVzSG9yaXpvbnRhbC5jaGFwaXRyZXNQYXNzZXMge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xufVxuXG4vKiBMQSBCT8OOVEUuIEFVQ1VOIMOpY2FydCBlbnRyZSBsZXMgZW50csOpZXMsIGNvbW1lIGxlIG1lbnUgdmVydGljYWwgOiB1biBibGFuYyBzdWZmaXQgw6BcbiAgIMOpdGVpbmRyZSBsZSBzdXJ2b2wgcXVhbmQgbGEgc291cmlzIHBhc3NlIGQndW5lIGVudHLDqWUgw6AgbCdhdXRyZSwgZXQgbGUgcGF2w6kgY2xpZ25vdGUuXG4gICBgcG9zaXRpb246IHJlbGF0aXZlYCA6IGMnZXN0IGRhbnMgY2V0dGUgYm/DrnRlIHF1ZSBjaGFwaXRyZXMudHMgcGxhY2UgbGUgcGF2w6kuICovXG4uY2hhcGl0cmVzSG9yaXpvbnRhbCB1bCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBnYXA6IDA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDEwO1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgICBtYXJnaW46IDAgMCBjYWxjKC0xICogdmFyKC0tY2hhcGl0cmVzUmVjb3V2cmVtZW50KSk7XG4gICAgLyogTGUgZ3JhbmQgYWlyIGludMOpcmlldXIgZGUgbGEgYmFycmUgZGVzIGFwZXLDp3VzIChjaGVmIGRlIHByb2pldCAyMDI2LTA5LTIzKS4gKi9cbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ29ycHMpO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jT3ZlcmxheSk7XG4gICAgLyogQXUgcmVwb3MsIHBvc8OpIHN1ciBsJ8OubG90IDogc29icmUsIGxlIGNvbnRvdXIgaGFiaXR1ZWwgZXQgcmllbiBkJ2F1dHJlLCDDoCBsYSBjb3VsZXVyXG4gICAgICAgZHUgdHJhaXQgZHUgYmFuZGVhdSAocGFnZVJ1YnJpcXVlLmNzcykg4oCUIGxlIG1lbnUgZXQgbGUgYmFuZGVhdSBvw7kgaWwgbW9yZCBvbnQgbGUgbcOqbWVcbiAgICAgICBib3JkLiBMJ29tYnJlIHBvcnTDqWUgbidhcnJpdmUgcXUnYXZlYyBsZSBiYW5kZWF1IGNvbGzDqSAocGx1cyBiYXMpIOKAlCBjaGVmIGRlIHByb2pldFxuICAgICAgIDIwMjYtMDktMjMuICovXG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXIpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY05vaXI0KTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMik7XG59XG5cbkBzdXBwb3J0cyAoYmFja2Ryb3AtZmlsdGVyOiBibHVyKDFweCkpIG9yICgtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigxcHgpKSB7XG4gICAgLmNoYXBpdHJlc0hvcml6b250YWwgdWwge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmNWZXJyZSk7XG4gICAgICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpIHNhdHVyYXRlKDEuNCk7XG4gICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KSBzYXR1cmF0ZSgxLjQpO1xuICAgIH1cbn1cblxuLyogQ09MTMOJIDogbGUgYmFuZGVhdSBkZSB2ZXJyZSBkJ3VuIGJvcmQgw6AgbCdhdXRyZSBkdSBuYXZpZ2F0ZXVyLiBJbCByZW1vbnRlIGRlIHNvbiBhaXJcbiAgIGR1IGRlc3N1cyBtb2lucyBsJ2FpciBkJ3VuIGJvdXRvbiA6IGxlIGhhdXQgZGUgbGEgYm/DrnRlIGV0IHNvbiBvbWJyZSBzb3J0ZW50IGRlIGxhXG4gICBmZW7DqnRyZSwgaWwgcmVzdGUganVzdGUgZGUgcXVvaSBuZSBwYXMgY29sbGVyIGxlcyBlbnRyw6llcyBhdSBib3JkLlxuICAgQVVDVU5FIEFOSU1BVElPTiA6IGxlIHBhc3NhZ2Ugc2UgZmFpdCBhdSBwaXhlbCBwcsOocywgw6AgbCdpbnN0YW50IG/DuSBsZXMgZW50csOpZXMgZGUgbGFcbiAgIGJvw650ZSBhdHRlaWduZW50IGxldXIgcGxhY2UgZGFucyBsZSBiYW5kZWF1IChjaGFwaXRyZXMudHMpLiBMZXMgZW50csOpZXMgbmUgYm91Z2VudCBwYXMsXG4gICBzZXVsIGxlIHZlcnJlIHMnw6lsYXJnaXQgKGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMjMpLiAqL1xuLmNoYXBpdHJlc0hvcml6b250YWwuY2hhcGl0cmVzQ29sbGUgdWwge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IGNhbGModmFyKC0tcGFkZGluZ0N0YTE0VikgLSB2YXIoLS1wYWRkaW5nQ29ycHMpKTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIG1hcmdpbjogMDtcbiAgICBib3JkZXI6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1vbWJyZVBvcnRlZTIpO1xufVxuXG4vKiBMZSB0ZXh0ZSBwYXNzZSBhdS1kZXNzdXMgZHUgcGF2w6kuICovXG4uY2hhcGl0cmVzSG9yaXpvbnRhbCBsaSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1hcmdpbjogMDtcbn1cblxuLyogTGUgdGV4dGUgZHUgbWVudSB2ZXJ0aWNhbCBkZXMgY2hhcGl0cmVzICguY2hhcGl0cmVzIGEsIHBhZ2VDaGFwaXRyZXMuY3NzKSA6IGzDqWdlciwgZ3Jpcy5cbiAgIElsIGF2YWl0IMOpdMOpIHBhc3PDqSBlbiBncmFzIG5vaXIgZGUgYm91dG9uIHBvdXIgcXUnb24gdm9pZSBsZSBtZW51IDsgZGVwdWlzIHF1ZSBsZSBwYXbDqVxuICAgYmxldSBkaXQgb8O5IGwnb24gZXN0LCBjJ2VzdCBsdWkgcXVpIHBvcnRlIGxlIHJlZ2FyZCwgZXQgbGUgZ3JhcyBhbG91cmRpc3NhaXRcbiAgIChjaGVmIGRlIHByb2pldCAyMDI2LTA5LTIzKS4gKi9cbi5jaGFwaXRyZXNIb3Jpem9udGFsIGEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdDdGExNCk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB0cmFuc2l0aW9uOiAuM3M7XG59XG5cbi5jaGFwaXRyZXNIb3Jpem9udGFsIGE6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCbGFuYzIpO1xufVxuXG4vKiBMYSBwYXJ0aWUgb8O5IGwnb24gc2UgdHJvdXZlIDogYydlc3QgbGUgcGF2w6kgZ2xpc3NhbnQgKC5jaGFwaXRyZXNDdXJzZXVyLFxuICAgcGFnZUNoYXBpdHJlcy5jc3MpIHF1aSBsYSByZW1wbGl0LCBsZSBsaWVuIG5lIHBvcnRlIHBsdXMgcXVlIGxhIGNvdWxldXIgZHUgdGV4dGUuICovXG4uY2hhcGl0cmVzSG9yaXpvbnRhbCBhLmFjdGlmLFxuLmNoYXBpdHJlc0hvcml6b250YWwgYS5hY3RpZjpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnR0KTtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cblxuLmNoYXBpdHJlc0hvcml6b250YWwgYTpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuLmNoYXBpdHJlc0hvcml6b250YWwgYTpmb2N1cy12aXNpYmxlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tY0Zvcm1Gb2N1cykgaW5zZXQ7XG59XG5cbi8qIFVuZSBzZWN0aW9uIGF0dGVpbnRlIHBhciBsZSBtZW51IG5lIHMnYXJyw6p0ZSBwYXMgU09VUyBsYSBiYXJyZSBjb2xsw6llIDogc29uIHRpdHJlXG4gICBzJ2FycsOqdGUganVzdGUgZW4gZGVzc291cy4gTGVzIMOubG90cyBxdSd1biBtZW51IGRlc3NlcnQgOiBydWJyaXF1ZXMgKEhvbWUpLCBzY8OobmVzIGV0XG4gICBzY8OpbmFyaW9zIChUaXJhZ2UgYXUgc29ydCkuICovXG4uaWxvdFJ1YnJpcXVlc1tpZF0sXG4uaWxvdFNjZW5lc1tpZF0sXG4uaWxvdFNjZW5hcmlvc1tpZF0ge1xuICAgIHNjcm9sbC1tYXJnaW4tdG9wOiA3cmVtO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEFSVElDTEUgREUgTEEgVklUUklORVxuICAgTGUgY29ycHMgcsOpZGlnw6kgZCd1biBhcnRpY2xlIDogdGV4dGUgw6AgZ2F1Y2hlLFxuICAgaW1hZ2Ugw6AgZHJvaXRlLiBIb21lIGV0IG3DqHJlcyBkZSBjb2Nvbi5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIERldXggY29sb25uZXMgZnJhbmNoZXMsIHBhcyBkZSBjb250b3VybmVtZW50IGRlIHRleHRlIDogdW5lIGxpZ25lIHBsZWluZSBsYXJnZXVyXG4gICBzb3VzIGwnaW1hZ2Ugc2VyYWl0IHRyb3AgbG9uZ3VlIHBvdXIgc2UgbGlyZS4gTGEgY29sb25uZSBkZSB0ZXh0ZSBlc3QgYm9ybsOpZSBlbiBjaCxcbiAgIGRvbmMgZW4gY2FyYWN0w6hyZXMsIGNlIHF1aSBlc3QgbGEgc2V1bGUgbWVzdXJlIHF1aSBjb21wdGUgcG91ciBsYSBsZWN0dXJlLlxuICAgTGUgYmxhbmMgw6l2ZW50dWVsIHNvdXMgbCdpbWFnZSBlc3Qgdm91bHUuICovXG4uYXJ0aWNsZVZpdHJpbmUge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgLyogTGUgYmxvYyBwcmVuZCBUT1VURSBsYSBsYXJnZXVyIDogbCdpbWFnZSBlc3QgY29sbMOpZSDDoCBkcm9pdGUsIGxlIHRleHRlIG9jY3VwZVxuICAgICAgIGNlIHF1aSByZXN0ZS4gTGEgbGlzaWJpbGl0w6kgbidlc3QgcGFzIG9idGVudWUgZW4gYnJpZGFudCBsYSBjb2xvbm5lIG1haXMgZW5cbiAgICAgICBib3JuYW50IGxlIHRleHRlIGx1aS1tw6ptZSAobWF4LXdpZHRoIHBsdXMgYmFzKSwgc2lub24gbCdpbWFnZSBzZSBwb3NlcmFpdCBhdVxuICAgICAgIG1pbGlldSBkZSBsYSBwYWdlLiAqL1xuICAgIC8qIG1pbigpIDogbGEgY29sb25uZSBpbWFnZSBlc3QgcHJvcG9ydGlvbm5lbGxlLCBkb25jIGVsbGUgcsOpdHLDqWNpdCBEw4hTIHF1ZSBsYSBmZW7DqnRyZVxuICAgICAgIHLDqXRyw6ljaXQg4oCUIHVuIG1heC13aWR0aCBmaXhlLCBsdWksIHJlc3RhaXQgw6AgNDUwcHggZW4gw6ljcmFzYW50IGxlIHRleHRlLlxuICAgICAgIDM3LjUlIGV0IHBhcyAzNSUgOiBsZSBjb250ZW5ldXIgZGUgY29udGVudSBmYWl0IDEyMDBweCAoI2JvZHlQYWdlIDEyODAgbW9pbnMgbGVzXG4gICAgICAgMsOXNDBweCBkZSBwYWRkaW5nIGRlIC5jb250ZW51KSwgZXQgNDUwLzEyMDAgPSAzNy41JS4gw4AgMzUlIGwnaW1hZ2UgcGxhZm9ubmFpdCDDoCA0MjBweC5cbiAgICAgICBMZSBtaW4oKSBnYXJkZSBsZSBwbGFmb25kIHNpIGxhIGxhcmdldXIgZHUgY29udGVuZXVyIGNoYW5nZSB1biBqb3VyLiAqL1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIG1pbig0NTBweCwgMzcuNSUpO1xuICAgIC8qIHJvdy1nYXAgw6AgMCA6IGwnaW1hZ2UgcyfDqXRlbmQgc3VyIDEwMCBsaWduZXMgKHZvaXIgcGx1cyBiYXMpLCBldCB1biBnYXAgbm9uIG51bFxuICAgICAgIHNlcmFpdCBtdWx0aXBsacOpIHBhciBhdXRhbnQgZGUgbGlnbmVzIHZpZGVzIOKAlCAxMDAgZW0gZGUgYmxhbmMgYXZhbnQgbCfDrmxvdC5cbiAgICAgICBMJ8OpY2FydCBlbnRyZSBwYXJhZ3JhcGhlcyBlc3QgcG9ydMOpIHBhciBsZXVyIG1hcmdlIGJhc3NlLiAqL1xuICAgIGdhcDogMCB2YXIoLS1nYXBDb2xvbm5lcyk7XG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xufVxuXG4vKiDimqDvuI8gbGluZS1oZWlnaHQgOiBsZSBDTEFVREUubWQgQ1NTIGwnaW50ZXJkaXQgcGFyIGTDqWZhdXQuIEV4Y2VwdGlvbiBkZW1hbmTDqWUgcGFyIGxlIGNoZWZcbiAgIGRlIHByb2pldCwgbGltaXTDqWUgw6AgY2UgY29udGVuZXVyIOKAlCBsZSBib2R5IGR1IHNpdGUgcmVzdGUgw6AgMS42LlxuICAgTGUgYm9keSBkaWxhdGFpdCBsZXMgbGlnbmVzIEFVIFNFSU4gZCd1biBwYXJhZ3JhcGhlIGF1dGFudCBxdWUgbGVzIHBhcmFncmFwaGVzIGVudHJlIGV1eCA6XG4gICBwbHVzIHJpZW4gbmUgc2UgZMOpdGFjaGFpdC4gT24gcmVzc2VycmUgbGEgbGlnbmUgZXQgb24gw6ljYXJ0ZSBsZXMgYmxvY3MsIHBvdXIgcXVlIGxlIGJsYW5jXG4gICBtYXJxdWUgdW5lIHPDqXBhcmF0aW9uIGF1IGxpZXUgZCfDqnRyZSBwYXJ0b3V0LiAqL1xuLmFydGljbGVWaXRyaW5lIHtcbiAgICBsaW5lLWhlaWdodDogMS40O1xufVxuXG4vKiBNYXJnZSBiYXNzZSBzZXVsZW1lbnQgOiBkYW5zIHVuZSBncmlsbGUgbGVzIG1hcmdlcyBuZSBmdXNpb25uZW50IHBhcywgZGV1eCBkZW1pLW1hcmdlc1xuICAgZmVyYWllbnQgdW4gcGxlaW4gw6ljYXJ0LiBVbiBzZXVsIGPDtHTDqSwgZG9uYyB1biBzZXVsIGNoaWZmcmUgw6AgbGlyZS4gKi9cbi8qIExBIExBUkdFVVIgREUgTEVDVFVSRSAoLS1sYXJnZXVyVGV4dGUsIHZpdHJpbmUuY3NzKSwgbGEgbcOqbWUgcXVlIGwnaW50cm8gZCd1biDDrmxvdCBldFxuICAgcXVlIGxhIHLDqXBvbnNlIGQndW5lIHF1ZXN0aW9uIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuXG4gICBRdWFuZCBsJ2FydGljbGUgYSB1bmUgaW1hZ2UsIGxhIGNvbG9ubmUgZGUgbGEgZ3JpbGxlIGRvbm5lIGTDqWrDoCBjZSBjaGlmZnJlIDogbGEgYm9ybmUgbmVcbiAgIGNoYW5nZSBhbG9ycyByaWVuLiBFbGxlIHNlcnQgw6AgbCdhcnRpY2xlIFNBTlMgaW1hZ2Ug4oCUIGxhIGdyaWxsZSByZXBhc3NlIMOgIHVuZSBzZXVsZVxuICAgY29sb25uZSAodG91dCBlbiBiYXMgZGUgY2UgZmljaGllcikgZXQgbGUgdGV4dGUgY291cmFpdCBzdXIgbGVzIDEyMDAgZGUgbGEgcGFnZSwgZGV1eCBmb2lzXG4gICBwbHVzIGxhcmdlIHF1ZSBsZSBtw6ptZSB0ZXh0ZSBzdXIgbGEgcGFnZSB2b2lzaW5lLlxuICAg4pqg77iPIEphbWFpcyBlbiBgY2hgIDogY2V0dGUgdW5pdMOpIHZhdXQgbGEgbGFyZ2V1ciBkdSBnbHlwaGUgwqsgMCDCuyBkZSBsYSBwb2xpY2UsIHBhcyBjZWxsZSBkdVxuICAgdGV4dGUgw6ljcml0LiBVbiBpZMOpb2dyYW1tZSBjaGlub2lzIGZhaXQgfjJjaCwgbGUgdGhhw68gZW1waWxlIHNlcyBzaWduZXMsIGV0IHVuIGNoYW5nZW1lbnRcbiAgIGRlIHBvbGljZSBkZSByZXBsaSBkw6lwbGFjZXJhaXQgbGEgY29sb25uZS4gVW5lIG1pc2UgZW4gcGFnZSBzdXIgMzEgbGFuZ3VlcyBuZSBwZXV0IHBhc1xuICAgZMOpcGVuZHJlIGR1IGRlc3NpbiBkJ3VuIGNoaWZmcmUuICovXG4uYXJ0aWNsZVZpdHJpbmUgPiBwIHtcbiAgICBtYXJnaW4tYmxvY2s6IDAgMWVtO1xuICAgIG1heC13aWR0aDogdmFyKC0tbGFyZ2V1clRleHRlKTtcbn1cblxuLyogVG91dCBsZSByw6lkYWN0aW9ubmVsIGVuIGNvbG9ubmUgZGUgZ2F1Y2hlLiAqL1xuLmFydGljbGVWaXRyaW5lID4gKiB7XG4gICAgZ3JpZC1jb2x1bW46IDE7XG59XG5cbi8qIExlIHRpdHJlIGNvdXJ0IHN1ciB0b3V0ZSBsYSBsYXJnZXVyIDogbCdpbWFnZSBuZSBsZSBjb3VwZSBwYXMsIGVsbGUgY29tbWVuY2UgYXUgbml2ZWF1XG4gICBkdSB0ZXh0ZS5cbiAgIExlIG5veWF1IG5lIGxhaXNzZSBxdWUgNXB4IHNvdXMgdW4gaDEgKGgxIHsgbWFyZ2luOiAxMHB4IDE1cHggNXB4IDAgfSkgOiBsZSB0ZXh0ZSBzZSBjb2xsZVxuICAgYXUgdGl0cmUuIE9uIHN1cmNoYXJnZSBpY2ksIGphbWFpcyBkYW5zIGxlIG5veWF1LCBxdWkgZXN0IHBhcnRhZ8OpIGF2ZWMgbGUgU3R1ZGlvLiAqL1xuLmFydGljbGVWaXRyaW5lID4gaDEge1xuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XG4gICAgbWFyZ2luLWJsb2NrOiB2YXIoLS1tYXJnZVRpdHJlUGFnZSk7XG59XG5cbi8qIEwnaW1hZ2UgZHUgbWFya2Rvd24gYXJyaXZlIGRhbnMgc29uIHByb3ByZSA8cD4gOiBvbiBsYSBzb3J0IGVuIGNvbG9ubmUgZGUgZHJvaXRlLFxuICAgc3VyIHRvdXRlIGxhIGhhdXRldXIgZHUgdGV4dGUuIExlcyBsaWduZXMgbm9uIG9jY3Vww6llcyBvbnQgdW5lIGhhdXRldXIgbnVsbGUuICovXG4uYXJ0aWNsZVZpdHJpbmUgPiBwOmhhcyhpbWcpIHtcbiAgICBncmlkLWNvbHVtbjogMjtcbiAgICBncmlkLXJvdzogMiAvIHNwYW4gMTAwO1xuICAgIG1hcmdpbjogMDtcbn1cblxuLyogTCdpbWFnZSDDqXBvdXNlIHNhIGNvbG9ubmUsIGVsbGUgbidpbXBvc2UgcGFzIHNhIHRhaWxsZSA6IGMnZXN0IGxhIHBpc3RlIGRlIGdyaWxsZSBxdWlcbiAgIHBsYWZvbm5lIMOgIDQ1MHB4IGV0IHNlIHLDqWR1aXQgcXVhbmQgbGEgZmVuw6p0cmUgc2UgcmVzc2VycmUuIFVuIG1heC13aWR0aCBmaXhlIHJlc3RlcmFpdFxuICAgw6AgNDUwcHggZW4gw6ljcmFzYW50IGxlIHRleHRlLiAqL1xuLmFydGljbGVWaXRyaW5lID4gcDpoYXMoaW1nKSBpbWcge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG59XG5cbi8qIENlIHF1aSBlc3Qgw6ljcml0IHN1ciBsYSBsaWduZSBxdWkgc3VpdCBsJ2ltYWdlLCBkYW5zIGxlIG3Dqm1lIHBhcmFncmFwaGUgZHUgbWFya2Rvd24sIHNlXG4gICBwb3NlIFNPVVMgbCdpbWFnZSwgZGFucyBsYSBwb2xpY2UgZHUgdGV4dGUgKGxlIHJlbnZvaSBMaW5rZWRJbiBkZSBsYSBwYWdlIGRlIGNvbnRhY3QsXG4gICBjaGVmIGRlIHByb2pldCAyMDI2LTEwLTE2KSA6IMOgIGNldHRlIHBsYWNlLCBpbCBuZSBwYXNzZSBwYXMgZGV2YW50IGxlIGZvcm11bGFpcmUuIEwnaW1hZ2VcbiAgIGVuIGJsb2Mgc3VmZml0IMOgIGZhaXJlIHBhc3NlciBsYSBsaWduZSBkZXNzb3VzIDsgbGUgbGllbiBuJ2VzdCBxdWUgbGUgbW90IHF1aSBhZ2l0LiAqL1xuLmFydGljbGVWaXRyaW5lID4gcDpoYXMoaW1nKSBpbWcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uYXJ0aWNsZVZpdHJpbmUgPiBwOmhhcyhpbWcpIGltZzpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1nYXBEZWZhdXQpO1xufVxuXG4vKiBMZXMgcHVjZXMgc29udCBSRU5EVUVTIDogbGUgcmVzZXQgZHUgbm95YXUgKDAwX3Jlc2V0LmNzcykgbGVzIGVmZmFjZSBwb3VyIHRvdXQgbGVcbiAgIHNpdGUsIHBhcmNlIHF1ZSBsYSBwbHVwYXJ0IGRlcyA8dWw+IHkgc29udCBkZXMgbWVudXMuIEljaSBjJ2VzdCB1bmUgdnJhaWUgbGlzdGUgZGVcbiAgIGxlY3R1cmUsIMOpY3JpdGUgZGFucyBsZSBtYXJrZG93biBkZSBsJ2FydGljbGUsIGVsbGUgcG9ydGUgZG9uYyBzZXMgcHVjZXMuXG4gICBNw6ptZSByw6hnbGUgZXQgbcOqbWUgcmV0cmFpdCBmcmFuYyBxdWUgLmNoYXBpdHJlQ29ycHMgdWwgKHBhZ2VDaGFwaXRyZXMuY3NzKSA6IGMnZXN0IGxlXG4gICByZXRyYWl0IHF1aSBkaXQgcXVlIGNlcyBsaWduZXMgc29udCB1biBibG9jIMOgIHBhcnQsIGV0IG5vbiBsYSBzdWl0ZSBkdSBwYXJhZ3JhcGhlLlxuICAgwqsgRGV1eCBlbmRyb2l0cywgdW5lIHNldWxlIGTDqWNpc2lvbiDCuyBlc3QgbWFpbnRlbmFudCB0ZW51IHBhciBsZSBDU1MgbHVpLW3Dqm1lIDpcbiAgIC0tcmV0cmFpdExpc3RlIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuIFNpIGxlIGNoaWZmcmUgYm91Z2UsIHRvdXQgc3VpdC4gKi9cbi5hcnRpY2xlVml0cmluZSA+IHVsIHtcbiAgICBtYXJnaW4tYmxvY2s6IDAgMWVtO1xuICAgIG1heC13aWR0aDogdmFyKC0tbGFyZ2V1clRleHRlKTtcbiAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLXJldHJhaXRMaXN0ZSk7XG4gICAgbGlzdC1zdHlsZS10eXBlOiBkaXNjO1xufVxuXG4vKiBMZXMgbGlnbmVzIHNlIFNVSVZFTlQgOiDDoCBsJ2ludMOpcmlldXIgZCd1bmUgbGlzdGUsIGwnYWlyIGRlc3NlcnQsIGlsIGZhaXQgY3JvaXJlIMOgXG4gICBwbHVzaWV1cnMgYmxvY3Mgc8OpcGFyw6lzIGF1IGxpZXUgZCd1bmUgw6ludW3DqXJhdGlvbi4gKi9cbi5hcnRpY2xlVml0cmluZSA+IHVsIGxpIHtcbiAgICBtYXJnaW4tYmxvY2s6IHZhcigtLWdhcFJlZHVpdCk7XG59XG5cbi8qIExFUyBUSVRSRVMgRFUgQ09SUFMgREUgTCdBUlRJQ0xFIOKAlCBoMiBldCBoMyDDqWNyaXRzIGRhbnMgbGUgbWFya2Rvd24uIENldXggZCd1biDDrmxvdCBzb250XG4gICBnw6lyw6lzIHBhciBsJ8OubG90LCBxdWkgcG9ydGUgbHVpLW3Dqm1lIHNvbiDDqWNhcnQgYXZlYyBjZSBxdWkgcHLDqWPDqGRlLlxuXG4gICBERVVYIFLDiUdJTUVTIMOAIE5FIFBBUyBDT05GT05EUkUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KS4gVW4gdGl0cmUgcXVpIHPDqXBhcmVcbiAgIGRlIFZSQUlTIGJsb2NzIGRpc3RpbmN0cyDigJQgdW4gw65sb3QsIGxlcyBxdWVzdGlvbnMsIGxlcyBzY8OpbmFyaW9zIOKAlCBtw6lyaXRlIHVuIGdyYW5kIGJsYW5jIDpcbiAgIGMnZXN0IGx1aSBxdWkgZGl0IHF1J29uIGNoYW5nZSBkZSBzdWpldC4gVW4gdGl0cmUgREFOUyB1biBhcnRpY2xlIG5lIHPDqXBhcmUgcmllbiBkdSB0b3V0LFxuICAgaWwgcG9uY3R1ZSB1biB0ZXh0ZSBxdWkgc2Ugc3VpdC4gSWwgZG9pdCBkb25jIMOqdHJlIHNlcnLDqSA6IGR1IGJsYW5jIMOgIGNldCBlbmRyb2l0LWzDoCBjYXNzZVxuICAgbGEgbGVjdHVyZSwgZXQgbCdhcnRpY2xlIGNlc3NlIGRlIHNlIGxpcmUgY29tbWUgdW4gYXJ0aWNsZS5cbiAgIEQnb8O5IDFlbSBhdS1kZXNzdXMsIC41ZW0gZW4gZGVzc291cy4gRU4gRU0sIMOgIGRlc3NlaW4gOiBsYSBtZXN1cmUgc3VpdCBsZSBjb3JwcyBkdSB0aXRyZSxcbiAgIGRvbmMgdW4gaDMgc2Ugc2VycmUgcGx1cyBxdSd1biBoMiwgc2FucyBxdSdvbiBhaXQgZGV1eCBjaGlmZnJlcyDDoCB0ZW5pci5cblxuICAgTEUgQ0hJRkZSRSDDiUNSSVQgRVNUIExFIEJMQU5DIE9CVEVOVS4gRGFucyB1bmUgZ3JpbGxlIGxlcyBtYXJnZXMgbmUgZnVzaW9ubmVudCBQQVMgOiBzYW5zXG4gICBsYSByw6hnbGUgcXVpIHN1aXQsIGxlIHBhcmFncmFwaGUgcXVpIHByw6ljw6hkZSBham91dGFpdCBzb24gcHJvcHJlIDFlbSBldCBsJ8OpY2FydCBhdS1kZXNzdXNcbiAgIGQndW4gdGl0cmUgdmFsYWl0IDE2ICsgMjQgPSA0MHB4LCBwZW5kYW50IHF1ZSBsZSBDU1MgYW5ub27Dp2FpdCAyNC4gRGVzIG1hcmdlcyBxdWlcbiAgIHMnYWRkaXRpb25uZW50IG5lIHNlIHLDqGdsZW50IHBhcyA6IG9uIGNyb2l0IHJlc3NlcnJlciwgw6dhIHJlc3RlIGdyYW5kXG4gICAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDcpLiAqL1xuLmFydGljbGVWaXRyaW5lID4gaDIsXG4uYXJ0aWNsZVZpdHJpbmUgPiBoMyB7XG4gICAgbWFyZ2luOiAxZW0gMCAuNWVtO1xufVxuXG4vKiBDRSBRVUkgUFLDiUPDiERFIFVOIFRJVFJFIE5FIFBPVVNTRSBQQVMuIExlIGJsYW5jIGF1LWRlc3N1cyBkJ3VuIHRpdHJlIGVzdCBjZWx1aSBkdSBUSVRSRSxcbiAgIGV0IGx1aSBzZXVsIDogbidpbXBvcnRlIHF1ZWwgZW5mYW50IGRpcmVjdCBzdWl2aSBkJ3VuIHRpdHJlIHJlbmQgc2EgbWFyZ2UgYmFzc2UuXG4gICBgKmAgZXQgbm9uIGBwYCA6IMOnYSB2YXV0IGF1c3NpIHBvdXIgdW5lIGxpc3RlLCBldCBwb3VyIHVuIHRpdHJlIHN1aXZpIGQndW4gYXV0cmUgdGl0cmVcbiAgIChsZSBoMiBlc3QgYWxvcnMgbGUgdm9pc2luIHF1aSBzZSB0YWl0LCBldCBzZXVsIGxlIDEuNWVtIGR1IGgzIGNvbXB0ZSkuXG4gICDimqDvuI8gUmVwb3NlIHN1ciBgOmhhcygrIOKApilgLCBjb21tZSBsYSBtaXNlIGVuIGNvbG9ubmVzIGRlIGNlIGZpY2hpZXIgcmVwb3NlIGTDqWrDoCBzdXJcbiAgIGBwOmhhcyhpbWcpYCA6IGMnZXN0IGxlIG3Dqm1lIHNvY2xlIGRlIG5hdmlnYXRldXJzLCBwYXMgdW5lIGTDqXBlbmRhbmNlIGRlIHBsdXMuICovXG4uYXJ0aWNsZVZpdHJpbmUgPiAqOmhhcygrIGgyKSxcbi5hcnRpY2xlVml0cmluZSA+ICo6aGFzKCsgaDMpIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4vKiBVbiDDrmxvdCByZXByZW5kIHRvdXRlIGxhIGxhcmdldXIsIHNvdXMgbGVzIGRldXggY29sb25uZXMg4oCUIGNlbHVpIGRlcyBzY8OobmVzIHN1ciBsZXNcbiAgIHBhZ2VzIGRlIHJ1YnJpcXVlcywgY2VsdWkgZGVzIHJ1YnJpcXVlcyBzdXIgbGEgSG9tZS4gTGEgZm9pcmUgYXV4IHF1ZXN0aW9ucyBzdWl0IGxhXG4gICBtw6ptZSByw6hnbGUgOiBlbGxlIHNlIHBvc2Ugc291cyBsZSB0ZXh0ZSwgcGFzIGRhbnMgc2EgY29sb25uZS4gTGUgbWVudSBkZXMgY2hhcGl0cmVzXG4gICBob3Jpem9udGFsIGF1c3NpIDogcG9zw6kgZGFucyBzb24gcHJvcHJlIGZpY2hpZXIsIHNvbiBgZ3JpZC1jb2x1bW5gIHBlcmRhaXQgZmFjZSDDoFxuICAgYC5hcnRpY2xlVml0cmluZSA+ICpgIChtw6ptZSBwb2lkcywgY2hhcmfDqSBhcHLDqHMpIOKAlCBsZSBtZW51IHRvbWJhaXQgZGFucyBsYSBjb2xvbm5lIGRlXG4gICB0ZXh0ZSwgZMOpY2VudHLDqSBldCBjb3Vww6kgw6AgZHJvaXRlLiAqL1xuLmFydGljbGVWaXRyaW5lIC5jaGFwaXRyZXNIb3Jpem9udGFsLFxuLmFydGljbGVWaXRyaW5lIC5pbG90U2NlbmVzLFxuLmFydGljbGVWaXRyaW5lIC5pbG90U2NlbmFyaW9zLFxuLmFydGljbGVWaXRyaW5lIC5pbG90UnVicmlxdWVzLFxuLmFydGljbGVWaXRyaW5lIC5mYXEsXG4uYXJ0aWNsZVZpdHJpbmUgLnBhZ2VSdWJyaXF1ZVByZXZpZXcge1xuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBNT0JJTEUgRVQgRkVOw4pUUkVTIMOJVFJPSVRFU1xuICAgU291cyBjZSBzZXVpbCwgbCdpbWFnZSBldCBsZSB0ZXh0ZSBuZSB0aWVubmVudFxuICAgcGx1cyBjw7R0ZSDDoCBjw7R0ZSA6IGwnaW1hZ2UgcGFzc2VyYWl0IMOgIDQwMCBweFxuICAgZXQgbGUgdGV4dGUgw6AgdW4gbW90IHBhciBsaWduZS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5AbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHtcbiAgICAuYXJ0aWNsZVZpdHJpbmUge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICB9XG5cbiAgICAvKiBMJ2ltYWdlIHJlcHJlbmQgc2EgcGxhY2UgZGFucyBsZSBmbHV4LCBqdXN0ZSBhcHLDqHMgbGUgdGl0cmUuICovXG4gICAgLmFydGljbGVWaXRyaW5lID4gcDpoYXMoaW1nKSB7XG4gICAgICAgIGdyaWQtY29sdW1uOiAxO1xuICAgICAgICBncmlkLXJvdzogYXV0bztcbiAgICAgICAgbWFyZ2luLWJsb2NrOiAwIDFlbTtcbiAgICB9XG59XG5cbi8qIFVuIGFydGljbGUgc2FucyB2aXN1ZWwgbidhIHBhcyBkZSBzZWNvbmRlIGNvbG9ubmUgw6AgcmVtcGxpciA6IHNhbnMgw6dhLCAzNy41JSBkZSBsYVxuICAgbGFyZ2V1ciByZXN0ZXJhaWVudCB2aWRlcyDDoCBkcm9pdGUgZHUgdGV4dGUuICovXG4uYXJ0aWNsZVZpdHJpbmU6bm90KDpoYXMoaW1nKSkge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgVU5FIElNQUdFIEVOVFJFIERFVVggQVJUSUNMRVMg4oCUICNpbWFnZUVudHJlQXJ0aWNsZXNcbiAgIFVzYWdlIDogbGEgcGFnZSBTY8OpbmFyaW9zIChsZSBkw6lyb3Vsw6ksIGVudHJlIGxlcyBkZXV4IGFydGljbGVzKS5cbiAgIFVuZSBpbWFnZSBlbiBiYW5kZWF1LCBiaWVuIHBsdXMgbGFyZ2UgcXVlIGhhdXRlIDogZWxsZSBwcmVuZCB0b3V0ZSBsYSBsYXJnZXVyXG4gICBkaXNwb25pYmxlIGV0IG5lIGxhIGTDqXBhc3NlIGphbWFpcy4gTGEgY29sb25uZSBkZSBkcm9pdGUgZCd1biBhcnRpY2xlICg0NTBweCBhdVxuICAgcGx1cykgbGEgcmVuZHJhaXQgaWxsaXNpYmxlLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiNpbWFnZUVudHJlQXJ0aWNsZXMge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1heC13aWR0aDogOTAwcHg7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIC8qIEwnZW52ZWxvcHBlIGRlcyBhcnRpY2xlcyAoLmNvbnRlbnUpIDogbCdpbWFnZSBjb21tZW5jZSBhdSBib3JkIGdhdWNoZSBkdSB0ZXh0ZS4gKi9cbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nUGFnZSk7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgR0FCQVJJVCDCqyBQQUdFIMOAIENIQVBJVFJFUyDCuyDigJQgdGl0cmUsIG1lbnUgw6AgZ2F1Y2hlLCBhcnRpY2xlcyDDoCBkcm9pdGVcblxuICAgTGUgQ1NTIGR1IGdhYmFyaXQgdGVtcGxhdGVzL3ZpdHJpbmUvcHVibGljL2Jhc2VQYWdlQ2hhcGl0cmUudHdpZywgZXQgZGUgcmllblxuICAgZCdhdXRyZSA6IHRvdXRlIHBhZ2UgcXVpIMOpdGVuZCBjZSBnYWJhcml0IHByZW5kIGNldHRlIGfDqW9tw6l0cmllLCBzYW5zIGxhXG4gICByZWTDqWNsYXJlci4gQ2UgcXUndW5lIHBhZ2UgYSBkZSBQUk9QUkUgKGRlcyB0dWlsZXMsIHVuZSBncmlsbGUsIHVuIGZvcm11bGFpcmUpXG4gICB2aXQgZGFucyBzb24gZmljaGllciDDoCBlbGxlLlxuXG4gICDimqDvuI8gTGVzIGlkZW50aWZpYW50cyBIVE1MIHNvbnQgZW4gYW5nbGFpcyAoI2NoYXB0ZXJzLCAjY2hhcHRlclh4eCkgcGFyY2UgcXUnaWxzXG4gICBmaW5pc3NlbnQgZGFucyBsJ1VSTC4gTGVzIGNsYXNzZXMsIGVsbGVzLCByZXN0ZW50IGRhbnMgbGEgbGFuZ3VlIGR1IGNvZGUuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBMZSB0aXRyZSBzZSBwb3NlIMOgIGxhIG3Dqm1lIGhhdXRldXIgcXVlIGNlbHVpIGRlIGxhIEhvbWUsIGV0IHJlc3BpcmUgcGFyZWlsIDpcbiAgIDNyZW0gYXUtZGVzc3VzIGV0IGF1LWRlc3NvdXMsIGV4YWN0ZW1lbnQgbGEgdmFsZXVyIGRlIGAuYXJ0aWNsZVZpdHJpbmUgPiBoMWAuXG4gICBMZSBub3lhdSBuZSBsYWlzc2UgcXVlIDVweCBzb3VzIHVuIGgxIChwYXJ0YWfDqSBhdmVjIGxlIFN0dWRpbywgb24gbmUgbGUgdG91Y2hlXG4gICBwYXMpIOKAlCBkJ2/DuSBsYSBzdXJjaGFyZ2UgaWNpLiAqL1xuLnBhZ2VDaGFwaXRyZXMgaDEge1xuICAgIG1hcmdpbi1ibG9jazogdmFyKC0tbWFyZ2VUaXRyZVBhZ2UpO1xufVxuXG4vKiBMZSBjaGFwZWF1IDogbGUgdGl0cmUgZGUgbGEgcGFnZSBldCBsZXMgZGV1eCBwaHJhc2VzIHF1aSBsJ2FjY29tcGFnbmVudCwgcXVhbmQgbGFcbiAgIHBhZ2UgZW4gYSB1bi4gSWwgdmllbnQgZHUgbWFya2Rvd24sIGRvbmMgc2FucyBjbGFzc2Ug4oCUIHRvdXQgc2UgY2libGUgZCdpY2kuXG4gICBMZSBoMSByZXByZW5kIHNvbiDDqWNhcnQgYXUgY2hhcGVhdSAoMXJlbSBhdSBsaWV1IGRlIDNyZW0pIDogbGVzIGRldXggc2UgbGlzZW50XG4gICBlbnNlbWJsZSwgYydlc3QgU09VUyBsZSBjaGFwZWF1IHF1ZSBsYSBwYWdlIHJlc3BpcmUuICovXG4uY2hhcGVhdVBhZ2Uge1xuICAgIG1hcmdpbi1ib3R0b206IDNyZW07XG59XG5cbi5jaGFwZWF1UGFnZSBoMSB7XG4gICAgbWFyZ2luLWJsb2NrOiB2YXIoLS1tYXJnZVRpdHJlUGFnZSkgMXJlbTtcbn1cblxuLmNoYXBlYXVQYWdlIHAge1xuICAgIG1hcmdpbjogMDtcbn1cblxuLyogTGEgcmFuZ8OpZSA6IG1lbnUgw6AgZ2F1Y2hlLCBhcnRpY2xlcyDDoCBkcm9pdGUuICovXG4uY2hhcGl0cmVzWm9uZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAvKiA0cmVtLCBldCBub24gLS1nYXBMaXN0ZSAoMzJweCkgY29tbWUgbGEgem9uZSBkZSBmaWx0cmVzIDogaWNpIGxlcyBkZXV4XG4gICAgICAgY29sb25uZXMgbmUgc29udCBwYXMgZGUgbcOqbWUgbmF0dXJlIOKAlCDDoCBnYXVjaGUgdW4gbWVudSwgw6AgZHJvaXRlIGxlIGNvbnRlbnUuXG4gICAgICAgQydlc3QgbGUgYmxhbmMgcXVpIGRvaXQgbGUgZGlyZSAoZMOpY2lzaW9uIFBPIDIwMjYtMDgtMjUpLiAtLWdhcENvbG9ubmVzIDogbGVcbiAgICAgICBtw6ptZSBibGFuYyBxdWUgbGUgdGV4dGUgZCd1biBhcnRpY2xlIGV0IHNvbiBpbWFnZSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0XG4gICAgICAgMjAyNi0wOS0xNykuICovXG4gICAgZ2FwOiB2YXIoLS1nYXBDb2xvbm5lcyk7XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG59XG5cbi8qIOKUgOKUgCBMZSBtZW51IGRlcyBjaGFwaXRyZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG5cbi8qIExlIG1lbnUgc3VpdCBsZSBkw6lmaWxlbWVudCA6IGlsIGRlc2NlbmQgYXZlYyBsYSBwYWdlLCBwdWlzIHNlIGNhbGUgZW4gaGF1dC4gKi9cbi5jaGFwaXRyZXMge1xuICAgIGZsZXg6IDAgMCAyMjBweDtcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgIHRvcDogMjBweDtcbn1cblxuLmNoYXBpdHJlcyB1bCB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC8qIEFVQ1VOIMOpY2FydCBlbnRyZSBsZXMgbGlnbmVzIDogdW4gYmxhbmMgZGUgZGV1eCBwaXhlbHMgc3VmZml0IMOgIMOpdGVpbmRyZSBsZVxuICAgICAgIHN1cnZvbCBxdWFuZCBsYSBzb3VyaXMgcGFzc2UgZCd1bmUgbGlnbmUgw6AgbCdhdXRyZSwgZXQgbGUgcGF2w6kgY2xpZ25vdGUuIFVuXG4gICAgICAgbWVudSBuJ2EgcGFzIGRlIHRyb3VzIOKAlCBpbCB5IGEgdG91am91cnMgdW5lIGxpZ25lIHNvdXMgbGUgY3Vyc2V1ci4gKi9cbiAgICBnYXA6IDA7XG59XG5cbi5jaGFwaXRyZXMgdWwgbGkge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4vKiBDaGFxdWUgbGlnbmUgb2NjdXBlIFRPVVRFIGxhIGxhcmdldXIgZHUgbWVudSAoMjIwcHgpLiBDJ2VzdCBjZSBxdWkgcmVuZCBsYSBjb2xvbm5lXG4gICBsaXNpYmxlIDogbGUgcGF2w6kgZGUgbGEgbGlnbmUgYWN0aXZlIGRlc3NpbmUgc2EgbGFyZ2V1ciwgb24gdm9pdCBkJ3VuIGNvdXBcbiAgIGQnxZNpbCBvw7kgbGUgbWVudSBzJ2FycsOqdGUgZXQgb8O5IGxlIGNvbnRlbnUgY29tbWVuY2UuXG4gICBDb3VsZXVycyA6IGwnQWNjZW50IGRlIGxhIHBhZ2UgKC0tY0FjY2VudDMgLyAtLWNBY2NlbnR0KSwgY29tbWUgbGUgbWVudSBkZXNcbiAgIHNvdXMtcnVicmlxdWVzLiBBdWN1bmUgY291bGV1ciBub3V2ZWxsZSDigJQgbGUgbm95YXUgbCdpbnRlcmRpdCBzYW5zIGFjY29yZC4gKi9cbi5jaGFwaXRyZXMgYSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0N0YTE0KTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgZm9udDogdmFyKC0tZk1lbnUxNCk7XG4gICAgZm9udC1zaXplOiAxNXB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyMXB4O1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB0cmFuc2l0aW9uOiAuM3M7XG59XG5cbi5jaGFwaXRyZXMgYTpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jMik7XG59XG5cbi8qIExlIHBhdsOpIGR1IGNoYXBpdHJlIGFjdGlmLiBVTiBTRVVMIHBvdXIgdG91dCBsZSBtZW51IDogaWwgbmUgcydhbGx1bWUgcGFzXG4gICBsaWduZSBwYXIgbGlnbmUsIGlsIEdMSVNTRSBkZSBsJ3VuZSDDoCBsJ2F1dHJlLiBDJ2VzdCBsZSBkw6lwbGFjZW1lbnQgcXVpIGRpdFxuICAgcXUnb24gYSBjaGFuZ8OpIGRlIGNoYXBpdHJlLCBwYXMgbCdhcHBhcml0aW9uLlxuICAgUG9zw6kgcGFyIGNoYXBpdHJlcy50cywgcXVpIGx1aSBkb25uZSBzYSB0YWlsbGUgZXQgc2EgcG9zaXRpb24uIExlIG1lbnUgaG9yaXpvbnRhbFxuICAgKC5jaGFwaXRyZXNIb3Jpem9udGFsKSBhIGxlIG3Dqm1lLiAqL1xuLmNoYXBpdHJlc0N1cnNldXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNBY2NlbnQzKTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2UsIHdpZHRoIC4zcyBlYXNlLCBoZWlnaHQgLjNzIGVhc2U7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi8qIExlIHRleHRlIHBhc3NlIGF1LWRlc3N1cyBkdSBwYXbDqS4gKi9cbi5jaGFwaXRyZXMgbGkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLyogTGUgY2hhcGl0cmUgb8O5IGwnb24gc2UgdHJvdXZlIDogYydlc3QgbGUgcGF2w6kgZ2xpc3NhbnQgcXVpIGxlIHJlbXBsaXQsIGxlIGxpZW5cbiAgIG5lIHBvcnRlIHBsdXMgcXVlIGxhIGNvdWxldXIgZGUgc29uIHRleHRlLiAqL1xuLmNoYXBpdHJlcyBhLmFjdGlmLFxuLmNoYXBpdHJlcyBhLmFjdGlmOmhvdmVyIHtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudHQpO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG4vKiBMJ2FubmVhdSBkZSBmb2N1cyBuZSBzZSBtb250cmUgcXUnYXUgQ0xBVklFUi4gYDpmb2N1c2Agc2UgZMOpY2xlbmNoZSBhdXNzaSDDoCBsYVxuICAgc291cmlzIOKAlCBsJ2FubmVhdSByZXN0YWl0IGFwcsOocyB1biBjbGljLCBzYW5zIHF1ZSBwZXJzb25uZSBsJ2FpdCBkZW1hbmTDqS5cbiAgIGA6Zm9jdXMtdmlzaWJsZWAgZXN0IGxhIG3Dqm1lIGNob3NlLCBtYWlzIGxlIG5hdmlnYXRldXIgZMOpY2lkZSA6IGNsYXZpZXIgb3VpLFxuICAgc291cmlzIG5vbi4gKi9cbi5jaGFwaXRyZXMgYTpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuLmNoYXBpdHJlcyBhOmZvY3VzLXZpc2libGUge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1jRm9ybUZvY3VzKSBpbnNldDtcbn1cblxuLyog4pSA4pSAIExhIGNvbG9ubmUgZGVzIGFydGljbGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xuXG4uY2hhcGl0cmVzQXJ0aWNsZXMge1xuICAgIGZsZXg6IDE7XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAvKiBTYW5zIGNhZHJlLCAzMnB4IChsZSByeXRobWUgZGUgbGlzdGUpIG5lIHN1ZmZpc2VudCBwYXMgw6AgZGlyZSBvw7kgdW4gYmxvY1xuICAgICAgIGZpbml0IOKAlCBjJ2VzdCBsZSBibGFuYyBxdWkgZmFpdCBsYSBzw6lwYXJhdGlvbi4gLS1nYXBCbG9jcyA6IGxlIGJsYW5jIGVudHJlIGRldXhcbiAgICAgICBibG9jcyBlbXBpbMOpcyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTcpLiAqL1xuICAgIGdhcDogdmFyKC0tZ2FwQmxvY3MpO1xuICAgIC8qIEFVQ1VOIHBsYWZvbmQgZGUgbGFyZ2V1ciA6IGxhIGNvbG9ubmUgcHJlbmQgdG91dCBsJ2VzcGFjZSBsYWlzc8OpIHBhciBsZSBtZW51XG4gICAgICAgKGTDqWNpc2lvbiBQTyAyMDI2LTA4LTI1KS4gQ2Ugbidlc3QgcGx1cyBsYSBsYXJnZXVyIHF1aSB0aWVudCBsYSBsb25ndWV1ciBkZVxuICAgICAgIGxpZ25lLCBjJ2VzdCBsYSBzdHJ1Y3R1cmUgZHUgY29udGVudSDigJQgcGhyYXNlcyBjb3VydGVzIGV0IGxpc3Rlcy4gKi9cbn1cblxuLmNoYXBpdHJlIHtcbiAgICAvKiBMZSBkw6lmaWxlbWVudCB2ZXJzIHVuZSBhbmNyZSBuZSBjb2xsZSBwYXMgbGUgYmxvYyBhdSBib3JkIGhhdXQuICovXG4gICAgc2Nyb2xsLW1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi8qIEF1Y3VuIGNhZHJlLCBhdWN1bmUgbWFyZ2UgaW50w6lyaWV1cmUgOiBjJ2VzdCBkdSB0ZXh0ZSBsaWJyZS4gQ2Ugc29udCBsZXMgYmxhbmNzXG4gICBlbnRyZSBsZXMgY2hhcGl0cmVzIHF1aSBsZXMgc8OpcGFyZW50LCBwYXMgdW4gdHJhaXQuICovXG4uY2hhcGl0cmVDb3JwcyB7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLmNoYXBpdHJlQ29ycHMgaDIge1xuICAgIG1hcmdpbjogMCAwIDhweDtcbn1cblxuLyog4pSA4pSAIExlIHRleHRlIGQndW4gY2hhcGl0cmUsIGV0IHNlcyBsaWVucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgIExlIHRleHRlIGQndW4gY2hhcGl0cmUgdmllbnQgZHUgTUFSS0RPV04gOiBpbCBuJ2EgZG9uYyBhdWN1bmUgY2xhc3NlIMOgIGx1aSwgZXRcbiAgIG5lIHBldXQgcGFzIGVuIGF2b2lyLiBUb3V0IHNlIGNpYmxlIGRlcHVpcyBsZSBjb250ZW5ldXIg4oCUIGMnZXN0IGxlIG3Dqm1lIHBhcnRpXG4gICBwcmlzIHF1ZSBgLmFydGljbGVWaXRyaW5lYCBwb3VyIGxlcyBwYWdlcyBkZSBydWJyaXF1ZS4gKi9cblxuLyogQXVjdW4gcGxhZm9uZCBkZSBsYXJnZXVyIDogY2Ugbidlc3QgcGFzIGxhIGxhcmdldXIgcXVpIHRpZW50IGxhIGxvbmd1ZXVyIGRlXG4gICBsaWduZSwgYydlc3QgbGEgc3RydWN0dXJlIGR1IHRleHRlIOKAlCBwaHJhc2VzIGNvdXJ0ZXMgZXQgbGlzdGVzIChkw6ljaXNpb24gUE9cbiAgIDIwMjYtMDgtMjUpLiAqL1xuLmNoYXBpdHJlQ29ycHMgcCB7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4vKiBEZXV4IHBhcmFncmFwaGVzIHJlc3BpcmVudCwgbWFpcyBsZSBkZXJuaWVyIHJlc3RlIGNvbGzDqSDDoCBTQSBsaXN0ZSA6IMKrIExlIHNvaXJcbiAgIHZlbnXigKYgwrsgZXQgbGVzIGxpZ25lcyBxdWkgc3VpdmVudCBzb250IHVuIHNldWwgYmxvYyBkZSBzZW5zLiAqL1xuLmNoYXBpdHJlQ29ycHMgcCArIHAge1xuICAgIG1hcmdpbi10b3A6IHZhcigtLWdhcE1veWVuKTtcbn1cblxuLyogTGVzIHB1Y2VzIHNvbnQgUkVORFVFUyA6IGxlIHJlc2V0IGR1IG5veWF1ICgwMF9yZXNldC5jc3MpIGxlcyBlZmZhY2UgcG91ciB0b3V0XG4gICBsZSBzaXRlLCBwYXJjZSBxdWUgbGEgcGx1cGFydCBkZXMgPHVsPiB5IHNvbnQgZGVzIG1lbnVzLiBJY2kgYydlc3QgdW5lIHZyYWllXG4gICBsaXN0ZSBkZSBsZWN0dXJlLCBlbGxlIHBvcnRlIGRvbmMgc2VzIHB1Y2VzLlxuICAgTGUgcmV0cmFpdCBlc3QgRlJBTkMgKC0tcmV0cmFpdExpc3RlLCA0MHB4KSA6IGMnZXN0IGx1aSBxdWkgZGl0IHF1ZSBjZXMgbGlnbmVzIHNvbnRcbiAgIHVuIGJsb2Mgw6AgcGFydCwgZXQgbm9uIGxhIHN1aXRlIGR1IHBhcmFncmFwaGUuIDIwcHggc3VmZmlzYWllbnQgw6AgcG9zZXIgbGEgcHVjZSwgcGFzXG4gICDDoCBzw6lwYXJlci4gTGUgY2hpZmZyZSBuZSB2aXQgcGx1cyBpY2kgOiBsYSBtw6ptZSB2YXJpYWJsZSBzZXJ0IGF1IHVsIGQndW4gYXJ0aWNsZSBldCDDoFxuICAgbGEgcsOpcG9uc2UgZCd1bmUgcXVlc3Rpb24gKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KS4gKi9cbi5jaGFwaXRyZUNvcnBzIHVsIHtcbiAgICBtYXJnaW46IHZhcigtLWdhcERlZmF1dCkgMCAwO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcmV0cmFpdExpc3RlKTtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IGRpc2M7XG59XG5cbi8qIExlcyBsaWduZXMgc2UgU1VJVkVOVCA6IC0tZ2FwUmVkdWl0ICg0cHgpLiDDgCBsJ2ludMOpcmlldXIgZCd1biBjaGFwaXRyZSwgbCdhaXJcbiAgIGRlc3NlcnQg4oCUIGlsIGZhaXQgY3JvaXJlIMOgIHBsdXNpZXVycyBibG9jcyBzw6lwYXLDqXMgYXUgbGlldSBkJ3VuZSBsaXN0ZS4gTGUgZ3JhbmRcbiAgIGJsYW5jLCBjJ2VzdCBlbnRyZSBsZXMgY2hhcGl0cmVzICgtLWdhcEJsb2NzKSwgcGFzIGRlZGFucy4gKi9cbi5jaGFwaXRyZUNvcnBzIGxpIHtcbiAgICBtYXJnaW46IHZhcigtLWdhcFJlZHVpdCkgMDtcbn1cblxuLyogTGVzIGxpZW5zIERBTlMgbGUgdGV4dGUg4oCUIHBhcmFncmFwaGVzIGV0IGxpc3RlcyBzZXVsZW1lbnQuIExlcyB0dWlsZXMsIGVsbGVzLFxuICAgc29udCBkZXMgYm91dG9ucyAoLmN0YURpc2NyZXQpIGV0IHZpdmVudCBob3JzIGRlcyBwYXJhZ3JhcGhlcy5cbiAgIFNvdWxpZ27DqSBwZXJtYW5lbnQgOiBsZSBzeXN0w6htZSBkZSBzb3VsaWduZW1lbnQgdml0cmluZSAodml0cmluZS5jc3MpIHMnYXBwbGlxdWUuICovXG4uY2hhcGl0cmVDb3JwcyBwIGEsXG4uY2hhcGl0cmVDb3JwcyBsaSBhIHtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudDMpO1xuICAgIHRyYW5zaXRpb246IC4zcztcbn1cblxuLyogQ29tbWUgcG91ciBsZSBtZW51IDogbCdhbm5lYXUgZGUgZm9jdXMgYXUgQ0xBVklFUiBzZXVsZW1lbnQuICovXG4uY2hhcGl0cmVDb3JwcyBwIGE6Zm9jdXMsXG4uY2hhcGl0cmVDb3JwcyBsaSBhOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xufVxuXG4uY2hhcGl0cmVDb3JwcyBwIGE6Zm9jdXMtdmlzaWJsZSxcbi5jaGFwaXRyZUNvcnBzIGxpIGE6Zm9jdXMtdmlzaWJsZSB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWNGb3JtRm9jdXMpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbn1cblxuLyogTGUgYm91dG9uIGR1IGJhcyBkZSBjaGFwaXRyZSA6IGlsIHN1aXQgbGUgdGV4dGUsIGlsIG5lIGxlIGNvbGxlIHBhcyDigJQgLS1nYXBMYXJnZVxuICAgKDIwcHgpLCBsJ8OpY2FydCDCqyBlbnRyZSBkZXV4IGdyb3VwZXMgwrssIHBhcyBjZWx1aSBlbnRyZSBkZXV4IGZyw6hyZXMuICovXG4uY2hhcGl0cmVDdGEge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1nYXBMYXJnZSk7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFBBR0UgREUgUlVCUklRVUUg4oCUIExFIEJBTkRFQVUgREVTIEFQRVLDh1VTXG4gICBHYWJhcml0IDogdml0cmluZS9ydWJyaXF1ZS9iYXNlUGFnZVJ1YnJpcXVlLnR3aWcuIENlIGZpY2hpZXIgbmUgcydvY2N1cGUgcXVlIGRlXG4gICBsJ2VudmVsb3BwZSBgLnBhZ2VSdWJyaXF1ZVByZXZpZXdgLCBjZWxsZSBxdWkgcmXDp29pdCBsZXMgw65sb3RzIChzY8OobmVzLCBzY8OpbmFyaW9zLCBGQVEpLlxuXG4gICDDgCBwYXJ0aXIgZGUgMTYwMHB4IGRlIGZlbsOqdHJlIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wMyksIGxlcyBhcGVyw6d1cyBjaGFuZ2VudFxuICAgZCdlc3BhY2UgOiBsJ2VudmVsb3BwZSBxdWl0dGUgbGEgY29sb25uZSBkZSAxMjgwIGV0IHNlIHBvc2Ugc3VyIHVuIGZvbmQgZ3JpcyBxdWkgdmEgZCd1blxuICAgYm9yZCDDoCBsJ2F1dHJlIGRlIGxhIGZlbsOqdHJlLiBMZSBmb25kIENPTExFIGF1eCBib3JkcywgYydlc3QgbGUgYnV0IOKAlCDCqyBqJ2FpIHByaXMgdG91dFxuICAgbCdlc3BhY2Ugwrsg4oCUIG1haXMgcGFzIHNvbiBjb250ZW51IDogdGl0cmVzLCBpbnRyb3MgZXQgZ3JpbGxlcyBnYXJkZW50IGF1IG1vaW5zIDEwMHB4IGRlXG4gICBjaGFxdWUgY8O0dMOpLCBldCBsZXMgdGl0cmVzIHNvbnQgQ0VOVFLDiVMuIEMnZXN0IGxlIGNlbnRyYWdlLCBwbHVzIGxlIGZvbmQsIHF1aSBkaXQgYXVcbiAgIHZpc2l0ZXVyIHF1J2lsIG4nZXN0IHBsdXMgZGFucyBsJ2FydGljbGUuXG4gICBFbiBkZXNzb3VzIGRlIDE2MDAsIHJpZW4gZGUgdG91dCDDp2EgOiBwYXMgZGUgZm9uZCwgdGV4dGVzIMOgIGdhdWNoZSAobGVzIHRpdHJlcyBnYXJkZW50XG4gICBsZXVyIGZvbnRlIGV0IGxldXJzIGNhcGl0YWxlcywgdm9pciBlbiBmaW4gZGUgZmljaGllciksIMOubG90cyBkYW5zIGxhXG4gICBjb2xvbm5lLiBMYSBtaXNlIGVuIHBhZ2UgZCdvcmlnaW5lIGVzdCBjZWxsZS1sw6AsIGxlIGJhbmRlYXUgZXN0IGwnZXhjZXB0aW9uLlxuXG4gICBVTiBTRVVMIEJBTkRFQVUgUE9VUiBUT1VTIExFUyDDjkxPVFMgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTAzKS4gTGUgYmFuZGVhdVxuICAgYSBkJ2Fib3JkIMOpdMOpIHBvc8OpIHN1ciBjaGFxdWUgw65sb3QgOiBxdWFuZCBkZXV4IG91IHRyb2lzIHNlIHN1aXZhaWVudCwgY2hhY3VuIGF2YWl0IHNvblxuICAgZm9uZCBldCBpbCByZXN0YWl0IGRlcyBiYW5kZXMgYmxhbmNoZXMgZW50cmUgZXV4LiBJbCBlc3QgZG9uYyBwb3J0w6kgcGFyIGwnRU5WRUxPUFBFLCB1bmVcbiAgIHBhciBwYWdlLCBldCBsZXMgw65sb3RzIHNlIHN1aXZlbnQgZGVkYW5zLCBwbHVzIGVzcGFjw6lzIHF1J2FpbGxldXJzICgxMnJlbSBhdSBsaWV1IGRlIDggOlxuICAgc3VyIHVuIG3Dqm1lIGZvbmQsIGlsIGZhdXQgcGx1cyBkZSB2aWRlIHBvdXIgcXVlIGRldXggw65sb3RzIHNlIGxpc2VudCBjb21tZSBkZXV4KS4gU2V1bCBsZVxuICAgcHJlbWllciBwZXJkIHNhIG1hcmdlIGhhdXRlIDogYydlc3QgbGUgcGFkZGluZyBkdSBiYW5kZWF1IHF1aSBsJ2VzcGFjZSBkdSBib3JkLlxuICAgTCfDrmxvdCBkZSBTQ8OJTkFSSU9TIGVzdCBkYW5zIGxlIGJhbmRlYXUgbHVpIGF1c3NpLCBzb3VzIHNhIGZvcm1lIGNlbnRyw6llXG4gICAoX2lsb3RTY2VuYXJpb3NCYW5kZWF1LnR3aWcsIGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE4KSA6IGlsIGVuIMOpdGFpdCBzb3J0aSBsZVxuICAgMjAyNi0wOS0wMywgbGUgdGVtcHMgZCd5IHLDqWZsw6ljaGlyLlxuXG4gICDimqDvuI8gMTYwMCBuJ2VzdCBwYXMgbCd1biBkZXMgcXVhdHJlIHBhbGllcnMgZHUgQ0xBVURFLm1kIENTUyA6IGMnZXN0IHVuIGNpbnF1acOobWUsIHLDqXNlcnbDqVxuICAgYXV4IHRyw6hzIGdyYW5kcyDDqWNyYW5zLCBwb3PDqSBzdXIgZMOpY2lzaW9uIGR1IGNoZWYgZGUgcHJvamV0LiDDgCAxMjgwLCBsZSBwbHVzIGhhdXQgZGVzXG4gICBxdWF0cmUsIGxlIGJhbmRlYXUgZmVyYWl0IDEwODAgZGUgY29udGVudSDigJQgbW9pbnMgcXVlIGxhIGNvbG9ubmUgcXUnaWwgcmVtcGxhY2UuXG5cbiAgIExBIFNPUlRJRSBERSBDT0xPTk5FIDogZGVzIG1hcmdlcyBsYXTDqXJhbGVzIG7DqWdhdGl2ZXMuIGA1MCVgIGVzdCBsYSBtb2l0acOpIGR1IGNvbnRlbmV1cixcbiAgIGA1MHZ3YCBsYSBtb2l0acOpIGRlIGxhIGZlbsOqdHJlIDogbGEgZGlmZsOpcmVuY2UgZXN0IGNlIHF1aSBtYW5xdWUgcG91ciBhdHRlaW5kcmUgbGUgYm9yZCxcbiAgIHF1ZWwgcXVlIHNvaXQgbGUgcGFkZGluZyBkZSAuY29udGVudSwgcHVpc3F1ZSB0b3V0IGVzdCBjZW50csOpLiBMZSBibG9jIHJlc3RlIGRhbnMgbGVcbiAgIGZsdXgsIMOgIHNhIHBsYWNlIHZlcnRpY2FsZS4gYGh0bWwgeyBvdmVyZmxvdy14OiBjbGlwIH1gIChib2R5UGFnZS5jc3MpIGFic29yYmUgbGEgYmFycmVcbiAgIGRlIGTDqWZpbGVtZW50IHF1ZSAxMDB2dyBjb21wdGUgZW4gdHJvcC5cblxuICAgTEUgUExBRk9ORCA6IGxlIGZvbmQgc3VpdCBsYSBmZW7DqnRyZSwgbGUgY29udGVudSBub24uIEF1LWRlbMOgIGRlIDE4MDBweCBkZSBmZW7DqnRyZSwgbGFcbiAgIG1hcmdlIGxhdMOpcmFsZSBncmFuZGl0IGF1IGxpZXUgZHUgY29udGVudSDigJQgcXVhdHJlIHZpZ25ldHRlcyBkZSA2MDBweCBuJ2FpZGVyYWllbnRcbiAgIHBlcnNvbm5lLiBDJ2VzdCBsZSBgbWF4KClgIDogMTAwcHgsIG91IGNlIHF1J2lsIGZhdXQgcG91ciB0ZW5pciBsZSBjb250ZW51IMOgIDE4MDAuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuQG1lZGlhIChtaW4td2lkdGg6IDE2MDBweCkge1xuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IHtcbiAgICAgICAgd2lkdGg6IDEwMHZ3O1xuICAgICAgICBtYXJnaW4tdG9wOiA4cmVtO1xuICAgICAgICBtYXJnaW4taW5saW5lOiBjYWxjKDUwJSAtIDUwdncpO1xuICAgICAgICBwYWRkaW5nLWJsb2NrOiB2YXIoLS1wYWRkaW5nQmFuZGVhdSk7XG4gICAgICAgIHBhZGRpbmctaW5saW5lOiBtYXgoMTAwcHgsIGNhbGMoKDEwMHZ3IC0gMTgwMHB4KSAvIDIpKTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY0JhY2tncm91bmRHcmFuZCk7XG4gICAgICAgIGJvcmRlci1ibG9jazogdmFyKC0tYm9yZGVyKTtcbiAgICAgICAgYm9yZGVyLWJsb2NrLWNvbG9yOiB2YXIoLS1jTm9pcjQpO1xuICAgIH1cblxuICAgIC8qIExlIHByZW1pZXIgw65sb3QgbmUgc2UgZMOpdGFjaGUgcGx1cyBkZSBsJ2FydGljbGUgOiBjJ2VzdCBsZSBiYW5kZWF1IHF1aSBzJ2VuIGTDqXRhY2hlXG4gICAgICAgKG1hcmdpbi10b3AgY2ktZGVzc3VzKSBldCBzb24gcGFkZGluZyBxdWkgZXNwYWNlIGwnw65sb3QgZHUgdHJhaXQuICovXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgPiA6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cblxuICAgIC8qIEVudHJlIGRldXggw65sb3RzIGR1IGJhbmRlYXUsIDEycmVtIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wMykgOiBsZXMgOHJlbVxuICAgICAgIGRlIHBhcnRvdXQgc3VmZmlzZW50IHF1YW5kIGxlIGZvbmQgYmxhbmMgZGUgbGEgcGFnZSBsZXMgc8OpcGFyZSBkw6lqw6AgOyBzdXIgbGUgbcOqbWVcbiAgICAgICBmb25kIGdyaXMsIGlsIGZhdXQgcGx1cyBkZSB2aWRlLlxuICAgICAgIGA6bm90KDpmaXJzdC1jaGlsZClgIGV0IG5vbiBgKiArICpgIDogbGVzIGRldXggZGlzZW50IGxhIG3Dqm1lIGNob3NlLCBtYWlzIGAqICsgKmAgcMOoc2VcbiAgICAgICBhdXRhbnQgcXVlIGAuaWxvdFNjZW5lcyB7IG1hcmdpbi10b3A6IDhyZW0gfWAsIGNoYXJnw6kgQVBSw4hTIGNlIGZpY2hpZXIsIHF1aSBnYWduYWl0XG4gICAgICAgYWxvcnMg4oCUIGxlcyAxMnJlbSBuZSBzJ2FwcGxpcXVhaWVudCBwYXMuIExhIHBzZXVkby1jbGFzc2UgZmFpdCBwZW5jaGVyIGxhIGJhbGFuY2UuICovXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgPiA6bm90KDpmaXJzdC1jaGlsZCkge1xuICAgICAgICBtYXJnaW4tdG9wOiAxMnJlbTtcbiAgICB9XG5cbiAgICAvKiBMRVMgVElUUkVTIERFUyDDjkxPVFMsIGNlbnRyw6lzIGRhbnMgbGUgYmFuZGVhdS4gTGV1ciBmb250ZSBldCBsZXVycyBjYXBpdGFsZXMgdmFsZW50XG4gICAgICAgw6AgdG91dGVzIGxlcyB0YWlsbGVzIDogdm9pciBsYSByw6hnbGUgaG9ycyBtZWRpYSBxdWVyeSwgcGx1cyBiYXMuICovXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgPiBzZWN0aW9uID4gaDIsXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgLmlsb3RTY2VuZXNJbnRybyBoMixcbiAgICAucGFnZVJ1YnJpcXVlUHJldmlldyAuaWxvdFNjZW5lc0ludHJvIGgzLFxuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90U2NlbmFyaW9zSW50cm8gaDIsXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgLmlsb3RTY2VuYXJpb3NJbnRybyBoMyxcbiAgICAucGFnZVJ1YnJpcXVlUHJldmlldyAuaWxvdFJ1YnJpcXVlc0ludHJvIGgyLFxuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90UnVicmlxdWVzSW50cm8gaDMge1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIC8qIEF1Y3VuZSBtYXJnZSBpY2kgOiBsJ8OpY2FydCBzb3VzIGxlIHRpdHJlIGVzdCBjZWx1aSBkZSBsJ8OubG90ICgtLWlsb3RFY2FydCxcbiAgICAgICAgICAgaWxvdFNjZW5lcy5jc3MpLCBsZSBtw6ptZSBlbiBiYW5kZWF1IGV0IGhvcnMgYmFuZGVhdS4gKi9cbiAgICB9XG59XG5cbi8qIExFUyBUSVRSRVMgREVTIMOOTE9UUywgw4AgTEEgVEFJTExFIERFIEwnRVNQQUNFIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wMykgOiBzdXJcbiAgIHVuIGJhbmRlYXUgcXVpIHRyYXZlcnNlIGxhIHBhZ2UsIHVuIEgyIG9yZGluYWlyZSBkZSAyNHB4IHNlIHBlcmRhaXQg4oCUIHVuIHRpdHJlIGNvbW1lIHVuXG4gICBhdXRyZSBwb3VyIHVuIGVzcGFjZSBxdWkgbidlbiBlc3QgcGFzIHVuLiBJbCByZXN0ZSB1biBIMiBkYW5zIGxlIEhUTUwsIG1haXMgcHJlbmQgbGEgZm9udGVcbiAgIGR1IEgxICgzMnB4LCBtw6ptZSBTY2FkYSBlbiBncmFzIDogdW4gY3JhbiBkdSBkZXNpZ24gc3lzdGVtLCBwYXMgdW5lIHRhaWxsZSBpbnZlbnTDqWUpLCBlblxuICAgY2FwaXRhbGVzLiBTYW5zIGVzcGFjZW1lbnQgZGVzIGxldHRyZXMgOiBlc3NhecOpLCByZWZ1c8OpIHBhciBsZSBjaGVmIGRlIHByb2pldCBsZSAyMDI2LTA5LTAzLlxuICAgw4AgVE9VVEVTIExFUyBUQUlMTEVTIEQnw4lDUkFOIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0yMikgOiBkJ2Fib3JkIHLDqXNlcnbDqWUgYXVcbiAgIGJhbmRlYXUgKOKJpSAxNjAwKSwgbGEgZm9ybWUgc2UgcGVyZGFpdCBlbiBkZXNzb3VzIGV0IGxlIHRpdHJlIGQnw65sb3QgcmVkZXZlbmFpdCB1biBIMlxuICAgY29tbWUgdW4gYXV0cmUg4oCUIGxhIHN0cnVjdHVyZSBkZSBsYSBwYWdlIGNoYW5nZWFpdCBhdmVjIGxhIGxhcmdldXIuIFNldWwgbGUgY2VudHJhZ2VcbiAgIGTDqXBlbmQgZHUgYmFuZGVhdSAocsOoZ2xlIHBsdXMgaGF1dCwgZGFucyBsYSBtZWRpYSBxdWVyeSkuXG4gICBUcm9pcyBjYXMgOiBsZSBIMiBwb3PDqSBwYXIgYHRpdHJlYCAoZW5mYW50IGRpcmVjdCBkZSBsJ8OubG90KSwgZXQgbGUgYCMjIFRpdHJlYCBvdVxuICAgYCMjIyBUaXRyZWAgZHUgbWFya2Rvd24gZCdgaW50cm9gIOKAlCBIMiBldCBIMywgbcOqbWUgY29tYmF0IDogbGUgbml2ZWF1IGVzdCBwb3VyIEdvb2dsZVxuICAgZXQgbGEgaGnDqXJhcmNoaWUgZHUgZG9jdW1lbnQsIHBhcyBwb3VyIGwnxZNpbCwgcXVpIHZvaXQgbGUgbcOqbWUgdGl0cmUuXG4gICBMZXMgcXVlc3Rpb25zIGRlIGxhIEZBUSBuZSBzb250IHBhcyB2aXPDqWVzIDogZWxsZXMgbmUgc29udCBuaSBlbmZhbnQgZGlyZWN0IGRlIGwnw65sb3RcbiAgIG5pIGRhbnMgdW5lIGludHJvLiAqL1xuLnBhZ2VSdWJyaXF1ZVByZXZpZXcgPiBzZWN0aW9uID4gaDIsXG4ucGFnZVJ1YnJpcXVlUHJldmlldyAuaWxvdFNjZW5lc0ludHJvIGgyLFxuLnBhZ2VSdWJyaXF1ZVByZXZpZXcgLmlsb3RTY2VuYXJpb3NJbnRybyBoMixcbi5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90U2NlbmFyaW9zSW50cm8gaDMsXG4ucGFnZVJ1YnJpcXVlUHJldmlldyAuaWxvdFJ1YnJpcXVlc0ludHJvIGgyLFxuLnBhZ2VSdWJyaXF1ZVByZXZpZXcgLmlsb3RSdWJyaXF1ZXNJbnRybyBoMyB7XG4gICAgZm9udDogdmFyKC0tZkgxKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIC8qIExlIEgyIGRlIGJhc2UgZHUgbm95YXUgcG9ydGUgMTBweCBkZSBtYXJnZSDDoCBkcm9pdGUgZXQgMCDDoCBnYXVjaGUgKDEwX2ZvbnQuY3NzKSA6IGNlbnRyw6ksXG4gICAgICAgc29uIHRleHRlIHBhcnRhaXQgNXB4IMOgIGdhdWNoZSBkZSBjZWx1aSBkJ3VuIEgzLCBkb250IGxlcyBtYXJnZXMgc29udCBzeW3DqXRyaXF1ZXMuICovXG4gICAgbWFyZ2luLWlubGluZTogMDtcbn1cblxuLyogTEUgSDMgRCdVTiDDjkxPVCBERSBTQ8OITkVTLCDDoCBsYSBmb250ZSBkdSBIMiAoY2hlZiBkZSBwcm9qZXQgMjAyNi0xMC0wMikgOiBzdXIgbGEgcGFnZVxuICAgVG9tYm9sYSwgdW4gSDIgwqsgU2PDqG5lcyBkZSB0b21ib2xhIMK7IHBvcnRlIHRyb2lzIHNvdXMtdGl0cmVzIGVuIEgzLiBHYXJkw6lzIMOgIGxhIHRhaWxsZSBkdVxuICAgSDIsIGlscyBuZSBzZSBkaXN0aW5ndWFpZW50IHBsdXMgZGUgbHVpIOKAlCB1biBjcmFuIHBsdXMgcGV0aXQsIGxhIGhpw6lyYXJjaGllIHNlIGxpdC4gKi9cbi5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90U2NlbmVzSW50cm8gaDMge1xuICAgIGZvbnQ6IHZhcigtLWZIMik7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBQQUdFIENBVMOJR09SSUVTIOKAlCBjZSBxdSdlbGxlIGEgZGUgUFJPUFJFXG5cbiAgIExhIGfDqW9tw6l0cmllIGRlIGxhIHBhZ2UgKHRpdHJlLCBtZW51IGRlcyBjaGFwaXRyZXMsIGNvbG9ubmUgZGVzIGFydGljbGVzKSBuJ2VzdFxuICAgcGx1cyBpY2kgOiBlbGxlIGVzdCBkYW5zIHBhZ2VDaGFwaXRyZXMuY3NzLCBhdmVjIGxlIGdhYmFyaXQgcXVpIGxhIHBvcnRlLiBDZVxuICAgZmljaGllciBuZSBnYXJkZSBxdWUgbGVzIHR1aWxlcyBkZSBsaWVuLCBxdWkgbidleGlzdGVudCBxdWUgc3VyIGNldHRlIHBhZ2UuXG5cbiAgIOKaoO+4jyBCUk9VSUxMT04sIGNvbW1lIGxhIHBhZ2UgOiBsZXMgdHVpbGVzIGRpc3BhcmHDrnRyb250IHBldXQtw6p0cmUgYXUgcHJvZml0IGR1XG4gICB0ZXh0ZSDDoCBsaWVucyBkdSBwcmVtaWVyIGNoYXBpdHJlLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyog4pSA4pSAIExlcyB0dWlsZXMgZGUgbGllbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgIFVuIGNoYXBpdHJlIG5lIHBvcnRlIHBhcyBkZSB0ZXh0ZSA6IGlsIHBvcnRlIGRlcyBMSUVOUy4gTGEgdHVpbGUgRVNUIGxlIGxpZW4sXG4gICBlbGxlIG5lIGNvbnRpZW50IHJpZW4gcXVpIG5lIHNvaXQgY2xpcXVhYmxlIOKAlCBpY8O0bmUgZXQgdGl0cmUsIHBvaW50LlxuXG4gICDimqDvuI8gTEUgQ09NUE9SVEVNRU5UIERFIEJPVVRPTiBOJ0VTVCBQQVMgUkVEw4lGSU5JIElDSS4gTGEgdHVpbGUgcG9ydGVcbiAgIGAuY3RhRGlzY3JldGAgZGFucyBsZSB0ZW1wbGF0ZSA6IHRyYWl0LCBmb25kLCBzdXJ2b2wsIHRyYW5zaXRpb24gZXQgY291bGV1clxuICAgZGUgdGV4dGUgdmllbm5lbnQgZGUgbMOgLCBjb21tZSB0b3VzIGxlcyBib3V0b25zIGRpc2NyZXRzIGR1IHNpdGUuIENlIGZpY2hpZXJcbiAgIG4nYWpvdXRlIFFVRSBjZSBxdSd1bmUgdHVpbGUgYSBkZSBwbHVzIDogcG9zZXIgdW5lIGljw7RuZSBkZXZhbnQgbGUgdGV4dGUuXG5cbiAgIExlIHPDqWxlY3RldXIgZG91YmxlICgudHVpbGVMaWVuLmN0YURpc2NyZXQpIGVzdCBuw6ljZXNzYWlyZSA6IGN0YURpc2NyZXQuY3NzXG4gICBlc3QgaW1wb3J0w6kgQVBSw4hTIGNlIGZpY2hpZXIsIGRvbmMgw6Agc3DDqWNpZmljaXTDqSDDqWdhbGUgYydlc3QgbHVpIHF1aSBnYWduZS4gKi9cbi50dWlsZXNMaWVucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiB2YXIoLS1nYXBEZWZhdXQpO1xufVxuXG4udHVpbGVMaWVuLmN0YURpc2NyZXQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDhweDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi8qIOKaoO+4jyBDZXMgU1ZHIG4nb250IHBhcyBkZSBkaW1lbnNpb24gw6AgZXV4LCBzZXVsZW1lbnQgdW4gYHZpZXdCb3hgLiBTYW5zIGxhcmdldXJcbiAgIEVUIGhhdXRldXIgaW1wb3PDqWVzIGljaSwgaWxzIHByZW5uZW50IHRvdXRlIGxhIHBsYWNlIHF1J29uIGxldXIgbGFpc3NlLiAqL1xuLnR1aWxlTGllbkljb25lIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudDMpO1xufVxuXG4udHVpbGVMaWVuSWNvbmUgc3ZnIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTUVOVSBERVMgU09VUy1SVUJSSVFVRVNcbiAgIEJhcnJlIGRlIG5hdmlnYXRpb24gZW50cmUgbGVzIHBhZ2VzIHPFk3VycyBkJ3VuZSBydWJyaXF1ZVxuICAgKEJpbmdvIDc1IC8gQmluZ28gOTDigKYpLlxuXG4gICBUcm9pcyDDqXRhdHMsIHRyb2lzIHLDtGxlcyBkaXN0aW5jdHMgOlxuICAgICAtIHNvdWxpZ27DqSBmaW4gZ3JpcyA6IHPDqXBhcmUgbGVzIHPFk3VycyBsZXMgdW5lcyBkZXMgYXV0cmVzIDtcbiAgICAgLSBzb3VsaWduw6kgw6lwYWlzICAgIDogbGEgc8WTdXIgb8O5IGwnb24gc2UgdHJvdXZlIDtcbiAgICAgLSBwYXbDqSBwbGVpbiAgICAgICAgOiBsYSBzxZN1ciBzdXJ2b2zDqWUsIGNvdXZlcnRlIGNvbW1lIHVuIGJvdXRvbi5cblxuICAgUEFSVEFHw4kgVml0cmluZSAvIFN0dWRpby4gTGUgYmFsaXNhZ2UgZGlmZsOocmUgZGVzIGRldXggY8O0dMOpcyAobGllbnMgcG9zw6lzXG4gICDDoCBsYSBtYWluIGPDtHTDqSBWaXRyaW5lLCBkw6lyaXbDqXMgZHUgdGFnIGRlIHNvdXMtcnVicmlxdWUgY8O0dMOpIFN0dWRpbyksIGxhXG4gICBnw6lvbcOpdHJpZSBlc3QgbGEgbcOqbWUsIGV0IGxhIGNvdWxldXIgZXN0IGwnQWNjZW50IGRlIGxhIHBhZ2UgKC0tY0FjY2VudDMsXG4gICB0ZXh0ZSAtLWNBY2NlbnR0KSA6IHZlcnRlIGVuIFZpdHJpbmUsIGJsZXVlIGVuIFN0dWRpbywgcGFyIGxhIGNsYXNzZSBkdSBib2R5LlxuXG4gICBUcmFuc2NyaXQgZHUgbWVudSBkZSB0aXJhZ2UtYXUtc29ydC5uZXQgKHLDqWbDqXJlbmNlIGNoZWYgZGUgcHJvamV0KS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiNtZW51U291c1J1YnJpcXVlcyB7XG4gICAgcGFkZGluZzogdmFyKC0tZ2FwUmVkdWl0KTtcbn1cblxuI21lbnVTb3VzUnVicmlxdWVzIGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luOiA3cHggMCAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG5cbiNtZW51U291c1J1YnJpcXVlcyBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLyogQ29udGllbnQgbGUgcGF2w6kgZGUgc3Vydm9sIDogc2FucyDDp2EsIHNvbiB6LWluZGV4IG7DqWdhdGlmIGxlIGZlcmFpdCBwYXNzZXJcbiAgICAgICBkZXJyacOocmUgbGUgZm9uZCBkZSBsYSBwYWdlIGF1IGxpZXUgZGUgcmVzdGVyIGRlcnJpw6hyZSBsZSB0ZXh0ZS4gKi9cbiAgICBpc29sYXRpb246IGlzb2xhdGU7XG4gICAgbWFyZ2luOiAwIDRweDtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ3RhMTQpO1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICBsaW5lLWhlaWdodDogMjNweDtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY0JsYW5jMyk7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB0cmFuc2l0aW9uOiAuM3M7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDIzcHgpIHtcbiAgICAvKiBMYSBzaWxob3VldHRlIG5lIGNoYW5nZSBwbHVzIGVuIGZlbsOqdHJlIMOpdHJvaXRlIDogc2V1bCBsZSBjb3JwcyBkdSB0ZXh0ZSBkZXNjZW5kLlxuICAgICAgIFVuIGJvdXRvbiBuZSBjaG9pc2l0IHBhcyBzb24gcGFkZGluZyAoZMOpY2lzaW9uIFBPIDIwMjYtMDctMTgpLiAqL1xuICAgICNtZW51U291c1J1YnJpcXVlcyBhIHtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgIH1cbn1cblxuLyogTGEgc8WTdXIgb8O5IGwnb24gc2UgdHJvdXZlLiAqL1xuI21lbnVTb3VzUnVicmlxdWVzIGEuYWN0aWYge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1jQWNjZW50Myk7XG59XG5cbi8qIExlIHBhdsOpIGRlIHN1cnZvbCA6IGF1IHJlcG9zIGlsIGVzdCByZW50csOpIMOgIGwnaW50w6lyaWV1ciBkdSB0ZXh0ZSwgZXQgdHJhbnNwYXJlbnQuICovXG4jbWVudVNvdXNSdWJyaXF1ZXMgYTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDRweDtcbiAgICByaWdodDogOHB4O1xuICAgIGJvdHRvbTogLTJweDtcbiAgICBsZWZ0OiA4cHg7XG4gICAgei1pbmRleDogLTEwMDtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgdHJhbnNpdGlvbjogLjNzO1xufVxuXG4vKiBGb2N1cyBjbGF2aWVyIDogYW5uZWF1IGludMOpcmlldXIsIHBhcyBkJ291dGxpbmUg4oCUIGxlIGxpZW4gbidhIHBhcyBkZSBzb3VsaWduZW1lbnRcbiAgIHF1aSBzaWduYWxlcmFpdCBsZSBwYXJjb3VycyBhdSBjbGF2aWVyLiAqL1xuI21lbnVTb3VzUnVicmlxdWVzIGE6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWNGb3JtRm9jdXMpIGluc2V0O1xufVxuXG4jbWVudVNvdXNSdWJyaXF1ZXMgYTpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnR0KTtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLyogQXUgc3Vydm9sIGlsIGTDqWJvcmRlIGR1IHRleHRlIGV0IHNlIHJlbXBsaXQgOiBjJ2VzdCBjZSBkw6lib3JkZW1lbnQgcXVpIGZhaXQgbGUgem9vbS4gKi9cbiNtZW51U291c1J1YnJpcXVlcyBhOmhvdmVyOjpiZWZvcmUge1xuICAgIHRvcDogLTJweDtcbiAgICByaWdodDogLThweDtcbiAgICBib3R0b206IC0ycHg7XG4gICAgbGVmdDogLThweDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50Myk7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTUVOVSBERVMgU09VUy1SVUJSSVFVRVMgLSBWaXRyaW5lXG4gICBJbXBvcnQgZGUgbGEgc3RydWN0dXJlIG5veWF1LiBMYSBjb3VsZXVyIGR1IG1lbnUgZXN0IGwnQWNjZW50IGRlIGxhIHBhZ2UgKGNsYXNzZSBkdSBib2R5KSxcbiAgIHJpZW4gw6AgZMOpY2xhcmVyIGljaS4gSnVtZWF1IDogbm95YXUvY3NzL3N0dWRpby81OF9tZW51U291c1J1YnJpcXVlcy5jc3MuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5AaW1wb3J0ICcuLi8uLi9ub3lhdS9jc3MvY29tcG9zYW50cy9tZW51U291c1J1YnJpcXVlcy5jc3MnO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIMOOTE9UIEQnQVBFUsOHVVMgREUgU0PDiE5FXG4gICBVbmUgdmlnbmV0dGUsIHNvbiBub20sIGNlIHF1J2VsbGUgbW9udHJlLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogTCfDqWNhcnQgYXZlYyBjZSBxdWkgcHLDqWPDqGRlIGFwcGFydGllbnQgw6AgbGEgc2VjdGlvbiwgcGFzIMOgIHNvbiB0aXRyZSA6IGMnZXN0IGwnw65sb3RcbiAgIGVudGllciBxdSdvbiBkw6l0YWNoZSBkZSBsJ2FydGljbGUuICovXG4uaWxvdFNjZW5lcyB7XG4gICAgbWFyZ2luLXRvcDogOHJlbTtcbiAgICAvKiBVTiBTRVVMIMOJQ0FSVCBWRVJUSUNBTCBkYW5zIGwnw65sb3QgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTAzKSA6IGVudHJlIGxlXG4gICAgICAgdGl0cmUgZXQgbGEgZ3JpbGxlLCBlbnRyZSBsZSB0aXRyZSBldCBsZSBwYXJhZ3JhcGhlIGQnaW50cm8sIGVudHJlIGNlIHBhcmFncmFwaGUgZXRcbiAgICAgICBsYSBncmlsbGUuIEF2YW50LCBjaGFjdW4gYXZhaXQgbGUgc2llbiAoMS41cmVtLCAyLjVyZW0sIGxhIG1hcmdlIHBhciBkw6lmYXV0IGR1XG4gICAgICAgdGl0cmUpIGV0IHVuIMOubG90IGF2ZWMgaW50cm8gbmUgcmVzcGlyYWl0IHBhcyBjb21tZSB1biDDrmxvdCBzYW5zLiBUb3V0IGNlIHF1aVxuICAgICAgIGVzcGFjZSBkYW5zIGwnw65sb3QgbGl0IGNldHRlIHZhcmlhYmxlLCByaWVuIGQnYXV0cmUuICovXG4gICAgLS1pbG90RWNhcnQ6IDJyZW07XG59XG5cbi5pbG90U2NlbmVzID4gaDIge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogdmFyKC0taWxvdEVjYXJ0KTtcbn1cblxuLyogTGUgbWFya2Rvd24gZGUgYGludHJvYCwgw6AgbGEgcGxhY2UgZHUgSDIuIFNvbiB0aXRyZSBlc3QgREFOUyBsZSBibG9jLCBkb25jIGxhIHLDqGdsZVxuICAgYC5pbG90U2NlbmVzID4gaDJgIGNpLWRlc3N1cyBuZSBsJ2F0dGVpbnQgcGFzIDogYydlc3QgY2UgYmxvYyBxdWkgcG9ydGUgbCfDqWNhcnQgYXZlYyBsYVxuICAgZ3JpbGxlIOKAlCBsZSBtw6ptZSBxdWUgY2VsdWkgZCd1biB0aXRyZSBzZXVsLiAqL1xuLmlsb3RTY2VuZXNJbnRybyB7XG4gICAgbWFyZ2luLWJvdHRvbTogdmFyKC0taWxvdEVjYXJ0KTtcbn1cblxuLyogTEUgVEVYVEUgUydBSlVTVEUgw4AgU09OIENPTlRFTlUgZXQgc2UgY2VudHJlIChjaGVmIGRlIHByb2pldCAyMDI2LTEwLTAyIDsgc2FucyBncmlsbGVcbiAgIGRlcHVpcyBsZSAyMDI2LTEwLTA0KS4gQ2hhcXVlIGJsb2MgZGUgdGV4dGUgcHJlbmQgbGEgbGFyZ2V1ciBkZSBzb24gY29udGVudSwgcGxhZm9ubsOpZSDDoFxuICAgbGEgbGFyZ2V1ciBkZSBsZWN0dXJlLCBldCBzZXMgbWFyZ2VzIGF1dG9tYXRpcXVlcyBsZSBjZW50cmVudCBzb3VzIGxlIHRpdHJlLiBVbiB0ZXh0ZVxuICAgY291cnQgZG9ubmUgdW4gYmxvYyDDqXRyb2l0IDsgdW4gdGV4dGUgbG9uZyByZW1wbGl0IGxhIGxhcmdldXIgZGUgbGVjdHVyZSA7IGxlIHRleHRlIHJlc3RlXG4gICBhbGlnbsOpIMOgIGdhdWNoZSBkYW5zIGxlIGJsb2MuIExlIFRJVFJFIG4nZXN0IHBhcyBjb25jZXJuw6kgOiBpbCBnYXJkZSB0b3V0ZSBsYSBsYXJnZXVyLiAqL1xuLmlsb3RTY2VuZXNJbnRybyA+IDpub3QoaDIsIGgzKSB7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIG1heC13aWR0aDogdmFyKC0tbGFyZ2V1clRleHRlKTtcbiAgICBtYXJnaW4taW5saW5lOiBhdXRvO1xufVxuXG4vKiBMZSB0aXRyZSBkdSBtYXJrZG93biBldCBzb24gcHJlbWllciBwYXJhZ3JhcGhlIDogbGUgbcOqbWUgw6ljYXJ0LCBlbmNvcmUuIExlIHRpdHJlIHBvc2VcbiAgIGxhIG1hcmdlLCBsZSBwYXJhZ3JhcGhlIG4nZW4gYWpvdXRlIGF1Y3VuZSDigJQgZGV1eCBtYXJnZXMgcXVpIHNlIHRvdWNoZW50IGZ1c2lvbm5lbnQgZW5cbiAgIGxhIHBsdXMgZ3JhbmRlLCBldCBvbiBuZSB2ZXV0IHBhcyBkw6lwZW5kcmUgZGUgbGFxdWVsbGUgZ2FnbmUuICovXG4uaWxvdFNjZW5lc0ludHJvID4gaDIsXG4uaWxvdFNjZW5lc0ludHJvID4gaDMge1xuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLWlsb3RFY2FydCk7XG59XG5cbi5pbG90U2NlbmVzSW50cm8gPiBoMiArIHAsXG4uaWxvdFNjZW5lc0ludHJvID4gaDMgKyBwIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xufVxuXG4vKiBTYW5zIMOnYSwgbGEgbWFyZ2UgZHUgdGl0cmUgZHUgbWFya2Rvd24gcydham91dGUgw6AgY2VsbGUgZHUgYmxvYyBldCBjcmV1c2UgdW4gdHJvdS4gKi9cbi5pbG90U2NlbmVzSW50cm8gPiAqOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xufVxuXG4uaWxvdFNjZW5lc0ludHJvID4gKjpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4vKiBMJ8OubG90IGVzdCBsYSBTRUNUSU9OIDogc29uIHRpdHJlIGV0IHNhIGdyaWxsZS4gTGEgZ3JpbGxlIGVzdCBkZWRhbnMsIHBhcyBjb25mb25kdWVcbiAgIGF2ZWMgbHVpIOKAlCBzaW5vbiBsZSB0aXRyZSBkZXZpZW5kcmFpdCB1bmUgY2VsbHVsZSBwYXJtaSBsZXMgdmlnbmV0dGVzLiAqL1xuLyogVFJPSVMgQ09MT05ORVMgQVUgTUFYSU1VTSwgamFtYWlzIHF1YXRyZSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDgtMjMpIDogc3VyIHVuXG4gICBncmFuZCDDqWNyYW4sIGBhdXRvLWZpbGxgIGZhYnJpcXVhaXQgdW5lIHF1YXRyacOobWUgY29sb25uZSBldCBkb25jIHF1YXRyZSB2aWduZXR0ZXNcbiAgIG1pbnVzY3VsZXMsIG/DuSBsZSB2aXNpdGV1ciBuZSBkaXN0aW5ndWUgcGx1cyBjZSBzdXIgcXVvaSBpbCBzJ2FwcHLDqnRlIMOgIGNsaXF1ZXIuIExlXG4gICBub21icmUgZGUgY29sb25uZXMgZXN0IGRvbmMgUE9Tw4ksIHBhcyBkw6lkdWl0IGQndW5lIGxhcmdldXIgbWluaW1hbGUgOiB1bmUgY29sb25uZSwgcHVpc1xuICAgZGV1eCwgcHVpcyB0cm9pcywgZXQgb24gcydhcnLDqnRlIGzDoC4gTGEgdmlnbmV0dGUgZ3JhbmRpdCBhdmVjIGwnw6ljcmFuIGF1IGxpZXUgZGUgc2VcbiAgIG11bHRpcGxpZXIuICovXG4uaWxvdFNjZW5lc0dyaWQge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XG4gICAgLyogTGUgTcOKTUUgw6ljYXJ0IGRhbnMgbGVzIGRldXggc2VucywgMS41cmVtIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wMykuIExlIDIzXG4gICAgICAgYW/Du3QsIGwnw6ljYXJ0IHZlcnRpY2FsIGF2YWl0IMOpdMOpIHRyaXBsw6kgKDQuNXJlbSkgcG91ciBxdSdvbiBzYWNoZSDDoCBxdWVsbGUgdmlnbmV0dGVcbiAgICAgICBhcHBhcnRpZW50IHVuIHRpdHJlIOKAlCBzb3VzIHVuZSB2aWduZXR0ZSwgaWwgeSBhIGxlIHRpdHJlIGRlIGxhIHN1aXZhbnRlLiBSZXZ1IMOgXG4gICAgICAgbCfDqWNyYW4gYXZlYyBsZXMgdmlnbmV0dGVzIGRlIDEwMDBweCBldCBsZSBiYW5kZWF1IDogbGUgdHJpcGxlIGNyZXVzYWl0IGRlcyB0cm91cyxcbiAgICAgICBldCBsZSB0aXRyZSBjb2xsw6kgc291cyBzb24gaW1hZ2UgKG1hcmdlIGRlIC41cmVtLCBjb250cmUgMS41cmVtIGF1LWRlc3N1cyBkZSBsYVxuICAgICAgIHN1aXZhbnRlKSBzdWZmaXQgw6AgZGlyZSDDoCBxdWkgaWwgZXN0LiAqL1xuICAgIGdhcDogMS41cmVtO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNTYwcHgpIHtcbiAgICAuaWxvdFNjZW5lc0dyaWQge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICAgIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDkwMHB4KSB7XG4gICAgLmlsb3RTY2VuZXNHcmlkIHtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTtcbiAgICB9XG59XG5cbi8qIExlcyBwcm9wcmnDqXTDqXMgZHUgcmVwb3MgcXVpIG5lIHNlcnZlbnQgcXUnYXUgc3Vydm9sIChoYWxvIGRlIGxhcmdldXIgbnVsbGUsIGZvbmRcbiAgIHRyYW5zcGFyZW50KSBzb250IGljaSBwbHV0w7R0IHF1ZSBkYW5zIGxhIHNlY3Rpb24gwqsgTEUgU1VSVk9MIMK7IHBsdXMgYmFzIDogdW5lIHRyYW5zaXRpb25cbiAgIG4nYSBsaWV1IHF1ZSBzaSBsJ8OpdGF0IGRlIGTDqXBhcnQgZXN0IMOJQ1JJVCDigJQgdW4gb3V0bGluZSBhYnNlbnQgbmUgcydhbmltZSBwYXMsIHVuXG4gICBvdXRsaW5lIGRlIDAgc2kuXG4gICBVTkUgREVNSS1TRUNPTkRFLCBldCBjJ2VzdCB2b3VsdSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDgtMjMpIDogbGUgaGFsbyBuJ2Fubm9uY2VcbiAgIHJpZW4sIGlsIG5lIGZhaXQgcXVlIGNvbmZpcm1lciDCqyB2b3RyZSBzb3VyaXMgZXN0IGljaSDCuy4gw4AgMC4ycyBpbCBjbGFxdWFpdCDDoCBjaGFxdWVcbiAgIHZpZ25ldHRlIHRyYXZlcnPDqWUgZXQgbGUgY2F0YWxvZ3VlIGNsaWdub3RhaXQgc291cyBsZSBjdXJzZXVyLiDDgCAuNXMgZW4gYGVhc2Utb3V0YCwgbGVcbiAgIHZpc2l0ZXVyIHF1aSBuZSBmYWl0IHF1ZSBwYXNzZXIgdm9pdCDDoCBwZWluZSBsZSBmb25kIGJvdWdlciA7IGNlbHVpIHF1aSBzJ2FycsOqdGUgdm9pdCBsZVxuICAgaGFsbyBzJ2luc3RhbGxlci4gTGUgbGVudCBlc3QgaWNpIHBsdXMgbGlzaWJsZSBxdWUgbGUgcmFwaWRlLlxuICAgTGEgY291bGV1ciBkdSBoYWxvIGVzdCBUUkFOU1BBUkVOVEUgYXUgcmVwb3MsIHBhcyBudWxsZSA6IHNhbnMgw6dhLCBsJ291dGxpbmUgcGFydGFpdCBkw6lqw6BcbiAgIMOgIHNhIGNvdWxldXIgcGxlaW5lIGV0IHNldWxlIHNhIExBUkdFVVIgbW9udGFpdCDigJQgbGUgYmxldSBzdXJnaXNzYWl0IGQndW4gY291cCBzdXIgdW5cbiAgIGxpc2Vyw6kgZCd1biBwaXhlbCwgcHVpcyBzJ8OpbGFyZ2lzc2FpdC4gRW4gcGFydGFudCBkZSBgdHJhbnNwYXJlbnRgLCBsYSBjb3VsZXVyIG1vbnRlIGVuXG4gICBtw6ptZSB0ZW1wcyBxdWUgbGEgbGFyZ2V1ciwgZXQgbGUgaGFsbyBzZSB0ZWludGUgYXUgbGlldSBkJ2FwcGFyYcOudHJlLiAqL1xuLyogTEEgVklHTkVUVEUgRVNUIFVORSBCT8OOVEUsIFBMVVMgVU4gTElFTiAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMTAtMDcpIDogbCdpbWFnZSBlc3RcbiAgIHVuIGxpZW4gcXVpIGpvdWUgbCdhcGVyw6d1ICguaWxvdFNjZW5lVmlzdWVsKSwgbGUgdGV4dGUgZXN0IHVuIGxpZW4gcXVpIG3DqG5lIMOgIGxhIGZpY2hlXG4gICAoLmlsb3RTY2VuZVRleHRlKS4gTGEgYm/DrnRlIG5lIHBvcnRlIHF1ZSBsZSBoYWxvIGR1IHN1cnZvbC4gKi9cbi5pbG90U2NlbmUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgb3V0bGluZTogMCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB0cmFuc2l0aW9uOiBvdXRsaW5lLXdpZHRoIC41cyBlYXNlLW91dCwgb3V0bGluZS1jb2xvciAuNXMgZWFzZS1vdXQsIGJhY2tncm91bmQtY29sb3IgLjVzIGVhc2Utb3V0O1xufVxuXG4vKiBMQSBDT1VMRVVSIERVIEhBTE8gOiBsZSBmb25kIGRlIGxhIHZpZ25ldHRlLCDDqWNsYWlyY2llIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXRcbiAgIDIwMjYtMTAtMDcpLiBFbGxlIHNlcnQgw6AgbGEgdmlnbmV0dGUgZGUgbCfDrmxvdCBFVCBhdSB2aXN1ZWwgZGUgbGEgcGFnZSBkJ3VuZSBzY8OobmVcbiAgICguc2NlbmVWaXN1ZWxMaWVuLCBwYWdlU2NlbmUuY3NzKSA6IHVuZSBzZXVsZSBmb3JtdWxlIHBvdXIgbGVzIGRldXguXG4gICBgLS1jb3VsZXVyRm9uZFZpc3VlbGAgZXN0IHBvc8OpZSBwYXIgbGUgZ2FiYXJpdCwgY2FsY3Vsw6llIHN1ciBsJ2ltYWdlXG4gICAoQXBlcmN1U2NlbmVTZXJ2aWNlOjpjb3VsZXVyRm9uZCkgOyBsZSBQSFAgbmUgZG9ubmUgcXVlIGxhIGNvdWxldXIgYnJ1dGUsIGMnZXN0IGljaVxuICAgcXUnb24gZGl0IMOgIHF1ZWwgcG9pbnQgb24gbCfDqWNsYWlyY2l0LiA0MCAlIGRlIGxhIGNvdWxldXIsIGxlIHJlc3RlIGVuIGJsYW5jIDogYXNzZXpcbiAgIHBvdXIgcXUnb24gcmVjb25uYWlzc2UgbGUgdmVydCwgbCdvcmFuZ2Ugb3UgbGUgYmxldSBkZSBsYSBzY8OobmUsIGFzc2V6IHDDomxlIHBvdXIgcXVlIGxlXG4gICB0ZXh0ZSByZXN0ZSBsaXNpYmxlIGRlc3N1cy4gU2FucyB2aWduZXR0ZSwgbCdBY2NlbnQgOiBzdXIgQWNjZW50MiwgY2UgbcOpbGFuZ2UgZG9ubmUgw6BcbiAgIHBldSBwcsOocyBsJ2FuY2llbiBoYWxvLiAqL1xuLmlsb3RTY2VuZSxcbi5zY2VuZVZpc3VlbExpZW4ge1xuICAgIC0tY291bGV1ckhhbG86IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb3VsZXVyRm9uZFZpc3VlbCwgdmFyKC0tY0FjY2VudDIpKSA0MCUsIHZhcigtLWNCbGFuYykpO1xufVxuXG4vKiBMZSBsaWVuIGRlIGwnaW1hZ2UgOiBpbCBqb3VlIGwnYXBlcsOndS4gUGFzIGRlIHNvdWxpZ25lbWVudCDigJQgbCdpbWFnZSBuJ2EgcGFzIGRlIHRleHRlLCBldCBsZVxuICAgYGFgIGRlIGxhIFZpdHJpbmUgKHZpdHJpbmUuY3NzKSBsZSBzb3VsaWduZXJhaXQgYXUgbW9pbmRyZSBlc3BhY2UuICovXG4uaWxvdFNjZW5lVmlzdWVsIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgdHJhbnNwYXJlbnQ7XG4gICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAuNXMgZWFzZS1vdXQ7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGU1ZWU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLyogTCfDrmxvdCBuZSBmYWl0IGphbWFpcyBmbG90dGVyIDogaWwgdmllbnQgYXByw6hzIGxlIHRleHRlIGRlIGwnYXJ0aWNsZS4gKi9cbi5pbG90U2NlbmVWaXN1ZWwgaW1nIHtcbiAgICBmbG9hdDogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiBub25lO1xuICAgIG9iamVjdC1maXQ6IGNvdmVyO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4vKiBMZSBsaWVuIGR1IHRleHRlIDogbGUgbm9tIGV0IGxhIGRlc2NyaXB0aW9uLCBjb2xsw6lzLCBzb3VzIGwnaW1hZ2UuIElsIG3DqG5lIMOgIGxhIGZpY2hlLlxuICAgQXVjdW4gc291bGlnbmVtZW50IGF1IHJlcG9zIOKAlCBjJ2VzdCBsZSBub20sIHNldWwsIHF1aSBzZSBzb3VsaWduZSBxdWFuZCBvbiBsZSBzdXJ2b2xlIG91XG4gICBxdSdvbiBsZSBmb2NhbGlzZSA6IGlsIGRpdCDCqyBjZWNpIGVzdCB1biBsaWVuIMK7LCBhbG9ycyBxdWUgbCdpbWFnZSBkaXQgwqsgY2VjaSBqb3VlIMK7LlxuICAgTGUgc291bGlnbmVtZW50IGVzdCBwb3PDqSBzdXIgTEUgTk9NLCBwYXMgc3VyIGxlIGxpZW4gOiB1biBzb3VsaWduZW1lbnQgcG9zw6kgc3VyIGxlIGxpZW5cbiAgIHNlIHByb3BhZ2VyYWl0IMOgIGxhIGRlc2NyaXB0aW9uIGV0IG5lIHBvdXJyYWl0IHBsdXMgZW4gw6p0cmUgcmV0aXLDqS5cbiAgIE3Dqm1lIHN5c3TDqG1lIGRlIHNvdWxpZ25lbWVudCBxdWUgbGVzIGxpZW5zIGRlIGxhIFZpdHJpbmUgKHZpdHJpbmUuY3NzKS4gKi9cbi5pbG90U2NlbmVUZXh0ZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmlsb3RTY2VuZVRleHRlOmhvdmVyIC5pbG90U2NlbmVOb20sXG4uaWxvdFNjZW5lVGV4dGU6Zm9jdXMtdmlzaWJsZSAuaWxvdFNjZW5lTm9tIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICB0ZXh0LXVuZGVybGluZS1vZmZzZXQ6IDVweDtcbiAgICB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOiAxcHg7XG4gICAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiB2YXIoLS1jTm9pcjUpO1xufVxuXG4vKiBMZXMgZGV1eCBsaWduZXMgZGUgdGV4dGUgc29udCBDT0xMw4lFUyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDgtMjMpIDogZWxsZXNcbiAgIHBhcmxlbnQgZGUgbGEgbcOqbWUgdmlnbmV0dGUsIGVsbGVzIGRvaXZlbnQgc2UgbGlyZSBjb21tZSB1biBzZXVsIGJsb2MuIEF1Y3VuZSBoYXV0ZXVyXG4gICByw6lzZXJ2w6llIGljaSDigJQgdW5lIGhhdXRldXIgZmlnw6llIHN1ciB1biBub20gZCd1bmUgc2V1bGUgbGlnbmUgY3JldXNhaXQgdW4gdHJvdSBkJ3VuZVxuICAgbGlnbmUgZW50acOocmUgZW50cmUgbGUgbm9tIGV0IGxlIHRleHRlLCBldCBjZSB0cm91IGTDqXRhY2hhaXQgw6AgbCfFk2lsIGNlIHF1aSB2YVxuICAgZW5zZW1ibGUuIEMnZXN0IGwnw6ljYXJ0IHZlcnRpY2FsIGRlIGxhIGdyaWxsZSBxdWkgc8OpcGFyZSBsZXMgdmlnbmV0dGVzLCBwYXMgZHUgdmlkZSDDoFxuICAgbCdpbnTDqXJpZXVyIGRlIGNoYWN1bmUuXG4gICBgbGluZS1jbGFtcGAgcmVzdGUsIGx1aSA6IGlsIGNvdXBlIGNlIHF1aSBkw6lib3JkZS4gTGVzIGRldXggc3ludGF4ZXMgc29udCBwb3PDqWVzIDogbGFcbiAgIHN0YW5kYXJkLCBldCBsYSAtd2Via2l0LSBxdWUgU2FmYXJpIGV0IENocm9tZSByw6ljbGFtZW50IGVuY29yZSBwb3VyIGxlIG1vZGUgYm/DrnRlXG4gICB2ZXJ0aWNhbC4gKi9cbi5pbG90U2NlbmVOb20sXG4uaWxvdFNjZW5lQXBlcmN1IHtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbGluZS1jbGFtcDogMjtcbiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDI7XG59XG5cbi8qIERFVVggTklWRUFVWCwgREVVWCBGT05URVMgRFUgREVTSUdOIFNZU1RFTSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDMpLiBMZSBub21cbiAgIGRlIGxhIHNjw6huZSBuZSBzJ2FmZmljaGUgcGx1cyA6IGxlIG5vbSBkZSBsJ2FwZXLDp3UgYSBwcmlzIHNhIHBsYWNlIGV0IHNhIGdyYWlzc2UsIGxhXG4gICBkZXNjcmlwdGlvbiBhIHByaXMgbGEgcGxhY2UgZXQgbGUgY29ycHMgZHUgbm9tIGRlIGwnYXBlcsOndS4gKi9cblxuLyogTGUgbm9tIGRlIGwnQVBFUsOHVSDigJQgaWwgdGl0cmUgbGEgdmlnbmV0dGUuIFNhIG1hcmdlIGhhdXRlIGVzdCBsZSBzZXVsIMOpY2FydCBkdSBibG9jIDpcbiAgIGVsbGUgZMOpdGFjaGUgbGUgdGV4dGUgZGUgbCdpbWFnZSwgc2FucyBsJ2VuIHPDqXBhcmVyLiAqL1xuLmlsb3RTY2VuZU5vbSB7XG4gICAgbWFyZ2luLXRvcDogLjVyZW07XG4gICAgZm9udDogdmFyKC0tZlRleHQxNlN0cm9uZyk7XG59XG5cbi8qIExhIGRlc2NyaXB0aW9uIGRlIGwnYXBlcsOndSwgYXUgY29ycHMgZHUgbm9tIGQnYXBlcsOndSBkJ2F2YW50IDogMTZweCwgZ3JhaXNzZSBub3JtYWxlLlxuICAgRWxsZSBuJ2VzdCBQQVMgdW4gdGV4dGUgc2Vjb25kYWlyZSDigJQgYydlc3QgZWxsZSBxdWkgZGl0IGNlIHF1ZSBsYSB2aWduZXR0ZSBtb250cmUuXG4gICBEZXV4IGxpZ25lcyBhdSBtYXhpbXVtIDogZWxsZSBmYWl0IGp1c3F1J8OgIDgwIHNpZ25lcywgdW5lIHNldWxlIGxpZ25lIGVuIGNvdXBlcmFpdCBsYVxuICAgbW9pdGnDqSBkYW5zIHVuZSBjb2xvbm5lIGRlIHZpZ25ldHRlLiAqL1xuLmlsb3RTY2VuZUFwZXJjdSB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBMRSBTVVJWT0xcbiAgIFN1ciB1biBjYXRhbG9ndWUsIGxlIHZpc2l0ZXVyIGF0dGVuZCBxdSd1bmUgdmlnbmV0dGUgUsOJUE9OREUgcXVhbmQgaWwgbGEgc3Vydm9sZSA6IGMnZXN0XG4gICBjZSBxdWkgbHVpIGRpdCBxdSdlbGxlIGVzdCBjbGlxdWFibGUsIGF2YW50IG3Dqm1lIHF1J2lsIGFpdCB2dSBsZSBjdXJzZXVyIGNoYW5nZXIuIExhXG4gICByw6lwb25zZSBlc3QgdW4gaGFsbywgZXQgaWwgRElUIE/DmSBNw4hORSBMRSBDTElDIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0xMC0wNykgOlxuICAgICDigKIgc3VyIGwnSU1BR0UsIGxlIGhhbG8gbidlbnRvdXJlIHF1ZSBsJ2ltYWdlIOKAlCBlbGxlIHZhIGpvdWVyIGwnYXBlcsOndSA7XG4gICAgIOKAoiBzdXIgbGUgVEVYVEUsIGxlIGhhbG8gZW50b3VyZSB0b3V0ZSBsYSB2aWduZXR0ZSwgaW1hZ2UgY29tcHJpc2Ug4oCUIGxlIHRleHRlIHZhIG91dnJpclxuICAgICAgIGxhIGZpY2hlLCBxdWkgcmVncm91cGUgdG91dCBjZSBxdWUgbGEgdmlnbmV0dGUgbW9udHJlLlxuICAgTGVzIGRldXggaGFsb3Mgc29udCBkZSBsYSBjb3VsZXVyIGR1IGZvbmQgZGUgbGEgdmlnbmV0dGUsIMOpY2xhaXJjaWUgKC0tY291bGV1ckhhbG8pLlxuXG4gICBUT1VURSBMQSBWSUdORVRURSA6IHVuIGBvdXRsaW5lYCBldCB1biBmb25kLCBzdXIgbGEgYm/DrnRlLiBMJ291dGxpbmUgc2UgZGVzc2luZSBFTiBERUhPUlNcbiAgIGRlIGxhIGJvw650ZSwgaWwgbmUgcG91c3NlIGRvbmMgcGFzIGxlcyB2aWduZXR0ZXMgdm9pc2luZXMgZXQgbmUgZMOpY2FsZSBsYSBncmlsbGUgZCdhdWN1blxuICAgcGl4ZWwuIFNhIGxhcmdldXIgZXQgc2EgY291bGV1ciBtb250ZW50IGVuIC41cyAow6l0YXQgZGUgcmVwb3MgZXQgZHVyw6llIHBvc8OpcyBzdXJcbiAgIGAuaWxvdFNjZW5lYCkgOiBsZSBoYWxvIHMnaW5zdGFsbGUgbGVudGVtZW50LCBpbCBuJ2FwcGFyYcOudCBqYW1haXMgZCd1biBjb3VwLlxuICAgTCdJTUFHRSBTRVVMRSA6IHVuIGBib3gtc2hhZG93YCBkJ8OpdGFsZW1lbnQgMTVweCwgZGUgbcOqbWUgbGFyZ2V1ciwgZXQgbm9uIHVuIG91dGxpbmUg4oCUXG4gICBsJ291dGxpbmUgc2UgcGVpbnQgUEFSLURFU1NVUyBsZSBjb250ZW51IGV0IG1hc3F1ZXJhaXQgbGUgZMOpYnV0IGR1IHRleHRlIHF1aSBzdWl0IDsgbCdvbWJyZVxuICAgc2UgcGVpbnQgZGVzc291cywgbGUgdGV4dGUgcmVzdGUgbGlzaWJsZS4gQXUgZm9jdXMgY2xhdmllciwgbCdhbm5lYXUgZGUgZm9jdXMgZGVzIGxpZW5zXG4gICAoMzFfY3RhLmNzcykgcmVzdGUgcG9zw6kgcGFyLWRlc3N1cywgbGUgaGFsbyBzJ2Fqb3V0ZSBkZXJyacOocmUuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLmlsb3RTY2VuZTpoYXMoLmlsb3RTY2VuZVRleHRlOmhvdmVyKSxcbi5pbG90U2NlbmU6aGFzKC5pbG90U2NlbmVUZXh0ZTpmb2N1cy12aXNpYmxlKSB7XG4gICAgb3V0bGluZTogMTVweCBzb2xpZCB2YXIoLS1jb3VsZXVySGFsbyk7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY291bGV1ckhhbG8pO1xufVxuXG4uaWxvdFNjZW5lVmlzdWVsOmhvdmVyIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxNXB4IHZhcigtLWNvdWxldXJIYWxvKTtcbn1cblxuLmlsb3RTY2VuZVZpc3VlbDpmb2N1cy12aXNpYmxlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tY0Zvcm1Gb2N1cyksIDAgMCAwIDE1cHggdmFyKC0tY291bGV1ckhhbG8pO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgREFOUyBMRSBCQU5ERUFVIOKAlCBncmFuZHMgw6ljcmFucyBzZXVsZW1lbnRcbiAgIExlIGJhbmRlYXUgKGZvbmQgZ3JpcyBkJ3VuIGJvcmQgw6AgbCdhdXRyZSwgY29udGVudSBjZW50csOpIMOgIHBhcnRpciBkZSAxNjAwcHgpIG4nZXN0IFBBU1xuICAgcG9ydMOpIHBhciBsJ8OubG90IDogaWwgZXN0IHBvcnTDqSBwYXIgbCdlbnZlbG9wcGUgYC5wYWdlUnVicmlxdWVQcmV2aWV3YCBkdSBnYWJhcml0IGRlXG4gICBydWJyaXF1ZSwgdm9pciBwYWdlUnVicmlxdWUuY3NzLiBSYWlzb24gKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTAzKSA6IHBsdXNpZXVyc1xuICAgw65sb3RzIHNlIHN1aXZlbnQgc291dmVudCwgZXQgdW4gYmFuZGVhdSBwYXIgw65sb3QgbGFpc3NhaXQgZGVzIGJhbmRlcyBibGFuY2hlcyBlbnRyZSBldXguXG4gICBVbiBzZXVsIGJhbmRlYXUsIHRvdXMgbGVzIMOubG90cyBkZWRhbnMuIE5lIHJlc3RlbnQgaWNpIHF1ZSBsZXMgcsOpZ2xhZ2VzIGRlIENFVCDDrmxvdFxuICAgcXVhbmQgaWwgZXN0IGRhbnMgbGUgYmFuZGVhdS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5AbWVkaWEgKG1pbi13aWR0aDogMTYwMHB4KSB7XG4gICAgLyogTGUgQkxPQyBkZSBsJ2ludHJvIHNlIGNlbnRyZSAocGx1cyBoYXV0KSA7IHNvbiB0ZXh0ZSByZXN0ZSBhbGlnbsOpIMOgIGdhdWNoZSAoZMOpY2lzaW9uXG4gICAgICAgY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wMykgOiB1biBwYXJhZ3JhcGhlIGNlbnRyw6kgc2UgbGl0IG1hbCwgY2hhcXVlIGxpZ25lIHJlcGFydCBkJ3VuXG4gICAgICAgZW5kcm9pdCBkaWZmw6lyZW50LiBTZXVsIGxlIHRpdHJlIGVzdCBjZW50csOpIChwYWdlUnVicmlxdWUuY3NzKS4gKi9cbiAgICAucGFnZVJ1YnJpcXVlUHJldmlldyAuaWxvdFNjZW5lc0ludHJvIHAge1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIH1cblxuICAgIC8qIExhIHZpZ25ldHRlLCBlbGxlLCByZXN0ZSDDqWNyaXRlIMOgIGdhdWNoZSA6IHNlcyB0cm9pcyBsaWduZXMgZGUgdGV4dGUgc2UgbGlzZW50IGVuXG4gICAgICAgYmxvYyBzb3VzIGwnaW1hZ2UsIHVuIGNlbnRyYWdlIGxlcyBmZXJhaXQgZmxvdHRlci4gU2V1bCBjZSBxdWkgcGFybGUgZGUgbGEgU0VDVElPTlxuICAgICAgICh0aXRyZSwgaW50cm8pIHNlIGNlbnRyZS4gKi9cbiAgICAucGFnZVJ1YnJpcXVlUHJldmlldyAuaWxvdFNjZW5lIHtcbiAgICAgICAgdGV4dC1hbGlnbjogc3RhcnQ7XG4gICAgfVxuXG4gICAgLyogUVVBVFJFIENPTE9OTkVTIGRhbnMgbGUgYmFuZGVhdSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDMpLiBMYSByw6hnbGUgZGVzXG4gICAgICAgdHJvaXMgY29sb25uZXMgYXUgbWF4aW11bSAocGx1cyBoYXV0LCAyMDI2LTA4LTIzKSBwcm90w6lnZWFpdCBkZXMgdmlnbmV0dGVzIG1pbnVzY3VsZXNcbiAgICAgICBzdXIgdW4gw6ljcmFuIG9yZGluYWlyZSA7IGRhbnMgbGUgYmFuZGVhdSwgYXZlYyBhdSBtb2lucyAxNDAwcHggZGUgY29udGVudSwgcXVhdHJlXG4gICAgICAgdmlnbmV0dGVzIGZvbnQgZW5jb3JlIDMzMHB4IGNoYWN1bmUg4oCUIHBsdXMgcXVlIHRyb2lzIHZpZ25ldHRlcyDDoCAxMDI0LiBMZSBiYW5kZWF1IGVzdFxuICAgICAgIGwnYXV0cmUgZXNwYWNlLCBpbCBhIHNvbiBwcm9wcmUgbm9tYnJlIGRlIGNvbG9ubmVzLiAqL1xuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90U2NlbmVzR3JpZCB7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7XG4gICAgfVxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTEEgQ0FTRSDigJQgbGEgdmlnbmV0dGUgZXQsIHNvdXMgZWxsZSwgbGEgbGlnbmUgZHUgbGllbiB2ZXJzIGxlIHN0dWRpbyBldCBkdSBjxZN1clxuICAgTGEgZ3JpbGxlIHJhbmdlIGRlcyBjYXNlcyA7IGxhIHZpZ25ldHRlIChsYSBib8OudGUpIGVzdCBkZWRhbnMsIGxhIGxpZ25lIGF1c3NpLCBsJ3VuZSBzb3VzXG4gICBsJ2F1dHJlLiBTYW5zIGNhc2UsIGNldHRlIGxpZ25lIHNlcmFpdCB1bmUgY2VsbHVsZSBkZSBsYSBncmlsbGUgw6AgZWxsZSBzZXVsZS5cbiAgIEVsbGUgZXN0IMOgIDEuMjVyZW0gc291cyBsYSB2aWduZXR0ZSA6IGxlIGhhbG8gZHUgc3Vydm9sIGTDqWJvcmRlIGRlIDE1cHgsIGxhIGxpZ25lIGRvaXRcbiAgIHJlc3RlciBlbiBkZWhvcnMsIHNpbm9uIGxlIHN1cnZvbCBkZSBsYSB2aWduZXR0ZSBhIGwnYWlyIGRlIGxhIGNvdXZyaXIuXG5cbiAgIFVOIExJRU4sIFBMVVMgVU4gQk9VVE9OIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuIElsIHBvcnRhaXQgbGEgc2lsaG91ZXR0ZVxuICAgZGUgYm91dG9uIGRlcyBjYXJ0ZXMgZGUgc2PDqW5hcmlvICguY3RhRGlzY3JldCkgOiBib3JkdXJlLCBmb25kIGJsYW5jLCByZW1ib3VycmFnZS4gU291c1xuICAgdW5lIHZpZ25ldHRlLCBjZXR0ZSBzaWxob3VldHRlIHBlc2FpdCB0cm9wIHBvdXIgdW4gZ2VzdGUgc2Vjb25kYWlyZS5cbiAgIElsIG5lIHBvc2UgZG9uYyBwbHVzIFJJRU4gZCdhdXRyZSBxdWUgc2EgcGxhY2UgZXQgc2EgdGFpbGxlIDogbGEgY291bGV1ciBkJ2FjY2VudCBldCBsZVxuICAgc291bGlnbmVtZW50IHZpZW5uZW50IGR1IGBhYCBkZSBsYSB2aXRyaW5lICh2aXRyaW5lLmNzcyksIGxhIHRhaWxsZSByZXN0ZSBjZWxsZSBxdSdhdmFpdFxuICAgbGUgYm91dG9uICgtLWZNZW51MTQpLCBwb3VyIHF1ZSBzZXVsZSBsYSBzaWxob3VldHRlIGNoYW5nZS5cbiAgIGBhbGlnbi1pdGVtczogZmxleC1zdGFydGAgKGNpLWRlc3NvdXMpIGxlIGdhcmRlIMOgIGxhIGxhcmdldXIgZGUgc29uIHRleHRlIDogw6l0aXLDqSBzdXJcbiAgIHRvdXRlIGxhIGNhc2UsIGlsIG9mZnJpcmFpdCBhdSBjbGljIHVuZSBiYW5kZSBkZSB2aWRlIMOgIHNhIGRyb2l0ZS5cbiAgIGBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW5gIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xMykgOiBsZXMgY2FzZXMgZCd1bmVcbiAgIG3Dqm1lIHJhbmfDqWUgb250IGxhIGhhdXRldXIgZGUgbGEgcGx1cyBoYXV0ZSAobGEgZ3JpbGxlIGxlcyDDqXRpcmUpLCBtYWlzIGxldXJzIHRleHRlcyBuJ29udFxuICAgcGFzIHRvdXMgZGV1eCBsaWduZXMuIExhIHZpZ25ldHRlIHJlc3RlIGVuIGhhdXQsIGxhIGxpZ25lIGRlc2NlbmQgZW4gYmFzIGRlIGxhIGNhc2UgOiBlbGxlXG4gICB0b21iZSDDoCBsYSBtw6ptZSBoYXV0ZXVyIHN1ciB0b3V0ZSBsYSByYW5nw6llLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi5pbG90U2NlbmVDYXNlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4uaWxvdFNjZW5lQ2FzZSAuaWxvdFNjZW5lIHtcbiAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xufVxuXG4vKiBMQSBMSUdORSBTT1VTIExBIFZJR05FVFRFIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xMikgOiBsZSBsaWVuIHZlcnMgbGUgc3R1ZGlvIMOgXG4gICBnYXVjaGUsIGxlIGPFk3VyIMKrIEonYWltZSDCuyAoYnJpcXVlIG5veWF1IF9qYWltZSwgY29tcG9zYW50cy9qYWltZS5jc3MpIMOgIGRyb2l0ZS4gRWxsZVxuICAgcHJlbmQgdG91dGUgbGEgbGFyZ2V1ciBkZSBsYSBjYXNlIHBvdXIgcXVlIGxlIGPFk3VyIHNlIGNhbGUgw6AgZHJvaXRlIDsgc29uIG1hcmdpbi10b3AgbGFcbiAgIHRpZW50IMOgIDEuMjVyZW0gc291cyBsYSB2aWduZXR0ZSwgaG9ycyBkdSBoYWxvIGRlIHN1cnZvbC4gUXVhbmQgbGEgbGlnbmUgZXN0IMOpdGVpbnRlXG4gICAoYGxpZ25lQWN0aW9uYCksIGVsbGUgbidleGlzdGUgcGFzIDogbGUgY8WTdXIgc3VpdCBsZSBsaWVuIChfaWxvdFNjZW5lcy50d2lnKS4gKi9cbi5pbG90U2NlbmVDYXNlIC5pbG90U2NlbmVMaWduZSB7XG4gICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGdhcDogdmFyKC0tZ2FwRGVmYXV0KTtcbiAgICBtYXJnaW4tdG9wOiAxLjI1cmVtO1xufVxuXG4uaWxvdFNjZW5lQ2FzZSAuaWxvdFNjZW5lTGlnbmUgLnRvZ2dsZUphaW1lIHtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbn1cblxuLyogTEUgTElFTiBWRVJTIExFIFNUVURJTyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMTAtMDcpIDogwqsgTWUgY29ubmVjdGVyIMK7LCDCqyBDcsOpZXIgdW5cbiAgIHN0dWRpbyDCuyBvdSDCqyBVdGlsaXNlciBkYW5zIG1vbiBzdHVkaW8gwrsgc2Vsb24gcXVpIHJlZ2FyZGUuIEMnZXN0IHVuIFZSQUkgbGllbiAoYDxhPmApIDpcbiAgIGlsIG3DqG5lIMOgIGwnYWlndWlsbGFnZSDCqyBjcsOpZXIgdW4gw6l2w6luZW1lbnQgwrssIHF1aSByZWRpcmlnZS4gSWwgbmUgcG9zZSBxdWUgc2EgdGFpbGxlIGV0XG4gICBsZSBwYWRkaW5nIHZlcnRpY2FsIGRlcyBsaWVucyAoMzFfY3RhLmNzcykgOyBsYSBjb3VsZXVyIGQnQWNjZW50LCBsZSBzb3VsaWduZW1lbnQgZXQgbGVcbiAgIGhhbG8gZGUgZm9jdXMgdmllbm5lbnQgZHUgYGFgIGRlIGxhIFZpdHJpbmUsIGNvbW1lIHBvdXIgdG91dCBsaWVuIGR1IHNpdGUuICovXG4uaWxvdFNjZW5lQ2FzZSAuY3RhVHVpbGVTdHVkaW8ge1xuICAgIHBhZGRpbmc6IHZhcigtLWdhcFJlZHVpdCkgMDtcbiAgICBmb250OiB2YXIoLS1mTWVudTE0KTtcbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICDDjkxPVCBERSBTQ8OJTkFSSU9TIOKAlCBMJ0VOVkVMT1BQRSBTRVVMRU1FTlRcbiAgIEluY2x1ZGUgOiB2aXRyaW5lL18vX2lsb3RTY2VuYXJpb3MudHdpZ1xuICAgTcOqbWUgcGF0cm9uIHF1ZSBpbG90U2NlbmVzLmNzcyBldCBpbG90UnVicmlxdWVzLmNzcyA6IHVuZSBzZWN0aW9uLCB1biBIMiwgc2EgbGlzdGUuXG4gICBMJ8OpY2FydCBhdmVjIGNlIHF1aSBwcsOpY8OoZGUgYXBwYXJ0aWVudCDDoCBsYSBzZWN0aW9uLCBwYXMgw6Agc29uIHRpdHJlLlxuXG4gICDimqDvuI8gTEEgQ0FSVEUgTidFU1QgUExVUyBJQ0kuIEVsbGUgdml0IGRhbnMgbGEgYnJpcXVlIG5veWF1LCBzdHVkaW8vNTVfc2NlbmFyaW9zQ29tcGF0aWJsZXMuY3NzXG4gICAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDcpLiBDZSBmaWNoaWVyIHBvcnRhaXQgc2EgcHJvcHJlIGNvcGllIGR1IHBhdHJvbiBzb3VzIGxlXG4gICBuYW1lc3BhY2UgYGNhcnRlU2NlbmFyaW8qYCDigJQgbcOqbWUgZmxleCwgbcOqbWUgY29ycHMsIG3Dqm1lcyBwb2xpY2VzLCBtw6ptZSBjb2xvbm5lIGQnYWN0aW9ucyxcbiAgIG3Dqm1lIGJhc2N1bGUgOiB1bmUgY29ycmVjdGlvbiBmYWl0ZSBkJ3VuIGPDtHTDqSBuZSBwYXJ0YWl0IHBhcyBkZSBsJ2F1dHJlLiBJbCBuZSByZXN0ZSBpY2lcbiAgIHF1ZSBjZSBxdWkgYXBwYXJ0aWVudCB2cmFpbWVudCDDoCBsJ8OubG90IDogbGEgc2VjdGlvbiwgc29uIHRpdHJlLCBzb24gaW50cm8gbWFya2Rvd24uXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4uaWxvdFNjZW5hcmlvcyB7XG4gICAgbWFyZ2luLXRvcDogOHJlbTtcbn1cblxuLmlsb3RTY2VuYXJpb3MgPiBoMiB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XG59XG5cbi8qIExlIG1hcmtkb3duIGRlIGBpbnRyb2AsIMOgIGxhIHBsYWNlIGR1IEgyLiBTb24gdGl0cmUgZXN0IERBTlMgbGUgYmxvYywgZG9uYyBsYSByw6hnbGVcbiAgIGAuaWxvdFNjZW5hcmlvcyA+IGgyYCBjaS1kZXNzdXMgbmUgbCdhdHRlaW50IHBhcyA6IGMnZXN0IGNlIGJsb2MgcXVpIHBvcnRlIGwnw6ljYXJ0LiAqL1xuLmlsb3RTY2VuYXJpb3NJbnRybyB7XG4gICAgbWFyZ2luLWJvdHRvbTogMS41cmVtO1xufVxuXG4vKiBMYSBNw4pNRSBsYXJnZXVyIGRlIGxlY3R1cmUgcXVlIHBhcnRvdXQgKC0tbGFyZ2V1clRleHRlLCB2aXRyaW5lLmNzcykgOiBjZXR0ZSBpbnRybyBuJ2F2YWl0XG4gICBhdWN1bmUgYm9ybmUsIGVsbGUgY291cmFpdCBkb25jIHN1ciBsZXMgMTIwMCBkZSBsYSBwYWdlIHBlbmRhbnQgcXVlIGwnYXJ0aWNsZSBhdS1kZXNzdXMgc2VcbiAgIGxpc2FpdCBzdXIgNzEwIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuICovXG4uaWxvdFNjZW5hcmlvc0ludHJvIHAsXG4uaWxvdFNjZW5hcmlvc0ludHJvIHVsLFxuLmlsb3RTY2VuYXJpb3NJbnRybyBvbCB7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS1sYXJnZXVyVGV4dGUpO1xufVxuXG4vKiBTYW5zIMOnYSwgbGEgbWFyZ2UgZHUgdGl0cmUgZHUgbWFya2Rvd24gcydham91dGUgw6AgY2VsbGUgZHUgYmxvYyBldCBjcmV1c2UgdW4gdHJvdS4gKi9cbi5pbG90U2NlbmFyaW9zSW50cm8gPiAqOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xufVxuXG4uaWxvdFNjZW5hcmlvc0ludHJvID4gKjpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIMOOTE9UIERFIFNDw4lOQVJJT1MgREFOUyBMRSBCQU5ERUFVIOKAlCB2aXRyaW5lL18vX2lsb3RTY2VuYXJpb3NCYW5kZWF1LnR3aWdcbiAgIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOClcblxuICAgUGFnZXMgcnVicmlxdWVzIFRpcmFnZSBhdSBzb3J0LCBUb21ib2xhLCBDb25zdGl0dXRpb24gZCfDqXF1aXBlcywgZXQgcGFnZSBkJ3VuZSBzY8OobmVcbiAgIChsZXMgc2PDqW5hcmlvcyBvw7kgbGEgam91ZXIpLiBMYSBzZWN0aW9uIGdhcmRlIGxhIGNsYXNzZVxuICAgYC5pbG90U2NlbmFyaW9zYCAoaWxvdFNjZW5hcmlvcy5jc3MpIDogc29uIMOpY2FydCwgc29uIHRpdHJlIGV0IHNvbiBpbnRybyB2aWVubmVudCBkZSBsw6AsXG4gICBldCBsZSBiYW5kZWF1IChwYWdlUnVicmlxdWUuY3NzKSBjZW50cmUgZMOpasOgIHNvbiBIMiDDoCBwYXJ0aXIgZGUgMTYwMHB4LlxuXG4gICBVTiBTQ8OJTkFSSU8gUEFSIExJR05FLCBTQU5TIENBRFJFIDogcG9zw6kgc3VyIGxlIGZvbmQgZHUgYmFuZGVhdSwgbGVzIHBpw6hjZXMgbGVzIHVuZXMgc291c1xuICAgbGVzIGF1dHJlcyDigJQgbm9tIGV0IGRlc2NyaXB0aW9uICh1biBzZXVsIGxpZW4gdmVycyBsYSBmaWNoZSksIGNvbW1hbmRlcywgZMOpcm91bMOpLlxuICAgRW50cmUgZGV1eCBzY8OpbmFyaW9zLCB1biBncmFuZCBibGFuYyBldCwgYXUgbWlsaWV1LCB1biBwZXRpdCB0cmFpdCA6IGlscyBzZSBsaXNlbnQgY29tbWVcbiAgIGRldXggY2hvc2VzIGRpc3RpbmN0ZXMgc2FucyBxdSdpbCBmYWlsbGUgbGVzIGVuZmVybWVyIGRhbnMgdW5lIGJvw650ZS5cblxuICAgQ0VOVFLDiSBEQU5TIExFIEJBTkRFQVUgU0VVTEVNRU5ULCBjb21tZSBsZXMgdGl0cmVzIGQnw65sb3RzIDogw6AgcGFydGlyIGRlIDE2MDBweCwgbMOgIG/DuSBsZVxuICAgYmFuZGVhdSBleGlzdGUuIEVuIGRlc3NvdXMsIHBhcyBkZSBmb25kLCB0b3V0IHJlc3RlIGFsaWduw6kgw6AgZ2F1Y2hlLCBjb21tZSBsZSByZXN0ZSBkZSBsYVxuICAgcGFnZS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIGBjb250YWluZXItdHlwZTogaW5saW5lLXNpemVgIDogTEEgTEFSR0VVUiBERSBMQSBMSVNURSBWSUVOVCBERSBMQSBQQUdFLCBKQU1BSVMgREUgU09OXG4gICBDT05URU5VLiBTYW5zIGx1aSwgbGEgbGlzdGUgYW5ub27Dp2FpdCBjb21tZSBsYXJnZXVyIG1pbmltYWxlIGNlbGxlIGRlIHNvbiBkw6lyb3Vsw6kgbGUgcGx1c1xuICAgbG9uZyAoY2lucSBicmlxdWVzIOKJiCA4NjBweCwgcXVpIG5lIHBhc3NlbnQgamFtYWlzIMOgIGxhIGxpZ25lKSBldCBjZWxsZSBkdSB0cmFpdCAoNzEwcHgpLlxuICAgTGEgcGFnZSBkZSBydWJyaXF1ZSBlc3QgdW5lIGdyaWxsZSAoYDFmcmAsIGFydGljbGVWaXRyaW5lLmNzcyksIGV0IHVuZSBjb2xvbm5lIGRlIGdyaWxsZSBuZVxuICAgZGVzY2VuZCBwYXMgc291cyBsYSBsYXJnZXVyIG1pbmltYWxlIGRlIGNlIHF1J2VsbGUgY29udGllbnQgOiB0b3V0ZSBsYSBwYWdlIHJlc3RhaXQgYmxvcXXDqWVcbiAgIMOgIGNldHRlIG1lc3VyZSwgc2FucyBwb3V2b2lyIGRlc2NlbmRyZSBqdXNxdSfDoCA0MDBweCAoY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOCkuXG4gICBDb250ZW51ZSwgbGEgbGlzdGUgcHJlbmQgbGEgbGFyZ2V1ciBxdSdvbiBsdWkgZG9ubmUgOyBsZSB0cmFpdCBzZSBib3JuZSDDoCAxMDAlLCBldCBsZVxuICAgZMOpcm91bMOpIHRyb3AgbG9uZyBnbGlzc2UgZGFucyBzYSBwcm9wcmUgbGFyZ2V1ciwgY29tbWUgcHLDqXZ1IHBhciBzYSBicmlxdWUuXG4gICBNw6ptZSBnZXN0ZSBxdWUgbGEgbGlzdGUgZGUgbCdhbmNpZW5uZSBjYXJ0ZSAoNTVfc2NlbmFyaW9zQ29tcGF0aWJsZXMuY3NzKS4gKi9cbi5zY2VuYXJpb3NCYW5kZWF1TGlzdGUge1xuICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi8qIFBMVVMgRCdBSVIgRU5UUkUgTCdJTlRSTyBFVCBMRSBQUkVNSUVSIFNDw4lOQVJJTyA6IGwnw6ljYXJ0IGRlIGwnw65sb3QgKDEuNXJlbSxcbiAgIGlsb3RTY2VuYXJpb3MuY3NzKSBjb2xsYWl0IGxlIHByZW1pZXIgc2PDqW5hcmlvIGF1IHRleHRlIGRlIGwnYXJ0aWNsZS4gSWNpIGxhIG1vaXRpw6kgZGVcbiAgIC0tZ2FwQmxvY3MsIGxlIG3Dqm1lIGJsYW5jIHF1ZSBkZSBwYXJ0IGV0IGQnYXV0cmUgZHUgdHJhaXQgZW50cmUgZGV1eCBzY8OpbmFyaW9zIDogbGVcbiAgIHByZW1pZXIgcmVzcGlyZSBjb21tZSBsZXMgc3VpdmFudHMgKGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTgpLiAqL1xuLmlsb3RTY2VuYXJpb3NCYW5kZWF1IC5pbG90U2NlbmFyaW9zSW50cm8sXG4uaWxvdFNjZW5hcmlvc0JhbmRlYXUgPiBoMiB7XG4gICAgbWFyZ2luLWJvdHRvbTogY2FsYyh2YXIoLS1nYXBCbG9jcykgLyAyKTtcbn1cblxuLnNjZW5hcmlvQmFuZGVhdSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGdhcDogdmFyKC0tZ2FwTW95ZW4pO1xufVxuXG4vKiBMRSBCTEFOQyBFVCBMRSBUUkFJVCBFTlRSRSBERVVYIFNDw4lOQVJJT1MuIExlIGJsYW5jIHRvdGFsIGVzdCAtLWdhcEJsb2NzIChsZSBibGFuYyBlbnRyZVxuICAgZGV1eCBibG9jcyBlbXBpbMOpcyksIGNvdXDDqSBlbiBkZXV4IHBhciBsZSB0cmFpdCA6IHVuZSBtb2l0acOpIGF1LWRlc3N1cywgdW5lIGVuIGRlc3NvdXMuXG4gICBMZSB0cmFpdCBlc3QgdW4gcHNldWRvLcOpbMOpbWVudCBkdSBzY8OpbmFyaW8gcXVpIHN1aXQsIHBhcyB1bmUgYmFsaXNlIDogaWwgbidleGlzdGVcbiAgIHF1J2VudHJlIGRldXggc2PDqW5hcmlvcywgamFtYWlzIGF2YW50IGxlIHByZW1pZXIgbmkgYXByw6hzIGxlIGRlcm5pZXIuIEMnZXN0IGxhIHByZW1pw6hyZVxuICAgcGnDqGNlIGRlIGxhIGNvbG9ubmUgZHUgc2PDqW5hcmlvIDogaWwgc3VpdCBkb25jIHNvbiBhbGlnbmVtZW50LCDDoCBnYXVjaGUgb3UgYXUgY2VudHJlLlxuICAgTGUgdHJhaXQgZGUgLS1ib3JkZXIsIGxlIGZpbGV0IGNsYWlyIGRlcyBjYXJ0ZXMsIMOgIGxhIGxhcmdldXIgZHUgdGV4dGUgKC0tbGFyZ2V1clRleHRlKSA6XG4gICBlc3NhecOpIMOgIDEyMHB4IGV0IGF1IGdyaXMgZGVzIGJvcmRzIGR1IGJhbmRlYXUgKC0tY05vaXI0KSwgaWwgZmFpc2FpdCB1biBwZXRpdCB0aXJldFxuICAgbm9pciwgdHJvcCBmb25jw6kgZXQgdHJvcCBjb3VydCBwb3VyIHPDqXBhcmVyIHF1b2kgcXVlIGNlIHNvaXQgKGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTgpLlxuICAgTGUgZm9uZCBkdSBiYW5kZWF1IGVzdCBibGFuYyBlbiBzb24gbWlsaWV1IDogbGUgZmlsZXQgY2xhaXIgcyd5IHZvaXQuICovXG4uc2NlbmFyaW9CYW5kZWF1ICsgLnNjZW5hcmlvQmFuZGVhdSB7XG4gICAgbWFyZ2luLXRvcDogY2FsYyh2YXIoLS1nYXBCbG9jcykgLyAyKTtcbn1cblxuLnNjZW5hcmlvQmFuZGVhdSArIC5zY2VuYXJpb0JhbmRlYXU6OmJlZm9yZSB7XG4gICAgY29udGVudDogJyc7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IHZhcigtLWxhcmdldXJUZXh0ZSk7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tZ2FwQmxvY3MpIC8gMik7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyKTtcbn1cblxuLyogTEUgTk9NIEVUIExFIFRFWFRFLCBVTiBTRVVMIExJRU4gVkVSUyBMQSBGSUNIRSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMTAtMTgpLiBBdVxuICAgc3Vydm9sLCBsZSBoYWxvIGQndW5lIHZpZ25ldHRlIGRlIHNjw6huZSAoaWxvdFNjZW5lcy5jc3MsIMKrIExFIFNVUlZPTCDCuykgOiB1biBgb3V0bGluZWAgZXQgdW5cbiAgIGZvbmQgZGUgbGEgbcOqbWUgY291bGV1ciwgcXVpIG1vbnRlbnQgZW4gLjVzIDsgbCdvdXRsaW5lIHNlIGRlc3NpbmUgaG9ycyBkZSBsYSBib8OudGUsIGlsIG5lXG4gICBwb3Vzc2Ugcmllbi4gTGEgY291bGV1ciBlc3QgY2VsbGUgZHUgaGFsbyBkJ3VuZSB2aWduZXR0ZSBzYW5zIGZvbmQgcHJvcHJlICgtLWNBY2NlbnQyXG4gICDDqWNsYWlyY2kpLiBQYXMgZGUgc291bGlnbmVtZW50IDogYydlc3QgbGUgaGFsbyBxdWkgZGl0IMKrIGNlY2kgZXN0IHVuIGxpZW4gwrsuXG4gICBMZSBub20gZXQgbGUgdGV4dGUgZ2FyZGVudCBsZXVyIMOpY2FydCBkJ2F2YW50LCBjZWx1aSBkZSBsJ2FydGljbGUgKC0tZ2FwTW95ZW4pLiAqL1xuLnNjZW5hcmlvQmFuZGVhdUZpY2hlIHtcbiAgICAtLWNvdWxldXJIYWxvOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY0FjY2VudDIpIDQwJSwgdmFyKC0tY0JsYW5jKSk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogdmFyKC0tZ2FwTW95ZW4pO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1heC13aWR0aDogdmFyKC0tbGFyZ2V1clRleHRlKTtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIG91dGxpbmU6IDAgc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgdHJhbnNpdGlvbjogb3V0bGluZS13aWR0aCAuNXMgZWFzZS1vdXQsIG91dGxpbmUtY29sb3IgLjVzIGVhc2Utb3V0LCBiYWNrZ3JvdW5kLWNvbG9yIC41cyBlYXNlLW91dDtcbn1cblxuLnNjZW5hcmlvQmFuZGVhdUZpY2hlOmhvdmVyLFxuLnNjZW5hcmlvQmFuZGVhdUZpY2hlOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IDE1cHggc29saWQgdmFyKC0tY291bGV1ckhhbG8pO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNvdWxldXJIYWxvKTtcbn1cblxuLyogVW4gSDMgZGFucyBsZSBIVE1MLCBtYWlzIGxhIGZvbnRlIGR1IEgyICgyNHB4IGdyYXMpIDogYXUgY29ycHMgZCd1biBIMywgbGUgbm9tIGQndW5cbiAgIHNjw6luYXJpbyBuZSBzZSB2b3lhaXQgcGFzIGFzc2V6IChjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE4KS4gQXZlYyBsZSBibGFuYyBldCBsZSB0cmFpdCxcbiAgIGMnZXN0IGx1aSBxdWkgbWFycXVlIGxlIGTDqWJ1dCBkJ3VuIG5vdXZlYXUgc2PDqW5hcmlvLiAqL1xuLnNjZW5hcmlvQmFuZGVhdU5vbSB7XG4gICAgZm9udDogdmFyKC0tZkgyKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICBtYXJnaW46IDA7XG59XG5cbi8qIExhIG3Dqm1lIGxhcmdldXIgZGUgbGVjdHVyZSBxdWUgcGFydG91dCAoLS1sYXJnZXVyVGV4dGUsIHZpdHJpbmUuY3NzKS4gKi9cbi5zY2VuYXJpb0JhbmRlYXVUZXh0ZSB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS1sYXJnZXVyVGV4dGUpO1xuICAgIG1hcmdpbjogMDtcbn1cblxuLyogTEEgTElHTkUgREUgQ09NTUFOREVTIOKAlCBsZSBtb2TDqGxlIGRlIGNlbGxlIGQndW5lIHBhZ2UgZGUgc2PDqG5lICgucGFnZVNjZW5lQ29tbWFuZGVzLFxuICAgcGFnZVNjZW5lLmNzcykgOiBsZXMgYm91dG9ucyDDoCBnYXVjaGUsIGwnw6l0aXF1ZXR0ZSBldCBzb24gY8WTdXIgw6AgZHJvaXRlLCAtLWdhcExhcmdlXG4gICBlbnRyZSBsZXMgZGV1eCBncm91cGVzLiBFbGxlIHByZW5kIGxhIGxhcmdldXIgZHUgdGV4dGUsIHBhcyBjZWxsZSBkdSBiYW5kZWF1IDogbGVzIGRldXhcbiAgIGJvdXRzIHJlc3RlbnQgw6AgcG9ydMOpZSBkZSBsJ8WTaWwuICovXG4uc2NlbmFyaW9CYW5kZWF1Q29tbWFuZGVzIHtcbiAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICAgIG1heC13aWR0aDogdmFyKC0tbGFyZ2V1clRleHRlKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IHZhcigtLWdhcExhcmdlKTtcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1nYXBEZWZhdXQpO1xufVxuXG4uc2NlbmFyaW9CYW5kZWF1Qm91dG9ucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiB2YXIoLS1nYXBEZWZhdXQpO1xufVxuXG4vKiBMZSBkw6lyb3Vsw6ksIHRlbCBxdWVsIDogb24gbmUgcsOoZ2xlIHF1ZSBzYSBwbGFjZS4gU2EgbGFyZ2V1ciBlc3QgY2VsbGUgZGUgc2VzIGJyaXF1ZXMsIGJvcm7DqWVcbiAgIMOgIGNlbGxlIGRlIGxhIGxpZ25lIOKAlCBhdS1kZWzDoCwgaWwgZ2xpc3NlLCBjb21tZSBwYXJ0b3V0LiAqL1xuLnNjZW5hcmlvQmFuZGVhdSA+IC5kZXJvdWxlU2NlbmFyaW8ge1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1nYXBMYXJnZSk7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxNjAwcHgpIHtcbiAgICAvKiBDRU5UUsOJLCBNQUlTIEFMSUdOw4kgw4AgR0FVQ0hFIDogbGVzIHBpw6hjZXMgc2UgcG9zZW50IGF1IGNlbnRyZSBkZSBsYSBjb2xvbm5lLCBsZSBub20gZXN0XG4gICAgICAgY2VudHLDqSwgbGUgdGV4dGUgbm9uIOKAlCBpbCB0aWVudCBzb3V2ZW50IHN1ciBkZXV4IGxpZ25lcywgaWwgc2UgbGl0IG1pZXV4IGZlciDDoCBnYXVjaGVcbiAgICAgICAoY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOCkuIExlIHBhcmFncmFwaGUgZXN0IGRvbmMgdW4gYmxvYyBkZSBsYSBsYXJnZXVyIGRlIGxlY3R1cmUsXG4gICAgICAgY2VudHLDqSBkYW5zIGxlIGJhbmRlYXUsIGRvbnQgbGUgdGV4dGUgcGFydCBkZSBsYSBnYXVjaGUgZHUgYmxvYy4gKi9cbiAgICAucGFnZVJ1YnJpcXVlUHJldmlldyAuc2NlbmFyaW9CYW5kZWF1IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAucGFnZVJ1YnJpcXVlUHJldmlldyAuc2NlbmFyaW9CYW5kZWF1Tm9tIHtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIH1cblxuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IC5zY2VuYXJpb0JhbmRlYXVUZXh0ZSB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIH1cblxuICAgIC8qIExlIGTDqXJvdWzDqSBjZW50csOpIDogbGEgYnJpcXVlIGEgMzJweCDDoCBkcm9pdGUgcG91ciBzb24gxZNpbCAoX2Rlcm91bGUuY3NzKSA7IGxhIG3Dqm1lXG4gICAgICAgbWFyZ2Ugw6AgZ2F1Y2hlLCBpY2kgc2V1bGVtZW50LCBwb3VyIHF1ZSBsYSBsaWduZSBkZXMgdHVpbGVzIHNvaXQgYXUgY2VudHJlLiBIb3JzXG4gICAgICAgYmFuZGVhdSwgcGFzIGRlIG1hcmdlIGdhdWNoZSA6IGxlIGTDqXJvdWzDqSBzZSBjYWxlIGF1IGJvcmQgY29tbWUgbGUgcmVzdGUuICovXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgLnNjZW5hcmlvQmFuZGVhdSA+IC5kZXJvdWxlU2NlbmFyaW8ge1xuICAgICAgICBwYWRkaW5nLWxlZnQ6IDMycHg7XG4gICAgfVxuXG4gICAgLyogQXUgY2VudHJlLCBgc3RyZXRjaGAgY29sbGVyYWl0IGxhIGxpZ25lIMOgIGdhdWNoZSAoc2EgbGFyZ2V1ciBlc3QgYm9ybsOpZSkgOiBlbGxlIHByZW5kXG4gICAgICAgdG91dGUgbGEgbGFyZ2V1ciBwZXJtaXNlLCBldCBjJ2VzdCBgYWxpZ24tc2VsZjogY2VudGVyYCBxdWkgbGEgcG9zZSBhdSBtaWxpZXUuICovXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgLnNjZW5hcmlvQmFuZGVhdUNvbW1hbmRlcyB7XG4gICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLyogTCdpbnRybywgcydpbCB5IGVuIGEgdW5lIDogc2VzIGJsb2NzIGNlbnRyw6lzIMOgIGxhIGxhcmdldXIgZGUgbGVjdHVyZSwgc29uIHRpdHJlIGNlbnRyw6lcbiAgICAgICAocGFnZVJ1YnJpcXVlLmNzcyksIHNlcyBwYXJhZ3JhcGhlcyBmZXIgw6AgZ2F1Y2hlIOKAlCBtw6ptZSByw6hnbGUgcXVlIGxhIGRlc2NyaXB0aW9uIGQndW5cbiAgICAgICBzY8OpbmFyaW8uICovXG4gICAgLnBhZ2VSdWJyaXF1ZVByZXZpZXcgLmlsb3RTY2VuYXJpb3NCYW5kZWF1IC5pbG90U2NlbmFyaW9zSW50cm8gPiAqIHtcbiAgICAgICAgbWFyZ2luLWlubGluZTogYXV0bztcbiAgICB9XG5cbiAgICAucGFnZVJ1YnJpcXVlUHJldmlldyAuaWxvdFNjZW5hcmlvc0JhbmRlYXUgLmlsb3RTY2VuYXJpb3NJbnRybyBwLFxuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90U2NlbmFyaW9zQmFuZGVhdSAuaWxvdFNjZW5hcmlvc0ludHJvIHVsLFxuICAgIC5wYWdlUnVicmlxdWVQcmV2aWV3IC5pbG90U2NlbmFyaW9zQmFuZGVhdSAuaWxvdFNjZW5hcmlvc0ludHJvIG9sIHtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB9XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgRk9JUkUgQVVYIFFVRVNUSU9OU1xuICAgSW5jbHVkZSA6IG5veWF1L18vX2ZhcS50d2lnIChwYXJ0YWfDqSA6IGxhIFZpdHJpbmUgZXQgwqsgTW9uIGFib25uZW1lbnQgwrsgZHUgc3R1ZGlvKVxuICAgTcOqbWUgcGF0cm9uIHF1ZSBpbG90U2NlbmVzLmNzcyAvIGlsb3RTY2VuYXJpb3MuY3NzIDogdW5lIHNlY3Rpb24sIHVuIEgyLCBzYSBsaXN0ZS5cblxuICAgUGFzIGRlIGNhcnRlLCBwYXMgZGUgY2FkcmUgYXV0b3VyIGR1IGJsb2MuIFVuZSBxdWVzdGlvbiBGRVJNw4lFIHBvcnRlIGxlIGzDqWdlciBncmlzIGRlc1xuICAgYm91dG9ucyBkaXNjcmV0cyAoLS1jQmxhbmMwMiwgY3RhRGlzY3JldC5jc3MpIDsgdW5lIHF1ZXN0aW9uIE9VVkVSVEUgcmV2aWVudCBhdSBmb25kIGRlIGxhXG4gICBwYWdlIDogb24gdm9pdCB0b3V0IGRlIHN1aXRlIGNlIHF1J29uIHZpZW50IGQnb3V2cmlyLCBzYW5zIGxlIGNvbmZvbmRyZSBhdmVjIGxlcyBhdXRyZXNcbiAgIHF1ZXN0aW9ucyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMjIg4oCUIGxlcyBmaWxldHMgcXVpIHPDqXBhcmFpZW50IGxlcyBxdWVzdGlvbnNcbiAgIHNvbnQgcGFydGlzIGF2ZWMpLiBQYXMgbGUgZm9uZCBwbGVpbiBkJ3VuIC5idG4gOiBlc3NhecOpLCBiZWF1Y291cCB0cm9wIGxvdXJkLlxuXG4gICDimqDvuI8gQXVjdW4gSmF2YVNjcmlwdCBpY2kgOiA8ZGV0YWlscz4vPHN1bW1hcnk+IG91dnJlbnQgZXQgZmVybWVudCBuYXRpdmVtZW50LCBsJ2F0dHJpYnV0XG4gICBgbmFtZWAgcmVmZXJtZSBsYSBxdWVzdGlvbiBwcsOpY8OpZGVudGUuIExlIENTUyBuZSBmYWl0IHF1ZSBsJ2hhYmlsbGFnZS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi5mYXEge1xuICAgIG1hcmdpbi10b3A6IDhyZW07XG4gICAgLyogTGEgbGFyZ2V1ciBkdSBibG9jIGTDqWNpZGUgc2kgbCdpbWFnZSBhIHNhIHBsYWNlICh2b2lyIC5mYXFDb3JwcykgOiBsYSBtw6ptZSBGQVEgdml0XG4gICAgICAgcGxlaW5lIHBhZ2Ugc3VyIHVuZSBydWJyaXF1ZSBldCBkYW5zIHVuZSBjb2xvbm5lIMOpdHJvaXRlIHN1ciBsYSBwYWdlIGQndW5lIHNjw6huZS4gKi9cbiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7XG59XG5cbi8qIExFUyBRVUVTVElPTlMgRVQgTCdJTUFHRSDigJQgbGUgbcOqbWUgc3lzdMOobWUgcXVlIGwnaW1hZ2UgZCd1biBhcnRpY2xlIChhcnRpY2xlVml0cmluZS5jc3MpIDpcbiAgIGRldXggY29sb25uZXMgZnJhbmNoZXMsIGwnaW1hZ2UgY29sbMOpZSDDoCBkcm9pdGUgZGFucyB1bmUgY29sb25uZSBxdWkgc2UgcsOpZHVpdCBhdmVjIGxhXG4gICBmZW7DqnRyZSwgbGUgbcOqbWUgw6ljYXJ0IC0tZ2FwQ29sb25uZXMuIENvbG9ubmUgREVVWCBGT0lTIHBsdXMgw6l0cm9pdGUgcXVlIGNlbGxlIGQndW5cbiAgIGFydGljbGUgKDIyNXB4IGF1IGxpZXUgZGUgNDUwLCAxOC43NSUgYXUgbGlldSBkZSAzNy41JSkgOiDDoCA0NTAsIGxlIHBlcnNvbm5hZ2UgcHJlbmFpdFxuICAgdHJvcCBkZSBwbGFjZSDDoCBjw7R0w6kgZGVzIHF1ZXN0aW9ucyAoY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0yMikuICovXG4uZmFxQ29ycHMge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgbWluKDIyNXB4LCAxOC43NSUpO1xuICAgIGdhcDogMCB2YXIoLS1nYXBDb2xvbm5lcyk7XG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xufVxuXG4uZmFxQ29ycHMgPiAqIHtcbiAgICBncmlkLWNvbHVtbjogMTtcbn1cblxuLyogTCdpbWFnZSBkw6ltYXJyZSDDoCBsYSBoYXV0ZXVyIGR1IFRJVFJFLCBwYXMgZGVzIHF1ZXN0aW9ucyA6IGVsbGUgb2NjdXBlIGxhIGNvbG9ubmUgZGVcbiAgIGRyb2l0ZSBzdXIgdG91dGUgbGEgaGF1dGV1ciwgdGl0cmUgY29tcHJpcyAoY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0yMikuIFNhbnMgdGl0cmUsIGVsbGVcbiAgIGTDqW1hcnJlIGF2ZWMgbGEgcHJlbWnDqHJlIHF1ZXN0aW9uLiAqL1xuLmZhcUNvcnBzID4gLmZhcUltYWdlIHtcbiAgICBncmlkLWNvbHVtbjogMjtcbiAgICBncmlkLXJvdzogMSAvIHNwYW4gMjtcbn1cblxuLmZhcUltYWdlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xufVxuXG4vKiBGQVVURSBERSBQTEFDRSwgTCdJTUFHRSBQQVJUIOKAlCBjJ2VzdCBsYSBkaWZmw6lyZW5jZSBhdmVjIHVuIGFydGljbGUsIG/DuSBlbGxlIHJlc3RlXG4gICAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMjIpLiBTb3VzIDkwMHB4IGRlIGJsb2MsIGxhIGNvbG9ubmUgZGVzIHF1ZXN0aW9uc1xuICAgdG9tYmVyYWl0IHNvdXMgbGVzIDUwMHB4IDogbGVzIHF1ZXN0aW9ucyByZXByZW5uZW50IHRvdXRlIGxhIGxhcmdldXIuICovXG5AY29udGFpbmVyIChtYXgtd2lkdGg6IDg5OXB4KSB7XG4gICAgLmZhcUNvcnBzIHtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XG4gICAgfVxuXG4gICAgLmZhcUNvcnBzID4gLmZhcUltYWdlIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG5cbi5mYXFDb3JwcyA+IGgyIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcbn1cblxuLyogQ0hBUMOUIE1BUktET1dOIOKAlCBpbCBwcmVuZCBsYSBwbGFjZSBkdSBIMiBxdWFuZCBgaW50cm9gIGVzdCBkb25uw6kuIExlIHRpdHJlIHZpZW50IGFsb3JzIGR1XG4gICBtYXJrZG93biBsdWktbcOqbWUgOiBpbCBlc3QgREFOUyBjZSBibG9jLCBsYSByw6hnbGUgY2ktZGVzc3VzIG5lIGwnYXR0ZWludCBwYXMuICovXG4uZmFxSW50cm8ge1xuICAgIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcbn1cblxuLyogTGEgTcOKTUUgbGFyZ2V1ciBkZSBsZWN0dXJlIHF1ZSBwYXJ0b3V0ICgtLWxhcmdldXJUZXh0ZSwgdml0cmluZS5jc3MpIDogbGUgY2hhcMO0IG4nYXZhaXRcbiAgIGF1Y3VuZSBib3JuZSwgaWwgY291cmFpdCBkb25jIHN1ciB0b3V0ZSBsYSBwYWdlIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuICovXG4uZmFxSW50cm8gcCxcbi5mYXFJbnRybyB1bCxcbi5mYXFJbnRybyBvbCB7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS1sYXJnZXVyVGV4dGUpO1xufVxuXG4uZmFxSW50cm8gPiAqOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xufVxuXG4uZmFxSW50cm8gPiAqOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi8qIExlcyBxdWVzdGlvbnMgZmVybcOpZXMgc29udCBkZXMgcGF2w6lzIGRlIGNvdWxldXIgOiB1biBwZXUgZCdhaXIgZW50cmUgZWxsZXMgc3VmZml0IMOgIGxlc1xuICAgc8OpcGFyZXIsIHNhbnMgZmlsZXQuICovXG4uZmFxTGlzdGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcE1veWVuKTtcbn1cblxuLmZhcUVudHJlZSB7XG4gICAgLyogQXV0b3Jpc2UgbCdhbmltYXRpb24gZGUgaGF1dGV1ciB2ZXJzIGBhdXRvYCDigJQgdm9pciDCqyBMRSBEw4lQTElBR0UgwrsgcGx1cyBiYXMuICovXG4gICAgaW50ZXJwb2xhdGUtc2l6ZTogYWxsb3cta2V5d29yZHM7XG59XG5cbi8qIExBIFFVRVNUSU9OLiBGZXJtw6llLCBlbGxlIGEgbGUgZm9uZCBncmlzIGV0IGxlIGNvaW4gYXJyb25kaSBkJ3VuIGJvdXRvbiBkaXNjcmV0LCBldCBsZVxuICAgcGFkZGluZyBkZXMgYm91dG9ucyBjb21wYWN0cyAoLS1wYWRkaW5nQ3RhMTQpIOKAlCBsZSBtw6ptZSBxdWFuZCBlbGxlIGVzdCBvdXZlcnRlLCBwb3VyIHF1ZVxuICAgbGUgdGV4dGUgbmUgYm91Z2UgcGFzIGQndW4gcGl4ZWwgZW4gY2hhbmdlYW50IGRlIGZvbmQuIExlIG1hcnF1ZXVyIHBhciBkw6lmYXV0IGR1IG5hdmlnYXRldXIgZXN0IHJldGlyw6kgKGxlcyBkZXV4IHN5bnRheGVzIHNvbnRcbiAgIG7DqWNlc3NhaXJlcyA6IDo6bWFya2VyIHBvdXIgbGVzIG1vdGV1cnMgcsOpY2VudHMsIDo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciBwb3VyIFNhZmFyaSkgZXRcbiAgIHJlbXBsYWPDqSBwYXIgdW4gY2hldnJvbiBkZXNzaW7DqSBlbiBDU1MsIMOgIGRyb2l0ZS4gKi9cbi5mYXFRdWVzdGlvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBnYXA6IHZhcigtLWdhcE1veWVuKTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ3RhMTQpO1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTZTdHJvbmcpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNCbGFuYzAyKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjI1cyBlYXNlLCBjb2xvciAwLjI1cyBlYXNlO1xufVxuXG4uZmFxUXVlc3Rpb246Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIExlIEgzIGRlIGxhIHF1ZXN0aW9uIG5lIHNlIHZvaXQgcGFzIDogaWwgZXN0IGzDoCBwb3VyIGxlIHBsYW4gZHUgZG9jdW1lbnQgZXQgbGEgbmF2aWdhdGlvblxuICAgcGFyIHRpdHJlcywgcGFzIHBvdXIgcGVzZXIuIEMnZXN0IGxlIDxzdW1tYXJ5PiBxdWkgcG9ydGUgbGEgZm9udGUgZXQgbGEgY291bGV1ciDigJQgbGUgdGl0cmVcbiAgIG5lIGZhaXQgcXVlIGxlcyBow6lyaXRlciwgc2FucyBzZXMgbWFyZ2VzIG5pIHNhIHRhaWxsZSBwYXIgZMOpZmF1dC4gKi9cbi5mYXFRdWVzdGlvbiBoMyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5mYXFRdWVzdGlvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY0JsYW5jMDMpO1xufVxuXG4vKiBPdXZlcnRlIDogbGUgZm9uZCBkZSBsYSBwYWdlIOKAlCBsYSBxdWVzdGlvbiBzZSBsaXQgY29tbWUgbGUgdGl0cmUgZGUgc2EgcsOpcG9uc2UsIGV0IG5vblxuICAgcGx1cyBjb21tZSB1biBib3V0b24uICovXG4uZmFxRW50cmVlW29wZW5dIC5mYXFRdWVzdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5mYXFFbnRyZWVbb3Blbl0gLmZhcVF1ZXN0aW9uOmhvdmVyIHtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudDMpO1xufVxuXG4vKiBMZSBjaGV2cm9uIDogdW4gY2FycsOpIGRvbnQgZGV1eCBjw7R0w6lzIHNldWxlbWVudCBwb3J0ZW50IHVuIGZpbGV0LCB0b3VybsOpIGRlIDQ1wrAuIElsIHBvaW50ZVxuICAgdmVycyBsZSBiYXMgcXVhbmQgbGEgcXVlc3Rpb24gZXN0IGZlcm3DqWUsIHZlcnMgbGUgaGF1dCBxdWFuZCBlbGxlIGVzdCBvdXZlcnRlLiAqL1xuLmZhcVF1ZXN0aW9uOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDhweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAvKiBMYSBjb3VsZXVyIGR1IHRleHRlLCBxdWkgc3VpdCBsZSBzdXJ2b2wgZGUgbGEgcXVlc3Rpb24gb3V2ZXJ0ZS4gKi9cbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCkgcm90YXRlKDQ1ZGVnKTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMgZWFzZTtcbn1cblxuLmZhcUVudHJlZVtvcGVuXSAuZmFxUXVlc3Rpb246OmFmdGVyIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KSByb3RhdGUoLTEzNWRlZyk7XG59XG5cbi8qIExFIETDiVBMSUFHRSDigJQgMCwyNSBzIMOgIGwnb3V2ZXJ0dXJlIGNvbW1lIMOgIGxhIGZlcm1ldHVyZSwgbGEgbcOqbWUgZHVyw6llIHF1ZSBsZSBjaGV2cm9uIDpcbiAgIGxhIHF1ZXN0aW9uIGRlc2NlbmQsIHByZW5kIHNhIHBsYWNlLCBldCBsYSByZXByZW5kIMOgIGwnaWRlbnRpcXVlIGVuIHJlbW9udGFudC5cblxuICAg4pqg77iPIFRvdWpvdXJzIGF1Y3VuIEphdmFTY3JpcHQuIEMnZXN0IGxlIG5hdmlnYXRldXIgcXVpIGFuaW1lLCBwYXIgdHJvaXMgbcOpY2FuaXNtZXMgcsOpY2VudHMgOlxuICAgICAtIGA6OmRldGFpbHMtY29udGVudGAgZMOpc2lnbmUgbGUgY29udGVudSBkJ3VuIDxkZXRhaWxzPiwgcXVpIG4nYXZhaXQgcGFzIGRlIHPDqWxlY3RldXIgO1xuICAgICAtIGBpbnRlcnBvbGF0ZS1zaXplOiBhbGxvdy1rZXl3b3Jkc2AgYXV0b3Jpc2UgbCdhbmltYXRpb24gdmVycyBgYXV0b2AsIGMnZXN0LcOgLWRpcmUgdmVyc1xuICAgICAgIGxhIGhhdXRldXIgcsOpZWxsZSBkZSBsYSByw6lwb25zZSDigJQgc2FucyBsdWksIGlsIG4neSBhIHJpZW4gw6AgYW5pbWVyIGVudHJlIDAgZXQgYGF1dG9gIDtcbiAgICAgLSBgdHJhbnNpdGlvbi1iZWhhdmlvcjogYWxsb3ctZGlzY3JldGVgIHJldGFyZGUgbGUgcGFzc2FnZSBjYWNow6kg4oaSIHZpc2libGUsIHNpbm9uIGxlXG4gICAgICAgY29udGVudSBkaXNwYXJhw650cmFpdCBkJ3VuIGNvdXAgw6AgbGEgZmVybWV0dXJlLCBhdmFudCBxdWUgbGEgaGF1dGV1ciBhaXQgZmluaSBkZSBjb3VyaXIuXG4gICBVbiBuYXZpZ2F0ZXVyIHF1aSBpZ25vcmUgbCd1biBkZXMgdHJvaXMgb3V2cmUgZXQgZmVybWUgZCd1biBjb3VwLCBjb21tZSBhdmFudCA6IGxhIHF1ZXN0aW9uXG4gICByZXN0ZSBsaXNpYmxlIGV0IHJlcGxpYWJsZSwgc2V1bGUgbCdhbmltYXRpb24gbWFucXVlLiAqL1xuLmZhcUVudHJlZTo6ZGV0YWlscy1jb250ZW50IHtcbiAgICBibG9jay1zaXplOiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogYmxvY2stc2l6ZSAwLjI1cyBlYXNlLCBjb250ZW50LXZpc2liaWxpdHkgMC4yNXMgZWFzZTtcbiAgICB0cmFuc2l0aW9uLWJlaGF2aW9yOiBhbGxvdy1kaXNjcmV0ZTtcbn1cblxuLmZhcUVudHJlZVtvcGVuXTo6ZGV0YWlscy1jb250ZW50IHtcbiAgICBibG9jay1zaXplOiBhdXRvO1xufVxuXG4vKiBMQSBSw4lQT05TRS4gRWxsZSBlc3Qgw6ljcml0ZSBlbiBNYXJrZG93biA6IGVsbGUgcGV1dCBwb3J0ZXIgZGVzIHBhcmFncmFwaGVzLCBkZXMgbGlzdGVzLFxuICAgZGVzIHNvdXMtdGl0cmVzIMOgIHBhcnRpciBkZSAjIyMsIGV0IHVuIHRhYmxlYXUuXG4gICBSRVRSQUlUIMOAIEdBVUNIRSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDcpIDogbGEgcsOpcG9uc2UgZXN0IGTDqWNhbMOpZSBzb3VzIHNhXG4gICBxdWVzdGlvbiwgZWxsZSBuZSByZXBhcnQgcGFzIGR1IG3Dqm1lIGJvcmQuIEMnZXN0IGxlIHJldHJhaXQgcXVpIGRpdCBxdSdlbGxlIGTDqXBlbmQgZGUgbGFcbiAgIHF1ZXN0aW9uIGF1LWRlc3N1cywgZXQgbm9uIHF1J2VsbGUgZXN0IHVuIGJsb2MgZGUgcGx1cyBkYW5zIGxhIHBhZ2UuIDQwcHgsIGxlIG3Dqm1lIHJldHJhaXRcbiAgIGZyYW5jIHF1ZSBsZXMgbGlzdGVzIGQndW4gYXJ0aWNsZSAoYXJ0aWNsZVZpdHJpbmUuY3NzKSA6IGRldXggZW5kcm9pdHMsIHVuIHNldWwgY2hpZmZyZSDDoFxuICAgbCfFk2lsLlxuICAgTcOKTUUgQ0hJRkZSRSBFTiBCQVMsIDQwcHggZXQgbm9uIHBsdXMgMjAgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KSA6IGxhIHLDqXBvbnNlXG4gICBvdXZlcnRlIGZpbmlzc2FpdCB0cm9wIHByw6hzIGRlIGxhIHF1ZXN0aW9uIHN1aXZhbnRlLCBldCBsZXMgZGV1eCBzZSBsaXNhaWVudCBjb21tZSB1biBzZXVsXG4gICBibG9jLiBMJ8OpY2FydCBlbnRyZSBsZXMgcXVlc3Rpb25zICguZmFxTGlzdGUpIHMnYWpvdXRlIGVuY29yZSBwYXItZGVzc3VzLiAqL1xuLmZhcVJlcG9uc2Uge1xuICAgIHBhZGRpbmc6IDAgMCA0MHB4IHZhcigtLXJldHJhaXRMaXN0ZSk7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG5cbi8qIExhIE3Dik1FIGxhcmdldXIgZGUgbGVjdHVyZSBxdWUgbGUgdGV4dGUgZCd1biBhcnRpY2xlIGV0IGwnaW50cm8gZCd1biDDrmxvdFxuICAgKC0tbGFyZ2V1clRleHRlLCB2aXRyaW5lLmNzcykuIEMnZXN0IGxlIFRFWFRFIHF1aSBlc3QgYm9ybsOpLCBwYXMgbGEgbGlzdGUgOiBsZXMgZmlsZXRzXG4gICBxdWkgc8OpcGFyZW50IGxlcyBxdWVzdGlvbnMgZ2FyZGVudCBsYSBsYXJnZXVyIGRlIGxhIGNvbG9ubmUsIGlscyBmZXJtZW50IGxlIGJsb2MuXG4gICBMZSB0YWJsZWF1IGV0IGxlIGJsb2MgZGUgY29kZSBwbHVzIGJhcyBuZSBzb250IHBhcyB2aXPDqXMgOiBpbHMgZMOpZmlsZW50IHRvdXQgc2V1bHMgZXRcbiAgIG4nb250IHBhcyDDoCBzZSBwbGllciDDoCB1bmUgbGFyZ2V1ciBkZSBsZWN0dXJlIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuICovXG4uZmFxUmVwb25zZSBwLFxuLmZhcVJlcG9uc2UgdWwsXG4uZmFxUmVwb25zZSBvbCB7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS1sYXJnZXVyVGV4dGUpO1xufVxuXG4vKiBMZXMgcHVjZXMgc29udCBSRU5EVUVTIDogbGUgcmVzZXQgZHUgbm95YXUgKDAwX3Jlc2V0LmNzcykgbGVzIGVmZmFjZSBwb3VyIHRvdXQgbGUgc2l0ZS5cbiAgIE3Dqm1lIHLDqGdsZSBldCBtw6ptZSByZXRyYWl0IHF1ZSBsZXMgbGlzdGVzIGQndW4gYXJ0aWNsZSAoYXJ0aWNsZVZpdHJpbmUuY3NzKS4gKi9cbi5mYXFSZXBvbnNlIHVsLFxuLmZhcUVuY2FkcmVSZXBvbnNlIHVsIHtcbiAgICBtYXJnaW4tYmxvY2s6IDAgMWVtO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcmV0cmFpdExpc3RlKTtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IGRpc2M7XG59XG5cbi5mYXFSZXBvbnNlIGxpLFxuLmZhcUVuY2FkcmVSZXBvbnNlIGxpIHtcbiAgICBtYXJnaW4tYmxvY2s6IHZhcigtLWdhcFJlZHVpdCk7XG59XG5cbi5mYXFSZXBvbnNlID4gKjpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMDtcbn1cblxuLmZhcVJlcG9uc2UgPiAqOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi8qIEg0IGV0IG5vbiBIMyA6IGxhIHF1ZXN0aW9uIHF1aSBjb2lmZmUgY2V0dGUgcsOpcG9uc2UgZXN0IGTDqWrDoCB1biBIMyAoX2ZhcS50d2lnKS4gTGUgZmljaGllclxuICAgZGUgcsOpcG9uc2UsIGx1aSwgw6ljcml0IGAjIyNgIOKAlCBjJ2VzdCBsZSBjb252ZXJ0aXNzZXVyIHF1aSByZWNhbGUsIGxhIHLDqXBvbnNlIG5lIHNhaXQgcGFzIG/DuVxuICAgZWxsZSBlc3QgYWZmaWNow6llIChGYXFSdW50aW1lOjpOSVZFQVVfVElUUkVfUkVQT05TRSkuICovXG4uZmFxUmVwb25zZSBoNCB7XG4gICAgbWFyZ2luOiAyMHB4IDAgOHB4O1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTZTdHJvbmcpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG4vKiBVbiB0YWJsZWF1IGRhbnMgdW5lIHLDqXBvbnNlIDogcGxlaW5lIGxhcmdldXIsIGZpbGV0cyBob3Jpem9udGF1eCBzZXVsZW1lbnQg4oCUIGxlIG3Dqm1lXG4gICBwYXJ0aSBxdWUgbGUgcmVzdGUgZHUgYmxvYy4gSWwgZMOpZmlsZSB0b3V0IHNldWwgcXVhbmQgaWwgZXN0IHRyb3AgbGFyZ2UgcG91ciBsYSBjb2xvbm5lLFxuICAgcGx1dMO0dCBxdWUgZCfDqWxhcmdpciBsYSBwYWdlLiAqL1xuLmZhcVJlcG9uc2UgdGFibGUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICBtYXJnaW46IDEycHggMDtcbn1cblxuLmZhcVJlcG9uc2UgdGgsXG4uZmFxUmVwb25zZSB0ZCB7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NlbGx1bGUpO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlcik7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuXG4uZmFxUmVwb25zZSB0aCB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNlN0cm9uZyk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbi8qIFVuIGJsb2MgZGUgY29kZSBkYW5zIHVuZSByw6lwb25zZSA6IHVuZSBzYWlzaWUgw6AgcmVjb3BpZXIgdGVsbGUgcXVlbGxlIChsYSBzeW50YXhlIGRlc1xuICAgcGxhZ2VzIGRlIG51bcOpcm9zLCBwYXIgZXhlbXBsZSkuIEF1Y3VuZSByw6hnbGUgbidleGlzdGUgcG91ciBgcHJlYCBhaWxsZXVycyBzdXIgbGUgc2l0ZSDigJRcbiAgIGMnZXN0IGljaSBsYSBwcmVtacOocmUsIGV0IGVsbGUgbmUgdmF1dCBxdWUgZGFucyB1bmUgcsOpcG9uc2UuIElsIGTDqWZpbGUgcGx1dMO0dCBxdWUgZGVcbiAgIGTDqWJvcmRlciwgY29tbWUgbGUgdGFibGVhdS4gKi9cbi5mYXFSZXBvbnNlIHByZSB7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBtYXJnaW46IDEycHggMDtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ29kZSk7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jMDIpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbn1cblxuLmZhcVJlcG9uc2UgcHJlIGNvZGUsXG4uZmFxUmVwb25zZSBjb2RlIHtcbiAgICBmb250LWZhbWlseTogdmFyKC0tZmZNb25vKTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBVTkUgUVVFU1RJT04gTUlTRSBFTiDDiVZJREVOQ0Ug4oCUIGJhbGlzZSBNYXJrZG93biBgZmFxOmlkZW50aWZpYW50YCAoQmFsaXNlRmFxLCBub3lhdSlcbiAgIFVuIGNhZHJlIGF1IGZpbCBkJ3VuIGFydGljbGUgOiBsYSBxdWVzdGlvbiBlbiB0w6p0ZSwgbGEgcsOpcG9uc2UgZGVzc291cywgdG91am91cnMgdmlzaWJsZS5cbiAgIFJpZW4gbmUgc2UgcmVwbGllIOKAlCBvbiBtZXQgZW4gw6l2aWRlbmNlLCBvbiBuZSBjYWNoZSBwYXMgKGTDqWNpc2lvbiBkdSBjaGVmIGRlIHByb2pldCxcbiAgIDIwMjYtMDktMDUpLiBMZSBIVE1MIGVzdCBjZWx1aSBkdSBub3lhdSwgbGUgbcOqbWUgcXVlIGRhbnMgdW4gcGFubmVhdSBkJ2FpZGUgZHUgU3R1ZGlvXG4gICAoX2ZhcUVuY2FkcmUuY3NzKSA7IHNldWwgbCdoYWJpbGxhZ2UgZXN0IGQnaWNpLlxuICAgTGEgcsOpcG9uc2UgcG9ydGUgbGVzIG3Dqm1lcyByw6hnbGVzIHF1ZSAuZmFxUmVwb25zZSA6IGVsbGUgZXN0IMOpY3JpdGUgYXZlYyBsZSBtw6ptZSBkcm9pdFxuICAgYXV4IHNvdXMtdGl0cmVzLCBsaXN0ZXMsIHRhYmxlYXV4IGV0IGJsb2NzIGRlIGNvZGUuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4uZmFxRW5jYWRyZSB7XG4gICAgbWFyZ2luOiAzMnB4IDA7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NvcnBzKTtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlckNhcnRlKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG59XG5cbi5mYXFFbmNhZHJlIC5mYXFFbmNhZHJlUXVlc3Rpb24ge1xuICAgIG1hcmdpbjogMCAwIDEycHg7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNlN0cm9uZyk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbi5mYXFFbmNhZHJlUmVwb25zZSB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG5cbi5mYXFFbmNhZHJlUmVwb25zZSA+ICo6Zmlyc3QtY2hpbGQge1xuICAgIG1hcmdpbi10b3A6IDA7XG59XG5cbi5mYXFFbmNhZHJlUmVwb25zZSA+ICo6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmZhcUVuY2FkcmVSZXBvbnNlIGgzIHtcbiAgICBtYXJnaW46IDIwcHggMCA4cHg7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNlN0cm9uZyk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbi5mYXFFbmNhZHJlUmVwb25zZSB0YWJsZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIG1hcmdpbjogMTJweCAwO1xufVxuXG4uZmFxRW5jYWRyZVJlcG9uc2UgdGgsXG4uZmFxRW5jYWRyZVJlcG9uc2UgdGQge1xuICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdDZWxsdWxlKTtcbiAgICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXIpO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxuLmZhcUVuY2FkcmVSZXBvbnNlIHRoIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2U3Ryb25nKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cblxuLmZhcUVuY2FkcmVSZXBvbnNlIHByZSB7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBtYXJnaW46IDEycHggMDtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ29kZSk7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jMDIpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbn1cblxuLmZhcUVuY2FkcmVSZXBvbnNlIHByZSBjb2RlLFxuLmZhcUVuY2FkcmVSZXBvbnNlIGNvZGUge1xuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mZk1vbm8pO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBCTE9DUyDigJQgY2FydGUgwqsgdGl0cmUgKyB0ZXh0ZSArIGFjdGlvbnMgwrsgKHBhZ2UgYXBlcsOndSlcblxuICAg4pqg77iPIENPUElFIEFTU1VNw4lFIChTT1VTLUVOU0VNQkxFKSDigJQganVtZWxsZSBwYXJ0aWVsbGUgZGVcbiAgIHN0dWRpb1JlZ2llL2Fzc2V0cy9ub3lhdS9jc3Mvc3R1ZGlvLzUzX2Jsb2NzLmNzcy5cbiAgIE5lIHJlcHJlbmQgUVVFIGxhIHBhcnRpZSDCqyBjYXJ0ZSDCuyB1dGlsaXPDqWUgcGFyIGxhIGxpc3RlIGRlcyBzY8OpbmFyaW9zXG4gICAoLmJsb2MgLyAuYmxvY0NvcnBzIC8gLmJsb2NUaXRyZSAvIC5ibG9jVGV4dGUgLyAuYmxvY0FjdGlvbnMgKyByZXNwb25zaXZlKS5cbiAgIExlIGNvbXBvc2FudCBzdHVkaW8gY29tcGxldCBwb3J0ZSBlbiBwbHVzIGRlcyB6b25lcyBvdXRpbCAoc3RhdHMsIGNvbXB0ZXVyLFxuICAgbGlzdGUgZCdpdGVtcywgcsOpb3Jkb25uYW5jZW1lbnQsIGZvcm11bGFpcmVzKSBxdWkgbidvbnQgcGFzIGxldXIgcGxhY2UgZGFuc1xuICAgbGUgZnVubmVsIOKAlCB2b2xvbnRhaXJlbWVudCBub24gcmVwcmlzZXMuXG5cbiAgIFRvdXRlIG1vZGlmaWNhdGlvbiBpY2kg4oaSIGRlbWFuZGVyIGF1IFBPIHMnaWwgZmF1dCBsYSByw6lwZXJjdXRlciBzdXIgbGUganVtZWF1XG4gICBzdHVkaW8uIExlcyBkZXV4IGNvcGllcyBwZXV2ZW50IGRpdmVyZ2VyIHNlbG9uIGxlcyBiZXNvaW5zIGRlIGNoYXF1ZSBjw7R0w6kuXG5cbiAgIFN0cnVjdHVyZSBIVE1MIDpcbiAgIDxkaXYgY2xhc3M9XCJibG9jXCI+XG4gICAgICAgPGRpdiBjbGFzcz1cImJsb2NDb3Jwc1wiPlxuICAgICAgICAgICA8aDQgY2xhc3M9XCJibG9jVGl0cmVcIj4uLi48L2g0PlxuICAgICAgICAgICA8cCBjbGFzcz1cImJsb2NUZXh0ZVwiPi4uLjwvcD5cbiAgICAgICA8L2Rpdj5cbiAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY0FjdGlvbnNcIj4uLi48L2Rpdj5cbiAgIDwvZGl2PlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLmJsb2Mge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMpO1xuICAgIGJvcmRlcjogdmFyKC0tYm9yZGVyRm9ybSk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzO1xufVxuXG4uYmxvY0NvcnBzIHtcbiAgICBmbGV4OiAxO1xuICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdDYXJ0ZSk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogdmFyKC0tZ2FwUmVkdWl0KTtcbn1cblxuLmJsb2NUaXRyZSB7XG4gICAgZm9udDogdmFyKC0tZkgzKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICBtYXJnaW4tdG9wOiAwO1xufVxuXG4uYmxvY1RleHRlIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5ibG9jQWN0aW9ucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBnYXA6IHZhcigtLWdhcERlZmF1dCk7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NhcnRlKTtcbiAgICBib3JkZXItbGVmdDogdmFyKC0tYm9yZGVyKTtcbiAgICBtaW4td2lkdGg6IDI0MHB4O1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHtcbiAgICAuYmxvYyB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLmJsb2NBY3Rpb25zIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgICAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyKTtcbiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NhcnRlRXRyb2l0KTtcbiAgICB9XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQk9VVE9OIERJU0NSRVQg4oCUIC5jdGFEaXNjcmV0IChib3V0b25zIGRlcyBjYXJ0ZXMgZGUgc2PDqW5hcmlvLCBwYWdlIGFwZXLDp3UpXG5cbiAgIOKaoO+4jyBDT1BJRSBBU1NVTcOJRSAoU09VUy1FTlNFTUJMRSkg4oCUIGp1bWVsbGUgcGFydGllbGxlIGRlIGxhIGTDqWZpbml0aW9uXG4gICAuY3RhRGlzY3JldCBkZSBzdHVkaW9SZWdpZS9hc3NldHMvbm95YXUvY3NzL3N0dWRpby81Nl9zY2VuYXJpby9fbW9kYWxlLmNzcy5cbiAgIFJlcHJlbmQgbGEgYmFzZSArIGxlIHN1cnZvbCArIGxlcyDDqXRhdHMgZMOpc2FjdGl2w6lzLiBMZXMgdmFyaWFudGVzIGNvbnRleHR1ZWxsZXNcbiAgICguY3RhRGlzY3JldC5hY3RpZiBkYW5zIC5tb2RhbGVQYXJ0aWNpcGFudHMgLyAubW9kYWxlU2NlbmVzIC8g4oCmKSBzb250IHByb3ByZXNcbiAgIGF1eCBtb2RhbGVzIGR1IHN0dWRpbyBldCB2b2xvbnRhaXJlbWVudCBub24gcmVwcmlzZXMuXG5cbiAgIFRvdXRlIG1vZGlmaWNhdGlvbiBpY2kg4oaSIGRlbWFuZGVyIGF1IFBPIHMnaWwgZmF1dCBsYSByw6lwZXJjdXRlciBzdXIgbGUganVtZWF1IHN0dWRpby5cbiAgIExlcyBkZXV4IGNvcGllcyBwZXV2ZW50IGRpdmVyZ2VyIHNlbG9uIGxlcyBiZXNvaW5zIGRlIGNoYXF1ZSBjw7R0w6lcbiAgICh2aXRyaW5lID0gZnVubmVsIHB1YmxpYywgY2FjaGFibGUsIFNFTyA7IHN0dWRpbyA9IG91dGlsIGNvbm5lY3TDqSkuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4uY3RhRGlzY3JldCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ3RhMTQpO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlckN0YSk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCbGFuYyk7XG4gICAgZm9udDogdmFyKC0tZk1lbnUxNCk7XG4gICAgY29sb3I6IHZhcigtLWNDdGFUZXh0ZSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycywgY29sb3IgMC4ycywgYm9yZGVyLWNvbG9yIDAuMnM7XG59XG5cbi5jdGFEaXNjcmV0OmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMwMik7XG59XG5cbi5jdGFEaXNjcmV0OmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjQ7XG4gICAgY3Vyc29yOiBhdXRvO1xufVxuXG4vKiBWYXJpYW50ZSA8YT4gZMOpc2FjdGl2w6kgKHVuIGxpZW4gbmUgY29ubmHDrnQgcGFzIDpkaXNhYmxlZCkgKi9cbi5jdGFEaXNjcmV0LmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjQ7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5jdGFEaXNjcmV0OmRpc2FibGVkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMpO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEZJTFRSRVMg4oCUIHBhbm5lYXUgZGUgZmlsdHJlcyBkZSBsYSBsaXN0ZSBkZXMgc2PDqW5hcmlvcyAocGFnZSBhcGVyw6d1KVxuXG4gICDimqDvuI8gQ09QSUUgQVNTVU3DiUUg4oCUIGp1bWVsbGUgZGUgc3R1ZGlvUmVnaWUvYXNzZXRzL25veWF1L2Nzcy9zdHVkaW8vNTVfZmlsdHJlcy5jc3MuXG4gICBJZGVudGlxdWUgYXUgZMOpcGFydC4gVG91dGUgbW9kaWZpY2F0aW9uIGljaSDihpIgZGVtYW5kZXIgYXUgUE8gcydpbCBmYXV0IGxhIHLDqXBlcmN1dGVyXG4gICBzdXIgbGUganVtZWF1IHN0dWRpby4gTGVzIGRldXggY29waWVzIHBldXZlbnQgZGl2ZXJnZXIgc2Vsb24gbGVzIGJlc29pbnMgZGUgY2hhcXVlIGPDtHTDqVxuICAgKHZpdHJpbmUgPSBmdW5uZWwgcHVibGljLCBjYWNoYWJsZSwgU0VPIDsgc3R1ZGlvID0gb3V0aWwgY29ubmVjdMOpKS5cblxuICAgLmRpdkZpbHRyZVpvbmUgICAgIGxhIHJhbmfDqWUgOiBwYW5uZWF1IMOgIGdhdWNoZSwgY29udGVudSBmaWx0csOpIMOgIGRyb2l0ZVxuICAgLmRpdkZpbHRyZSAgICAgICAgIGxlIHBhbm5lYXUgdmVydGljYWwgZGUgZmlsdHJlc1xuICAgLnRpdHJlRmlsdHJlICAgICAgIHRpdHJlIGR1IHBhbm5lYXVcbiAgIC5kaXZGaWx0cmVHcm91cGUgICBncm91cGUgZGUgcHVjZXMgKCsgLnBsaWUgOiByZXBsacOpLCBzZXVscyBsZXMgYWN0aWZzIHJlc3RlbnQgdmlzaWJsZXMpXG4gICAudGl0cmVHcm91cGVGaWx0cmUgdGl0cmUgZCd1biBncm91cGUsIGNsaXF1YWJsZSAoY2hldnJvbiksIHJlcGxpZS9kw6lwbGllIChwbGlhZ2VGaWx0cmVzLnRzKVxuICAgLmZpbHRyZSAgICAgICAgICAgIGxhIHB1Y2UgY2xpcXVhYmxlICgrIC5hY3RpZiA6IGZvbmQgZ3JpcyArIGNvY2hlIOKckyDDoCBkcm9pdGUpXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4uZGl2RmlsdHJlWm9uZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBnYXA6IHZhcigtLWdhcExpc3RlKTtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cblxuLmRpdkZpbHRyZSB7XG4gICAgZmxleDogMCAwIDI4MHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcERlZmF1dCk7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NvcnBzKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMwMik7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIyKTtcbn1cblxuLnRpdHJlRmlsdHJlIHtcbiAgICBmb250OiB2YXIoLS1mSDQpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1nYXBEZWZhdXQpO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlcik7XG59XG5cbi5kaXZGaWx0cmVHcm91cGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcFJlZHVpdCk7XG59XG5cbi8qIFRpdHJlIGRlIGdyb3VwZSA6IGNsaXF1YWJsZSwgcmVwbGllL2TDqXBsaWUgc29uIGdyb3VwZSAoVFMgcGxpYWdlRmlsdHJlcy50cyBwb3NlIC5wbGllKSAqL1xuLnRpdHJlR3JvdXBlRmlsdHJlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZm9udDogdmFyKC0tZkxhYmVsKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1nYXBEZWZhdXQpO1xuICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLXBhZGRpbmdDb3Jwcyk7IC8qIHBsYWNlIGR1IGNoZXZyb24gKi9cbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi50aXRyZUdyb3VwZUZpbHRyZTpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbi8qIENoZXZyb24gZGVzc2luw6kgZW4gQ1NTIChhdWN1bmUgaWPDtG5lIGNoZXZyb24gbidleGlzdGUgZGFucyBsJ2FwcGxpKSA6IOKWviBvdXZlcnQsIOKWuCBwbGnDqSAqL1xuLnRpdHJlR3JvdXBlRmlsdHJlOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiA0cHg7XG4gICAgdG9wOiA1MCU7XG4gICAgd2lkdGg6IDdweDtcbiAgICBoZWlnaHQ6IDdweDtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwJSkgcm90YXRlKDQ1ZGVnKTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycztcbn1cblxuLmRpdkZpbHRyZUdyb3VwZS5wbGllIC50aXRyZUdyb3VwZUZpbHRyZTo6YWZ0ZXIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoLTQ1ZGVnKTtcbn1cblxuLyogR3JvdXBlIHBsacOpIDogc2V1bHMgbGVzIGZpbHRyZXMgYWN0aWZzIHJlc3RlbnQgYXBwYXJlbnRzICovXG4uZGl2RmlsdHJlR3JvdXBlLnBsaWUgLmZpbHRyZTpub3QoLmFjdGlmKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogTGEgcHVjZSA6IGR1IHRleHRlLCBwYXMgdW4gYm91dG9uIOKAlCBsZSBjb250b3VyIGV0IGxlIGZvbmQgYmxldSBwbGVpbiBhcHBhcnRpZW5uZW50IGF1eCBjdGEgKi9cbi5maWx0cmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nUGFzdGlsbGUpO1xuICAgIHBhZGRpbmctcmlnaHQ6IDI2cHg7IC8qIHBsYWNlIHLDqXNlcnbDqWUgw6AgZHJvaXRlIHBvdXIgbGEgY29jaGUgOiByaWVuIG5lIGJvdWdlIMOgIGxhIHPDqWxlY3Rpb24gKi9cbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IG5vbmU7IC8qIG5ldXRyYWxpc2UgbCdoYWJpbGxhZ2UgbmF0aWYgZGVzIHB1Y2VzIDxidXR0b24+ICovXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjIpO1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIGNvbG9yIDAuMTVzO1xufVxuXG4vKiBBY3RpZiA9IGxlIGZvbmQgZHUgc3Vydm9sIHF1aSByZXN0ZSAoLS1jQmxhbmMwMyA6IGZvbmQgZXhpc3RhbnQgZGVzIGJvdXRvbnMgZGlzY3JldHMpICovXG4uZmlsdHJlOmhvdmVyLFxuLmZpbHRyZS5hY3RpZiB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jMDMpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG4uZmlsdHJlLmFjdGlmOjphZnRlciB7XG4gICAgY29udGVudDogJ+Kckyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiA4cHg7XG4gICAgdG9wOiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExJU1RFIERFUyBTQ8OJTkFSSU9TIEQnVU5FIENBVMOJR09SSUUgKHBhZ2UgYXBlcsOndSkg4oCUIGNhdGFsb2d1ZSArIGZpbHRyZXNcblxuICAg4pqg77iPIENPUElFIEFTU1VNw4lFIOKAlCBqdW1lbGxlIGRlIHN0dWRpb1JlZ2llL2Fzc2V0cy9ub3lhdS9jc3Mvc3R1ZGlvLzU1X3NjZW5hcmlvc0NhdGFsb2d1ZS5jc3MuXG4gICBJZGVudGlxdWUgYXUgZMOpcGFydC4gVG91dGUgbW9kaWZpY2F0aW9uIGljaSDihpIgZGVtYW5kZXIgYXUgUE8gcydpbCBmYXV0IGxhIHLDqXBlcmN1dGVyXG4gICBzdXIgbGUganVtZWF1IHN0dWRpby4gTGVzIGRldXggY29waWVzIHBldXZlbnQgZGl2ZXJnZXIgc2Vsb24gbGVzIGJlc29pbnMgZGUgY2hhcXVlIGPDtHTDqVxuICAgKHZpdHJpbmUgPSBmdW5uZWwgcHVibGljLCBjYWNoYWJsZSwgU0VPIDsgc3R1ZGlvID0gb3V0aWwgY29ubmVjdMOpKS5cblxuICAgTmFtZXNwYWNlIMKrIGNyZWVyU2NlbmFyaW8gwrsgZXhjbHVzaWYgw6AgY2V0dGUgcGFnZS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIExlIGRlc2lnbiBkdSBwYW5uZWF1IGRlIGZpbHRyZXMgdmllbnQgZHUgY29tcG9zYW50IGNvbW11biAoZmlsdHJlcy5jc3MpLiAqL1xuI2NyZWVyU2NlbmFyaW8ge1xuICAgIG1hcmdpbi10b3A6IDMwcHg7XG59XG5cbi8qIExhIGxpc3RlIGRlcyBzY8OpbmFyaW9zIGVzdCBsb25ndWUgOiBsZSBwYW5uZWF1IHN1aXQgbGUgZMOpZmlsZW1lbnQuICovXG4jZGl2RmlsdHJlU2NlbmFyaW8ge1xuICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgdG9wOiAyMHB4O1xufVxuXG4vKiBMaXN0ZSBkZXMgc2PDqW5hcmlvcyAqL1xuI2NyZWVyU2NlbmFyaW9MaXN0ZSB7XG4gICAgZmxleDogMTtcbiAgICBtaW4td2lkdGg6IDA7XG4gICAgbWF4LXdpZHRoOiA4MDBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiB2YXIoLS1nYXBMaXN0ZSk7XG59XG5cbi8qIExhIGNhcnRlIEVTVCB1biBibG9jIChjb21wb3NhbnQgYmxvY3MuY3NzKSA6IGxhIGNsYXNzZSBuZSBzZXJ0IHBsdXMgcXUnYXUgZmlsdHJhZ2UgVFNcbiAgIGV0IGF1eCByw6lnbGFnZXMgcHJvcHJlcyDDoCBsYSBwYWdlLiAqL1xuLmNyZWVyU2NlbmFyaW9DYXJ0ZSB7XG4gICAgbWF4LXdpZHRoOiBub25lOyAvKiBsYSBsaXN0ZSAoODAwcHgpIGNvbW1hbmRlLCBwYXMgbGUgY2xhbXAgNjAwcHggZHUgYmxvYyAqL1xufVxuXG4vKiBJY8O0bmUgZHUgc2PDqW5hcmlvIDogdG91am91cnMgw6AgRFJPSVRFLCBldCBTQU5TIGZvbmQgKGTDqWNpc2lvbiBQTyAyMDI2LTA3LTMxKSDigJRcbiAgIGNvbnRyYWlyZW1lbnQgw6AgLnJlY2FwVGl0cmVJY29uZSwgZG9udCBsZSBmb25kIGNvZGUgdW5lIGZhbWlsbGUgZGUgc2PDqG5lcy5cbiAgIExlIFNWRyBlc3QgaW5saW7DqSAoaWNvbmVTY2VuYXJpbyksIHBhcyBlbiA8aW1nPiA6IHNjZW5hcmlvcy97ZG9zc2llcn0vaWNvbmUuc3ZnIGVzdFxuICAgaG9ycyBwdWJsaWMvLiA2NHB4IGRlIGRlc3NpbiwgbGEgZ3JhbmRlIGRlcyBkZXV4IHRhaWxsZXMgZCdpY8O0bmUgZGUgc2PDqG5lIGR1IHByb2pldFxuICAgKFN0dWRpbywgYXNzZXRzL25veWF1L2Nzcy9zdHVkaW8vNTRfaWNvbmVzLmNzcyksIHNhbnMgYWlyIOKAlCBjb21tZSBsZSBTdHVkaW8uXG4gICBTZXJ2aWUgaWNpIHBvdXIgbGVzIGRldXggcGFnZXMgZHUgcGFyY291cnMgYXBlcsOndSAoY2F0YWxvZ3VlICsgY29tcG9zaXRpb24pLiAqL1xuLnNjZW5hcmlvSWNvbmUge1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgd2lkdGg6IDY0cHg7XG4gICAgaGVpZ2h0OiA2NHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5zY2VuYXJpb0ljb25lIHN2ZyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG4vKiBEYW5zIHVuZSBjYXJ0ZSBkdSBjYXRhbG9ndWUsIGwnaWPDtG5lIHNlIGNhbGUgc3VyIGxlIHBhZGRpbmcgZHUgY29ycHMgZHUgYmxvYy4gKi9cbi5jcmVlclNjZW5hcmlvQ2FydGUgLnNjZW5hcmlvSWNvbmUge1xuICAgIG1hcmdpbjogMTZweCAyMHB4IDE2cHggYXV0bztcbn1cblxuLmNyZWVyU2NlbmFyaW9WaWRlIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuLyogTWFzcXVhZ2UgcGFyIGxlIGZpbHRyZSAqL1xuLmNyZWVyU2NlbmFyaW9NYXNxdWUge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBUb2dnbGUgYW5pbWF0aW9uIChjaG9peCBleGNsdXNpZilcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi50b2dnbGVTY2VuZUdyb3VwZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLyogTGVzIHBsYW5zIGludGVybmVzIGR1IHRvZ2dsZSAoaW5kaWNhdGV1ciAwLCBib3V0b25zIDEpIHJlc3RlbnQgY29uZmluw6lzIGF1IGdyb3VwZSA6XG4gICAgICAgc2FucyBjZWxhLCBsZXMgYm91dG9ucyBtb250YWllbnQgZGFucyBsJ8OpY2hlbGxlIGRlIGxhIGJhcnJlIGRlIHBpbG90YWdlIGV0IHBhc3NhaWVudFxuICAgICAgIGF1LWRlc3N1cyBkZSBzb24gdm9pbGUgKCNiYXJyZVBpbG90YWdlOjpiZWZvcmUsIHogMSDigJQgX2JhcnJlRmluLmNzcykuICovXG4gICAgaXNvbGF0aW9uOiBpc29sYXRlO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCbGFuYzAzKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG59XG5cbi8qIEhvcnMgZmx1eCA6IGxlIHRpdHJlIG5lIHLDqXNlcnZlIGF1Y3VuZSBoYXV0ZXVyLCBpbCBuZSBkb2l0IHBhcyBnw6puZXIgbGEgbGVjdHVyZSBkZSBsYSBiYXJyZSAqL1xuLnRvZ2dsZVNjZW5lVGl0cmUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDJweDtcbiAgICBsZWZ0OiAzcHg7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMDAlKTtcbiAgICBmb250OiB2YXIoLS1mTWluaTExKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXI0KTtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4udG9nZ2xlU2NlbmVJbmRpY2F0ZXVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMxKTtcbiAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMzVzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksXG4gICAgICAgICAgICAgICAgd2lkdGggMC4zNXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSxcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzIDAuMzVzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gICAgei1pbmRleDogMDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAgdmFyKC0tY05vaXIxKTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnRvZ2dsZVNjZW5lQnRuIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ3RhMTQpOyAvKiBtw6ptZSBoYXV0ZXVyIHF1ZSBsZXMgY3RhIGRlIGxhIGJhcnJlIGQnYWN0aW9ucyAqL1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBmb250OiB2YXIoLS1mTWVudTE0KTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xufVxuXG4udG9nZ2xlU2NlbmVCdG46aG92ZXI6bm90KC5zZWxlY3Rpb25uZSk6bm90KDpkaXNhYmxlZCkge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG4udG9nZ2xlU2NlbmVCdG4uc2VsZWN0aW9ubmUge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLnRvZ2dsZVNjZW5lQnRuOmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjQ7XG4gICAgY3Vyc29yOiBhdXRvO1xufVxuXG4vKiBHcm91cGUgcXVpIG4nb2ZmcmUgcGx1cyBkZSBjaG9peCAoYXUgcGx1cyB1biBib3V0b24gYWN0aWYsIG91IGZpZ8OpIHBhciB2ZXJyb3VpbGxlckNob2l4KSAqL1xuLnRvZ2dsZVNjZW5lR3JvdXBlLnNhbnNDaG9peCAudG9nZ2xlU2NlbmVCdG4sXG4udG9nZ2xlU2NlbmVHcm91cGUuc2Fuc0Nob2l4IC50b2dnbGVTY2VuZUluZGljYXRldXIge1xuICAgIG9wYWNpdHk6IDAuNDtcbn1cblxuLnRvZ2dsZVNjZW5lR3JvdXBlLnNhbnNDaG9peCAudG9nZ2xlU2NlbmVCdG4ge1xuICAgIGN1cnNvcjogYXV0bztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDT01QT1NJVElPTiBEJ1VOIFNDw4lOQVJJTyDigJQgQ29tcG9zaXRpb24gcGFyIGZhbWlsbGVcblxuICAgTmFtZXNwYWNlIMKrIG1vZGlmaWVyU2NlbmFyaW8gwrsgZXhjbHVzaWYgYXV4IGRldXggcGFnZXMganVtZWxsZXMgZGUgbGEgYnJpcXVlXG4gICBfY29tcG9zaXRpb25TY2VuYXJpbyA6IMKrIE1vZGlmaWVyIGNlIHNjw6luYXJpbyDCuyAoU3R1ZGlvKSBldCDCqyBDb25maWd1cmVyIMK7XG4gICAoVml0cmluZSkg4oCUIGTDqWNpc2lvbiBQTyAyMDI2LTA4LTE0LiBMZSBzdGVwcGVyIGV0IGxlcyBkw6l0YWlsc1xuICAgRW50csOpZXMvU29ydGllcyByw6l1dGlsaXNlbnQgbGVzIGNsYXNzZXMgZHUgcsOpY2FwaXR1bGF0aWYgKDU2X3NjZW5hcmlvL19yZWNhcGl0dWxhdGlmLmNzcykgO1xuICAgaWNpIHVuaXF1ZW1lbnQgbGUgY2Fycm91c2VsIGRlIHJlbXBsYcOnYW50ZXMsIGxlcyBmaWNoZXMgZXQgbGEgYmFycmUgZCdhY3Rpb25zLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogTGUgdG9nZ2xlIMOgIGNob2l4IGV4Y2x1c2lmIGRlIGxhIGJhcnJlIGRlIHBpbG90YWdlIGRlIGwnw6ljcmFuICgudG9nZ2xlU2NlbmVHcm91cGUpLFxuICAgcsOpZW1wbG95w6kgdGVsIHF1ZWwgZGFucyBsYSBiYXJyZSBkJ2FjdGlvbnMg4oCUIHVuIHNldWwgZXhlbXBsYWlyZSBkdSBjb21wb3NhbnQsIGltcG9ydMOpXG4gICBpY2kgcGx1dMO0dCBxdWUgZGFucyBjaGFjdW5lIGRlcyB0cm9pcyBlbnRyw6llcyBxdWkgc2VydmVudCBjZXR0ZSBwYWdlLiAqL1xuQGltcG9ydCAnLi4vLi4vc2FsbGUvZWNyYW4vY3NzL190b2dnbGVTY2VuZS5jc3MnO1xuXG4jbW9kaWZpZXJTY2VuYXJpbyB7XG4gICAgbWFyZ2luLXRvcDogMzBweDtcbn1cblxuLyogTGVzIGJsb2NzIGRlIGxhIHBhZ2Ugc29udCBkZXMgLmJsb2MgKGNvbXBvc2FudCBjb21tdW4gNTNfYmxvY3MuY3NzLCBkw6ljaXNpb25cbiAgIFBPIDIwMjYtMDctMTgpIDsgaWNpIHVuaXF1ZW1lbnQgbGVzIHLDqWdsYWdlcyBwcm9wcmVzIMOgIGxhIHBhZ2UuICovXG4jbW9kaWZpZXJTY2VuYXJpbyAuYmxvYyB7XG4gICAgLyogaW51dGlsaXPDqSAyMDI2LTA4LTExIOKAlCBhbmNyYWl0IGwnaWPDtG5lIGFic29sdWUgLnJlY2FwVGl0cmVJY29uZSBkZXMgYmxvY3Mgc2Fuc1xuICAgICAgIHJlbXBsYcOnYW50ZSwgcmVtcGxhY8OpZSBwYXIgbGEgdHVpbGUgZmHDp29uIGNhcnJvdXNlbCAoZMOpY2lzaW9uIFBPKS5cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7ICovXG4gICAgbWF4LXdpZHRoOiBub25lOyAvKiBsZXMgdHVpbGVzIGR1IGNhcnJvdXNlbCBkw6lwYXNzZW50IGxlIGNsYW1wIDYwMHB4IGR1IGJsb2MgKi9cbn1cblxuLyogQ2xhc3NlIGV0IG5vbiBpZCA6IHVuIGNhcnJvdXNlbCBwYXIgYmxvYywgcsOpcMOpdMOpIGRhbnMgbGEgcGFnZS4gKi9cbi5kaXZBY3Rpb25DaGFuZ2VyU2NlbmUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgIGdhcDogdmFyKC0tZ2FwUmVkdWl0KTsgLyogbGUgcGFkZGluZyB2aWVudCBkdSBibG9jQ29ycHMgKi9cbn1cblxuLmFjdGlvbkNoYW5nZXJTY2VuZSB7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgd2lkdGg6IDM2cHg7XG4gICAgaGVpZ2h0OiA3NHB4OyAvKiBtw6ptZSBoYXV0ZXVyIHF1ZSBsZXMgdHVpbGVzICovXG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jKTtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlckN0YSk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGNvbG9yOiB2YXIoLS1jQ3RhVGV4dGUpO1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycywgY29sb3IgMC4ycztcbn1cblxuLmFjdGlvbkNoYW5nZXJTY2VuZTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jQWNjZW50Myk7XG4gICAgY29sb3I6IHZhcigtLWNBY2NlbnQzKTtcbn1cblxuLmFjdGlvbkNoYW5nZXJTY2VuZTpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC4zNTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi8qIFBvc8OpZSBwYXIgbW9kaWZpZXJTY2VuYXJpby50cyBxdWFuZCB0b3V0ZXMgbGVzIHR1aWxlcyB0aWVubmVudCBzYW5zIHNjcm9sbCA6IGxlc1xuICAgZmzDqGNoZXMgbmUgc2VydmVudCBhbG9ycyDDoCByaWVuLCBldCBsZXVyIGFic2VuY2UgYWxpZ25lIGxhIHJhbmfDqWUgc3VyIGxlIGJvcmRcbiAgIGdhdWNoZSwgY29tbWUgbGEgdHVpbGUgZGVzIGJsb2NzIHNhbnMgcmVtcGxhw6dhbnRlIChkw6ljaXNpb24gUE8gMjAyNi0wOC0xMSkuICovXG4uZGl2QWN0aW9uQ2hhbmdlclNjZW5lU2Fuc0ZsZWNoZXMgLmFjdGlvbkNoYW5nZXJTY2VuZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLm1vZGlmaWVyU2NlbmFyaW9JY29uZXMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiB2YXIoLS1nYXBSZWR1aXQpO1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgLyogOCw1IGljw7RuZXMgdmlzaWJsZXMgYXUgbWF4aW11bSA6IGxhIGRlbWktaWPDtG5lIGNvdXDDqWUgc2lnbmFsZSBxdSdpbCB5IGEgdW5lIHN1aXRlICovXG4gICAgbWF4LXdpZHRoOiBjYWxjKDc0cHggKiA4LjUgKyB2YXIoLS1nYXBSZWR1aXQpICogOCk7XG59XG5cbi5tb2RpZmllclNjZW5hcmlvSWNvbmUge1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgIHdpZHRoOiA3NHB4O1xuICAgIGhlaWdodDogNzRweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jKTtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlckNhcnRlKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzLCBiYWNrZ3JvdW5kIDAuMnMsIG9wYWNpdHkgMC4ycywgZmlsdGVyIDAuMnM7XG59XG5cbi8qIFN1cnZvbCBkJ3VuZSB0dWlsZSBub24gcmV0ZW51ZSA6IHRvbiBjbGFpciBkZSBsYSBmYW1pbGxlICh+NTAgJSBkdSBmb25kKSwgYXBlcsOndSBkZVxuICAgbCdhY3RpdmF0aW9uLiBEw6lmYXV0ID0gYW5pbWF0aW9uLCAucmVjYXBCbG9jQWZmaWNoYWdlIHN1ciBsZSBibG9jIGJhc2N1bGUgZW4gYWZmaWNoYWdlLiAqL1xuLm1vZGlmaWVyU2NlbmFyaW9JY29uZTpub3QoLmFjdGlmKTpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0FjY2VudDApO1xufVxuXG4ucmVjYXBCbG9jQWZmaWNoYWdlIC5tb2RpZmllclNjZW5hcmlvSWNvbmU6bm90KC5hY3RpZik6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNBY2NlbnQwKTtcbn1cblxuLyogVHVpbGUgcmV0ZW51ZSA6IGZvbmQgcGxlaW4gZGUgbGEgZmFtaWxsZSArIGJvcmR1cmUgQ1RBIG5ldHRlIGV0IGhhbG8uICovXG4ubW9kaWZpZXJTY2VuYXJpb0ljb25lLmFjdGlmIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50MSk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCB2YXIoLS1jRm9ybUZvY3VzSGFsbyk7XG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XG59XG5cbi5yZWNhcEJsb2NBZmZpY2hhZ2UgLm1vZGlmaWVyU2NlbmFyaW9JY29uZS5hY3RpZiB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0FjY2VudDEpO1xufVxuXG4vKiBDYXJ0ZSDCqyBjaGFuZ2VtZW50IGRlIGZvbmQgwrsgKGJyaXF1ZSBfY29tcG9zaXRpb25TY2VuYXJpbykgOiBjYXJ0ZSBibGFuY2hlIGNvbW1lIGxlc1xuICAgYXV0cmVzIOKAlCBsYSBjb3VsZXVyIGRlIGZhbWlsbGUgZXN0IHN1ciBsYSB0dWlsZSwgbGUgZm9uZCBsYXZhbmRlIHBsZWluIHJlc3RlIGwnYWZmYWlyZVxuICAgZGVzIGJhbmRlYXV4IGR1IHLDqWNhcCAoNTZfc2NlbmFyaW8vX3JlY2FwaXR1bGF0aWYuY3NzKS4gTCdpZCBsJ2VtcG9ydGUgc3VyIGwnb3JkcmVcbiAgIGQnaW1wb3J0LCBpZGVudGlxdWUgb3Ugbm9uIGVudHJlIHN0dWRpbyBldCB2aXRyaW5lLiAqL1xuI21vZGlmaWVyU2NlbmFyaW8gLmJsb2MucmVjYXBCbG9jQ29uZmlndXJhdGlvbnMge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCbGFuYyk7XG59XG5cbi5yZWNhcEJsb2NDb25maWd1cmF0aW9ucyAubW9kaWZpZXJTY2VuYXJpb0ljb25lLmFjdGlmIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50MSk7XG59XG5cbi8qIDY0cHggZGUgZGVzc2luLCBsYSBncmFuZGUgZGVzIGRldXggdGFpbGxlcyBkdSBwcm9qZXQgKDU0X2ljb25lcy5jc3MpIDsgbGEgdHVpbGUgZGUgNzRcbiAgIG1ldCBsJ2FpciBhdXRvdXIuICovXG4ubW9kaWZpZXJTY2VuYXJpb0ljb25lIGltZyxcbi5tb2RpZmllclNjZW5hcmlvSWNvbmUgc3ZnIHtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG59XG5cbi8qIFR1aWxlIGRlIGxhIHNjw6huZSB1bmlxdWUgKGJsb2Mgc2FucyByZW1wbGHDp2FudGUpIDogbcOqbWUgc2lsaG91ZXR0ZSDCqyBhY3RpZiDCuyBxdWUgbGVcbiAgIGNhcnJvdXNlbCwgbWFpcyByaWVuIMOgIGNsaXF1ZXIg4oCUIHVuIHNwYW4sIGN1cnNldXIgbm9ybWFsLiAqL1xuLm1vZGlmaWVyU2NlbmFyaW9JY29uZVNldWxlIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi8qIENhcnRlIFNVSVZFVVNFIChicmlxdWUgX2NvbXBvc2l0aW9uU2NlbmFyaW8sIGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTEzKSA6IGVsbGVcbiAgIHByb3Bvc2UgbGEgbcOqbWUgbGlzdGUgZGUgc2PDqG5lcyBxdSd1bmUgY2FydGUgcGx1cyBoYXV0LCBsYSBjaGVmZmUsIGV0IGMnZXN0IGzDoC1oYXV0IHF1J29uXG4gICBjaG9pc2l0LiBQbHVzIGRlIG1lbnUgaWNpIDogZmzDqGNoZXMgZXQgdHVpbGVzIG5vbiByZXRlbnVlcyBkaXNwYXJhaXNzZW50LCBzZXVsZSBsYSB0dWlsZVxuICAgYWN0aXZlIHJlc3RlIOKAlCBsYSBtw6ptZSBzaWxob3VldHRlIHF1ZSBsYSB0dWlsZSBkJ3VuZSBjYXJ0ZSBzYW5zIHJlbXBsYcOnYW50ZS4gTGVzIHR1aWxlc1xuICAgc29udCBkw6lzYWN0aXbDqWVzIGRhbnMgbGUgVHdpZyA7IGMnZXN0IGxlIFRTIHF1aSBkw6lwbGFjZSBgYWN0aWZgIHF1YW5kIGxhIGNoZWZmZSBjaGFuZ2UuICovXG4ubW9kaWZpZXJTY2VuYXJpb0Jsb2NTdWl2ZXVyIC5hY3Rpb25DaGFuZ2VyU2NlbmUsXG4ubW9kaWZpZXJTY2VuYXJpb0Jsb2NTdWl2ZXVyIC5tb2RpZmllclNjZW5hcmlvSWNvbmU6bm90KC5hY3RpZikge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5tb2RpZmllclNjZW5hcmlvQmxvY1N1aXZldXIgLm1vZGlmaWVyU2NlbmFyaW9JY29uZSB7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4vKiBDdWUgcmV0aXLDqWUgKHR1aWxlIGNyb2l4IHPDqWxlY3Rpb25uw6llLCBjbGFzc2UgcG9zw6llIHBhciBtb2RpZmllclNjZW5hcmlvLnRzKSA6IGxlIGJsb2NcbiAgIMKrIHMnw6l0ZWludCDCuyBldCBzZSBSRVBMSUUgc3VyIHNhIHJhbmfDqWUgZGUgdHVpbGVzIOKAlCBzY8OobmVzIGV0IGZsw6hjaGVzIGVuIGdyaXPDqSBlc3RvbXDDqSxcbiAgIFNFVUxFIGxhIGNyb2l4IHJlc3RlIHBsZWluZSwgY29sb25uZSByw6ljYXAgZmVybcOpZS4gTGEgY3JvaXggbidhIHBhcyBkZSBmaWNoZSAoZMOpY2lzaW9uXG4gICBQTyAyMDI2LTA4LTE0IDogcGFzIGRlIHRleHRlLCBsZSBibG9jIHJlcGxpw6kgcGFybGUgZGUgbHVpLW3Dqm1lIOKAlCBldCBxdWF0cmUgY3Vlc1xuICAgcmV0aXLDqWVzIG5lIG1hbmdlbnQgcGx1cyBsJ8OpY3JhbikuIFRvdXQgcmVzdGUgY2xpcXVhYmxlLCB1biBjbGljIHJhbcOobmUgbGEgY3VlLiBMYVxuICAgaGF1dGV1ciBkdSByZXBsaSBlc3QgYW5pbcOpZSBwYXIgbGUgVFMgKG1ldHRyZUFKb3VyRXRhdFJldGlyZSkgOiBsZSBDU1MgbmUgc2FpdCBwYXNcbiAgIGFuaW1lciB2ZXJzIGF1dG8uICovXG4ubW9kaWZpZXJTY2VuYXJpb0Jsb2NSZXRpcmUgLm1vZGlmaWVyU2NlbmFyaW9JY29uZTpub3QoLm1vZGlmaWVyU2NlbmFyaW9JY29uZUZhY3VsdGF0aXZlKSxcbi5tb2RpZmllclNjZW5hcmlvQmxvY1JldGlyZSAuYWN0aW9uQ2hhbmdlclNjZW5lIHtcbiAgICBvcGFjaXR5OiAwLjM1O1xuICAgIGZpbHRlcjogZ3JheXNjYWxlKDEpO1xufVxuXG4ubW9kaWZpZXJTY2VuYXJpb0Jsb2NSZXRpcmUgLnJlY2FwQ29tcG9zaXRpb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIEwnZXh0aW5jdGlvbiBkZXMgdHVpbGVzIGV0IGZsw6hjaGVzIHNlIGZhaXQgZW4gZG91Y2V1ciDigJQgbGVzIHR1aWxlcyBwb3J0ZW50IGTDqWrDoFxuICAgb3BhY2l0eS9maWx0ZXIgZGFucyBsZXVyIHByb3ByZSB0cmFuc2l0aW9uLiAqL1xuLmFjdGlvbkNoYW5nZXJTY2VuZSB7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzLCBmaWx0ZXIgMC4ycztcbn1cblxuLm1vZGlmaWVyU2NlbmFyaW9GaWNoZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLm1vZGlmaWVyU2NlbmFyaW9GaWNoZS5hY3RpZiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8qIEJhcnJlIGQnYWN0aW9uIGRlIGxhIGZpY2hlIDogc8OpcGFyZSBsZSBib3V0b24gZHUgZGVzY3JpcHRpZiAodW4gYm91dG9uIG51XG4gICBjb2xsw6kgYXUgdGV4dGUsIGTDqWNpc2lvbiBQTyAyMDI2LTA3LTE4KS4gKi9cbi5kaXZBY3Rpb25GaWNoZSB7XG4gICAgbWFyZ2luLXRvcDogdmFyKC0tZ2FwRGVmYXV0KTtcbn1cblxuLyogRGFucyBsYSBGSUNIRSBkdSBjYXJyb3VzZWwsIGxhIGJhcnJlIGVzdCB1bmUgbGlnbmUgOiDCqyBKb3VlciBsYSBzY8OobmUgwrsgw6AgZ2F1Y2hlLCBsZSBjxZN1clxuICAgwqsgSidhaW1lIMK7IMOgIGRyb2l0ZSAoYnJpcXVlIG5veWF1IF9qYWltZSwgZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTIpLiBTZXVsZW1lbnRcbiAgIGzDoCDigJQgbGEgZ2FsZXJpZSBkJ2lsbHVzdHJhdGlvbnMgKC5yZWNhcENvbXBvc2l0aW9uSWxsdXN0cmF0aW9uKSByYW5nZSBsYSBzaWVubmUgYXV0cmVtZW50LiAqL1xuLm1vZGlmaWVyU2NlbmFyaW9GaWNoZSAuZGl2QWN0aW9uRmljaGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgZ2FwOiB2YXIoLS1nYXBEZWZhdXQpO1xufVxuXG4vKiBpbnV0aWxpc8OpIDIwMjYtMDgtMTEg4oCUIHLDqXNlcnZhaXQgbGEgY29sb25uZSBkZSBkcm9pdGUgw6AgbCdpY8O0bmUgYWJzb2x1ZSAucmVjYXBUaXRyZUljb25lXG4gICBkZXMgYmxvY3Mgc2FucyByZW1wbGHDp2FudGUsIHJlbXBsYWPDqWUgcGFyIGxhIHR1aWxlIGZhw6dvbiBjYXJyb3VzZWwgKGTDqWNpc2lvbiBQTykuXG4jbW9kaWZpZXJTY2VuYXJpbyAuYmxvYzpub3QoLm1vZGlmaWVyU2NlbmFyaW9CbG9jKSAuYmxvY1RleHRlIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiA3OHB4O1xufVxuKi9cblxuLyog4pSA4pSAIENvbG9ubmUgcsOpY2FwIGRlIGNvbXBvc2l0aW9uIChFbnRyw6llcy9Tb3J0aWVzLCBkw6ljaXNpb24gUE8gMjAyNi0wOC0xMSkg4pSA4pSAXG4gICBMYXJnZXVyIEZJWEUgaWRlbnRpcXVlIHN1ciB0b3VzIGxlcyBibG9jcyA6IGwnYWxpZ25lbWVudCB2ZXJ0aWNhbCBkZXMgY29sb25uZXMgcHJpbWUuXG4gICBab25lIGJpZW4gc8OpcGFyw6llIDogdW4gdHJhaXQgZmluICsgZGUgbCdhaXIsIHBhcyBkJ2VuY2FkcsOpIOKAlCBsYSBoacOpcmFyY2hpZSB2aWVudCBkZXNcbiAgIHRhZ3MgZHUgcsOpY2FwICg1Nl9zY2VuYXJpbykuIENvbnRlbnUgcmVuZHUgcGFyIGxlIGNsaWVudCAocmVjYXBDb21wb3NpdGlvbi50cykuICovXG4jbW9kaWZpZXJTY2VuYXJpbyAuYmxvY0NvcnBzIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGdhcDogMThweDsgLyogPSBsZXMgbWFyZ2VzIGxhdMOpcmFsZXMgZHUgYmxvY0NvcnBzIDogbcOqbWUgYWlyIHBhcnRvdXQgYXV0b3VyIGRlIGwnaWxsdXN0cmF0aW9uICovXG59XG5cbi8qIFJlcHJlbmQgbGEgcGlsZSB2ZXJ0aWNhbGUgcXVlIC5ibG9jQ29ycHMgYXNzdXJhaXQgYXZhbnQgc29uIHBhc3NhZ2UgZW4gcmFuZ8OpZS4gKi9cbi5tb2RpZmllclNjZW5hcmlvUHJpbmNpcGFsIHtcbiAgICBmbGV4OiAxO1xuICAgIG1pbi13aWR0aDogMDsgLyogYXV0b3Jpc2UgbGEgcmFuZ8OpZSBkZSB0dWlsZXMgw6AgcsOpdHLDqWNpciAob3ZlcmZsb3cg4oaSIGZsw6hjaGVzKSAqL1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcFJlZHVpdCk7XG59XG5cbi8qIENvbnRlbnUgOiBkZXMgLnJlY2FwQ29tcG9zaXRpb25TZWN0aW9uICh1biBoNCArIHNhIGxpc3RlKSBlc3BhY8OpZXMgcGFyIGxlIGdhcCDigJQgbGVzXG4gICBzdHlsZXMgaDQvdWwvbGkgdmllbm5lbnQgZHUgcsOpY2FwICg1Nl9zY2VuYXJpby9fcmVjYXBpdHVsYXRpZi5jc3MsIHPDqWxlY3RldXJzIMOpbGFyZ2lzKS4gKi9cbi8qIDI5MnB4ID0gMjczIGQnaWxsdXN0cmF0aW9uICsgbGVzIDE4IGR1IHBhZGRpbmcgKyBsZSB0cmFpdCA6IGMnZXN0IGwnaWxsdXN0cmF0aW9uIHF1aSBjb21tYW5kZVxuICAgbGEgbGFyZ2V1ciBkZSBsYSBjb2xvbm5lIChkw6ljaXNpb24gUE8gMjAyNi0wOC0xNCksIGV0IGxlcyBkZXV4IGFmZmljaGFnZXMgbGEgcGFydGFnZW50IHBvdXIgcXVlXG4gICByaWVuIG5lIGJvdWdlIHF1YW5kIG9uIGJhc2N1bGUgZGUgbCd1biDDoCBsJ2F1dHJlLiAqL1xuLnJlY2FwQ29tcG9zaXRpb24sXG4ucmVjYXBDb21wb3NpdGlvbklsbHVzdHJhdGlvbiB7XG4gICAgZmxleDogMCAwIDI5MnB4O1xuICAgIGJvcmRlci1sZWZ0OiB2YXIoLS1ib3JkZXJDYXJ0ZSk7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1yZXRyYWl0TGlzdGVDb3VydCk7IC8qID0gbGUgcGFkZGluZyBkcm9pdCBkdSBibG9jQ29ycHMgOiB0cmFpdCBjZW50csOpIGVudHJlIGxlcyBkZXV4IHpvbmVzICovXG59XG5cbi8qIExhIGhhdXRldXIgZGVzIGVudHLDqWVzL3NvcnRpZXMgZXN0IFLDiVNFUlbDiUUgOiBiYXNjdWxlciBkJ3VuIGFmZmljaGFnZSDDoCBsJ2F1dHJlIG5lIGRvaXRcbiAgIGTDqXBsYWNlciBhdWN1bmUgY2FydGUgKGTDqWNpc2lvbiBQTyAyMDI2LTA4LTE0KS4gU2FucyDDp2EsIGxhIGNvbG9ubmUgZGljdGUgbGEgaGF1dGV1ciBkdVxuICAgYmxvYyBldCB0b3V0IGNlIHF1aSBzdWl0IHJlbW9udGUgYXUgY2hhbmdlbWVudCBkJ2FmZmljaGFnZSDigJQgb24gY2xpcXVlIGljaSwgw6dhIGJvdWdlXG4gICBhaWxsZXVycy4gQydlc3QgbGEgaGF1dGV1ciBkJ3VuZSBpbGx1c3RyYXRpb24sIHBvdXIgcXVlIGxlcyBkZXV4IHNlIGNvcnJlc3BvbmRlbnQuXG4gICBMZXMgY2FydGVzIGRlIGNoYW5nZW1lbnQgZGUgZm9uZCBlbiBzb250IGV4Y2x1ZXMgOiBwbHVzIGNvdXJ0ZXMgcGFyIG5hdHVyZS5cbiAgIEwnZW1wbGFjZW1lbnQgZCdpbGx1c3RyYXRpb24sIGx1aSwgbmUgcsOpc2VydmUgUklFTiA6IHZpZGUsIGlsIG5lIHByZW5kIGF1Y3VuZSBoYXV0ZXVyXG4gICAoZMOpY2lzaW9uIFBPIDIwMjYtMDgtMTQpIOKAlCB1bmUgY3VlIHJldGlyw6llIG91IHVuZSBzY8OobmUgc2FucyBpbGx1c3RyYXRpb24gZ2FyZGVyYWl0XG4gICBzaW5vbiB1bmUgY2FydGUgZ29uZmzDqWUgcGFyIHVuIHJlY3RhbmdsZSBxdWkgbmUgbW9udHJlIHJpZW4uICovXG4ucmVjYXBCbG9jU2NlbmUgLnJlY2FwQ29tcG9zaXRpb24ge1xuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMjczcHggKiA5IC8gMTYpO1xufVxuXG4ucmVjYXBDb21wb3NpdGlvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogdmFyKC0tZ2FwUmVkdWl0KTtcbn1cblxuLyogTGUgcmF0aW8gZXN0IGltcG9zw6ksIGphbWFpcyBzdWJpIDogdW5lIGNhcHR1cmUgcmVjYWRyw6llIGF1IHBpeGVsIHByw6hzIG4nZXN0IHBhcyB0b3Vqb3Vyc1xuICAgZXhhY3RlbWVudCAxNjo5LCBldCB1bmUgaGF1dGV1ciBxdWkgdmFyaWUgZCd1bmUgY2FydGUgw6AgbCdhdXRyZSBjYXNzZXJhaXQgbCdhbGlnbmVtZW50IGRlXG4gICBsYSBjb2xvbm5lLiBMZSBmaWNoaWVyIGZhaXQgMTAwMHB4IGRlIGxhcmdlIHBvdXIgMjczIGFmZmljaMOpcyA6IGxhIHRhaWxsZSBlc3QgY2VsbGUgZGUgbGFcbiAgIHZpdHJpbmUsIHF1aSBsZXMgbW9udHJlIGJpZW4gcGx1cyBncmFuZGVzIDsgaWNpIGxlIG5hdmlnYXRldXIgcsOpZHVpdCwgcHJvcHJlbWVudC4gKi9cbi5yZWNhcENvbXBvc2l0aW9uSWxsdXN0cmF0aW9uIGltZyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYXNwZWN0LXJhdGlvOiAxNiAvIDk7XG4gICAgb2JqZWN0LWZpdDogY292ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xufVxuXG4vKiBCYXJyZSBkZSBsYSBnYWxlcmllLCBTT1VTIGwnaW1hZ2UgOiBmbMOoY2hlIMK3IHBvaW50cyDCtyBmbMOoY2hlLCDDqXRhbMOpZSBzdXIgdG91dGUgbGEgbGFyZ2V1clxuICAgKGTDqWNpc2lvbiBQTyAyMDI2LTA4LTE0KS4gUmllbiBwYXItZGVzc3VzIGwnaW1hZ2UsIGVsbGUgZXN0IGTDqWrDoCBwZXRpdGUuIExlcyBmbMOoY2hlcyBzb250XG4gICBkZXMgLmN0YURpc2NyZXQgZGFucyBsYSBtw6ptZSAuZGl2QWN0aW9uRmljaGUgcXVlIGxlIGJvdXRvbiDCqyBKb3VlciBsYSBzY8OobmUgwrsgZGUgbGEgZmljaGVcbiAgIHZvaXNpbmUg4oCUIG3Dqm1lIG5pdmVhdSwgbcOqbWUgw6ljYXJ0LiBUb3V0ZSBsYSBiYXJyZSBuJ2FwcGFyYcOudCBxdSfDoCBwYXJ0aXIgZGUgZGV1eFxuICAgaWxsdXN0cmF0aW9ucyA6IGF2ZWMgdW5lIHNldWxlLCBpbCBuJ3kgYSByaWVuIMOgIHBhcmNvdXJpciBuaSDDoCBjb21wdGVyLiAqL1xuLnJlY2FwQ29tcG9zaXRpb25JbGx1c3RyYXRpb24gLmRpdkFjdGlvbkZpY2hlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGdhcDogdmFyKC0tZ2FwRGVmYXV0KTtcbn1cblxuLnJlY2FwSWxsdXN0cmF0aW9uUG9pbnRzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGdhcDogdmFyKC0tZ2FwUmVkdWl0KTtcbn1cblxuLyogVW4gcG9pbnQgcGFyIGlsbHVzdHJhdGlvbiA6IGRpdCBjb21iaWVuIGlsIHkgZW4gYSBldCBvw7kgbCdvbiBlbiBlc3QuIENsaXF1YWJsZSDigJQgYydlc3RcbiAgIGwnYXR0ZW50ZSBkZXZhbnQgdW5lIHBhc3RpbGxlIGRlIGdhbGVyaWUsIGV0IMOnYSDDqXZpdGUgZCdlbmNoYcOubmVyIGxlcyBjbGljcyBkZSBmbMOoY2hlLlxuXG4gICBMZSBCT1VUT04gZXN0IGxhIHpvbmUgZGUgY2xpYyAoMjTDlzI0LCBpbnZpc2libGUpLCBsZSByb25kIG4nZXN0IHF1ZSBzb24gZGVzc2luIDogdmlzZXJcbiAgIHVuIGRpc3F1ZSBkZSAxMHB4IMOgIGxhIHNvdXJpcyBlc3QgcMOpbmlibGUsIGV0IGRldXggem9uZXMgcXVpIHNlIHRvdWNoZW50IGZvbnQgY2xpcXVlciDDoFxuICAgY8O0dMOpLiBEJ2/DuSBsYSBzdXJmYWNlIGfDqW7DqXJldXNlIEVUIGxlIGdhcCBlbnRyZSBlbGxlcyAoZMOpY2lzaW9uIFBPIDIwMjYtMDgtMTQpLiAqL1xuLnJlY2FwSWxsdXN0cmF0aW9uUG9pbnQge1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGhlaWdodDogMjRweDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5yZWNhcElsbHVzdHJhdGlvblBvaW50OjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1jTm9pcjQpOyAvKiAycHggZXQgbm9uIGxhIGJvcmR1cmUgZGUgYm91dG9uIDogdW4gcm9uZCBkZSAxMHB4IGRvaXQgc2Ugdm9pciAqL1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMpO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycywgYm9yZGVyLWNvbG9yIDAuMnM7XG59XG5cbi8qIExlIHBvaW50IHBsZWluIGVzdCBOT0lSLCBwYXMgw6AgbGEgY291bGV1ciBkJ2FjY2VudCAoY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOCkgOiB1biByZXDDqHJlXG4gICBkZSBwb3NpdGlvbiwgcGFzIHVuIGJvdXRvbiBkJ2FjdGlvbiDigJQgdmF1dCBwb3VyIGxhIGdhbGVyaWUgZCdpbGx1c3RyYXRpb25zIGV0IHBvdXIgbGEgYmFycmVcbiAgIGRlIGNob2l4IGR1IGTDqXJvdWzDqSBkJ3VuIHNjw6luYXJpbyAoX2Rlcm91bGUuY3NzKSwgcXVpIHJlcHJlbmQgY2VzIHBvaW50cy4gKi9cbi5yZWNhcElsbHVzdHJhdGlvblBvaW50QWN0aWY6OmJlZm9yZSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY05vaXIxKTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNOb2lyMSk7XG59XG5cbi8qIEwnaWxsdXN0cmF0aW9uIGQnYWJvcmQsIGxlcyBlbnRyw6llcyBldCBzb3J0aWVzIHN1ciBkZW1hbmRlIChkw6ljaXNpb24gUE8gMjAyNi0wOC0xNCkgOiB1bmVcbiAgIGlsbHVzdHJhdGlvbiBwZXJtZXQgZGUgc2UgcHJvamV0ZXIsIHVuZSBsaXN0ZSBkZSBzb3J0aWVzIGVzdCB1bmUgbGVjdHVyZSBkJ2V4cGVydC4gTGUgY2hvaXhcbiAgIG4nZXN0IHBhcyBtw6ltb3Jpc8OpIOKAlCBvbiByZXZpZW50IMOgIGwnaWxsdXN0cmF0aW9uIMOgIGNoYXF1ZSBhcnJpdsOpZS4gTGEgY2xhc3NlIHZpZW50IGR1IHRvZ2dsZVxuICAgZGUgbGEgYmFycmUgZCdhY3Rpb25zICh0b2dnbGVBZmZpY2hhZ2VDYXJ0ZS50cykgOyBsZXMgY2FydGVzIGRlIGNoYW5nZW1lbnQgZGUgZm9uZCBuZVxuICAgc29udCBwYXMgY29uY2VybsOpZXMsIGxldXIgY29sb25uZSB2aWRlIHJlc3RlIGV0IHRpZW50IGxhIGfDqW9tw6l0cmllLiAqL1xuLnJlY2FwQmxvY1NjZW5lIC5yZWNhcENvbXBvc2l0aW9uIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4ubW9kaWZpZXJTY2VuYXJpb0FmZmljaGVFbnRyZWVzIC5yZWNhcENvbXBvc2l0aW9uSWxsdXN0cmF0aW9uIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4ubW9kaWZpZXJTY2VuYXJpb0FmZmljaGVFbnRyZWVzIC5yZWNhcEJsb2NTY2VuZSAucmVjYXBDb21wb3NpdGlvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLyogTGUgdG9nZ2xlIG9jY3VwZSBsYSBkcm9pdGUgZGUgbGEgYmFycmUsIGxlcyBkZXV4IGJvdXRvbnMgcmVzdGVudCDDoCBnYXVjaGUuICovXG4uZGl2QWN0aW9uTW9kaWZpZXJTY2VuYXJpbyAudG9nZ2xlU2NlbmVHcm91cGUge1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xufVxuXG4vKiDDiWNyYW4gw6l0cm9pdCA6IG9uIG5lIHLDqWR1aXQgcGFzLCBvbiByZXRpcmUgKGTDqWNpc2lvbiBQTyAyMDI2LTA4LTE0KS4gTGEgY29sb25uZSBkZVxuICAgZHJvaXRlIHBhc3PDqWUgc291cyBsZSBjb250ZW51IHMnw6l0aXJhaXQgc3VyIHRvdXRlIGxhIGxhcmdldXIg4oCUIHVuZSBpbGx1c3RyYXRpb24gMTY6OSBnw6lhbnRlLFxuICAgZXQgZGVzIGVudHLDqWVzL3NvcnRpZXMgcXVpIG4nb250IHJpZW4gZCd1biBjb250ZW51IGRlIHByZW1pw6hyZSBsZWN0dXJlLiBOaSBsJ3VuIG5pXG4gICBsJ2F1dHJlLCBkb25jLCBldCBwYXMgZGUgdG9nZ2xlIG5vbiBwbHVzIDogaWwgbmUgY29tbWFuZGVyYWl0IHBsdXMgcmllbi4gUmVzdGUgbGFcbiAgIGNhcnRlIDogc2EgdHVpbGUsIHNvbiB0aXRyZSwgc29uIHRleHRlLiBNw6ptZSBzZXVpbCBxdWUgbGUgbnVtw6lybyBkZSBwbGFjZSBldCBsZSByZXDDqHJlXG4gICBkZSBkw6lmaWxlbWVudCwgcXVpIGRpc3BhcmFpc3NlbnQgaWNpIGF1c3NpIOKAlCBsYSBwYWdlIHNlIHNpbXBsaWZpZSBkJ3VuIGJsb2MuXG4gICBMJ0lEIGVzdCBuw6ljZXNzYWlyZSA6IHNhbnMgbHVpLCBsYSByw6hnbGUgcXVpIE1PTlRSRSBsZXMgZW50csOpZXMgZW4gbW9kZSDCqyBlbnRyw6llcyDCu1xuICAgKC5tb2RpZmllclNjZW5hcmlvQWZmaWNoZUVudHJlZXMgLnJlY2FwQmxvY1NjZW5lIC5yZWNhcENvbXBvc2l0aW9uKSBsJ2VtcG9ydGVyYWl0LCBldFxuICAgbGEgY29sb25uZSByZXZpZW5kcmFpdCDDoCBxdWkgYSBiYXNjdWzDqSBhdmFudCBkZSByw6lkdWlyZSBzYSBmZW7DqnRyZS4gKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCkge1xuICAgICNtb2RpZmllclNjZW5hcmlvIC5yZWNhcENvbXBvc2l0aW9uLFxuICAgICNtb2RpZmllclNjZW5hcmlvIC5yZWNhcENvbXBvc2l0aW9uSWxsdXN0cmF0aW9uLFxuICAgIC5kaXZBY3Rpb25Nb2RpZmllclNjZW5hcmlvIC50b2dnbGVTY2VuZUdyb3VwZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuXG4vKiDilIDilIAgTnVtw6lybyBkZSBwbGFjZSwgZGFucyBsYSBtYXJnZSBlbiByZWdhcmQgZGUgY2hhcXVlIGNhcnRlIChkw6ljaXNpb24gUE8gMjAyNi0wOC0xNCkg4pSA4pSAXG4gICBEb3V6ZSBjYXJ0ZXMgc2UgcmVzc2VtYmxlbnQgZW4gZMOpZmlsYW50IDogbGUgbnVtw6lybyBkaXQgb8O5IGwnb24gZW4gZXN0LiBJbCB2aXQgZGFucyBsYVxuICAgcmFuZ8OpZSwgUEFTIGRhbnMgbGEgY2FydGUgOiAuYmxvYyBjb3VwZSBjZSBxdWkgZMOpcGFzc2UgKG92ZXJmbG93IGhpZGRlbiksIGV0IGxhIGNhcnRlXG4gICBnYXJkZSBhaW5zaSBzYSBnw6lvbcOpdHJpZSBhdSBwaXhlbCBwcsOocy4gTcOqbWUgZ291dHRpw6hyZSwgbcOqbWUgZ3JpcyBldCBtw6ptZSBjaGFzc2UgcXVlIGxlXG4gICByZXDDqHJlIGRlIGTDqWZpbGVtZW50IDogdW4gc2V1bCBsYW5nYWdlIGRlIGNoaWZmcmVzIGRhbnMgY2V0dGUgbWFyZ2UuICovXG4ubW9kaWZpZXJTY2VuYXJpb1JhbmdlZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4ubW9kaWZpZXJTY2VuYXJpb051bWVybyB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogLTM2cHg7XG4gICAgdG9wOiAxNnB4OyAvKiA9IHBhZGRpbmcgaGF1dCBkdSBibG9jQ29ycHMgOiBsZSBudW3DqXJvIHMnYWxpZ25lIHN1ciBsYSByYW5nw6llIGRlIHR1aWxlcyAqL1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBmb250OiB2YXIoLS1mTWVudTE0KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXI1KTtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDkwMHB4KSB7XG4gICAgLm1vZGlmaWVyU2NlbmFyaW9OdW1lcm8ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG5cbi8qIOKUgOKUgCBSZXDDqHJlIGRlIGTDqWZpbGVtZW50IChtYXJnZSBnYXVjaGUgZHUgc2PDqW5hcmlvLCBkw6ljaXNpb24gUE8gMjAyNi0wOC0xNCkg4pSA4pSAXG4gICBTYSB6b25lIGxvbmdlIGxlIHN0ZXBwZXIgc3VyIHRvdXRlIHNhIGhhdXRldXIsIGRhbnMgbGUgcGFkZGluZyBnYXVjaGUgZGUgLmNvbnRlbnUgKDQwcHgpIDpcbiAgIGxlIHJlcMOocmUgbmUgcmVjb3V2cmUgZG9uYyBhdWN1bmUgY2FydGUsIGV0IHNlIGNhbGUgc3VyIGxlIHNjw6luYXJpbyBxdWVsbGUgcXVlIHNvaXQgbGFcbiAgIGxhcmdldXIgZGUgbGEgZmVuw6p0cmUuIExlIHJlcMOocmUgeSBlc3QgU1RJQ0tZIDogaWwgY29sbGUgYXUgYmFzIGRlIGxhIGZlbsOqdHJlIHRhbnQgcXUnaWxcbiAgIHJlc3RlIGRlcyBjYXJ0ZXMsIHB1aXMgcydhcnLDqnRlIMOgIGxhIGZpbiBkdSBzY8OpbmFyaW8g4oCUIGF1IGJhcyBkZSBsYSBQQUdFIGlsIHNlIHJldHJvdXZlcmFpdFxuICAgw6AgY8O0dMOpIGRlcyBDVEEsIG/DuSBpbCBuJ2EgcmllbiDDoCBmYWlyZS4gU291cyA5MDBweCBsYSBwYWdlIG4nYSBwbHVzIGRlIG1hcmdlIMOgIGx1aSBkb25uZXJcbiAgIChsYSBjb2xvbm5lIHLDqWNhcCBwYXNzZSBkw6lqw6Agc291cyBsZSBjb250ZW51KSA6IG1hc3F1w6kuICovXG4jbW9kaWZpZXJTY2VuYXJpbyAucmVjYXBTdGVwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbiNpbmRpY2F0ZXVyRGVmaWxlbWVudFpvbmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogLTM2cHg7XG4gICAgd2lkdGg6IDMycHg7XG59XG5cbi8qIFBsYWNlIG5hdHVyZWxsZSBkdSByZXDDqHJlIDogbGUgQkFTIGRlIGxhIHpvbmUsIGQnb8O5IGxlIHN0aWNreSBsZSByZW1vbnRlIGF1IGJhcyBkZSBsYVxuICAgZmVuw6p0cmUgdGFudCBxdWUgbGUgc2PDqW5hcmlvIGNvbnRpbnVlLiBQb3PDqSBlbiBoYXV0LCBpbCBuJ2F1cmFpdCByaWVuIMOgIHJlbW9udGVyIDogbGVcbiAgIHN0aWNreSBuZSByZXRpZW50IHVuIMOpbMOpbWVudCBxdWUgdmVycyBzYSBjb250cmFpbnRlLCBpbCBuZSBsZSBwb3Vzc2UgamFtYWlzIHBsdXMgbG9pbi4gKi9cbkBtZWRpYSAobWluLXdpZHRoOiA5MDBweCkge1xuICAgICNpbmRpY2F0ZXVyRGVmaWxlbWVudFpvbmUge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbn1cblxuI2luZGljYXRldXJEZWZpbGVtZW50Om5vdChbaGlkZGVuXSkge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAvKiBBdS1kZXNzdXMgZGUgbGEgYmFycmUgZCdhY3Rpb25zIGNvbGxhbnRlLCBqYW1haXMgw6AgaGF1dGV1ciBkZXMgYm91dG9ucyAoZMOpY2lzaW9uXG4gICAgICAgUE8gMjAyNi0wOC0xNCkuIC0taGF1dGV1ckJhcnJlQWN0aW9uIGVzdCBtZXN1csOpZSBwYXIgYmFycmVBY3Rpb25Db2xsYW50ZS50cyA7IGxlXG4gICAgICAgcmVwbGkgw6AgMHB4IHZhdXQgbGUgdGVtcHMgZGUgbGEgcHJlbWnDqHJlIG1lc3VyZS4gKi9cbiAgICBib3R0b206IGNhbGModmFyKC0taGF1dGV1ckJhcnJlQWN0aW9uLCAwcHgpICsgdmFyKC0tZ2FwTGFyZ2UpKTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwOyAvKiBsJ2VzcGFjZSB2aWVudCBkdSBwYWRkaW5nIGRlcyBib3V0b25zLCBxdWkgZXN0IGF1c3NpIGxldXIgY2libGUgZGUgY2xpYyAqL1xuICAgIC8qIExlIGdyaXMgZGVzIGJvcmR1cmVzIGRlIGNhcnRlcyA6IHVuIHJlcMOocmUgZGUgbGVjdHVyZSBuZSBww6hzZSBwYXMgcGx1cyBxdWUgbGVcbiAgICAgICBjb250ZW51IHF1J2lsIHNlcnQgKGTDqWNpc2lvbiBQTyAyMDI2LTA4LTE0KS4gKi9cbiAgICBjb2xvcjogdmFyKC0tY05vaXI1KTtcbiAgICAvKiBGb25kIGRlIHBhZ2Ugb3BhcXVlIDogbGVzIG51bcOpcm9zIGRlIHBsYWNlIGTDqWZpbGVudCBERVJSScOIUkUgbGUgcmVww6hyZSwgaWxzIG5lXG4gICAgICAgdmllbm5lbnQgcGFzIHNlIHN1cGVycG9zZXIgw6AgbHVpLiAqL1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCYWNrZ3JvdW5kKTtcbiAgICBwYWRkaW5nOiB2YXIoLS1nYXBSZWR1aXQpIDA7XG59XG5cbi8qIEVuZmFudCBkaXJlY3QgPSBsYSBzb3VyaXMgOyBsZXMgY2hldnJvbnMgdml2ZW50IGRhbnMgbGVzIGJvdXRvbnMuICovXG4jaW5kaWNhdGV1ckRlZmlsZW1lbnQgPiBzdmcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAyMnB4O1xufVxuXG4vKiBCb3V0b24gbnUsIG1haXMgY2libGUgTEFSR0UgOiBsZSBjaGV2cm9uIG5lIGZhaXQgcXVlIDEyw5c4LCBvbiBuZSB2aXNlIHBhcyDDp2Egw6AgbGFcbiAgIHNvdXJpcy4gTGUgYm91dG9uIHByZW5kIHRvdXRlIGxhIGdvdXR0acOocmUgZXQgcydvdXZyZSBlbiBoYXV0ZXVyIOKAlCBjJ2VzdCBzb24gcGFkZGluZyBxdWlcbiAgIGZhaXQgYXVzc2kgbCdlc3BhY2UganVzcXUnw6AgbGEgc291cmlzIChkJ2/DuSBsZSBnYXAgMCBkdSBjb250ZW5ldXIpIDogbGEgY2libGUgZ3JhbmRpdCxcbiAgIGxlIGRlc3NpbiBuZSBib3VnZSBwYXMuIExhIGNvdWxldXIgQ1RBIG4nYXJyaXZlIHF1J2F1IHN1cnZvbCwgcXVhbmQgbGUgcmVww6hyZSBkZXZpZW50XG4gICB1bmUgYWN0aW9uLiAqL1xuLmluZGljYXRldXJEZWZpbGVtZW50QWN0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgcGFkZGluZzogdmFyKC0tZ2FwRGVmYXV0KSAwO1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xufVxuXG4uaW5kaWNhdGV1ckRlZmlsZW1lbnRBY3Rpb246aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgIGNvbG9yOiB2YXIoLS1jQWNjZW50Myk7XG59XG5cbi8qIEJvdXQgZGUgY291cnNlIDogbGUgY2hldnJvbiBzJ2VmZmFjZSwgc2EgcGxhY2UgcmVzdGUgKGTDqWNpc2lvbiBQTyAyMDI2LTA4LTE0IOKAlCBwYXMgZGVcbiAgIGZsw6hjaGUgcXVpIG5lIG3DqG5lIG51bGxlIHBhcnQsIG1haXMgcGFzIGRlIHNvdXJpcyBxdWkgc2F1dGUgbm9uIHBsdXMpLiAqL1xuLmluZGljYXRldXJEZWZpbGVtZW50QWN0aW9uOmRpc2FibGVkIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi5pbmRpY2F0ZXVyRGVmaWxlbWVudENoZXZyb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMnB4O1xufVxuXG4vKiBBbGlnbsOpcyDDoCBnYXVjaGUsIGNvbW1lIHRvdXRlIGJhcnJlIGQnYWN0aW9uIChkw6ljaXNpb24gUE8gMjAyNi0wNy0xOCA6IHBhc1xuICAgZCdhbGlnbmVtZW50IHF1aSB2YXJpZSBkJ3VuZSBiYXJyZSDDoCBsJ2F1dHJlKS5cblxuICAgQ29sbMOpZSBhdSBiYXMgZGUgbGEgZmVuw6p0cmUgdGFudCBxdWUgc2EgdnJhaWUgcGxhY2UgZXN0IHBsdXMgYmFzLCBwb3PDqWUgZGFucyBsZSBmbHV4XG4gICBkw6hzIHF1J29uIGwnYXR0ZWludCAoZMOpY2lzaW9uIFBPIDIwMjYtMDgtMTQpIDogbGEgcGFnZSBlc3QgdW5lIHBhZ2UgZCdhdHRlcnJpc3NhZ2UsXG4gICBsZSB2aXNpdGV1ciBxdWkgYXJyaXZlIGRvaXQgdm9pciDCqyBKb3VlciBsZSBzY8OpbmFyaW8gwrsgc2FucyBhdm9pciByaWVuIGTDqWZpbMOpLiBFbiBiYXNcbiAgIGV0IHBhcyBlbiBoYXV0LCBwYXJjZSBxdWUgY2VzIGJvdXRvbnMgYWdpc3NlbnQgc3VyIGNlIHF1aSBsZXMgcHLDqWPDqGRlIOKAlCBsZSBsaWVuIHBvcnRlXG4gICBsZSA/cmVtcGxhY2VyPSBjb25zdHJ1aXQgw6AgcGFydGlyIGRlcyB0dWlsZXMgY2hvaXNpZXMuXG5cbiAgIExlIHN0aWNreSByZW1vbnRlIGwnw6lsw6ltZW50IHZlcnMgc2EgY29udHJhaW50ZSwgaWwgbmUgbGUgcG91c3NlIGphbWFpcyA6IMOnYSBtYXJjaGUgaWNpXG4gICBwYXJjZSBxdWUgc2EgcGxhY2UgbmF0dXJlbGxlIGVzdCBEw4lKw4AgbGUgYmFzIGRlICNtb2RpZmllclNjZW5hcmlvLiBMZSBwYWRkaW5nIHJlbXBsYWNlXG4gICBsJ2FuY2llbiBtYXJnaW4tdG9wIHBvdXIgcXVlIGxlIGZvbmQgY291dnJlIGF1c3NpIGwnYWlyIGF1LWRlc3N1cyBkZXMgYm91dG9ucy4gKi9cbi5kaXZBY3Rpb25Nb2RpZmllclNjZW5hcmlvIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgYm90dG9tOiAwO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiB2YXIoLS1nYXBEZWZhdXQpO1xuICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdDb3JwcykgMDtcbn1cblxuLyogVW4gQ1RBIG5lIHNlIGNvbXByaW1lIHBhcyA6IHNhbnMgw6dhLCB0b3V0IGNlIHF1J29uIGFqb3V0ZSBkYW5zIGxhIGJhcnJlIMOpY3Jhc2UgbGVzXG4gICBkZXV4IGJvdXRvbnMgZXQgY2Fzc2UgbGV1ciBsaWJlbGzDqSBzdXIgZGV1eCBsaWduZXMuICovXG4uZGl2QWN0aW9uTW9kaWZpZXJTY2VuYXJpbyA+ICoge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4vKiBGb25kIGV0IHRyYWl0IHZvbnQgZCd1biBib3JkIMOgIGwnYXV0cmUgZGUgbGEgUEFHRSDigJQgbGEgbGFyZ2V1ciBkZSAjYm9keVBhZ2UsIHBhcyBjZWxsZVxuICAgZGUgbCfDqWNyYW4gOiBsZSBoYXV0IGRlIHBhZ2UgZmFpdCBleGFjdGVtZW50IMOnYSwgc2FucyBlZmZvcnQsIHBhcmNlIHF1J2lsIGVzdCBlbmZhbnRcbiAgIGRpcmVjdCBkZSAjYm9keVBhZ2UgKGTDqWNpc2lvbiBQTyAyMDI2LTA4LTE0KS4gTGEgYmFycmUsIGVsbGUsIHZpdCBkYW5zIC5jb250ZW51IDogbGVcbiAgIHBzZXVkby3DqWzDqW1lbnQgcmF0dHJhcGUgZG9uYyBzb24gcGFkZGluZyBob3Jpem9udGFsLCBldCByaWVuIGRlIHBsdXMuIENlIGTDqWJvcmRlbWVudFxuICAgY291dnJlIGF1IHBhc3NhZ2UgbGEgZ291dHRpw6hyZSBkZSBnYXVjaGUsIHNpbm9uIGxlcyBudW3DqXJvcyBkZSBwbGFjZSBkZXMgY2FydGVzIHF1aVxuICAgcGFzc2VudCBkZXNzb3VzIHJlc3RlcmFpZW50IMOgIGTDqWNvdXZlcnQgc291cyBsZSB0cmFpdC4gRm9uZCBvcGFxdWUgb2JsaWdhdG9pcmUgOiBzYW5zXG4gICBsdWkgbGVzIGNhcnRlcyBkw6lmaWxlbnQgZW4gdHJhbnNwYXJlbmNlIHNvdXMgbGVzIGJvdXRvbnMuXG4gICBMZXMgLTQwcHgvLTIwcHggc29udCBsZSBwYWRkaW5nIGRlIC5jb250ZW51ICgzMF9iYXNlLmNzcykgYXUgc2lnbmUgcHLDqHMgOiBsZXMgZGV1eFxuICAgdmFsZXVycyBjaGFuZ2VudCBlbnNlbWJsZS4gKi9cbi5kaXZBY3Rpb25Nb2RpZmllclNjZW5hcmlvOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAtMTtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IC00MHB4O1xuICAgIHJpZ2h0OiAtNDBweDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmFja2dyb3VuZCk7XG59XG5cbi8qIMOJcGluZ2zDqWUgOiBlbGxlIGZsb3R0ZSBhdS1kZXNzdXMgZGVzIGNhcnRlcywgdW4gdHJhaXQgbCdlbiBkw6l0YWNoZS4gUG9zw6llIGVuIGJhcyBkdVxuICAgc2PDqW5hcmlvLCBlbGxlIGVzdCDDoCBzYSBwbGFjZSBldCBuZSB0cmFuY2hlIHJpZW4g4oCUIGxhIGNsYXNzZSBlc3QgcG9zw6llIHBhclxuICAgYmFycmVBY3Rpb25Db2xsYW50ZS50cywgYXVjdW4gc8OpbGVjdGV1ciBDU1MgbmUgZGlzdGluZ3VlIGxlcyBkZXV4IMOpdGF0cy4gKi9cbi5kaXZBY3Rpb25Nb2RpZmllclNjZW5hcmlvQ29sbGVlOjpiZWZvcmUge1xuICAgIGJvcmRlci10b3A6IHZhcigtLWJvcmRlcik7XG59XG5cbi8qIEZvbmR1IGF1LWRlc3N1cyBkZSBsYSBiYXJyZSDDqXBpbmdsw6llIChkw6ljaXNpb24gUE8gMjAyNi0wOC0xNCkgOiBsYSBjb3VwdXJlIG5ldHRlIGR1XG4gICBjb250ZW51IMOpdGFpdCBicnV0YWxlLCBldCBsZSBjb250ZW51IHF1aSBzJ2VmZmFjZSBhdSBsaWV1IGRlIHMnYXJyw6p0ZXIgZGl0IHF1J2lsIGVuXG4gICByZXN0ZSBkZXNzb3VzLiBEaXNwYXJhw650IGVuIG3Dqm1lIHRlbXBzIHF1ZSBsZSB0cmFpdCwgcXVhbmQgbGEgYmFycmUgc2UgcG9zZSA6IGzDoCwgaWxcbiAgIG4neSBhIHBsdXMgcmllbiDDoCBlc3RvbXBlci4gRGV2YW50IGxlIGNvbnRlbnUsIGRvbmMgcGFzIGRlIHotaW5kZXggbsOpZ2F0aWYgaWNpIOKAlFxuICAgbCdvcmRyZSBkdSBET00gc3VmZml0IDsgcG9pbnRlci1ldmVudHM6IG5vbmUsIGlsIG5lIG1hbmdlIHBhcyBsZXMgY2xpY3MgZGVzIGNhcnRlcy4gKi9cbi5kaXZBY3Rpb25Nb2RpZmllclNjZW5hcmlvQ29sbGVlOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogMTAwJTtcbiAgICBsZWZ0OiAtNDBweDtcbiAgICByaWdodDogLTQwcHg7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byB0b3AsIHZhcigtLWNCYWNrZ3JvdW5kKSwgdHJhbnNwYXJlbnQpO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4vKiBNaXJvaXIgZGUgbGEgbWVkaWEgcXVlcnkgZGUgLmNvbnRlbnUgKDMwX2Jhc2UuY3NzKSA6IHNvbiBwYWRkaW5nIHRvbWJlIMOgIDIwcHgsIGxlXG4gICBkw6lib3JkZW1lbnQgZGVzIGRldXggcHNldWRvLcOpbMOpbWVudHMgYXZlYyBsdWkg4oCUIHNpbm9uIGxhIGJhcnJlIHNvcnQgZGUgbGEgcGFnZS4gKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCkge1xuICAgIC5kaXZBY3Rpb25Nb2RpZmllclNjZW5hcmlvOjpiZWZvcmUsXG4gICAgLmRpdkFjdGlvbk1vZGlmaWVyU2NlbmFyaW9Db2xsZWU6OmFmdGVyIHtcbiAgICAgICAgbGVmdDogLTIwcHg7XG4gICAgICAgIHJpZ2h0OiAtMjBweDtcbiAgICB9XG59XG5cbi8qIEPDlFTDiSBTVFVESU8sIMKrIENyw6llciB2b3RyZSDDqXbDqW5lbWVudCDCuyB2aXQgZGFucyB1biA8Zm9ybT4gKGlsIFBPU1RlIGxhIGNvbXBvc2l0aW9uXG4gICBgcmVtcGxhY2VyYCkuIGRpc3BsYXk6Y29udGVudHMgZWZmYWNlIGxhIGJvw650ZSBkdSBmb3JtIDogbGUgZ2FwIGRlIGxhIGJhcnJlIHMnYXBwbGlxdWUgYXV4XG4gICBib3V0b25zIGV1eC1tw6ptZXMgKG3Dqm1lIHNvbHV0aW9uIHF1ZSBsZSBjYXRhbG9ndWUpLlxuICAgQ8O0dMOpIFZJVFJJTkUsIGxlIG3Dqm1lIGJvdXRvbiBlc3QgdW4gPGE+IHF1aSBwb3J0ZSBsYSBjb21wb3NpdGlvbiBkYW5zIHNvbiBocmVmIChsZSBwYXJjb3Vyc1xuICAgcGFzc2UgcGFyIGxhIGNvbm5leGlvbiwgcXVpIG5lIHJldmllbnQgcXUnZW4gR0VUKSA6IHBhcyBkZSBmb3JtLCBkb25jIHJpZW4gw6AgZWZmYWNlciDigJQgaWxcbiAgIGVzdCBkw6lqw6AgZW5mYW50IGRpcmVjdCBkZSBsYSBiYXJyZS4gKi9cbi5kaXZBY3Rpb25Nb2RpZmllclNjZW5hcmlvIGZvcm0ge1xuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xufVxuXG4vKiDCqyBDcsOpZXIgY2V0IMOpdsOpbmVtZW50IMK7IDogc2V1bGUgYWN0aW9uIHByaW1haXJlIGRlIGxhIHBhZ2Ug4oCUIHNpbGhvdWV0dGUgLmN0YTE0IGV0IHLDtGxlXG4gICAuY3RhUHJpbWFpcmUgKDMxX2N0YS5jc3MpLCBlbiBibGV1IGFkbWluaXN0cmF0aW9uICguYWNjZW50QWRtaW5pc3RyYXRpb24sIDEwX2ZvbnQuY3NzKSA6XG4gICBwbHVzIGF1Y3VuZSBjb3VsZXVyIMOpY3JpdGUgaWNpIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNiwgYXZhbnQgOiBjbGFzc2UgbG9jYWxlXG4gICAuY3RhTW9kaWZpZXJTY2VuYXJpb0NyZWVyKS4gwqsgQXBlcsOndSDCuyBxdWkgbGUgc3VpdCBlc3QgdW4gLmN0YURpc2NyZXQgbmV1dHJlLCBsZSBtw6ptZSBxdWVcbiAgIGxlIGNhdGFsb2d1ZSAoZMOpY2lzaW9uIFBPIDIwMjYtMDctMTgpLiAqL1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFLDiUNBUElUVUxBVElGIFNDw4lOQVJJTyAoc3RlcHBlciB2ZXJ0aWNhbClcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIENvbnRhaW5lciBkdSBzdGVwcGVyICovXG4ucmVjYXBTdGVwcGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwO1xufVxuI3NjZW5hcmlvUGFubmVhdSAucmVjYXBTdGVwcGVyID4gLnJlY2FwQWN0aW9ucyArIC5yZWNhcEJsb2Mge1xuICAgIG1hcmdpbi10b3A6IDMycHg7XG59XG5cbi8qIENvbm5lY3RldXIgdmVydGljYWwgZW50cmUgbGVzIGJsb2NzICovXG4ucmVjYXBDb25uZWN0ZXVyIHtcbiAgICB3aWR0aDogM3B4O1xuICAgIGhlaWdodDogMjRweDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMwMyk7XG4gICAgbWFyZ2luLWxlZnQ6IDIwcHg7XG59XG5cbi8qIEJsb2MgaW5kaXZpZHVlbCBkdSBzdGVwcGVyICovXG4ucmVjYXBCbG9jIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xuICAgIGJvcmRlcjogdmFyKC0tYm9yZGVyQ2FydGUpO1xuICAgIG1pbi1oZWlnaHQ6IDY2cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLyogVGl0cmUgZHUgYmxvYyAoaDMpICovXG4ucmVjYXBCbG9jIGgzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiB2YXIoLS1nYXBNb3llbik7IC8qIGFsaWduw6kgMTAgLT4gMTJweCAow6ljaGVsbGUgUE8gMjAyNi0wNy0xOCkgKi9cbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nUmVjYXApO1xuICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgIGZvbnQ6IHZhcigtLWZINCk7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4vKiDDiXRpcXVldHRlcyBkdSByw6ljYXAgOiB1biBTRVVMIHN0eWxlLCBxdSdlbGxlcyBzb2llbnQgY2xpcXVhYmxlcyAoPGE+LzxidXR0b24+IGVuIG1vZGVcbiAgIFByw6lwYXJlciAvIHByb2dyZXNzaW9uKSBvdSBzdGF0aXF1ZXMuIEZvbmQgY2xhaXIgZGUgY2F0w6lnb3JpZSwgdGV4dGUgbm9pciwgYm9yZHVyZSBsw6lnw6hyZVxuICAgKGNob2l4IFBPIDIwMjYtMDctMjAgOiBwbHVzIGRlIHBhc3RpbGxlIGZvbmPDqWUgw6AgdGV4dGUgYmxhbmMg4oCUIGwnb25nbGV0IERpZmZ1c2VyIGZhaXQgZm9pKS5cbiAgIC5yZWNhcFRhZ1NvcnRpZSA9IGJsYW5jLCBsYSBjb3VsZXVyIGR1IMKrIHByb2R1aXQgZCd1bmUgc2PDqG5lIMK7IChjb25zZXJ2w6llIGVuIGVudHLDqWUpLlxuICAgLnJlY2FwVGFnU29ydGllU2Vjb25kYWlyZSA9IHNvcnRpZSBkw6ljbGFyw6llIGBzZWNvbmRhaXJlYCBwYXIgbGUgY29udHJhdCBkJ3VuZSBzY8OobmUsIGVuXG4gICByZXRyYWl0IOKAlCBwYWdlIGQndW5lIHNjw6huZSBzZXVsZW1lbnQgKFZpdHJpbmUpIDogdW4gc2PDqW5hcmlvIG4nYWZmaWNoZSBwYXMgc2VzIHNvcnRpZXNcbiAgIGludXRpbGlzw6llcyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTYpLiAqL1xuLnJlY2FwVGFnR3JvdXBlcyxcbi5yZWNhcFRhZ0Rpc3RyaWJ1dGlvbnMsXG4ucmVjYXBUYWdTb3J0aWUsXG4ucmVjYXBUYWdTb3J0aWVTZWNvbmRhaXJlLFxuLnJlY2FwTGllbkdyb3VwZXMsXG4ucmVjYXBMaWVuRGlzdHJpYnV0aW9ucyB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbjogMnB4IDA7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0V0aXF1ZXR0ZSk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjApO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuLnJlY2FwVGFnU29ydGllU2Vjb25kYWlyZSB7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyNCk7XG59XG5cbi5yZWNhcFRhZ0dyb3VwZXMsXG4ucmVjYXBMaWVuR3JvdXBlcyB7IGJhY2tncm91bmQ6IHZhcigtLWNBY2NlbnQxKTsgfVxuXG4ucmVjYXBUYWdEaXN0cmlidXRpb25zLFxuLnJlY2FwTGllbkRpc3RyaWJ1dGlvbnMgeyBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50MSk7IH1cblxuLyogVGl0cmUgZCdhbmltYXRpb24vYWZmaWNoYWdlIGNsaXF1YWJsZSAobW9kZSBQcsOpcGFyZXIpIDogbGllbiBzb2JyZSwgc2FucyBwYXN0aWxsZSBjb2xvcsOpZSxcbiAgIHBvdXIgbmUgcGFzIHBlcnR1cmJlciBsYSBsZWN0dXJlIOKAlCBtw6ptZSBzb2JyacOpdMOpIHF1ZSBsZSB0aXRyZSBub24gY2xpcXVhYmxlIGRlIGxhIHByb2dyZXNzaW9uLiAqL1xuLnJlY2FwTGllblNjZW5lcyxcbi5yZWNhcExpZW5BZmZpY2hhZ2VzIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLyogQWZmb3JkYW5jZSDCqyBjbGlxdWFibGUgwrsgOiBzb3VsaWduZW1lbnQgYXUgc3Vydm9sICjDqXRpcXVldHRlcyBkJ2VudHLDqWUgKyB0aXRyZXMpICovXG4ucmVjYXBMaWVuR3JvdXBlczpob3Zlcixcbi5yZWNhcExpZW5EaXN0cmlidXRpb25zOmhvdmVyLFxuLnJlY2FwTGllblNjZW5lczpob3Zlcixcbi5yZWNhcExpZW5BZmZpY2hhZ2VzOmhvdmVyIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuLyogU291cy10aXRyZSBkYW5zIGxlIGJsb2MgKGg0KSDigJQgw6lsYXJnaSDDoCBsYSBjb2xvbm5lIHLDqWNhcCBkZSBjb21wb3NpdGlvblxuICAgKDU1X3NjZW5hcmlvTW9kaWZpZXIuY3NzKSwgcXVpIHJlcHJlbmQgbGEgZ3JhbW1haXJlIGR1IHLDqWNhcCBob3JzIHBhbm5lYXUuICovXG4ucmVjYXBCbG9jIGg0LFxuLnJlY2FwQ29tcG9zaXRpb24gaDQge1xuICAgIGZvbnQ6IHZhcigtLWZINCk7XG4gICAgbWFyZ2luOiAwO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xufVxuXG4vKiBMaXN0ZXMgw6AgcHVjZXMgZGFucyBsZSBibG9jICovXG4ucmVjYXBCbG9jIHVsLFxuLnJlY2FwQ29tcG9zaXRpb24gdWwge1xuICAgIG1hcmdpbjogNHB4IDA7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1yZXRyYWl0TGlzdGVDb3VydCk7XG59XG5cbi8qIENvbG9ubmUgcsOpY2FwIGRlIGNvbXBvc2l0aW9uIChsYXJnZXVyIGZpeGUgw6l0cm9pdGUpIDogcGFzIGRlIHB1Y2VzIOKAlCBjaGFxdWUgbGlnbmVcbiAgIGVzdCBkw6lqw6AgdW4gdGFnIOKAlCBldCB1biDCqyDDiXRpcXVldHRlIDogTGFiZWwgwrsgbmUgc2UgcGxpZSBKQU1BSVMgc3VyIGRldXggbGlnbmVzXG4gICAoZMOpY2lzaW9uIFBPIDIwMjYtMDgtMTEpIDsgYXUtZGVsw6AgZGUgbGEgY29sb25uZSwgZWxsaXBzZS4gKi9cbi5yZWNhcENvbXBvc2l0aW9uIHVsIHtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHBhZGRpbmctbGVmdDogMDtcbn1cblxuLnJlY2FwQ29tcG9zaXRpb24gLnJlY2FwVGFnR3JvdXBlcyxcbi5yZWNhcENvbXBvc2l0aW9uIC5yZWNhcFRhZ1NvcnRpZSxcbi5yZWNhcENvbXBvc2l0aW9uIC5yZWNhcFRhZ1NvcnRpZVNlY29uZGFpcmUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLnJlY2FwQmxvYyBsaSxcbi5yZWNhcENvbXBvc2l0aW9uIGxpIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuLyogRMOpdGFpbHMgZHUgYmxvYyAqL1xuLnJlY2FwQmxvY0RldGFpbCB7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ1JlY2FwKTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0tZ2FwUmVkdWl0KTtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuLnJlY2FwQmxvY0RldGFpbCBwIHtcbiAgICBtYXJnaW46IDJweCAwO1xufVxuXG4ucmVjYXBCbG9jRGV0YWlsIGhyIHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyQ2FydGUpO1xuICAgIG1hcmdpbjogMjBweCAwO1xufVxuXG4vKiBJY8O0bmUgZGUgbCdhbmltYXRpb24gZW4gcmFwcGVsIGRhbnMgbGUgY29pbiBoYXV0LWRyb2l0IGR1IGJsb2MuXG4gICBDYXNlIDgwIGV0IDhweCBkJ2FpciA6IGRlc3NpbiA2NCwgbGEgZ3JhbmRlIGRlcyBkZXV4IHRhaWxsZXMgZHUgcHJvamV0ICg1NF9pY29uZXMuY3NzKS5cbiAgIEhvcnMgZmx1eCAoYWJzb2x1dGUpIHBvdXIgbmUgcGFzIGdvbmZsZXIgbGEgaGF1dGV1ciBkdSB0aXRyZSDigJQgY2Fsw6llIHN1ciBsZSBwYWRkaW5nIGR1IGgzLiAqL1xuLnJlY2FwVGl0cmVJY29uZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICB3aWR0aDogODBweDtcbiAgICBoZWlnaHQ6IDgwcHg7XG4gICAgcGFkZGluZzogdmFyKC0tZ2FwRGVmYXV0KTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG59XG5cbi8qIENvbG9ubmUgZGUgbCdpY8O0bmUgKGNoZWYgZGUgcHJvamV0LCAyMDI2LTA5LTIyKSA6IGwnaWPDtG5lIHRpZW50IHRvdXRlIGxhIGhhdXRldXIgZHUgYmxvYywgw6BcbiAgIGRyb2l0ZSwgc8OpcGFyw6llIGR1IGNvbnRlbnUgcGFyIHVuIGZpbGV0IDsgbGUgY29udGVudSBzJ2FycsOqdGUgYXZhbnQgZWxsZSwgcmllbiBuZSBwYXNzZVxuICAgZGVzc291cy4gTGUgZGVzc2luIHJlc3RlIGVuIGhhdXQgZGUgbGEgY29sb25uZSAob2JqZWN0LWZpdCkuIE5lIHZhdXQgcXVlIHBvdXIgbGUgYmxvYyBkdVxuICAgcsOpY2FwaXR1bGF0aWYgKC5yZWNhcEJsb2MpIDogbGEgY29tcG9zaXRpb24gZGUgc2PDqW5hcmlvIHBvcnRlIGF1c3NpIC5yZWNhcEJsb2NTY2VuZS4gKi9cbi5yZWNhcEJsb2MucmVjYXBCbG9jU2NlbmUge1xuICAgIG1pbi1oZWlnaHQ6IDgwcHg7IC8qIGxhIGNvbG9ubmUgbmUgZGVzY2VuZCBqYW1haXMgc291cyBsYSBjYXNlIGRlIGwnaWPDtG5lICovXG4gICAgcGFkZGluZy1yaWdodDogODBweDtcbn1cblxuLnJlY2FwQmxvYy5yZWNhcEJsb2NTY2VuZSAucmVjYXBUaXRyZUljb25lIHtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG9iamVjdC1maXQ6IGNvbnRhaW47XG4gICAgb2JqZWN0LXBvc2l0aW9uOiB0b3A7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBib3JkZXItbGVmdDogdmFyKC0tYm9yZGVyQ2FydGUpO1xufVxuXG4vKiBWYXJpYW50ZXMgY291bGV1ciBwYXIgdHlwZSAqL1xuLnJlY2FwQmxvY0dyb3VwZXMgLyogLnJlY2FwQmxvY0Rpc3RyaWJ1dGlvbnMgKGludXRpbGlzw6kgMjAyNi0wNi0xMykgKi8ge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCbGFuYzEpO1xufVxuXG4ucmVjYXBCbG9jU2NlbmUgLnJlY2FwVGl0cmVJY29uZSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0FjY2VudDEpO1xufVxuXG4ucmVjYXBCbG9jU2NlbmUucmVjYXBCbG9jQWZmaWNoYWdlIC5yZWNhcFRpdHJlSWNvbmUge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNBY2NlbnQxKTtcbn1cblxuLnJlY2FwQmxvY0NvbmZpZ3VyYXRpb25zIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50MSk7XG59XG5cbi8qIGludXRpbGlzw6kgMjAyNi0wNi0xM1xuLnJlY2FwQmxvY0ZpbmFsIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMwMik7XG59XG4qL1xuXG4vKiBMaWVuIFwiTW9kaWZpZXJcIiBzb3VzIGxlIHLDqWNhcCAqL1xuLnJlY2FwQWN0aW9ucyB7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ1JlY2FwKTtcbn1cblxuLyogTcOqbWUgY291bGV1ciBxdSdBbm51bGVyIGRlcyBmb3JtdWxhaXJlcyAobm95YXUgMzFfY3RhLmNzcykgOiBsZXMgYWN0aW9ucyBuZXV0cmVzIHNvbnRcbiAgIG5vaXJlcywgbGVzIGNvdWxldXJzIHJlc3RlbnQgcsOpc2VydsOpZXMgYXV4IGFjdGlvbnMgbWFycXXDqWVzIChTdXBwcmltZXIpLiAqL1xuLnJlY2FwQWN0aW9ucyBhIHtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuLnJlY2FwQWN0aW9ucyBhOmhvdmVyIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuLyogSW1hZ2UgZGFucyB1biBibG9jIHLDqWNhcCAqL1xuLnJlY2FwSW1hZ2Uge1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG59XG5cbi8qIFBhc3RpbGxlcyBjb3VsZXVycyBkYW5zIGxlIHLDqWNhcCAqL1xuLnJlY2FwQ291bGV1cnMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiB2YXIoLS1nYXBEZWZhdXQpO1xuICAgIG1hcmdpbi10b3A6IDZweDtcbn1cblxuLnJlY2FwQ291bGV1clBhc3RpbGxlIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIGJvcmRlcjogdmFyKC0tYm9yZGVyKTtcbn1cblxuLyogTWVzc2FnZSB2aWRlICovXG4ucmVjYXBWaWRlIHtcbiAgICBmb250OiB2YXIoLS1mSXRhbGljMTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xuICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdMaWduZUxpc3RlKTtcbn1cblxuLyogU291cmNlIGxpc3QgZGFucyBsZXMgZMOpdGFpbHMgKi9cbi8qIGludXRpbGlzw6kgMjAyNi0wNi0xM1xuLnJlY2FwU291cmNlcyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogMnB4O1xufVxuKi9cblxuLyogQWxlcnRlIGluc3VmZmlzYW5jZSAqL1xuLnJlY2FwQWxlcnRlIHtcbiAgICBjb2xvcjogdmFyKC0tY1JvdWdlMyk7XG4gICAgZm9udDogdmFyKC0tZkFsZXJ0ZTE2KTtcbn1cblxuLyogQnJpcXVlIHLDqWNhcGl0dWxhdGlmIGRhbnMgbGEgZ3JpbGxlIGR1IHNjw6luYXJpbyAqL1xuLyogaW51dGlsaXPDqSAyMDI2LTA2LTEzXG4uYnJpcXVlLmJyaXF1ZVJlY2FwIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMwMik7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jQmxhbmMwMyk7XG59XG4qL1xuXG4vKiBpbnV0aWxpc8OpIDIwMjYtMDYtMTUgLSBjb25jZXB0IHJlY2FwLmpzIHJldGlyw6lcbi5yZWNhcEFuaW1Db25maWc6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4qL1xuXG4ucmVjYXBFbmNhZHJlIHtcbiAgICBtYXJnaW46IDEwcHggMDtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nUmVjYXApO1xuICAgIGJvcmRlcjogdmFyKC0tYm9yZGVyQ2FydGUpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICBiYWNrZ3JvdW5kOiAjRkZGODtcbn1cblxuLyogaW51dGlsaXPDqSAyMDI2LTA2LTE1IC0gY29uY2VwdCByZWNhcC5qcyByZXRpcsOpXG4ucmVjYXBBbmltQ29uZmlnIGg0IHtcbiAgICBmb250OiB2YXIoLS1mSDQpO1xuICAgIG1hcmdpbjogMjBweCAwIDRweDtcbn1cblxuLnJlY2FwQW5pbUNvbmZpZyBoNDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMDtcbn1cblxuLnJlY2FwQW5pbUNvbmZpZyBwIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbiAgICBtYXJnaW46IDJweCAwO1xufVxuXG4ucmVjYXBBbmltQ29uZmlnIHVsLFxuLnJlY2FwQW5pbUNvbmZpZyBvbCB7XG4gICAgbWFyZ2luOiA0cHggMDtcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG59XG5cbi5yZWNhcEFuaW1Db25maWcgbGkge1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xufVxuXG4ucmVjYXBBbmltQ29uZmlnIHRhYmxlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIG1hcmdpbjogNnB4IDA7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG5cbi5yZWNhcEFuaW1Db25maWcgdGgsXG4ucmVjYXBBbmltQ29uZmlnIHRkIHtcbiAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyQ2FydGUpO1xufVxuXG4ucmVjYXBBbmltQ29uZmlnIHRoIHtcbiAgICBmb250LXdlaWdodDogNjAwO1xufVxuXG4ucmVjYXBBbmltQ29uZmlnIGhyIHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyQ2FydGUpO1xuICAgIG1hcmdpbjogOHB4IDA7XG59XG4qL1xuXG4vKiBCb3V0b25zIHBhcnRpY2lwYW50cyBjbGlxdWFibGVzIGRhbnMgbGEgcHJvZ3Jlc3Npb24gOiBtw6ptZSDDqXRpcXVldHRlIHF1ZSBsZXMgYXV0cmVzXG4gICAoY29udG91ciBjb21wcmlzLCBjZi4gYmxvYyBkdSBoYXV0KSwgb24gbidhanVzdGUgcXVlIGwnaW50ZXJhY3Rpdml0w6kuICovXG5idXR0b24ucmVjYXBUYWdHcm91cGVzIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udDogaW5oZXJpdDtcbn1cblxuYnV0dG9uLnJlY2FwVGFnR3JvdXBlczpob3ZlciB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBQUk9HUkVTU0lPTiDigJQgw4l0YXRzIGRlcyBibG9jc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogU2V1bGVzIGxlcyBjdWVzIMOgIHZlbmlyIHNvbnQgYXR0w6ludcOpZXMgOiBjZWxsZXMgZMOpasOgIGpvdcOpZXMgcmVzdGVudCBwbGVpbmVzLCBlbGxlcyBvbnQgw6l0w6lcbiAgIGFjdGl2ZXMgKGNoZWYgZGUgcHJvamV0LCAyMDI2LTA5LTIyKS4gKi9cbiNwcm9ncmVzc2lvbiAucmVjYXBCbG9jU2NlbmUge1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcztcbn1cblxuI3Byb2dyZXNzaW9uIC5yZWNhcEJsb2NTY2VuZS5yZWNhcEJsb2NGdXR1ciB7XG4gICAgb3BhY2l0eTogLjU7XG59XG5cbi8qIE5vbWJyZSBkJ8OpbMOpbWVudHMgZCd1bmUgcGFzdGlsbGUgZCdlbnRyw6llIG91IGRlIHNvcnRpZSAocGVpbnR1cmVQcm9ncmVzc2lvbi50cyksIHPDqXBhcsOpIGR1XG4gICBsaWJlbGzDqSBwYXIgdW4gZmlsZXQgZGUgbGEgY291bGV1ciBkZSBsYSBwYXN0aWxsZS4gQWJzZW50IHRhbnQgcXVlIGxlIG5vbWJyZSBuJ2VzdCBwYXMgY29ubnUuICovXG4ucmVjYXBDb21wdGUge1xuICAgIG1hcmdpbi1sZWZ0OiA2cHg7XG4gICAgcGFkZGluZy1sZWZ0OiA2cHg7XG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNlN0cm9uZyk7XG59XG5cbi8qIFNlY3Rpb24gwqsgUHJvZ3Jlc3Npb24gwrsgZGUgbGEgY3VlIGFjdGl2ZSA6IHVuZSBzZWN0aW9uIGR1IGJsb2MgY29tbWUgRW50csOpZXMgZXQgU29ydGllc1xuICAgKC5yZWNhcEJsb2NEZXRhaWwsIG3Dqm1lIHRpdHJlLCBtw6ptZSBtYXJnZSksIHNlcnZpZSBjYWNow6llIHBhciBsZSB0ZW1wbGF0ZS4gKi9cbi5wcm9ncmVzc2lvbkV0YXRbaGlkZGVuXSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogTGEgYmFycmUgZXQgc29uIGNvbXB0ZSBhdSByZXRyYWl0IGRlcyBsaXN0ZXMgZCdFbnRyw6llcyBldCBkZSBTb3J0aWVzLiAqL1xuLnByb2dyZXNzaW9uRXRhdEJsb2NzIHtcbiAgICBtYXJnaW46IDRweCAwO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcmV0cmFpdExpc3RlQ291cnQpO1xufVxuXG4vKiBDdWUgw6AgdmVuaXIgKGFwcsOocyBsYSBjdWUgYWN0aXZlKSA6IHNvbiB0aXRyZSBldCBzb24gaWPDtG5lIHNldWxlbWVudCDigJQgc2VzIGVudHLDqWVzIGV0IHNlc1xuICAgc29ydGllcyBuZSBkaXNlbnQgcmllbiB0YW50IHF1J2VsbGUgbidhIHBhcyBjb21tZW5jw6kgKGNoZWYgZGUgcHJvamV0LCAyMDI2LTA5LTIyKS4gKi9cbiNwcm9ncmVzc2lvbiAucmVjYXBCbG9jRnV0dXIgLnByb2dyZXNzaW9uQ29udGVudSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogQcOpcmF0aW9uIGRlIHNlY291cnMgcXVhbmQgbGUgYmxvYyBuJ2EgYXVjdW5lIHNlY3Rpb24gdmlzaWJsZSAqL1xuLnByb2dyZXNzaW9uQ29udGVudTpub3QoOmhhcyg+IDpub3QoW2hpZGRlbl0pKSkge1xuICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1nYXBNb3llbik7XG59XG5cbi8qIEJsb2NzIGRlIHByb2dyZXNzaW9uIMOpbWlzIHBhciBsJ2FuaW1hdGlvbiAob2J0ZW5pclByb2dyZXNzaW9uIOKGkiByZW5kdSB1bmlxdWUgcGVpbnR1cmVQcm9ncmVzc2lvbi50cykgKi9cbi5wcm9ncmVzc2lvbkJsb2NUaXRyZSB7XG4gICAgZm9udDogdmFyKC0tZkg0KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbiAgICBtYXJnaW46IDZweCAwIDJweDtcbn1cblxuLnByb2dyZXNzaW9uQmxvY1RleHRlIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbiAgICBtYXJnaW46IDJweCAwO1xufVxuXG4ucHJvZ3Jlc3Npb25CbG9jTGlzdGUge1xuICAgIG1hcmdpbjogNHB4IDA7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1yZXRyYWl0TGlzdGVDb3VydCk7XG59XG5cbi5wcm9ncmVzc2lvbkJsb2NMaXN0ZSBsaSB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG5cbi8qIEJhcnJlIHNvYnJlIChjaGVmIGRlIHByb2pldCwgMjAyNi0wOS0yMikgOiBsYSBjdWUgYWN0aXZlIHNlIHZvaXQgZMOpasOgIMOgIGwnb3BhY2l0w6ksIGxhIGJhcnJlXG4gICBuJ2EgcGFzIMOgIGNyaWVyLiBGaW5lLCBib3V0cyBkcm9pdHMgY29tbWUgbGEgcG9saWNlLCBub2lyZSBzYW5zIGNvdWxldXIgZCdhY2NlbnQsIGxhIG1vaXRpw6lcbiAgIGR1IGJsb2MgOyBsZSBjb21wdGUgZW4gcGV0aXQgZ3JpcyDDoCBjw7R0w6kuICovXG4ucHJvZ3Jlc3Npb25CbG9jQmFycmUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IHZhcigtLWdhcE1veWVuKTtcbiAgICBtYXJnaW46IDRweCAwO1xufVxuXG4ucHJvZ3Jlc3Npb25CbG9jQmFycmVQaXN0ZSB7XG4gICAgZmxleDogMCAxIDUwJTtcbiAgICBoZWlnaHQ6IDRweDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQmxhbmMwMyk7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnByb2dyZXNzaW9uQmxvY0JhcnJlSmF1Z2Uge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jTm9pcik7XG4gICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcztcbn1cblxuLnByb2dyZXNzaW9uQmxvY0JhcnJlTGFiZWwge1xuICAgIGZvbnQ6IHZhcigtLWZMYWJlbCk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgw4lUSVFVRVRURVMgLSBNYXJxdWFnZSB0eXBvZ3JhcGhpcXVlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICBMZXMgw6l0aXF1ZXR0ZXMgZG9ubsOpZXMgcGFyIGwnb3JnYW5pc2F0ZXVyIChhbmltYXRpb25zLCBzb3J0aWVzLCBncm91cGVzKVxuICAgc29udCBlbnZlbG9wcMOpZXMgZGFucyAuZXRpcXVldHRlTW9ubyBwYXIgbGUgZmlsdHJlIFR3aWcgYGV0aXF1ZXR0ZUh0bWxgLlxuICAgTGEgY2hhc3NlIGZpeGUgbGVzIGRpc3Rpbmd1ZSBkZXMgbGliZWxsw6lzIGR1IHN5c3TDqG1lIChkw6ljaXNpb24gUE8gMjAyNi0wNi0xMCkuXG4qL1xuXG4uZXRpcXVldHRlTW9ubyB7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZmTW9ubyk7XG59XG5cbi8qIE1hcnF1ZXVyIGQndW5lIHNvdXJjZSBwcm92aXNvaXJlLCBhY2NvbMOpIMOgIGwnw6l0aXF1ZXR0ZSBwYXIgbGUgbcOqbWUgZmlsdHJlICovXG4uZXRpcXVldHRlQUNvbmZpZ3VyZXIge1xuICAgIGZvbnQ6IHZhcigtLWZMaWdodDE0KTtcbiAgICBjb2xvcjogdmFyKC0tY1JvdWdlNCk7XG59XG5cbi5yZWNhcEJsb2NEZXRhaWwgLmV0aXF1ZXR0ZUFDb25maWd1cmVyIHtcbiAgICBjb2xvcjogdW5zZXQ7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQ0FSVEVTIERFUyBQQUdFUyBTQ8OITkUgLyBTQ8OJTkFSSU8g4oCUIGJyaXF1ZXMgX3NjZW5hcmlvc0NvbXBhdGlibGVzIGV0IF9zY2VuZXNEdVNjZW5hcmlvXG5cbiAgIERldXggbmFtZXNwYWNlcywgdW4gcGF0cm9uIDogwqsgc2NlbmFyaW9Db21wYXRpYmxlIMK7IHBvdXIgbGEgYnJpcXVlIHBvc8OpZSBzdXIgbGEgcGFnZSBkJ3VuZVxuICAgc2PDqG5lIChsZXMgc2PDqW5hcmlvcyBvw7kgbGEgam91ZXIg4oCUIGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA2KSwgwqsgc2NlbmVEdVNjZW5hcmlvIMK7XG4gICBwb3VyIHNhIHN5bcOpdHJpcXVlIHBvc8OpZSBzdXIgbGEgcGFnZSBkJ3VuIHNjw6luYXJpbyAobGVzIHNjw6huZXMgcXUnaWwgam91ZSDigJQgMjAyNi0wOS0xNSkuXG4gICBWaXRyaW5lIGF1am91cmQnaHVpLCBTdHVkaW8gbGUgam91ciBvw7kgaWwgYSBzZXMgcGFnZXMuIENoYXF1ZSByw6hnbGUgdmlzZSBsZXMgZGV1eCA6IHVuZVxuICAgY29ycmVjdGlvbiBmYWl0ZSBwb3VyIGwndW5lIHZhdXQgcG91ciBsJ2F1dHJlLiBVbmUgY2FydGUgcGFyIGxpZ25lIDogw6dhIHNlIGxpdCwgw6dhIG5lIHNlXG4gICBzdXJ2b2xlIHBhcy5cbiAgIE3Dqm1lIHBhdHJvbiBxdWUgbGEgY2FydGUgZGUgbCfDrmxvdCBkZSBzY8OpbmFyaW9zIGRlIGxhIFZpdHJpbmUgKGlsb3RTY2VuYXJpb3MuY3NzKSxcbiAgIGxlcyBOT01TIG5vbiA6IGzDoC1iYXMgYydlc3QgdW4gw65sb3Qgw6lkaXRvcmlhbCwgaWNpIHVuZSBicmlxdWUgcGFydGFnw6llIHF1aSBkb2l0XG4gICBzJ2FmZmljaGVyIGRlcyBkZXV4IGPDtHTDqXMgc2FucyBkw6lwZW5kcmUgZCd1biBDU1MgZGUgcGFnZS4gSW1wb3J0w6kgcGFyIGwnZW50csOpZSBDU1NcbiAgIGRlIGNoYXF1ZSBzaXRlIHF1aSBwb3NlIGxhIGJyaXF1ZS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIExhIGxpc3RlIGVzdCBsZSBDT05URU5FVVIgZGUgbWVzdXJlIDogbGUgcGFzc2FnZSBkZXMgYWN0aW9ucyBzb3VzIGxlIHRleHRlIGTDqXBlbmQgZGUgbGFcbiAgIGxhcmdldXIgZGUgbGEgQ0FSVEUsIHBhcyBkZSBjZWxsZSBkZSBsYSBmZW7DqnRyZS4gU3VyIGxhIHBhZ2UgZCd1bmUgc2PDqG5lLCBsYSBjYXJ0ZSB2aXQgZGFuc1xuICAgbGEgY29sb25uZSBkZSBnYXVjaGUgZCd1bmUgZ3JpbGxlIMOgIGRldXggY29sb25uZXMgKGAxZnIgbWluKDQ1MHB4LCAzNy41JSlgLFxuICAgYXJ0aWNsZVZpdHJpbmUuY3NzKSA6IMOgIDEwMDBweCBkZSBmZW7DqnRyZSBlbGxlIG4nZW4gZmFpdCBxdWUgfjU3MCwgZXQgdW4gQG1lZGlhIHN1ciBsYVxuICAgZmVuw6p0cmUgbGFpc3NhaXQgbGUgdGV4dGUgcyfDqWNyYXNlciBiaWVuIGF2YW50IGRlIGJhc2N1bGVyLiAqL1xuLnNjZW5hcmlvc0NvbXBhdGlibGVzTGlzdGUsXG4uc2NlbmVzRHVTY2VuYXJpb0xpc3RlIHtcbiAgICBjb250YWluZXI6IGNhcnRlc0NhdGFsb2d1ZSAvIGlubGluZS1zaXplO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcExpc3RlKTtcbn1cblxuLyogTGUgdGV4dGUgcHJlbmQgY2UgcXVpIHJlc3RlIDsgbGVzIGFjdGlvbnMgc29udCDDoCB0YWlsbGUgZml4ZSwgw6AgZHJvaXRlLiBgc3RyZXRjaGBcbiAgIGZhaXQgZGVzY2VuZHJlIGxlIGZpbGV0IGRlcyBhY3Rpb25zIHN1ciB0b3V0ZSBsYSBoYXV0ZXVyLCBxdWVsbGUgcXVlIHNvaXQgbGEgbG9uZ3VldXJcbiAgIGRlIGxhIGRlc2NyaXB0aW9uLiAqL1xuLnNjZW5hcmlvQ29tcGF0aWJsZSxcbi5zY2VuZUR1U2NlbmFyaW8ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNCbGFuYyk7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXJGb3JtKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLyogNDUwcHggZGUgbGFyZ2UgYXUgbWluaW11bSBwb3VyIGxlIG5vbSBldCBsYSBkZXNjcmlwdGlvbiAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0XG4gICAyMDI2LTA5LTA3KSA6IGVuIGRlw6fDoCBsZSB0ZXh0ZSBuJ2VzdCBwbHVzIGxpc2libGUsIGxhIGNhcnRlIHByw6lmw6hyZSBwYXNzZXIgc2VzIGFjdGlvbnNcbiAgIGRlc3NvdXMuIGBtaW4oKWAgYm9ybmUgY2UgbWluaW11bSDDoCBsYSBjYXJ0ZSBlbGxlLW3Dqm1lLCBwb3VyIHF1J3VuIMOpY3JhbiDDqXRyb2l0IG5lIGZhc3NlXG4gICBqYW1haXMgZMOpYm9yZGVyIGxlIGNvcnBzLiAqL1xuLnNjZW5hcmlvQ29tcGF0aWJsZUNvcnBzLFxuLnNjZW5lRHVTY2VuYXJpb0NvcnBzIHtcbiAgICBmbGV4OiAxO1xuICAgIG1pbi13aWR0aDogbWluKDQ1MHB4LCAxMDAlKTtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ2FydGUpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcFJlZHVpdCk7XG59XG5cbi8qIExlIGTDqXJvdWzDqSBkdSBzY8OpbmFyaW8gKGJyaXF1ZSBub3lhdSBfZGVyb3VsZVNjZW5hcmlvKSA6IHRvdXRlIGxhIGxhcmdldXIgZGUgbGEgY2FydGUsXG4gICBTT1VTIGxlIGNvcnBzIGV0IGxlcyBhY3Rpb25zLCBxdWkgc2UgcmFuZ2VudCBjb21tZSBhdmFudCAobGUgdGl0cmUgYXUtZGVzc3VzLCBsZXMgY2FzZXMgZW5cbiAgIGRlc3NvdXMg4oCUIGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE4KS4gTGUgZGVzc2luIHJlc3RlIMOgIGFmZmluZXIuICovXG4uc2NlbmFyaW9Db21wYXRpYmxlID4gLmRlcm91bGVTY2VuYXJpbyB7XG4gICAgZmxleDogMCAwIDEwMCU7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NhcnRlKSAzMnB4IHZhcigtLXBhZGRpbmdDYXJ0ZSkgdmFyKC0tcGFkZGluZ0NhcnRlKTtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1ib3JkZXIpO1xufVxuXG4uc2NlbmFyaW9Db21wYXRpYmxlTm9tLFxuLnNjZW5lRHVTY2VuYXJpb05vbSB7XG4gICAgZm9udDogdmFyKC0tZkgzKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5zY2VuYXJpb0NvbXBhdGlibGVUZXh0ZSxcbi5zY2VuZUR1U2NlbmFyaW9UZXh0ZSB7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4uZGl2QWN0aW9uU2NlbmFyaW9Db21wYXRpYmxlLFxuLmRpdkFjdGlvblNjZW5lRHVTY2VuYXJpbyB7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBnYXA6IHZhcigtLWdhcERlZmF1dCk7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NhcnRlKTtcbiAgICBib3JkZXItbGVmdDogdmFyKC0tYm9yZGVyKTtcbiAgICBtaW4td2lkdGg6IDI0MHB4O1xufVxuXG4vKiA0NTAgKGxlIHRleHRlKSArIDI0MCAobGVzIGFjdGlvbnMpIDogc291cyA2OTBweCBkZSBDQVJURSBsZXMgZGV1eCBjb2xvbm5lcyBuZSB0aWVubmVudFxuICAgcGx1cywgbGVzIGFjdGlvbnMgcGFzc2VudCBzb3VzIGxlIHRleHRlIOKAlCBhdSBtb21lbnQgZXhhY3Qgb8O5IGxlIGZsZXggbGVzIHkgcmVudm9pZS5cbiAgIEFsaWduw6llcyDDoCBHQVVDSEUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KSwgc291cyBsZSBkw6lidXQgZHUgdGV4dGUgOiBsYSBjYXJ0ZVxuICAgc2UgbGl0IGQndW4gc2V1bCBib3JkLCBkdSBub20gYXV4IGdlc3Rlcy4gKi9cbkBjb250YWluZXIgY2FydGVzQ2F0YWxvZ3VlIChtYXgtd2lkdGg6IDY5MHB4KSB7XG4gICAgLmRpdkFjdGlvblNjZW5hcmlvQ29tcGF0aWJsZSxcbiAgICAuZGl2QWN0aW9uU2NlbmVEdVNjZW5hcmlvIHtcbiAgICAgICAgZmxleDogMSAwIDEwMCU7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgIGJvcmRlci10b3A6IHZhcigtLWJvcmRlcik7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmdDYXJ0ZUV0cm9pdCk7XG4gICAgfVxufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIETDiVJPVUzDiSBEJ1VOIFNDw4lOQVJJTyDigJQgYnJpcXVlIG5veWF1IF9kZXJvdWxlU2NlbmFyaW8udHdpZ1xuXG4gICBMZSBkZXNzaW4gZGUgbGEgZ3JpbGxlIGRlIGwnb25nbGV0IFNjw6luYXJpbyAoYnJpcXVlIDE2MsOXMTAwLCBpY8O0bmUgNjQsIG5vbSBlbiBkZXNzb3VzLFxuICAgdHJhaXQgZXQgZmzDqGNoZSksIGRhbnMgdW4gY29kZSDDoCBwYXJ0IDogaWNpIG9uIGTDqWNvdXZyZSB1biBzY8OpbmFyaW8sIG9uIG5lIGxlIHLDqGdsZSBwYXNcbiAgIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOCkuIEZldWlsbGUgQVVUT05PTUUgOiBlbGxlIG5lIGTDqXBlbmQgcGFzIGRlXG4gICBfZ3JpbGxlLmNzcywgcXVlIGxhIFZpdHJpbmUgbmUgY2hhcmdlIHBhcyBzdXIgc2VzIHBhZ2VzIOKAlCBsZXMgbWVzdXJlcyBzb250IHJlY29wacOpZXMsXG4gICBsZXMgcsOoZ2xlcyBkJ2ludGVyYWN0aW9uIChzdXJ2b2wsIGdsaXNzZXItZMOpcG9zZXIsIGZvcm11bGFpcmUgYWN0aWYpIG5lIGxlIHNvbnQgcGFzLlxuICAgQ2hhcmfDqWUgcGFyIDU2X3NjZW5hcmlvLmNzcyAoU3R1ZGlvKSBldCB2aXRyaW5lLmNzcyAoVml0cmluZSkuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBMZSBkw6lyb3Vsw6kgOiB1bmUgbWFyZ2UgZGUgMzJweCDDoCBEUk9JVEUgc2V1bGVtZW50LCBvw7kgdml0IGxhIGJhc2N1bGUgaWPDtG5lcyAvIHZpc3VlbHMsXG4gICBob3JzIGRlIGxhIGxpZ25lIGRlcyB0dWlsZXMgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE4IDogbCdpY8O0bmUgdmllbnQgZW4gcGx1cyxcbiAgIGzDqWdlciwgw6AgZHJvaXRlKS4gw4AgZ2F1Y2hlLCByaWVuIDogbGUgZMOpcm91bMOpIHNlIGNhbGUgYXUgYm9yZCBjb21tZSBsZSByZXN0ZSBkZSBsYSBwYWdlLlxuICAgTMOgIG/DuSBsYSBwYWdlIENFTlRSRSBsZSBkw6lyb3Vsw6kgKGxlIGJhbmRlYXUgZGVzIHBhZ2VzIHJ1YnJpcXVlcyDDoCBwYXJ0aXIgZGUgMTYwMHB4KSwgYydlc3RcbiAgIMOgIGxhIGZldWlsbGUgZGUgY2V0dGUgcGFnZSBkJ2Fqb3V0ZXIgbGEgbcOqbWUgbWFyZ2Ugw6AgZ2F1Y2hlLCBwb3VyIHF1ZSBsYSBsaWduZSBkZXMgdHVpbGVzXG4gICByZXN0ZSBjZW50csOpZSAoaWxvdFNjZW5hcmlvc0JhbmRlYXUuY3NzKSA6IGxhIGJyaXF1ZSBuZSBzYWl0IHBhcyBzaSBlbGxlIGVzdCBjZW50csOpZS4gKi9cbi5kZXJvdWxlU2NlbmFyaW8ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAzMnB4O1xufVxuXG4vKiBMYSBiYXNjdWxlIDogdW4gxZNpbCwgZGlzY3JldCwgY29sbMOpIMOgIGRyb2l0ZSBkZSBsYSBERVJOScOIUkUgdHVpbGUgKGRhbnMgc29uIGVtcGxhY2VtZW50LFxuICAgaG9ycyBkdSBmbHV4IDogaWwgbGEgc3VpdCBvw7kgcXUnZWxsZSBwYXNzZSDDoCBsYSBsaWduZSwgZXQgbmUgcHJlbmQgcGFzIGRlIHBsYWNlIGRhbnMgbGFcbiAgIHJhbmfDqWUg4oCUIGxhIG1hcmdlIGRyb2l0ZSBkdSBkw6lyb3Vsw6kgbHVpIGdhcmRlIGxlcyAzMnB4IHF1YW5kIGxhIHR1aWxlIGVzdCBhdSBib3JkKSwgYWxpZ27DqVxuICAgc3VyIGxlIGhhdXQgZGUgbGEgdHVpbGUsIE5PSVIgZW4gdG91dGUgY2lyY29uc3RhbmNlIOKAlCBuaSBzdXJ2b2wgbmkgw6l0YXQgZW5mb25jw6kgbmUgbGVcbiAgIGNvbG9yZW50IChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOCkgOiBjZSBzb250IGxlcyB0dWlsZXMgcXVpIG1vbnRyZW50IGxlIG1vZGUsXG4gICBwYXMgbCdpY8O0bmUuIGFyaWEtcHJlc3NlZD10cnVlID0gdmlzdWVscy4gKi9cbi5kZXJvdWxlQmFzY3VsZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiBjYWxjKDEwMCUgKyA2cHgpO1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGVyb3VsZUJhc2N1bGUgc3ZnIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi8qIExlIGNvcnBzIGR1IGTDqXJvdWzDqSA6IGxhIGxpZ25lIGRlcyB0dWlsZXMgZXQsIHBhci1kZXNzdXMsIGxlIGNhbHF1ZSBkdSB0cmFpdC5cbiAgIGBwb3NpdGlvbjogcmVsYXRpdmVgIGVzdCBpY2kgZXQgbm9uIHNldWxlbWVudCBkYW5zIF9ncmlsbGUuY3NzIDogbGEgVml0cmluZSBuZSBjaGFyZ2UgcGFzXG4gICBjZXR0ZSBmZXVpbGxlLCBldCBzYW5zIGx1aSBsZSBjYWxxdWUgU1ZHIHMnYWJzb2x1dGlzYWl0IGNvbnRyZSBsYSBjYXJ0ZS4gKi9cbi5kZXJvdWxlQ29ycHMge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLyogTGUgY2FscXVlIGRlcyB0cmFpdHMgKHNjZW5hcmlvTGlnbmVzLnRzKSA6IG3Dqm1lcyByw6hnbGVzIHF1ZSAuc2NlbmFyaW9MaWduZXNTdmcgZGFuc1xuICAgX2dyaWxsZS5jc3MsIHJlY29wacOpZXMgcGFyY2UgcXVlIGxhIFZpdHJpbmUgbmUgY2hhcmdlIHBhcyBfZ3JpbGxlLmNzcy4gU2FucyBlbGxlcyBsZSBTVkdcbiAgIHJlc3RhaXQgZGFucyBsZSBmbHV4LCBsYXJnZSBkZSAzMDBweCBwYXIgZMOpZmF1dCwgZXQgY291cGFpdCBsZSB0cmFpdCAoY29uc3RhdCBkdSBjaGVmIGRlXG4gICBwcm9qZXQgMjAyNi0wOS0xOCkuICovXG4uZGVyb3VsZVNjZW5hcmlvIC5zY2VuYXJpb0xpZ25lc1N2ZyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIHotaW5kZXg6IDA7XG59XG5cbi8qIFVORSBMSUdORSBUQU5UIFFVJ0VMTEUgVElFTlQsIFBMVVNJRVVSUyBTSU5PTiAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTggOiBvblxuICAgdm91bGFpdCDDqXZpdGVyIGxlIHJldG91ciDDoCBsYSBsaWduZSwgbWFpcyBzb3VzIDkwMHB4IHVuIHNjw6luYXJpbyBsb25nIHNlIGNvdXBhaXQsIGV0IHVuXG4gICBkw6lmaWxlbWVudCBob3Jpem9udGFsIGF1eCBiYXJyZXMgaW52aXNpYmxlcyBuJ2VzdCBwYXMgbGlzaWJsZSkuIExlIHRyYWl0IHN1aXQgOiBsZSBtb2R1bGVcbiAgIHNjZW5hcmlvTGlnbmVzLnRzIGRlc3NpbmUgdW5lIGxpZ25lIHBhciByYW5nw6llLCBhdmVjIGxlcyBwcm9sb25nZW1lbnRzIHF1aSBkaXNlbnQgwqsgw6dhXG4gICBjb250aW51ZSDCuywgZXhhY3RlbWVudCBjb21tZSBsYSBncmlsbGUgZHUgU3R1ZGlvLiBMJ8OpY2FydCBlbnRyZSByYW5nw6llcyBsYWlzc2UgbGEgcGxhY2VcbiAgIGR1IHRyYWl0IGV0IGRlIGxhIGJhcnJlIGRlIGNob2l4IHNvdXMgY2hhcXVlIHR1aWxlLiAqL1xuLmRlcm91bGVTY2VuYXJpb0xpZ25lIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBnYXA6IHZhcigtLWdhcExhcmdlKSB2YXIoLS1nYXBNb3llbik7XG59XG5cbi8qIEwnZW1wbGFjZW1lbnQsIGRlIGhhdXQgZW4gYmFzIDogbGEgYnJpcXVlLCBsZSB0cmFpdCwgbGEgYmFycmUgZGUgY2hvaXggKGTDqWNpc2lvbiBjaGVmIGRlXG4gICBwcm9qZXQgMjAyNi0wOS0xOCkuIExlIHRyYWl0IGVzdCBkZXNzaW7DqSAxMHB4IHNvdXMgbGEgYnJpcXVlIChzY2VuYXJpb0xpZ25lcy50cykgOiBsJ2FpclxuICAgZGUgMjRweCBlbnRyZSBsYSBicmlxdWUgZXQgbGEgYmFycmUgbHVpIGxhaXNzZSBsYSBwbGFjZSwgbGEgYmFycmUgY29tbWVuY2Ugc291cyBsdWkuICovXG4uZGVyb3VsZUVtcGxhY2VtZW50IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIGwnxZNpbCBkZSBsYSBkZXJuacOocmUgdHVpbGUgcyd5IGFjY3JvY2hlICovXG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogMjRweDtcbiAgICB3aWR0aDogMTYycHg7XG59XG5cbi8qIEJyaXF1ZSA6IG3Dqm1lcyBtZXN1cmVzIHF1ZSAuYnJpcXVlIChfZ3JpbGxlLmNzcyksIHNhbnMgbWFpbiBuaSBvbWJyZSDigJQgcmllbiBuZSBzZVxuICAgY2xpcXVlIHN1ciBsYSBicmlxdWUgZWxsZS1tw6ptZSA7IGxlIGNob2l4IHNlIGZhaXQgZGFucyBsYSBiYXJyZSwgZGVzc291cy4gUmllbiBuZSBzJ3lcbiAgIFPDiUxFQ1RJT05ORSBub24gcGx1cyAobmkgbCfDqXRpcXVldHRlLCBuaSBsJ2ljw7RuZSwgbmkgbGUgdmlzdWVsIOKAlCBjb21tZSBgLmJyaXF1ZSAqYCBkYW5zXG4gICBfZ3JpbGxlLmNzcykgOiB1bmUgdHVpbGUgcXVpIHNlIHN1cmxpZ25lIGF1IHBhc3NhZ2UgZGUgbGEgc291cmlzIGZhaXQgdGV4dGUsIGVsbGUgbidlbiBlc3RcbiAgIHBhcyB1biAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTgpLiAqL1xuLmRlcm91bGVCcmlxdWUsXG4uZGVyb3VsZUJyaXF1ZSAqIHtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uZGVyb3VsZUJyaXF1ZSBpbWcsXG4uZGVyb3VsZUJyaXF1ZSBzdmcge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIC13ZWJraXQtdXNlci1kcmFnOiBub25lO1xufVxuXG4uZGVyb3VsZUJyaXF1ZSB7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgd2lkdGg6IDE2MnB4O1xuICAgIGhlaWdodDogMTAwcHg7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0FjY2VudDEpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlckNhcnRlKTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi8qIExhIGZhY2UgOiBsJ2ljw7RuZSBvdSBsZSB2aXN1ZWwsIGV0IGwnw6l0aXF1ZXR0ZSDigJQgY2UgcXVlIGxlIHNjcmlwdCByZW1wbGFjZSDDoCBjaGFxdWUgY2hvaXguXG4gICBFbGxlIHJlbXBsaXQgVE9VVEUgbGEgdHVpbGUsIHBhcyBzZXVsZW1lbnQgbGEgaGF1dGV1ciBkZSBzb24gY29udGVudSA6IGMnZXN0IHN1ciBlbGxlIHF1ZVxuICAgbGUgdmlzdWVsIHByZW5kIHNlcyAxMDAgJSBkZSBoYXV0ZXVyIDsgw6AgOTBweCBkZSBjb250ZW51LCBsJ2ltYWdlIGxhaXNzYWl0IHVuZSBiYW5kZSBlblxuICAgYmFzIGRlIGxhIHR1aWxlIChjb25zdGF0IGR1IGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTgpLiAqL1xuLmRlcm91bGVCcmlxdWVGYWNlIHtcbiAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cblxuLyogTU9ERSBWSVNVRUxTICguZGVyb3VsZVZpc3VlbHMsIHBvc8OpIHBhciBkZXJvdWxlU2NlbmFyaW8udHMgc3VyIHRvdXMgbGVzIGTDqXJvdWzDqXMgZGUgbGFcbiAgIHBhZ2UpIDogbGEgdHVpbGUgR0FSREUgU0EgRk9STUUsIDE2MsOXMTAwLCBldCBsJ2lsbHVzdHJhdGlvbiBsYSByZW1wbGl0IChyZWNhZHLDqWUsIGVsbGUgZXN0XG4gICBlbiAxNi85KSA7IGwnaWPDtG5lIGV0IGwnw6l0aXF1ZXR0ZSBkaXNwYXJhaXNzZW50IOKAlCB0YW50IHBpcyBwb3VyIGxlIG5vbSwgbGEgZm9ybWUgcHJpbWVcbiAgIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOCA6IHBhcyBkZXMgdHVpbGVzIGNhcnLDqWVzIMOgIGPDtHTDqSBkZXMgcmVjdGFuZ3VsYWlyZXMpLlxuICAgTGEgY3JvaXggZXQgdW5lIHNjw6huZSBzYW5zIGlsbHVzdHJhdGlvbiBnYXJkZW50IGxldXIgZGVzc2luLiAqL1xuLmRlcm91bGVCcmlxdWVWaXN1ZWwge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZXJvdWxlVmlzdWVscyAuZGVyb3VsZUJyaXF1ZVZpc3VlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG9iamVjdC1maXQ6IGNvdmVyO1xufVxuXG4uZGVyb3VsZVZpc3VlbHMgLmRlcm91bGVCcmlxdWVJY29uZTpub3QoLmRlcm91bGVCcmlxdWVJY29uZVNldWxlKSxcbi5kZXJvdWxlVmlzdWVscyAuZGVyb3VsZUJyaXF1ZUljb25lOm5vdCguZGVyb3VsZUJyaXF1ZUljb25lU2V1bGUpIH4gLmRlcm91bGVCcmlxdWVUaXRyZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogTGEgYmFycmUgZGUgY2hvaXggOiBmbMOoY2hlIMK3IHBvaW50cyDCtyBmbMOoY2hlIOKAlCBsZSBkZXNzaW4gZGUgbGEgZ2FsZXJpZSBkJ2lsbHVzdHJhdGlvbnMgZGVcbiAgIGxhIHBhZ2UgwqsgQ29uZmlndXJlciDCuyAoLmRpdkFjdGlvbkZpY2hlIHNvdXMgbCdpbWFnZSwgNTVfc2NlbmFyaW9Nb2RpZmllci5jc3MpLCBhdmVjIGxlc1xuICAgbcOqbWVzIC5jdGFEaXNjcmV0IGV0IC5yZWNhcElsbHVzdHJhdGlvblBvaW50LiBMZXMgZmzDqGNoZXMgc29udCByYW1lbsOpZXMgw6AgbGEgaGF1dGV1ciBkZXNcbiAgIHBvaW50cyA6IGxhIGJhcnJlIGVzdCBmaW5lLCBlbGxlIG5lIGZhaXQgcGFzIGJvdXRvbi4gR3JvdXDDqWUgYXUgQ0VOVFJFLCBmbMOoY2hlcyBjb250cmUgbGVzXG4gICBwb2ludHMsIGV0IG5vbiDDqXRhbMOpZSBzdXIgbGEgbGFyZ2V1ciA6IGRldXggcG9pbnRzIHNldWxzIGZhaXNhaWVudCB2aWRlLCBldCBsZSBncm91cGUgZGl0XG4gICBtaWV1eCDCqyBjJ2VzdCBsZSBjaG9peCBkZSBjZXR0ZSBjYXNlIMK7IDsgw6AgY2lucSBwb2ludHMgbGUgZ3JvdXBlIHByZW5kIGRlIGx1aS1tw6ptZSBwcmVzcXVlXG4gICB0b3V0ZSBsYSBsYXJnZXVyIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xOCkuICovXG4uZGVyb3VsZUJhcnJlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgZ2FwOiA2cHg7XG4gICAgaGVpZ2h0OiAyNHB4O1xufVxuXG4vKiBQb2ludHMgcmVzc2VycsOpcyA6IGxhIHpvbmUgZGUgY2xpYyByZXN0ZSAyNHB4IGRlIGhhdXQsIG1haXMgMTZweCBkZSBsYXJnZSwgc2FucyDDqWNhcnQg4oCUXG4gICBhdSBkb2lndCBvbiBuZSBjbGlxdWUgcGFzIGljaSwgYydlc3QgdW4gc2l0ZSBkJ29yZGluYXRldXIuICovXG4uZGVyb3VsZUJhcnJlIC5yZWNhcElsbHVzdHJhdGlvblBvaW50cyB7XG4gICAgZ2FwOiAwO1xufVxuXG4uZGVyb3VsZUJhcnJlIC5yZWNhcElsbHVzdHJhdGlvblBvaW50IHtcbiAgICB3aWR0aDogMTZweDtcbn1cblxuLyogQXUtZGVsw6AgZGUgY2lucSBwb3NpdGlvbnMgOiDCqyAzLzYgwrsgw6AgbGEgcGxhY2UgZGVzIHBvaW50cy4gKi9cbi5kZXJvdWxlQ29tcHRldXIge1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjIpO1xuICAgIHBhZGRpbmc6IDAgNHB4O1xufVxuXG4uZGVyb3VsZUJhcnJlIC5jdGFEaXNjcmV0IHtcbiAgICBtaW4taGVpZ2h0OiAwO1xuICAgIGhlaWdodDogMjRweDtcbiAgICBwYWRkaW5nOiAwIDhweDtcbiAgICBsaW5lLWhlaWdodDogMjJweDtcbn1cblxuLmRlcm91bGVCYXJyZSAuY3RhRGlzY3JldDpkaXNhYmxlZCB7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyNCk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jTm9pcjUpO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLyogSWPDtG5lIGRlIHNjw6huZSA6IGxhIGNhc2UgNjQgZGUgdG91dCBsZSBwcm9qZXQgKDU0X2ljb25lcy5jc3MpLCA2cHggZCdhaXIgPSBkZXNzaW4gNTIuXG4gICBMYSBjcm9peCBhIGxhIG3Dqm1lIGNhc2UsIGRhbnMgbGVzIGRldXggbW9kZXMuIFNBTlMgZm9uZCBwcm9wcmUgOiBsJ2ljw7RuZSBwcmVuZCBsYSBjb3VsZXVyXG4gICBkZSBzYSB0dWlsZSwgcXVlbGxlIHF1J2VsbGUgc29pdCAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTgsIHBvdXIgbGEgbWlzZSBlblxuICAgYXZhbnQgY2ktZGVzc291cykuICovXG4uZGVyb3VsZUJyaXF1ZUljb25lLFxuLmRlcm91bGVCcmlxdWVDcm9peCB7XG4gICAgd2lkdGg6IDY0cHg7XG4gICAgaGVpZ2h0OiA2NHB4O1xuICAgIHBhZGRpbmc6IDZweDtcbiAgICBvYmplY3QtZml0OiBjb250YWluO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4vKiBNSVNFIEVOIEFWQU5UIEQnVU5FIFNDw4hORSAoLmRlcm91bGVBdmVjTWlzZUVuQXZhbnQsIHBhZ2UgZCd1bmUgc2PDqG5lKSA6IHNldWxlIGxhIHR1aWxlXG4gICBxdWkgcG9ydGUgbGEgc2PDqG5lIGRlIGxhIHBhZ2UgZ2FyZGUgbGEgY291bGV1ciwgbGVzIGF1dHJlcyBkZXZpZW5uZW50IFRSQU5TUEFSRU5URVMg4oCUIGxlXG4gICBmb25kIGRlIGxhIHBhZ2UgcGFzc2UgYXUgdHJhdmVycywgb24gdm9pdCBkJ3VuIGNvdXAgZCfFk2lsIG/DuSBsYSBzY8OobmUgam91ZSBkYW5zIGxlXG4gICBzY8OpbmFyaW8gKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE4KS4gUGFzIGRlIGJsYW5jIDogYmxhbmMgw6AgYm9yZCwgYydlc3QgbGVcbiAgIGRlc3NpbiBkZXMgYm91dG9ucywgZXQgdW5lIHR1aWxlIG4nZXN0IHBhcyBjbGlxdWFibGUuIExhIGNsYXNzZSBzdWl0IGxlIGNob2l4IGR1XG4gICB2aXNpdGV1ciAoZGVyb3VsZVNjZW5hcmlvLnRzKS4gKi9cbi5kZXJvdWxlQXZlY01pc2VFbkF2YW50IC5kZXJvdWxlQnJpcXVlIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cblxuLmRlcm91bGVBdmVjTWlzZUVuQXZhbnQgLmRlcm91bGVCcmlxdWUuZGVyb3VsZUJyaXF1ZU1pc2VFbkF2YW50IHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jQWNjZW50MSk7XG59XG5cbi5kZXJvdWxlQnJpcXVlVGl0cmUge1xuICAgIGZvbnQ6IHZhcigtLWZNZW51MTQpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIHBhZGRpbmc6IDhweCAxMHB4IDAgMTBweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLyogRW1wbGFjZW1lbnQgcmV0aXLDqSAoY3JvaXgpIDogbGEgYnJpcXVlIHJlc3RlIMOgIHNhIHBsYWNlLCDDqXRlaW50ZS4gKi9cbi5kZXJvdWxlQnJpcXVlUmV0aXJlZSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY0JsYW5jKTtcbiAgICBib3JkZXItc3R5bGU6IGRhc2hlZDtcbn1cblxuLmRlcm91bGVCcmlxdWVSZXRpcmVlIC5kZXJvdWxlQnJpcXVlVGl0cmUge1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFBBR0UgRCdVTkUgU0PDiE5FIOKAlCAvc2NlbmUve2Rvc3NpZXJ9XG4gICBUZW1wbGF0ZSA6IHZpdHJpbmUvcHVibGljL3ZpdHJpbmVTY2VuZS50d2lnXG5cbiAgIExBIEdSSUxMRSBFU1QgU1VSIExBIFBBR0UsIFBBUyBTVVIgTCdBUlRJQ0xFIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuIEMnZXN0XG4gICBsYSBjbMOpIGRlIHRvdXQgY2UgZmljaGllci4gUXVhdHJlIHBpw6hjZXMsIGV0IHF1YXRyZSBzZXVsZW1lbnQsIGVuZmFudHMgZGlyZWN0cyBkZVxuICAgbCdlbnZlbG9wcGUgOlxuICAgICDigKIgYC5wYWdlU2NlbmVgICAgICAgICAg4oCUIGwnZW52ZWxvcHBlIDogbGUgcGFkZGluZyBkZSBwYWdlICguY29udGVudSkgRVQgbGEgZ3JpbGxlIMOgIGRldXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ubmVzLiBFbGxlIG5lIGNvbnRpZW50IHF1ZSBsZXMgcXVhdHJlIHBpw6hjZXMgY2ktZGVzc291cy5cbiAgICAg4oCiIGA8aDE+YCAgICAgICAgICAgICAgIOKAlCBsYSBwcmVtacOocmUgbGlnbmUsIFNVUiBUT1VURSBMQSBMQVJHRVVSIGNvbW1lIGxlIHRpdHJlIGQndW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGljbGUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KS5cbiAgICAg4oCiIGAucGFnZVNjZW5lQ29tbWFuZGVzYCDigJQgbGVzIGRldXggYm91dG9ucywgbCfDqXRpcXVldHRlIGRlIGxhIHNjw6huZSBldCBzb24gY8WTdXIsIGp1c3RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VzIGxlIHRpdHJlIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNykuXG4gICAgIOKAoiBgLnBhZ2VTY2VuZVZpc3VlbGAgICDigJQgbGEgY29sb25uZSBkZSBkcm9pdGUgOiBsJ2ltYWdlIGNsaXF1YWJsZSBldCBsZSBjYWRyZS4gRWxsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVuY2Ugw6AgbGEgTElHTkUgMywgY2VsbGUgZGUgbGEgY29sb25uZSBkZSBsZWN0dXJlIOKAlCBjJ2VzdCBjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpIGxhIGZhaXQgZMOpbWFycmVyIMOgIGhhdXRldXIgZGUgTCdBUlRJQ0xFLCBldCBub24gZHUgdGl0cmUgb3VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlIGwnw6l0aXF1ZXR0ZS4gw4l0aXLDqWUgc3VyIHRvdXRlIGxhIGhhdXRldXIgZGUgbGEgcGFnZSwgZG9uY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFudGUgZHUgaGF1dCBlbiBiYXMuXG4gICAgIOKAoiBgLnBhZ2VTY2VuZUNvbG9ubmVgICDigJQgbGEgY29sb25uZSBkZSBnYXVjaGUgOiBsJ2FydGljbGUsIGxlcyBxdWVzdGlvbnMsIGxlcyBzY8OpbmFyaW9zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlnbmUgMy5cblxuICAg4pqg77iPIExFUyBMSUdORVMgU0UgQ09NUFRFTlQgOiBoMSA9IDEsIGNvbW1hbmRlcyA9IDIsIGFydGljbGUgPSAzLCBldCBsZSB2aXN1ZWwgcydhbGlnbmUgc3VyXG4gICBsJ2FydGljbGUuIFRvdXRlIHBpw6hjZSBham91dMOpZSBlbnRyZSBsZSB0aXRyZSBldCBsJ2FydGljbGUgZMOpY2FsZSBsZSB2aXN1ZWwgZCdhdXRhbnQg4oCUIHNhXG4gICBgZ3JpZC1yb3dgIGVzdCDDoCBjb3JyaWdlciBkYW5zIGxlIG3Dqm1lIGdlc3RlLCBzaW5vbiBsJ2ltYWdlIHJlbW9udGUgYXUtZGVzc3VzIGR1IHRleHRlLlxuXG4gICBQT1VSUVVPSSBQQVMgU1VSIEwnQVJUSUNMRS4gRGV1eCBkw6lmYXV0cywgbCd1biBhcHLDqHMgbCdhdXRyZSA6XG4gICAgIOKAlCBsYSBncmlsbGUgc3VyIGwnYXJ0aWNsZSwgcXVlc3Rpb25zIGV0IHNjw6luYXJpb3MgREVEQU5TIDogaWwgZmFsbGFpdCBsZXMgZW4gZXh0cmFpcmVcbiAgICAgICAoYGdyaWQtY29sdW1uYCkgcHVpcyBhbm51bGVyIGxldXIgw6ljYXJ0IGQnw65sb3QsIHN1ciB0cm9pcyBmaWNoaWVycyBxdWkgc2UgY29ycmlnZWFpZW50XG4gICAgICAgbCd1biBsJ2F1dHJlLCBldCBhdWN1biByw6lnbGFnZSBkZSBtYXJnZSBuZSB0ZW5haXQgO1xuICAgICDigJQgbGEgZ3JpbGxlIHN1ciBsJ2FydGljbGUsIHF1ZXN0aW9ucyBldCBzY8OpbmFyaW9zIERFSE9SUyA6IGlscyBwcmVuYWllbnQgbGEgcGFnZSBlbnRpw6hyZSxcbiAgICAgICBldCBsZSB2aXN1ZWwgY29sbGFudCBzJ2FycsOqdGFpdCBhdmVjIGwnYXJ0aWNsZSDigJQgdW4gw6lsw6ltZW50IGNvbGxhbnQgbmUgZMOpcGFzc2UgamFtYWlzXG4gICAgICAgc29uIGNvbnRlbmV1ci5cbiAgIFVuZSBzZXVsZSBncmlsbGUsIHN1ciBsYSBwYWdlLCByw6hnbGUgbGVzIGRldXggOiBsZXMgdHJvaXMgYmxvY3MgZGUgbGVjdHVyZSBzb250IGRhbnMgbGFcbiAgIG3Dqm1lIGNvbG9ubmUsIGRvbmMgw6AgbGEgbcOqbWUgbGFyZ2V1ciwgZXQgbGUgdmlzdWVsIGEgdG91dGUgbGEgcGFnZSBwb3VyIGRlc2NlbmRyZS5cblxuICAgTCdBUlRJQ0xFIEdBUkRFIGBhcnRpY2xlVml0cmluZWAsIG1haXMgcG91ciBzYSBUWVBPR1JBUEhJRSBzZXVsZSDigJQgbWFyZ2VzLCBsYXJnZXVyIGRlXG4gICBsZWN0dXJlLCB0aXRyZXMsIHB1Y2VzIGQndW4gdnJhaSB0ZXh0ZSByw6lkaWfDqS4gU2EgZ3JpbGxlIMOgIGx1aSBuZSBzJ2FybWUgcGFzIDogaWwgbidhIHBsdXNcbiAgIGQnaW1hZ2UsIGV0IGAuYXJ0aWNsZVZpdHJpbmU6bm90KDpoYXMoaW1nKSlgIChhcnRpY2xlVml0cmluZS5jc3MpIGxlIHJlbWV0IHN1ciB1bmUgY29sb25uZS5cblxuICAg4pqg77iPIFVuIHPDqWxlY3RldXIgcXVpIHZpc2UgbGEgZ3JpbGxlIMOpY3JpdCBgLnBhZ2VTY2VuZSA+YCA7IGAucGFnZVNjZW5lYCBlbiBhbmPDqnRyZSAoc2Fuc1xuICAgYD5gKSByZXN0ZSBqdXN0ZSwgaWwgZMOpc2lnbmUgbGEgcGFnZSBlbnRpw6hyZS5cblxuICAgVE9VVCBDRSBRVSdPTiBDTElRVUUgRVNUIMOAIERST0lURSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDcpIDogbGUgdmlzdWVsIG91dnJlXG4gICBsJ2FwZXLDp3UsIGV0IGxlIGNhZHJlIHNvdXMgbGUgdmlzdWVsIHBvcnRlIGwnaWPDtG5lLCBsZSBub20gZGUgbGEgc2PDqG5lIGV0IExFUyBERVVYXG4gICBCT1VUT05TLiBMYSBiYXJyZSBkJ2FjdGlvbnMgcXVpIGNvdXBhaXQgbGEgY29sb25uZSBkZSBsZWN0dXJlIGVudHJlIGxhIGRlc2NyaXB0aW9uIGV0IGxhXG4gICBwcsOpc2VudGF0aW9uIGEgZGlzcGFydSDigJQgbGEgY29sb25uZSBkZSBnYXVjaGUgbmUgY29udGllbnQgcGx1cyBxdWUgZHUgdGV4dGUsIGV0IHNlIGxpdFxuICAgZCd1biB0cmFpdC5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBRVUFUUkUgUEFMSUVSUywgTk9NTcOJUyBVTiBQQVIgVU4gKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KVxuXG4gICDimqDvuI8gREVQVUlTIExFIDIwMjYtMDktMTcsIFNPVVMgMTE1MCBMJ0lDw5RORSBFVCBMRVMgQk9VVE9OUyBTT05UIE1BU1FVw4lTIChibG9jIMKrIE5JIElDw5RORVxuICAgTkkgQk9VVE9OUyDCuywgcGx1cyBiYXMpLCBldCBsJ2VuY2FkcsOpIGRpc3BhcmHDrnQgYXZlYyBldXguIGBwYWxpZXJJY29uZUxpZ25lYCBldFxuICAgYHBhbGllckljb25lUGxlaW5lTGFyZ2V1cmAgbidvbnQgcGx1cyBkJ3VzYWdlLCBldCBsZXMgbGFyZ2V1cnNcbiAgIGRlIGNhZHJlIGNpdMOpZXMgY2ktZGVzc291cyAoMzg0cHgsIDI0MHB4KSBuZSB2YWxlbnQgcGx1cyBxdWUgcG91ciBsYSBtYXF1ZXR0ZSBkJ2FydGljbGUuXG4gICBMZSB0YWJsZWF1IGV0IGxlcyBjYWxjdWxzIHNvbnQgw6AgcmVwcmVuZHJlIHF1YW5kIGwnw6ljcmFuIMOpdHJvaXQgc2VyYSBhcnLDqnTDqS5cblxuICAgQ2V0dGUgcGFnZSBhIHBsdXMgZCfDqXRhdHMgcXUndW4gYXJ0aWNsZSwgZXQgY2hhY3VuIHRpZW50IMOgIHVuZSBtZXN1cmUgRElGRsOJUkVOVEUuIE9uIG5lXG4gICBjaGVyY2hlIGRvbmMgcGFzIHVuZSBjYXNjYWRlIHVuaXF1ZSA6IGNoYXF1ZSBwYWxpZXIgcsOpcG9uZCDDoCBVTkUgcXVlc3Rpb24sIGlsIHBvcnRlIHVuXG4gICBub20gcXVpIGRpdCBsYXF1ZWxsZSwgZXQgaWxzIHNlIGNvbWJpbmVudC5cblxuICAgICAgIHBhbGllckNhZHJlU2NlbmUgICAgICAgICAxMTUwcHggICBsYSBjb2xvbm5lIGRlIGRyb2l0ZSBkJ3VuIGFydGljbGUgbG9nZS10LWVsbGUgbGUgY2FkcmUgP1xuICAgICAgIHBhbGllckljb25lTGlnbmUgICAgICAgICAgODAwcHggICBsJ2ljw7RuZSB0aWVudC1lbGxlIGRhbnMgbGUgY2FkcmUgUE9Tw4kgRU4gTElHTkUsIMOgIGPDtHTDqSBkdSB2aXN1ZWwgP1xuICAgICAgIHBhbGllclZpc3VlbENhZHJlICAgICAgICAgNjUwcHggICBsZSB2aXN1ZWwgZXQgbGUgY2FkcmUgdGllbm5lbnQtaWxzIGPDtHRlIMOgIGPDtHRlID9cbiAgICAgICBwYWxpZXJJY29uZVBsZWluZUxhcmdldXIgIDQ2MHB4ICAgbCdpY8O0bmUgdGllbnQtZWxsZSBkYW5zIGxlIGNhZHJlIEVOIFBMRUlORSBMQVJHRVVSID9cblxuICAgQ0UgUVVFIMOHQSBET05ORSDDgCBMJ8OJQ1JBTiwgZHUgcGx1cyBsYXJnZSBhdSBwbHVzIMOpdHJvaXQgOlxuXG4gICAgIOKJpSAxMTUwICAgbWFxdWV0dGUgZCdhcnRpY2xlIDogbGUgdGV4dGUgw6AgZ2F1Y2hlLCBsZSB2aXN1ZWwgZXQgc29uIGNhZHJlIGNvbGxhbnRzIMOgXG4gICAgICAgICAgICAgIGRyb2l0ZS4gSWPDtG5lIHByw6lzZW50ZS4gQ2FkcmUgMzg0cHgsIGNvbG9ubmUgZCdhcnRpY2xlIDQwMXB4IGV0IHBsdXMuXG4gICAgIDgwMOKGkjExNDkgdW5lIHNldWxlIGNvbG9ubmUuIExlIHRpdHJlLCBwdWlzIFNVUiBVTkUgTcOKTUUgTElHTkUgbGUgdmlzdWVsIMOgIGdhdWNoZSBldCBsZVxuICAgICAgICAgICAgICBjYWRyZSDDoCBkcm9pdGUsIHB1aXMgbGUgdGV4dGUuIEljw7RuZSBwcsOpc2VudGUsIGNhZHJlIDM4NHB4LlxuICAgICA2NTDihpI3OTkgIGxhIG3Dqm1lIGxpZ25lLCBNQUlTIFNBTlMgTCdJQ8OUTkUsIEVUIFNBTlMgTEUgQ0FEUkUgOiBwbHVzIGRlIGZpbGV0IG5pIGRlXG4gICAgICAgICAgICAgIHBhZGRpbmcsIGxlIGJsb2MgdG9tYmUgw6AgMjQwcHgg4oCUIGxhIGxhcmdldXIgbnVlIGRlIHNhIGNvbG9ubmUuIEMnZXN0IGNlIHF1aVxuICAgICAgICAgICAgICBsYWlzc2UgYXUgdmlzdWVsIGRlIHF1b2kgcmVzdGVyIGxpc2libGUganVzcXUnw6AgNjUwLlxuICAgICA0NjDihpI2NDkgIHRvdXQgZW1waWzDqSwgRVQgREFOUyBMJ0FVVFJFIFNFTlMgOiBsZSBibG9jIEFVLURFU1NVUywgbGUgdmlzdWVsIEVOIERFU1NPVVMuXG4gICAgICAgICAgICAgIEwnaWPDtG5lIHJldmllbnQg4oCUIGVuIHBsZWluZSBsYXJnZXVyLCBsYSBwbGFjZSBlc3QgbMOgIGRlIG5vdXZlYXUuIFRvdWpvdXJzIHNhbnNcbiAgICAgICAgICAgICAgZmlsZXQgbmkgcGFkZGluZy5cbiAgICAgPCA0NjAgICAgbGUgbcOqbWUgZW1waWxlbWVudCwgc2FucyBsJ2ljw7RuZS5cblxuICAg4pqg77iPIExFIMKrIENBRFJFIMK7IE4nRU4gRVNUIFVOIFFVJ0FVLURFU1NVUyBERSA4MDAgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KSA6IGVuXG4gICBkZXNzb3VzLCBpbCBwZXJkIHNvbiBmaWxldCBldCBzb24gcGFkZGluZyBldCBuJ2VzdCBwbHVzIHF1J3VuIGdyb3VwZSBkJ8OpbMOpbWVudHMuIExlIG5vbSBkZVxuICAgY2xhc3NlIHJlc3RlIGAuc2NlbmVDYXJ0ZWAg4oCUIGMnZXN0IGxlIG3Dqm1lIGJsb2MsIGlsIG4nYSBwbHVzIGxlIG3Dqm1lIGhhYmlsbGFnZS4gTGVzXG4gICBtZXN1cmVzIGNpLWRlc3N1cyBlbiB0aWVubmVudCBjb21wdGUgOiBzb3VzIDgwMCwgcmV0aXJlciBsZSBwYWRkaW5nIHJlbmQgNDBweC5cblxuICAg4pqg77iPIEwnSUPDlE5FIE4nRVNUIFBBUyBNT05PVE9ORSA6IHByw6lzZW50ZSwgYWJzZW50ZSwgcHLDqXNlbnRlLCBhYnNlbnRlLiBDZSBuJ2VzdCBwYXMgdW5lXG4gICBpbmNvaMOpcmVuY2UsIGMnZXN0IGxhIGNvbnPDqXF1ZW5jZSBkZXMgZGV1eCBmb3JtZXMgZHUgY2FkcmUuIEVuIGxpZ25lIMOgIGPDtHTDqSBkdSB2aXN1ZWwsIGxlXG4gICBjYWRyZSBkb2l0IMOqdHJlIG1haWdyZSDigJQgbCdpY8O0bmUgY2/Du3RlIDEwNHB4ICg4NCArIGxlIGdhcCkgcXVlIGxlIHZpc3VlbCBuJ2EgcGx1cy4gRW5cbiAgIHBsZWluZSBsYXJnZXVyLCBjZXMgMTA0cHggbmUgY2/Du3RlbnQgcmllbiDDoCBwZXJzb25uZSA6IGwnaWPDtG5lIHJldmllbnQuIFB1aXMgbGEgZmVuw6p0cmVcbiAgIGRldmllbnQgc2kgw6l0cm9pdGUgcXVlIG3Dqm1lIGzDoCBpbHMgbmUgdGllbm5lbnQgcGx1cy5cblxuICAg4pqg77iPIFNBTlMgUFLDiVBST0NFU1NFVVIsIHVuIHBhbGllciBuZSBwZXV0IHBhcyDDqnRyZSB1bmUgdmFyaWFibGUgOiBsZSBwcm9qZXQgbidhIG5pIFBvc3RDU1NcbiAgIG5pIFNhc3MsIGV0IGBAbWVkaWEgKG1pbi13aWR0aDogdmFyKC0teCkpYCBlc3QgaW52YWxpZGUg4oCUIGxhIHLDqGdsZSBlc3QgaWdub3LDqWUgRU4gU0lMRU5DRS5cbiAgIExlIG5vbSBlc3QgZG9uYyBwb3J0w6kgcGFyIHVuIGpldG9uIGBAcGFsaWVyIDxub20+YCBlbiBjb21tZW50YWlyZSBzdXIgQ0hBUVVFIG1lZGlhIHF1ZXJ5XG4gICBxdWkgbCdlbXBsb2llLiBgZ3JlcCAtcm4gXCJAcGFsaWVyXCIgYXNzZXRzL2AgbGVzIHRyb3V2ZSB0b3V0ZXMuXG5cbiAgIOKaoO+4jyBBVUNVTiBkZSBjZXMgcXVhdHJlIG4nZXN0IHVuZSBkZXMgY29uc3RhbnRlcyBkdSBwcm9qZXQgKDY0MCwgNzY4LCAxMDI0LCAxMjgwIOKAlFxuICAgYXNzZXRzL3ZpdHJpbmUvY3NzL0NMQVVERS5tZCwgcXVpIGRpdCBlbmNvcmUgwqsgcXVhdHJlIHBhbGllcnMsIHBhcyB1biBkZSBwbHVzIMK7KS4gQ2hhY3VuXG4gICBlc3QgY2FsY3Vsw6ksIGV0IGxlIGNhbGN1bCBlc3Qgw6ljcml0IMOgIGPDtHTDqSA6IGlscyBib3VnZW50IGF2ZWMgbGEgbGFyZ2V1ciBkZSBsYSBjb2xvbm5lXG4gICAoMjQwcHgpLCBjZWxsZSBkZSBsJ2ljw7RuZSAoODRweCkgZXQgbGVzIHBhZGRpbmdzLiBTaSBsJ3VuZSBkZSBjZXMgdHJvaXMgdmFsZXVycyBjaGFuZ2UsXG4gICBUT1VTIHNvbnQgw6AgcmVmYWlyZS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBMQSBHUklMTEUgREUgUEFHRVxuICAgTGVzIGRldXggY29sb25uZXMgZCd1biBhcnRpY2xlLCByZWNvcGnDqWVzIGljaSBwYXJjZSBxdSdlbGxlcyBwb3J0ZW50IGxhIFBBR0UgZXQgbm9uXG4gICBsJ2FydGljbGUgOiBgYXJ0aWNsZVZpdHJpbmVgIG5lIHBldXQgcGFzIGxlcyBmb3VybmlyIHNhbnMgaW1wb3NlciBkdSBtw6ptZSBjb3VwIHNlcyByw6hnbGVzXG4gICBkZSBwYXJhZ3JhcGhlIMOgIGwnZW52ZWxvcHBlLiBMZXMgZGV1eCBjaGlmZnJlcyBzb250IGNldXggZCdhcnRpY2xlVml0cmluZS5jc3MsIMOgIGRlc3NlaW4g4oCUXG4gICBsYSBwYWdlIGRvaXQgc2UgbGlyZSBjb21tZSB1biBhcnRpY2xlIDpcbiAgICAgbWluKDQ1MHB4LCAzNy41JSkgIGxhIGNvbG9ubmUgZGUgZHJvaXRlLCBwcm9wb3J0aW9ubmVsbGUgZXQgcGxhZm9ubsOpZSA7XG4gICAgIGdhcCAwIC0tZ2FwQ29sb25uZXMgYXVjdW4gw6ljYXJ0IGVudHJlIGxlcyBsaWduZXMgKGxlIHZpc3VlbCBzJ8OpdGlyZSBzdXIgMTAwIGQnZW50cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsbGVzKSwgLS1nYXBDb2xvbm5lcyAoNHJlbSkgZW50cmUgbGVzIGNvbG9ubmVzLlxuICAgYGFsaWduLWl0ZW1zOiBzdGFydGAgOiBzYW5zIGx1aSwgdW4gw6lsw6ltZW50IGRlIGdyaWxsZSBlc3Qgw6l0aXLDqSBzdXIgdG91dGUgbGEgaGF1dGV1ciBkZSBzYVxuICAgcmFuZ8OpZSBldCBgcG9zaXRpb246IHN0aWNreWAgbidhIHBsdXMgZGUgcXVvaSBqb3Vlci5cbiAgIFNvdXMgcGFsaWVyQ2FkcmVTY2VuZSwgdG91dCBjZWNpIGVzdCBkw6ltb250w6kg4oCUIHZvaXIgbGUgcGFsaWVyIHN1aXZhbnQuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLnBhZ2VTY2VuZSB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBtaW4oNDUwcHgsIDM3LjUlKTtcbiAgICBnYXA6IDAgdmFyKC0tZ2FwQ29sb25uZXMpO1xuICAgIGFsaWduLWl0ZW1zOiBzdGFydDtcbn1cblxuLyogTEUgVElUUkUgQ09VUlQgU1VSIFRPVVRFIExBIExBUkdFVVIgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KSDigJQgZXhhY3RlbWVudFxuICAgY29tbWUgY2VsdWkgZCd1biBhcnRpY2xlIG91IGQndW5lIHBhZ2UgZGUgcnVicmlxdWUgOiBgLmFydGljbGVWaXRyaW5lID4gaDFgIGVzdCBlblxuICAgYGdyaWQtY29sdW1uOiAxIC8gLTFgIChhcnRpY2xlVml0cmluZS5jc3MpLCBldCBsYSBwYWdlIGQndW5lIHNjw6huZSBkb2l0IHNlIGxpcmUgY29tbWUgdW5cbiAgIGFydGljbGUuIFJpZW4gbmUganVzdGlmaWFpdCBxdSd1biB0aXRyZSBkZSBzY8OobmUgc29pdCBsZSBzZXVsIGR1IHNpdGUgw6AgcydhcnLDqnRlciBhdVxuICAgbWlsaWV1LlxuXG4gICBFVCDDh0EgTkUgRMOJUExBQ0UgUklFTi4gTGUgY29tbWVudGFpcmUgcXVpIHZpdmFpdCBpY2kgYWZmaXJtYWl0IHF1ZSBjJ8OpdGFpdCBsZSB0aXRyZSwgZW5cbiAgIHJlc3RhbnQgZGFucyBsYSBjb2xvbm5lIGRlIGdhdWNoZSwgcXVpIGZhaXNhaXQgY29tbWVuY2VyIGxlIHZpc3VlbCBBVSBOSVZFQVUgRFUgVEVYVEUuXG4gICBDJ8OpdGFpdCBmYXV4IDogY2UgcXVpIGxlIGZhaXQsIGMnZXN0IGxhIGBncmlkLXJvd2AgcG9zw6llIHN1ciBsZSB2aXN1ZWwgbHVpLW3Dqm1lLCBqdXN0ZSBlblxuICAgZGVzc291cyDigJQgdW5lIHBsYWNlIGV4cGxpY2l0ZSwgcXVlIGxhIGxhcmdldXIgZHUgdGl0cmUgbidhdHRlaW50IHBhcy4gQydlc3QgbGUgbW90aWZcbiAgIGQnYXJ0aWNsZVZpdHJpbmUuY3NzLCBvw7kgbGUgdGl0cmUgZXN0IHBsZWluZSBsYXJnZXVyIEVUIGwnaW1hZ2UgcGxhY8OpZSDDoCBsYSBsaWduZSBkdSB0ZXh0ZS5cblxuICAgTEVTIE1BUkdFUy4gM3JlbSBhdS1kZXNzdXMsIGNvbW1lIHVuIHRpdHJlIGQnYXJ0aWNsZS4gRW4gZGVzc291cywgLS1nYXBEZWZhdXQgOiBsZSB0aXRyZVxuICAgbidlc3QgcGx1cyBzZXVsLCBsJ8OpdGlxdWV0dGUgZGUgbGEgc2PDqG5lIGxlIHN1aXQgaW1tw6lkaWF0ZW1lbnQgZXQgZm9ybWUgYXZlYyBsdWkgVU4gYmxvY1xuICAgZGUgdMOqdGUuIEMnZXN0IGwnw6l0aXF1ZXR0ZSBxdWkgcG9ydGUgbGVzIDNyZW0ganVzcXUnYXUgdGV4dGUg4oCUIGxhIGRpc3RhbmNlIHRvdGFsZSBkdSB0aXRyZVxuICAgYXUgcHJlbWllciBwYXJhZ3JhcGhlIGVzdCBkb25jIGluY2hhbmfDqWUuICovXG4ucGFnZVNjZW5lID4gaDEge1xuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XG4gICAgbWFyZ2luLWJsb2NrOiB2YXIoLS1tYXJnZVRpdHJlUGFnZSkgdmFyKC0tZ2FwRGVmYXV0KTtcbn1cblxuLyogTEEgTElHTkUgREUgQ09NTUFOREVTLCBTT1VTIExFIFRJVFJFIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNykgOiDCqyBKb3VlciBsYVxuICAgc2PDqG5lIMK7IGV0IMKrIFV0aWxpc2VyIMK7IGQndW4gY8O0dMOpLCBsJ8OpdGlxdWV0dGUgZXQgc29uIGPFk3VyIChicmlxdWUgbm95YXVcbiAgIGAuZXRpcXVldHRlSmFpbWVgKSBkZSBsJ2F1dHJlLCBwb3Vzc8OpcyBjaGFjdW4gY29udHJlIHNvbiBib3JkLlxuICAgTGlnbmUgMiwgY29sb25uZSAxIDogc3VyIGxhIGxhcmdldXIgZGUgbGEgY29sb25uZSBkZSBsZWN0dXJlLCBwYXMgY2VsbGUgZHUgdGl0cmUuXG4gICBgZmxleC13cmFwYCA6IHNpIGxhIGxpZ25lIG5lIHRpZW50IHBsdXMsIGwnw6l0aXF1ZXR0ZSBwYXNzZSBkZXNzb3VzIHBsdXTDtHQgcXVlIGRlIGTDqWJvcmRlci5cbiAgIExhIG1hcmdlIGJhc3NlIGVzdCBjZWxsZSBxdWUgbGUgdGl0cmUgbidhIHBsdXMgOiBlbnNlbWJsZSBpbHMgZm9udCAzcmVtIGp1c3F1J2F1IHRleHRlLlxuICAg4pqg77iPIEJPVVRPTlMgw4AgR0FVQ0hFIE9VIMOAIERST0lURSA6IMOgIHRyYW5jaGVyIChjaGVmIGRlIHByb2pldCkuIFBvdXIgZXNzYXllciBsJ2F1dHJlXG4gICBjw7R0w6ksIGBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2VgIHN1ciBjZXR0ZSByw6hnbGUuICovXG4ucGFnZVNjZW5lID4gLnBhZ2VTY2VuZUNvbW1hbmRlcyB7XG4gICAgZ3JpZC1jb2x1bW46IDE7XG4gICAgZ3JpZC1yb3c6IDI7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgLyogLS1nYXBMYXJnZSBkYW5zIGxlcyBkZXV4IHNlbnMgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE3KSA6IGxlcyBib3V0b25zIGV0XG4gICAgICAgbCfDqXRpcXVldHRlIHNvbnQgZGV1eCBjaG9zZXMgZGlzdGluY3RlcywgcGFzc8OpcyBsJ3VuIHNvdXMgbCdhdXRyZSBpbHMgcmVzdGVudCBzw6lwYXLDqXMuICovXG4gICAgZ2FwOiB2YXIoLS1nYXBMYXJnZSk7XG4gICAgbWFyZ2luLWJvdHRvbTogM3JlbTtcbn1cblxuLyogTGVzIGRldXggYm91dG9ucyBjw7R0ZSDDoCBjw7R0ZSwgw6AgbGV1ciBsYXJnZXVyIG5hdHVyZWxsZS4gLS1nYXBEZWZhdXQgZGFucyBsZXMgZGV1eCBzZW5zXG4gICAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTcpIDogaWxzIHZvbnQgZW5zZW1ibGUsIGPDtHRlIMOgIGPDtHRlIGNvbW1lIGwndW4gc291c1xuICAgbCdhdXRyZS4gKi9cbi5wYWdlU2NlbmVCb3V0b25zIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBnYXA6IHZhcigtLWdhcERlZmF1dCk7XG59XG5cbi8qIExhIGNvbG9ubmUgZGUgbGVjdHVyZSA6IGwnYXJ0aWNsZSwgbGVzIHF1ZXN0aW9ucywgbGVzIHNjw6luYXJpb3MsIHRvdXMgw6AgbGEgbcOqbWUgbGFyZ2V1ci5cbiAgIExJR05FIDMsIMOJQ1JJVEUgRVQgTk9OIERFVklOw4lFIDogYydlc3QgbGEgbGlnbmUgc3VyIGxhcXVlbGxlIGxlIHZpc3VlbCBzJ2FsaWduZS4gTGVcbiAgIHBsYWNlbWVudCBhdXRvbWF0aXF1ZSBsYSB0cm91dmFpdCBkw6lqw6AgKGxlIHRpdHJlIG9jY3VwZSBsYSAxLCBsZXMgY29tbWFuZGVzIGxhIDIpLCBtYWlzIGlsXG4gICBsYSB0cm91dmFpdCBwYXIgYWNjaWRlbnQg4oCUIGxhIHBvc2VyIG5vaXIgc3VyIGJsYW5jIG1ldCBsZXMgZGV1eCBjb2xvbm5lcyBkJ2FjY29yZCBkZVxuICAgZmHDp29uIHZpc2libGUsIHBsdXTDtHQgcXVlIGRlIGZhaXJlIGTDqXBlbmRyZSBsJ2FsaWduZW1lbnQgZGUgbCdvcmRyZSBkZXMgYmFsaXNlcy4gKi9cbi5wYWdlU2NlbmUgPiAucGFnZVNjZW5lQ29sb25uZSB7XG4gICAgZ3JpZC1jb2x1bW46IDE7XG4gICAgZ3JpZC1yb3c6IDM7XG59XG5cbi8qIExFIFZJU1VFTCwgY29sb25uZSBkZSBkcm9pdGUsIMOAIFBBUlRJUiBERSBMQSBMSUdORSAzIOKAlCBkb25jIGF1IG5pdmVhdSBkZSBMJ0FSVElDTEUsIHBhc1xuICAgZHUgdGl0cmUgbmkgZGUgbCfDqXRpcXVldHRlLiBDJ2VzdCBsZSBtb3RpZiBkZSBgLmFydGljbGVWaXRyaW5lID4gcDpoYXMoaW1nKWAgOiBsJ2ltYWdlXG4gICBkJ3VuIGFydGljbGUgY29tbWVuY2Ugw6AgaGF1dGV1ciBkZSBzb24gdGV4dGUsIGV0IGNlbGxlIGQndW5lIHNjw6huZSBkb2l0IGZhaXJlIHBhcmVpbC5cblxuICAg4pqg77iPIExJR05FIDMsIEVUIFBBUyAyIChjb3JyZWN0aW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTYpLiBMYSByw6hnbGUgZGlzYWl0IDIgdGFudCBxdWUgbGFcbiAgIGdyaWxsZSBuJ2F2YWl0IHF1ZSB0cm9pcyBwacOoY2VzIOKAlCBsZSB0aXRyZSBlbiAxLCBsZSB0ZXh0ZSBlbiAyLiBMJ8OpdGlxdWV0dGUgZXN0IHZlbnVlXG4gICBzJ2ludGVyY2FsZXIgZW4gbGlnbmUgMiBsZSBtw6ptZSBqb3VyIDogbGUgdmlzdWVsIHMnZXN0IGRvbmMgcmV0cm91dsOpIMOgIFNBIGhhdXRldXIsIGF1LVxuICAgZGVzc3VzIGR1IHByZW1pZXIgcGFyYWdyYXBoZS4gVW5lIGxpZ25lIGRlIHBsdXMgZGFucyBsYSBjb2xvbm5lIGRlIGdhdWNoZSA9IHVuZSBsaWduZSBkZVxuICAgcGx1cyBpY2ksIHNpbm9uIGwnaW1hZ2UgZMOpY29sbGUgZHUgdGV4dGUuXG4gICBMZSBjb21wdGUgc2UgbGl0IGRhbnMgbCdlbi10w6p0ZSBkdSBmaWNoaWVyIDogaDEgPSAxLCBjb21tYW5kZXMgPSAyLCBjb2xvbm5lIGRlIGxlY3R1cmUgPSAzLlxuXG4gICDDiXRpcsOpIHN1ciAxMDAgbGlnbmVzIDogbGVzIGxpZ25lcyB2aWRlcyBvbnQgdW5lIGhhdXRldXIgbnVsbGUsIGV0IGNldHRlIGFpcmUgbHVpIGRvbm5lIGRlXG4gICBxdW9pIGNvdXJpciBqdXNxdSdhdSBiYXMgZGUgbGEgcGFnZS4gKi9cbi5wYWdlU2NlbmUgPiAucGFnZVNjZW5lVmlzdWVsIHtcbiAgICBncmlkLWNvbHVtbjogMjtcbiAgICBncmlkLXJvdzogMyAvIHNwYW4gMTAwO1xufVxuXG4vKiBMJ2ltYWdlIMOpcG91c2Ugc2EgY29sb25uZSwgZWxsZSBuJ2ltcG9zZSBwYXMgc2EgdGFpbGxlIDogYydlc3QgbGEgcGlzdGUgZGUgZ3JpbGxlIHF1aVxuICAgcGxhZm9ubmUgw6AgNDUwcHggZXQgc2UgcsOpZHVpdCBxdWFuZCBsYSBmZW7DqnRyZSBzZSByZXNzZXJyZS4gQ2V0dGUgcsOoZ2xlIHZlbmFpdFxuICAgZCdhcnRpY2xlVml0cmluZS5jc3MsIHF1aSBuZSB2b2l0IHBsdXMgY2UgdmlzdWVsLiAqL1xuLnBhZ2VTY2VuZVZpc3VlbCBpbWcge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBMRVMgQVVUUkVTIEFQRVLDh1VTIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNylcbiAgIFVuZSBzY8OobmUgYSBzb3V2ZW50IGRldXggYXBlcsOndXMsIHBhcmZvaXMgcXVhdHJlLCBldCBjaGFjdW4gbW9udHJlIGF1dHJlIGNob3NlLiBMZXVyc1xuICAgaW1hZ2VzIHNlIHBvc2VudCDDoCBsYSBzdWl0ZSwgc291cyBsZSBjYWRyZSwgZGFucyBsYSBjb2xvbm5lIGRlIGRyb2l0ZS4gRWxsZXMgTU9OVFJFTlRcbiAgIHNldWxlbWVudCA6IGF1Y3VuZSBuJ2VzdCBjbGlxdWFibGUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KS5cblxuICAgQ0FDSMOJRVMgUEFSIETDiUZBVVQsIG1vbnRyw6llcyBzZXVsZW1lbnQgbMOgIG/DuSBpbCB5IGEgdW5lIGNvbG9ubmUgZGUgZHJvaXRlLiBDJ2VzdCBsZSBzZW5zXG4gICBkZSBsYSByw6hnbGUgOiBzYW5zIGNldHRlIGNvbG9ubmUgZWxsZXMgbmUgc2VyYWllbnQgcGx1cyDDoCBjw7R0w6kgZGUgcmllbiwgZXQgcmFsbG9uZ2VyYWllbnRcbiAgIGxhIHBhZ2UgYXZhbnQgc2EgcHJlbWnDqHJlIGxpZ25lIGRlIHRleHRlLiBMZSBgZGlzcGxheTogbm9uZWAgZGUgYmFzZSArIGxlIHLDqXRhYmxpc3NlbWVudFxuICAgc291cyBwYWxpZXJDYWRyZVNjZW5lLCBwbHV0w7R0IHF1ZSBsJ2ludmVyc2UgOiBhaW5zaSB0b3V0IG5vdXZlYXUgcGFsaWVyIGxlcyBsYWlzc2UgY2FjaMOpZXNcbiAgIHRhbnQgcXUnb24gbmUgbCdhIHBhcyBkw6ljaWTDqS5cbiAgIEF2ZWMgYGxvYWRpbmc9XCJsYXp5XCJgIChwb3PDqSBkYW5zIGxlIFR3aWcpLCBjYWNow6llcyBlbGxlcyBuZSBzb250IHBhcyBtw6ptZSB0w6lsw6ljaGFyZ8OpZXMuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLnBhZ2VTY2VuZVZpc3VlbFN1aXRlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgYHBhbGllckNhZHJlU2NlbmVgIOKAlCAxMTUwcHhcbiAgIEFVLURFU1NVUywgbGEgY29sb25uZSBkZSBkcm9pdGUgZCd1biBhcnRpY2xlIGxvZ2UgbGUgY2FkcmUgZGUgbGEgc2PDqG5lIDsgRU4gREVTU09VUywgbm9uLlxuXG4gICBMRSBDQUxDVUwuIExlIGNhZHJlIG1lc3VyZSAzODRweCA6IDIwIGRlIHBhZGRpbmcgKyA4NCBkJ2ljw7RuZSArIDIwIGRlIGdhcCArIDI0MCBkZSBjb2xvbm5lXG4gICArIDIwIGRlIHBhZGRpbmcuIExhIGNvbG9ubmUgZGUgZHJvaXRlIGQndW4gYXJ0aWNsZSB2YXV0IGBtaW4oNDUwcHgsIDM3LjUlKWAgZHUgY29udGVuZXVyXG4gICAoYXJ0aWNsZVZpdHJpbmUuY3NzKSwgZXQgbGUgY29udGVuZXVyIHZhdXQgbGEgZmVuw6p0cmUgbW9pbnMgbGVzIDLDlzQwcHggZGUgLmNvbnRlbnUsXG4gICBwbGFmb25uw6llIMOgIDEyMDAuIElsIGZhdXQgZG9uYyA6XG4gICAgICAgKGZlbsOqdHJlIOKIkiA4MCkgw5cgMzcuNSUg4omlIDM4NCAgIOKGkiAgIGZlbsOqdHJlIOKJpSAxMTA0XG4gICAxMTUwIGxhaXNzZSA0NnB4IGRlIG1hcmdlIDogw6AgMTE1MCBsYSBjb2xvbm5lIGZhaXQgNDAxcHggcG91ciB1biBjYWRyZSBkZSAzODQuXG4gICBBdWN1bmUgY29uc3RhbnRlIGR1IHByb2pldCBuZSB0b21iZSBlbnRyZSAxMTA0IGV0IDEyODAgOiDDoCAxMDI0IGxhIGNvbG9ubmUgZmFpdCAzNTRweCBldFxuICAgbGUgY2FkcmUgZMOpYm9yZGUgZGUgMzBweCDigJQgYydlc3QgbGUgZMOpZmF1dCBxdSdvbiB2b3lhaXQgw6AgbCfDqWNyYW4gOyDDoCAxMjgwIG9uIHBlcmRhaXQgbGFcbiAgIG1hcXVldHRlIGQnYXJ0aWNsZSBzdXIgMTMwcHggb8O5IGVsbGUgdGVuYWl0IHRyw6hzIGJpZW4uXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogQHBhbGllciBwYWxpZXJDYWRyZVNjZW5lICovXG5AbWVkaWEgKG1pbi13aWR0aDogMTE1MHB4KSB7XG4gICAgLyogTEUgVklTVUVMIFNVSVQgTEUgRMOJRklMRU1FTlQsIERVIEhBVVQgRU4gQkFTIERFIExBIFBBR0UuIEF1IHJlcG9zIGlsIGNvbW1lbmNlIEFVXG4gICAgICAgTklWRUFVIERVIFRFWFRFIGV0IG5vbiBkdSB0aXRyZSDigJQgYydlc3QgbGEgbGlnbmUgMiBkZSBsYSBncmlsbGUgZGUgcGFnZSwgcG9zw6llIHBsdXNcbiAgICAgICBoYXV0LiBQdWlzLCBxdWFuZCBvbiBkZXNjZW5kLCBpbCBzZSBjYWxlIGVuIGhhdXQgZGUgbGEgZmVuw6p0cmUgZXQgeSByZXN0ZSA6IHNvbiBhaXJlXG4gICAgICAgZXN0IMOpdGlyw6llIHN1ciAxMDAgbGlnbmVzLCBlbGxlIGNvdXZyZSBkb25jIHRvdXQgY2UgcXVlIGxhIGNvbG9ubmUgZGUgZ2F1Y2hlIGVtcGlsZSxcbiAgICAgICBsZXMgcXVlc3Rpb25zIGV0IGxlcyBzY8OpbmFyaW9zIGNvbXByaXMuXG4gICAgICAgQydlc3QgY2UgcXVpIGZhaXQgdGVuaXIgbGVzIGRldXggYm91dG9ucyA6IGlscyBzb250IERBTlMgY2UgYmxvYywgaWxzIHJlc3RlbnQgZG9uY1xuICAgICAgIHNvdXMgbGVzIHlldXggZHUgdmlzaXRldXIganVzcXUnZW4gYmFzLCBzYW5zIGJhcnJlIGNvbGxhbnRlIMOgIHBhcnQuXG4gICAgICAg4pqg77iPIEMnZXN0IHByw6ljaXPDqW1lbnQgcG91ciDDp2EgcXVlIGxhIGdyaWxsZSBlc3Qgc3VyIGxhIFBBR0UgZXQgbm9uIHN1ciBsJ2FydGljbGUgOiB1blxuICAgICAgIMOpbMOpbWVudCBjb2xsYW50IG5lIGTDqXBhc3NlIGphbWFpcyBzb24gY29udGVuZXVyLCBldCBsZSB2aXN1ZWwgcydhcnLDqnRhaXQgYXZlYyBsZSB0ZXh0ZVxuICAgICAgIGRlIGxhIHNjw6huZSAoZMOpZmF1dCByZWxldsOpIHBhciBsZSBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KS5cbiAgICAgICAyMHB4IGR1IGJvcmQsIGNvbW1lIGxlIG1lbnUgZGVzIGNoYXBpdHJlcyBldCBsZSBwYW5uZWF1IGRlIGZpbHRyZXMgKHBhZ2VDaGFwaXRyZXMuY3NzLFxuICAgICAgIHNjZW5hcmlvc0NhdGFsb2d1ZS5jc3MpIDogdHJvaXMgYmxvY3MgY29sbGFudHMsIHVuIHNldWwgw6ljYXJ0LlxuXG4gICAgICAgVE9VSk9VUlMgTElTSUJMRSBFTiBFTlRJRVIgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KS4gYHRvcGAgcydhZGFwdGUgw6AgbGFcbiAgICAgICBoYXV0ZXVyIGRlIGxhIGNvbG9ubmUsIG1lc3Vyw6llIHBhciB2aXN1ZWxDb2xsYW50LnRzICgtLWhhdXRldXJWaXN1ZWwpIDpcbiAgICAgICAgIOKAoiBlbGxlIHRpZW50IGRhbnMgbGEgZmVuw6p0cmUg4oaSIDIwcHggOiBjYWzDqWUgZW4gaGF1dCA7XG4gICAgICAgICDigKIgZWxsZSBkw6lwYXNzZSDihpIgbsOpZ2F0aWYgOiBlbGxlIGTDqWZpbGUgYXZlYyBsYSBwYWdlIGp1c3F1J8OgIG1vbnRyZXIgc29uIGJhcywgcHVpcyBzZVxuICAgICAgICAgICBjYWxlIHBhciBsZSBiYXMsIMOgIDIwcHguIE9uIG5lIGTDqWZpbGUgcGFzIMOgIGwnaW50w6lyaWV1ciBkJ3VuIMOpbMOpbWVudCBjb2xsYW50IDpcbiAgICAgICAgICAgc2FucyDDp2EsIHRvdXQgY2UgcXVpIGTDqXBhc3NlIHNlcmFpdCBpbmF0dGVpZ25hYmxlLlxuICAgICAgIFNhbnMgSmF2YVNjcmlwdCwgbGEgdmFyaWFibGUgbWFucXVlIGV0IHZhdXQgMCA6IGB0b3BgIHJldG9tYmUgw6AgMjBweCwgbGUgY29tcG9ydGVtZW50XG4gICAgICAgZCdhdmFudC4gKi9cbiAgICAucGFnZVNjZW5lID4gLnBhZ2VTY2VuZVZpc3VlbCB7XG4gICAgICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgICAgIHRvcDogbWluKDIwcHgsIGNhbGMoMTAwdmggLSB2YXIoLS1oYXV0ZXVyVmlzdWVsLCAwcHgpIC0gMjBweCkpO1xuICAgIH1cblxuICAgIC8qIExlcyBhdXRyZXMgYXBlcsOndXMgYXBwYXJhaXNzZW50IDogYydlc3QgaWNpLCBldCBpY2kgc2V1bGVtZW50LCBxdSdpbCB5IGEgdW5lIGNvbG9ubmVcbiAgICAgICBkZSBkcm9pdGUgcG91ciBsZXMgcmVjZXZvaXIuIGBkaXNwbGF5OiBibG9ja2Ag4oCUIGxhIGxhcmdldXIgZXQgbCdhcnJvbmRpIGxldXIgdmllbm5lbnRcbiAgICAgICBkw6lqw6AgZGUgYC5wYWdlU2NlbmVWaXN1ZWwgaW1nYC4gKi9cbiAgICAucGFnZVNjZW5lVmlzdWVsU3VpdGUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgbWFyZ2luLXRvcDogdmFyKC0tZ2FwTGFyZ2UpO1xuICAgIH1cblxuICAgIC8qIElsIG4neSBhIHBsdXMgZGUgcsOoZ2xlIMKrIG5lIGNvbGxlIHBsdXMgZMOocyBxdSdpbCB5IGEgZCdhdXRyZXMgYXBlcsOndXMgwrsgKDIwMjYtMDktMDcpIDpcbiAgICAgICBlbGxlIERFVklOQUlUIGxhIGhhdXRldXIgZGUgbGEgY29sb25uZS4gTGEgaGF1dGV1ciBlc3QgbWFpbnRlbmFudCBtZXN1csOpZSwgZXQgdW5lXG4gICAgICAgY29sb25uZSB0cm9wIGhhdXRlIGNvbGxlIHBhciBsZSBiYXMgKHLDqGdsZSBjaS1kZXNzdXMsIHZpc3VlbENvbGxhbnQudHMpLiAqL1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgPCBwYWxpZXJDYWRyZVNjZW5lIOKAlCBMQSBHUklMTEUgREUgUEFHRSBFU1QgRMOJRkFJVEVcbiAgIFVuZSBzZXVsZSBjb2xvbm5lLiBMZSB2aXN1ZWwgcmVwcmVuZCBzYSBwbGFjZSBkYW5zIGxlIGZsdXgsIGp1c3RlIGFwcsOocyBsZSB0aXRyZSDigJQgYydlc3RcbiAgIHNvbiByYW5nIGRhbnMgbGUgZG9jdW1lbnQsIGV0IGMnZXN0IHBvdXIgY2VsYSBxdWUgbGUgVHdpZyBsJ8OpY3JpdCBsw6Ag4oCULCBldCBpbCBjZXNzZSBkJ8OqdHJlXG4gICBjb2xsYW50IDogaWwgbidhIHBsdXMgZGUgY29sb25uZSBkZSB0ZXh0ZSDDoCBjw7R0w6kgZGUgbHVpIHBvdXIgY291cmlyLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qIEBwYWxpZXIgcGFsaWVyQ2FkcmVTY2VuZSDiiJIgMSAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDExNDlweCkge1xuICAgIC5wYWdlU2NlbmUge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICB9XG5cbiAgICAucGFnZVNjZW5lID4gLnBhZ2VTY2VuZVZpc3VlbCB7XG4gICAgICAgIGdyaWQtY29sdW1uOiAxO1xuICAgICAgICBncmlkLXJvdzogYXV0bztcbiAgICAgICAgcG9zaXRpb246IHN0YXRpYztcbiAgICAgICAgLyogLS1nYXBDb2xvbm5lcyBzb3VzIGxlIGJsb2MgdmlzdWVsICsgYnJhbmNoZW1lbnQgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE3KSA6XG4gICAgICAgICAgIGMnZXN0IGxlIGJsYW5jIHF1aSBsZSBzw6lwYXJhaXQgZHUgdGV4dGUgcXVhbmQgaWwgw6l0YWl0IMOgIGPDtHTDqSA7IGVtcGlsw6ksIGxhIHJlbGF0aW9uXG4gICAgICAgICAgIG5lIGNoYW5nZSBwYXMuIENlIG4nZXN0IFBBUyB1biBibGFuYyBlbnRyZSBkZXV4IGJsb2NzICgtLWdhcEJsb2NzKS4gKi9cbiAgICAgICAgbWFyZ2luLWJsb2NrOiAwIHZhcigtLWdhcENvbG9ubmVzKTtcbiAgICB9XG5cbiAgICAvKiDimqDvuI8gRVQgTEEgQ09MT05ORSBERSBMRUNUVVJFIFJFUEFTU0UgRU4gQVVUT01BVElRVUUgQVZFQyBMVUkuIFN1ciBkZXV4IGNvbG9ubmVzLCBlbGxlXG4gICAgICAgZXN0IGNsb3XDqWUgw6AgbGEgbGlnbmUgMyBwb3VyIHF1ZSBsZSB2aXN1ZWwgcydhbGlnbmUgc3VyIGVsbGUuIEljaSBpbCBuJ3kgYSBwbHVzIHF1J3VuZVxuICAgICAgIGNvbG9ubmUgOiBsZSB2aXN1ZWwsIHJlZGV2ZW51IGF1dG9tYXRpcXVlLCB0b21iZXJhaXQgbHVpIGF1c3NpIHN1ciBsYSBsaWduZSAzIOKAlCBsYVxuICAgICAgIHByZW1pw6hyZSBsaWJyZSBhcHLDqHMgbGUgdGl0cmUgZXQgbCfDqXRpcXVldHRlIOKAlCBldCBsZXMgZGV1eCBibG9jcyBzZSBzdXBlcnBvc2VyYWllbnQsXG4gICAgICAgY2UgcXUndW5lIGdyaWxsZSBhdXRvcmlzZSBzYW5zIHJpZW4gZGlyZS4gUmVtaXNlcyB0b3V0ZXMgZGV1eCBlbiBhdXRvbWF0aXF1ZSwgbGVzXG4gICAgICAgcXVhdHJlIHBpw6hjZXMgcydlbXBpbGVudCBkYW5zIGwnb3JkcmUgZHUgZG9jdW1lbnQgOiB0aXRyZSwgY29tbWFuZGVzLCB2aXN1ZWwsIHRleHRlLiAqL1xuICAgIC5wYWdlU2NlbmUgPiAucGFnZVNjZW5lQ29sb25uZSB7XG4gICAgICAgIGdyaWQtcm93OiBhdXRvO1xuICAgIH1cbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIGBwYWxpZXJWaXN1ZWxDYWRyZWAg4oCUIDY1MHB4XG4gICBBVS1ERVNTVVMgKGV0IHNvdXMgcGFsaWVyQ2FkcmVTY2VuZSksIGxlIHZpc3VlbCBldCBsZSBjYWRyZSB0aWVubmVudCBDw5RURSDDgCBDw5RURSwgc291cyBsZVxuICAgdGl0cmUuIEVOIERFU1NPVVMsIHBsdXMgcmllbiBuZSB0aWVudCBzdXIgdW5lIGxpZ25lLlxuXG4gICBMRSBDQUxDVUwuIFNvdXMgODAwcHggbGUgYmxvYyBwZXJkIHNvbiBpY8O0bmUgKHBhbGllckljb25lTGlnbmUpIEVUIHNvbiBwYWRkaW5nIDogaWwgbmVcbiAgIG1lc3VyZSBwbHVzIHF1ZSAyNDBweCwgbGEgbGFyZ2V1ciBudWUgZGUgc2EgY29sb25uZS4gQXZlYyBsZSBnYXAgZGUgMjAsIHBvdXIgcXVlIGxlIHZpc3VlbFxuICAgZ2FyZGUgYXUgbW9pbnMgMjcwcHggOlxuICAgICAgIChmZW7DqnRyZSDiiJIgODApIOKIkiAyNjAg4omlIDI3MCAgIOKGkiAgIGZlbsOqdHJlIOKJpSA2MTBcbiAgIDY1MCBlc3QgZG9uYyB0ZW51IGF2ZWMgNDBweCBkZSBtYXJnZSA6IMOgIDY1MCwgY29udGVudSA1NzAsIGJsb2MgMjQwLCBnYXAgMjAsIHZpc3VlbCAzMTAuXG4gICAoTGUgcGFsaWVyIHZhbGFpdCBkw6lqw6AgNjUwIHF1YW5kIGxlIHBhZGRpbmcgw6l0YWl0IGVuY29yZSBsw6Ag4oCUIGlsIHJlbmRhaXQgYWxvcnMgMjcwcHggZGVcbiAgIHZpc3VlbCB0b3V0IGp1c3RlLiBSZXRpcmVyIGxlIHBhZGRpbmcgbmUgbCdhIHBhcyBkw6lwbGFjw6ksIGlsIGwnYSByZW5kdSBjb25mb3J0YWJsZS4pXG5cbiAgIExlcyBkZXV4IHNvbnQgZGFucyBsZSBNw4pNRSBibG9jIDogbGEgbGlnbmUgc2UgZmFpdCBkb25jIGRlZGFucywgc2FucyByaWVuIGTDqXBsYWNlciBkYW5zIGxlXG4gICBkb2N1bWVudC5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKiBAcGFsaWVyIHBhbGllclZpc3VlbENhZHJlIOKGkiBwYWxpZXJDYWRyZVNjZW5lIOKIkiAxICovXG5AbWVkaWEgKG1pbi13aWR0aDogNjUwcHgpIGFuZCAobWF4LXdpZHRoOiAxMTQ5cHgpIHtcbiAgICAvKiAtLWdhcENvbG9ubmVzIGVudHJlIGxlIHZpc3VlbCBldCBsZSBibG9jIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNykgOiBkZXV4XG4gICAgICAgem9uZXMgY8O0dGUgw6AgY8O0dGUsIGxlIG3Dqm1lIGJsYW5jIHF1ZSBsZSB0ZXh0ZSBkJ3VuIGFydGljbGUgZXQgc29uIGltYWdlLiAqL1xuICAgIC5wYWdlU2NlbmUgPiAucGFnZVNjZW5lVmlzdWVsIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGdhcDogdmFyKC0tZ2FwQ29sb25uZXMpO1xuICAgIH1cblxuICAgIC8qIExlIHZpc3VlbCBwcmVuZCBjZSBxdWUgbGUgY2FkcmUgbGFpc3NlLiBgbWluLXdpZHRoOiAwYCA6IHNhbnMgbHVpLCB1biDDqWzDqW1lbnQgZmxleCBuZVxuICAgICAgIGRlc2NlbmQgcGFzIHNvdXMgbGEgbGFyZ2V1ciBuYXR1cmVsbGUgZGUgbCdpbWFnZSwgcXVpIHBvdXNzZXJhaXQgbGEgbGlnbmUuICovXG4gICAgLnBhZ2VTY2VuZSAuc2NlbmVWaXN1ZWxMaWVuIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cblxuICAgIC8qIE1PSVRJw4ktTU9JVEnDiSBBVkVDIExFIFZJU1VFTCAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTcpLiBMZSBibG9jIG5lIHByZW5kXG4gICAgICAgcGx1cyBzYSBsYXJnZXVyIG5hdHVyZWxsZSA6IGNlbGxlLWNpIHNlIGNhbGN1bGUgcGFzdGlsbGVzIGJvdXQgw6AgYm91dCwgZXQgdW5lIGxvbmd1ZVxuICAgICAgIGxpc3RlIMOpY3Jhc2FpdCBsZSB2aXN1ZWwganVzcXUnw6AgesOpcm8sIGxlcyBwYXN0aWxsZXMgc29ydGFudCBkZSBsJ8OpY3Jhbi4gw4AgbGFyZ2V1clxuICAgICAgIGltcG9zw6llLCBsZXMgcGFzdGlsbGVzIHBhc3NlbnQgw6AgbGEgbGlnbmUuIGBtaW4td2lkdGg6IDBgIDogc2FucyBsdWksIHVuIMOpbMOpbWVudCBmbGV4XG4gICAgICAgbmUgZGVzY2VuZCBwYXMgc291cyBsYSBsYXJnZXVyIGRlIHNvbiBjb250ZW51LlxuICAgICAgIElsIG4nZXN0IHBsdXMgc291cyBsZSB2aXN1ZWwsIHNhIG1hcmdlIGhhdXRlIG4nYSBwbHVzIGxpZXUgZCfDqnRyZS4gKi9cbiAgICAucGFnZVNjZW5lIC5zY2VuZUNhcnRlIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIDwgcGFsaWVyVmlzdWVsQ2FkcmUg4oCUIEVNUElMw4ksIEVUIExFIENBRFJFIFBBU1NFIERFVkFOVFxuICAgTGUgY2FkcmUgQVUtREVTU1VTLCBsZSB2aXN1ZWwgRU4gREVTU09VUyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDcpLiBTdXIgdW5cbiAgIHTDqWzDqXBob25lLCBsJ8OpY3JhbiBuZSBtb250cmUgcXUndW4gYmxvYyDDoCBsYSBmb2lzIDogYydlc3QgbGUgbm9tIGRlIGxhIHNjw6huZSBldCBzZXMgZGV1eFxuICAgYm91dG9ucyBxdSdvbiB2ZXV0IHkgdHJvdXZlciwgcGFzIHVuZSBpbWFnZSBxdSdpbCBmYXVkcmFpdCBkw6lwYXNzZXIgcG91ciBhZ2lyLlxuXG4gICDimqDvuI8gYGNvbHVtbi1yZXZlcnNlYCBpbnZlcnNlIGwnT1JEUkUgVklTVUVMLCBwYXMgbCdvcmRyZSBkdSBkb2N1bWVudCA6IGxlIHZpc3VlbCByZXN0ZSDDqWNyaXRcbiAgIGF2YW50IGxlIGNhZHJlLCBkb25jIGxhIHRhYnVsYXRpb24gbCdhdHRlaW50IGF2YW50IGxlcyBib3V0b25zIGFsb3JzIHF1J2lsIGVzdCBhZmZpY2jDqVxuICAgZGVzc291cy4gQydlc3QgbGUgcHJpeCBkJ3VuIHNldWwgcsOpZ2ltZSBpbnZlcnPDqSBzdXIgcXVhdHJlLiBMJ2F1dHJlIHNvbHV0aW9uIOKAlCDDqWNyaXJlIGxlXG4gICBjYWRyZSBlbiBwcmVtaWVyIGRhbnMgbGUgVHdpZyDigJQgb2JsaWdlcmFpdCDDoCBpbnZlcnNlciBERVVYIHLDqWdpbWVzIChsYSBtYXF1ZXR0ZSBkJ2FydGljbGVcbiAgIGV0IGxhIGxpZ25lIHZpc3VlbC9jYWRyZSksIGNldXggb8O5IHNlIHRyb3V2ZSBwcmVzcXVlIHRvdXQgbGUgbW9uZGUuIFNpZ25hbMOpIGF1IGNoZWYgZGVcbiAgIHByb2pldCBsZSAyMDI2LTA5LTA3LlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qIEBwYWxpZXIgcGFsaWVyVmlzdWVsQ2FkcmUg4oiSIDEgKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA2NDlweCkge1xuICAgIC5wYWdlU2NlbmUgPiAucGFnZVNjZW5lVmlzdWVsIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgICBnYXA6IHZhcigtLWdhcExhcmdlKTtcbiAgICB9XG5cbiAgICAvKiBMJ8OpY2FydCBlbnRyZSBsZXMgZGV1eCBlc3QgcG9ydMOpIHBhciBsZSBgZ2FwYCA6IGxhIG1hcmdlIGR1IGNhZHJlIGZlcmFpdCBkb3VibGUgZW1wbG9pLFxuICAgICAgIGV0IGVsbGUgc2UgcmV0cm91dmVyYWl0IEFVLURFU1NVUyBkZSBsdWksIGVuIHTDqnRlIGRlIHBpbGUuICovXG4gICAgLnBhZ2VTY2VuZSAuc2NlbmVDYXJ0ZSB7XG4gICAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgfVxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgPCBwYWxpZXJDYWRyZVNjZW5lIOKAlCBOSSBJQ8OUTkUgTkkgQk9VVE9OUyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTcpXG4gICBEw6hzIHF1ZSBsYSBncmlsbGUgZGUgcGFnZSBlc3QgZMOpZmFpdGUsIGxlIGNhZHJlIG5lIGdhcmRlIHF1ZSBsZSBicmFuY2hlbWVudCBlbnRyZSBzY8OobmVzXG4gICBldCBsZXMgcsOpc3VsdGF0cy4gTCdpY8O0bmUgZXQgbGVzIGRldXggYm91dG9ucyBkaXNwYXJhaXNzZW50IDsgbGEgZmHDp29uIGRlIHJlbmRyZSBsZXNcbiAgIGJvdXRvbnMgc3VyIMOpY3JhbiDDqXRyb2l0IHJlc3RlIMOgIGTDqWNpZGVyIChjaGVmIGRlIHByb2pldCwgw6AgdmVuaXIpLlxuXG4gICBQT1VSUVVPSS4gRGVwdWlzIHF1ZSBsZSBicmFuY2hlbWVudCBlc3QgZW50csOpIGRhbnMgbGUgY2FkcmUgKDIwMjYtMDktMTYpLCBsYSBjYXJ0ZSBlc3RcbiAgIHVuZSByYW5nw6llIGZsZXggcXVpIHBhc3NlIMOgIGxhIGxpZ25lIDogc2EgbGFyZ2V1ciBuYXR1cmVsbGUgc2UgY2FsY3VsZSBjb21tZSBzaSB0b3V0XG4gICB0ZW5haXQgc3VyIFVORSBsaWduZSDigJQgaWPDtG5lICsgY29sb25uZSBkZSBib3V0b25zICsgdG91dGVzIGxlcyBwYXN0aWxsZXMuIFBvc8OpZSDDoCBjw7R0w6lcbiAgIGR1IHZpc3VlbCwgZWxsZSByw6ljbGFtYWl0IH43MDBweCBldCBsJ2ltYWdlIHRvbWJhaXQgw6AgfjE4MHB4LiBTYW5zIGwnaWPDtG5lIG5pIGxlc1xuICAgYm91dG9ucywgaWwgbmUgcmVzdGUgcXVlIGxlIGJsb2MgZGUgcGFzdGlsbGVzLCBldCBsZSB2aXN1ZWwgcmVwcmVuZCBzYSBwbGFjZS5cblxuICAgTCdpY8O0bmUgZXN0IGTDqWNvcmF0aXZlIChhbHQ9XCJcIiksIGxhIHJldGlyZXIgbmUgY2/Du3RlIHJpZW4gw6AgdW4gbGVjdGV1ciBkJ8OpY3Jhbi5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKiBAcGFsaWVyIHBhbGllckNhZHJlU2NlbmUg4oiSIDEgKi9cbkBtZWRpYSAobWF4LXdpZHRoOiAxMTQ5cHgpIHtcbiAgICAucGFnZVNjZW5lIC5zY2VuZUljb25lLFxuICAgIC5wYWdlU2NlbmUgLnNjZW5lVmlzdWVsQ29sb25uZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLyogUExVUyBEJ0VOQ0FEUsOJIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNykgOiBuaSBmaWxldCBuaSBwYWRkaW5nLiBMZSBmaWxldCBkdVxuICAgICAgIHByZW1pZXIgY2hhcGl0cmUsIGx1aSwgcmVzdGUg4oCUIGlsIG91dnJlIGxlIGJsb2MuICovXG4gICAgLnBhZ2VTY2VuZSAuc2NlbmVDYXJ0ZSB7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICB9XG59XG5cbi8qIExhIGRlc2NyaXB0aW9uLCBzb3VzIGxlIHRpdHJlLiBFbGxlIG4nYSBwbHVzIGQnZW52ZWxvcHBlIDogbCdlbi10w6p0ZSBlbiBkZXV4IHBhcnRpZXNcbiAgICguc2NlbmVFbnRldGUpIG4nYXZhaXQgcGx1cyBxdSdlbGxlIGRlZGFucyBkZXB1aXMgcXVlIGwnaWPDtG5lIGVzdCBkZXNjZW5kdWUgc291cyBsZSB2aXN1ZWxcbiAgIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykuIEMnZXN0IGRvbmMgdW4gcGFyYWdyYXBoZSBkZSBwbHVzIGRhbnMgbGEgY29sb25uZSBkZVxuICAgZ2F1Y2hlLCBldCBpbCBwcmVuZCBsZXMgbcOqbWVzIG1hcmdlcyBxdWUgbGUgcHJlbWllciBwYXJhZ3JhcGhlIGQndW4gYXJ0aWNsZS4gKi9cbi5zY2VuZUludHJvIHtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIzKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExFIFZJU1VFTCBDTElRVUFCTEUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KVxuICAgSWwgb3V2cmUgbCdhcGVyw6d1IGRhbnMgbGEgc3VyY291Y2hlLCBjb21tZSBsYSB2aWduZXR0ZSBkdSBjYXRhbG9ndWUgOiBjJ2VzdCBsZSBnZXN0ZSBxdWVcbiAgIGxlIHZpc2l0ZXVyIHRlbnRlIGRlIGx1aS1tw6ptZSBkZXZhbnQgbCdpbWFnZSBkJ3VuZSBzY8OobmUuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogYGRpc3BsYXk6IGJsb2NrYCBldCBwYWRkaW5nIHJlbWlzIMOgIHrDqXJvIDogbGUgbm95YXUgZG9ubmUgw6AgVE9VVCA8YT4gdW4gYGlubGluZS1ibG9ja2AgZXRcbiAgIDRweCBkZSBwYWRkaW5nIHZlcnRpY2FsICgzMV9jdGEuY3NzKSwgY2UgcXVpIGxhaXNzYWl0IHVuIGxpc2Vyw6kgc291cyBsJ2ltYWdlIGV0XG4gICBsJ2VtcMOqY2hhaXQgZCfDqXBvdXNlciBzYSBjb2xvbm5lLlxuICAgTEUgSEFMTyBBVSBTVVJWT0wgZXN0IGNlbHVpIGRlcyB2aWduZXR0ZXMgZGUgbCfDrmxvdCBkZSBzY8OobmVzIChpbG90U2NlbmVzLmNzcykgOiBtw6ptZVxuICAgZ2VzdGUsIG3Dqm1lIHNpZ25hbCwgbcOqbWUgY291bGV1ciAoLS1jb3VsZXVySGFsbywgbGUgZm9uZCBkZSBsJ2ltYWdlIMOpY2xhaXJjaSwgcG9zw6llIHBhclxuICAgaWxvdFNjZW5lcy5jc3MgZCdhcHLDqHMgLS1jb3VsZXVyRm9uZFZpc3VlbCBxdWUgbGUgZ2FiYXJpdCBwb3NlIHN1ciBsZSBsaWVuKSDigJQgc2F1ZiBsYVxuICAgbGFyZ2V1ciwgLS1nYXBEZWZhdXQgaWNpIGNvbnRyZSAxNXB4IGzDoC1iYXMsIHBhcmNlIHF1J3VuZSBpbWFnZSBkZSA0NTBweCBuJ2EgcGFzIGJlc29pblxuICAgZHUgbcOqbWUgaGFsbyBxdSd1bmUgdmlnbmV0dGUgZGUgdHVpbGUuICovXG4uc2NlbmVWaXN1ZWxMaWVuIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclIxKTtcbiAgICBvdXRsaW5lOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHRyYW5zaXRpb246IG91dGxpbmUtd2lkdGggLjVzIGVhc2Utb3V0LCBvdXRsaW5lLWNvbG9yIC41cyBlYXNlLW91dDtcbn1cblxuLnNjZW5lVmlzdWVsTGllbjpob3Zlcixcbi5zY2VuZVZpc3VlbExpZW46Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogdmFyKC0tZ2FwRGVmYXV0KSBzb2xpZCB2YXIoLS1jb3VsZXVySGFsbyk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBTT1VTIExFIFZJU1VFTCDigJQgbCdpY8O0bmUsIGxlIG5vbSBkZSBsYSBzY8OobmUgZXQgbGVzIGRldXggYm91dG9uc1xuICAgTGUgYmxvYyBlc3Qgw6ljcml0IERBTlMgbGUgPHA+IGR1IHZpc3VlbCA6IGlsIHNlIGNvbGxlIGRvbmMgZW4gaGF1dCBkZSBsYSBmZW7DqnRyZSBhdmVjIGx1aVxuICAgYXUgZMOpZmlsZW1lbnQsIGF1IGxpZXUgZGUgcmVzdGVyIGVuIGFycmnDqHJlLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qIFVuIENBRFJFIGF1dG91ciBkZSBsJ2Vuc2VtYmxlIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykgOiBsZSBmaWxldCBldCBsJ2Fycm9uZGlcbiAgIGRlcyBmb3JtdWxhaXJlcywgY2V1eCBkdSBkZXNpZ24gc3lzdGVtLCBwYXMgZGUgdmFsZXVycyBpbnZlbnTDqWVzIGljaS4gTGUgcGFkZGluZyBub24gcGx1cyA6XG4gICAtLXBhZGRpbmdDb3JwcywgbCdpbnTDqXJpZXVyIGQndW4gY29ycHMgZGUgYmxvYy5cbiAgIERFVVggQ09MT05ORVMgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KSA6IGwnSUPDlE5FIMOAIEdBVUNIRSwgZXQgw6AgRFJPSVRFIHVuZVxuICAgc2V1bGUgY29sb25uZSBxdWkgcG9ydGUgbCfDqXRpcXVldHRlIHB1aXMgbGVzIGRldXggYm91dG9ucyAoLnNjZW5lVmlzdWVsQ29sb25uZSkuIEMnZXN0IGNlXG4gICBxdWkgYWxpZ25lIGxlIGNhZHJlIOKAlCB0b3V0IGNlIHF1aSBuJ2VzdCBwYXMgbCdpY8O0bmUgcGFydGFnZSB1bmUgbGFyZ2V1ciBldCB1biBheGUuXG4gICBMZSBjYWRyZSBwb3J0YWl0IGF2YW50IHRyb2lzIMOpbMOpbWVudHMgZnLDqHJlcywgbCdpY8O0bmUgZXQgbCfDqXRpcXVldHRlIHBvdXNzw6llcyBjaGFjdW5lXG4gICBjb250cmUgc29uIGJvcmQgcGFyIHVuIGBzcGFjZS1iZXR3ZWVuYCwgbGVzIGJvdXRvbnMgZW4gdHJhdmVycyBkdSBjYWRyZSBlbiBkZXNzb3VzIDogdHJvaXNcbiAgIGF4ZXMgZGlmZsOpcmVudHMgZGFucyB1biBjYWRyZSBkZSA0NTBweC5cbiAgIEFMSUdOw4lFUyBQQVIgTEUgSEFVVCA6IGwnaWPDtG5lIGZhaXQgODRweCwgbCfDqXRpcXVldHRlIHVuZSBsaWduZSA7IGNlbnRyw6llcywgZWxsZXMgbmVcbiAgIHBhcnRhZ2VhaWVudCBhdWN1bmUgbGlnbmUgZGUgcsOpZsOpcmVuY2Ug4oCUIHBhciBsZSBoYXV0LCBlbGxlcyBjb21tZW5jZW50IGVuc2VtYmxlLiAqL1xuLyog4pqg77iPIExlIGZpbGV0IGV0IGxlIHBhZGRpbmcgbmUgdmFsZW50IFFVRSBhdS1kZXNzdXMgZGUgcGFsaWVySWNvbmVMaWduZSAoODAwcHgpIDogc291cyBjZVxuICAgcGFsaWVyIGlscyBzb250IHJldGlyw6lzLCB2b2lyIGxlIGJsb2MgwqsgUExVUyBERSBGSUxFVCBOSSBERSBQQURESU5HIMK7IHBsdXMgaGF1dC4gKi9cbi5zY2VuZUNhcnRlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGdhcDogdmFyKC0tZ2FwTGFyZ2UpO1xuICAgIG1hcmdpbi10b3A6IHZhcigtLWdhcERlZmF1dCk7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ0NhcnRlKTsgLyogYydlc3QgdW5lIGNhcnRlIDogbcOqbWUgaW50w6lyaWV1ciBxdWUgLmJsb2NDb3Jwcy4gTGVzIGPDtHTDqXMgcmVzdGVudCDDoCAyMHB4LCBsZXMgcGFsaWVycyBuZSBib3VnZW50IHBhcyAqL1xuICAgIGJvcmRlcjogdmFyKC0tYm9yZGVyRm9ybSk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xufVxuXG4vKiBDYXNlIDgwIGV0IDhweCBkJ2FpciA6IGRlc3NpbiA2NCwgbGEgZ3JhbmRlIGRlcyBkZXV4IHRhaWxsZXMgZCdpY8O0bmUgZGUgc2PDqG5lIGR1IHByb2pldFxuICAgKFN0dWRpbywgYXNzZXRzL25veWF1L2Nzcy9zdHVkaW8vNTRfaWNvbmVzLmNzcykuIExlIFNWRyBlc3Qgc2VydmkgZW4gPGltZz4uXG4gICBMRSBGT05EIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNykgOiAtLWNBY2NlbnQxLCBsZSBibGV1IGNsYWlyIGRlIGwnZXNwYWNlXG4gICBhZG1pbmlzdHJhdGlvbiDigJQgY2VsdWkgZGUgbCdvbmdsZXQgUHLDqXBhcmVyIGR1IFN0dWRpbywgZHUgY29tcHRlIGV0IGRlcyB0YXJpZnMuIEMnZXN0XG4gICBwb3VyIGxlIGxpcmUgaWNpIHF1ZSBsZSA8c3Bhbj4gcG9ydGUgYGFjY2VudEFkbWluaXN0cmF0aW9uYCA6IHN1ciB1bmUgcGFnZSBwdWJsaXF1ZSxcbiAgIC0tY0FjY2VudDEgdmF1dCBsZSB2ZXJ0IGRlIGxhIFZpdHJpbmUgOyBsYSBjbGFzc2UgcmFtw6huZSBsZSBibGV1IHN1ciBjZXQgw6lsw6ltZW50IHNldWxcbiAgICgxMF9mb250LmNzcyksIHNhbnMgdG91Y2hlciBzZXMgdm9pc2lucy5cbiAgIExlIHBhZGRpbmcgZMOpY29sbGUgbGUgZGVzc2luIGR1IGJvcmQsIGwnYXJyb25kaSBlc3QgbGUgcGx1cyBkaXNjcmV0IGRlcyB0cm9pcyAoLS1ib3JkZXJSMCkgOlxuICAgdW5lIHBhc3RpbGxlLCBwYXMgdW5lIGNhcnRlLiAqL1xuLnNjZW5lSWNvbmUge1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgIHdpZHRoOiA4MHB4O1xuICAgIGhlaWdodDogODBweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBhZGRpbmc6IHZhcigtLWdhcERlZmF1dCk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjApO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNBY2NlbnQxKTtcbn1cblxuLyogTEEgQ09MT05ORSBERSBEUk9JVEUg4oCUIGwnw6l0aXF1ZXR0ZSBFVCBsZXMgZGV1eCBib3V0b25zIGRhbnMgbGEgbcOqbWUgYm/DrnRlIChkw6ljaXNpb24gY2hlZlxuICAgZGUgcHJvamV0IDIwMjYtMDktMDcpLiBDJ2VzdCBlbGxlIHF1aSBmYWl0IHRvdXQgbCdhbGlnbmVtZW50IGR1IGNhZHJlIDogbCfDqXRpcXVldHRlIGV0IGxlc1xuICAgYm91dG9ucyBwYXJ0YWdlbnQgdW5lIGxhcmdldXIgZXQgdW4gYXhlLCBkb25jIGwnw6l0aXF1ZXR0ZSBjZW50csOpZSB0b21iZSBwaWxlIHN1ciBsZSB0ZXh0ZVxuICAgZGVzIGJvdXRvbnMuIFNhbnMgY2V0dGUgZW52ZWxvcHBlLCBsZXMgdHJvaXMgw6lsw6ltZW50cyDDqXRhaWVudCBmcsOocmVzIGRlIGwnaWPDtG5lIGV0IGlsXG4gICBmYWxsYWl0IHJlY2VudHJlciBsJ8OpdGlxdWV0dGUgw6AgbGEgbWFpbiwgw6AgY291cHMgZGUgbWFyZ2UgbWlyb2lyLlxuXG4gICAyNDBweCAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMDcpLiBDZSBuJ2VzdCBwYXMgdW4gY2hpZmZyZSBpbnZlbnTDqSBpY2kgOlxuICAgYydlc3QgbGEgTcOKTUUgbWVzdXJlIHF1ZSBsYSBjb2xvbm5lIGQnYWN0aW9ucyBkJ3VuZSBjYXJ0ZSBkZSBzY8OpbmFyaW8gY29tcGF0aWJsZSwgcGx1cyBiYXNcbiAgIHN1ciBsYSBtw6ptZSBwYWdlICguZGl2QWN0aW9uU2NlbmFyaW9Db21wYXRpYmxlLCBtaW4td2lkdGggMjQwcHgsXG4gICBub3lhdS9jc3Mvc3R1ZGlvLzU1X3NjZW5hcmlvc0NvbXBhdGlibGVzLmNzcykuIExlcyBkZXV4IGJsb2NzIHNlIHJlc3NlbWJsZW50LCBsZXVycyBib3V0b25zXG4gICBmb250IGTDqXNvcm1haXMgbGEgbcOqbWUgbGFyZ2V1ci5cbiAgIFNhbnMgY2UgcGxhZm9uZCwgbGEgY29sb25uZSBwcmVuYWl0IHRvdXQgY2UgcXVlIGwnaWPDtG5lIGx1aSBsYWlzc2FpdCDigJQgMzA2cHggZGFucyB1biBjYWRyZVxuICAgw6AgcGxlaW5lIHRhaWxsZSDigJQgZXQgbGVzIGJvdXRvbnMgcyfDqXRpcmFpZW50IGp1c3F1ZS1sw6AuXG4gICBgbWFyZ2luLWxlZnQ6IGF1dG9gIHBvdXNzZSBsYSBjb2xvbm5lIGNvbnRyZSBsZSBib3JkIGRyb2l0IDogbCdpY8O0bmUgZ2FyZGUgbGUgYm9yZCBnYXVjaGUsXG4gICBsYSBjb2xvbm5lIGxlIGJvcmQgZHJvaXQsIGV0IGxlIG1vdSB0b21iZSBlbnRyZSBsZXMgZGV1eCBwbHV0w7R0IHF1J8OgIGxhIGZpbi4gTGUgY2FkcmUgcmVzdGVcbiAgIHJlbXBsaSwgY29tbWUgaWwgbCfDqXRhaXQgYXZlYyBsJ2FuY2llbiBgc3BhY2UtYmV0d2VlbmAuXG5cbiAgIEMnZXN0IHVuZSBMQVJHRVVSLCBwYXMgdW4gcGxhZm9uZCA6IHBvc8OpZSBlbiBgd2lkdGhgLCBlbGxlIGRvbm5lIGF1IGNhZHJlIHVuZSBsYXJnZXVyXG4gICBuYXR1cmVsbGUgcXVhbmQgaWwgc2UgcmV0cm91dmUgw6AgY8O0dMOpIGR1IHZpc3VlbCBlbnRyZSA3NjhweCBldCBwYWxpZXJDYWRyZVNjZW5lLiBFbGxlIHJlc3RlXG4gICBjb21wcmVzc2libGUg4oCUIGBtaW4td2lkdGg6IDBgIGF1dG9yaXNlIGxhIGNvbG9ubmUgw6AgZGVzY2VuZHJlIHNvdXMgMjQwIHF1YW5kIGxhIGZlbsOqdHJlXG4gICBsJ2V4aWdlLCBhdSBsaWV1IGRlIGTDqWJvcmRlciA7IHNhbnMgbHVpLCB1biDDqWzDqW1lbnQgZmxleCByZWZ1c2UgZGUgcGFzc2VyIHNvdXMgbGEgbGFyZ2V1clxuICAgZGUgc29uIGNvbnRlbnUuICovXG4uc2NlbmVWaXN1ZWxDb2xvbm5lIHtcbiAgICB3aWR0aDogMjQwcHg7XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLWdhcE1veWVuKTtcbn1cblxuLyog4pqg77iPIFPDqWxlY3RldXIgcGx1cyBwcsOpY2lzIHF1J2lsIG4nZW4gYSBsJ2FpciwgZXQgaWwgbGUgZmF1dCA6IGwnaWPDtG5lIGVzdCBtYWludGVuYW50IGRhbnNcbiAgIGxlIDxwPiBkdSB2aXN1ZWwsIG/DuSBgLmFydGljbGVWaXRyaW5lID4gcDpoYXMoaW1nKSBpbWdgIChhcnRpY2xlVml0cmluZS5jc3MpIMOpdGlyZSB0b3V0ZVxuICAgaW1hZ2Ugw6AgMTAwJSBkZSBsYSBjb2xvbm5lLiBTYW5zIGNlIHBvaWRzLWzDoCwgbCdpY8O0bmUgcGFzc2VyYWl0IMOgIDQ1MHB4LiAqL1xuLnBhZ2VTY2VuZSAuc2NlbmVJY29uZSBpbWcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4vKiBMJ8OJVElRVUVUVEUgTidFU1QgUExVUyBEQU5TIExFIENBRFJFIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNikgOiBlbGxlIGVzdFxuICAgcmVtb250w6llIHNvdXMgbGUgVElUUkUgZGUgbGEgcGFnZSwgb8O5IHNhIHLDqGdsZSBlc3Qgw6ljcml0ZSAoZGFucyBgLnBhZ2VTY2VuZSA+IC5wYWdlU2NlbmVDb21tYW5kZXNgLFxuICAgcGx1cyBoYXV0IGRhbnMgY2UgZmljaGllcikuIExlIGNhZHJlIG5lIHBvcnRlIGRvbmMgcGx1cyBxdWUgbCdpY8O0bmUgZXQgbGVzIGRldXggYm91dG9ucy5cblxuICAgQ2UgcXVpIHZpdmFpdCBpY2ksIGVuIGRldXggdGVtcHMgZXQgcG91ciBtw6ltb2lyZSA6XG4gICAgIOKAlCBqdXNxdSdhdSAyMDI2LTA5LTE2LCBgLnNjZW5lRXRpcXVldHRlYCBhdSBjb3JwcyBkJ3VuIEgyIGV0IGAuc2NlbmVFdGlxdWV0dGVMaWduZWAgZW5cbiAgICAgICBgc3BhY2UtYmV0d2VlbmAgOiBsJ8OpdGlxdWV0dGUgw6l0YWl0IGNlbnRyw6llIGRhbnMgY2UgcXVpIFJFU1RBSVQgdW5lIGZvaXMgbGUgY8WTdXIgcG9zw6lcbiAgICAgICDDoCBkcm9pdGUuIFVuIGNsaWMgZmFpc2FpdCBhcHBhcmHDrnRyZSBsZSBjaGlmZnJlLCBsZSBjxZN1ciBzJ8OpbGFyZ2lzc2FpdCwgbCfDqXRpcXVldHRlXG4gICAgICAgZ2xpc3NhaXQgOyBsZSBkw6ljbGljIGxhIHJhbWVuYWl0IChjb25zdGF0IGR1IGNoZWYgZGUgcHJvamV0KSA7XG4gICAgIOKAlCBsZSBtw6ptZSBqb3VyLCBsYSBicmlxdWUgYF9ldGlxdWV0dGVKYWltZWAgYSBjb2xsw6kgbGVzIGRldXggZW4gdW4gb2JqZXQgZGUgbGFyZ2V1clxuICAgICAgIGNvbnN0YW50ZSwgY2VudHLDqSBpY2kgcGFyIHVuIGBhbGlnbi1zZWxmOiBjZW50ZXJgIDtcbiAgICAg4oCUIHB1aXMgbGUgYmxvYyBlc3QgbW9udMOpIHNvdXMgbGUgdGl0cmUgOiBjJ2VzdCBsJ2lkZW50aXTDqSBkZSBsYSBzY8OobmUsIGVsbGUgYXBwYXJ0aWVudFxuICAgICAgIGF1IHRpdHJlLCBwYXMgYXV4IGNvbW1hbmRlcy4gUGx1cyByaWVuIMOgIHLDqWdsZXIgZGFucyBsZSBjYWRyZS4gKi9cblxuLyogTEVTIERFVVggQk9VVE9OUyDigJQgam91ZXIgbGEgc2PDqG5lLCBwdWlzIHMnZW4gc2VydmlyIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXRcbiAgIDIwMjYtMDktMDcpLiBJbHMgw6l0YWllbnQgc291cyBsYSBkZXNjcmlwdGlvbiwgZW4gdHJhdmVycyBkZSBsYSBjb2xvbm5lIGRlIGxlY3R1cmUgOyBpbHNcbiAgIHNvbnQgbWFpbnRlbmFudCBkYW5zIGxlIGNhZHJlLCBzb3VzIGxlIG5vbSBkZSBsYSBzY8OobmUgcXUnaWxzIGZvbnQgYWdpci5cbiAgIGBmbGV4OiAxIDAgMTAwJWAgOiBsYSBsaWduZSBlbnRpw6hyZSBkdSBjYWRyZSwgZG9uYyB1bmUgZGV1eGnDqG1lIGxpZ25lIHNvdXMgbCdpZGVudGl0w6ksXG4gICBxdWVsbGUgcXVlIHNvaXQgbGEgcGxhY2UgcXVpIHJlc3RhaXQgw6AgZHJvaXRlIGRlIGwnaWPDtG5lLlxuICAgTCdVTiBTT1VTIEwnQVVUUkUsIEVUIERFIE3Dik1FIExBUkdFVVIgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTA3KSA6IGV4YWN0ZW1lbnRcbiAgIGxhIGJhcnJlIGQnYWN0aW9ucyBkJ3VuZSBjYXJ0ZSBkZSBzY8OpbmFyaW8gY29tcGF0aWJsZSwganVzdGUgZW4gZGVzc291cyBzdXIgbGEgbcOqbWUgcGFnZVxuICAgKC5kaXZBY3Rpb25TY2VuYXJpb0NvbXBhdGlibGUsIG5veWF1L2Nzcy9zdHVkaW8vNTVfc2NlbmFyaW9zQ29tcGF0aWJsZXMuY3NzKSDigJQgbcOqbWVzXG4gICBgZmxleC1kaXJlY3Rpb246IGNvbHVtbmAgZXQgYGdhcGAsIGRvbmMgbcOqbWUgZGVzc2luLiBDw7R0ZSDDoCBjw7R0ZSwgaWxzIGF2YWllbnQgZGV1eCBsYXJnZXVyc1xuICAgZGlmZsOpcmVudGVzIGV0IGRldXggbGliZWxsw6lzIHF1aSBuZSBjb21tZW7Dp2FpZW50IHBhcyBhdSBtw6ptZSBlbmRyb2l0IDogcmllbiBuZSBzJ2FsaWduYWl0XG4gICBzdXIgbGEgcGFnZS5cbiAgIExhIGxhcmdldXIgw6lnYWxlIG4nZXN0IHBhcyByw6lnbMOpZSwgZWxsZSBlc3QgZG9ubsOpZSA6IGVuIGNvbG9ubmUsIHVuIMOpbMOpbWVudCBmbGV4IHMnw6l0aXJlIMOgXG4gICBsYSBsYXJnZXVyIGR1IGNvbnRlbmV1ciAoYGFsaWduLWl0ZW1zOiBzdHJldGNoYCBwYXIgZMOpZmF1dCkg4oCUIGljaSBsYSBjb2xvbm5lIGRlIGRyb2l0ZSwgcGFzXG4gICBsZSBjYWRyZSBlbnRpZXIgOiBsZXMgYm91dG9ucyBjb21tZW5jZW50IG/DuSBjb21tZW5jZSBsJ8OpdGlxdWV0dGUuIExlcyBsaWJlbGzDqXMgY2hhbmdlbnQgZGVcbiAgIGxvbmd1ZXVyIOKAlCBzZWxvbiBsZSB2aXNpdGV1ciwgZXQgc2Vsb24gbGEgbGFuZ3VlIOKAlCwgbGVzIGJvdXRvbnMgbm9uLiAqL1xuLnNjZW5lVmlzdWVsQWN0aW9ucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogdmFyKC0tZ2FwRGVmYXV0KTtcbn1cblxuLyogTEUgVEVYVEUgQ0VOVFLDiSA6IGxlcyBib3V0b25zIHNvbnQgw6l0aXLDqXMgw6AgbGEgbGFyZ2V1ciBkZSBsYSBjb2xvbm5lLiDCqyBKb3VlciBsYSBzY8OobmUgwrsgZXN0XG4gICB1biAuY3RhRGlzY3JldCwgcXVpIGNlbnRyZSBkw6lqw6Agc29uIHRleHRlIDsgbGUgYm91dG9uIGRlIGNvbnZlcnNpb24gZXN0IHVuIC5jdGExNCAoYmxldSBvdVxuICAgb3IsIGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTEwLTA3KSwgcXVpIG5lIGxlIGNlbnRyZSBwYXMg4oCUIGV0IC5jdGExNC5jdGFPciBsZSBwb3NlIG3Dqm1lXG4gICDDoCBnYXVjaGUgKDMxX2N0YS5jc3MpLiBVbmUgY2xhc3NlIGRlIHBsdXMgcXVlIC5jdGExNC5jdGFPciA6IGxhIHLDqGdsZSBsJ2VtcG9ydGUuICovXG4uc2NlbmVWaXN1ZWxBY3Rpb25zID4gLmN0YTE0IHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBCUkFOQ0hFTUVOVCBFTlRSRSBTQ8OITkVTIEVUIFLDiVNVTFRBVFMgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KVxuICAgRGV1eCBjaGFwaXRyZXMuIMKrIEJyYW5jaGVtZW50IGVudHJlIHNjw6huZXMgwrsgOiBjZSBxdWUgbGEgc2PDqG5lIGRlbWFuZGUgKFBhcnRpY2lwYW50cyxcbiAgIE51bcOpcm9zLCBMb3RzKSBldCBjZSBxdSdlbGxlIHByb2R1aXQgKEdhZ25hbnRzLCBSZXN0YW50cywgQW5udWzDqXMpIOKAlFxuICAgU2NlbmVDb250cmF0U2VydmljZTo6YnJhbmNoZW1lbnRzLiDCqyBSw6lzdWx0YXRzIMK7IDogY2UgcXVlIG1vbnRyZW50IHNhIHB1YmxpY2F0aW9uLCBzb25cbiAgIHTDqWzDqWNoYXJnZW1lbnQgZXQgc29uIGNvbnN0YXQg4oCUIFBhZ2VTY2VuZVNlcnZpY2U6OnJlY3VwZXJhYmxlLlxuXG4gICBTVVIgVE9VVEUgTEEgTEFSR0VVUiBERSBMQSBDQVJURSwgc291cyBsJ2ljw7RuZSBldCBsZXMgYm91dG9ucy4gUGxhY8OpIGRhbnMgbGEgY29sb25uZSBkZXNcbiAgIGJvdXRvbnMsIGxlIGJsb2MgbGFpc3NhaXQgbGEgY29sb25uZSBkZSBsJ2ljw7RuZSB2aWRlIHN1ciB0b3V0ZSBzYSBoYXV0ZXVyLiBMYSBjYXJ0ZSBlc3QgdW5lXG4gICByYW5nw6llIGZsZXggOiBlbGxlIHBhc3NlIMOgIGxhIGxpZ25lIChgZmxleC13cmFwYCksIGV0IGxlIGJsb2MgcHJlbmQgbGEgcmFuZ8OpZSBlbnRpw6hyZVxuICAgKGBmbGV4LWJhc2lzOiAxMDAlYCkuIExhIGxhcmdldXIgZGUgbGEgY2FydGUgbmUgY2hhbmdlIHBhcyDigJQgbGVzIHBhbGllcnMgcmVzcG9uc2l2ZSxcbiAgIGNhbGN1bMOpcyBzdXIgZWxsZSwgcmVzdGVudCBqdXN0ZXMuXG5cbiAgIFVORSBTRUNUSU9OID0gREVVWCBMSUdORVMgOiBsZSB0aXRyZSBzZXVsIHN1ciBsYSBzaWVubmUsIHB1aXMgdG91dGVzIGxlcyBwYXN0aWxsZXMgw6AgbGFcbiAgIHN1aXRlIHN1ciBsYSBzdWl2YW50ZSAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTYpLiBMZXMgcGFzdGlsbGVzIHBhc3NlbnQgw6AgbGFcbiAgIGxpZ25lIHF1YW5kIGxhIGNhcnRlIGVzdCB0cm9wIMOpdHJvaXRlLlxuXG4gICBMRVMgUEFTVElMTEVTIFZJRU5ORU5UIERVIFLDiUNBUElUVUxBVElGIGRlIGNvbXBvc2l0aW9uICgucmVjYXBUYWdTb3J0aWUsXG4gICAucmVjYXBUYWdTb3J0aWVTZWNvbmRhaXJlLCA1Nl9zY2VuYXJpby9fcmVjYXBpdHVsYXRpZi5jc3MpIDogbcOqbWUgZGVzc2luIHF1J8OgIGxhXG4gICBjb21wb3NpdGlvbiBkJ3VuIHNjw6luYXJpby4gTGUgQ09OVEVORVVSLCBsdWksIGVzdCBwcm9wcmUgw6AgY2V0dGUgY2FydGUgOiBgLnJlY2FwQ29tcG9zaXRpb25gXG4gICBwb3J0ZSBsYSBtaXNlIGVuIHBhZ2UgZGUgbGEgcGFnZSBkZSBjb21wb3NpdGlvbiAoMjkycHggZW4gZmxleCwgZmlsZXQgw6AgZ2F1Y2hlKS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4uc2NlbmVDYXJ0ZTpoYXMoLnNjZW5lQnJhbmNoZW1lbnRzKSxcbi5zY2VuZUNhcnRlOmhhcyguc2NlbmVPZmZyZVBybykge1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbn1cblxuLyogTCfDiUNIRUxMRSBERVMgRVNQQUNFUyBEVSBCTE9DIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0xNikg4oCUIHRyb2lzIHZhbGV1cnMsIGV0XG4gICBjaGFjdW5lIGEgVU4gcsO0bGUgOyBjJ2VzdCBjZSBxdWkgZmFpdCB2b2lyIGQndW4gY291cCBkJ8WTaWwgY2UgcXVpIHZhIGVuc2VtYmxlIDpcbiAgICAgLS1nYXBSZWR1aXQgIDRweCAgIHVuIHRpdHJlIGRlIHJ1YnJpcXVlIOKGkiBzZXMgcGFzdGlsbGVzIDsgdW5lIHBhc3RpbGxlIOKGkiBsYSBzdWl2YW50ZVxuICAgICAtLWdhcE1veWVuICAxMnB4ICAgdW5lIHJ1YnJpcXVlIOKGkiBsYSBzdWl2YW50ZSA7IGxlIGZpbGV0IOKGkiBsZSB0aXRyZSBkdSBjaGFwaXRyZSA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZSB0aXRyZSBkdSBjaGFwaXRyZSDihpIgc2EgcHJlbWnDqHJlIHJ1YnJpcXVlXG4gICAgIC0tZ2FwTGFyZ2UgIDIwcHggICB1biBjaGFwaXRyZSDihpIgbGUgc3VpdmFudCAoYXZhbnQgc29uIGZpbGV0KSA7IGxlcyBib3V0b25zIOKGkiBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWllciBmaWxldCAoYydlc3QgbGUgYGdhcGAgZGUgbGEgY2FydGUsIHF1aSBwYXNzZSDDoCBsYSBsaWduZSlcbiAgIEF1Y3VuZSBhdXRyZSBtYXJnZSBuZSBzJ2Fqb3V0ZSA6IGNlbGxlcyBxdWUgbGUgTm95YXUgcG9zZSBzdXIgbGVzIHRpdHJlcyBldCBsZXMgYGxpYFxuICAgc29udCByZWTDqWZpbmllcyBjaS1kZXNzb3VzLiAqL1xuLnNjZW5lQnJhbmNoZW1lbnRzIHtcbiAgICBmbGV4OiAxIDAgMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiB2YXIoLS1nYXBMYXJnZSk7XG59XG5cbi8qIMKrIFVuaXF1ZW1lbnQgc3VyIGwnb2ZmcmUgUHJvIMK7LCBkYW5zIGxhIGNhcnRlIGQndW4gamV1IGludGVyYWN0aWYgOiB1bmUgbGlnbmUgZW50acOocmUgZGUgbGFcbiAgIGNhcnRlLCBhdmFudCBsZXMgYnJhbmNoZW1lbnRzLiBFbiBwb2xpY2UgTMOJR8OIUkUsIGNvbW1lIMKrIChPZmZyZSBQcm8gdW5pcXVlbWVudCkgwrsgcGx1cyBiYXNcbiAgICguc2NlbmVCcmFuY2hlbWVudHNPZmZyZSkgOiB1bmUgbWVudGlvbiwgcGFzIHVuZSBhbGVydGUuIEwnw6ljYXJ0IHZpZW50IGR1IGBnYXBgIGRlIGxhIGNhcnRlLiAqL1xuLnNjZW5lT2ZmcmVQcm8ge1xuICAgIGZsZXg6IDEgMCAxMDAlO1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250OiB2YXIoLS1mTGlnaHQxNCk7XG59XG5cbi8qIFVOIENIQVBJVFJFLCBTT1VTIFVOIEZJTEVUIEhPUklaT05UQUwgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KS4gTGUgZmlsZXQgZXN0XG4gICBjZWx1aSBxdWkgc8OpcGFyZSBsZXMgZGV1eCBjb2xvbm5lcyBkJ3VuZSBjYXJ0ZSBkZSBzY8OpbmFyaW8gY29tcGF0aWJsZSAoLS1ib3JkZXIsXG4gICBub3lhdS9jc3Mvc3R1ZGlvLzU1X3NjZW5hcmlvc0NvbXBhdGlibGVzLmNzcyksIHBvc8OpIMOgIGwnaG9yaXpvbnRhbGUgY29tbWUgY2V0dGUgY2FydGUgbGVcbiAgIGZhaXQgc3VyIMOpY3JhbiDDqXRyb2l0LiAqL1xuLnNjZW5lQnJhbmNoZW1lbnRzQ2hhcGl0cmUge1xuICAgIHBhZGRpbmctdG9wOiB2YXIoLS1nYXBNb3llbik7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyKTtcbn1cblxuLyogTGUgdGl0cmUgZCd1biBjaGFwaXRyZSwgYXUgY29ycHMgZCd1biBINCAoMThweCkgZXQgbm9uIHBsdXMgZCd1biBIMyAoMjJweCkgOiBkYW5zIHVuZVxuICAgY2FydGUgZGUgY2V0dGUgbGFyZ2V1ciwgbGUgSDMgcGVzYWl0IHBsdXMgcXVlIHRvdXQgbGUgcmVzdGUuIFNhIHBsYWNlIGx1aSB2aWVudCBkdVxuICAgYHBhZGRpbmctdG9wYCBkdSBjaGFwaXRyZSA7IGwnw6ljYXJ0IHF1aSBsZSBzdWl0LCBkZSBsYSBtYXJnZSBoYXV0ZSBkZSBsYSBydWJyaXF1ZS4gKi9cbi5zY2VuZUJyYW5jaGVtZW50cyBoMyB7XG4gICAgZm9udDogdmFyKC0tZkg0KTtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMik7XG59XG5cbi5zY2VuZUJyYW5jaGVtZW50c1NlY3Rpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLyogTGUgdGl0cmUgZCd1bmUgcnVicmlxdWUgR0FSREUgU0VTIE1BUkdFUyAoZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0IDIwMjYtMDktMTYpIOKAlCBtYWlzIMOgXG4gICBsJ8OpY2hlbGxlIGR1IGJsb2MgOiAtLWdhcE1veWVuIGF1LWRlc3N1cyAobCfDqWNhcnQgZW50cmUgcnVicmlxdWVzKSwgLS1nYXBSZWR1aXQgZW5cbiAgIGRlc3NvdXMgKGNvbGzDqSDDoCBzZXMgcGFzdGlsbGVzKS4gQ2VsbGVzIGRlIGxhIHLDqGdsZSBnw6luw6lyYWxlIChgaDQsIGg1LCBoNiB7IG1hcmdpbjogMjVweFxuICAgMCA3cHggfWAsIE5veWF1KSBzb250IGZhaXRlcyBwb3VyIHVuIGFydGljbGUsIHBhcyBwb3VyIHVuZSBjYXJ0ZS5cbiAgIEF1IGNvcnBzIGQndW4gbGliZWxsw6kgKDE0cHgpLCBjb21tZSBzZXMgcGFzdGlsbGVzIDogbGUgdGl0cmUgZGUgY2hhcGl0cmUsIGF1LWRlc3N1cywgZXN0XG4gICBsZSBzZXVsIHRleHRlIHBsdXMgZ3JhbmQgZHUgYmxvYy4gKi9cbi5zY2VuZUJyYW5jaGVtZW50cyBoNCB7XG4gICAgZm9udDogdmFyKC0tZkxhYmVsKTtcbiAgICBtYXJnaW46IHZhcigtLWdhcE1veWVuKSAwIHZhcigtLWdhcFJlZHVpdCk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG5cbi5zY2VuZUJyYW5jaGVtZW50cyB1bCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiB2YXIoLS1nYXBSZWR1aXQpO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmctbGVmdDogMDtcbn1cblxuLyogwqsgKE9mZnJlIFBybyB1bmlxdWVtZW50KSDCuywgw6AgbGEgc3VpdGUgZHUgdGl0cmUgZCd1bmUgcnVicmlxdWUgcsOpc2VydsOpZSA6IGVuIHBvbGljZVxuICAgTMOJR8OIUkUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE2KSwgbGEgbcOqbWUgcXVlIGxlIG1hcnF1ZXVyIMKrICjDoCBjb25maWd1cmVyKSDCu1xuICAgZHUgU3R1ZGlvICguZXRpcXVldHRlQUNvbmZpZ3VyZXIpIOKAlCB1bmUgcHLDqWNpc2lvbiwgcGFzIHVuIHRpdHJlLiAqL1xuLnNjZW5lQnJhbmNoZW1lbnRzT2ZmcmUge1xuICAgIGZvbnQ6IHZhcigtLWZMaWdodDE0KTtcbn1cblxuLyogYG1hcmdpbjogMGAgOiBsYSByw6hnbGUgZ8OpbsOpcmFsZSBgbGkgeyBtYXJnaW46IDhweCAwIH1gIGR1IE5veWF1IG1ldHRhaXQgMTZweCBlbnRyZSBkZXV4XG4gICByYW5nw6llcyBkZSBwYXN0aWxsZXMsIGV0IDhweCBzb3VzIGNoYXF1ZSB0aXRyZS4gSWNpIGwnw6ljYXJ0IGVudHJlIHBhc3RpbGxlcyBlc3QgbGUgc2V1bFxuICAgYGdhcGAgZGUgbGEgbGlzdGUuICovXG4uc2NlbmVCcmFuY2hlbWVudHMgbGkge1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250OiB2YXIoLS1mTGFiZWwpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xufVxuXG4vKiBNw6ptZSByYWlzb24gOiBsYSBwYXN0aWxsZSBkdSByw6ljYXBpdHVsYXRpZiBwb3J0ZSBgbWFyZ2luOiAycHggMGAsIHV0aWxlIGRhbnMgc2EgY29sb25uZVxuICAgZW1waWzDqWUsIHBhcmFzaXRlIGRhbnMgdW5lIGxpc3RlIGVuIGxpZ25lIGRvbnQgbGUgYGdhcGAgcsOoZ2xlIGTDqWrDoCBsJ8OpY2FydC4gKi9cbi5zY2VuZUJyYW5jaGVtZW50cyAucmVjYXBUYWdTb3J0aWUsXG4uc2NlbmVCcmFuY2hlbWVudHMgLnJlY2FwVGFnU29ydGllU2Vjb25kYWlyZSB7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTEEgUFLDiVNFTlRBVElPTiDigJQgbGEgU1VJVEUgZHUgdGV4dGUsIHBhcyB1biBibG9jIMOgIHBhcnRcbiAgIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXQgMjAyNi0wOS0wNylcblxuICAgRWxsZSBuJ2EgcGx1cyBkJ2VudmVsb3BwZSA6IHNlcyBwYXJhZ3JhcGhlcywgc2VzIHRpdHJlcyBldCBzZXMgbGlzdGVzIHNvbnQgZW5mYW50cyBkaXJlY3RzXG4gICBkZSBsJ2FydGljbGUsIGNvbW1lIGNldXggZCd1biBhcnRpY2xlIHLDqWRpZ8OpLiBJbCBuJ3kgYSBkb25jIFJJRU4gw6AgcsOpZ2xlciBpY2kgcG91ciBldXgg4oCUXG4gICBgLmFydGljbGVWaXRyaW5lID4gcGAsIGA+IGgyYCwgYD4gdWxgIChhcnRpY2xlVml0cmluZS5jc3MpIGxldXIgZG9ubmVudCBsZXMgbWFyZ2VzLCBsYVxuICAgbGFyZ2V1ciBkZSBsZWN0dXJlIGV0IGxlcyBwdWNlcyBkJ3VuIHZyYWkgdGV4dGUuIEMnZXN0IGNlIHF1ZSBsJ2VudmVsb3BwZSBsZXVyIHJldGlyYWl0IDpcbiAgIGlsIGZhbGxhaXQgcmVib3JuZXIgbGVzIHBhcmFncmFwaGVzIMOgIGxhIG1haW4sIGxlcyBsaXN0ZXMgcGVyZGFpZW50IGxldXJzIHB1Y2VzIHNvdXMgbGVcbiAgIHJlc2V0IGR1IG5veWF1LCBldCB1biBgbWFyZ2luLXRvcDogOHJlbWAg4oCUIGxlIHJ5dGhtZSBkZXMgw45MT1RTLCBjZXMgYmxvY3MgcXVpIHRyYXZlcnNlbnRcbiAgIGxhIHBhZ2Ug4oCUIGNyZXVzYWl0IHVuIHRyb3UgZW50cmUgbGEgZGVzY3JpcHRpb24gZXQgc2Egc3VpdGUuXG5cbiAgIE5lIHJlc3RlIHF1ZSBsZSBtb3QgwqsgUHLDqXNlbnRhdGlvbiDCuywgY2ktZGVzc291cy5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIExFIE1PVCDCqyBQUsOJU0VOVEFUSU9OIMK7LiBVbiA8cD4gcXVpIHNlIGxpdCBjb21tZSB1biBIMiBzYW5zIGVuIMOqdHJlIHVuIDogbGUgcGxhbiBkdVxuICAgZG9jdW1lbnQgbmUgZG9pdCBwYXMgcG9ydGVyIHVuIHRpdHJlIHF1aSBuZSBkaXQgcmllbiBkZSBsYSBzY8OobmUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldFxuICAgMjAyNi0wOS0wNywgbW90aWYgU0VPKS4gT24gbHVpIGRvbm5lIGRvbmMgRVhBQ1RFTUVOVCBjZSBxdSdhdXJhaXQgdW4gSDIgZCdhcnRpY2xlIOKAlCBsYVxuICAgZm9udGUgZXQgbGEgY291bGV1ciBkJ3VuIHRpdHJlICgxMF9mb250LmNzcyksIGV0IGxlcyBtYXJnZXMgc2VycsOpZXMgZGVzIHRpdHJlcyBkZSBjb3Jwc1xuICAgZCdhcnRpY2xlLCAxZW0gLyAuNWVtIChgLmFydGljbGVWaXRyaW5lID4gaDJgLCBhcnRpY2xlVml0cmluZS5jc3MpLiBMZSBjaGlmZnJlIGVzdFxuICAgcmVjb3Bpw6ksIHBhcyBow6lyaXTDqSA6IGNlIDxwPiBuZSBwZXV0IHBhcyB0b21iZXIgc3VyIGxlIHPDqWxlY3RldXIgZGVzIHRpdHJlcy4gU2kgbGUgcnl0aG1lXG4gICBkZXMgdGl0cmVzIGQnYXJ0aWNsZSBib3VnZSBsw6AtYmFzLCBpbCBib3VnZSBpY2kgYXVzc2kuXG4gICDDgCBsJ29laWwsIHJpZW4gbmUgbGUgZGlzdGluZ3VlIGQndW4gdnJhaSB0aXRyZS5cbiAgIOKaoO+4jyBTw6lsZWN0ZXVyIGVuIGRldXggbW9yY2VhdXgsIGV0IGlsIGxlIGZhdXQgOiBgLmFydGljbGVWaXRyaW5lID4gcGAgKDAsMSwxKSBpbXBvc2VcbiAgIGBtYXJnaW4tYmxvY2s6IDAgMWVtYCDDoCB0b3V0IHBhcmFncmFwaGUgZGUgbCdhcnRpY2xlLiBVbmUgY2xhc3NlIHNldWxlICgwLDEsMCkgcGVyZGFpdC4gKi9cbi5wYWdlU2NlbmVBcnRpY2xlID4gLnNjZW5lVGl0cmVQcmVzZW50YXRpb24ge1xuICAgIG1hcmdpbjogMWVtIDAgLjVlbTtcbiAgICBmb250OiB2YXIoLS1mSDIpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG4vKiBFdCBjZSBxdWkgbGUgcHLDqWPDqGRlIG5lIHBvdXNzZSBwYXMgbm9uIHBsdXMgOiBsZSBwZW5kYW50LCBwb3VyIGNlIGZhdXggdGl0cmUsIGRlXG4gICBgLmFydGljbGVWaXRyaW5lID4gKjpoYXMoKyBoMilgIChhcnRpY2xlVml0cmluZS5jc3MpLiBJbCBmYXV0IGwnw6ljcmlyZSDDoCBwYXJ0LCBldCBjJ2VzdFxuICAgbGUgcHJpeCBkdSA8cD4gOiBsYSByw6hnbGUgZGUgbCdhcnRpY2xlIG5lIHJlY29ubmHDrnQgcXVlIGRlIHZyYWllcyBiYWxpc2VzIGRlIHRpdHJlLlxuICAgU2FucyBlbGxlLCBsYSBkZXNjcmlwdGlvbiBham91dGFpdCBzb24gMWVtIGV0IGxlIGJsYW5jIGF1LWRlc3N1cyBkZSDCqyBQcsOpc2VudGF0aW9uIMK7IG5lXG4gICB2YWxhaXQgcGFzIGNlIHF1ZSBsZSBDU1MgYW5ub25jZS4gKi9cbi5wYWdlU2NlbmVBcnRpY2xlID4gKjpoYXMoKyAuc2NlbmVUaXRyZVByZXNlbnRhdGlvbikge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi8qIExhIGZvaXJlIGF1eCBxdWVzdGlvbnMuIExlIGJsYW5jIGRlIGZhcS5jc3MgKDhyZW0sIGxlIHJ5dGhtZSBkZXMgw65sb3RzKSBlc3QgcmVtcGxhY8OpIElDSSxcbiAgIHN1ciBjZXR0ZSBwYWdlIHNldWxlbWVudCwgcGFyIC0tZ2FwQmxvY3MgOiBsZSBibGFuYyBlbnRyZSBkZXV4IGJsb2NzIGRlIGxhIGNvbG9ubmUgZGVcbiAgIGxlY3R1cmUgKGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldCAyMDI2LTA5LTE3KS4gTGEgYnJpcXVlIHNlcnQgYXVzc2kgbGVzIHJ1YnJpcXVlcyBldCBsYVxuICAgSG9tZSwgb8O5IGVsbGUgc3VpdCB2cmFpbWVudCB1biDDrmxvdC4gKi9cbi5wYWdlU2NlbmVDb2xvbm5lID4gLmZhcSB7XG4gICAgbWFyZ2luLXRvcDogdmFyKC0tZ2FwQmxvY3MpO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFBBR0UgRCdVTiBTQ8OJTkFSSU8g4oCUIC9wcmV2aWV3L3NjZW5hcmlvL3tkb3NzaWVyfS9jb25maWd1cmVcbiAgIFRlbXBsYXRlIDogdml0cmluZS9wdWJsaWMvdml0cmluZVByZXZpZXdTY2VuYXJpb0NvbXBvc2l0aW9uLnR3aWdcblxuICAgTEEgTcOKTUUgR1JJTExFIFFVRSBMQSBQQUdFIEQnVU5FIFNDw4hORSAocGFnZVNjZW5lLmNzcywgZMOpY2lzaW9uIGNoZWYgZGUgcHJvamV0XG4gICAyMDI2LTA5LTE4KSA6IGxlIHRpdHJlIHN1ciB0b3V0ZSBsYSBsYXJnZXVyLCBsYSBsaWduZSBkZSBjb21tYW5kZXMgZXQgbGEgY29sb25uZSBkZSBsZWN0dXJlXG4gICDDoCBnYXVjaGUsIMOgIGRyb2l0ZSAow6AgbGEgcGxhY2UgZHUgdmlzdWVsKSBsZSBjYWRyZSBkZSBjZSBxdSdpbCBmYXV0IGNvbmZpZ3VyZXIgZXQgZGVzXG4gICByw6lzdWx0YXRzLiBNw6ptZXMgY29sb25uZXMsIG3Dqm1lcyBtYXJnZXMsIG3Dqm1lIHBhbGllciA6IGxlcyBkZXV4IHBhZ2VzIHNlIHJlc3NlbWJsZW50LlxuICAgU291cyBsYSBncmlsbGUsIHN1ciB0b3V0ZSBsYSBsYXJnZXVyLCBsJ291dGlsIGRlIGNvbXBvc2l0aW9uIGdhcmRlIHNlcyBmZXVpbGxlc1xuICAgKDU1X3NjZW5hcmlvTW9kaWZpZXIuY3NzLCA1Nl9zY2VuYXJpby9fcmVjYXBpdHVsYXRpZi5jc3MpLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLnBhZ2VTY2VuYXJpbyB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBtaW4oNDUwcHgsIDM3LjUlKTtcbiAgICBnYXA6IDAgdmFyKC0tZ2FwQ29sb25uZXMpO1xuICAgIGFsaWduLWl0ZW1zOiBzdGFydDtcbn1cblxuLyogTGUgdGl0cmUgOiBsZXMgbWFyZ2VzIGR1IHRpdHJlIGQndW5lIHNjw6huZS4gU2FucyBjZXR0ZSByw6hnbGUgaWwgcHJlbmFpdCBjZWxsZXMgZGUgdG91dCBoMVxuICAgZHUgc2l0ZSAoMTBfZm9udC5jc3MgOiAxMHB4IGF1LWRlc3N1cywgNXB4IGRlc3NvdXMpLiAqL1xuLnBhZ2VTY2VuYXJpbyA+IGgxIHtcbiAgICBncmlkLWNvbHVtbjogMSAvIC0xO1xuICAgIG1hcmdpbi1ibG9jazogdmFyKC0tbWFyZ2VUaXRyZVBhZ2UpIHZhcigtLWdhcERlZmF1dCk7XG59XG5cbi8qIExlcyBkZXV4IGJvdXRvbnMgw6AgZ2F1Y2hlLCBsJ8OpdGlxdWV0dGUgZXQgc29uIGPFk3VyIMOgIGRyb2l0ZSAocGFnZVNjZW5lLmNzcyxcbiAgIC5wYWdlU2NlbmVDb21tYW5kZXMgOiBtw6ptZXMgdmFsZXVycykuICovXG4ucGFnZVNjZW5hcmlvID4gLnBhZ2VTY2VuYXJpb0NvbW1hbmRlcyB7XG4gICAgZ3JpZC1jb2x1bW46IDE7XG4gICAgZ3JpZC1yb3c6IDI7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiB2YXIoLS1nYXBMYXJnZSk7XG4gICAgbWFyZ2luLWJvdHRvbTogM3JlbTtcbn1cblxuLnBhZ2VTY2VuYXJpb0JvdXRvbnMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogdmFyKC0tZ2FwRGVmYXV0KTtcbn1cblxuLnBhZ2VTY2VuYXJpbyA+IC5wYWdlU2NlbmFyaW9Db2xvbm5lIHtcbiAgICBncmlkLWNvbHVtbjogMTtcbiAgICBncmlkLXJvdzogMztcbn1cblxuLyogTEUgQ0FEUkUgREUgRFJPSVRFIOKAlCBjZSBxdSdpbCBmYXV0IGNvbmZpZ3VyZXIsIGxlcyByw6lzdWx0YXRzIOKAlCDDoCBsYSBwbGFjZSBkdSB2aXN1ZWwgZCd1bmVcbiAgIHNjw6huZS4gU29uIGRlc3NpbiBlc3QgY2VsdWkgZHUgcGF2w6kgZCd1bmUgc2PDqG5lIChwYWdlU2NlbmUuY3NzIDogLnNjZW5lQ2FydGUsXG4gICAuc2NlbmVCcmFuY2hlbWVudHPigKYpIDsgbmUgcyfDqWNyaXQgaWNpIHF1ZSBjZSBxdWkgZGlmZsOocmUuICovXG4ucGFnZVNjZW5hcmlvID4gLnBhZ2VTY2VuYXJpb1Zpc3VlbCB7XG4gICAgZ3JpZC1jb2x1bW46IDI7XG4gICAgZ3JpZC1yb3c6IDM7XG59XG5cbi8qIFN1ciBsYSBwYWdlIGQndW5lIHNjw6huZSBsZSBjYWRyZSBzdWl0IGxlIHZpc3VlbCwgZCdvw7kgc2EgbWFyZ2UgaGF1dGUgOyBpY2kgaWwgb3V2cmUgbGFcbiAgIGNvbG9ubmUuICovXG4ucGFnZVNjZW5hcmlvVmlzdWVsIC5zY2VuZUNhcnRlIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xufVxuXG4vKiBMZSBwcmVtaWVyIGNoYXBpdHJlIG91dnJlIGxlIGNhZHJlIDogcGFzIGRlIGZpbGV0IGF1LWRlc3N1cyBkZSByaWVuIChzdXIgbGEgcGFnZSBkJ3VuZVxuICAgc2PDqG5lLCBpbCBzw6lwYXJlIGxlIGNoYXBpdHJlIGRlIGwnaWPDtG5lIGV0IGRlcyBib3V0b25zKS4gKi9cbi5wYWdlU2NlbmFyaW9WaXN1ZWwgLnNjZW5lQnJhbmNoZW1lbnRzQ2hhcGl0cmU6Zmlyc3QtY2hpbGQge1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG59XG5cbi8qIMKrIMOAIGNvbmZpZ3VyZXIgwrsgbidhIHBhcyBkZSBydWJyaXF1ZSAoaDQpIHNvdXMgc29uIHRpdHJlIDogbGVzIHBhc3RpbGxlcywgb3UgbGFcbiAgIHBocmFzZSDCqyBSaWVuIMOgIGNvbmZpZ3VyZXIgwrssIHByZW5uZW50IGwnw6ljYXJ0IHF1J2F1cmFpdCBldSBsYSBydWJyaXF1ZSDigJQgLS1nYXBNb3llbiwgbGUgdGl0cmUgZHVcbiAgIGNoYXBpdHJlIOKGkiBzYSBwcmVtacOocmUgcnVicmlxdWUgKMOpY2hlbGxlIGRlcyBlc3BhY2VzLCBwYWdlU2NlbmUuY3NzKS4gKi9cbi5wYWdlU2NlbmFyaW9WaXN1ZWwgLnNjZW5lQnJhbmNoZW1lbnRzQ2hhcGl0cmUgPiB1bCxcbi5wYWdlU2NlbmFyaW9SaWVuIHtcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1nYXBNb3llbik7XG59XG5cbi8qIE3Dqm1lIGNvcnBzIGV0IG3Dqm1lIGNvdWxldXIgcXVlIGxlcyBwYXN0aWxsZXMgcXUnZWxsZSByZW1wbGFjZS4gKi9cbi5wYWdlU2NlbmFyaW9SaWVuIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIGZvbnQ6IHZhcigtLWZMYWJlbCk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMyk7XG59XG5cbi8qIFNvdXMgbGUgcGFsaWVyIGRlIGxhIHBhZ2UgZCd1bmUgc2PDqG5lICgxMTUwcHgpLCB1bmUgc2V1bGUgY29sb25uZS4gTGUgY2FkcmUgcmVzdGUg4oCUIGNlXG4gICBxdSdpbCBmYXV0IGNvbmZpZ3VyZXIgY29tcHRlIGF1dGFudCBzdXIgdW4gcGV0aXQgw6ljcmFuIOKAlCBldCBzZSBwb3NlIGVudHJlIGxhIGxpZ25lIGRlXG4gICBjb21tYW5kZXMgZXQgbGUgdGV4dGUsIGNvbW1lIGxlIHZpc3VlbCBkJ3VuZSBzY8OobmUgYXUgbcOqbWUgcGFsaWVyLiAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDExNDlweCkge1xuICAgIC5wYWdlU2NlbmFyaW8ge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICB9XG5cbiAgICAucGFnZVNjZW5hcmlvID4gLnBhZ2VTY2VuYXJpb0NvbW1hbmRlcyxcbiAgICAucGFnZVNjZW5hcmlvID4gLnBhZ2VTY2VuYXJpb0NvbG9ubmUge1xuICAgICAgICBncmlkLXJvdzogYXV0bztcbiAgICB9XG5cbiAgICAucGFnZVNjZW5hcmlvID4gLnBhZ2VTY2VuYXJpb1Zpc3VlbCB7XG4gICAgICAgIGdyaWQtY29sdW1uOiAxO1xuICAgICAgICBncmlkLXJvdzogYXV0bztcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZ2FwQ29sb25uZXMpO1xuICAgIH1cbn1cblxuLyogTGUgbW90IMKrIFByw6lzZW50YXRpb24gwrsg4oCUIHVuIDxwPiBxdWkgc2UgbGl0IGNvbW1lIHVuIHRpdHJlIChwYWdlU2NlbmUuY3NzLCBtw6ptZSByw6hnbGUsXG4gICBtw6ptZXMgcmFpc29ucykuIOKaoO+4jyBTw6lsZWN0ZXVyIGVuIGRldXggbW9yY2VhdXggOiBgLmFydGljbGVWaXRyaW5lID4gcGAgKDAsMSwxKSBpbXBvc2VcbiAgIGBtYXJnaW4tYmxvY2s6IDAgMWVtYCDDoCB0b3V0IHBhcmFncmFwaGUgZGUgbCdhcnRpY2xlLCB1bmUgY2xhc3NlIHNldWxlICgwLDEsMCkgcGVyZGFpdC4gKi9cbi5wYWdlU2NlbmFyaW9BcnRpY2xlID4gLnNjZW5lVGl0cmVQcmVzZW50YXRpb24ge1xuICAgIG1hcmdpbjogMWVtIDAgLjVlbTtcbiAgICBmb250OiB2YXIoLS1mSDIpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xufVxuXG4ucGFnZVNjZW5hcmlvQXJ0aWNsZSA+ICo6aGFzKCsgLnNjZW5lVGl0cmVQcmVzZW50YXRpb24pIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4vKiBMYSBmb2lyZSBhdXggcXVlc3Rpb25zIDogbGUgYmxhbmMgZGUgZmFxLmNzcyAoOHJlbSwgbGUgcnl0aG1lIGRlcyDDrmxvdHMpIHJlbXBsYWPDqSBpY2kgcGFyXG4gICAtLWdhcEJsb2NzLCBjb21tZSBzdXIgbGEgcGFnZSBkJ3VuZSBzY8OobmUuICovXG4ucGFnZVNjZW5hcmlvQ29sb25uZSA+IC5mYXEge1xuICAgIG1hcmdpbi10b3A6IHZhcigtLWdhcEJsb2NzKTtcbn1cblxuLyogTCdvdXRpbCBkZSBjb21wb3NpdGlvbiwgc291cyBsYSBncmlsbGUuICovXG4jbW9kaWZpZXJTY2VuYXJpbyB7XG4gICAgbWFyZ2luLXRvcDogdmFyKC0tZ2FwQmxvY3MpO1xufVxuXG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgUEFHRSDCqyBDSE9JU0lSIFZPVFJFIExBTkdVRSDCu1xuICAgTGVzIGdyYW5kZXMgcsOpZ2lvbnMgc2Ugc3VpdmVudCwgY2hhY3VuZSBhdmVjIHNhIGdyaWxsZSBkZSBsYW5ndWVzLlxuICAgTGEgZ3JpbGxlIHMnYWRhcHRlIHNldWxlIGF1IG5vbWJyZSBkZSBjb2xvbm5lcyA6IHBhcyBkZSBtZWRpYSBxdWVyeS5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiNwYWdlTGFuZ3VlcyAudGl0cmVSZWdpb25MYW5ndWVzIHtcbiAgICBtYXJnaW46IDUwcHggMCAwIDA7XG4gICAgcGFkZGluZzogMCAwIHZhcigtLWdhcERlZmF1dCk7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEdSSUxMRSBERVMgTEFOR1VFU1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLmdyaWxsZUxhbmd1ZXMge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMjIwcHgsIDFmcikpO1xuICAgIGdhcDogdmFyKC0tZ2FwUmVkdWl0KSB2YXIoLS1nYXBNb3llbik7XG4gICAgbWFyZ2luOiAyMHB4IDAgMCAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLmdyaWxsZUxhbmd1ZXMgbGkge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uZ3JpbGxlTGFuZ3VlcyBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nQ3RhMTQpO1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjIpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSMSk7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uZ3JpbGxlTGFuZ3VlcyBhOmhvdmVyIHtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudHQpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNBY2NlbnQ0KTtcbn1cblxuLyogTGEgbGFuZ3VlIGFmZmljaMOpZSBhY3R1ZWxsZW1lbnQgOiBzaWduYWzDqWUsIGV0IG5vbiBjbGlxdWFibGUgYXUgcmVnYXJkLiAqL1xuLmdyaWxsZUxhbmd1ZXMgYVthcmlhLWN1cnJlbnRdIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jQmxhbmMyKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbn1cbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBQQUdFIMKrIE5PVVMgQ09OVEFDVEVSIMK7XG4gICBDb2xvbm5lIHVuaXF1ZSwgw6l0cm9pdGUgOiB1biBmb3JtdWxhaXJlIHNlIGxpdCBtaWV1eCByZXNzZXJyw6lcbiAgIHF1J8OpdGFsw6kgc3VyIHRvdXRlIGxhIGxhcmdldXIgZGUgbCfDqWNyYW4uXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4jcGFnZUNvbnRhY3Qge1xuICAgIG1heC13aWR0aDogNTYwcHg7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBGT1JNVUxBSVJFXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4jZm9ybXVsYWlyZUNvbnRhY3Qge1xuICAgIG1hcmdpbi10b3A6IDMwcHg7XG59XG5cbiNmb3JtdWxhaXJlQ29udGFjdCBsYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICAgIGZvbnQ6IHZhcigtLWZMYWJlbCk7XG4gICAgY29sb3I6IHZhcigtLWNOb2lyMik7XG59XG5cbiNmb3JtdWxhaXJlQ29udGFjdCBpbnB1dCxcbiNmb3JtdWxhaXJlQ29udGFjdCB0ZXh0YXJlYSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nSW5wdXQpO1xuICAgIGZvbnQ6IHZhcigtLWZUZXh0MTYpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjEpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNCbGFuYyk7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXJJbnB1dCk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUjEpO1xufVxuXG4jZm9ybXVsYWlyZUNvbnRhY3QgdGV4dGFyZWEge1xuICAgIHJlc2l6ZTogdmVydGljYWw7XG59XG5cbiNmb3JtdWxhaXJlQ29udGFjdCBpbnB1dDpmb2N1cyxcbiNmb3JtdWxhaXJlQ29udGFjdCB0ZXh0YXJlYTpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNGb3JtRm9jdXMpO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1jRm9ybUZvY3VzSGFsbyk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBFUlJFVVJTIERFIFNBSVNJRVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2Zvcm11bGFpcmVDb250YWN0IC5mb3JtLWVycm9yLW1lc3NhZ2Uge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbjogLTE0cHggMCAyMHB4IDA7XG4gICAgZm9udDogdmFyKC0tZkFsZXJ0ZTE2KTtcbiAgICBjb2xvcjogdmFyKC0tY1JvdWdlMyk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBBTlRJU1BBTSDigJQgTEVTIENJTlEgRMOJU1xuICAgQ2hhcXVlIGTDqSB0b3VybmUgbGVudGVtZW50IHN1ciBsdWktbcOqbWUsIMOgIHNhIHByb3ByZSB2aXRlc3NlIDogY2lucSBkdXLDqWVzXG4gICBwcmVtacOocmVzIGVudHJlIGVsbGVzLCBwb3VyIHF1J2lscyBuZSBzZSByZXN5bmNocm9uaXNlbnQgamFtYWlzLlxuICAgTGUgZGVzc2luIGVzdCBwb3PDqSBwYXIgYXNzZXRzL3ZpdHJpbmUvdHMvYW50aVNwYW1EZXMudHMuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4jY29uc2lnbmVEZXMge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gICAgZm9udDogdmFyKC0tZkxhYmVsKTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIyKTtcbn1cblxuI2xlc0RlcyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBnYXA6IDE0cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMjVweDtcbn1cblxuLnVuRGUge1xuICAgIGZsZXg6IDE7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4udW5EZSBsYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4jbGVzRGVzIHN2ZyB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiA1NnB4O1xuICAgIGhlaWdodDogYXV0bztcbn1cblxuLyogTGUgZMOpIGdhcmRlIHNvbiBJRCA6IGMnZXN0IHNhIHZpdGVzc2UgZGUgcm90YXRpb24gcXVpIGxlIGRpc3Rpbmd1ZS4gKi9cbiNkZURlc3NpbjAgeyBhbmltYXRpb246IHRvdXJuZXJEZSAxNXMgbGluZWFyIGluZmluaXRlOyB9XG4jZGVEZXNzaW4xIHsgYW5pbWF0aW9uOiB0b3VybmVyRGUgMTdzIGxpbmVhciBpbmZpbml0ZTsgfVxuI2RlRGVzc2luMiB7IGFuaW1hdGlvbjogdG91cm5lckRlIDE5cyBsaW5lYXIgaW5maW5pdGU7IH1cbiNkZURlc3NpbjMgeyBhbmltYXRpb246IHRvdXJuZXJEZSAyMXMgbGluZWFyIGluZmluaXRlOyB9XG4jZGVEZXNzaW40IHsgYW5pbWF0aW9uOiB0b3VybmVyRGUgMjNzIGxpbmVhciBpbmZpbml0ZTsgfVxuXG4jZGVEZXNzaW4wLFxuI2RlRGVzc2luMSxcbiNkZURlc3NpbjIsXG4jZGVEZXNzaW4zLFxuI2RlRGVzc2luNCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbkBrZXlmcmFtZXMgdG91cm5lckRlIHtcbiAgICBmcm9tIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbn1cblxuLyogTGUgcm91bGVtZW50LCBhdSBjaGFyZ2VtZW50IDogbGUgZMOpIGZhaXQgZGV1eCB0b3VycyBhdmFudCBkZSBzJ2FycsOqdGVyLlxuICAgSWwgc2UgY29tcG9zZSBhdmVjIGxhIHJvdGF0aW9uIGxlbnRlIGR1IDxzcGFuPiBxdWkgbGUgcG9ydGUuICovXG4uZGVSb3VsZSB7XG4gICAgYW5pbWF0aW9uOiByb3VsZXJEZSAxLjc1cyBlYXNlLW91dDtcbn1cblxuQGtleWZyYW1lcyByb3VsZXJEZSB7XG4gICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSg3MjBkZWcpOyB9XG59XG5cbi8qIExhIGNhc2Ugc291cyBjaGFxdWUgZMOpIDogdW4gc2V1bCBjaGlmZnJlLCBhdSBjZW50cmUuICovXG4jZm9ybXVsYWlyZUNvbnRhY3QgI2xlc0RlcyBpbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiA4cHggMCAwO1xuICAgIHBhZGRpbmc6IHZhcigtLWdhcERlZmF1dCkgMDtcbiAgICBmb250OiB2YXIoLS1mVGV4dDE2KTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi8qIFF1aSBhIGRlbWFuZMOpIMOgIHNvbiBzeXN0w6htZSBkZSByw6lkdWlyZSBsZXMgYW5pbWF0aW9ucyByZcOnb2l0IGRlcyBkw6lzIGltbW9iaWxlcyA6XG4gICBsYSBmYWNlIHJlc3RlIGxpc2libGUsIGMnZXN0IHRvdXQgY2UgZG9udCBvbiBhIGJlc29pbiBwb3VyIGxhIHJlY29waWVyLiAqL1xuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcbiAgICAjZGVEZXNzaW4wLFxuICAgICNkZURlc3NpbjEsXG4gICAgI2RlRGVzc2luMixcbiAgICAjZGVEZXNzaW4zLFxuICAgICNkZURlc3NpbjQsXG4gICAgLmRlUm91bGUge1xuICAgICAgICBhbmltYXRpb246IG5vbmU7XG4gICAgfVxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQk9VVE9OIEQnRU5WT0lcbiAgIEludmlzaWJsZSB0YW50IHF1J2lsIG4nZXN0IHBhcyBhcnJpdsOpIMOgIGwnw6ljcmFuIDogYydlc3QgZW4gYXBwYXJhaXNzYW50XG4gICBxdSdpbCBmYWl0IHJlbXBsaXIgbGUgbW90IHNlY3JldCAoYW50aVNwYW1EZXMudHMpLiBTYW5zIEphdmFTY3JpcHQsIGlsXG4gICByZXN0ZSBjYWNow6kg4oCUIGV0IHJpZW4gbmUgcGFydCwgYydlc3Qgdm91bHUuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4jZW52b3llckNvbnRhY3Qge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2UtaW47XG59XG5cbiNlbnZveWVyQ29udGFjdC5kZXZvaWxlIHtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgUsOJUE9OU0UgQVBSw4hTIEVOVk9JXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4ucmVwb25zZUNvbnRhY3Qge1xuICAgIG1hcmdpbi10b3A6IDMwcHg7XG4gICAgZm9udDogdmFyKC0tZlRleHQxNik7XG59XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQkFTIERFIFBBR0VcbiAgIFByw6lzZW50IHN1ciB0b3V0ZXMgbGVzIHBhZ2VzLCBwdWJsaXF1ZXMgZXQgY29tcHRlLlxuICAgQ29sb25uZXMgcXVpIHNlIHLDqWVtcGlsZW50IHNldWxlcyA6IGNoYXF1ZSBjb2xvbm5lIGEgdW5lXG4gICBsYXJnZXVyIHBsYW5jaGVyLCBsZSBmbGV4LXdyYXAgZmFpdCBsZSByZXN0ZSDigJQgcGFzIGRlIG1lZGlhIHF1ZXJ5LlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuI2Jhc0RlUGFnZSB7XG4gICAgbWFyZ2luOiA2MHB4IDAgMCAwO1xuICAgIHBhZGRpbmc6IDAgdmFyKC0tcGFkZGluZ0NvcnBzKSB2YXIoLS1nYXBMYXJnZSk7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFJBTkfDiUUgREUgQ09MT05ORVNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiNjb2xvbm5lc0Jhc0RlUGFnZSB7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS1sYXJnZXVyKTtcbiAgICBtYXJnaW46IDAgYXV0bztcbiAgICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nUGFnZSk7XG4gICAgcGFkZGluZy1ib3R0b206IHZhcigtLWdhcExhcmdlKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiA2MHB4IDMwcHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmNvbG9ubmVCYXNEZVBhZ2Uge1xuICAgIG1pbi13aWR0aDogMjUwcHg7XG4gICAgbWF4LXdpZHRoOiAzMDBweDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIENPTE9OTkUgTE9HT1xuICAgTGUgbG9nbyBkJ2VudMOqdGUgcmVwcmlzIHRlbCBxdWVsIDogZGVzc2luIGxhcmdlXG4gICAodmlld0JveCAyNDV4MzYpLCBvbiBuZSBjb250cmFpbnQgcXVlIGxhIGxhcmdldXIuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4jbG9nb0Jhc0RlUGFnZSBzdmcge1xuICAgIHdpZHRoOiAxODBweDtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgVElUUkUgREUgQ09MT05ORVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLnRpdHJlQ29sb25uZUJhc0RlUGFnZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udDogdmFyKC0tZkg0KTtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIyKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExJRU5TXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4ubGllbnNDb2xvbm5lQmFzRGVQYWdlIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG4ubGllbnNDb2xvbm5lQmFzRGVQYWdlIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLmxpZW5zQ29sb25uZUJhc0RlUGFnZSBhIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luOiA4cHggMDtcbiAgICBwYWRkaW5nOiB2YXIoLS1nYXBSZWR1aXQpIDA7XG4gICAgZm9udDogdmFyKC0tZkxpZ2h0MTQpO1xuICAgIGNvbG9yOiB2YXIoLS1jTm9pcjMpO1xuICAgIGJvcmRlcjogbm9uZTtcbn1cblxuLmxpZW5zQ29sb25uZUJhc0RlUGFnZSBhOmhvdmVyIHtcbiAgICBjb2xvcjogdmFyKC0tY0FjY2VudDQpO1xufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFZJVFJJTkUgUFVCTElRVUUgLSBTdHlsZXMgcGFnZXMgU0VPXG4gICBQYWdlcyA6IGhvbWUsIGZvbmN0aW9ubmFsaXTDqXMsIHRhcmlmcywgRkFRLCBvZmZyZXNcblxuICAgTm90ZSA6IEwnZXNwYWNlIGNvbm5lY3TDqSAoY29tcHRlLCBhdXRoKSB1dGlsaXNlXG4gICBsZSBidW5kbGUgXCJzdHVkaW9cIiB2aWEgYmFzZVZpdHJpbmVDb21wdGUudHdpZ1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogSW1wb3J0IGRlcyBzdHlsZXMgbm95YXUgKHZhcmlhYmxlcywgcmVzZXQsIHRpdHJlcywgQ1RBKSAqL1xuQGltcG9ydCAnLi4vLi4vbm95YXUvY3NzLzAwX3Jlc2V0LmNzcyc7XG5AaW1wb3J0ICcuLi8uLi9ub3lhdS9jc3MvMTBfZm9udC5jc3MnO1xuQGltcG9ydCAnLi4vLi4vbm95YXUvY3NzLzMxX2N0YS5jc3MnO1xuQGltcG9ydCAnLi4vLi4vbm95YXUvY3NzL2NvbXBvc2FudHMvc3VyY291Y2hlUHJldmlldy5jc3MnO1xuQGltcG9ydCAnLi4vLi4vbm95YXUvY3NzL2NvbXBvc2FudHMvamFpbWUuY3NzJztcbi8qIEwnw6l0aXF1ZXR0ZSBldCBzb24gY8WTdXIgY29sbMOpcyBlbiB1biBzZXVsIG9iamV0IChicmlxdWUgbm95YXUgX2V0aXF1ZXR0ZUphaW1lLnR3aWcpLlxuICAgQVBSw4hTIGphaW1lLmNzcyA6IGNlIGZpY2hpZXIgcsOpc2VydmUgbGEgY2FzZSBkdSBjaGlmZnJlIGR1IGPFk3VyLCBpbCBzdXBwb3NlIGRvbmMgbGUgY8WTdXJcbiAgIGTDqWrDoCBzdHlsw6kuIFBhcyBkJ2ltcG9ydCBjw7R0w6kgU3R1ZGlvIDogYXVjdW5lIGRlIHNlcyBwYWdlcyBuZSBwb3NlIGVuY29yZSBjZXR0ZSBicmlxdWUuICovXG5AaW1wb3J0ICcuLi8uLi9ub3lhdS9jc3MvY29tcG9zYW50cy9ldGlxdWV0dGVKYWltZS5jc3MnO1xuXG4vKiBJbXBvcnQgZGUgbGEgcGFnZSBkZXMgb2ZmcmVzICovXG5AaW1wb3J0ICcuL29mZnJlcy5jc3MnO1xuLyogTGUgdGl0cmUgZGUgcGFnZSwgdW5lIHNldWxlIHLDqGdsZSAoYXZhbnQgcGFnZVNjZW5lL3BhZ2VTY2VuYXJpbywgcXVpIG4nZW4gY2hhbmdlbnQgcXVlIGxlIGJhcykuICovXG5AaW1wb3J0ICcuL3RpdHJlUGFnZS5jc3MnO1xuXG4vKiBJbXBvcnQgZGUgbGEgZ3JpbGxlIGRlcyBjYXTDqWdvcmllcyBkJ2FwZXLDp3UgKEhvbWUpICovXG5AaW1wb3J0ICcuL2lsb3RSdWJyaXF1ZXMuY3NzJztcblxuLyogSW1wb3J0IGR1IG1lbnUgZCdhbmNyZXMgZGUgbGEgSG9tZSAoY29sbMOpIGVuIGhhdXQsIHZlcnJlIGTDqXBvbGkpICovXG5AaW1wb3J0ICcuL2NoYXBpdHJlc0hvcml6b250YWwuY3NzJztcblxuLyogSW1wb3J0IGRlIGwnYXJ0aWNsZSBkJ3VuZSBtw6hyZSBkZSBjb2NvbiAocnVicmlxdWVzKSAqL1xuQGltcG9ydCAnLi9hcnRpY2xlVml0cmluZS5jc3MnO1xuXG4vKiBJbXBvcnQgZHUgZ2FiYXJpdCDCqyBwYWdlIMOgIGNoYXBpdHJlcyDCuyA6IHRpdHJlLCBtZW51IMOgIGdhdWNoZSwgYXJ0aWNsZXMgw6AgZHJvaXRlICovXG5AaW1wb3J0ICcuL3BhZ2VDaGFwaXRyZXMuY3NzJztcblxuLyogSW1wb3J0IGR1IGdhYmFyaXQgwqsgcGFnZSBkZSBydWJyaXF1ZSDCuyA6IGxlIGJhbmRlYXUgZGVzIGFwZXLDp3VzIHN1ciBncmFuZCDDqWNyYW4gKi9cbkBpbXBvcnQgJy4vcGFnZVJ1YnJpcXVlLmNzcyc7XG5cbi8qIEltcG9ydCBkZSBsYSBwYWdlIGRlcyBjYXTDqWdvcmllcyBkJ8OpdsOpbmVtZW50IOKAlCBCUk9VSUxMT04gKi9cbkBpbXBvcnQgJy4vcGFnZUNhdGVnb3JpZXMuY3NzJztcblxuLyogSW1wb3J0IGR1IG1lbnUgZGVzIHNvdXMtcnVicmlxdWVzIChwYWdlcyBzxZN1cnMgZCd1bmUgcnVicmlxdWUpICovXG5AaW1wb3J0ICcuL21lbnVTb3VzUnVicmlxdWVzLmNzcyc7XG5cbi8qIEltcG9ydCBkZSBsJ8OubG90IGQnYXBlcsOndXMgZGUgc2PDqG5lICovXG5AaW1wb3J0ICcuL2lsb3RTY2VuZXMuY3NzJztcblxuLyogSW1wb3J0IGRlIGwnw65sb3QgZGUgc2PDqW5hcmlvcyAqL1xuQGltcG9ydCAnLi9pbG90U2NlbmFyaW9zLmNzcyc7XG5AaW1wb3J0ICcuL2lsb3RTY2VuYXJpb3NCYW5kZWF1LmNzcyc7XG5cbi8qIEltcG9ydCBkZSBsYSBmb2lyZSBhdXggcXVlc3Rpb25zIGTDqXBsaWFibGUgKi9cbkBpbXBvcnQgJy4uLy4uL25veWF1L2Nzcy9mYXEuY3NzJztcblxuLyogSW1wb3J0IGRlIGxhIGxpc3RlIGRlcyBzY8OpbmFyaW9zIGQndW5lIGNhdMOpZ29yaWUgKGNvcGllcyBhc3N1bcOpZXMganVtZWxsZXMgc3R1ZGlvKSAqL1xuQGltcG9ydCAnLi9ibG9jcy5jc3MnO1xuQGltcG9ydCAnLi9jdGFEaXNjcmV0LmNzcyc7XG5AaW1wb3J0ICcuL2ZpbHRyZXMuY3NzJztcbkBpbXBvcnQgJy4vc2NlbmFyaW9zQ2F0YWxvZ3VlLmNzcyc7XG5cbi8qIEltcG9ydCBkZSBsYSBwYWdlIGRlIGNvbXBvc2l0aW9uIGQndW4gc2PDqW5hcmlvIGQnYXBlcsOndSA6IGxlcyBmaWNoaWVycyBOT1lBVSBkZSBsYSBwYWdlXG4gICBzdHVkaW8gwqsgTW9kaWZpZXIgY2Ugc2PDqW5hcmlvIMK7IOKAlCBwYWdlcyBqdW1lbGxlcyBhdSBwaXhlbCAoZMOpY2lzaW9uIFBPIDIwMjYtMDgtMTQpLFxuICAgbGUgc3RlcHBlciByw6ljYXAgZXQgbGUgY2Fycm91c2VsIHNvbnQgbGEgbcOqbWUgYnJpcXVlIF9jb21wb3NpdGlvblNjZW5hcmlvLlxuICAgTcOqbWUgb3JkcmUgcXVlIGxlIHN0dWRpbyAoc3R1ZGlvLmpzIDogNTUgYXZhbnQgNTYvX3JlY2FwaXR1bGF0aWYpIDogY2FzY2FkZSBpZGVudGlxdWUuICovXG5AaW1wb3J0ICcuLi8uLi9ub3lhdS9jc3Mvc3R1ZGlvLzU1X3NjZW5hcmlvTW9kaWZpZXIuY3NzJztcbkBpbXBvcnQgJy4uLy4uL25veWF1L2Nzcy9zdHVkaW8vNTZfc2NlbmFyaW8vX3JlY2FwaXR1bGF0aWYuY3NzJztcbi8qIExhIGNoYXNzZSBmaXhlIGRlcyDDqXRpcXVldHRlcyAoLmV0aXF1ZXR0ZU1vbm8pIHF1ZSBsZSByw6ljYXBpdHVsYXRpZiBwb3NlIHN1ciBjaGFxdWUgbm9tIGRlXG4gICBzY8OobmUuIFNhbnMgY2V0IGltcG9ydCwgbGEgY2xhc3NlIMOpdGFpdCDDqWNyaXRlIGRhbnMgbGUgSFRNTCBkZSBsYSBWaXRyaW5lIG1haXMgbmUgcG9ydGFpdFxuICAgYXVjdW5lIHLDqGdsZSA6IGxlcyDDqXRpcXVldHRlcyBzJ2FmZmljaGFpZW50IGRhbnMgbGEgcG9saWNlIGR1IHRleHRlIChjb25zdGF0IGR1IGNoZWYgZGVcbiAgIHByb2pldCAyMDI2LTA5LTE2KS4gTGUgZmljaGllciBuZSBjb250aWVudCBxdWUgbGVzIHLDqGdsZXMgZCfDqXRpcXVldHRlLiAqL1xuQGltcG9ydCAnLi4vLi4vbm95YXUvY3NzL3N0dWRpby81Nl9zY2VuYXJpby9fZXRpcXVldHRlcy5jc3MnO1xuXG4vKiBJbXBvcnQgZGUgbGEgcGFnZSBkJ3VuZSBzY8OobmUgKC9zY2VuZS97ZG9zc2llcn0pLCBkZSBsYSBwYWdlIGQndW4gc2PDqW5hcmlvXG4gICAoL3ByZXZpZXcvc2NlbmFyaW8ve2Rvc3NpZXJ9L2NvbmZpZ3VyZSkgZXQgZGVzIGNhcnRlcyBOT1lBVSBxdSdlbGxlcyBwb3NlbnQgKHNjw6luYXJpb3NcbiAgIGNvbXBhdGlibGVzIGQndW5lIHNjw6huZSwgc2PDqG5lcyBkJ3VuIHNjw6luYXJpbykg4oCUIGxlIFN0dWRpbyBpbXBvcnRlcmEgbGVzIG3Dqm1lcyBicmlxdWVzIGxlXG4gICBqb3VyIG/DuSBpbCBhIHNlcyBwYWdlcy4gKi9cbkBpbXBvcnQgJy4uLy4uL25veWF1L2Nzcy9zdHVkaW8vNTVfc2NlbmFyaW9zQ29tcGF0aWJsZXMuY3NzJztcbi8qIExlIGTDqXJvdWzDqSBwb3PDqSBkYW5zIGNoYXF1ZSBjYXJ0ZSBkZSBzY8OpbmFyaW8gKGJyaXF1ZSBub3lhdSBfZGVyb3VsZVNjZW5hcmlvKSA6IGZldWlsbGVcbiAgIGF1dG9ub21lLCBlbGxlIG4nZW50cmHDrm5lIHBhcyBsYSBncmlsbGUgZHUgU3R1ZGlvLiAqL1xuQGltcG9ydCAnLi4vLi4vbm95YXUvY3NzL3N0dWRpby81Nl9zY2VuYXJpby9fZGVyb3VsZS5jc3MnO1xuQGltcG9ydCAnLi9wYWdlU2NlbmUuY3NzJztcbkBpbXBvcnQgJy4vcGFnZVNjZW5hcmlvLmNzcyc7XG5cbi8qIEltcG9ydCBkZSBsYSBwYWdlIMKrIENob2lzaXIgdm90cmUgbGFuZ3VlIMK7ICovXG5AaW1wb3J0ICcuL3BhZ2VMYW5ndWVzLmNzcyc7XG5cbi8qIEltcG9ydCBkZSBsYSBwYWdlIMKrIE5vdXMgY29udGFjdGVyIMK7ICovXG5AaW1wb3J0ICcuL3BhZ2VDb250YWN0LmNzcyc7XG5cbi8qIEltcG9ydCBkdSBiYXMgZGUgcGFnZSAqL1xuQGltcG9ydCAnLi9iYXNEZVBhZ2UuY3NzJztcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExBIExBUkdFVVIgREUgTEVDVFVSRVxuICAgVU4gU0VVTCBDSElGRlJFIHBvdXIgdG91dCBsZSB0ZXh0ZSByw6lkaWfDqSBkZSBsYSB2aXRyaW5lIChkw6ljaXNpb24gY2hlZiBkZSBwcm9qZXRcbiAgIDIwMjYtMDktMDcpIDogbGUgY29ycHMgZCd1biBhcnRpY2xlLCBsJ2ludHJvIGQndW4gw65sb3QsIGxhIHLDqXBvbnNlIGQndW5lIHF1ZXN0aW9uLlxuICAgQXZhbnQsIGNoYXF1ZSBibG9jIGF2YWl0IGxhIHNpZW5uZSDigJQgbGEgY29sb25uZSBkZSBsJ2FydGljbGUgKDcxMCksIGwnaW50cm8gZCfDrmxvdCAoODAwKSxcbiAgIGxhIEZBUSBldCBsJ8OubG90IGRlIHNjw6luYXJpb3MgKHJpZW4gZHUgdG91dCwgZG9uYyBsZXMgMTIwMCBkZSBsYSBwYWdlKSA6IHRyb2lzIG1lc3VyZXNcbiAgIHBvdXIgbGUgbcOqbWUgdGV4dGUsIHN1ciBsYSBtw6ptZSBwYWdlLlxuXG4gICA3MTBweCwgcGFyY2UgcXVlIGMnZXN0IGxhIHNldWxlIGRlcyB0cm9pcyBxdSdvbiBuZSBwb3V2YWl0IHBhcyBjaGFuZ2VyIDogYydlc3QgY2UgcXVlXG4gICBsYWlzc2UgbGEgY29sb25uZSBkZSBsJ2FydGljbGUgcXVhbmQgbCdpbWFnZSBvY2N1cGUgc2EgcGFydCAoMTIwMCBkZSBjb250ZW51LCBtb2lucyA0NTBcbiAgIGQnaW1hZ2UsIG1vaW5zIGxlcyA0MCBkZSBnb3V0dGnDqHJlKS4gTGVzIGF1dHJlcyBibG9jcyBzJ3kgcmFuZ2VudC5cblxuICAg4pqg77iPIEVuIHBpeGVscywgamFtYWlzIGVuIGBjaGAgOiBjZXR0ZSB1bml0w6kgdmF1dCBsYSBsYXJnZXVyIGR1IGdseXBoZSDCqyAwIMK7IGRlIGxhIHBvbGljZSxcbiAgIHBhcyBjZWxsZSBkdSB0ZXh0ZSDDqWNyaXQg4oCUIHVuIGlkw6lvZ3JhbW1lIGNoaW5vaXMgZmFpdCB+MmNoLCBsZSB0aGHDryBlbXBpbGUgc2VzIHNpZ25lcy5cbiAgIFVuZSBtaXNlIGVuIHBhZ2Ugc3VyIDMxIGxhbmd1ZXMgbmUgcGV1dCBwYXMgZMOpcGVuZHJlIGR1IGRlc3NpbiBkJ3VuIGNoaWZmcmVcbiAgICh2b2lyIGFydGljbGVWaXRyaW5lLmNzcykuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuOnJvb3Qge1xuICAgIC0tbGFyZ2V1clRleHRlOiA3MTBweDtcbn1cblxuYm9keSB7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZmQmFzZSk7XG4gICAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgICBjb2xvcjogdmFyKC0tY05vaXIxKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jQmcpO1xufVxuXG4vKiBDb3VsZXVyIGRlIGwnZXNwYWNlIDogTEUgQkxFVSBBRE1JTklTVFJBVElPTiwgY29tbWUgcGFydG91dCBhaWxsZXVycyAoZMOpY2lzaW9uIGNoZWYgZGVcbiAgIHByb2pldCAyMDI2LTA5LTA3KS4gTGUgYm9keSBuZSBwb3J0ZSBwbHVzIGF1Y3VuZSBjbGFzc2UgZCdlc3BhY2UsIGlsIHByZW5kIGRvbmMgbGEgcGFsZXR0ZVxuICAgQWNjZW50IHBhciBkw6lmYXV0IGR1IG5veWF1ICgxMF9mb250LmNzcyA+IGJvZHkpLlxuICAgSnVzcXUnYXUgMjAyNi0wOS0wNyBpbCBwb3J0YWl0IGBib2R5UGFnZVZpdHJpbmVgLCBxdWkgbGEgYmFzY3VsYWl0IGVuIHZlcnQgKGTDqWNpc2lvbiBQT1xuICAgMjAyNi0wOS0wNSkuIExlIHZlcnQgZGlzdGluZ3VhaXQgbGUgcHVibGljIGRlIGwnYWRtaW5pc3RyYXRpb24sIG1haXMgaWwgZmFsbGFpdCByYW1lbmVyIGxlXG4gICBibGV1IMOgIGxhIG1haW4gc3VyIHRvdXQgY2UgcXVpIG1lbmFpdCDDoCB1biBnZXN0ZSBkJ2FkbWluaXN0cmF0aW9uIOKAlCB1biBsaWVuLCB1biBib3V0b24sIHVuXG4gICBvbmdsZXQuIFVuZSBzZXVsZSBjb3VsZXVyLCBwbHVzIHJpZW4gw6AgcmFtZW5lci5cbiAgIOKaoO+4jyBMYSBwYWxldHRlIHZlcnRlIGVzdCB0b3Vqb3VycyBEw4lGSU5JRSBkYW5zIGxlIG5veWF1ICgxMF9mb250LmNzcyA+IC5ib2R5UGFnZVZpdHJpbmUpLFxuICAgcGx1cyByaWVuIG5lIGxhIHBvc2UuIMOAIHN1cHByaW1lciBzdXIgYWNjb3JkIGR1IGNoZWYgZGUgcHJvamV0IDogYydlc3QgdW4gZmljaGllciBwYXJ0YWfDqVxuICAgYXZlYyBsZSBTdHVkaW8uICovXG5cbi8qIFN5c3TDqG1lIGRlIHNvdWxpZ25lbWVudCBkZXMgbGllbnMg4oCUIFZJVFJJTkUgVU5JUVVFTUVOVCAoZMOpY2lzaW9uIFBPIDIwMjYtMDgtMjUpIDpcbiAgIGxlIG5veWF1ICgzMV9jdGEuY3NzKSBsYWlzc2UgbGVzIGEgZW4gdGV4dC1kZWNvcmF0aW9uOiBub25lLlxuICAgYnV0dG9uLmxpZW5Cb3V0b24gc3VpdCA6IGMnZXN0IHVuIGJvdXRvbiBxdWkgYSBsZSB2aXN1ZWwgZCd1biBsaWVuICgzMV9jdGEuY3NzLFxuICAgdGVtcGxhdGVzL0NMQVVERS5tZCDCqyBCb3V0b24gb3UgbGllbiA/IMK7KSwgaWwgZG9pdCBzZSBzb3VsaWduZXIgY29tbWUgbGVzIGxpZW5zIGRlIGxhXG4gICBWaXRyaW5lIOKAlCBzaW5vbiBsYSBtw6ptZSBjbGFzc2UgZG9ubmUgdW4gYXV0cmUgYm91dG9uIGljaSBxdWUgZGFucyBsZSBTdHVkaW8gKGTDqWNpc2lvbiBjaGVmXG4gICBkZSBwcm9qZXQgMjAyNi0wOS0xNCkuICovXG5hLFxuYnV0dG9uLmxpZW5Cb3V0b24ge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIHRleHQtdW5kZXJsaW5lLW9mZnNldDogNXB4O1xuICAgIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDFweDtcbiAgICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IHZhcigtLWNOb2lyNSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDT05URU5FVVIgUFJJTkNJUEFMXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4uY29udGVudSB7XG4gICAgcGFkZGluZzogdmFyKC0tcGFkZGluZ1BhZ2UpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTElTVEVTXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG51bCwgb2wge1xuICAgIG1hcmdpbjogMTVweCAwO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcmV0cmFpdExpc3RlQ291cnQpO1xufVxuXG5saSB7XG4gICAgbWFyZ2luOiA4cHggMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEJMT0NTIEVYRU1QTEUgRVQgVFVUT1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLmV4ZW1wbGVEaXYsIC50dXRvRGl2IHtcbiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHZhcigtLWNBY2NlbnQzKTtcbiAgICBtYXJnaW46IDQwcHggMnB4O1xuICAgIHBhZGRpbmc6IHZhcigtLWdhcFJlZHVpdCkgMCB2YXIoLS1nYXBSZWR1aXQpIHZhcigtLXJldHJhaXRMaXN0ZUNvdXJ0KTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEhFQURFUiBFVCBOQVZJR0FUSU9OXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogTGllbiBtYXNxdcOpIMOgIEdvb2dsZSAoYDxzcGFuIGNsYXNzPVwiYnRVcmxcIj5gLCBjb21wb3NhbnRzL2xpZW5NYXNxdWUudHMsIGTDqWNpc2lvbiBjaGVmIGRlIHByb2pldFxuICAgMjAyNi0xMC0xOCkgOiB1biA8c3Bhbj4gbidhIG5pIGxlIGN1cnNldXIgZCd1biBsaWVuIG5pIGNlbHVpIGQndW4gYm91dG9uLiAqL1xuLmJ0VXJsIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/