Introduction

RStudio is a program that helps you write and run R code more easily, especially for working with data, making graphs, and doing statistics.

In this tutorial, we will:

  • Get familiarized with the RStudio interface
  • Learn how to set the working directory
  • Identify the types of documents we can create in R Studio
  • Create an R Markdown file to start our project

RStudio Interface

When we launch RStudio for the first time, we notice three main panels or quadrants:

Once we open a document, the interface will show four main panels:

1 - Top left panel

Files and scripts (source window or code editor)

This is your code editor, where you write, save, and run R scripts (.R), RMarkdown documents (.Rmd), or other file types.

2 - Bottom left panel

R console and terminal

This is the interactive R console, where code is executed immediately. You can:

  • Type and run commands interactively (great for testing small bits of code).
  • View outputs, error messages, and warnings in real time.
  • Switch to the Terminal tab for system-level commands.

3 - Top right panel

Objects, history, environment, tutorial and connections

This area lets you track what’s happening in your R session.

It has different tabs for different actions:

  • Environment: See all objects (like data frames, functions, variables) currently in memory.
  • History: View all commands you’ve previously run.
  • Connections: Manage database connections.
  • Tutorial: View built-in interactive tutorials (from the learnr package).

4 - Bottom right panel

Tree of folders, plots, packages, help, viewer

This panel contains various tools and outputs:

  • Files: Navigate your folder structure and open scripts.
  • Plots: View visualizations generated by your code.
  • Packages: Install, load, or update R packages.
  • Help: Search R documentation (?function_name shows here).
  • Viewer: View HTML content, like R Markdown outputs or Shiny apps.

R Projects

File paths

We use file paths to indicate the exact location of a file in our computer. There are two main types of file paths: absolute and relative.

Absolute paths

Absolute paths have the full address to a file or folder and are specific to operating systems:

Example (Windows): C:\Users\Name\Documents\Research\data.csv
Example (Mac): /Users/Name/Documents/Research/data.csv

Note: Windows uses \, MacOS uses /

Relative paths

Relative paths have the location of a file relative to the current directory or the directory where your R script is located (if you’re using R).

  • It’s portable, meaning you can share it with others as long as they have the same file structure.
Example (if you're in the Documents folder): Research/data.csv

This means “look for the file data.csv inside the Research folder, which is in the same folder as the current working directory.”

Setting working directory

Most R tutorials and books teach the function setwd() for setting the working directory. This function manually sets the working directory during an R session. It tells R where to look for files and where to save outputs just for that session.

But here’s the problem…

Using setwd() can break your code when:

  • Someone else tries to run it on their machine.
  • You move your project folder.
  • You’re running your code on a server or in cloud environments like RStudio Cloud.

Since file paths are hardcoded and depend on your machine, it’s not reproducible.

Create an R Project

An R Project is a feature in RStudio (and supported in base R too) that provides a self-contained working environment. When you create an R Project it creates a .Rproj file in a folder and that folder becomes the root directory of your project. Every time you open the project (via the .Rproj file), R automatically sets the working directory to that folder. You can reference files relative to the project root — no need to hardcode file paths.

This is super useful when you’re working on multiple analyses, sharing code with collaborators, or version-controlling with Git. It is a good practice for reproducible research

To create an R Project, select File > New Project

Types of files in R

There are two main types of files we can create in R studio to edit our code (R script files .R and RMarkdown files .Rmd)

The R script file (.R) is a plain text file that contains R code only. Use it when you want to write and run code line-by-line, such as for data cleaning, analysis, or function building. It’s good for experimenting, scripting, and running code interactively. It’s also good for sharing code with other researchers.

The RMarkdown file (.Rmd) has a mix of R code and written explanations, using Markdown formatting. It can be used to create dynamic, reproducible reports that can be knitted into HTML, PDF, or Word documents.It’s great for homework, research reports, dashboards, or combining narrative with code.

To create an RMarkdown file, select File > New File > RMarkdown

Markdown

Markdown is a simple way to format text using plain symbols and characters, without needing complex tools. It was designed to make creating documents easy and readable. Many websites, blogs, and online platforms use Markdown because it is quick to write and easy to convert into nice-looking documents. Learning Markdown gives you a foundation for organizing your ideas clearly, and it’s the basic language that RMarkdown builds on to create reports that combine text, code, and results all in one document.

RMarkdown

With RMarkdown, you can write plain text like in Markdown — but you can also insert chunks of R code that run directly inside the document. This means you can create reports that mix text, analysis, tables, and graphs all in one place. RMarkdown automatically runs the code, captures the results, and formats everything into a polished document like a PDF, Word file, or website.

The key difference between the RScript files and RMarkdown files is that RScript is used for executing code and performing computations, whereas RMarkdown is a tool for combining R code with explanatory text in a structured document. In RMarkdown, code chunks can be embedded within a narrative, and when the document is knit the results (including text, tables, and plots) are automatically generated and formatted, making it ideal for creating research reports, analyses, and presentations.

RMarkdown offers formatting options that help us organize the file into sections, it is a good practice to document every step taken when working with data.

RMarkdown structure

RMarkdown documents have three main parts:

  • YAML header
  • Markdown text
  • R code chunks

YAML header

This is the section at the very top of the document (enclosed by — lines). It holds metadata about your document—like the title, author, date, and output format (HTML, PDF, Word, etc.).

RMarkdown text

This is the regular explanatory text in the document. You can use simple formatting: bold, italics, lists, headers, links, etc.

Symbol Description
# Level 1 heading
## Level 2 heading
### Level 3 heading
* word * (without spaces) Italics
** word ** (without spaces) Bold

R Code Chunks

These are sections of code surrounded by triple backticks and {r}.This is where you write the actual R code that runs analyses, creates plots, loads data, etc. Inside a chunk of R code, everything behaves the same as a regular R document.

```{r}

```

For additional information, visit the RMarkdown lesson from RStudio, and the RMarkdown definitive guide

Your Turn!

Create your first RProject. We will name this project js_timeuse_2025

Create your first RMarkdown file. We will name this file script_js_timeuse_2025

In your RMarkdown file, add the following:

1. Level 1 heading "Learning RDM with Time Use Project"
2. Brief description of the project: 
3. Level 2 heading "My first chunk of code"
4. Insert an empty chunk of code
5. Inside the chunk of code, type the following: `5+3` (Yes! R can be used as a simple calculator too!)
6. Click the play button on the top right corner of the code chunk. This will display the result of the code chunk. 
 
Finally, lets save and visualize our work.

-Click on the save button in the top left panel. Make sure you are in the correct folder. Save the file as ’script_js_timeuse_2025.Rmd

-Click the knit icon at the top of your code editor to preview your formatted file in .html

We will continue adding information to this RMarkdown file later today and the rest of the week.

LS0tCnRpdGxlOiAiU2V0dGluZyB1cCBSIgpwYWdldGl0bGU6ICJTZXR0aW5nIHVwIFIiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBzaG93ICMgYWxsb3dzIHRvZ2dsaW5nIG9mIHNob3dpbmcgYW5kIGhpZGluZyBjb2RlLiBSZW1vdmUgaWYgbm90IHVzaW5nIGNvZGUuCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlICMgYWxsb3dzIHRoZSB1c2VyIHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgLlJtZCBmaWxlLiBSZW1vdmUgaWYgbm90IHVzaW5nIGNvZGUuCiAgICBpbmNsdWRlczoKICAgICAgYWZ0ZXJfYm9keTogZm9vdGVyLmh0bWwgIyBpbmNsdWRlIGEgY3VzdG9tIGZvb3Rlci4KICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5ncyA9IEZBTFNFKQpgYGAKCiMjIEludHJvZHVjdGlvbgoKOjo6aW50cm8KUlN0dWRpbyBpcyBhIHByb2dyYW0gdGhhdCBoZWxwcyB5b3Ugd3JpdGUgYW5kIHJ1biBSIGNvZGUgbW9yZSBlYXNpbHksIGVzcGVjaWFsbHkgZm9yIHdvcmtpbmcgd2l0aCBkYXRhLCBtYWtpbmcgZ3JhcGhzLCBhbmQgZG9pbmcgc3RhdGlzdGljcy4KOjo6CgpJbiB0aGlzIHR1dG9yaWFsLCB3ZSB3aWxsOgoKLSBHZXQgZmFtaWxpYXJpemVkIHdpdGggdGhlIFJTdHVkaW8gaW50ZXJmYWNlCi0gTGVhcm4gaG93IHRvIHNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkKLSBJZGVudGlmeSB0aGUgdHlwZXMgb2YgZG9jdW1lbnRzIHdlIGNhbiBjcmVhdGUgaW4gUiBTdHVkaW8KLSBDcmVhdGUgYW4gUiBNYXJrZG93biBmaWxlIHRvIHN0YXJ0IG91ciBwcm9qZWN0CgojIyBSU3R1ZGlvIEludGVyZmFjZQoKV2hlbiB3ZSBsYXVuY2ggUlN0dWRpbyBmb3IgdGhlIGZpcnN0IHRpbWUsIHdlIG5vdGljZSB0aHJlZSBtYWluIHBhbmVscyBvciBxdWFkcmFudHM6IAoKIVtdKGltYWdlcy9kYXkyX1JTdHVkaW9fM3BhbmVsLnBuZykKCk9uY2Ugd2Ugb3BlbiBhIGRvY3VtZW50LCB0aGUgaW50ZXJmYWNlIHdpbGwgc2hvdyBmb3VyIG1haW4gcGFuZWxzOgoKIVtdKGltYWdlcy9kYXkyX1JTdHVkaW9fNHBhbmVsLnBuZykKCiMjIyAxIC0gVG9wIGxlZnQgcGFuZWwKIyMjIyBGaWxlcyBhbmQgc2NyaXB0cyAoc291cmNlIHdpbmRvdyBvciBjb2RlIGVkaXRvcikKClRoaXMgaXMgeW91ciBjb2RlIGVkaXRvciwgd2hlcmUgeW91IHdyaXRlLCBzYXZlLCBhbmQgcnVuIFIgc2NyaXB0cyAoLlIpLCBSTWFya2Rvd24gZG9jdW1lbnRzICguUm1kKSwgb3Igb3RoZXIgZmlsZSB0eXBlcy4KCiMjIyAyIC0gQm90dG9tIGxlZnQgcGFuZWwKIyMjIyBSIGNvbnNvbGUgYW5kIHRlcm1pbmFsCgpUaGlzIGlzIHRoZSBpbnRlcmFjdGl2ZSBSIGNvbnNvbGUsIHdoZXJlIGNvZGUgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuIFlvdSBjYW46CgogLSBUeXBlIGFuZCBydW4gY29tbWFuZHMgaW50ZXJhY3RpdmVseSAoZ3JlYXQgZm9yIHRlc3Rpbmcgc21hbGwgYml0cyBvZiBjb2RlKS4KIC0gVmlldyBvdXRwdXRzLCBlcnJvciBtZXNzYWdlcywgYW5kIHdhcm5pbmdzIGluIHJlYWwgdGltZS4KIC0gU3dpdGNoIHRvIHRoZSBUZXJtaW5hbCB0YWIgZm9yIHN5c3RlbS1sZXZlbCBjb21tYW5kcy4KCiMjIyAzIC0gVG9wIHJpZ2h0IHBhbmVsCiMjIyMgT2JqZWN0cywgaGlzdG9yeSwgZW52aXJvbm1lbnQsIHR1dG9yaWFsIGFuZCBjb25uZWN0aW9ucwoKVGhpcyBhcmVhIGxldHMgeW91IHRyYWNrIHdoYXTigJlzIGhhcHBlbmluZyBpbiB5b3VyIFIgc2Vzc2lvbi4KCkl0IGhhcyBkaWZmZXJlbnQgdGFicyBmb3IgZGlmZmVyZW50IGFjdGlvbnM6IAoKIC0gKipFbnZpcm9ubWVudDoqKiBTZWUgYWxsIG9iamVjdHMgKGxpa2UgZGF0YSBmcmFtZXMsIGZ1bmN0aW9ucywgdmFyaWFibGVzKSBjdXJyZW50bHkgaW4gbWVtb3J5LgogLSAqKkhpc3Rvcnk6KiogVmlldyBhbGwgY29tbWFuZHMgeW914oCZdmUgcHJldmlvdXNseSBydW4uCiAtICoqQ29ubmVjdGlvbnM6KiogTWFuYWdlIGRhdGFiYXNlIGNvbm5lY3Rpb25zLgogLSAqKlR1dG9yaWFsOioqIFZpZXcgYnVpbHQtaW4gaW50ZXJhY3RpdmUgdHV0b3JpYWxzIChmcm9tIHRoZSBsZWFybnIgcGFja2FnZSkuCgojIyMgNCAtIEJvdHRvbSByaWdodCBwYW5lbAojIyMjIFRyZWUgb2YgZm9sZGVycywgcGxvdHMsIHBhY2thZ2VzLCBoZWxwLCB2aWV3ZXIKClRoaXMgcGFuZWwgY29udGFpbnMgdmFyaW91cyB0b29scyBhbmQgb3V0cHV0czoKCiAtICoqRmlsZXM6KiogTmF2aWdhdGUgeW91ciBmb2xkZXIgc3RydWN0dXJlIGFuZCBvcGVuIHNjcmlwdHMuCiAtICoqUGxvdHM6KiogVmlldyB2aXN1YWxpemF0aW9ucyBnZW5lcmF0ZWQgYnkgeW91ciBjb2RlLgogLSAqKlBhY2thZ2VzOioqIEluc3RhbGwsIGxvYWQsIG9yIHVwZGF0ZSBSIHBhY2thZ2VzLgogLSAqKkhlbHA6KiogU2VhcmNoIFIgZG9jdW1lbnRhdGlvbiAoYD9mdW5jdGlvbl9uYW1lYCBzaG93cyBoZXJlKS4KIC0gKipWaWV3ZXI6KiogVmlldyBIVE1MIGNvbnRlbnQsIGxpa2UgUiBNYXJrZG93biBvdXRwdXRzIG9yIFNoaW55IGFwcHMuCgojIyBSIFByb2plY3RzIAoKIyMjIEZpbGUgcGF0aHMKV2UgdXNlIGZpbGUgcGF0aHMgdG8gaW5kaWNhdGUgdGhlIGV4YWN0IGxvY2F0aW9uIG9mIGEgZmlsZSBpbiBvdXIgY29tcHV0ZXIuIFRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBmaWxlIHBhdGhzOiBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUuCgojIyMjIEFic29sdXRlIHBhdGhzIApBYnNvbHV0ZSBwYXRocyBoYXZlIHRoZSBmdWxsIGFkZHJlc3MgdG8gYSBmaWxlIG9yIGZvbGRlciBhbmQgYXJlIHNwZWNpZmljIHRvIG9wZXJhdGluZyBzeXN0ZW1zOgoKYGBgYG1hcmtkb3duCmByICcnYEV4YW1wbGUgKFdpbmRvd3MpOiBDOlxVc2Vyc1xOYW1lXERvY3VtZW50c1xSZXNlYXJjaFxkYXRhLmNzdgpFeGFtcGxlIChNYWMpOiAvVXNlcnMvTmFtZS9Eb2N1bWVudHMvUmVzZWFyY2gvZGF0YS5jc3YKCk5vdGU6IFdpbmRvd3MgdXNlcyBcLCBNYWNPUyB1c2VzIC8KYGBgYAoKIAoKIyMjIyBSZWxhdGl2ZSBwYXRocyAKUmVsYXRpdmUgcGF0aHMgaGF2ZSB0aGUgbG9jYXRpb24gb2YgYSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvciB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdXIgUiBzY3JpcHQgaXMgbG9jYXRlZCAoaWYgeW91J3JlIHVzaW5nIFIpLgogCiAtIEl04oCZcyBwb3J0YWJsZSwgbWVhbmluZyB5b3UgY2FuIHNoYXJlIGl0IHdpdGggb3RoZXJzIGFzIGxvbmcgYXMgdGhleSBoYXZlIHRoZSBzYW1lIGZpbGUgc3RydWN0dXJlLgogCiAKIGBgYGBtYXJrZG93bgpgciAnJyBgRXhhbXBsZSAoaWYgeW91J3JlIGluIHRoZSBEb2N1bWVudHMgZm9sZGVyKTogUmVzZWFyY2gvZGF0YS5jc3YKYGBgYAoKVGhpcyBtZWFucyAibG9vayBmb3IgdGhlIGZpbGUgKmRhdGEuY3N2KiBpbnNpZGUgdGhlICpSZXNlYXJjaCBmb2xkZXIqLCB3aGljaCBpcyBpbiB0aGUgc2FtZSBmb2xkZXIgYXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIgoKIyMjIFNldHRpbmcgd29ya2luZyBkaXJlY3RvcnkKCk1vc3QgUiB0dXRvcmlhbHMgYW5kIGJvb2tzIHRlYWNoIHRoZSBmdW5jdGlvbiBgc2V0d2QoKWAgZm9yIHNldHRpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGZ1bmN0aW9uIG1hbnVhbGx5IHNldHMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGR1cmluZyBhbiBSIHNlc3Npb24uIEl0IHRlbGxzIFIgd2hlcmUgdG8gbG9vayBmb3IgZmlsZXMgYW5kIHdoZXJlIHRvIHNhdmUgb3V0cHV0cyBqdXN0IGZvciB0aGF0IHNlc3Npb24uCgpCdXQgaGVyZeKAmXMgdGhlIHByb2JsZW0uLi4KClVzaW5nIGBzZXR3ZCgpYCBjYW4gYnJlYWsgeW91ciBjb2RlIHdoZW46CgogLSBTb21lb25lIGVsc2UgdHJpZXMgdG8gcnVuIGl0IG9uIHRoZWlyIG1hY2hpbmUuCiAtIFlvdSBtb3ZlIHlvdXIgcHJvamVjdCBmb2xkZXIuCiAtIFlvdSdyZSBydW5uaW5nIHlvdXIgY29kZSBvbiBhIHNlcnZlciBvciBpbiBjbG91ZCBlbnZpcm9ubWVudHMgbGlrZSBSU3R1ZGlvIENsb3VkLgoKU2luY2UgZmlsZSBwYXRocyBhcmUgaGFyZGNvZGVkIGFuZCBkZXBlbmQgb24geW91ciBtYWNoaW5lLCAqKml0J3Mgbm90IHJlcHJvZHVjaWJsZSoqLgoKIyMjIENyZWF0ZSBhbiBSIFByb2plY3QKCkFuIFIgUHJvamVjdCBpcyBhIGZlYXR1cmUgaW4gUlN0dWRpbyAoYW5kIHN1cHBvcnRlZCBpbiBiYXNlIFIgdG9vKSB0aGF0IHByb3ZpZGVzIGEgc2VsZi1jb250YWluZWQgd29ya2luZyBlbnZpcm9ubWVudC4gV2hlbiB5b3UgY3JlYXRlIGFuIFIgUHJvamVjdCBpdCBjcmVhdGVzIGEgLlJwcm9qIGZpbGUgaW4gYSBmb2xkZXIgYW5kIHRoYXQgZm9sZGVyIGJlY29tZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHlvdXIgcHJvamVjdC4gRXZlcnkgdGltZSB5b3Ugb3BlbiB0aGUgcHJvamVjdCAodmlhIHRoZSAuUnByb2ogZmlsZSksIFIgYXV0b21hdGljYWxseSBzZXRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGF0IGZvbGRlci4gWW91IGNhbiByZWZlcmVuY2UgZmlsZXMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdCDigJQgbm8gbmVlZCB0byBoYXJkY29kZSBmaWxlIHBhdGhzLgoKVGhpcyBpcyBzdXBlciB1c2VmdWwgd2hlbiB5b3UncmUgd29ya2luZyBvbiBtdWx0aXBsZSBhbmFseXNlcywgc2hhcmluZyBjb2RlIHdpdGggY29sbGFib3JhdG9ycywgb3IgdmVyc2lvbi1jb250cm9sbGluZyB3aXRoIEdpdC4gKipJdCBpcyBhIGdvb2QgcHJhY3RpY2UgZm9yIHJlcHJvZHVjaWJsZSByZXNlYXJjaCoqCgpUbyBjcmVhdGUgYW4gUiBQcm9qZWN0LCBzZWxlY3QgRmlsZSA+IE5ldyBQcm9qZWN0CgohW10oaW1hZ2VzL2RheTJfQ3JlYXRlUHJvamVjdC5naWYpCgoKIyMgVHlwZXMgb2YgZmlsZXMgaW4gUgoKVGhlcmUgYXJlIHR3byBtYWluIHR5cGVzIG9mIGZpbGVzIHdlIGNhbiBjcmVhdGUgaW4gUiBzdHVkaW8gdG8gZWRpdCBvdXIgY29kZSAoUiBzY3JpcHQgZmlsZXMgYC5SYCBhbmQgUk1hcmtkb3duIGZpbGVzIGAuUm1kYCkKClRoZSBSIHNjcmlwdCBmaWxlIChgLlJgKSBpcyBhIHBsYWluIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIFIgY29kZSBvbmx5LiBVc2UgaXQgd2hlbiB5b3Ugd2FudCB0byB3cml0ZSBhbmQgcnVuIGNvZGUgbGluZS1ieS1saW5lLCBzdWNoIGFzIGZvciBkYXRhIGNsZWFuaW5nLCBhbmFseXNpcywgb3IgZnVuY3Rpb24gYnVpbGRpbmcuIEl0J3MgZ29vZCBmb3IgZXhwZXJpbWVudGluZywgc2NyaXB0aW5nLCBhbmQgcnVubmluZyBjb2RlIGludGVyYWN0aXZlbHkuIEl0J3MgYWxzbyBnb29kIGZvciBzaGFyaW5nIGNvZGUgd2l0aCBvdGhlciByZXNlYXJjaGVycy4KClRoZSBSTWFya2Rvd24gZmlsZSAoYC5SbWRgKSBoYXMgYSBtaXggb2YgUiBjb2RlIGFuZCB3cml0dGVuIGV4cGxhbmF0aW9ucywgdXNpbmcgTWFya2Rvd24gZm9ybWF0dGluZy4gIEl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBkeW5hbWljLCByZXByb2R1Y2libGUgcmVwb3J0cyB0aGF0IGNhbiBiZSBrbml0dGVkIGludG8gSFRNTCwgUERGLCBvciBXb3JkIGRvY3VtZW50cy5JdCdzIGdyZWF0IGZvciBob21ld29yaywgcmVzZWFyY2ggcmVwb3J0cywgZGFzaGJvYXJkcywgb3IgY29tYmluaW5nIG5hcnJhdGl2ZSB3aXRoIGNvZGUuCgpUbyBjcmVhdGUgYW4gUk1hcmtkb3duIGZpbGUsIHNlbGVjdCBGaWxlID4gTmV3IEZpbGUgPiBSTWFya2Rvd24KCiFbXShpbWFnZXMvZGF5Ml9DcmVhdGVSTWFya2Rvd24uZ2lmKQoKIyMgTWFya2Rvd24KTWFya2Rvd24gaXMgYSBzaW1wbGUgd2F5IHRvIGZvcm1hdCB0ZXh0IHVzaW5nIHBsYWluIHN5bWJvbHMgYW5kIGNoYXJhY3RlcnMsIHdpdGhvdXQgbmVlZGluZyBjb21wbGV4IHRvb2xzLiBJdCB3YXMgZGVzaWduZWQgdG8gbWFrZSBjcmVhdGluZyBkb2N1bWVudHMgZWFzeSBhbmQgcmVhZGFibGUuIE1hbnkgd2Vic2l0ZXMsIGJsb2dzLCBhbmQgb25saW5lIHBsYXRmb3JtcyB1c2UgTWFya2Rvd24gYmVjYXVzZSBpdCBpcyBxdWljayB0byB3cml0ZSBhbmQgZWFzeSB0byBjb252ZXJ0IGludG8gbmljZS1sb29raW5nIGRvY3VtZW50cy4gTGVhcm5pbmcgTWFya2Rvd24gZ2l2ZXMgeW91IGEgZm91bmRhdGlvbiBmb3Igb3JnYW5pemluZyB5b3VyIGlkZWFzIGNsZWFybHksIGFuZCBpdOKAmXMgdGhlIGJhc2ljIGxhbmd1YWdlIHRoYXQgUk1hcmtkb3duIGJ1aWxkcyBvbiB0byBjcmVhdGUgcmVwb3J0cyB0aGF0IGNvbWJpbmUgdGV4dCwgY29kZSwgYW5kIHJlc3VsdHMgYWxsIGluIG9uZSBkb2N1bWVudC4KCiMjIFJNYXJrZG93bgpXaXRoIFJNYXJrZG93biwgeW91IGNhbiB3cml0ZSBwbGFpbiB0ZXh0IGxpa2UgaW4gTWFya2Rvd24g4oCUIGJ1dCB5b3UgY2FuIGFsc28gaW5zZXJ0IGNodW5rcyBvZiBSIGNvZGUgdGhhdCBydW4gZGlyZWN0bHkgaW5zaWRlIHRoZSBkb2N1bWVudC4gVGhpcyBtZWFucyB5b3UgY2FuIGNyZWF0ZSByZXBvcnRzIHRoYXQgbWl4IHRleHQsIGFuYWx5c2lzLCB0YWJsZXMsIGFuZCBncmFwaHMgYWxsIGluIG9uZSBwbGFjZS4gUk1hcmtkb3duIGF1dG9tYXRpY2FsbHkgcnVucyB0aGUgY29kZSwgY2FwdHVyZXMgdGhlIHJlc3VsdHMsIGFuZCBmb3JtYXRzIGV2ZXJ5dGhpbmcgaW50byBhIHBvbGlzaGVkIGRvY3VtZW50IGxpa2UgYSBQREYsIFdvcmQgZmlsZSwgb3Igd2Vic2l0ZS4KClRoZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBSU2NyaXB0IGZpbGVzIGFuZCBSTWFya2Rvd24gZmlsZXMgaXMgdGhhdCBSU2NyaXB0IGlzIHVzZWQgZm9yIGV4ZWN1dGluZyBjb2RlIGFuZCBwZXJmb3JtaW5nIGNvbXB1dGF0aW9ucywgd2hlcmVhcyBSTWFya2Rvd24gaXMgYSB0b29sIGZvciBjb21iaW5pbmcgUiBjb2RlIHdpdGggZXhwbGFuYXRvcnkgdGV4dCBpbiBhIHN0cnVjdHVyZWQgZG9jdW1lbnQuIEluIFJNYXJrZG93biwgY29kZSBjaHVua3MgY2FuIGJlIGVtYmVkZGVkIHdpdGhpbiBhIG5hcnJhdGl2ZSwgYW5kIHdoZW4gdGhlIGRvY3VtZW50IGlzICoqa25pdCoqIHRoZSByZXN1bHRzIChpbmNsdWRpbmcgdGV4dCwgdGFibGVzLCBhbmQgcGxvdHMpIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBhbmQgZm9ybWF0dGVkLCBtYWtpbmcgaXQgaWRlYWwgZm9yIGNyZWF0aW5nIHJlc2VhcmNoIHJlcG9ydHMsIGFuYWx5c2VzLCBhbmQgcHJlc2VudGF0aW9ucy4KClJNYXJrZG93biBvZmZlcnMgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgaGVscCB1cyBvcmdhbml6ZSB0aGUgZmlsZSBpbnRvIHNlY3Rpb25zLCBpdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZG9jdW1lbnQgZXZlcnkgc3RlcCB0YWtlbiB3aGVuIHdvcmtpbmcgd2l0aCBkYXRhLiAKCiMjIFJNYXJrZG93biBzdHJ1Y3R1cmUKClJNYXJrZG93biBkb2N1bWVudHMgaGF2ZSB0aHJlZSBtYWluIHBhcnRzOgoKIC0gKipZQU1MIGhlYWRlcioqIAogLSAqKk1hcmtkb3duIHRleHQqKiAKIC0gKipSIGNvZGUgY2h1bmtzKiogCiAKICFbXShpbWFnZXMvZGF5Ml9STWFya2Rvd24ucG5nKQoKIyMjIFlBTUwgaGVhZGVyClRoaXMgaXMgdGhlIHNlY3Rpb24gYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBkb2N1bWVudCAoZW5jbG9zZWQgYnkgLS0tIGxpbmVzKS4gSXQgaG9sZHMgbWV0YWRhdGEgYWJvdXQgeW91ciBkb2N1bWVudOKAlGxpa2UgdGhlIHRpdGxlLCBhdXRob3IsIGRhdGUsIGFuZCBvdXRwdXQgZm9ybWF0IChIVE1MLCBQREYsIFdvcmQsIGV0Yy4pLgoKIyMjIFJNYXJrZG93biB0ZXh0ClRoaXMgaXMgdGhlIHJlZ3VsYXIgZXhwbGFuYXRvcnkgdGV4dCBpbiB0aGUgZG9jdW1lbnQuIFlvdSBjYW4gdXNlIHNpbXBsZSBmb3JtYXR0aW5nOiAqKmJvbGQqKiwgKml0YWxpY3MqLCBsaXN0cywgaGVhZGVycywgbGlua3MsIGV0Yy4KCioqU3ltYm9sKiogfCoqRGVzY3JpcHRpb24qKgp8Oi0tLS0tLXw6LS0tLS0tfAp8ICN8IExldmVsIDEgaGVhZGluZ3wKfCAjI3wgTGV2ZWwgMiBoZWFkaW5nfAp8ICMjI3wgTGV2ZWwgMyBoZWFkaW5nfAp8ICogd29yZCAqICh3aXRob3V0IHNwYWNlcyl8ICpJdGFsaWNzKnwgCnwgKiogd29yZCAqKiAod2l0aG91dCBzcGFjZXMpfCAqKkJvbGQqKnwKCgojIyMgUiBDb2RlIENodW5rcwpUaGVzZSBhcmUgc2VjdGlvbnMgb2YgY29kZSBzdXJyb3VuZGVkIGJ5IHRyaXBsZSBiYWNrdGlja3MgYW5kIHtyfS5UaGlzIGlzIHdoZXJlIHlvdSB3cml0ZSB0aGUgYWN0dWFsIFIgY29kZSB0aGF0IHJ1bnMgYW5hbHlzZXMsIGNyZWF0ZXMgcGxvdHMsIGxvYWRzIGRhdGEsIGV0Yy4gSW5zaWRlIGEgY2h1bmsgb2YgUiBjb2RlLCBldmVyeXRoaW5nIGJlaGF2ZXMgdGhlIHNhbWUgYXMgYSByZWd1bGFyIFIgZG9jdW1lbnQuCgpgYGBgbWFya2Rvd24KYHIgJydgYGBge3J9CgpgYGAKYGBgYAoKRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSA8YSBocmVmPSJodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9sZXNzb24tOC5odG1sIj5STWFya2Rvd24gbGVzc29uIGZyb20gUlN0dWRpbzwvYT4sIGFuZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLyI+Uk1hcmtkb3duIGRlZmluaXRpdmUgZ3VpZGU8L2E+IAoKIyMgWW91ciBUdXJuISAKCjo6OnF1ZXN0aW9uCkNyZWF0ZSB5b3VyIGZpcnN0IFJQcm9qZWN0LiBXZSB3aWxsIG5hbWUgdGhpcyBwcm9qZWN0IGBqc190aW1ldXNlXzIwMjVgCjo6OgoKOjo6cXVlc3Rpb24KQ3JlYXRlIHlvdXIgZmlyc3QgUk1hcmtkb3duIGZpbGUuIFdlIHdpbGwgbmFtZSB0aGlzIGZpbGUgYHNjcmlwdF9qc190aW1ldXNlXzIwMjVgCjo6OgoKOjo6cXVlc3Rpb24KSW4geW91ciBSTWFya2Rvd24gZmlsZSwgYWRkIHRoZSBmb2xsb3dpbmc6Cjo6OgoKCmBgYGBtYXJrZG93bgoxLiBMZXZlbCAxIGhlYWRpbmcgIkxlYXJuaW5nIFJETSB3aXRoIFRpbWUgVXNlIFByb2plY3QiCjIuIEJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0OiAKMy4gTGV2ZWwgMiBoZWFkaW5nICJNeSBmaXJzdCBjaHVuayBvZiBjb2RlIgo0LiBJbnNlcnQgYW4gZW1wdHkgY2h1bmsgb2YgY29kZQo1LiBJbnNpZGUgdGhlIGNodW5rIG9mIGNvZGUsIHR5cGUgdGhlIGZvbGxvd2luZzogYDUrM2AgKFllcyEgUiBjYW4gYmUgdXNlZCBhcyBhIHNpbXBsZSBjYWxjdWxhdG9yIHRvbyEpCjYuIENsaWNrIHRoZSBwbGF5IGJ1dHRvbiBvbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgY29kZSBjaHVuay4gVGhpcyB3aWxsIGRpc3BsYXkgdGhlIHJlc3VsdCBvZiB0aGUgY29kZSBjaHVuay4gCiAKRmluYWxseSwgbGV0cyBzYXZlIGFuZCB2aXN1YWxpemUgb3VyIHdvcmsuCmBgYGAKIAo6OjpxdWVzdGlvbgoKLUNsaWNrIG9uIHRoZSBzYXZlIGJ1dHRvbiBpbiB0aGUgdG9wIGxlZnQgcGFuZWwuIE1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSBjb3JyZWN0IGZvbGRlci4gU2F2ZSB0aGUgZmlsZSBhcyAnYHNjcmlwdF9qc190aW1ldXNlXzIwMjUuUm1kYAoKLUNsaWNrIHRoZSBrbml0IGljb24gYXQgdGhlIHRvcCBvZiB5b3VyIGNvZGUgZWRpdG9yIHRvIHByZXZpZXcgeW91ciBmb3JtYXR0ZWQgZmlsZSBpbiAuaHRtbAo6OjoKCldlIHdpbGwgY29udGludWUgYWRkaW5nIGluZm9ybWF0aW9uIHRvIHRoaXMgUk1hcmtkb3duIGZpbGUgbGF0ZXIgdG9kYXkgYW5kIHRoZSByZXN0IG9mIHRoZSB3ZWVrLgoKCgoKCg==