Background
Writing documents in R Markdown is relatively
straightforward once you know some of the
basics. You can create many different formats, including
.pdf
, .html
, and .doc
, and
customize them in a variety of ways.
Templates
There are a number of existing templates available in the rticles
package that you can use for knitting your document to a specific style
in .pdf
format. For .html
formats, there are a
variety of “themes” available
as well. For example, this document was created with the
spacelab
theme.
Open RStudio and from the menu options select File > New
File > R Markdown…
You can change the Title, Author,
and Date, fields here, but we’ll do that later.

Leave the Default Output Format as HTML
and click on OK.
You now have a new .Rmd
file ready for editing, which
includes some placeholder text and code blocks.

Document layout
Front Matter (YAML)
Every Markdown document begins with a section of plain text written
in YAML (“YAML Ain’t
Markup Language”). This block of human readable code is used to define
some of the document’s metadata such as the title, author, and date. It
is also used to specify the document’s format (eg, HTML or pdf) and its
layout (eg, theme, font).
The front matter is defined in a block of text that begins and ends
with 3 dashes ---
.
Here is the YAML for our new simple HTML document:
---
title: "Untitled"
author: "Mark Scheuerell"
date: "7 February 2025"
output: html_document
---
The YAML can include a lot more information as well, including fields
for various pre-defined themes, a table of contents, adding citations
and formatting references, and whether to use other files as formatting
templates. For example, here is the YAML for this document with today’s
class notes:
---
title: "Using R Markdown for reporting"
subtitle: "Part 1"
date: "<br>7 February 2025"
output:
html_document:
theme: spacelab
highlight: textmate
css: ../lecture_inst.css
code_download: true
toc: true
toc_float: true
toc_depth: 3
---
Knitting your file
The process of creating a nicely formatted document (e.g.,
html
, .pdf
) from the raw markdown code in the
.Rmd
file is known as knitting. You can knit a
.Rmd
file from the R command line, but the easiest way in
RStudio is to simply click the Knit button at the top
of the editing pane.
Clicking on the downarrow to the right of the Knit
button brings up some additional options.

Click on the Knit button to render your
.Rmd
file as a .html
file.
Knitting a .Rmd
file automatically saves it. The first
time you click Knit, you will be prompted for the
filename and location where you want to save the file.

You now have a knitted .html
file.
Make some changes
Let’s make some changes to our markdown document and knit them.
Add a title, subtitle, and table of contents (toc) to the YAML.
The indentation and colons in the YAML subfields are necessary.
---
title: "Creating online reports"
subtitle: "A markdown demonstration"
author: "Mark Scheuerell"
date: "10 February 2023"
output:
html_document:
toc: true
toc_float: true
toc_depth: 3
---
Add a level-1 and level-3 header to your document.

Click the Knit button to see your changes.

The table of contents will change as you scroll down through the
sections and float along the left side.

Publishing reports online
Now that we’ve seen how to create an HTML report using R Markdown,
let’s publish a report online so that it can be shared with and viewed
by others.
Create a new repo
Navigate to GitHub and create a new public repo called
markdown-demo
.
Add a README.md
file and an R
.gitignore
file as well (you can skip a license
file).
Click the green Create repository button when
you’re ready.

Click on the Settings button in the upper right.

Click on the Pages button on the left side.

Click on the None button under the
Branch heading and swith it to
main.

Click on the / (root) button under the
Branch heading and swith it to
/docs.

When you’re ready, click on the Save button.

Your repo is now set to use GitHub Pages for displaying HTML
files.

Create an RStudio project
Create a new project in RStudio from the markdown-demo
repo you just created.
Open a new R Markdown document and give it a title. Select the
HTML format and click OK when you’re
done.

Save your new document in a new subfolder within your
markdown-demo
project called docs
with the
filename index.Rmd
.
When you click Save, your markdown document will be
knit automatically.

You should now see a /docs
folder in the RStudio file
pane. Click on it and you will see your index.Rmd
and
index.html
files there.


Commit your changes to the index.Rmd
and
index.html
files.

Push your commit when done.

Viewing your document
Now that we’ve pushed our basic HTML report to GitHub, we should be
able to view it online.
Navigate back your markdown-demo
repo on GitHub and
you’ll see the /docs
folder containing the
index.Rmd
and index.html
files you just
pushed.


If you click on the index.html
file, you’ll notice that
it just displays the raw HTML code rather than a nicely formatted
website.

GitHub cannot render HTML files in a normal repo, but you can view
your new document by navigating to
https://USERNAME.github.io/markdown-demo/
where
USERNAME
is your GitHub username.

You can add a link to your newly rendered document by edited the main
page of your repo.
Click on the small gear icon in the upper right, which will bring up
a window to edit some aspects of your repo.

In the Website field, type or copy/paste the
link to your rendered site, which should be
https://USERNAME.github.io/markdown-demo/
where
USERNAME
is your GitHub username.
Click on the green Save changes button when
you’re done.

Your repo has now been updated to include a direct link to your
properly rendered HTML report.

You can easily share your online report with others by
copying/pasting the link in the About field into a
message, issue, etc.
Updating your report
You now have an online document that you can update by making changes
in your RStudio project and pushing them to GitHub.
Adding information about a document’s version or the date it was last
updated can be helpful to you and others. We’ll see next time how to do so.
Endnote
Now that you have seen how to create HTML reports and display them
online, you’re ready to add more details such as equations, code blocks,
figures, tables, etc.
You can refer to this
primer for some additional information on formatting R Markdown
documents.
LS0tCnRpdGxlOiAiVXNpbmcgUiBNYXJrZG93biBmb3IgcmVwb3J0aW5nIgpzdWJ0aXRsZTogIlBhcnQgMSIKZGF0ZTogIjxicj43IEZlYnJ1YXJ5IDIwMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IHNwYWNlbGFiCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlCiAgICBjc3M6IC4uL2xlY3R1cmVfaW5zdC5jc3MKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpsaWJyYXJ5KG1hZ3JpdHRyKQpgYGAKCioqKgoKIyBCYWNrZ3JvdW5kCgpXcml0aW5nIGRvY3VtZW50cyBpbiAqKlIgTWFya2Rvd24qKiBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCBvbmNlIHlvdSBrbm93IFtzb21lIG9mIHRoZSBiYXNpY3NdKGludHJvX3JtYXJrZG93bi5odG1sKS4gWW91IGNhbiBjcmVhdGUgbWFueSBkaWZmZXJlbnQgZm9ybWF0cywgaW5jbHVkaW5nIGAucGRmYCwgYC5odG1sYCwgYW5kIGAuZG9jYCwgYW5kIGN1c3RvbWl6ZSB0aGVtIGluIGEgdmFyaWV0eSBvZiB3YXlzLgoKCioqKgoKIyBUZW1wbGF0ZXMKClRoZXJlIGFyZSBhIG51bWJlciBvZiBleGlzdGluZyB0ZW1wbGF0ZXMgYXZhaWxhYmxlIGluIHRoZSBbKipydGljbGVzKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL3J0aWNsZXMpIHBhY2thZ2UgdGhhdCB5b3UgY2FuIHVzZSBmb3Iga25pdHRpbmcgeW91ciBkb2N1bWVudCB0byBhIHNwZWNpZmljIHN0eWxlIGluIGAucGRmYCBmb3JtYXQuIEZvciBgLmh0bWxgIGZvcm1hdHMsIHRoZXJlIGFyZSBhIHZhcmlldHkgb2YgInRoZW1lcyIgW2F2YWlsYWJsZSBhcyB3ZWxsXShodHRwczovL3d3dy5kYXRhZHJlYW1pbmcub3JnL3Bvc3Qvci1tYXJrZG93bi10aGVtZS1nYWxsZXJ5LykuIEZvciBleGFtcGxlLCB0aGlzIGRvY3VtZW50IHdhcyBjcmVhdGVkIHdpdGggdGhlIGBzcGFjZWxhYmAgdGhlbWUuCgo6OjogdGFzawoKT3BlbiBSU3R1ZGlvIGFuZCBmcm9tIHRoZSBtZW51IG9wdGlvbnMgc2VsZWN0ICoqRmlsZSA+IE5ldyBGaWxlID4gUiBNYXJrZG93bi4uLioqCgo6OjoKCjo6OiB0aXAKCllvdSBjYW4gY2hhbmdlIHRoZSAqKlRpdGxlKiosICoqQXV0aG9yKiosIGFuZCAqKkRhdGUqKiwgZmllbGRzIGhlcmUsIGJ1dCB3ZSdsbCBkbyB0aGF0IGxhdGVyLgoKOjo6CgohW10oaW1hZ2VzL3JtZF9jcmVhdGVfbmV3LnBuZyl7IHdpZHRoPTcwJSB9Cgo8YnI+Cgo6OjogdGFzawoKTGVhdmUgdGhlICoqRGVmYXVsdCBPdXRwdXQgRm9ybWF0KiogYXMgYEhUTUxgIGFuZCBjbGljayBvbiAqKk9LKiouCgo6OjoKCjo6OiBzdWNjZXNzCgpZb3Ugbm93IGhhdmUgYSBuZXcgYC5SbWRgIGZpbGUgcmVhZHkgZm9yIGVkaXRpbmcsIHdoaWNoIGluY2x1ZGVzIHNvbWUgcGxhY2Vob2xkZXIgdGV4dCBhbmQgY29kZSBibG9ja3MuCgo6OjoKCiFbXShpbWFnZXMvcm1kX2h0bWxfbmV3LnBuZykKCjxicj4KCioqKgoKIyBEb2N1bWVudCBsYXlvdXQKCiMjIEZyb250IE1hdHRlciAoWUFNTCkKCkV2ZXJ5IE1hcmtkb3duIGRvY3VtZW50IGJlZ2lucyB3aXRoIGEgc2VjdGlvbiBvZiBwbGFpbiB0ZXh0IHdyaXR0ZW4gaW4gW1lBTUxdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lBTUwpICgiWUFNTCBBaW4ndCBNYXJrdXAgTGFuZ3VhZ2UiKS4gVGhpcyBibG9jayBvZiBodW1hbiByZWFkYWJsZSBjb2RlIGlzIHVzZWQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlIGRvY3VtZW50J3MgbWV0YWRhdGEgc3VjaCBhcyB0aGUgdGl0bGUsIGF1dGhvciwgYW5kIGRhdGUuIEl0IGlzIGFsc28gdXNlZCB0byBzcGVjaWZ5IHRoZSBkb2N1bWVudCdzIGZvcm1hdCAoZWcsIEhUTUwgb3IgcGRmKSBhbmQgaXRzIGxheW91dCAoZWcsIHRoZW1lLCBmb250KS4KCjo6OiB0aXAKClRoZSBmcm9udCBtYXR0ZXIgaXMgZGVmaW5lZCBpbiBhIGJsb2NrIG9mIHRleHQgdGhhdCBiZWdpbnMgYW5kIGVuZHMgd2l0aCAzIGRhc2hlcyBgLS0tYC4KCjo6OgoKSGVyZSBpcyB0aGUgWUFNTCBmb3Igb3VyIG5ldyBzaW1wbGUgSFRNTCBkb2N1bWVudDoKCmBgYAotLS0KdGl0bGU6ICJVbnRpdGxlZCIKYXV0aG9yOiAiTWFyayBTY2hldWVyZWxsIgpkYXRlOiAiNyBGZWJydWFyeSAyMDI1IgpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCmBgYAoKVGhlIFlBTUwgY2FuIGluY2x1ZGUgYSBsb3QgbW9yZSBpbmZvcm1hdGlvbiBhcyB3ZWxsLCBpbmNsdWRpbmcgZmllbGRzIGZvciB2YXJpb3VzIHByZS1kZWZpbmVkIHRoZW1lcywgYSB0YWJsZSBvZiBjb250ZW50cywgYWRkaW5nIGNpdGF0aW9ucyBhbmQgZm9ybWF0dGluZyByZWZlcmVuY2VzLCBhbmQgd2hldGhlciB0byB1c2Ugb3RoZXIgZmlsZXMgYXMgZm9ybWF0dGluZyB0ZW1wbGF0ZXMuIEZvciBleGFtcGxlLCBoZXJlIGlzIHRoZSBZQU1MIGZvciB0aGlzIGRvY3VtZW50IHdpdGggdG9kYXkncyBjbGFzcyBub3RlczoKCmBgYAotLS0KdGl0bGU6ICJVc2luZyBSIE1hcmtkb3duIGZvciByZXBvcnRpbmciCnN1YnRpdGxlOiAiUGFydCAxIgpkYXRlOiAiPGJyPjcgRmVicnVhcnkgMjAyNSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogc3BhY2VsYWIKICAgIGhpZ2hsaWdodDogdGV4dG1hdGUKICAgIGNzczogLi4vbGVjdHVyZV9pbnN0LmNzcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogMwotLS0KYGBgCgoqKioKCiMgS25pdHRpbmcgeW91ciBmaWxlCgpUaGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhIG5pY2VseSBmb3JtYXR0ZWQgZG9jdW1lbnQgKGUuZy4sIGBodG1sYCwgYC5wZGZgKSBmcm9tIHRoZSByYXcgbWFya2Rvd24gY29kZSBpbiB0aGUgYC5SbWRgIGZpbGUgaXMga25vd24gYXMgX2tuaXR0aW5nXy4gWW91IGNhbiBrbml0IGEgYC5SbWRgIGZpbGUgZnJvbSB0aGUgUiBjb21tYW5kIGxpbmUsIGJ1dCB0aGUgZWFzaWVzdCB3YXkgaW4gUlN0dWRpbyBpcyB0byBzaW1wbHkgY2xpY2sgdGhlICoqS25pdCoqIGJ1dHRvbiBhdCB0aGUgdG9wIG9mIHRoZSBlZGl0aW5nIHBhbmUuCgo6OjogdGlwCgpDbGlja2luZyBvbiB0aGUgZG93bmFycm93IHRvIHRoZSByaWdodCBvZiB0aGUgKipLbml0KiogYnV0dG9uIGJyaW5ncyB1cCBzb21lIGFkZGl0aW9uYWwgb3B0aW9ucy4KCjo6OgoKIVtdKGltYWdlcy9ybWRfa25pdF9vcHRpb25zLnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKipLbml0KiogYnV0dG9uIHRvIHJlbmRlciB5b3VyIGAuUm1kYCBmaWxlIGFzIGEgYC5odG1sYCBmaWxlLgoKOjo6Cgo6Ojogbm90ZQoKS25pdHRpbmcgYSBgLlJtZGAgZmlsZSBhdXRvbWF0aWNhbGx5IHNhdmVzIGl0LiBUaGUgZmlyc3QgdGltZSB5b3UgY2xpY2sgKipLbml0KiosIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciB0aGUgZmlsZW5hbWUgYW5kIGxvY2F0aW9uIHdoZXJlIHlvdSB3YW50IHRvIHNhdmUgdGhlIGZpbGUuCgo6OjoKCjxpbWcgc3JjPSJpbWFnZXMvcm1kX2h0bWxfa25pdHRlZF8xLnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCjo6OiBzdWNjZXNzCgpZb3Ugbm93IGhhdmUgYSBrbml0dGVkIGAuaHRtbGAgZmlsZS4KCjo6OgoKIyMgTWFrZSBzb21lIGNoYW5nZXMKCkxldCdzIG1ha2Ugc29tZSBjaGFuZ2VzIHRvIG91ciBtYXJrZG93biBkb2N1bWVudCBhbmQga25pdCB0aGVtLgoKOjo6IHRhc2sKCkFkZCBhIHRpdGxlLCBzdWJ0aXRsZSwgYW5kIHRhYmxlIG9mIGNvbnRlbnRzICh0b2MpIHRvIHRoZSBZQU1MLgoKOjo6Cgo6Ojogbm90ZQoKVGhlIGluZGVudGF0aW9uIGFuZCBjb2xvbnMgaW4gdGhlIFlBTUwgc3ViZmllbGRzIGFyZSBuZWNlc3NhcnkuCgo6OjoKCmBgYAotLS0KdGl0bGU6ICJDcmVhdGluZyBvbmxpbmUgcmVwb3J0cyIKc3VidGl0bGU6ICJBIG1hcmtkb3duIGRlbW9uc3RyYXRpb24iCmF1dGhvcjogIk1hcmsgU2NoZXVlcmVsbCIKZGF0ZTogIjEwIEZlYnJ1YXJ5IDIwMjMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogMwotLS0KYGBgCgo6OjogdGFzawoKQWRkIGEgbGV2ZWwtMSBhbmQgbGV2ZWwtMyBoZWFkZXIgdG8geW91ciBkb2N1bWVudC4KCjo6OgoKIVtdKGltYWdlcy9ybWRfaHRtbF9lZGl0ZWQucG5nKQoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIHRoZSAqKktuaXQqKiBidXR0b24gdG8gc2VlIHlvdXIgY2hhbmdlcy4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9ybWRfaHRtbF9rbml0dGVkXzIucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKOjo6IHRpcAoKVGhlIHRhYmxlIG9mIGNvbnRlbnRzIHdpbGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgZG93biB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgZmxvYXQgYWxvbmcgdGhlIGxlZnQgc2lkZS4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9ybWRfaHRtbF90b2Nfc2Nyb2xsLnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCgoqKioKCiMgUHVibGlzaGluZyByZXBvcnRzIG9ubGluZQoKTm93IHRoYXQgd2UndmUgc2VlbiBob3cgdG8gY3JlYXRlIGFuIEhUTUwgcmVwb3J0IHVzaW5nIFIgTWFya2Rvd24sIGxldCdzIHB1Ymxpc2ggYSByZXBvcnQgb25saW5lIHNvIHRoYXQgaXQgY2FuIGJlIHNoYXJlZCB3aXRoIGFuZCB2aWV3ZWQgYnkgb3RoZXJzLgoKIyMgQ3JlYXRlIGEgbmV3IHJlcG8KCjo6OiB0YXNrCgoqIE5hdmlnYXRlIHRvIEdpdEh1YiBhbmQgY3JlYXRlIGEgbmV3IF9wdWJsaWNfIHJlcG8gY2FsbGVkIGBtYXJrZG93bi1kZW1vYC4KCiogQWRkIGEgYFJFQURNRS5tZGAgZmlsZSBhbmQgYW4gUiBgLmdpdGlnbm9yZWAgZmlsZSBhcyB3ZWxsICh5b3UgY2FuIHNraXAgYSBsaWNlbnNlIGZpbGUpLgoKKiBDbGljayB0aGUgZ3JlZW4gKipDcmVhdGUgcmVwb3NpdG9yeSoqIGJ1dHRvbiB3aGVuIHlvdSdyZSByZWFkeS4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9naF9uZXdfZGVtb19yZXBvLnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKipTZXR0aW5ncyoqIGJ1dHRvbiBpbiB0aGUgdXBwZXIgcmlnaHQuCgo6OjoKCjxpbWcgc3JjPSJpbWFnZXMvZ2hfbmV3X3JlcG9faG9tZS5wbmciIGNsYXNzPSJub2JvcmRlciI+Cgo6OjogdGFzawoKQ2xpY2sgb24gdGhlICoqUGFnZXMqKiBidXR0b24gb24gdGhlIGxlZnQgc2lkZS4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9naF9uZXdfcmVwb19zZXR0aW5ncy5wbmciIGNsYXNzPSJub2JvcmRlciI+Cgo6OjogdGFzawoKQ2xpY2sgb24gdGhlICoqTm9uZSoqIGJ1dHRvbiB1bmRlciB0aGUgKipCcmFuY2gqKiBoZWFkaW5nIGFuZCBzd2l0aCBpdCB0byAqKm1haW4qKi4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9naF9uZXdfcmVwb19wYWdlc19icmFuY2gucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSAqKi8gKHJvb3QpKiogYnV0dG9uIHVuZGVyIHRoZSAqKkJyYW5jaCoqIGhlYWRpbmcgYW5kIHN3aXRoIGl0IHRvICoqL2RvY3MqKi4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9naF9uZXdfcmVwb19wYWdlc19mb2xkZXIucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKOjo6IHRhc2sKCldoZW4geW91J3JlIHJlYWR5LCBjbGljayBvbiB0aGUgKipTYXZlKiogYnV0dG9uLgoKOjo6Cgo8aW1nIHNyYz0iaW1hZ2VzL2doX25ld19yZXBvX3BhZ2VzX3NldC5wbmciIGNsYXNzPSJub2JvcmRlciI+Cgo6Ojogc3VjY2VzcwoKWW91ciByZXBvIGlzIG5vdyBzZXQgdG8gdXNlIEdpdEh1YiBQYWdlcyBmb3IgZGlzcGxheWluZyBIVE1MIGZpbGVzLgoKOjo6Cgo8aW1nIHNyYz0iaW1hZ2VzL2doX25ld19yZXBvX3BhZ2VzX2RvbmUucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKCiMjIENyZWF0ZSBhbiBSU3R1ZGlvIHByb2plY3QKCjo6OiB0YXNrCgpDcmVhdGUgYSBuZXcgcHJvamVjdCBpbiBSU3R1ZGlvIGZyb20gdGhlIGBtYXJrZG93bi1kZW1vYCByZXBvIHlvdSBqdXN0IGNyZWF0ZWQuCgo6OjoKCjo6OiB0YXNrCgpPcGVuIGEgbmV3IFIgTWFya2Rvd24gZG9jdW1lbnQgYW5kIGdpdmUgaXQgYSB0aXRsZS4gU2VsZWN0IHRoZSAqKkhUTUwqKiBmb3JtYXQgYW5kIGNsaWNrICoqT0sqKiB3aGVuIHlvdSdyZSBkb25lLgoKOjo6CgohW10oaW1hZ2VzL3JtZF9odG1sX2RvY19uZXcucG5nKXsgd2lkdGg9NzAlIH0KCjo6OiB0YXNrCgpTYXZlIHlvdXIgbmV3IGRvY3VtZW50IGluIGEgbmV3IHN1YmZvbGRlciB3aXRoaW4geW91ciBgbWFya2Rvd24tZGVtb2AgcHJvamVjdCBjYWxsZWQgYGRvY3NgIHdpdGggdGhlIGZpbGVuYW1lIGBpbmRleC5SbWRgLgoKOjo6Cgo6OjogdGlwCgpXaGVuIHlvdSBjbGljayAqKlNhdmUqKiwgeW91ciBtYXJrZG93biBkb2N1bWVudCB3aWxsIGJlIGtuaXQgYXV0b21hdGljYWxseS4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9ybWRfaHRtbF9kb2Nfc2F2ZS5wbmciIGNsYXNzPSJub2JvcmRlciI+CgoKOjo6IG5vdGUKCllvdSBzaG91bGQgbm93IHNlZSBhIGAvZG9jc2AgZm9sZGVyIGluIHRoZSBSU3R1ZGlvIGZpbGUgcGFuZS4gQ2xpY2sgb24gaXQgYW5kIHlvdSB3aWxsIHNlZSB5b3VyIGBpbmRleC5SbWRgIGFuZCBgaW5kZXguaHRtbGAgZmlsZXMgdGhlcmUuIAoKOjo6CgohW10oaW1hZ2VzL3JtZF9odG1sX2luZGV4XzEucG5nKXsgd2lkdGg9NzAlIH0KCiFbXShpbWFnZXMvcm1kX2h0bWxfaW5kZXhfMi5wbmcpeyB3aWR0aD03MCUgfQoKOjo6IHRhc2sKCkNvbW1pdCB5b3VyIGNoYW5nZXMgdG8gdGhlIGBpbmRleC5SbWRgIGFuZCBgaW5kZXguaHRtbGAgZmlsZXMuCgo6OjoKCjxpbWcgc3JjPSJpbWFnZXMvcm1kX2h0bWxfaW5kZXhfY29tbWl0LnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCjo6OiB0YXNrCgpQdXNoIHlvdXIgY29tbWl0IHdoZW4gZG9uZS4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9ybWRfaHRtbF9pbmRleF9wdXNoLnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCgojIyBWaWV3aW5nIHlvdXIgZG9jdW1lbnQKCk5vdyB0aGF0IHdlJ3ZlIHB1c2hlZCBvdXIgYmFzaWMgSFRNTCByZXBvcnQgdG8gR2l0SHViLCB3ZSBzaG91bGQgYmUgYWJsZSB0byB2aWV3IGl0IG9ubGluZS4KCjo6OiB0YXNrCgpOYXZpZ2F0ZSBiYWNrIHlvdXIgYG1hcmtkb3duLWRlbW9gIHJlcG8gb24gR2l0SHViIGFuZCB5b3UnbGwgc2VlIHRoZSBgL2RvY3NgIGZvbGRlciBjb250YWluaW5nIHRoZSBgaW5kZXguUm1kYCBhbmQgYGluZGV4Lmh0bWxgIGZpbGVzIHlvdSBqdXN0IHB1c2hlZC4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9naF9yZXBvX3VwZGF0ZWQucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKCjxpbWcgc3JjPSJpbWFnZXMvZ2hfcmVwb19kb2NzLnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCgo6Ojogbm90ZQoKSWYgeW91IGNsaWNrIG9uIHRoZSBgaW5kZXguaHRtbGAgZmlsZSwgeW91J2xsIG5vdGljZSB0aGF0IGl0IGp1c3QgZGlzcGxheXMgdGhlIHJhdyBIVE1MIGNvZGUgcmF0aGVyIHRoYW4gYSBuaWNlbHkgZm9ybWF0dGVkIHdlYnNpdGUuCgo6OjoKCjxpbWcgc3JjPSJpbWFnZXMvZ2hfcmVwb19kb2NzX2luZGV4LnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCgo6OjogdGlwCgpHaXRIdWIgY2Fubm90IHJlbmRlciBIVE1MIGZpbGVzIGluIGEgbm9ybWFsIHJlcG8sIGJ1dCB5b3UgY2FuIHZpZXcgeW91ciBuZXcgZG9jdW1lbnQgYnkgbmF2aWdhdGluZyB0byBgaHR0cHM6Ly9VU0VSTkFNRS5naXRodWIuaW8vbWFya2Rvd24tZGVtby9gIHdoZXJlIGBVU0VSTkFNRWAgaXMgeW91ciBHaXRIdWIgdXNlcm5hbWUuCgo6OjoKCjxpbWcgc3JjPSJpbWFnZXMvZ2hfcGFnZXNfcmVuZGVyZWQucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKCjo6OiB0aXAKCllvdSBjYW4gYWRkIGEgbGluayB0byB5b3VyIG5ld2x5IHJlbmRlcmVkIGRvY3VtZW50IGJ5IGVkaXRlZCB0aGUgbWFpbiBwYWdlIG9mIHlvdXIgcmVwby4KCjo6OgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSBzbWFsbCBnZWFyIGljb24gaW4gdGhlIHVwcGVyIHJpZ2h0LCB3aGljaCB3aWxsIGJyaW5nIHVwIGEgd2luZG93IHRvIGVkaXQgc29tZSBhc3BlY3RzIG9mIHlvdXIgcmVwby4KCjo6OgoKPGltZyBzcmM9ImltYWdlcy9naF9yZXBvX3BhZ2VzX2xpbmsucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKCjo6OiB0YXNrCgoqIEluIHRoZSAqKldlYnNpdGUqKiBmaWVsZCwgdHlwZSBvciBjb3B5L3Bhc3RlIHRoZSBsaW5rIHRvIHlvdXIgcmVuZGVyZWQgc2l0ZSwgd2hpY2ggc2hvdWxkIGJlIGBodHRwczovL1VTRVJOQU1FLmdpdGh1Yi5pby9tYXJrZG93bi1kZW1vL2Agd2hlcmUgYFVTRVJOQU1FYCBpcyB5b3VyIEdpdEh1YiB1c2VybmFtZS4gCgoqIENsaWNrIG9uIHRoZSBncmVlbiAqKlNhdmUgY2hhbmdlcyoqIGJ1dHRvbiB3aGVuIHlvdSdyZSBkb25lLgoKOjo6Cgo8aW1nIHNyYz0iaW1hZ2VzL2doX3BhZ2VzX2FkZF9saW5rLnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCgo6Ojogc3VjY2VzcwoKWW91ciByZXBvIGhhcyBub3cgYmVlbiB1cGRhdGVkIHRvIGluY2x1ZGUgYSBkaXJlY3QgbGluayB0byB5b3VyIHByb3Blcmx5IHJlbmRlcmVkIEhUTUwgcmVwb3J0LgoKOjo6Cgo8aW1nIHNyYz0iaW1hZ2VzL2doX3JlcG9fd2l0aF9saW5rLnBuZyIgY2xhc3M9Im5vYm9yZGVyIj4KCjo6OiB0aXAKCllvdSBjYW4gZWFzaWx5IHNoYXJlIHlvdXIgb25saW5lIHJlcG9ydCB3aXRoIG90aGVycyBieSBjb3B5aW5nL3Bhc3RpbmcgdGhlIGxpbmsgaW4gdGhlICoqQWJvdXQqKiBmaWVsZCBpbnRvIGEgbWVzc2FnZSwgaXNzdWUsIGV0Yy4KCjo6OgoKPGJyPgoKIyMgVXBkYXRpbmcgeW91ciByZXBvcnQKCllvdSBub3cgaGF2ZSBhbiBvbmxpbmUgZG9jdW1lbnQgdGhhdCB5b3UgY2FuIHVwZGF0ZSBieSBtYWtpbmcgY2hhbmdlcyBpbiB5b3VyIFJTdHVkaW8gcHJvamVjdCBhbmQgcHVzaGluZyB0aGVtIHRvIEdpdEh1Yi4KCjo6OiB0aXAKCkFkZGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGRvY3VtZW50J3MgdmVyc2lvbiBvciB0aGUgZGF0ZSBpdCB3YXMgbGFzdCB1cGRhdGVkIGNhbiBiZSBoZWxwZnVsIHRvIHlvdSBhbmQgb3RoZXJzLiBXZSdsbCBzZWUgW25leHQgdGltZV0obGVjXzIxX21hcmtkb3duXzIuaHRtbCkgaG93IHRvIGRvIHNvLgoKOjo6Cgo8YnI+CgoqKioKCiMgRW5kbm90ZQoKTm93IHRoYXQgeW91IGhhdmUgc2VlbiBob3cgdG8gY3JlYXRlIEhUTUwgcmVwb3J0cyBhbmQgZGlzcGxheSB0aGVtIG9ubGluZSwgeW91J3JlIHJlYWR5IHRvIGFkZCBtb3JlIGRldGFpbHMgc3VjaCBhcyBlcXVhdGlvbnMsIGNvZGUgYmxvY2tzLCBmaWd1cmVzLCB0YWJsZXMsIGV0Yy4KCjo6OiB0aXAKCllvdSBjYW4gcmVmZXIgdG8gW3RoaXMgcHJpbWVyXShodHRwczovL2Zpc2g1NDkuZ2l0aHViLmlvL3dlYnNpdGUvbGVjdHVyZXMvd2Vla18wNy9pbnRyb19ybWFya2Rvd24uaHRtbCkgZm9yIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBmb3JtYXR0aW5nIFIgTWFya2Rvd24gZG9jdW1lbnRzLgoKOjo6Cgo=