1 Table des matières

Inclure une table des matières et spécifier (optionnellement) des sous-options de la TDM

  1. Inclure une table des matières, utiliser l’option toc
  2. toc_depth pour spécifier le nombre de titres (3 par défaut)
  3. toc_float pour que la TDM soit toujours visible dans la marge gauche
  4. collapsed (TRUE par défaut) pour déterminer si la table est étendue ou compacte par défaut (seulement titres visibles)
  5. smooth_scroll (TRUE par défaut) détermine si la TDM défile en même temps que le défilement de la page


2 Titres numérotés

Numéroter les titres avec l’option number_sections

# (H1)  = 1.
## (H2) = 1.1 (attention s'il n'y a pas de H1, ça donnera 0.1)
  • Pour ne pas numéroter certains titres: ajouter {-} ou {.unnumbered} après le titre


3 Transformer les sous-titres en onglets

Ajouter l’attribut .tabset au titre transforme tous les sous-titres en onglets au lieu de sous-sections (https://bookdown.org/yihui/rmarkdown-cookbook/html-tabs.html)

Code:

  • Il est aussi possible de spécifier 2 attributs supplémentaires pour les onglets:
  1. .tabset-fade: les onglets vont disparaitre et apparaitre en se déplacant de l’un à l’autre
  2. .tabset-pills apparence des onglets en “pill”:
  • Pour finir un tabset, commencer un nouveau header du niveau supérieur vide pour continuer avec des paragraphes réguliers

Résultat:

3.1 Exemple d’onglets

3.1.1 Onglet 1

Contenu de l’onglet 1

3.1.2 Onglet 2

Contenu de l’onglet 2



4 Mise en forme des graphiques

Plusieurs options possibles à inclure dans le YAML:

  • fig_width et fig_height: 7x5 par défaut.

  • fig_caption : légende des graphiques.

  • dev: gestion des formats de graphiques (png par défaut).

Options de mise en forme de graphiques peuvent aussi être indiquées dans chaque bloc:

fig.width= et fig.height= (en pouces), out.width= et out.height= (en %), fig.align= (‘left’, ‘center’, or ‘right’), fig.cap="" (légende), dev= (outil graphique, “png” par défaut ou svg ou jpeg).

Code:

```{r, out.width='25%', fig.align='center', fig.cap='Une légende'}
plot(cars)
```

Résultat:

Une légende

Une légende



5 Styles/CSS

5.1 Appliquer des thèmes prédéfinis:

  • theme : default, cerulean, journal, flatly, darkly, readable, spacelab, united, cosmo, lumen, paper, sandstone, simplex, yeti (null si on ne veut pas de thème, par ex si on veut utiliser son propre css)

  • highlight : pour définir l’apparence de la syntaxe: tango, pygments, kate, monochrome, espresso, zenburn, haddock, textmate (ou option null)

Voir theme gallery


5.3 Appliquer des styles prédéfinis sur des blocs de résultats

  • Personnaliser les blocs de code avec les options class.source et class.output: classes CSS prédéfinies qu’on peut changer ou non: “bg-primary”, “bg-success”, “bg-info”, “bg-warning”, “bg-danger”

Code:

```{r class.output="bg-info"}
1 + 1
```

Résultat:

## [1] 2

Code:

```{r class.output="bg-danger"}
1 + 1
```

Résultat:

## [1] 2


5.4 Définir ses propres styles dans le fichier .rmd

  1. Définir le style pour une classe resultat:
  1. Assigner la classe resultat aux blocs avec l’option class.source.

Code:

```{r class.source="resultat"}
mtcars[1:5, "mpg"]
```

Résultat:

## [1] 21.0 21.0 22.8 21.4 18.7


6 Fermer les blocs de code

Pour limiter la place que prennent les blocs de code, il possible de les “fermer” par défaut avec l’option code_fold dans le champ html_document de l’entête ou de limiter la longueur avec un scroll dans css

Il n’est pas possible de plier seulement le résultat de code avec des options de blocs de code mais peut se faire avec du javascript. Il est toutefois possible de limiter la hauteur du bloc en ajoutant un déroulement avec les options attr.source et attr.output

Code:

Résultat:

##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
##  [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
##  [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
##  [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
##  [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
##  [91]  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108
## [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
## [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
## [145] 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
## [163] 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## [181] 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
## [199] 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
## [217] 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
## [235] 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
## [253] 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
## [271] 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
## [289] 289 290 291 292 293 294 295 296 297 298 299 300

Voir: https://bookdown.org/yihui/rmarkdown-cookbook/hook-scroll.html

Pour de bonnes modifs html: https://bookdown.org/yihui/rmarkdown-cookbook/custom-blocks.html



7 Blocs de code en appendice

  • Par défaut les blocs de code et leurs résultats apparaissent à leur emplacement dans le texte, mais on peut ajouter tous les blocs de code à la fin du document en appendice en ajoutant un bloc de code avec les arguments ref.label et la fonction knitr::all_labels.
  • L’argument echo = FALSE devra être ajouté aux blocs de code.

code:

```{r ref.label=knitr::all_labels(), echo=TRUE, eval=FALSE}
```


8 Séparer le bloc des résultats

Présenter le résultat d’un bloc de codes ailleurs que directement dessous

  • On présente le bloc de code
```{r graphique1, dev='png', fig.show='hide'}
plot(cars)
```
  • Dans une autre section du document, on appel le résultat d’un bloc précédant avec la fonction knitr::fig_chunk et son label: (options_files/figure-html/graphique1-1.png)
```{r}
![Graphique provenant d'un bloc précédant](options_files/figure-html/graphique1-1.png)`
```


9 Téléchargement du fichier .rmd

Ajouter un bouton Code - Download .Rmd pour permettre le téléchargement du fichier R Markdown avec l’options code_download dans le YAML



10 Tableaux

  • Par défaut R Markdown présente les tableaux comme dans la console R mais plusieurs options permettent de modifier leur mise en page.

  • La modification de tableaux peut être plus ou moins complexe et peut varier selon le format de sortie.

  • Façon la plus efficace de présenter un talbeau est avec la fonction knitr::kable() qui possède plusieurs arguments pour paramétrer la présentation de tableaux.

  • Voir aussi package kableExtra qui peut créer tableau pour html, pdf et word.

  • Peut inclure légende avec option caption =

Code:

```{r table-cars, results = "asis"}
knitr::kable(cars[1:5, ], caption = 'Un titre')
```

Résultat:

Un titre
speed dist
4 2
4 10
7 4
7 22
8 16


10.0.1 Modifier la présentation des tableaux

  • Option df_print dans le YAML pour paramétrer la présentation de tableaux pour les documents html_document
  • Valeurs possibles: default, kable, tibble, paged (paginer les lignes de tableaux)
mtcars

Pour l’option paged, plusieurs arguments peuvent être spécifiés dans chaque code chunk ( max.print, rows.print, cols.print, pages.print,rownames.print … )

Code:

```{r cols.print=3, rows.print=3}
mtcars
```

Résultats:



11 Citations et bibliographie

  • Plusieurs façons d’insérer des citations mais la plus recommandée est d’utiliser de télécharger ses références dans un fichier BibTeX (.bib).
  • Inclure ensuite dans l’entête l’argument bibliography dans le YAML et défini sa valeur avec le chemin vers le fichier BibTeX sur son poste.
  • Pour changer le format des citations, télécharger le style (fichier csl) à partir de la liste de Zotero et l’inclure aussi dans le YAML.
  • Par défaut la bibliographie apparaitra à la fin du document, mais on peut forcer le déplacement des références en utilisant un div: <div id="refs"></div>

  • package citr

  • Après dans texte inclure [@Ref-1] ou [@ref-1; @ref-2; @ref-3] pour parenthèses ou @R-base pour référer à entrée dans le fichier. Pandoc va générer automatiquement une référence à la fin du document.

  • Pour inclure un titre dans la bibliographie qui n’a pas été citée dans le document, il faut définir un champ nocite dans l’entête

---
nocite: '@*'
---

---
nocite: |
  @cit1, @cit2
---


Bibliographies and Citations



12 Transformer un script en présentation .Rmd

  • Il est possible de générer un document de présentation directement à partir d’un fichier de script R dans RStudio avec la fonction knitr::spin() - (Ctrl / Cmd + Shift + K).
  • Solution utile si pas beaucoup de texte à ajouter dans analyse.
  • Il faudra par contre appliquer une syntaxe particulière à son fichier de script.
  • Il est aussi possible de faire le contraire et de transformer un document markdown en script avec knit::purl.




13 Document Word

Pour créer un document Word à partir de R Markdown, on spécifie le format word_document dans l’entête YAML du document.

  • On peut créer un template (style reference document) pour modifier la mise en page du document word.
  • Ce template doit débuter par un document Rmd avec le format word_document.
  • Ouvrir ensuite le document dans Word et modifier les styles et enregistrer sous un autre nom en fichier .docx pour ensuite l’ajouter dans le YAML.

Voir:



14 Bookdown

  • Dans RStudio: File -> New Project -> New Directory -> Book Project using bookdown

  • Créer pour rédiger de longs documents comme un livre à partir de plusieurs documents R Markdown où généralement chaque fichier est un chapitre.

  • Le premier document est généralement nommé index.Rmd et c’est le seul où se trouve le YAML.

  • Doit également trouver dans l’entête: site: bookdown::bookdown_site pour que rmarkdown sache qu’il faut utiliser bookdown pour construire tous les fichiers et pas seulement un fichier rmd.

  • Plusieurs formats de output peuvent être utilisés:

    • bookdown::gitbook
    • bookdown::pdf_book
    • bookdown::word_document2
    • bookdown::epub_book

Construit les fichier en appellant la fonction bookdown::render_book(‘index.Rmd’)

verbatim inline expression

`r 1+1`

Verbatim code chunks

```{r, eval=TRUE}
1 + 1
```

bloc gris texte noir

bloc gris texte vert

bloc blanc texte noir ``` # Titre non numéroté {-}


  1. Institution: Université de Montréal,

LS0tDQp0aXRsZTogIlJtYXJrZG93biAtIFBhcmFtw6l0cmFnZXMgdXRpbGVzIg0KYXV0aG9yOiAiQ2Fyb2xpbmUgUGF0ZW5hdWRlXltJbnN0aXR1dGlvbjogVW5pdmVyc2l0w6kgZGUgTW9udHLDqWFsLCBjYXJvbGluZS5wYXRlbmF1ZGVAdW1vbnRyZWFsLmNhXSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRoZW1lOiB5ZXRpDQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIFNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgdG9jX2RlcHRoOiAzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxicj4NCg0KIyBUYWJsZSBkZXMgbWF0acOocmVzDQoNCkluY2x1cmUgdW5lIHRhYmxlIGRlcyBtYXRpw6hyZXMgZXQgc3DDqWNpZmllciAob3B0aW9ubmVsbGVtZW50KSBkZXMgc291cy1vcHRpb25zIGRlIGxhIFRETSANCg0KMS4gSW5jbHVyZSB1bmUgdGFibGUgZGVzIG1hdGnDqHJlcywgdXRpbGlzZXIgbCdvcHRpb24gYHRvY2AgDQoyLiBgdG9jX2RlcHRoYCBwb3VyIHNww6ljaWZpZXIgbGUgbm9tYnJlIGRlIHRpdHJlcyAoMyBwYXIgZMOpZmF1dCkNCjMuIGB0b2NfZmxvYXRgIHBvdXIgcXVlIGxhIFRETSBzb2l0IHRvdWpvdXJzIHZpc2libGUgZGFucyBsYSBtYXJnZSBnYXVjaGUgDQo0LiBgY29sbGFwc2VkYCAoYFRSVUVgIHBhciBkw6lmYXV0KSBwb3VyIGTDqXRlcm1pbmVyIHNpIGxhIHRhYmxlIGVzdCDDqXRlbmR1ZSBvdSBjb21wYWN0ZSBwYXIgZMOpZmF1dCAoc2V1bGVtZW50IHRpdHJlcyB2aXNpYmxlcykNCjUuIGBzbW9vdGhfc2Nyb2xsYCAoYFRSVUVgIHBhciBkw6lmYXV0KSBkw6l0ZXJtaW5lIHNpIGxhIFRETSBkw6lmaWxlIGVuIG3Dqm1lIHRlbXBzIHF1ZSBsZSBkw6lmaWxlbWVudCBkZSBsYSBwYWdlDQoNCg0KYGBgeWFtbA0KLS0tDQp0aXRsZTogIkV4ZW1wbGUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQotLS0NCmBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBUaXRyZXMgbnVtw6lyb3TDqXMNCg0KTnVtw6lyb3RlciBsZXMgdGl0cmVzIGF2ZWMgbCdvcHRpb24gYG51bWJlcl9zZWN0aW9uc2AgDQoNCmBgYHlhbWwNCi0tLQ0KdGl0bGU6ICJFeGVtcGxlIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KLS0tDQpgYGANCg0KYGBgDQojIChIMSkgID0gMS4NCiMjIChIMikgPSAxLjEgKGF0dGVudGlvbiBzJ2lsIG4neSBhIHBhcyBkZSBIMSwgw6dhIGRvbm5lcmEgMC4xKQ0KYGBgDQoNCi0gUG91ciBuZSBwYXMgbnVtw6lyb3RlciBjZXJ0YWlucyB0aXRyZXM6IGFqb3V0ZXIgYHstfWAgb3UgYHsudW5udW1iZXJlZH1gIGFwcsOocyBsZSB0aXRyZQ0KDQoNCioqKg0KDQo8L2JyPg0KDQojIFRyYW5zZm9ybWVyIGxlcyBzb3VzLXRpdHJlcyBlbiBvbmdsZXRzIA0KDQpBam91dGVyIGwnYXR0cmlidXQgYC50YWJzZXRgIGF1IHRpdHJlIHRyYW5zZm9ybWUgdG91cyBsZXMgc291cy10aXRyZXMgZW4gb25nbGV0cyBhdSBsaWV1IGRlIHNvdXMtc2VjdGlvbnMgKGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay9odG1sLXRhYnMuaHRtbCkNCg0KKipDb2RlOioqDQoNCmBgYG1hcmtkb3duDQojIyBFeGVtcGxlIGQnb25nbGV0cyB7LnRhYnNldH0NCg0KIyMjIE9uZ2xldCAxDQoNCkNvbnRlbnUgZGUgbCdvbmdsZXQgMQ0KDQojIyMgT25nbGV0IDINCg0KQ29udGVudSBkZSBsJ29uZ2xldCAyDQoNCiMjIHstfQ0KYGBgDQoNCi0gSWwgZXN0IGF1c3NpIHBvc3NpYmxlIGRlIHNww6ljaWZpZXIgMiBhdHRyaWJ1dHMgc3VwcGzDqW1lbnRhaXJlcyBwb3VyIGxlcyBvbmdsZXRzOiANCg0KMS4gYC50YWJzZXQtZmFkZWA6IGxlcyBvbmdsZXRzIHZvbnQgZGlzcGFyYWl0cmUgZXQgYXBwYXJhaXRyZSBlbiBzZSBkw6lwbGFjYW50IGRlIGwndW4gw6AgbCdhdXRyZQ0KMi4gYC50YWJzZXQtcGlsbHNgIGFwcGFyZW5jZSBkZXMgb25nbGV0cyBlbiAicGlsbCI6DQoNCmBgYG1hcmtkb3duDQojIyBRdWFydGVybHkgUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCmBgYA0KDQotIFBvdXIgZmluaXIgdW4gdGFic2V0LCBjb21tZW5jZXIgdW4gbm91dmVhdSAqaGVhZGVyKiBkdSBuaXZlYXUgc3Vww6lyaWV1ciB2aWRlIHBvdXIgY29udGludWVyIGF2ZWMgZGVzIHBhcmFncmFwaGVzIHLDqWd1bGllcnMgDQoNCg0KKipSw6lzdWx0YXQ6KioNCg0KIyMgRXhlbXBsZSBkJ29uZ2xldHMgey50YWJzZXR9DQoNCiMjIyBPbmdsZXQgMQ0KDQpDb250ZW51IGRlIGwnb25nbGV0IDENCg0KIyMjIE9uZ2xldCAyDQoNCkNvbnRlbnUgZGUgbCdvbmdsZXQgMg0KDQojIyB7LX0NCg0KDQoqKioNCg0KPC9icj4NCg0KIyBNaXNlIGVuIGZvcm1lIGRlcyBncmFwaGlxdWVzDQoNClBsdXNpZXVycyBvcHRpb25zIHBvc3NpYmxlcyDDoCBpbmNsdXJlIGRhbnMgbGUgWUFNTDoNCg0KLSBgZmlnX3dpZHRoYCBldCAgYGZpZ19oZWlnaHRgOiA3eDUgcGFyIGTDqWZhdXQuDQoNCi0gYGZpZ19jYXB0aW9uYCA6IGzDqWdlbmRlIGRlcyBncmFwaGlxdWVzLg0KDQotIGBkZXZgOiBnZXN0aW9uIGRlcyBmb3JtYXRzIGRlIGdyYXBoaXF1ZXMgKGBwbmdgIHBhciBkw6lmYXV0KS4NCg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQogICAgZmlnX2NhcHRpb246IHRydWUNCi0tLQ0KYGBgDQpPcHRpb25zIGRlIG1pc2UgZW4gZm9ybWUgZGUgZ3JhcGhpcXVlcyBwZXV2ZW50IGF1c3NpIMOqdHJlIGluZGlxdcOpZXMgZGFucyBjaGFxdWUgYmxvYzogIA0KDQpgZmlnLndpZHRoPWAgZXQgYGZpZy5oZWlnaHQ9YCAoZW4gcG91Y2VzKSwgYG91dC53aWR0aD1gIGV0IGBvdXQuaGVpZ2h0PWAgKGVuICUpLCBgZmlnLmFsaWduPWAgKCdsZWZ0JywgJ2NlbnRlcicsIG9yICdyaWdodCcpLCBgZmlnLmNhcD0iImAgKGzDqWdlbmRlKSwgYGRldj1gIChvdXRpbCBncmFwaGlxdWUsICJwbmciIHBhciBkw6lmYXV0IG91IHN2ZyBvdSBqcGVnKS4NCg0KKipDb2RlOioqDQpgYGBgDQpgYGB7ciwgb3V0LndpZHRoPScyNSUnLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9J1VuZSBsw6lnZW5kZSd9YHIgJydgDQpwbG90KGNhcnMpDQpgYGANCmBgYGANCg0KKipSw6lzdWx0YXQ6KioNCmBgYHtyLCBvdXQud2lkdGg9JzI1JScsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0nVW5lIGzDqWdlbmRlJ30NCnBsb3QoY2FycykNCmBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBTdHlsZXMvQ1NTDQoNCiMjIEFwcGxpcXVlciBkZXMgdGjDqG1lcyBwcsOpZMOpZmluaXM6DQoNCi0gYHRoZW1lYCA6IGRlZmF1bHQsIGNlcnVsZWFuLCBqb3VybmFsLCBmbGF0bHksIGRhcmtseSwgcmVhZGFibGUsIHNwYWNlbGFiLCB1bml0ZWQsIGNvc21vLCBsdW1lbiwgcGFwZXIsIHNhbmRzdG9uZSwgc2ltcGxleCwgeWV0aSAobnVsbCBzaSBvbiBuZSB2ZXV0IHBhcyBkZSB0aMOobWUsIHBhciBleCBzaSBvbiB2ZXV0IHV0aWxpc2VyIHNvbiBwcm9wcmUgY3NzKQ0KDQotIGBoaWdobGlnaHRgIDogcG91ciBkw6lmaW5pciBsJ2FwcGFyZW5jZSBkZSBsYSBzeW50YXhlOiB0YW5nbywgcHlnbWVudHMsIGthdGUsIG1vbm9jaHJvbWUsIGVzcHJlc3NvLCB6ZW5idXJuLCBoYWRkb2NrLCB0ZXh0bWF0ZSAob3Ugb3B0aW9uIGBudWxsYCkgDQoNCltWb2lyIHRoZW1lIGdhbGxlcnldKGh0dHBzOi8vd3d3LmRhdGFkcmVhbWluZy5vcmcvcG9zdC9yLW1hcmtkb3duLXRoZW1lLWdhbGxlcnkvKQ0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogdW5pdGVkDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQpgYGANCjwvYnI+DQoNCiMjIETDqWZpbmlyIHNhIHByb3ByZSBmZXVpbGxlICBDU1MgOg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogbnVsbA0KICAgIGhpZ2hsaWdodDogbnVsbA0KICAgIGNzczogc3R5bGVzLmNzcw0KLS0tDQpgYGANCg0KPC9icj4NCg0KIyMgQXBwbGlxdWVyIGRlcyBzdHlsZXMgcHLDqWTDqWZpbmlzIHN1ciBkZXMgYmxvY3MgZGUgcsOpc3VsdGF0cw0KDQotIFBlcnNvbm5hbGlzZXIgbGVzIGJsb2NzIGRlIGNvZGUgYXZlYyBsZXMgb3B0aW9ucyBgY2xhc3Muc291cmNlYCBldCBgY2xhc3Mub3V0cHV0YDogW2NsYXNzZXMgQ1NTIHByw6lkw6lmaW5pZXNdKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzMuNC9jc3MvI2hlbHBlci1jbGFzc2VzKSBxdSdvbiBwZXV0IGNoYW5nZXIgb3Ugbm9uOiAiYmctcHJpbWFyeSIsICJiZy1zdWNjZXNzIiwgImJnLWluZm8iLCAiYmctd2FybmluZyIsICJiZy1kYW5nZXIiDQoNCioqQ29kZToqKg0KYGBgYA0KYGBge3IgY2xhc3Mub3V0cHV0PSJiZy1pbmZvIn1gciAnJ2ANCjEgKyAxDQpgYGANCmBgYGANCg0KKipSw6lzdWx0YXQ6KioNCmBgYHtyIGNsYXNzLm91dHB1dD0iYmctaW5mbyJ9DQoxKzENCmBgYA0KDQoqKkNvZGU6KioNCmBgYGANCmBgYHtyIGNsYXNzLm91dHB1dD0iYmctZGFuZ2VyIn1gciAnJ2ANCjEgKyAxDQpgYGANCmBgYGANCioqUsOpc3VsdGF0OioqDQpgYGB7ciBjbGFzcy5vdXRwdXQ9ImJnLWRhbmdlciJ9DQoxKzENCmBgYA0KDQo8YnI+DQoNCiMjIETDqWZpbmlyIHNlcyBwcm9wcmVzIHN0eWxlcyBkYW5zIGxlIGZpY2hpZXIgLnJtZA0KDQoxLiBEw6lmaW5pciBsZSBzdHlsZSBwb3VyIHVuZSBjbGFzc2UgYHJlc3VsdGF0YDoNCg0KYGBgeWFtbA0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5yZXN1bHRhdCB7DQogIGJhY2tncm91bmQtY29sb3I6IHJlZDsNCiAgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpgYGANCmBgYA0KDQoyLiBBc3NpZ25lciBsYSBjbGFzc2UgYHJlc3VsdGF0YCBhdXggYmxvY3MgYXZlYyBsJ29wdGlvbiBgY2xhc3Muc291cmNlYC4NCg0KKipDb2RlOioqDQpgYGBgDQpgYGB7ciBjbGFzcy5zb3VyY2U9InJlc3VsdGF0In1gciAnJ2ANCm10Y2Fyc1sxOjUsICJtcGciXQ0KYGBgDQpgYGBgDQoqKlLDqXN1bHRhdDoqKg0KYGBge3IgY2xhc3Muc291cmNlPSJyZXN1bHRhdCJ9DQptdGNhcnNbMTo1LCAibXBnIl0NCmBgYA0KDQoNCioqKg0KDQo8L2JyPg0KDQojIEZlcm1lciBsZXMgYmxvY3MgZGUgY29kZQ0KDQpQb3VyIGxpbWl0ZXIgbGEgcGxhY2UgcXVlIHByZW5uZW50IGxlcyBibG9jcyBkZSBjb2RlLCBpbCBwb3NzaWJsZSBkZSBsZXMgImZlcm1lciIgcGFyIGTDqWZhdXQgYXZlYyBsJ29wdGlvbiBgY29kZV9mb2xkYCBkYW5zIGxlIGNoYW1wIGh0bWxfZG9jdW1lbnQgZGUgbCdlbnTDqnRlIG91IGRlIGxpbWl0ZXIgbGEgbG9uZ3VldXIgYXZlYyB1biBbc2Nyb2xsIGRhbnMgY3NzXShodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svaHRtbC1zY3JvbGwuaHRtbCkNCg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KYGBgDQoNCklsIG4nZXN0IHBhcyBwb3NzaWJsZSBkZSBwbGllciBzZXVsZW1lbnQgbGUgcsOpc3VsdGF0IGRlIGNvZGUgYXZlYyBkZXMgb3B0aW9ucyBkZSBibG9jcyBkZSBjb2RlIG1haXMgcGV1dCBzZSBmYWlyZSBhdmVjIGR1IGphdmFzY3JpcHQuIElsIGVzdCB0b3V0ZWZvaXMgcG9zc2libGUgZGUgbGltaXRlciBsYSBoYXV0ZXVyIGR1IGJsb2MgZW4gYWpvdXRhbnQgdW4gZMOpcm91bGVtZW50IGF2ZWMgbGVzIG9wdGlvbnMgYGF0dHIuc291cmNlYCBldCBgYXR0ci5vdXRwdXRgDQoNCioqQ29kZToqKg0KYGBgYG1kDQpgYGB7ciwgYXR0ci5vdXRwdXQ9J3N0eWxlPSJtYXgtaGVpZ2h0OiAxMDBweDsiJ31gciAnJ2ANCjE6MzAwDQpgYGANCmBgYGANCg0KDQoqKlLDqXN1bHRhdDoqKg0KDQpgYGB7ciwgYXR0ci5vdXRwdXQ9J3N0eWxlPSJtYXgtaGVpZ2h0OiAxMDBweDsiJ30NCjE6MzAwDQpgYGANCg0KDQpWb2lyOiBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svaG9vay1zY3JvbGwuaHRtbA0KDQpQb3VyIGRlIGJvbm5lcyBtb2RpZnMgaHRtbDogaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rL2N1c3RvbS1ibG9ja3MuaHRtbA0KDQoqKioNCg0KPC9icj4NCg0KIyBCbG9jcyBkZSBjb2RlIGVuIGFwcGVuZGljZQ0KDQotIFBhciBkw6lmYXV0IGxlcyBibG9jcyBkZSBjb2RlIGV0IGxldXJzIHLDqXN1bHRhdHMgYXBwYXJhaXNzZW50IMOgIGxldXIgZW1wbGFjZW1lbnQgZGFucyBsZSB0ZXh0ZSwgbWFpcyBvbiBwZXV0IGFqb3V0ZXIgdG91cyBsZXMgYmxvY3MgZGUgY29kZSDDoCBsYSBmaW4gZHUgZG9jdW1lbnQgZW4gW2FwcGVuZGljZV0oaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rL2NvZGUtYXBwZW5kaXguaHRtbCkgZW4gYWpvdXRhbnQgdW4gYmxvYyBkZSBjb2RlIGF2ZWMgbGVzIGFyZ3VtZW50cyBgcmVmLmxhYmVsYCBldCBsYSBmb25jdGlvbiBga25pdHI6OmFsbF9sYWJlbHNgLg0KLSBMJ2FyZ3VtZW50IGBlY2hvID0gRkFMU0VgIGRldnJhIMOqdHJlIGFqb3V0w6kgYXV4IGJsb2NzIGRlIGNvZGUuDQoNCioqY29kZToqKg0KYGBgYA0KYGBge3IgcmVmLmxhYmVsPWtuaXRyOjphbGxfbGFiZWxzKCksIGVjaG89VFJVRSwgZXZhbD1GQUxTRX1gciAnJ2ANCmBgYA0KYGBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBTw6lwYXJlciBsZSBibG9jIGRlcyByw6lzdWx0YXRzDQoNClByw6lzZW50ZXIgbGUgcsOpc3VsdGF0IGQndW4gYmxvYyBkZSBjb2RlcyBhaWxsZXVycyBxdWUgZGlyZWN0ZW1lbnQgZGVzc291cw0KDQotIE9uIHByw6lzZW50ZSBsZSBibG9jIGRlIGNvZGUNCg0KYGBgYA0KYGBge3IgZ3JhcGhpcXVlMSwgZGV2PSdwbmcnLCBmaWcuc2hvdz0naGlkZSd9YHIgJydgDQpwbG90KGNhcnMpDQpgYGANCmBgYGANCg0KLSBEYW5zIHVuZSBhdXRyZSBzZWN0aW9uIGR1IGRvY3VtZW50LCBvbiBhcHBlbCBsZSByw6lzdWx0YXQgZCd1biBibG9jIHByw6ljw6lkYW50IGF2ZWMgbGEgZm9uY3Rpb24gYGtuaXRyOjpmaWdfY2h1bmtgIGV0IHNvbiAqbGFiZWwqOiBgKGByIGtuaXRyOjpmaWdfY2h1bmsoJ2dyYXBoaXF1ZTEnLCAncG5nJylgKWANCg0KYGBgYA0KYGBge3J9YHIgJydgDQohW0dyYXBoaXF1ZSBwcm92ZW5hbnQgZCd1biBibG9jIHByw6ljw6lkYW50XShgciBrbml0cjo6ZmlnX2NodW5rKCdncmFwaGlxdWUxJywgJ3BuZycpYClgDQpgYGANCmBgYGANCg0KKioqDQoNCjwvYnI+DQoNCiMgVMOpbMOpY2hhcmdlbWVudCBkdSBmaWNoaWVyIC5ybWQNCg0KQWpvdXRlciB1biBib3V0b24gQ29kZSAtIERvd25sb2FkIC5SbWQgcG91ciBwZXJtZXR0cmUgbGUgdMOpbMOpY2hhcmdlbWVudCBkdSBmaWNoaWVyIFIgTWFya2Rvd24gYXZlYyBsJ29wdGlvbnMgYGNvZGVfZG93bmxvYWRgIGRhbnMgbGUgWUFNTA0KDQpgYGBgeWFtbA0KLS0tDQp0aXRsZTogIkV4ZW1wbGUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQpgYGBgDQoNCioqKg0KDQo8L2JyPg0KDQoNCiMgVGFibGVhdXgNCg0KLSBQYXIgZMOpZmF1dCBSIE1hcmtkb3duIHByw6lzZW50ZSBsZXMgdGFibGVhdXggY29tbWUgZGFucyBsYSBjb25zb2xlIFIgbWFpcyBwbHVzaWV1cnMgb3B0aW9ucyBwZXJtZXR0ZW50IGRlIG1vZGlmaWVyIGxldXIgbWlzZSBlbiBwYWdlLiANCi0gTGEgbW9kaWZpY2F0aW9uIGRlIHRhYmxlYXV4IHBldXQgw6p0cmUgcGx1cyBvdSBtb2lucyBjb21wbGV4ZSBldCBwZXV0IHZhcmllciBzZWxvbiBsZSBmb3JtYXQgZGUgc29ydGllLg0KLSBGYcOnb24gbGEgcGx1cyBlZmZpY2FjZSBkZSBwcsOpc2VudGVyIHVuIHRhbGJlYXUgZXN0IGF2ZWMgbGEgZm9uY3Rpb24gW2tuaXRyOjprYWJsZSgpXShodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2sva2FibGUuaHRtbCNrYWJsZS1mb3JtYXRzKSBxdWkgcG9zc8OoZGUgcGx1c2lldXJzIGFyZ3VtZW50cyBwb3VyIHBhcmFtw6l0cmVyIGxhIHByw6lzZW50YXRpb24gZGUgdGFibGVhdXguDQotIFZvaXIgYXVzc2kgW3BhY2thZ2Uga2FibGVFeHRyYV0oaHR0cHM6Ly9oYW96aHUyMzMuZ2l0aHViLmlvL2thYmxlRXh0cmEvKSBxdWkgcGV1dCBjcsOpZXIgdGFibGVhdSBwb3VyIGh0bWwsIHBkZiBldCB3b3JkLg0KDQotIFBldXQgaW5jbHVyZSBsw6lnZW5kZSBhdmVjIG9wdGlvbiBjYXB0aW9uID0gDQoNCioqQ29kZToqKg0KDQpgYGBgDQpgYGB7ciB0YWJsZS1jYXJzLCByZXN1bHRzID0gImFzaXMifWByICcnYA0Ka25pdHI6OmthYmxlKGNhcnNbMTo1LCBdLCBjYXB0aW9uID0gJ1VuIHRpdHJlJykNCmBgYA0KYGBgYA0KDQoqKlLDqXN1bHRhdDoqKg0KYGBge3IgdGFibGUtY2FycywgcmVzdWx0cyA9ICJhc2lzIn0NCmtuaXRyOjprYWJsZShjYXJzWzE6NSwgXSwgY2FwdGlvbiA9ICdVbiB0aXRyZScpDQpgYGANCg0KKioqDQoNCjwvYnI+DQoNCiMjIyBNb2RpZmllciBsYSBwcsOpc2VudGF0aW9uIGRlcyB0YWJsZWF1eA0KDQotIE9wdGlvbiBgZGZfcHJpbnRgIGRhbnMgbGUgWUFNTCBwb3VyIHBhcmFtw6l0cmVyIGxhIHByw6lzZW50YXRpb24gZGUgdGFibGVhdXggcG91ciBsZXMgZG9jdW1lbnRzIGBodG1sX2RvY3VtZW50YA0KLSBWYWxldXJzIHBvc3NpYmxlczogZGVmYXVsdCwga2FibGUsIHRpYmJsZSwgcGFnZWQgKHBhZ2luZXIgbGVzIGxpZ25lcyBkZSB0YWJsZWF1eCkNCg0KYGBgeWFtbA0KLS0tDQp0aXRsZTogIkV4ZW1wbGUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCmBgYA0KDQpgciAnJ2BgYGB7cn0NCm10Y2Fycw0KYGBgDQoNClBvdXIgbCdvcHRpb24gYHBhZ2VkYCwgcGx1c2lldXJzIGFyZ3VtZW50cyBwZXV2ZW50IMOqdHJlIHNww6ljaWZpw6lzIGRhbnMgY2hhcXVlIGNvZGUgY2h1bmsgKCBtYXgucHJpbnQsIHJvd3MucHJpbnQsIGNvbHMucHJpbnQsIHBhZ2VzLnByaW50LHJvd25hbWVzLnByaW50IC4uLiAgKQ0KDQoqKkNvZGU6KioNCmBgYGANCmBgYHtyIGNvbHMucHJpbnQ9Mywgcm93cy5wcmludD0zfWByICcnYA0KbXRjYXJzDQpgYGANCmBgYGANCioqUsOpc3VsdGF0czoqKg0KYGBge3IgY29scy5wcmludD0zLCByb3dzLnByaW50PTN9DQptdGNhcnMNCmBgYA0KDQoqKioNCg0KPC9icj4NCg0KIyBDaXRhdGlvbnMgZXQgYmlibGlvZ3JhcGhpZQ0KDQotIFBsdXNpZXVycyBmYcOnb25zIGQnaW5zw6lyZXIgZGVzIGNpdGF0aW9ucyBtYWlzIGxhIHBsdXMgcmVjb21tYW5kw6llIGVzdCBkJ3V0aWxpc2VyIGRlIHTDqWzDqWNoYXJnZXIgc2VzIHLDqWbDqXJlbmNlcyBkYW5zIHVuIGZpY2hpZXIgQmliVGVYICguYmliKS4gDQotIEluY2x1cmUgZW5zdWl0ZSBkYW5zIGwnZW50w6p0ZSBsJ2FyZ3VtZW50IGJpYmxpb2dyYXBoeSBkYW5zIGxlIFlBTUwgZXQgZMOpZmluaSBzYSB2YWxldXIgYXZlYyBsZSBjaGVtaW4gdmVycyBsZSBmaWNoaWVyIEJpYlRlWCBzdXIgc29uIHBvc3RlLiANCi0gUG91ciBjaGFuZ2VyIGxlIGZvcm1hdCBkZXMgY2l0YXRpb25zLCB0w6lsw6ljaGFyZ2VyIGxlIHN0eWxlIChmaWNoaWVyIGNzbCkgw6AgcGFydGlyIGRlIGxhIGxpc3RlIGRlIFtab3Rlcm9dKGh0dHBzOi8vd3d3LnpvdGVyby5vcmcvc3R5bGVzKSBldCBsJ2luY2x1cmUgYXVzc2kgZGFucyBsZSBZQU1MLg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiRXhlbXBsZSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCmJpYmxpb2dyYXBoeTogY2l0YXRpb25zLmJpYg0KY3NsOiBhcGEtNXRoLWVkaXRpb24uY3NsDQotLS0NCmBgYA0KDQotIFBhciBkw6lmYXV0IGxhIGJpYmxpb2dyYXBoaWUgYXBwYXJhaXRyYSDDoCBsYSBmaW4gZHUgZG9jdW1lbnQsIG1haXMgb24gcGV1dCBmb3JjZXIgbGUgZMOpcGxhY2VtZW50IGRlcyByw6lmw6lyZW5jZXMgZW4gdXRpbGlzYW50IHVuIGRpdjogYDxkaXYgaWQ9InJlZnMiPjwvZGl2PmANCg0KLSBwYWNrYWdlIGNpdHIgDQoNCi0gQXByw6hzIGRhbnMgdGV4dGUgaW5jbHVyZSBbQFJlZi0xXSBvdSBbQHJlZi0xOyBAcmVmLTI7IEByZWYtM10gcG91ciBwYXJlbnRow6hzZXMgb3UgQFItYmFzZSBwb3VyIHLDqWbDqXJlciDDoCBlbnRyw6llIGRhbnMgbGUgZmljaGllci4gUGFuZG9jIHZhIGfDqW7DqXJlciBhdXRvbWF0aXF1ZW1lbnQgdW5lIHLDqWbDqXJlbmNlIMOgIGxhIGZpbiBkdSBkb2N1bWVudC4NCg0KLSBQb3VyIGluY2x1cmUgdW4gdGl0cmUgZGFucyBsYSBiaWJsaW9ncmFwaGllIHF1aSBuJ2EgcGFzIMOpdMOpIGNpdMOpZSBkYW5zIGxlIGRvY3VtZW50LCBpbCBmYXV0IGTDqWZpbmlyIHVuIGNoYW1wIG5vY2l0ZSBkYW5zIGwnZW50w6p0ZQ0KDQpgYGBgDQotLS0NCm5vY2l0ZTogJ0AqJw0KLS0tDQoNCi0tLQ0Kbm9jaXRlOiB8DQogIEBjaXQxLCBAY2l0Mg0KLS0tDQpgYGBgDQoNCjxicj4NCltCaWJsaW9ncmFwaGllcyBhbmQgQ2l0YXRpb25zXShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9hdXRob3JpbmdfYmlibGlvZ3JhcGhpZXNfYW5kX2NpdGF0aW9ucy5odG1sKQ0KDQoqKioNCg0KPC9icj4NCg0KIyBUcmFuc2Zvcm1lciB1biBzY3JpcHQgZW4gcHLDqXNlbnRhdGlvbiAuUm1kDQoNCi0gSWwgZXN0IHBvc3NpYmxlIGRlIGfDqW7DqXJlciB1biBkb2N1bWVudCBkZSBwcsOpc2VudGF0aW9uIGRpcmVjdGVtZW50IMOgIHBhcnRpciBkJ3VuIGZpY2hpZXIgZGUgc2NyaXB0IFIgZGFucyBSU3R1ZGlvIGF2ZWMgbGEgZm9uY3Rpb24gYGtuaXRyOjpzcGluKClgIC0gKEN0cmwgLyBDbWQgKyBTaGlmdCArIEspLiANCi0gU29sdXRpb24gdXRpbGUgc2kgcGFzIGJlYXVjb3VwIGRlIHRleHRlIMOgIGFqb3V0ZXIgZGFucyBhbmFseXNlLg0KLSBJbCBmYXVkcmEgcGFyIGNvbnRyZSBhcHBsaXF1ZXIgdW5lIHN5bnRheGUgcGFydGljdWxpw6hyZSDDoCBzb24gZmljaGllciBkZSBzY3JpcHQuDQotIElsIGVzdCBhdXNzaSBwb3NzaWJsZSBkZSBmYWlyZSBsZSBjb250cmFpcmUgZXQgZGUgdHJhbnNmb3JtZXIgdW4gZG9jdW1lbnQgbWFya2Rvd24gZW4gc2NyaXB0IGF2ZWMgYGtuaXQ6OnB1cmxgLg0KDQo8YnI+DQoNCi0gVm9pciA6IGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay9zcGluLmh0bWwgDQotIFZvaXIgOiBodHRwczovL2RlYW5hdHRhbGkuY29tLzIwMTUvMDMvMjQva25pdHJzLWJlc3QtaGlkZGVuLWdlbS1zcGluLyANCg0KKioqDQoNCjwvYnI+DQoNCiMgRG9jdW1lbnQgV29yZA0KDQpQb3VyIGNyw6llciB1biBkb2N1bWVudCBXb3JkIMOgIHBhcnRpciBkZSBSIE1hcmtkb3duLCBvbiBzcMOpY2lmaWUgbGUgZm9ybWF0IGB3b3JkX2RvY3VtZW50YCBkYW5zIGwnZW50w6p0ZSBZQU1MIGR1IGRvY3VtZW50Lg0KDQpgYGB5YW1sDQotLS0NCnRpdGxlOiAiSGFiaXRzIg0KYXV0aG9yOiBKb2huIERvZQ0KZGF0ZTogTWFyY2ggMjIsIDIwMDUNCm91dHB1dDogDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgcmVmZXJlbmNlX2RvY3g6IG15LXN0eWxlcy5kb2N4DQotLS0NCmBgYA0KDQotIE9uIHBldXQgY3LDqWVyIHVuICp0ZW1wbGF0ZSogKihzdHlsZSByZWZlcmVuY2UgZG9jdW1lbnQqKSBwb3VyIG1vZGlmaWVyIGxhIG1pc2UgZW4gcGFnZSBkdSBkb2N1bWVudCB3b3JkLg0KLSBDZSB0ZW1wbGF0ZSBkb2l0IGTDqWJ1dGVyIHBhciB1biBkb2N1bWVudCBSbWQgYXZlYyBsZSBmb3JtYXQgd29yZF9kb2N1bWVudC4NCi0gT3V2cmlyIGVuc3VpdGUgbGUgZG9jdW1lbnQgZGFucyBXb3JkIGV0IG1vZGlmaWVyIGxlcyBzdHlsZXMgZXQgZW5yZWdpc3RyZXIgc291cyB1biBhdXRyZSBub20gZW4gZmljaGllciBgLmRvY3hgIHBvdXIgZW5zdWl0ZSBsJ2Fqb3V0ZXIgZGFucyBsZSBZQU1MLg0KDQoNClZvaXI6DQoNCi0gaHR0cHM6Ly92aW1lby5jb20vMTEwODA0Mzg3DQotIGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay93b3JkLXRlbXBsYXRlLmh0bWwNCi0gaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vYXJ0aWNsZXNfZG9jeC5odG1sDQoNCioqKg0KDQo8L2JyPg0KDQojIEJvb2tkb3duDQoNCi0gRGFucyBSU3R1ZGlvOiBGaWxlIC0+IE5ldyBQcm9qZWN0IC0+IE5ldyBEaXJlY3RvcnkgLT4gQm9vayBQcm9qZWN0IHVzaW5nIGJvb2tkb3duDQoNCi0gQ3LDqWVyIHBvdXIgcsOpZGlnZXIgZGUgbG9uZ3MgZG9jdW1lbnRzIGNvbW1lIHVuIGxpdnJlIMOgIHBhcnRpciBkZSBwbHVzaWV1cnMgZG9jdW1lbnRzIFIgTWFya2Rvd24gb8O5IGfDqW7DqXJhbGVtZW50IGNoYXF1ZSBmaWNoaWVyIGVzdCB1biBjaGFwaXRyZS4NCg0KLSBMZSBwcmVtaWVyIGRvY3VtZW50IGVzdCBnw6luw6lyYWxlbWVudCBub21tw6kgaW5kZXguUm1kIGV0IGMnZXN0IGxlIHNldWwgb8O5IHNlIHRyb3V2ZSBsZSBZQU1MLg0KDQotIERvaXQgw6lnYWxlbWVudCB0cm91dmVyIGRhbnMgbCdlbnTDqnRlOiBzaXRlOiBib29rZG93bjo6Ym9va2Rvd25fc2l0ZSBwb3VyIHF1ZSBybWFya2Rvd24gc2FjaGUgcXUnaWwgZmF1dCB1dGlsaXNlciBib29rZG93biBwb3VyIGNvbnN0cnVpcmUgdG91cyBsZXMgZmljaGllcnMgZXQgcGFzIHNldWxlbWVudCB1biBmaWNoaWVyIHJtZC4NCg0KLSBQbHVzaWV1cnMgZm9ybWF0cyBkZSBvdXRwdXQgcGV1dmVudCDDqnRyZSB1dGlsaXPDqXM6IA0KICAtIGJvb2tkb3duOjpnaXRib29rDQogIC0gYm9va2Rvd246OnBkZl9ib29rDQogIC0gYm9va2Rvd246OndvcmRfZG9jdW1lbnQyDQogIC0gYm9va2Rvd246OmVwdWJfYm9vaw0KDQpDb25zdHJ1aXQgbGVzIGZpY2hpZXIgZW4gYXBwZWxsYW50IGxhIGZvbmN0aW9uIGJvb2tkb3duOjpyZW5kZXJfYm9vaygnaW5kZXguUm1kJykNCg0KLSBbw4ljcmlyZSBzYSB0aMOoc2UgYXZlYyBib29rZG93bl0oaHR0cHM6Ly9lZGRqYmVycnkubmV0bGlmeS5jb20vcG9zdC93cml0aW5nLXlvdXItdGhlc2lzLXdpdGgtYm9va2Rvd24vKQ0KLSBbRXhlbXBsZXMgZGUgc2l0ZXMgd2ViIGF2ZWMgYmxvZ2Rvd25dKGh0dHBzOi8vZ2l0aHViLmNvbS9yYmluZCkNCg0KDQo8c3R5bGU+DQoucmVzdWx0YXQgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQogIGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KPC9zdHlsZT4NCg0KDQp2ZXJiYXRpbSBpbmxpbmUgZXhwcmVzc2lvbg0KDQpgYCBgcg0KMSsxYCBgYA0KDQoNClZlcmJhdGltIGNvZGUgY2h1bmtzDQpgYGBgDQpgYGB7ciwgZXZhbD1UUlVFfWByICcnYA0KMSArIDENCmBgYA0KYGBgYA0KDQoNCmJsb2MgZ3JpcyB0ZXh0ZSBub2lyDQpgYGBtYXJrZG93bg0KIyBUaXRyZSBub24gbnVtw6lyb3TDqSB7LX0NCmBgYA0KYmxvYyBncmlzIHRleHRlIHZlcnQNCmBgYHlhbWwNCiMgVGl0cmUgbm9uIG51bcOpcm90w6kgey19DQpgYGANCmJsb2MgYmxhbmMgdGV4dGUgbm9pcg0KYGBgDQojIFRpdHJlIG5vbiBudW3DqXJvdMOpIHstfQ==