Last updated: 2025-02-04

Checks: 7 0

Knit directory: analysis-user-group/

This reproducible R Markdown analysis was created with workflowr (version 1.7.1). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(1337) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version 525ffe6. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .DS_Store
    Ignored:    analysis/.DS_Store

Unstaged changes:
    Modified:   workflow.R

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/0_start.Rmd) and HTML (docs/0_start.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
html f654b8d DrThomasOneil 2025-02-04 Build site.
Rmd e6ea78d DrThomasOneil 2025-02-04 wflow_publish(c("analysis/*.Rmd"))
html 4968925 DrThomasOneil 2025-01-30 Build site.
html 299ff3d DrThomasOneil 2025-01-28 Build site.
Rmd 272b312 DrThomasOneil 2025-01-28 wflow_publish(c("analysis/*"))
html 023005d DrThomasOneil 2025-01-07 Build site.
Rmd 0ecb65d DrThomasOneil 2025-01-07 Updated Getting Started in R. Chapter 1 completed
html c893d70 DrThomasOneil 2025-01-06 Build site.
Rmd 8eec2ce DrThomasOneil 2025-01-06 Initial Deployment
html 660b0f8 DrThomasOneil 2025-01-06 Build site.
html 2e79a1d DrThomasOneil 2025-01-06 Build site.
Rmd 451a21f DrThomasOneil 2025-01-06 Initial Deployment
Rmd 2eeb8dc DrThomasOneil 2024-12-26 first draft

This 10-chapter workshop series is designed to introduce users to R programming with a focus on bioinformatics workflows and reproducibility. It emphasizes the mindset shift required to transition from manual tools like Excel to programmatic data analysis.

Estimated time: 1.5 hours

Start the Tutorial →

Introduction: Shifting mindsets to programming

Goals:
Introduce programming concepts and the mindset behind programmatic workflows.
  • Transition from manual tools (e.g. Excel & Prism) to programming-based workflows.
  • Understand the concept of handling data using code.
  • Learn to navigate directories and file paths programmatically.
  • Emphasize reproducibility and structured workflows.

Go to Chapter →

Chapter 1: Getting Started with R and RStudio

Goals:
Set up R and RStudio, and get familiar with the interface.
  • Understand what a programming language is.
  • Know the difference between R, RStudio and python.
  • Install R and RStudio.
  • Exploring the interface – Console, Environment, Scripts.
  • Installing and loading packages.
  • Start your first project.

Go to Chapter →

Chapter 2: Data Types and Structures

Goals:
Learn about data types and structures in R.
  • Basic data types: numeric, character, logical.
  • Data structures: vectors, matrices, data frames, lists.
  • Assessing and querying data types and structures.
  • Importing data (RDS, Excel, CSV files).

Go to Chapter →

Chapter 3: Basic Programming

Goals:
Understand programming logic for automating tasks.
  • Variables and assignments.
  • Conditional statements (if, else).
  • Loops (for, while).
  • Writing functions.

Go to Chapter →

Coming Soon

Chapter 4: Data Manipulation with tidyverse

Goals:
Introduce tidyverse for filtering, mutating, summarizing and pivoting data.
  • Filtering rows (filter()), selecting columns (select()).   • Adding new columns (mutate()).   • Grouping and summarizing (group_by() + summarize()).   • Pivot longer and Pivot wider

Go to Chapter →

Chapter 5: Visualization with ggplot2 – Part 1

Goals:
Create and customize visualizations using ggplot2.
  • Basics of ggplot2
  • Make a scatterplot, boxplot and column graph
  • Customise labels, themes, and colors.

Go to Chapter →

Chapter 6: Advanced Visualization with ggplot2 – Part 2

Goals:
Learn additional visualisation techniques.
  • Adjusting theme elements
  • Annotating the plots
  • facet_wrap() and grid_plot()
  • Savings plots

Go to Chapter →

Chapter 7: Statistical Analysis

Goals:
Apply simple statistic to the synthetic data.
  • Descriptive statistics: mean, median, mode.
  • Hypothesis testing (t-tests, ANOVA).
  • Correlation and regression.

Go to Chapter →

Chapter 8: Reproducible Reports with RMarkdown

Content coming soon!

Goals:
Build a dynamic and shareable report of your analysis.
  • Introduction to RMarkdown.
  • Combining text, code, and visuals.
  • Generate tables with knitr.
  • Editing the yaml for additional customisations.
  • Exporting to PDF and HTML.

Go to Chapter →

Conclusions

Go to Chapter →


sessionInfo()
R version 4.4.0 (2024-04-24)
Platform: aarch64-apple-darwin20
Running under: macOS Sonoma 14.3

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Australia/Sydney
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] workflowr_1.7.1

loaded via a namespace (and not attached):
 [1] vctrs_0.6.5       httr_1.4.7        cli_3.6.3         knitr_1.49       
 [5] rlang_1.1.4       xfun_0.50         stringi_1.8.4     processx_3.8.4   
 [9] promises_1.3.2    jsonlite_1.8.9    glue_1.8.0        rprojroot_2.0.4  
[13] git2r_0.35.0      htmltools_0.5.8.1 httpuv_1.6.15     ps_1.8.1         
[17] sass_0.4.9        fansi_1.0.6       rmarkdown_2.29    tibble_3.2.1     
[21] jquerylib_0.1.4   evaluate_1.0.1    fastmap_1.2.0     yaml_2.3.10      
[25] lifecycle_1.0.4   whisker_0.4.1     stringr_1.5.1     compiler_4.4.0   
[29] fs_1.6.5          pkgconfig_2.0.3   Rcpp_1.0.13-1     rstudioapi_0.17.1
[33] later_1.4.1       digest_0.6.37     R6_2.5.1          utf8_1.2.4       
[37] pillar_1.9.0      callr_3.7.6       magrittr_2.0.3    bslib_0.8.0      
[41] tools_4.4.0       cachem_1.1.0      getPass_0.2-4    
LS0tCnRpdGxlOiAiR2V0dGluZyBTdGFydGVkIGluIFIgKDIwMjUpIgphdXRob3I6ICJUaG9tYXMgUi4gTydOZWlsIgpvdXRwdXQ6CiAgd29ya2Zsb3dyOjp3Zmxvd19odG1sOgogICAgdG9jOiBubwotLS0KCmBgYHtodG1sLCBpbmNsdWRlPUZ9CjxzY3JpcHQ+CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgY29uc3QgY2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKTsKICBjaGVja2JveGVzLmZvckVhY2goKGNoZWNrYm94KSA9PiB7CiAgICBjaGVja2JveC5jaGVja2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oY2hlY2tib3guaWQpID09PSAndHJ1ZSc7CiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGNoZWNrYm94LmlkLCBjaGVja2JveC5jaGVja2VkKTsKICAgIH0pOwogIH0pOwp9KTsKPC9zY3JpcHQ+CmBgYAoKVGhpcyAxMC1jaGFwdGVyIHdvcmtzaG9wIHNlcmllcyBpcyBkZXNpZ25lZCB0byBpbnRyb2R1Y2UgdXNlcnMgdG8gUiBwcm9ncmFtbWluZyB3aXRoIGEgZm9jdXMgb24gYmlvaW5mb3JtYXRpY3Mgd29ya2Zsb3dzIGFuZCByZXByb2R1Y2liaWxpdHkuIEl0IGVtcGhhc2l6ZXMgdGhlIG1pbmRzZXQgc2hpZnQgcmVxdWlyZWQgdG8gdHJhbnNpdGlvbiBmcm9tIG1hbnVhbCB0b29scyBsaWtlIEV4Y2VsIHRvIHByb2dyYW1tYXRpYyBkYXRhIGFuYWx5c2lzLgoKPHJlYWQtdGltZT48aT4qKkVzdGltYXRlZCB0aW1lKio6IDEuNSBob3VyczwvaT48L3JlYWQtdGltZT48d2ltcj4KCltTdGFydCB0aGUgVHV0b3JpYWwg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL2FuYWx5c2lzLXVzZXItZ3JvdXAvci10dXRvcmlhbC9fYm9vay9pbmRleC5odG1sKQoKPHdpbXI+CgojIyAqKkludHJvZHVjdGlvbjogU2hpZnRpbmcgbWluZHNldHMgdG8gcHJvZ3JhbW1pbmcqKgoKPGRpdiBjbGFzcz0iaGludC1nb2FscyI+ICAgIAoqKkdvYWxzOioqICAgIApJbnRyb2R1Y2UgcHJvZ3JhbW1pbmcgY29uY2VwdHMgYW5kIHRoZSBtaW5kc2V0IGJlaGluZCBwcm9ncmFtbWF0aWMgd29ya2Zsb3dzLiAgIAombmJzcDsmbmJzcDsmIzgyMjY7IFRyYW5zaXRpb24gZnJvbSBtYW51YWwgdG9vbHMgKGUuZy4gRXhjZWwgJiBQcmlzbSkgdG8gcHJvZ3JhbW1pbmctYmFzZWQgd29ya2Zsb3dzLiAgCiZuYnNwOyZuYnNwOyYjODIyNjsgVW5kZXJzdGFuZCB0aGUgY29uY2VwdCBvZiBoYW5kbGluZyBkYXRhIHVzaW5nIGNvZGUuICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBMZWFybiB0byBuYXZpZ2F0ZSBkaXJlY3RvcmllcyBhbmQgZmlsZSBwYXRocyBwcm9ncmFtbWF0aWNhbGx5LiAgCiZuYnNwOyZuYnNwOyYjODIyNjsgRW1waGFzaXplIHJlcHJvZHVjaWJpbGl0eSBhbmQgc3RydWN0dXJlZCB3b3JrZmxvd3MuICAgIAo8L2Rpdj4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svaW50cm9kdWN0aW9uLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciAxOiBHZXR0aW5nIFN0YXJ0ZWQgd2l0aCBSIGFuZCBSU3R1ZGlvKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgCioqR29hbHM6KiogIApTZXQgdXAgUiBhbmQgUlN0dWRpbywgYW5kIGdldCBmYW1pbGlhciB3aXRoIHRoZSBpbnRlcmZhY2UuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IFVuZGVyc3RhbmQgd2hhdCBhIHByb2dyYW1taW5nIGxhbmd1YWdlICppcyouICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEtub3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBSLCBSU3R1ZGlvIGFuZCBweXRob24uICAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBJbnN0YWxsIFIgYW5kIFJTdHVkaW8uICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgRXhwbG9yaW5nIHRoZSBpbnRlcmZhY2Ug4oCTIENvbnNvbGUsIEVudmlyb25tZW50LCBTY3JpcHRzLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBJbnN0YWxsaW5nIGFuZCBsb2FkaW5nIHBhY2thZ2VzLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBTdGFydCB5b3VyIGZpcnN0IHByb2plY3QuICAgCjwvZGl2PgoKW0dvIHRvIENoYXB0ZXIg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL2FuYWx5c2lzLXVzZXItZ3JvdXAvci10dXRvcmlhbC9fYm9vay9jaGFwdGVyLTEtZ2V0dGluZy1zdGFydGVkLWluLXItYW5kLXJzdHVkaW8uaHRtbCkKCjx3aW1yPgoKIyMgKipDaGFwdGVyIDI6IERhdGEgVHlwZXMgYW5kIFN0cnVjdHVyZXMqKgoKPGRpdiBjbGFzcz0iaGludC1nb2FscyI+ICAKKipHb2FsczoqKiAgCkxlYXJuIGFib3V0IGRhdGEgdHlwZXMgYW5kIHN0cnVjdHVyZXMgaW4gUi4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBCYXNpYyBkYXRhIHR5cGVzOiBudW1lcmljLCBjaGFyYWN0ZXIsIGxvZ2ljYWwuICAgICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgRGF0YSBzdHJ1Y3R1cmVzOiB2ZWN0b3JzLCBtYXRyaWNlcywgZGF0YSBmcmFtZXMsIGxpc3RzLiAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEFzc2Vzc2luZyBhbmQgcXVlcnlpbmcgZGF0YSB0eXBlcyBhbmQgc3RydWN0dXJlcy4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBJbXBvcnRpbmcgZGF0YSAoUkRTLCBFeGNlbCwgQ1NWIGZpbGVzKS4gIAo8L2Rpdj4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci0yLWRhdGEtdHlwZXMtYW5kLXN0cnVjdHVyZXMuaHRtbCkKCjx3aW1yPgoKIyMgKipDaGFwdGVyIDM6IEJhc2ljIFByb2dyYW1taW5nKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgICAgIAoqKkdvYWxzOioqICAgICAKVW5kZXJzdGFuZCBwcm9ncmFtbWluZyBsb2dpYyBmb3IgYXV0b21hdGluZyB0YXNrcy4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBWYXJpYWJsZXMgYW5kIGFzc2lnbm1lbnRzLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBDb25kaXRpb25hbCBzdGF0ZW1lbnRzIChgaWZgLCBgZWxzZWApLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBMb29wcyAoYGZvcmAsIGB3aGlsZWApLiAgIAombmJzcDsmbmJzcDsmIzgyMjY7IFdyaXRpbmcgZnVuY3Rpb25zLiAgICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItMy1iYXNpYy1wcm9ncmFtbWluZy5odG1sKQoKPHdpbXI+Cgo8ZGV0YWlscz48c3VtbWFyeT4qKkNvbWluZyBTb29uKio8L3N1bW1hcnk+CgojIyAqKkNoYXB0ZXIgNDogRGF0YSBNYW5pcHVsYXRpb24gd2l0aCBgdGlkeXZlcnNlYCoqCgo8ZGl2IGNsYXNzPSJoaW50LWdvYWxzIj4gICAgICAKKipHb2FsczoqKiAgICAgCkludHJvZHVjZSBgdGlkeXZlcnNlYCBmb3IgZmlsdGVyaW5nLCBtdXRhdGluZywgc3VtbWFyaXppbmcgYW5kIHBpdm90aW5nIGRhdGEuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEZpbHRlcmluZyByb3dzIChgZmlsdGVyKClgKSwgc2VsZWN0aW5nIGNvbHVtbnMgKGBzZWxlY3QoKWApLiAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBBZGRpbmcgbmV3IGNvbHVtbnMgKGBtdXRhdGUoKWApLgombmJzcDsmbmJzcDsmIzgyMjY7IEdyb3VwaW5nIGFuZCBzdW1tYXJpemluZyAoYGdyb3VwX2J5KClgICsgYHN1bW1hcml6ZSgpYCkuCiZuYnNwOyZuYnNwOyYjODIyNjsgUGl2b3QgbG9uZ2VyIGFuZCBQaXZvdCB3aWRlciAgIAo8L2Rpdj4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci00LWRhdGEtbWFuaXB1bGF0aW9uLXdpdGgtdGlkeXZlcnNlLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciA1OiBWaXN1YWxpemF0aW9uIHdpdGggYGdncGxvdDJgIOKAkyBQYXJ0IDEqKgoKPGRpdiBjbGFzcz0iaGludC1nb2FscyI+ICAgICAgCioqR29hbHM6KiogICAgIApDcmVhdGUgYW5kIGN1c3RvbWl6ZSB2aXN1YWxpemF0aW9ucyB1c2luZyBgZ2dwbG90MmAuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEJhc2ljcyBvZiBgZ2dwbG90MmAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBNYWtlIGEgc2NhdHRlcnBsb3QsIGJveHBsb3QgYW5kIGNvbHVtbiBncmFwaCAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBDdXN0b21pc2UgbGFiZWxzLCB0aGVtZXMsIGFuZCBjb2xvcnMuICAgCjwvZGl2PgoKW0dvIHRvIENoYXB0ZXIg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL2FuYWx5c2lzLXVzZXItZ3JvdXAvci10dXRvcmlhbC9fYm9vay9jaGFwdGVyLTUtZGF0YS12aXN1YWxpc2F0aW9uLXdpdGgtZ2dwbG90Mi5odG1sKQoKPHdpbXI+CgojIyAqKkNoYXB0ZXIgNjogQWR2YW5jZWQgVmlzdWFsaXphdGlvbiB3aXRoIGBnZ3Bsb3QyYCDigJMgUGFydCAyKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgICAgIAoqKkdvYWxzOioqICAgICAKTGVhcm4gYWRkaXRpb25hbCB2aXN1YWxpc2F0aW9uIHRlY2huaXF1ZXMuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEFkanVzdGluZyB0aGVtZSBlbGVtZW50cyAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBBbm5vdGF0aW5nIHRoZSBwbG90cyAgICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgZmFjZXRfd3JhcCgpIGFuZCBncmlkX3Bsb3QoKSAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBTYXZpbmdzIHBsb3RzICAgCjwvZGl2PgoKW0dvIHRvIENoYXB0ZXIg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL2FuYWx5c2lzLXVzZXItZ3JvdXAvci10dXRvcmlhbC9fYm9vay9jaGFwdGVyLTYtZGF0YS12aXN1YWxpc2F0aW9uLXdpdGgtZ2dwbG90Ml8yLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciA3OiBTdGF0aXN0aWNhbCBBbmFseXNpcyoqCgo8ZGl2IGNsYXNzPSJoaW50LWdvYWxzIj4gICAgICAKKipHb2FsczoqKiAgICAgCkFwcGx5IHNpbXBsZSBzdGF0aXN0aWMgdG8gdGhlIHN5bnRoZXRpYyBkYXRhLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzOiBtZWFuLCBtZWRpYW4sIG1vZGUuICAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBIeXBvdGhlc2lzIHRlc3RpbmcgKHQtdGVzdHMsIEFOT1ZBKS4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgQ29ycmVsYXRpb24gYW5kIHJlZ3Jlc3Npb24uICAgICAgIAo8L2Rpdj4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci03LXN0YXRpc3RpY2FsLWFuYWx5c2lzLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciA4OiBSZXByb2R1Y2libGUgUmVwb3J0cyB3aXRoIFJNYXJrZG93bioqCgo8aGludC10ZXh0PjxzdHJvbmc+KkNvbnRlbnQgY29taW5nIHNvb24hKjwvc3Ryb25nPjwvaGludC10ZXh0PgoKPGRpdiBjbGFzcz0iaGludC1nb2FscyI+ICAgICAgCioqR29hbHM6KiogICAgIApCdWlsZCBhIGR5bmFtaWMgYW5kIHNoYXJlYWJsZSByZXBvcnQgb2YgeW91ciBhbmFseXNpcy4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgSW50cm9kdWN0aW9uIHRvIFJNYXJrZG93bi4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBDb21iaW5pbmcgdGV4dCwgY29kZSwgYW5kIHZpc3VhbHMuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEdlbmVyYXRlIHRhYmxlcyB3aXRoIGtuaXRyLiAgICAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBFZGl0aW5nIHRoZSB5YW1sIGZvciBhZGRpdGlvbmFsIGN1c3RvbWlzYXRpb25zLiAgICAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBFeHBvcnRpbmcgdG8gUERGIGFuZCBIVE1MLiAgICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItOC1yZXByb2R1Y2libGUtcmVwb3J0cy13aXRoLXJtYXJrZG93bi5odG1sKQoKPHdpbXI+CgojIyAqKkNvbmNsdXNpb25zKioKCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svY29uY2x1c2lvbnMuaHRtbCkKCjwvZGV0YWlscz4KCjxlPgoKCg==