R Markdown
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
speed dist
Min. : 4.0 Min. : 2.00
1st Qu.:12.0 1st Qu.: 26.00
Median :15.0 Median : 36.00
Mean :15.4 Mean : 42.98
3rd Qu.:19.0 3rd Qu.: 56.00
Max. :25.0 Max. :120.00
Including Plots
You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.
Add other types of code with engine
By default, your R notebook chunks will be run using R. However, it’s entirely possible to write chunks that use other engines to execute. For instance, you can add some Python to your notebook:
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print "iteration {iteration} is {name}".format(
iteration=i, name=name)
iteration 0 is john
iteration 1 is pat
iteration 2 is gary
iteration 3 is michael
In-line Latex and R code
You can convert the temperature unit from Kelvin to Celsius with the formula
\[ celsius = kelvin - 273.15 \] And you can convert the result to Fahrenheit with the formula
\[ fahrenheit = celsius \times \frac{9}{5} + 32 \]
For example, degrees Kelvin corresponds to 9 degrees Celsius.
Interactive Visualizations
We can use interactive features as well. Let’s load the required packages first.
Running Code
One of the goals of the notebook is to provide a seamless environment for interacting with R – that is, you shouldn’t need to reach for the console, even though chunks send code there. To help you see the progress of your chunk – that is, which lines have been executed and which haven’t – RStudio draws an indicator in the editor gutter. Try running this chunk:
Sys.sleep(1); runif(3)
[1] 0.7399626 0.7790429 0.8551949
Sys.sleep(1); runif(3)
[1] 0.29324634 0.32891347 0.01884332
Sys.sleep(1); runif(3)
[1] 0.5860527 0.2822213 0.1575996
Sys.sleep(1); runif(3)
[1] 0.8117402 0.1428229 0.7061565
Sys.sleep(1); runif(3)
[1] 0.3989030 0.3417667 0.9820461
Stepwise Execution
Sometimes you may want to run portions of your chunk rather than the whole thing. That’s just fine too. Try using Ctrl+Enter (OS X: Cmd+Enter) to run this chunk line by line.
cities <- read.csv("cities.csv")
cities
leaflet(cities) %>%
addTiles() %>%
addCircles(lng = ~Long, lat = ~Lat, weight = 1,
radius = ~sqrt(Pop) * 30, popup = ~City)
Errors
Sometimes your code will generate errors. Here’s an example:
# Source a file that doesn't exist
source("missing.R")
cannot open file 'missing.R': No such file or directoryError in file(filename, "r", encoding = encoding) :
cannot open the connection
Notice that the line that caused the error is highlighted, and you can see the error’s traceback, just as you can in the RStudio console. If an error occurs while you’re running chunks, the error will cause the notebook to stop running, and the cursor will scroll to the point where the error occurred.
R Notebooks
This file is a R Notebook. It is a great way to share your analysis with others because it contains both the html output as well as the .Rmd file with the script to generate that output.
Saving and Sharing
A notebook’s source code is always in an .Rmd file. Whenever you save it, a sidecar .nb.html file is generated. This file contains a rendered copy of the notebook itself. No special viewer is required.
It also contains a copy of the notebook’s source .Rmd file.
To look at the .nb.html file, click Preview in the RStudio editor toolbar. This is a fundamental difference between notebooks and other R Markdown documents; pressing this button doesn’t actually cause any of your code to run, it just shows you the HTML file already prepared. It will automatically update whenever you save the .Rmd file.
If you open the .nb.html file in a web browser, you’ll see an option to download the source. You can also open an .nb.html file in RStudio; when you do this, RStudio will automatically extract the .Rmd file and outputs inside it and open the file in the notebook editor.
Notebooks as R Markdown Documents
A notebook is also an R Markdown document. Try changing the YAML header in this document so that html_document is the first option, then clicking Knit (or just pulling down the Preview) menu. You could also create a PDF from the notebook, a Word document, or even a dashboard.
Publishing
The notebook output is a html file with is easily shareable and can be open in any modern browser - so no R Studio required on the receiving end. R Studio also offers a service called RPubs which let’s you publish documents (and shiny apps) so you can share them with others via a link.
To do so, click the publish button in RStudio and enter a few things (like title and description) to publish the document (and make it publicly available). You need to sign up for RPubs beforehand to be able to do this quickly.
Specify knitr and pandoc options
Each R Markdown output template is a collection of knitr and pandoc options. You can customize your output by overwriting the default options that come with the template.
For example, the YAML header below overwrites the default code highlight style of the pdf_document template to create a document that uses the zenburn style:
---
title: "Demo"
output:
pdf_document:
highlight: zenburn
---
The YAML header below overwrites the default bootstrap CSS theme of the html_document template.
---
title: "Demo"
output:
html_document:
theme: spacelab
---
Brand your reports with style sheets
Above, I discussed a way to change the CSS style of your HTML output: you can set the theme option of html_document to one of default, cerulean, journal, flatly, readable, spacelab, united, or cosmo. (Try it out).
But what if you want to customize your CSS in more specific ways? You can do this by writing a .css file for your report and saving it in the same directory as the .Rmd file. To have your report use the CSS, set the css option of html_document to the file name, like this
Custom CSS is an easy way to add branding to your reports. The exercise folder contains a file called faded.css. Try out to change the appearance of your html output.
LS0tCnRpdGxlOiAiRXhhbXBsZSBSZXBvcnQiCmF1dGhvcjogIlRob21hcyBCcmFtYm9yIgpkYXRlOiAnMjAxOC0wOS0xNycKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBoaWdobGlnaHQ6IHRleHRtYXRlCiAgICB0aGVtZTogc3BhY2VsYWIKICAgIHRvYzogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKYWx3YXlzX2FsbG93X2h0bWw6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgUiBNYXJrZG93bgoKVGhpcyBpcyBhbiBSIE1hcmtkb3duIGRvY3VtZW50LiBNYXJrZG93biBpcyBhIHNpbXBsZSBmb3JtYXR0aW5nIHN5bnRheCBmb3IgYXV0aG9yaW5nIEhUTUwsIFBERiwgYW5kIE1TIFdvcmQgZG9jdW1lbnRzLiBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIFIgTWFya2Rvd24gc2VlIDxodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tPi4KCldoZW4geW91IGNsaWNrIHRoZSAqKktuaXQqKiBidXR0b24gYSBkb2N1bWVudCB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGluY2x1ZGVzIGJvdGggY29udGVudCBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgb2YgYW55IGVtYmVkZGVkIFIgY29kZSBjaHVua3Mgd2l0aGluIHRoZSBkb2N1bWVudC4gWW91IGNhbiBlbWJlZCBhbiBSIGNvZGUgY2h1bmsgbGlrZSB0aGlzOgoKYGBge3J9CnN1bW1hcnkoY2FycykKYGBgCgojIyBJbmNsdWRpbmcgUGxvdHMKCllvdSBjYW4gYWxzbyBlbWJlZCBwbG90cywgZm9yIGV4YW1wbGU6CgpgYGB7ciwgZWNobz1GQUxTRX0KcGxvdChwcmVzc3VyZSkKYGBgCgpOb3RlIHRoYXQgdGhlIGBlY2hvID0gRkFMU0VgIHBhcmFtZXRlciB3YXMgYWRkZWQgdG8gdGhlIGNvZGUgY2h1bmsgdG8gcHJldmVudCBwcmludGluZyBvZiB0aGUgUiBjb2RlIHRoYXQgZ2VuZXJhdGVkIHRoZSBwbG90LgoKIyMgQWRkIG90aGVyIHR5cGVzIG9mIGNvZGUgd2l0aCBgZW5naW5lYAoKQnkgZGVmYXVsdCwgeW91ciBSIG5vdGVib29rIGNodW5rcyB3aWxsIGJlIHJ1biB1c2luZyBSLiBIb3dldmVyLCBpdCdzIGVudGlyZWx5IHBvc3NpYmxlIHRvIHdyaXRlIGNodW5rcyB0aGF0IHVzZSBvdGhlciBlbmdpbmVzIHRvIGV4ZWN1dGUuIEZvciBpbnN0YW5jZSwgeW91IGNhbiBhZGQgc29tZSBQeXRob24gdG8geW91ciBub3RlYm9vazoKCmBgYHtyIGV2YWw9VFJVRSwgZW5naW5lPSdweXRob24nfQpmcmllbmRzID0gWydqb2huJywgJ3BhdCcsICdnYXJ5JywgJ21pY2hhZWwnXQpmb3IgaSwgbmFtZSBpbiBlbnVtZXJhdGUoZnJpZW5kcyk6CiAgICBwcmludCAiaXRlcmF0aW9uIHtpdGVyYXRpb259IGlzIHtuYW1lfSIuZm9ybWF0KCAKICAgIGl0ZXJhdGlvbj1pLCBuYW1lPW5hbWUpCmBgYAoKIyMgSW4tbGluZSBMYXRleCBhbmQgUiBjb2RlCgpZb3UgY2FuIGNvbnZlcnQgdGhlIHRlbXBlcmF0dXJlIHVuaXQgZnJvbSBLZWx2aW4gdG8gQ2Vsc2l1cyB3aXRoIHRoZSBmb3JtdWxhCgokJCBjZWxzaXVzID0ga2VsdmluIC0gMjczLjE1ICQkCkFuZCB5b3UgY2FuIGNvbnZlcnQgdGhlIHJlc3VsdCB0byBGYWhyZW5oZWl0IHdpdGggdGhlIGZvcm11bGEgCgokJCBmYWhyZW5oZWl0ID0gY2Vsc2l1cyBcdGltZXMgXGZyYWN7OX17NX0gKyAzMiAkJAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30KZXhhbXBsZV9rZWx2aW4gPC0gMjgyLjE1CmBgYAoKRm9yIGV4YW1wbGUsIGRlZ3JlZXMgS2VsdmluIGNvcnJlc3BvbmRzIHRvIGByIGV4YW1wbGVfa2VsdmluIC0gMjczLjE1YCBkZWdyZWVzIENlbHNpdXMuCgojIyBJbnRlcmFjdGl2ZSBWaXN1YWxpemF0aW9ucwoKV2UgY2FuIHVzZSBpbnRlcmFjdGl2ZSBmZWF0dXJlcyBhcyB3ZWxsLiBMZXQncyBsb2FkIHRoZSByZXF1aXJlZCBwYWNrYWdlcyBmaXJzdC4gCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGR5Z3JhcGhzKQpsaWJyYXJ5KGxlYWZsZXQpCmBgYAoKIyMjIEhUTUwgV2lkZ2V0cwoKSWYgeW91ciBSIGFuYWx5c2lzIGludm9sdmVzIGludGVyYWN0aXZlIGNvbXBvbmVudHMsIHlvdSdyZSBwcm9iYWJseSBhbHJlYWR5IGZhbWlsaWFyIHdpdGggdGhlIGBodG1sd2lkZ2V0c2AgbGlicmFyeS4gVGhlc2UsIHRvbywgYXJlIHN1cHBvcnRlZCBpbiB0aGUgbm90ZWJvb2suIFJ1biB0aGlzIGNodW5rIHRvIHNlZSBhbiBpbnRlcmFjdGl2ZSBncmFwaDoKCmBgYHtyfQpkeWdyYXBoKG5odGVtcCwgbWFpbiA9ICJOZXcgSGF2ZW4gVGVtcGVyYXR1cmVzIikgJT4lIAogIGR5UmFuZ2VTZWxlY3RvcihkYXRlV2luZG93ID0gYygiMTkyMC0wMS0wMSIsICIxOTYwLTAxLTAxIikpCmBgYAoKIyMgUnVubmluZyBDb2RlCgpPbmUgb2YgdGhlIGdvYWxzIG9mIHRoZSBub3RlYm9vayBpcyB0byBwcm92aWRlIGEgc2VhbWxlc3MgZW52aXJvbm1lbnQgZm9yIGludGVyYWN0aW5nIHdpdGggUiAtLSB0aGF0IGlzLCB5b3Ugc2hvdWxkbid0IG5lZWQgdG8gcmVhY2ggZm9yIHRoZSBjb25zb2xlLCBldmVuIHRob3VnaCBjaHVua3Mgc2VuZCBjb2RlIHRoZXJlLiBUbyBoZWxwIHlvdSBzZWUgdGhlIHByb2dyZXNzIG9mIHlvdXIgY2h1bmsgLS0gdGhhdCBpcywgd2hpY2ggbGluZXMgaGF2ZSBiZWVuIGV4ZWN1dGVkIGFuZCB3aGljaCBoYXZlbid0IC0tIFJTdHVkaW8gZHJhd3MgYW4gaW5kaWNhdG9yIGluIHRoZSBlZGl0b3IgZ3V0dGVyLiBUcnkgcnVubmluZyB0aGlzIGNodW5rOgoKYGBge3IsIGVjaG89VFJVRX0KU3lzLnNsZWVwKDEpOyBydW5pZigzKQpTeXMuc2xlZXAoMSk7IHJ1bmlmKDMpClN5cy5zbGVlcCgxKTsgcnVuaWYoMykKU3lzLnNsZWVwKDEpOyBydW5pZigzKQpTeXMuc2xlZXAoMSk7IHJ1bmlmKDMpCmBgYAoKIyMjIFN0ZXB3aXNlIEV4ZWN1dGlvbgoKU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBydW4gcG9ydGlvbnMgb2YgeW91ciBjaHVuayByYXRoZXIgdGhhbiB0aGUgd2hvbGUgdGhpbmcuIFRoYXQncyBqdXN0IGZpbmUgdG9vLiBUcnkgdXNpbmcgKkN0cmwrRW50ZXIqIChPUyBYOiAqQ21kK0VudGVyKikgdG8gcnVuIHRoaXMgY2h1bmsgbGluZSBieSBsaW5lLgoKYGBge3IgbGluZXdpc2V9CmNpdGllcyA8LSByZWFkLmNzdigiY2l0aWVzLmNzdiIpCmNpdGllcwpsZWFmbGV0KGNpdGllcykgJT4lIAogIGFkZFRpbGVzKCkgJT4lCiAgYWRkQ2lyY2xlcyhsbmcgPSB+TG9uZywgbGF0ID0gfkxhdCwgd2VpZ2h0ID0gMSwKICAgIHJhZGl1cyA9IH5zcXJ0KFBvcCkgKiAzMCwgcG9wdXAgPSB+Q2l0eSkKYGBgCgojIyMgRXJyb3JzCgpTb21ldGltZXMgeW91ciBjb2RlIHdpbGwgZ2VuZXJhdGUgZXJyb3JzLiBIZXJlJ3MgYW4gZXhhbXBsZToKCmBgYHtyIGVycm9ycywgZXJyb3I9VFJVRX0KIyBTb3VyY2UgYSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdApzb3VyY2UoIm1pc3NpbmcuUiIpCmBgYAoKTm90aWNlIHRoYXQgdGhlIGxpbmUgdGhhdCBjYXVzZWQgdGhlIGVycm9yIGlzIGhpZ2hsaWdodGVkLCBhbmQgeW91IGNhbiBzZWUgdGhlIGVycm9yJ3MgdHJhY2ViYWNrLCBqdXN0IGFzIHlvdSBjYW4gaW4gdGhlIFJTdHVkaW8gY29uc29sZS4gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHlvdSdyZSBydW5uaW5nIGNodW5rcywgdGhlIGVycm9yIHdpbGwgY2F1c2UgdGhlIG5vdGVib29rIHRvIHN0b3AgcnVubmluZywgYW5kIHRoZSBjdXJzb3Igd2lsbCBzY3JvbGwgdG8gdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KCiMjIFIgTm90ZWJvb2tzCgpUaGlzIGZpbGUgaXMgYSBbUiBOb3RlYm9va10oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9yX25vdGVib29rcy5odG1sKS4gSXQgaXMgYSBncmVhdCB3YXkgdG8gc2hhcmUgeW91ciBhbmFseXNpcyB3aXRoIG90aGVycyBiZWNhdXNlIGl0IGNvbnRhaW5zIGJvdGggdGhlIGh0bWwgb3V0cHV0IGFzIHdlbGwgYXMgdGhlIC5SbWQgZmlsZSB3aXRoIHRoZSBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhhdCBvdXRwdXQuCgojIyMgU2F2aW5nIGFuZCBTaGFyaW5nCgpBIG5vdGVib29rJ3Mgc291cmNlIGNvZGUgaXMgYWx3YXlzIGluIGFuIGAuUm1kYCBmaWxlLiBXaGVuZXZlciB5b3Ugc2F2ZSBpdCwgYSBzaWRlY2FyIGAubmIuaHRtbGAgZmlsZSBpcyBnZW5lcmF0ZWQuIFRoaXMgZmlsZSBjb250YWlucyBhIHJlbmRlcmVkIGNvcHkgb2YgdGhlIG5vdGVib29rIGl0c2VsZi4gTm8gc3BlY2lhbCB2aWV3ZXIgaXMgcmVxdWlyZWQuCgpJdCBhbHNvIGNvbnRhaW5zIGEgY29weSBvZiB0aGUgbm90ZWJvb2sncyBzb3VyY2UgYC5SbWRgIGZpbGUuCgpUbyBsb29rIGF0IHRoZSBgLm5iLmh0bWxgIGZpbGUsIGNsaWNrICpQcmV2aWV3KiBpbiB0aGUgUlN0dWRpbyBlZGl0b3IgdG9vbGJhci4gVGhpcyBpcyBhIGZ1bmRhbWVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiBub3RlYm9va3MgYW5kIG90aGVyIFIgTWFya2Rvd24gZG9jdW1lbnRzOyBwcmVzc2luZyB0aGlzIGJ1dHRvbiBkb2Vzbid0IGFjdHVhbGx5IGNhdXNlIGFueSBvZiB5b3VyIGNvZGUgdG8gcnVuLCBpdCBqdXN0IHNob3dzIHlvdSB0aGUgSFRNTCBmaWxlIGFscmVhZHkgcHJlcGFyZWQuIEl0IHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgd2hlbmV2ZXIgeW91IHNhdmUgdGhlIGAuUm1kYCBmaWxlLgoKSWYgeW91IG9wZW4gdGhlIGAubmIuaHRtbGAgZmlsZSBpbiBhIHdlYiBicm93c2VyLCB5b3UnbGwgc2VlIGFuIG9wdGlvbiB0byBkb3dubG9hZCB0aGUgc291cmNlLiBZb3UgY2FuIGFsc28gb3BlbiBhbiBgLm5iLmh0bWxgIGZpbGUgaW4gUlN0dWRpbzsgd2hlbiB5b3UgZG8gdGhpcywgUlN0dWRpbyB3aWxsIGF1dG9tYXRpY2FsbHkgZXh0cmFjdCB0aGUgYC5SbWRgIGZpbGUgYW5kIG91dHB1dHMgaW5zaWRlIGl0IGFuZCBvcGVuIHRoZSBmaWxlIGluIHRoZSBub3RlYm9vayBlZGl0b3IuCgojIyMgTm90ZWJvb2tzIGFzIFIgTWFya2Rvd24gRG9jdW1lbnRzCgpBIG5vdGVib29rIGlzIGFsc28gYW4gUiBNYXJrZG93biBkb2N1bWVudC4gVHJ5IGNoYW5naW5nIHRoZSBZQU1MIGhlYWRlciBpbiB0aGlzIGRvY3VtZW50IHNvIHRoYXQgYGh0bWxfZG9jdW1lbnRgIGlzIHRoZSBmaXJzdCBvcHRpb24sIHRoZW4gY2xpY2tpbmcgYEtuaXRgIChvciBqdXN0IHB1bGxpbmcgZG93biB0aGUgKlByZXZpZXcqKSBtZW51LiBZb3UgY291bGQgYWxzbyBjcmVhdGUgYSBQREYgZnJvbSB0aGUgbm90ZWJvb2ssIGEgV29yZCBkb2N1bWVudCwgb3IgZXZlbiBhIGRhc2hib2FyZC4gCgojIyMgUHVibGlzaGluZwoKVGhlIG5vdGVib29rIG91dHB1dCBpcyBhIGh0bWwgZmlsZSB3aXRoIGlzIGVhc2lseSBzaGFyZWFibGUgYW5kIGNhbiBiZSBvcGVuIGluIGFueSBtb2Rlcm4gYnJvd3NlciAtIHNvIG5vIFIgU3R1ZGlvIHJlcXVpcmVkIG9uIHRoZSByZWNlaXZpbmcgZW5kLiBSIFN0dWRpbyBhbHNvIG9mZmVycyBhIHNlcnZpY2UgY2FsbGVkIFtSUHVic10oaHR0cDovL3JwdWJzLmNvbS8pIHdoaWNoIGxldCdzIHlvdSBwdWJsaXNoIGRvY3VtZW50cyAoYW5kIHNoaW55IGFwcHMpIHNvIHlvdSBjYW4gc2hhcmUgdGhlbSB3aXRoIG90aGVycyB2aWEgYSBsaW5rLgoKVG8gZG8gc28sIGNsaWNrIHRoZSAqKnB1Ymxpc2gqKiBidXR0b24gaW4gUlN0dWRpbyBhbmQgZW50ZXIgYSBmZXcgdGhpbmdzIChsaWtlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbikgdG8gcHVibGlzaCB0aGUgZG9jdW1lbnQgKGFuZCBtYWtlIGl0IHB1YmxpY2x5IGF2YWlsYWJsZSkuIFlvdSBuZWVkIHRvIHNpZ24gdXAgZm9yIFJQdWJzIGJlZm9yZWhhbmQgdG8gYmUgYWJsZSB0byBkbyB0aGlzIHF1aWNrbHkuCgojIyBPdGhlciBvdXRwdXQgZm9ybWF0cwoKUiBOb3RlYm9va3MgYXJlIGFsc28gUiBNYXJrZG93biBkb2N1bWVudHMgYW5kIGFzIHN1Y2ggd2UgY2FuIGNob29zZSBvdGhlciBvdXRwdXQgZm9ybWF0cy4gVHJ5IHRvIGtuaXQgdGhlIGRvY3VtZW50IHRvIGh0bWwgYW5kIHBkZiBieSBjaG9vc2UgdGhlIGRvd24gYXJyb3cgbmV4dCB0byB0aGUgcHJldmlldyBidXR0b24uCgpZb3UgY2FuIHJlbmRlciB0aGUgc2FtZSBSIE1hcmtkb3duIGZpbGUgaW50byBzZXZlcmFsIGRpZmZlcmVudCBmb3JtYXRzLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY2hhbmdlIGEgZmlsZSdzIG91dHB1dCBmb3JtYXQuCgpGaXJzdCwgeW91IGNhbiBjbGljayB0aGUgdHJpYW5nbGUgaWNvbiBuZXh0IHRvICJLbml0IEhUTUwiIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhbmUgdGhhdCBkaXNwbGF5cyB5b3VyIFIgTWFya2Rvd24gZmlsZS4gVGhpcyB3aWxsIG9wZW4gYSBkcm9wIGRvd24gbWVudSB0aGF0IGdpdmVzIHlvdSB0aGUgY2hvaWNlIG9mIHJlbmRlcmluZyBhcyBhbiBIVE1MIGRvY3VtZW50IG9yIGEgcGRmIGRvY3VtZW50LgoKU2Vjb25kLCB5b3UgY2FuIGNoYW5nZSB0aGUgb3V0cHV0IGZpZWxkIGluIHRoZSBZQU1MIGJsb2NrIGF0IHRoZSB0b3Agb2YgeW91ciBkb2N1bWVudC4gRm9yIGV4YW1wbGUsIHRoaXMgWUFNTCBibG9jayB3aWxsIGNyZWF0ZSBhbiBIVE1MIGZpbGU6CgogICAgLS0tCiAgICBvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKICAgIC0tLQoKVGhpcyBvbmUgd2lsbCBjcmVhdGUgYSBwZGYgZmlsZToKCiAgICAtLS0KICAgIG91dHB1dDogcGRmX2RvY3VtZW50CiAgICAtLS0KVGhpcyBvbmUgd2lsbCBjcmVhdGUgYSBNUyBXb3JkIGZpbGU6CgogICAgLS0tCiAgICBvdXRwdXQ6IHdvcmRfZG9jdW1lbnQKICAgIC0tLQoKQW5kIHRoaXMgb25lIHdpbGwgY3JlYXRlIGEgTWFya2Rvd24gZmlsZToKCiAgICAtLS0KICAgIG91dHB1dDogbWRfZG9jdW1lbnQKICAgIC0tLQoKIyMgU3BlY2lmeSBrbml0ciBhbmQgcGFuZG9jIG9wdGlvbnMKCkVhY2ggUiBNYXJrZG93biBvdXRwdXQgdGVtcGxhdGUgaXMgYSBjb2xsZWN0aW9uIG9mIGtuaXRyIGFuZCBwYW5kb2Mgb3B0aW9ucy4gWW91IGNhbiBjdXN0b21pemUgeW91ciBvdXRwdXQgYnkgb3ZlcndyaXRpbmcgdGhlIGRlZmF1bHQgb3B0aW9ucyB0aGF0IGNvbWUgd2l0aCB0aGUgdGVtcGxhdGUuCgpGb3IgZXhhbXBsZSwgdGhlIFlBTUwgaGVhZGVyIGJlbG93IG92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgY29kZSBoaWdobGlnaHQgc3R5bGUgb2YgdGhlIHBkZl9kb2N1bWVudCB0ZW1wbGF0ZSB0byBjcmVhdGUgYSBkb2N1bWVudCB0aGF0IHVzZXMgdGhlIHplbmJ1cm4gc3R5bGU6CgogICAgLS0tCiAgICB0aXRsZTogIkRlbW8iCiAgICBvdXRwdXQ6CiAgICAgIHBkZl9kb2N1bWVudDoKICAgICAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIC0tLQoKVGhlIFlBTUwgaGVhZGVyIGJlbG93IG92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgYm9vdHN0cmFwIENTUyB0aGVtZSBvZiB0aGUgaHRtbF9kb2N1bWVudCB0ZW1wbGF0ZS4KCiAgICAtLS0KICAgIHRpdGxlOiAiRGVtbyIKICAgIG91dHB1dDoKICAgICAgaHRtbF9kb2N1bWVudDoKICAgICAgICB0aGVtZTogc3BhY2VsYWIKICAgIC0tLQoKIyMgQnJhbmQgeW91ciByZXBvcnRzIHdpdGggc3R5bGUgc2hlZXRzCgpBYm92ZSwgSSBkaXNjdXNzZWQgYSB3YXkgdG8gY2hhbmdlIHRoZSBDU1Mgc3R5bGUgb2YgeW91ciBIVE1MIG91dHB1dDogeW91IGNhbiBzZXQgdGhlIHRoZW1lIG9wdGlvbiBvZiBodG1sX2RvY3VtZW50IHRvIG9uZSBvZiBkZWZhdWx0LCBjZXJ1bGVhbiwgam91cm5hbCwgZmxhdGx5LCByZWFkYWJsZSwgc3BhY2VsYWIsIHVuaXRlZCwgb3IgY29zbW8uIChUcnkgaXQgb3V0KS4KCkJ1dCB3aGF0IGlmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB5b3VyIENTUyBpbiBtb3JlIHNwZWNpZmljIHdheXM/IFlvdSBjYW4gZG8gdGhpcyBieSB3cml0aW5nIGEgLmNzcyBmaWxlIGZvciB5b3VyIHJlcG9ydCBhbmQgc2F2aW5nIGl0IGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgLlJtZCBmaWxlLiBUbyBoYXZlIHlvdXIgcmVwb3J0IHVzZSB0aGUgQ1NTLCBzZXQgdGhlIGNzcyBvcHRpb24gb2YgaHRtbF9kb2N1bWVudCB0byB0aGUgZmlsZSBuYW1lLCBsaWtlIHRoaXMKCi0tLQp0aXRsZTogIkRlbW8iCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY3NzOiBzdHlsZXMuY3NzCi0tLQoKQ3VzdG9tIENTUyBpcyBhbiBlYXN5IHdheSB0byBhZGQgYnJhbmRpbmcgdG8geW91ciByZXBvcnRzLiBUaGUgZXhlcmNpc2UgZm9sZGVyIGNvbnRhaW5zIGEgZmlsZSBjYWxsZWQgYGZhZGVkLmNzc2AuIFRyeSBvdXQgdG8gY2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHlvdXIgaHRtbCBvdXRwdXQuCg==