Setting up RStudio
Congratulations! You have downloaded R and RStudio.
This is an R Markdown
Notebook (“.Rmd”). If you are reading this on the workshop website, you
are looking at the HTML (website) version. Make sure you have the
.Rmd
file as well, which you can download by right-clicking
here and saving as
Setting_Up.Rmd
. You can also click the “Code” dropdown menu
in the upper right corner of this page and select “Download .Rmd”
The HTML (web) version can serve as an easy-to-read but static copy.
You can only run the code if you open the .Rmd
file using
RStudio, since it is the code that built the static version.
When you execute code within the .Rmd notebook while you’re using
RStudio, the results appear beneath the code. This will be handy for
working through the material outside of class and when you work on your
own code in the future.
File structure
Before we get started in RStudio, make sure you have a folder
dedicated to the workshop.
Quick aside: Just so we’re all on the same page…
computers are designed to act like old-school filing systems. They’re
all structured like a filing cabinet where each drawer has folders, and
inside those folders can be smaller folders, and your papers can be
filed in any of these locations. On a computer, there are folders which
can contain files or more folders, which can in turn can contain files
or even more folders. To identify where a file is located in the
computer’s structure, every file has a “file path”, which is a list of
folders one would need to pass through to access the file.
You will be running something called an RStudio
project (.Rproj
), which will house all of
the files and code we work with during the workshop. Here’s an example
image of what your file structure should look like. I’ve called the
folder “AdventuresInR”, and it contains three other folders: “data”,
“scripts”, and “figures”.
Save the .Rmd
file directly into
AdventuresInR
and open it in RStudio.
Preparing RStudio
If you are currently reading this in RStudio, try
executing this chunk by clicking the Run button within the
chunk (the green triangle in the top right corner of the grey cell
below) or by placing your cursor inside it and pressing
Cmd+Shift+Enter
(Mac) or Ctrl+Shift+Enter
(Windows). If you are currently reading this using a web
browser, you can hide or show the code that produces various
outputs by clicking the Hide/Code button on the top
right of the code “cell”, but you cannot execute the code. It may help
to have this notebook open in RStudio and a browser window at the same
time, so you can navigate between them.
Execute this code now, then save this file (Cmd+s
on
Mac, CTRL+s
on Windows). Once you have done that, a graph
will appear below in RStudio.
plot(cars)
This graph was generated using some data that comes pre-loaded with
the basic R software. However, to use R you will need to:
- install
- load, and
- run
packages that do not automatically come with the basic R software.
These packages contain important additions to the basic software that
allow you to perform sophisticated analyses and produce clear, beautiful
visualisations, among many other things. Some packages can take a while
to install, depending on the speed of your internet connection.
Therefore, you must install these packages before the first day of the
workshop. Please contact one of us well in advance of the workshop if
you encounter any problems with installation.
1. Installing
Installing a package only needs to be done once (per
computer). This is because installation is equivalent of downloading a
file from the internet and storing it on your hard drive (e.g., Local
Disk or C: drive on Windows or /Downloads/ folder on Mac). Once a
package has been downloaded, it exists on your computer and does not
need to be re-downloaded later.
First, make sure you are connected to the internet. Install the
following packages now, by executing the code below as you did in the
previous cell.
install.packages("tidyverse")
install.packages("knitr")
install.packages("cowplot")
install.packages("ordinal")
install.packages("broom")
install.packages("emmeans")
install.packages("Hmisc")
install.packages("corrplot")
If you get an error or if nothing seems to be happening, you may need
to respond to the program like below (type yes
and hit
Enter
).
Would you like to use a personal library instead? (yes/No/cancel) yes
While this code is running, a red square (the ‘stop’ symbol) will
appear in the upper right corner of the code cell. When it has finished
running, the green triangle (the ‘run’ symbol) will reappear. Wait for
the code to finish before moving on. This may take a while. Make sure to
give yourself plenty of time to run this code, and if you have any
trouble, contact one of the workshop organisers.
2. Loading
Loading a package is an entirely different action from installing a
package. By telling R to load a package, you are instructing it to look
for the file you downloaded during installation and sort of “wake it up”
while you have R open. When you close R, the package will go back to
sleep and you’ll have to reload it again. (You will not have to download
and install it again, although you may need to download updates
periodically.)
Let’s load the packaged called ggplot2 right now by
executing the following code.
library(ggplot2)
If this code was successful, it will appear as though nothing
happened. To show you what an error looks like, run the
following code.
library(Ggplot2)
Hopefully, this code produced text that reads:
Error in library(Ggplot2) : there is no package called ‘Ggplot2’
Uh oh! Looks like capitalisation is important in R. That
will be something to remember for later.
3. Running
By this point, you have installed and
loaded the three packages you will need for the first
day of the workshop. Before you’re done setting up RStudio, though, you
should make sure that the packages are running
properly. Let’s produce that first graph again, but this time using code
only available when ‘ggplot2’ is installed and loaded.
ggplot(cars, aes(x=speed, y=dist)) + geom_point(size=3, shape=1) + theme_bw()
If everything has gone to plan, you should now see a second graph
that looks very much like the first graph. Don’t worry about how we made
it yet! That will be something we explain during the workshop. Right
now, we just want to make sure that you are ready to hit the ground
running on the first day.
If you run into any trouble before the workshop, please
email one of the instructors in advance. We can help you troubleshoot
and get your tools working before the workshop. During the workshop, we
will have limited ability to help, which could slow you down or
interfere with the workshop.
To be safe, you may also want to create an account at Posit Cloud: https://posit.co/products/cloud/cloud/
If you do this in advance, and something goes wrong on the day of the
workshop, you will not need to lose any time with troubleshooting!
See you soon!
LS0tCnRpdGxlOiAiQWR2ZW50dXJlcyBpbiBSOiBQcmUtd29ya3Nob3AgcHJlcGFyYXRpb24iCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCi0tLQpbPC0tIEhvbWVdKGh0dHBzOi8vdmVyYmluZ25vdW5zLmdpdGh1Yi5pby9BZHZlbnR1cmVzSW5SLykKCiMgU2V0dGluZyB1cCBSU3R1ZGlvCgpDb25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIGRvd25sb2FkZWQgW1JdKGh0dHBzOi8vd3d3LnN0YXRzLmJyaXMuYWMudWsvUi8pIGFuZCBbUlN0dWRpb10oaHR0cHM6Ly9wb3NpdC5jby9kb3dubG9hZC9yc3R1ZGlvLWRlc2t0b3AvI2Rvd25sb2FkKS4KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rICgiLlJtZCIpLiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBvbiB0aGUgd29ya3Nob3Agd2Vic2l0ZSwgeW91IGFyZSBsb29raW5nIGF0IHRoZSBIVE1MICh3ZWJzaXRlKSB2ZXJzaW9uLiBNYWtlIHN1cmUgeW91IGhhdmUgdGhlIGAuUm1kYCBmaWxlIGFzIHdlbGwsIHdoaWNoIHlvdSBjYW4gZG93bmxvYWQgYnkgcmlnaHQtY2xpY2tpbmcgW2hlcmVdKFNldHRpbmdfVXAuUm1kKSBhbmQgc2F2aW5nIGFzIGBTZXR0aW5nX1VwLlJtZGAuIFlvdSBjYW4gYWxzbyBjbGljayB0aGUgIkNvZGUiIGRyb3Bkb3duIG1lbnUgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiB0aGlzIHBhZ2UgYW5kIHNlbGVjdCAiRG93bmxvYWQgLlJtZCIKClRoZSBIVE1MICh3ZWIpIHZlcnNpb24gY2FuIHNlcnZlIGFzIGFuIGVhc3ktdG8tcmVhZCBidXQgc3RhdGljIGNvcHkuIFlvdSBjYW4gb25seSBydW4gdGhlIGNvZGUgaWYgeW91IG9wZW4gdGhlIGAuUm1kYCBmaWxlIHVzaW5nIFJTdHVkaW8sIHNpbmNlIGl0IGlzIHRoZSBjb2RlIHRoYXQgYnVpbHQgdGhlIHN0YXRpYyB2ZXJzaW9uLgoKV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgLlJtZCBub3RlYm9vayB3aGlsZSB5b3UncmUgdXNpbmcgUlN0dWRpbywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIFRoaXMgd2lsbCBiZSBoYW5keSBmb3Igd29ya2luZyB0aHJvdWdoIHRoZSBtYXRlcmlhbCBvdXRzaWRlIG9mIGNsYXNzIGFuZCB3aGVuIHlvdSB3b3JrIG9uIHlvdXIgb3duIGNvZGUgaW4gdGhlIGZ1dHVyZS4KCiMjIEZpbGUgc3RydWN0dXJlCgpCZWZvcmUgd2UgZ2V0IHN0YXJ0ZWQgaW4gUlN0dWRpbywgbWFrZSBzdXJlIHlvdSBoYXZlIGEgZm9sZGVyIGRlZGljYXRlZCB0byB0aGUgd29ya3Nob3AuIAoKCioqUXVpY2sgYXNpZGU6KiogKkp1c3Qgc28gd2UncmUgYWxsIG9uIHRoZSBzYW1lIHBhZ2UuLi4gY29tcHV0ZXJzIGFyZSBkZXNpZ25lZCB0byBhY3QgbGlrZSBvbGQtc2Nob29sIGZpbGluZyBzeXN0ZW1zLiBUaGV5J3JlIGFsbCBzdHJ1Y3R1cmVkIGxpa2UgYSBmaWxpbmcgY2FiaW5ldCB3aGVyZSBlYWNoIGRyYXdlciBoYXMgZm9sZGVycywgYW5kIGluc2lkZSB0aG9zZSBmb2xkZXJzIGNhbiBiZSBzbWFsbGVyIGZvbGRlcnMsIGFuZCB5b3VyIHBhcGVycyBjYW4gYmUgZmlsZWQgaW4gYW55IG9mIHRoZXNlIGxvY2F0aW9ucy4gT24gYSBjb21wdXRlciwgdGhlcmUgYXJlIGZvbGRlcnMgd2hpY2ggY2FuIGNvbnRhaW4gZmlsZXMgb3IgbW9yZSBmb2xkZXJzLCB3aGljaCBjYW4gaW4gdHVybiBjYW4gY29udGFpbiBmaWxlcyBvciBldmVuIG1vcmUgZm9sZGVycy4gVG8gaWRlbnRpZnkgd2hlcmUgYSBmaWxlIGlzIGxvY2F0ZWQgaW4gdGhlIGNvbXB1dGVyJ3Mgc3RydWN0dXJlLCBldmVyeSBmaWxlIGhhcyBhICJmaWxlIHBhdGgiLCB3aGljaCBpcyBhIGxpc3Qgb2YgZm9sZGVycyBvbmUgd291bGQgbmVlZCB0byBwYXNzIHRocm91Z2ggdG8gYWNjZXNzIHRoZSBmaWxlLioKCgpZb3Ugd2lsbCBiZSBydW5uaW5nIHNvbWV0aGluZyBjYWxsZWQgYW4gUlN0dWRpbyAqKnByb2plY3QqKiAoYC5ScHJvamApLCB3aGljaCB3aWxsIGhvdXNlIGFsbCBvZiB0aGUgZmlsZXMgYW5kIGNvZGUgd2Ugd29yayB3aXRoIGR1cmluZyB0aGUgd29ya3Nob3AuIEhlcmUncyBhbiBleGFtcGxlIGltYWdlIG9mIHdoYXQgeW91ciBmaWxlIHN0cnVjdHVyZSBzaG91bGQgbG9vayBsaWtlLiBJJ3ZlIGNhbGxlZCB0aGUgZm9sZGVyICJBZHZlbnR1cmVzSW5SIiwgYW5kIGl0IGNvbnRhaW5zIHRocmVlIG90aGVyIGZvbGRlcnM6ICJkYXRhIiwgInNjcmlwdHMiLCBhbmQgImZpZ3VyZXMiLgoKIVtdKGltYWdlcy93aW5kb3dzLWZpbGVzLnBuZykKCiFbXShpbWFnZXMvbWFjLWZpbGVzLnBuZykKClNhdmUgdGhlIGAuUm1kYCBmaWxlIGRpcmVjdGx5IGludG8gYEFkdmVudHVyZXNJblJgIGFuZCBvcGVuIGl0IGluIFJTdHVkaW8uCgojIFByZXBhcmluZyBSU3R1ZGlvCgpJZiB5b3UgYXJlIGN1cnJlbnRseSByZWFkaW5nIHRoaXMgaW4gKipSU3R1ZGlvKiosIHRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgKHRoZSBncmVlbiB0cmlhbmdsZSBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgZ3JleSBjZWxsIGJlbG93KSBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgYENtZCtTaGlmdCtFbnRlcmAgKE1hYykgb3IgYEN0cmwrU2hpZnQrRW50ZXJgIChXaW5kb3dzKS4gSWYgeW91IGFyZSBjdXJyZW50bHkgcmVhZGluZyB0aGlzIHVzaW5nIGEgKip3ZWIgYnJvd3NlcioqLCB5b3UgY2FuIGhpZGUgb3Igc2hvdyB0aGUgY29kZSB0aGF0IHByb2R1Y2VzIHZhcmlvdXMgb3V0cHV0cyBieSBjbGlja2luZyB0aGUgKkhpZGUqLypDb2RlKiBidXR0b24gb24gdGhlIHRvcCByaWdodCBvZiB0aGUgY29kZSAiY2VsbCIsIGJ1dCB5b3UgY2Fubm90IGV4ZWN1dGUgdGhlIGNvZGUuIEl0IG1heSBoZWxwIHRvIGhhdmUgdGhpcyBub3RlYm9vayBvcGVuIGluIFJTdHVkaW8gYW5kIGEgYnJvd3NlciB3aW5kb3cgYXQgdGhlIHNhbWUgdGltZSwgc28geW91IGNhbiBuYXZpZ2F0ZSBiZXR3ZWVuIHRoZW0uCgpFeGVjdXRlIHRoaXMgY29kZSBub3csIHRoZW4gc2F2ZSB0aGlzIGZpbGUgKGBDbWQrc2Agb24gTWFjLCBgQ1RSTCtzYCBvbiBXaW5kb3dzKS4gT25jZSB5b3UgaGF2ZSBkb25lIHRoYXQsIGEgZ3JhcGggd2lsbCBhcHBlYXIgYmVsb3cgaW4gUlN0dWRpby4KCmBgYHtyLCBldmFsPVRSVUV9CnBsb3QoY2FycykKYGBgCgpUaGlzIGdyYXBoIHdhcyBnZW5lcmF0ZWQgdXNpbmcgc29tZSBkYXRhIHRoYXQgY29tZXMgcHJlLWxvYWRlZCB3aXRoIHRoZSBiYXNpYyBSIHNvZnR3YXJlLiBIb3dldmVyLCB0byB1c2UgUiB5b3Ugd2lsbCBuZWVkIHRvOgoKMS4gKippbnN0YWxsKioKMi4gKipsb2FkKiosIGFuZAozLiAqKnJ1bioqCgpwYWNrYWdlcyB0aGF0IGRvIG5vdCBhdXRvbWF0aWNhbGx5IGNvbWUgd2l0aCB0aGUgYmFzaWMgUiBzb2Z0d2FyZS4gVGhlc2UgcGFja2FnZXMgY29udGFpbiBpbXBvcnRhbnQgYWRkaXRpb25zIHRvIHRoZSBiYXNpYyBzb2Z0d2FyZSB0aGF0IGFsbG93IHlvdSB0byBwZXJmb3JtIHNvcGhpc3RpY2F0ZWQgYW5hbHlzZXMgYW5kIHByb2R1Y2UgY2xlYXIsIGJlYXV0aWZ1bCB2aXN1YWxpc2F0aW9ucywgYW1vbmcgbWFueSBvdGhlciB0aGluZ3MuIFNvbWUgcGFja2FnZXMgY2FuIHRha2UgYSB3aGlsZSB0byBpbnN0YWxsLCBkZXBlbmRpbmcgb24gdGhlIHNwZWVkIG9mIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4gVGhlcmVmb3JlLCB5b3UgbXVzdCBpbnN0YWxsIHRoZXNlIHBhY2thZ2VzIGJlZm9yZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3b3Jrc2hvcC4gUGxlYXNlIGNvbnRhY3Qgb25lIG9mIHVzIHdlbGwgaW4gYWR2YW5jZSBvZiB0aGUgd29ya3Nob3AgaWYgeW91IGVuY291bnRlciBhbnkgcHJvYmxlbXMgd2l0aCBpbnN0YWxsYXRpb24uCgojIyAxLiBJbnN0YWxsaW5nCgoqKkluc3RhbGxpbmcqKiBhIHBhY2thZ2Ugb25seSBuZWVkcyB0byBiZSBkb25lIG9uY2UgKHBlciBjb21wdXRlcikuIFRoaXMgaXMgYmVjYXVzZSBpbnN0YWxsYXRpb24gaXMgZXF1aXZhbGVudCBvZiBkb3dubG9hZGluZyBhIGZpbGUgZnJvbSB0aGUgaW50ZXJuZXQgYW5kIHN0b3JpbmcgaXQgb24geW91ciBoYXJkIGRyaXZlIChlLmcuLCBMb2NhbCBEaXNrIG9yIEM6IGRyaXZlIG9uIFdpbmRvd3Mgb3IgL0Rvd25sb2Fkcy8gZm9sZGVyIG9uIE1hYykuIE9uY2UgYSBwYWNrYWdlIGhhcyBiZWVuIGRvd25sb2FkZWQsIGl0IGV4aXN0cyBvbiB5b3VyIGNvbXB1dGVyIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlLWRvd25sb2FkZWQgbGF0ZXIuCgpGaXJzdCwgbWFrZSBzdXJlIHlvdSBhcmUgY29ubmVjdGVkIHRvIHRoZSBpbnRlcm5ldC4gSW5zdGFsbCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIG5vdywgYnkgZXhlY3V0aW5nIHRoZSBjb2RlIGJlbG93IGFzIHlvdSBkaWQgaW4gdGhlIHByZXZpb3VzIGNlbGwuCgpgYGB7ciwgZXZhbD1GQUxTRX0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQppbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikKaW5zdGFsbC5wYWNrYWdlcygib3JkaW5hbCIpCmluc3RhbGwucGFja2FnZXMoImJyb29tIikKaW5zdGFsbC5wYWNrYWdlcygiZW1tZWFucyIpCmluc3RhbGwucGFja2FnZXMoIkhtaXNjIikKaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiKQpgYGAKCklmIHlvdSBnZXQgYW4gZXJyb3Igb3IgaWYgbm90aGluZyBzZWVtcyB0byBiZSBoYXBwZW5pbmcsIHlvdSBtYXkgbmVlZCB0byByZXNwb25kIHRvIHRoZSBwcm9ncmFtIGxpa2UgYmVsb3cgKHR5cGUgYHllc2AgYW5kIGhpdCBgRW50ZXJgKS4KYGBgCldvdWxkIHlvdSBsaWtlIHRvIHVzZSBhIHBlcnNvbmFsIGxpYnJhcnkgaW5zdGVhZD8gKHllcy9Oby9jYW5jZWwpIHllcwoKYGBgCgpXaGlsZSB0aGlzIGNvZGUgaXMgcnVubmluZywgYSByZWQgc3F1YXJlICh0aGUgJ3N0b3AnIHN5bWJvbCkgd2lsbCBhcHBlYXIgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiB0aGUgY29kZSBjZWxsLiBXaGVuIGl0IGhhcyBmaW5pc2hlZCBydW5uaW5nLCB0aGUgZ3JlZW4gdHJpYW5nbGUgKHRoZSAncnVuJyBzeW1ib2wpIHdpbGwgcmVhcHBlYXIuIFdhaXQgZm9yIHRoZSBjb2RlIHRvIGZpbmlzaCBiZWZvcmUgbW92aW5nIG9uLiBUaGlzIG1heSB0YWtlIGEgd2hpbGUuIE1ha2Ugc3VyZSB0byBnaXZlIHlvdXJzZWxmIHBsZW50eSBvZiB0aW1lIHRvIHJ1biB0aGlzIGNvZGUsIGFuZCBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSwgY29udGFjdCBvbmUgb2YgdGhlIHdvcmtzaG9wIG9yZ2FuaXNlcnMuCgojIyAyLiBMb2FkaW5nCgpMb2FkaW5nIGEgcGFja2FnZSBpcyBhbiBlbnRpcmVseSBkaWZmZXJlbnQgYWN0aW9uIGZyb20gaW5zdGFsbGluZyBhIHBhY2thZ2UuIEJ5IHRlbGxpbmcgUiB0byBsb2FkIGEgcGFja2FnZSwgeW91IGFyZSBpbnN0cnVjdGluZyBpdCB0byBsb29rIGZvciB0aGUgZmlsZSB5b3UgZG93bmxvYWRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIGFuZCBzb3J0IG9mICJ3YWtlIGl0IHVwIiB3aGlsZSB5b3UgaGF2ZSBSIG9wZW4uIFdoZW4geW91IGNsb3NlIFIsIHRoZSBwYWNrYWdlIHdpbGwgZ28gYmFjayB0byBzbGVlcCBhbmQgeW91J2xsIGhhdmUgdG8gcmVsb2FkIGl0IGFnYWluLiAoWW91IHdpbGwgbm90IGhhdmUgdG8gZG93bmxvYWQgYW5kIGluc3RhbGwgaXQgYWdhaW4sIGFsdGhvdWdoIHlvdSBtYXkgbmVlZCB0byBkb3dubG9hZCB1cGRhdGVzIHBlcmlvZGljYWxseS4pCgpMZXQncyBsb2FkIHRoZSBwYWNrYWdlZCBjYWxsZWQgKmdncGxvdDIqIHJpZ2h0IG5vdyBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBjb2RlLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKYGBgCgpJZiB0aGlzIGNvZGUgd2FzIHN1Y2Nlc3NmdWwsIGl0IHdpbGwgYXBwZWFyIGFzIHRob3VnaCBub3RoaW5nIGhhcHBlbmVkLiBUbyBzaG93IHlvdSB3aGF0ICoqYW4gZXJyb3IqKiBsb29rcyBsaWtlLCBydW4gdGhlIGZvbGxvd2luZyBjb2RlLgoKYGBge3IsIGV2YWw9RkFMU0V9CmxpYnJhcnkoR2dwbG90MikKYGBgCgpIb3BlZnVsbHksIHRoaXMgY29kZSBwcm9kdWNlZCB0ZXh0IHRoYXQgcmVhZHM6CgogICAgRXJyb3IgaW4gbGlicmFyeShHZ3Bsb3QyKSA6IHRoZXJlIGlzIG5vIHBhY2thZ2UgY2FsbGVkIOKAmEdncGxvdDLigJkKICAgIApVaCBvaCEgTG9va3MgbGlrZSAqY2FwaXRhbGlzYXRpb24qIGlzIGltcG9ydGFudCBpbiBSLiBUaGF0IHdpbGwgYmUgc29tZXRoaW5nIHRvIHJlbWVtYmVyIGZvciBsYXRlci4KCiMjIDMuIFJ1bm5pbmcKCkJ5IHRoaXMgcG9pbnQsIHlvdSBoYXZlICoqaW5zdGFsbGVkKiogYW5kICoqbG9hZGVkKiogdGhlIHRocmVlIHBhY2thZ2VzIHlvdSB3aWxsIG5lZWQgZm9yIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdvcmtzaG9wLiBCZWZvcmUgeW91J3JlIGRvbmUgc2V0dGluZyB1cCBSU3R1ZGlvLCB0aG91Z2gsIHlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIHBhY2thZ2VzIGFyZSAqKnJ1bm5pbmcqKiBwcm9wZXJseS4gTGV0J3MgcHJvZHVjZSB0aGF0IGZpcnN0IGdyYXBoIGFnYWluLCBidXQgdGhpcyB0aW1lIHVzaW5nIGNvZGUgb25seSBhdmFpbGFibGUgd2hlbiAnZ2dwbG90MicgaXMgaW5zdGFsbGVkIGFuZCBsb2FkZWQuCgpgYGB7ciwgZXZhbD1UUlVFfQpnZ3Bsb3QoY2FycywgYWVzKHg9c3BlZWQsIHk9ZGlzdCkpICsgZ2VvbV9wb2ludChzaXplPTMsIHNoYXBlPTEpICsgdGhlbWVfYncoKQpgYGAKCklmIGV2ZXJ5dGhpbmcgaGFzIGdvbmUgdG8gcGxhbiwgeW91IHNob3VsZCBub3cgc2VlIGEgc2Vjb25kIGdyYXBoIHRoYXQgbG9va3MgdmVyeSBtdWNoIGxpa2UgdGhlIGZpcnN0IGdyYXBoLiBEb24ndCB3b3JyeSBhYm91dCBob3cgd2UgbWFkZSBpdCB5ZXQhIFRoYXQgd2lsbCBiZSBzb21ldGhpbmcgd2UgZXhwbGFpbiBkdXJpbmcgdGhlIHdvcmtzaG9wLiBSaWdodCBub3csIHdlIGp1c3Qgd2FudCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIHJlYWR5IHRvIGhpdCB0aGUgZ3JvdW5kIHJ1bm5pbmcgb24gdGhlIGZpcnN0IGRheS4KCklmIHlvdSBydW4gaW50byBhbnkgdHJvdWJsZSBiZWZvcmUgdGhlIHdvcmtzaG9wLCAqcGxlYXNlKiBlbWFpbCBvbmUgb2YgdGhlIGluc3RydWN0b3JzIGluIGFkdmFuY2UuIFdlIGNhbiBoZWxwIHlvdSB0cm91Ymxlc2hvb3QgYW5kIGdldCB5b3VyIHRvb2xzIHdvcmtpbmcgYmVmb3JlIHRoZSB3b3Jrc2hvcC4gRHVyaW5nIHRoZSB3b3Jrc2hvcCwgd2Ugd2lsbCBoYXZlIGxpbWl0ZWQgYWJpbGl0eSB0byBoZWxwLCB3aGljaCBjb3VsZCBzbG93IHlvdSBkb3duIG9yIGludGVyZmVyZSB3aXRoIHRoZSB3b3Jrc2hvcC4KClRvIGJlIHNhZmUsIHlvdSBtYXkgYWxzbyB3YW50IHRvIGNyZWF0ZSBhbiBhY2NvdW50IGF0IFBvc2l0IENsb3VkOiBbaHR0cHM6Ly9wb3NpdC5jby9wcm9kdWN0cy9jbG91ZC9jbG91ZC9dKGh0dHBzOi8vcG9zaXQuY28vcHJvZHVjdHMvY2xvdWQvY2xvdWQvKQoKSWYgeW91IGRvIHRoaXMgaW4gYWR2YW5jZSwgYW5kIHNvbWV0aGluZyBnb2VzIHdyb25nIG9uIHRoZSBkYXkgb2YgdGhlIHdvcmtzaG9wLCB5b3Ugd2lsbCBub3QgbmVlZCB0byBsb3NlIGFueSB0aW1lIHdpdGggdHJvdWJsZXNob290aW5nIQoKPiAqKlNlZSB5b3Ugc29vbiEqKg==