Introduction to R Programming
A Modern, Interactive Guide for Livestock Genomics Research
CTLGH Training
2026
Beginner Friendly
Demo Preview
This is a preview showing the first two sections of the R tutorial with enhanced web design and styling.
1 Learning Objectives
📊
R and R Markdown
Understand the basics of R programming and R Markdown for reproducible research
🔢
Algebra in R
Perform mathematical operations and work with variables
📦
Libraries & Packages
Install and load R packages to extend functionality
📁
File Management
Set working directories and organize your project files
📈
Data Visualization
Create publication-quality plots and graphics
💾
Data Export
Write data files and organize reproducible scripts
2 What is R?
About R
R is a free software environment for statistical computing and graphics. One of its key strengths is the ability to create publication-quality plots with minimal effort.
RStudio is a flexible and multi-functional open-source IDE (integrated development environment) that provides a graphical front-end to work with R more efficiently.
Open Source
Free forever, supported by a global community
How R Works
R is used by typing commands into the Console after the
> prompt. Commands can be separated using ;
or by pressing Enter for a new line.
Pro Tip: To run code in R Markdown, click anywhere in the code chunk and then click Run → Run Current Chunk, or use Ctrl + Shift + Enter (Windows) or Cmd + Shift + Return (Mac).
Your First R Command
Try running this code:
"hello world!"
## [1] "hello world!"
# or use the print function
print("hello world!")
## [1] "hello world!"
Learning Note: Like learning any new language, if you encounter errors or aren't sure how to do something, you can search online for help. R has an extensive community with many forums and resources!
Getting Help in R
R has built-in documentation for every function. Here are several
ways to access help:
Using help()
help("print")
Access detailed documentation for any function
Using ?
?print
Quick shortcut to access help pages
# Method 1: Detailed help
help("print")
# Method 2: Quick help
?print
# Method 3: See examples
example("print")
# Method 4: Start HTML help browser
help.start()
Online Resources
Here are essential R resources:
R as a Calculator
R can perform all standard mathematical operations:
# Simple addition
1 + 1
## [1] 2
Try it yourself: Type calculations directly in the R Console at the bottom of RStudio to see instant results!
Key Points
RStudio Interface
Better manage scripts, data, and figures
R Markdown
Combine code and documentation
Reproducible
Share and replicate your analysis
Ready for More?
This is just a preview of Sections 1 & 2. The complete tutorial includes:
Variables & Calculations
Vectors & Matrices
Data Manipulation
Advanced Visualization
LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIFIgUHJvZ3JhbW1pbmciCnN1YnRpdGxlOiAiRW5oYW5jZWQgV2ViIFZlcnNpb24gLSBEZW1vIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKYGBgez1odG1sfQo8bGluayBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Jvb3RzdHJhcEA1LjMuMC9kaXN0L2Nzcy9ib290c3RyYXAubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KPGxpbmsgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZm9udC1hd2Vzb21lLzYuNC4wL2Nzcy9hbGwubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KCjxzdHlsZT4KYm9keSB7CiAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIFRhaG9tYSwgR2VuZXZhLCBWZXJkYW5hLCBzYW5zLXNlcmlmOwogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmOGY5ZmEgMCUsICNlOWVjZWYgMTAwJSk7CiAgZm9udC1zaXplOiAyMHB4OwogIGxpbmUtaGVpZ2h0OiAxLjk7Cn0KCi5oZXJvLXNlY3Rpb24gewogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICM2NjdlZWEgMCUsICM3NjRiYTIgMTAwJSk7CiAgY29sb3I6IHdoaXRlOwogIHBhZGRpbmc6IDgwcHggNDBweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgYm9yZGVyLXJhZGl1czogMTVweDsKICBtYXJnaW46IDAgMCA1MHB4IDA7CiAgYm94LXNoYWRvdzogMCAxMHB4IDMwcHggcmdiYSgwLDAsMCwwLjIpOwp9CgouaGVyby1zZWN0aW9uIGgxIHsKICBmb250LXNpemU6IDMuOHJlbTsKICBmb250LXdlaWdodDogNzAwOwogIG1hcmdpbjogMCAwIDI1cHggMDsKICBjb2xvcjogd2hpdGU7CiAgdGV4dC1zaGFkb3c6IDJweCAycHggNHB4IHJnYmEoMCwwLDAsMC4zKTsKfQoKLmhlcm8tc2VjdGlvbiBwIHsKICBmb250LXNpemU6IDEuOHJlbTsKICBtYXJnaW46IDI1cHggMDsKICBvcGFjaXR5OiAwLjk1Owp9CgouYmFkZ2UtY3VzdG9tIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcGFkZGluZzogMTJweCAyNHB4OwogIG1hcmdpbjogMTBweDsKICBib3JkZXItcmFkaXVzOiAyNXB4OwogIGZvbnQtc2l6ZTogMS4ycmVtOwogIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5mZWF0dXJlLWdyaWQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgzMjBweCwgMWZyKSk7CiAgZ2FwOiAzMHB4OwogIG1hcmdpbjogNDBweCAwOwp9CgouZmVhdHVyZS1jYXJkIHsKICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICBwYWRkaW5nOiAzNXB4OwogIGJvcmRlci1yYWRpdXM6IDE0cHg7CiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCAjNjY3ZWVhOwogIGJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLDAsMCwwLjEpOwogIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7Cn0KCi5mZWF0dXJlLWNhcmQ6aG92ZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtOHB4KTsKICBib3gtc2hhZG93OiAwIDEycHggMjRweCByZ2JhKDAsMCwwLDAuMTUpOwp9CgouZmVhdHVyZS1pY29uIHsKICBmb250LXNpemU6IDMuNXJlbTsKICBtYXJnaW4tYm90dG9tOiAyMHB4OwogIGRpc3BsYXk6IGJsb2NrOwp9CgouZmVhdHVyZS10aXRsZSB7CiAgZm9udC1zaXplOiAxLjZyZW07CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBjb2xvcjogIzJjM2U1MDsKICBtYXJnaW4tYm90dG9tOiAxNXB4OwogIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5mZWF0dXJlLWRlc2MgewogIGNvbG9yOiAjNDk1MDU3OwogIGZvbnQtc2l6ZTogMS4zNXJlbTsKICBsaW5lLWhlaWdodDogMS44Owp9CgouaW5mby1ib3ggewogIHBhZGRpbmc6IDMwcHg7CiAgYm9yZGVyLXJhZGl1czogMTRweDsKICBtYXJnaW46IDM1cHggMDsKICBib3JkZXItbGVmdDogNnB4IHNvbGlkOwogIGZvbnQtc2l6ZTogMS4ycmVtOwogIGxpbmUtaGVpZ2h0OiAxLjk7Cn0KCi5pbmZvLWJveCBoNCwgLmluZm8tYm94IGg1IHsKICBmb250LXNpemU6IDEuNnJlbTsKICBtYXJnaW4tdG9wOiAwOwogIG1hcmdpbi1ib3R0b206IDE1cHg7Cn0KCi5pbmZvLWJveCBwIHsKICBmb250LXNpemU6IDEuMnJlbTsKICBsaW5lLWhlaWdodDogMS45OwogIG1hcmdpbi1ib3R0b206IDE1cHg7Cn0KCi5pbmZvLWJveC1ibHVlIHsKICBiYWNrZ3JvdW5kOiAjZTdmM2ZmOwogIGJvcmRlci1jb2xvcjogIzBlYTVlOTsKICBjb2xvcjogIzA3NTk4NTsKfQoKLmluZm8tYm94LWdyZWVuIHsKICBiYWNrZ3JvdW5kOiAjZjBmZGY0OwogIGJvcmRlci1jb2xvcjogIzEwYjk4MTsKICBjb2xvcjogIzA2NWY0NjsKfQoKLmluZm8tYm94LXllbGxvdyB7CiAgYmFja2dyb3VuZDogI2ZmZmJlYjsKICBib3JkZXItY29sb3I6ICNmNTllMGI7CiAgY29sb3I6ICM5MjQwMGU7Cn0KCi5zZWN0aW9uLW51bWJlciB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHdpZHRoOiA1NXB4OwogIGhlaWdodDogNTVweDsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNjY3ZWVhIDAlLCAjNzY0YmEyIDEwMCUpOwogIGNvbG9yOiB3aGl0ZTsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGxpbmUtaGVpZ2h0OiA1NXB4OwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogIGZvbnQtc2l6ZTogMS42cmVtOwp9CgoucmVzb3VyY2UtY2FyZCB7CiAgYmFja2dyb3VuZDogd2hpdGU7CiAgcGFkZGluZzogMzBweDsKICBib3JkZXItcmFkaXVzOiAxMnB4OwogIG1hcmdpbjogMjBweCAwOwogIGJvcmRlci1sZWZ0OiA2cHggc29saWQgIzY2N2VlYTsKICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLDAsMCwwLjA4KTsKICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogIGZvbnQtc2l6ZTogMS4ycmVtOwp9CgoucmVzb3VyY2UtY2FyZDpob3ZlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwcHgpOwogIGJveC1zaGFkb3c6IDAgNnB4IDE1cHggcmdiYSgwLDAsMCwwLjE1KTsKfQoKLnJlc291cmNlLWNhcmQgaDUgewogIGZvbnQtc2l6ZTogMS41cmVtOwogIG1hcmdpbi1ib3R0b206IDEycHg7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLnJlc291cmNlLWNhcmQgcCB7CiAgZm9udC1zaXplOiAxLjFyZW07Cn0KCi5pY29uLWNhcmQgewogIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgcGFkZGluZzogMzVweDsKICBib3JkZXItcmFkaXVzOiAxNHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXJnaW46IDIwcHggMDsKfQoKLmljb24tY2FyZCBpIHsKICBmb250LXNpemU6IDRyZW07CiAgbWFyZ2luLWJvdHRvbTogMjBweDsKfQoKLmljb24tY2FyZCBoNSB7CiAgZm9udC1zaXplOiAxLjVyZW07CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouaWNvbi1jYXJkIHAgewogIGZvbnQtc2l6ZTogMS4xNXJlbTsKICBsaW5lLWhlaWdodDogMS43Owp9CgpwcmUgewogIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgYm9yZGVyOiAxcHggc29saWQgI2RlZTJlNjsKICBib3JkZXItcmFkaXVzOiAxMHB4OwogIHBhZGRpbmc6IDI1cHg7CiAgbWFyZ2luOiAzMHB4IDA7CiAgZm9udC1zaXplOiAxLjFyZW07CiAgbGluZS1oZWlnaHQ6IDEuODsKfQoKY29kZSB7CiAgYmFja2dyb3VuZDogI2YxZjNmNTsKICBwYWRkaW5nOiA0cHggMTBweDsKICBib3JkZXItcmFkaXVzOiA1cHg7CiAgZm9udC1mYW1pbHk6ICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTsKICBjb2xvcjogI2Q2MzM4NDsKICBmb250LXNpemU6IDEuMXJlbTsKfQoKcHJlIGNvZGUgewogIGZvbnQtc2l6ZTogMS4wNXJlbTsKfQoKaDEgewogIGZvbnQtc2l6ZTogMy4ycmVtOwogIGNvbG9yOiAjMmMzZTUwOwogIGJvcmRlci1ib3R0b206IDRweCBzb2xpZCAjNjY3ZWVhOwogIHBhZGRpbmctYm90dG9tOiAxNXB4OwogIG1hcmdpbi10b3A6IDUwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICBsaW5lLWhlaWdodDogMS4zOwp9CgpoMiB7CiAgZm9udC1zaXplOiAyLjZyZW07CiAgY29sb3I6ICMyYzNlNTA7CiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICM2NjdlZWE7CiAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgbWFyZ2luLXRvcDogNTBweDsKICBtYXJnaW4tYm90dG9tOiAzMHB4OwogIGxpbmUtaGVpZ2h0OiAxLjM7Cn0KCmgzIHsKICBmb250LXNpemU6IDJyZW07CiAgY29sb3I6ICM3NjRiYTI7CiAgbWFyZ2luLXRvcDogNDBweDsKICBtYXJnaW4tYm90dG9tOiAyMHB4OwogIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCmg0IHsKICBmb250LXNpemU6IDEuNnJlbTsKICBmb250LXdlaWdodDogNjAwOwogIG1hcmdpbi1ib3R0b206IDE1cHg7Cn0KCnAgewogIGZvbnQtc2l6ZTogMS4ycmVtOwogIGxpbmUtaGVpZ2h0OiAxLjk7CiAgbWFyZ2luLWJvdHRvbTogMjBweDsKfQoKbGkgewogIGZvbnQtc2l6ZTogMS4ycmVtOwogIGxpbmUtaGVpZ2h0OiAxLjk7CiAgbWFyZ2luLWJvdHRvbTogMTJweDsKfQoKYSB7CiAgZm9udC1zaXplOiAxLjE1cmVtOwogIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCmtiZCB7CiAgYmFja2dyb3VuZDogIzJjM2U1MDsKICBjb2xvcjogd2hpdGU7CiAgcGFkZGluZzogNXB4IDEwcHg7CiAgYm9yZGVyLXJhZGl1czogNXB4OwogIGZvbnQtc2l6ZTogMS4wNXJlbTsKfQoKc21hbGwgewogIGZvbnQtc2l6ZTogMXJlbTsKfQoKLmZpbmFsLWN0YSB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzY2N2VlYSAwJSwgIzc2NGJhMiAxMDAlKTsKICBjb2xvcjogd2hpdGU7CiAgcGFkZGluZzogNTBweDsKICBib3JkZXItcmFkaXVzOiAxNXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXJnaW46IDUwcHggMDsKfQoKLmZpbmFsLWN0YSBoNCB7CiAgY29sb3I6IHdoaXRlOwogIGZvbnQtc2l6ZTogMi4ycmVtOwogIG1hcmdpbi1ib3R0b206IDIwcHg7Cn0KCi5maW5hbC1jdGEgcCB7CiAgZm9udC1zaXplOiAxLjNyZW07CiAgbWFyZ2luLWJvdHRvbTogMjBweDsKfQoKLmZpbmFsLWN0YSBkaXYgZGl2IHsKICBmb250LXNpemU6IDEuMnJlbTsKfQo8L3N0eWxlPgoKPGRpdiBjbGFzcz0iaGVyby1zZWN0aW9uIj4KICA8aDE+PGkgY2xhc3M9ImZhcyBmYS1jb2RlIj48L2k+IEludHJvZHVjdGlvbiB0byBSIFByb2dyYW1taW5nPC9oMT4KICA8cD5BIE1vZGVybiwgSW50ZXJhY3RpdmUgR3VpZGUgZm9yIExpdmVzdG9jayBHZW5vbWljcyBSZXNlYXJjaDwvcD4KICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAyNXB4OyI+CiAgICA8c3BhbiBjbGFzcz0iYmFkZ2UtY3VzdG9tIiBzdHlsZT0iYmFja2dyb3VuZDogI2RiZWFmZTsgY29sb3I6ICMxZTQwYWY7Ij48aSBjbGFzcz0iZmFzIGZhLXVzZXJzIj48L2k+IENUTEdIIFRyYWluaW5nPC9zcGFuPgogICAgPHNwYW4gY2xhc3M9ImJhZGdlLWN1c3RvbSIgc3R5bGU9ImJhY2tncm91bmQ6ICNkMWZhZTU7IGNvbG9yOiAjMDY1ZjQ2OyI+PGkgY2xhc3M9ImZhcyBmYS1jYWxlbmRhciI+PC9pPiAyMDI2PC9zcGFuPgogICAgPHNwYW4gY2xhc3M9ImJhZGdlLWN1c3RvbSIgc3R5bGU9ImJhY2tncm91bmQ6ICNmZWYzYzc7IGNvbG9yOiAjOTI0MDBlOyI+PGkgY2xhc3M9ImZhcyBmYS1jbG9jayI+PC9pPiBCZWdpbm5lciBGcmllbmRseTwvc3Bhbj4KICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJpbmZvLWJveCBpbmZvLWJveC1ibHVlIj4KPGg0PjxpIGNsYXNzPSJmYXMgZmEtaW5mby1jaXJjbGUiPjwvaT4gRGVtbyBQcmV2aWV3PC9oND4KPHA+VGhpcyBpcyBhIHByZXZpZXcgc2hvd2luZyB0aGUgZmlyc3QgdHdvIHNlY3Rpb25zIG9mIHRoZSBSIHR1dG9yaWFsIHdpdGggZW5oYW5jZWQgd2ViIGRlc2lnbiBhbmQgc3R5bGluZy48L3A+CjwvZGl2PgpgYGAKCi0tLQoKIyA8c3BhbiBjbGFzcz0ic2VjdGlvbi1udW1iZXIiPjE8L3NwYW4+IExlYXJuaW5nIE9iamVjdGl2ZXMKCmBgYHs9aHRtbH0KPGRpdiBjbGFzcz0iZmVhdHVyZS1ncmlkIj4KCjxkaXYgY2xhc3M9ImZlYXR1cmUtY2FyZCI+CjxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPvCfk4o8L3NwYW4+CjxkaXYgY2xhc3M9ImZlYXR1cmUtdGl0bGUiPlIgYW5kIFIgTWFya2Rvd248L2Rpdj4KPGRpdiBjbGFzcz0iZmVhdHVyZS1kZXNjIj5VbmRlcnN0YW5kIHRoZSBiYXNpY3Mgb2YgUiBwcm9ncmFtbWluZyBhbmQgUiBNYXJrZG93biBmb3IgcmVwcm9kdWNpYmxlIHJlc2VhcmNoPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0iZmVhdHVyZS1jYXJkIj4KPHNwYW4gY2xhc3M9ImZlYXR1cmUtaWNvbiI+8J+Uojwvc3Bhbj4KPGRpdiBjbGFzcz0iZmVhdHVyZS10aXRsZSI+QWxnZWJyYSBpbiBSPC9kaXY+CjxkaXYgY2xhc3M9ImZlYXR1cmUtZGVzYyI+UGVyZm9ybSBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBhbmQgd29yayB3aXRoIHZhcmlhYmxlczwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9ImZlYXR1cmUtY2FyZCI+CjxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPvCfk6Y8L3NwYW4+CjxkaXYgY2xhc3M9ImZlYXR1cmUtdGl0bGUiPkxpYnJhcmllcyAmIFBhY2thZ2VzPC9kaXY+CjxkaXYgY2xhc3M9ImZlYXR1cmUtZGVzYyI+SW5zdGFsbCBhbmQgbG9hZCBSIHBhY2thZ2VzIHRvIGV4dGVuZCBmdW5jdGlvbmFsaXR5PC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0iZmVhdHVyZS1jYXJkIj4KPHNwYW4gY2xhc3M9ImZlYXR1cmUtaWNvbiI+8J+TgTwvc3Bhbj4KPGRpdiBjbGFzcz0iZmVhdHVyZS10aXRsZSI+RmlsZSBNYW5hZ2VtZW50PC9kaXY+CjxkaXYgY2xhc3M9ImZlYXR1cmUtZGVzYyI+U2V0IHdvcmtpbmcgZGlyZWN0b3JpZXMgYW5kIG9yZ2FuaXplIHlvdXIgcHJvamVjdCBmaWxlczwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9ImZlYXR1cmUtY2FyZCI+CjxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPvCfk4g8L3NwYW4+CjxkaXYgY2xhc3M9ImZlYXR1cmUtdGl0bGUiPkRhdGEgVmlzdWFsaXphdGlvbjwvZGl2Pgo8ZGl2IGNsYXNzPSJmZWF0dXJlLWRlc2MiPkNyZWF0ZSBwdWJsaWNhdGlvbi1xdWFsaXR5IHBsb3RzIGFuZCBncmFwaGljczwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9ImZlYXR1cmUtY2FyZCI+CjxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPvCfkr48L3NwYW4+CjxkaXYgY2xhc3M9ImZlYXR1cmUtdGl0bGUiPkRhdGEgRXhwb3J0PC9kaXY+CjxkaXYgY2xhc3M9ImZlYXR1cmUtZGVzYyI+V3JpdGUgZGF0YSBmaWxlcyBhbmQgb3JnYW5pemUgcmVwcm9kdWNpYmxlIHNjcmlwdHM8L2Rpdj4KPC9kaXY+Cgo8L2Rpdj4KYGBgCgotLS0KCiMgPHNwYW4gY2xhc3M9InNlY3Rpb24tbnVtYmVyIj4yPC9zcGFuPiBXaGF0IGlzIFI/CgpgYGB7PWh0bWx9CjxkaXYgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiAyMHB4OyBtYXJnaW46IDMwcHggMDsiPgoKPGRpdiBjbGFzcz0iaW5mby1ib3ggaW5mby1ib3gtZ3JlZW4iPgo8aDU+PGkgY2xhc3M9ImZhcyBmYS1jaGVjay1jaXJjbGUiPjwvaT4gQWJvdXQgUjwvaDU+CjxwPjxzdHJvbmc+Ujwvc3Ryb25nPiBpcyBhIGZyZWUgc29mdHdhcmUgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZyBhbmQgZ3JhcGhpY3MuIE9uZSBvZiBpdHMga2V5IHN0cmVuZ3RocyBpcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgcHVibGljYXRpb24tcXVhbGl0eSBwbG90cyB3aXRoIG1pbmltYWwgZWZmb3J0LjwvcD4KPHA+PHN0cm9uZz5SU3R1ZGlvPC9zdHJvbmc+IGlzIGEgZmxleGlibGUgYW5kIG11bHRpLWZ1bmN0aW9uYWwgb3Blbi1zb3VyY2UgSURFIChpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50KSB0aGF0IHByb3ZpZGVzIGEgZ3JhcGhpY2FsIGZyb250LWVuZCB0byB3b3JrIHdpdGggUiBtb3JlIGVmZmljaWVudGx5LjwvcD4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJpY29uLWNhcmQiPgo8aSBjbGFzcz0iZmFiIGZhLXItcHJvamVjdCIgc3R5bGU9ImNvbG9yOiAjNjY3ZWVhOyI+PC9pPgo8aDU+T3BlbiBTb3VyY2U8L2g1Pgo8cCBzdHlsZT0iY29sb3I6ICM2Yzc1N2Q7IGZvbnQtc2l6ZTogMS4wNXJlbTsiPkZyZWUgZm9yZXZlciwgc3VwcG9ydGVkIGJ5IGEgZ2xvYmFsIGNvbW11bml0eTwvcD4KPC9kaXY+Cgo8L2Rpdj4KYGBgCgojIyBIb3cgUiBXb3JrcwoKUiBpcyB1c2VkIGJ5IHR5cGluZyBjb21tYW5kcyBpbnRvIHRoZSBDb25zb2xlIGFmdGVyIHRoZSBgPmAgcHJvbXB0LiBDb21tYW5kcyBjYW4gYmUgc2VwYXJhdGVkIHVzaW5nIGA7YCBvciBieSBwcmVzc2luZyBFbnRlciBmb3IgYSBuZXcgbGluZS4KCmBgYHs9aHRtbH0KPGRpdiBjbGFzcz0iaW5mby1ib3ggaW5mby1ib3gteWVsbG93Ij4KPGkgY2xhc3M9ImZhcyBmYS1saWdodGJ1bGIiPjwvaT4gPHN0cm9uZz5Qcm8gVGlwOjwvc3Ryb25nPiBUbyBydW4gY29kZSBpbiBSIE1hcmtkb3duLCBjbGljayBhbnl3aGVyZSBpbiB0aGUgY29kZSBjaHVuayBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJ1biDihpIgUnVuIEN1cnJlbnQgQ2h1bms8L3N0cm9uZz4sIG9yIHVzZSA8a2JkPkN0cmw8L2tiZD4gKyA8a2JkPlNoaWZ0PC9rYmQ+ICsgPGtiZD5FbnRlcjwva2JkPiAoV2luZG93cykgb3IgPGtiZD5DbWQ8L2tiZD4gKyA8a2JkPlNoaWZ0PC9rYmQ+ICsgPGtiZD5SZXR1cm48L2tiZD4gKE1hYykuCjwvZGl2PgpgYGAKCiMjIyBZb3VyIEZpcnN0IFIgQ29tbWFuZAoKVHJ5IHJ1bm5pbmcgdGhpcyBjb2RlOgoKYGBge3IgaGVsbG8td29ybGR9CiJoZWxsbyB3b3JsZCEiCgojIG9yIHVzZSB0aGUgcHJpbnQgZnVuY3Rpb24KcHJpbnQoImhlbGxvIHdvcmxkISIpCmBgYAoKYGBgez1odG1sfQo8ZGl2IGNsYXNzPSJpbmZvLWJveCBpbmZvLWJveC1ibHVlIj4KPGkgY2xhc3M9ImZhcyBmYS1ncmFkdWF0aW9uLWNhcCI+PC9pPiA8c3Ryb25nPkxlYXJuaW5nIE5vdGU6PC9zdHJvbmc+IExpa2UgbGVhcm5pbmcgYW55IG5ldyBsYW5ndWFnZSwgaWYgeW91IGVuY291bnRlciBlcnJvcnMgb3IgYXJlbid0IHN1cmUgaG93IHRvIGRvIHNvbWV0aGluZywgeW91IGNhbiBzZWFyY2ggb25saW5lIGZvciBoZWxwLiBSIGhhcyBhbiBleHRlbnNpdmUgY29tbXVuaXR5IHdpdGggbWFueSBmb3J1bXMgYW5kIHJlc291cmNlcyEKPC9kaXY+CmBgYAoKLS0tCgojIyA8aSBjbGFzcz0iZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSI+PC9pPiBHZXR0aW5nIEhlbHAgaW4gUgoKUiBoYXMgYnVpbHQtaW4gZG9jdW1lbnRhdGlvbiBmb3IgZXZlcnkgZnVuY3Rpb24uIEhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBhY2Nlc3MgaGVscDoKCmBgYHs9aHRtbH0KPGRpdiBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDIwcHg7IG1hcmdpbjogMjVweCAwOyI+Cgo8ZGl2IGNsYXNzPSJyZXNvdXJjZS1jYXJkIj4KPGg1PjxpIGNsYXNzPSJmYXMgZmEtYm9vayIgc3R5bGU9ImNvbG9yOiAjNjY3ZWVhOyI+PC9pPiBVc2luZyBoZWxwKCk8L2g1Pgo8cHJlIHN0eWxlPSJtYXJnaW46IDEwcHggMDsiPjxjb2RlPmhlbHAoInByaW50Iik8L2NvZGU+PC9wcmU+CjxwIHN0eWxlPSJjb2xvcjogIzZjNzU3ZDsgbWFyZ2luOiAwOyI+QWNjZXNzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBmdW5jdGlvbjwvcD4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJyZXNvdXJjZS1jYXJkIj4KPGg1PjxpIGNsYXNzPSJmYXMgZmEtc2VhcmNoIiBzdHlsZT0iY29sb3I6ICM2NjdlZWE7Ij48L2k+IFVzaW5nID88L2g1Pgo8cHJlIHN0eWxlPSJtYXJnaW46IDEwcHggMDsiPjxjb2RlPj9wcmludDwvY29kZT48L3ByZT4KPHAgc3R5bGU9ImNvbG9yOiAjNmM3NTdkOyBtYXJnaW46IDA7Ij5RdWljayBzaG9ydGN1dCB0byBhY2Nlc3MgaGVscCBwYWdlczwvcD4KPC9kaXY+Cgo8L2Rpdj4KYGBgCgpgYGB7ciBoZWxwLWNvbW1hbmRzLCBldmFsPUZBTFNFfQojIE1ldGhvZCAxOiBEZXRhaWxlZCBoZWxwCmhlbHAoInByaW50IikKCiMgTWV0aG9kIDI6IFF1aWNrIGhlbHAKP3ByaW50CgojIE1ldGhvZCAzOiBTZWUgZXhhbXBsZXMKZXhhbXBsZSgicHJpbnQiKQoKIyBNZXRob2QgNDogU3RhcnQgSFRNTCBoZWxwIGJyb3dzZXIKaGVscC5zdGFydCgpCmBgYAoKIyMjIDxpIGNsYXNzPSJmYXMgZmEtZ2xvYmUiPjwvaT4gT25saW5lIFJlc291cmNlcwoKSGVyZSBhcmUgZXNzZW50aWFsIFIgcmVzb3VyY2VzOgoKYGBgez1odG1sfQo8ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTVweDsiPgoKPGRpdiBjbGFzcz0icmVzb3VyY2UtY2FyZCI+CjxpIGNsYXNzPSJmYXMgZmEtZmlsZS1hbHQiIHN0eWxlPSJjb2xvcjogIzY2N2VlYTsiPjwvaT4gPHN0cm9uZz5SIERvY3VtZW50YXRpb248L3N0cm9uZz48YnI+CjxzbWFsbCBzdHlsZT0iY29sb3I6ICM2Yzc1N2Q7Ij5Db21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb24gb24gUiB0b29scyBhbmQgcGFja2FnZXM8L3NtYWxsPjxicj4KPGEgaHJlZj0iaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnLyIgdGFyZ2V0PSJfYmxhbmsiPnJkb2N1bWVudGF0aW9uLm9yZyDihpI8L2E+CjwvZGl2PgoKPGRpdiBjbGFzcz0icmVzb3VyY2UtY2FyZCI+CjxpIGNsYXNzPSJmYWIgZmEtc3RhY2stb3ZlcmZsb3ciIHN0eWxlPSJjb2xvcjogIzY2N2VlYTsiPjwvaT4gPHN0cm9uZz5TdGFjayBPdmVyZmxvdzwvc3Ryb25nPjxicj4KPHNtYWxsIHN0eWxlPSJjb2xvcjogIzZjNzU3ZDsiPlEmQSBjb21tdW5pdHkgZm9yIHByb2dyYW1taW5nIGNoYWxsZW5nZXM8L3NtYWxsPjxicj4KPGEgaHJlZj0iaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMiIHRhcmdldD0iX2JsYW5rIj5zdGFja292ZXJmbG93LmNvbSDihpI8L2E+CjwvZGl2PgoKPGRpdiBjbGFzcz0icmVzb3VyY2UtY2FyZCI+CjxpIGNsYXNzPSJmYXMgZmEtZmlsZS1wZGYiIHN0eWxlPSJjb2xvcjogIzY2N2VlYTsiPjwvaT4gPHN0cm9uZz5SU3R1ZGlvIENoZWF0c2hlZXRzPC9zdHJvbmc+PGJyPgo8c21hbGwgc3R5bGU9ImNvbG9yOiAjNmM3NTdkOyI+UXVpY2sgcmVmZXJlbmNlIGd1aWRlcyBmb3IgY29tbW9uIHRhc2tzPC9zbWFsbD48YnI+CjxhIGhyZWY9Imh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vY2hlYXRzaGVldHMvaHRtbC9yc3R1ZGlvLWlkZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+cnN0dWRpby5naXRodWIuaW8g4oaSPC9hPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InJlc291cmNlLWNhcmQiPgo8aSBjbGFzcz0iZmFzIGZhLWxheWVyLWdyb3VwIiBzdHlsZT0iY29sb3I6ICM2NjdlZWE7Ij48L2k+IDxzdHJvbmc+VGlkeXZlcnNlPC9zdHJvbmc+PGJyPgo8c21hbGwgc3R5bGU9ImNvbG9yOiAjNmM3NTdkOyI+Q29sbGVjdGlvbiBvZiBtb2Rlcm4gUiBwYWNrYWdlcyBmb3IgZGF0YSBzY2llbmNlPC9zbWFsbD48YnI+CjxhIGhyZWY9Imh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvIiB0YXJnZXQ9Il9ibGFuayI+dGlkeXZlcnNlLm9yZyDihpI8L2E+CjwvZGl2PgoKPC9kaXY+CmBgYAoKLS0tCgojIyA8aSBjbGFzcz0iZmFzIGZhLWNhbGN1bGF0b3IiPjwvaT4gUiBhcyBhIENhbGN1bGF0b3IKClIgY2FuIHBlcmZvcm0gYWxsIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zOgoKYGBge3IgY2FsY3VsYXRvcn0KIyBTaW1wbGUgYWRkaXRpb24KMSArIDEKYGBgCgpgYGB7PWh0bWx9CjxkaXYgY2xhc3M9ImluZm8tYm94IGluZm8tYm94LWJsdWUiPgo8aSBjbGFzcz0iZmFzIGZhLXRlcm1pbmFsIj48L2k+IDxzdHJvbmc+VHJ5IGl0IHlvdXJzZWxmOjwvc3Ryb25nPiBUeXBlIGNhbGN1bGF0aW9ucyBkaXJlY3RseSBpbiB0aGUgUiBDb25zb2xlIGF0IHRoZSBib3R0b20gb2YgUlN0dWRpbyB0byBzZWUgaW5zdGFudCByZXN1bHRzIQo8L2Rpdj4KYGBgCgojIyMgS2V5IFBvaW50cwoKYGBgez1odG1sfQo8ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOyBnYXA6IDIwcHg7IG1hcmdpbjogMzBweCAwOyI+Cgo8ZGl2IGNsYXNzPSJpY29uLWNhcmQiPgo8aSBjbGFzcz0iZmFzIGZhLWxhcHRvcC1jb2RlIiBzdHlsZT0iY29sb3I6ICM2NjdlZWE7Ij48L2k+CjxwIHN0eWxlPSJtYXJnaW46IDEwcHggMCAwIDA7Ij48c3Ryb25nPlJTdHVkaW8gSW50ZXJmYWNlPC9zdHJvbmc+PGJyPjxzbWFsbCBzdHlsZT0iY29sb3I6ICM2Yzc1N2Q7Ij5CZXR0ZXIgbWFuYWdlIHNjcmlwdHMsIGRhdGEsIGFuZCBmaWd1cmVzPC9zbWFsbD48L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0iaWNvbi1jYXJkIj4KPGkgY2xhc3M9ImZhcyBmYS1maWxlLWNvZGUiIHN0eWxlPSJjb2xvcjogIzEwYjk4MTsiPjwvaT4KPHAgc3R5bGU9Im1hcmdpbjogMTBweCAwIDAgMDsiPjxzdHJvbmc+UiBNYXJrZG93bjwvc3Ryb25nPjxicj48c21hbGwgc3R5bGU9ImNvbG9yOiAjNmM3NTdkOyI+Q29tYmluZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uPC9zbWFsbD48L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0iaWNvbi1jYXJkIj4KPGkgY2xhc3M9ImZhcyBmYS1zeW5jLWFsdCIgc3R5bGU9ImNvbG9yOiAjZjU5ZTBiOyI+PC9pPgo8cCBzdHlsZT0ibWFyZ2luOiAxMHB4IDAgMCAwOyI+PHN0cm9uZz5SZXByb2R1Y2libGU8L3N0cm9uZz48YnI+PHNtYWxsIHN0eWxlPSJjb2xvcjogIzZjNzU3ZDsiPlNoYXJlIGFuZCByZXBsaWNhdGUgeW91ciBhbmFseXNpczwvc21hbGw+PC9wPgo8L2Rpdj4KCjwvZGl2PgpgYGAKCi0tLQoKYGBgez1odG1sfQo8ZGl2IGNsYXNzPSJmaW5hbC1jdGEiPgo8aDQ+PGkgY2xhc3M9ImZhcyBmYS1yb2NrZXQiPjwvaT4gUmVhZHkgZm9yIE1vcmU/PC9oND4KPHAgc3R5bGU9ImZvbnQtc2l6ZTogMS4xNXJlbTsiPlRoaXMgaXMganVzdCBhIHByZXZpZXcgb2YgU2VjdGlvbnMgMSAmIDIuIFRoZSBjb21wbGV0ZSB0dXRvcmlhbCBpbmNsdWRlczo8L3A+CjxkaXYgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7IGdhcDogMTVweDsgbWFyZ2luOiAyMHB4IDA7IGZvbnQtc2l6ZTogMS4wNXJlbTsiPgo8ZGl2PjxpIGNsYXNzPSJmYXMgZmEtY2hlY2siPjwvaT4gVmFyaWFibGVzICYgQ2FsY3VsYXRpb25zPC9kaXY+CjxkaXY+PGkgY2xhc3M9ImZhcyBmYS1jaGVjayI+PC9pPiBWZWN0b3JzICYgTWF0cmljZXM8L2Rpdj4KPGRpdj48aSBjbGFzcz0iZmFzIGZhLWNoZWNrIj48L2k+IERhdGEgTWFuaXB1bGF0aW9uPC9kaXY+CjxkaXY+PGkgY2xhc3M9ImZhcyBmYS1jaGVjayI+PC9pPiBBZHZhbmNlZCBWaXN1YWxpemF0aW9uPC9kaXY+CjwvZGl2Pgo8L2Rpdj4KCjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Jvb3RzdHJhcEA1LjMuMC9kaXN0L2pzL2Jvb3RzdHJhcC5idW5kbGUubWluLmpzIj48L3NjcmlwdD4KYGBgCg==