install.packages("ggpubr")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/ggpubr_1.0.0.tgz'
Content type 'application/x-gzip' length 2339408 bytes (2.2 MB)
==================================================
downloaded 2.2 MB
The downloaded binary packages are in
/var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
install.packages("dplyr")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/dplyr_1.2.1.tgz'
Content type 'application/x-gzip' length 1647478 bytes (1.6 MB)
==================================================
downloaded 1.6 MB
The downloaded binary packages are in
/var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
install.packages("modeest")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/modeest_2.4.0.tgz'
Content type 'application/x-gzip' length 142945 bytes (139 KB)
==================================================
downloaded 139 KB
The downloaded binary packages are in
/var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
install.packages("pastecs")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/pastecs_1.4.2.tgz'
Content type 'application/x-gzip' length 486974 bytes (475 KB)
==================================================
downloaded 475 KB
The downloaded binary packages are in
/var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
library("ggpubr")
library("dplyr")
library("modeest")
library("pastecs")
library("xfun")
Error in value[[3L]](cond) :
Package ‘xfun’ version 0.46 cannot be unloaded:
Error in unloadNamespace(package) : namespace ‘xfun’ is imported by ‘knitr’ so cannot be unloaded
Part 1
A. Continuous B. Ordinal C. Nominal D. Dichotomous
A. Continous: Systolic blood pressure measured in mm Hg
B. Ordinal: Self-reported health status classified as poor, fair,
good, or excellent
D. Dichotomous: Current smoking status classified as smoker or
non-smoker
C. Nominal: Blood type classified as A, B, AB, or O
A. Continous: Body weight measured in kilograms
1) Data structure and initial inspection
After importing the data:
#import dataset
liverdisease_data <- read.csv("~/Desktop/binf605R/liverdisease.csv")
- Report the number of observations (rows) and number of variables
(columns).
summary.data.frame(liverdisease_data, digits = 1)
Age Sex Tot_Bil Dir_Bil Alkphos Alamine Aspartate
Min. : 4 Length:583 Min. : 0.4 Min. : 0.1 Min. : 63 Min. : 10 Min. : 10
1st Qu.:33 Class :character 1st Qu.: 0.8 1st Qu.: 0.2 1st Qu.: 176 1st Qu.: 23 1st Qu.: 25
Median :45 Mode :character Median : 1.0 Median : 0.3 Median : 208 Median : 35 Median : 42
Mean :45 Mean : 3.3 Mean : 1.5 Mean : 291 Mean : 81 Mean : 110
3rd Qu.:58 3rd Qu.: 2.6 3rd Qu.: 1.3 3rd Qu.: 298 3rd Qu.: 60 3rd Qu.: 87
Max. :90 Max. :75.0 Max. :19.7 Max. :2110 Max. :2000 Max. :4929
Tot_Prot Albumin A_G_Ratio Disease
Min. : 3 Min. :0.9 Min. :0.3 Min. :0.0
1st Qu.: 6 1st Qu.:2.6 1st Qu.:0.7 1st Qu.:0.0
Median : 7 Median :3.1 Median :0.9 Median :1.0
Mean : 6 Mean :3.1 Mean :0.9 Mean :0.7
3rd Qu.: 7 3rd Qu.:3.8 3rd Qu.:1.1 3rd Qu.:1.0
Max. :10 Max. :5.5 Max. :2.8 Max. :1.0
NA's :4
- Display the variable names and their data types/classes.
names(liverdisease_data)
[1] "Age" "Sex" "Tot_Bil" "Dir_Bil" "Alkphos" "Alamine" "Aspartate" "Tot_Prot" "Albumin"
[10] "A_G_Ratio" "Disease"
- Display the first 10 observations.
#first 10 of data table
head(liverdisease_data, 10)
- Based on the data dictionary, identify which variables should be
treated as continuous and which should be treated as categorical.
Age = Categorical
Sex = Categorical
Tot_Bil = Continuous
Dir_Bil = Continous
Alk_Phos = Continous
Alamine = Continous
Aspartate = Continous
Tot_Prot = Continous
Albumin = Continous
A_G_Ration = Continous
Disease = Categorical
2) Distribution of Age
For the variable Age:
- Construct a stem-and-leaf plot.
stem(liverdisease_data$Age)
The decimal point is 1 digit(s) to the right of the |
0 | 44
0 | 6778
1 | 0122333344
1 | 5666777778888888888899
2 | 000111111122222222233344444
2 | 5555566666666666666777777888888889999999
3 | 0000000000111111112222222222222222222233333333333333344444444
3 | 55555555555566666666666777777777888888888888888888888999999
4 | 00000000000000000111112222222222222222222223333444
4 | 55555555555555555555555556666666666666666777777888888888888888888889
5 | 000000000000000000000001111111111222222233333344444444
5 | 5555555555555555556666777777788888888888888
6 | 00000000000000000000000000000000001111122222222233444444
6 | 555555555555555556666666666667888899
7 | 00000000022222222334444
7 | 555555555555558
8 | 4
8 | 5
9 | 0
- Construct a histogram with appropriate axis labels and a title.
gghistogram(liverdisease_data, x = "Age", bins = 9, add = "mean", title = "Distribution of Age")

- Construct a box plot.
ggboxplot(liverdisease_data, y = "Age", width = 0.5, xlab = "Distribution")

- Based on these graphical displays, briefly describe the distribution
of Age in terms of its center, spread, shape, and possible
outliers.
The distribution of age centers around the middle aged group, around
40-50 years of age. There seems to be a uniform distribution and spread
around that point, with decreasing individuals in each descending or
ascending age group. There are few individual that may be possible
outliers at very young ages, below 10, and higher ages above 80.
3) Descriptive statistics
For the continuous variables, calculate: Mean Median Mode Variance
Standard deviation Standard error Coefficient of variation Minimum First
quartile (Q1) Third quartile (Q3) Maximum Interquartile range (IQR)
continous_liver_disease_data_table <- liverdisease_data %>%
select(Tot_Bil, Dir_Bil, Alkphos, Alamine, Aspartate, Tot_Prot, Albumin, A_G_Ratio)
continous_data_summary <- (stat.desc(continous_liver_disease_data_table)[, -5])
IQR <- sapply(continous_liver_disease_data_table[, -5], IQR, na.rm = TRUE)
Q1 <- sapply(continous_liver_disease_data_table[, -5], quantile, seq(0.25), na.rm = TRUE)
Q3 <- sapply(continous_liver_disease_data_table[, -5], quantile, seq(0.75), na.rm = TRUE)
quartiles <-rbind(IQR, Q1, Q3)
rownames(quartiles) <- c("IQR", "Q1", "Q3")
continous_data_stats_summary <- rbind(continous_data_summary, quartiles)
round(continous_data_stats_summary, 2)
Present the results in a clearly organized table.
Then answer:
For Tot_Bil, compare the mean and median. What does the relationship
between these two measures suggest about the shape of its distribution?
- The mean is higher than the median, which could indicate that it is a
positivly skewed distribution.
This small addition is useful because students need to interpret the
statistics rather than merely generate a large table.
####4) Categorical variables#### For Sex and Disease:
- Construct a frequency table showing both the number (frequency) and
percentage of observations in each category.
liver_disease_categorical_data <-liverdisease_data %>%
select(Sex, Disease)
df <- as.data.frame(liver_disease_categorical_data)
head(df)
Sex <-df$Sex
Disease <-df$Disease
sex.tbl <- table(Sex)
disease.tbl <- table(Disease)
(sex.tbl)
Sex
F M
142 441
(disease.tbl)
Disease
0 1
167 416
sex.diseasetbl <-table(Sex, Disease)
round(prop.table(sex.diseasetbl, 1), 2) * 100
Disease
Sex 0 1
F 35 65
M 27 73
- Using the Disease variable, report the percentage of patients
classified as diseased.
sum(disease.tbl)
[1] 583
disease.tbl[1]
0
167
percent_diseased <- round(disease.tbl[1]/sum(disease.tbl), 2)
(percent_diseased)
0
0.29
####5) Graphical comparison by disease status#### Select one
continuous laboratory measurement from the following:
Tot_Bil, Dir_Bil, Alk_Phos, Alamine, Aspartate, Tot_Prot, Albumin, or
A_G_Ration.
- Construct side-by-side box plots of your selected variable according
to Disease status (0 vs. 1).
#Tot_Bil
ggboxplot(liverdisease_data, x = "Disease", y = "Tot_Bil",
color = "Disease",
palette = c("#00AFBB", "#E7B800"))

NA
NA
- Briefly describe any differences you observe between the two groups
in terms of center, spread, and possible outliers.
- Those not diagnosed with a disease are centered around a lower Total
Bilirubin, under 20. There is even spread with few outliers. Those
diagnosed with liver disease are much more diversie in distribution,
with more outliers and a farther spread of data points in higher total
bilirubin numbers. This makes logical sense since those experience
different levels of liver disease would be able to process vastly
different amounts of this waste product.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAxIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBTaGVsYnkgU2VycmFubwotLS0KYGBge3J9Cmluc3RhbGwucGFja2FnZXMoImdncHViciIpIAppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmluc3RhbGwucGFja2FnZXMoIm1vZGVlc3QiKQppbnN0YWxsLnBhY2thZ2VzKCJwYXN0ZWNzIikKbGlicmFyeSgiZ2dwdWJyIikKbGlicmFyeSgiZHBseXIiKQpsaWJyYXJ5KCJtb2RlZXN0IikKbGlicmFyeSgicGFzdGVjcyIpCgpgYGAKCgpQYXJ0IDEKCkEuIENvbnRpbnVvdXMKQi4gT3JkaW5hbApDLiBOb21pbmFsCkQuIERpY2hvdG9tb3VzCgphLiBBLiBDb250aW5vdXM6IFN5c3RvbGljIGJsb29kIHByZXNzdXJlIG1lYXN1cmVkIGluIG1tIEhnCgpiLiBCLiBPcmRpbmFsOiBTZWxmLXJlcG9ydGVkIGhlYWx0aCBzdGF0dXMgY2xhc3NpZmllZCBhcyBwb29yLCBmYWlyLCBnb29kLCBvciBleGNlbGxlbnQKCmMuIEQuIERpY2hvdG9tb3VzOiBDdXJyZW50IHNtb2tpbmcgc3RhdHVzIGNsYXNzaWZpZWQgYXMgc21va2VyIG9yIG5vbi1zbW9rZXIKCmQuIEMuIE5vbWluYWw6IEJsb29kIHR5cGUgY2xhc3NpZmllZCBhcyBBLCBCLCBBQiwgb3IgTwoKZS4gQS4gQ29udGlub3VzOiBCb2R5IHdlaWdodCBtZWFzdXJlZCBpbiBraWxvZ3JhbXMKCgoKIyMjIyAxKSBEYXRhIHN0cnVjdHVyZSBhbmQgaW5pdGlhbCBpbnNwZWN0aW9uICMjIyMKCkFmdGVyIGltcG9ydGluZyB0aGUgZGF0YToKCmBgYHtyfQojaW1wb3J0IGRhdGFzZXQKCmxpdmVyZGlzZWFzZV9kYXRhIDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvYmluZjYwNVIvbGl2ZXJkaXNlYXNlLmNzdiIpCgpgYGAKCiAgYS4gUmVwb3J0IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIChyb3dzKSBhbmQgbnVtYmVyIG9mIHZhcmlhYmxlcyAoY29sdW1ucykuCmBgYHtyfQpzdW1tYXJ5LmRhdGEuZnJhbWUobGl2ZXJkaXNlYXNlX2RhdGEsIGRpZ2l0cyA9IDEpCmBgYAoKYi4gRGlzcGxheSB0aGUgdmFyaWFibGUgbmFtZXMgYW5kIHRoZWlyIGRhdGEgdHlwZXMvY2xhc3Nlcy4KCmBgYHtyfQpuYW1lcyhsaXZlcmRpc2Vhc2VfZGF0YSkKYGBgCgoKYy4gRGlzcGxheSB0aGUgZmlyc3QgMTAgb2JzZXJ2YXRpb25zLgoKYGBge3J9CiNmaXJzdCAxMCBvZiBkYXRhIHRhYmxlCmhlYWQobGl2ZXJkaXNlYXNlX2RhdGEsIDEwKQpgYGAKCmQuIEJhc2VkIG9uIHRoZSBkYXRhIGRpY3Rpb25hcnksIGlkZW50aWZ5IHdoaWNoIHZhcmlhYmxlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBjb250aW51b3VzIGFuZCB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBjYXRlZ29yaWNhbC4KCkFnZSA9IENhdGVnb3JpY2FsCgpTZXggPSBDYXRlZ29yaWNhbAoKVG90X0JpbCA9IENvbnRpbnVvdXMKCkRpcl9CaWwgPSBDb250aW5vdXMKCkFsa19QaG9zID0gQ29udGlub3VzCgpBbGFtaW5lID0gQ29udGlub3VzCgpBc3BhcnRhdGUgPSBDb250aW5vdXMKClRvdF9Qcm90ID0gQ29udGlub3VzCgpBbGJ1bWluID0gQ29udGlub3VzCgpBX0dfUmF0aW9uID0gQ29udGlub3VzCgpEaXNlYXNlID0gQ2F0ZWdvcmljYWwKCiMjIyMgMikgRGlzdHJpYnV0aW9uIG9mIEFnZSAjIyMjIwpGb3IgdGhlIHZhcmlhYmxlIEFnZToKCiAgYS4gQ29uc3RydWN0IGEgc3RlbS1hbmQtbGVhZiBwbG90LgpgYGB7cn0Kc3RlbShsaXZlcmRpc2Vhc2VfZGF0YSRBZ2UpCmBgYAogIAoKYi4gQ29uc3RydWN0IGEgaGlzdG9ncmFtIHdpdGggYXBwcm9wcmlhdGUgYXhpcyBsYWJlbHMgYW5kIGEgdGl0bGUuCgoKYGBge3J9CmdnaGlzdG9ncmFtKGxpdmVyZGlzZWFzZV9kYXRhLCB4ID0gIkFnZSIsIGJpbnMgPSA5LCBhZGQgPSAibWVhbiIsIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBBZ2UiKQpgYGAKCgpjLiBDb25zdHJ1Y3QgYSBib3ggcGxvdC4KYGBge3J9CmdnYm94cGxvdChsaXZlcmRpc2Vhc2VfZGF0YSwgeSA9ICJBZ2UiLCB3aWR0aCA9IDAuNSwgeGxhYiA9ICJEaXN0cmlidXRpb24iKQpgYGAKCmQuIEJhc2VkIG9uIHRoZXNlIGdyYXBoaWNhbCBkaXNwbGF5cywgYnJpZWZseSBkZXNjcmliZSB0aGUgZGlzdHJpYnV0aW9uIG9mIEFnZSBpbiB0ZXJtcyBvZiBpdHMgY2VudGVyLCBzcHJlYWQsIHNoYXBlLCBhbmQgcG9zc2libGUgb3V0bGllcnMuCiAgCiAgVGhlIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgY2VudGVycyBhcm91bmQgdGhlIG1pZGRsZSBhZ2VkIGdyb3VwLCBhcm91bmQgNDAtNTAgeWVhcnMgb2YgYWdlLiBUaGVyZSBzZWVtcyB0byBiZSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGFuZCBzcHJlYWQgYXJvdW5kIHRoYXQgcG9pbnQsIHdpdGggZGVjcmVhc2luZyBpbmRpdmlkdWFscyBpbiBlYWNoIGRlc2NlbmRpbmcgb3IgYXNjZW5kaW5nIGFnZSBncm91cC4gIFRoZXJlIGFyZSBmZXcgaW5kaXZpZHVhbCB0aGF0IG1heSBiZSBwb3NzaWJsZSBvdXRsaWVycyBhdCB2ZXJ5IHlvdW5nIGFnZXMsIGJlbG93IDEwLCBhbmQgaGlnaGVyIGFnZXMgYWJvdmUgODAuIAogIAojIyMjIDMpIERlc2NyaXB0aXZlIHN0YXRpc3RpY3MgIyMjIwpGb3IgdGhlIGNvbnRpbnVvdXMgdmFyaWFibGVzLCBjYWxjdWxhdGU6Ck1lYW4KTWVkaWFuCk1vZGUKVmFyaWFuY2UKU3RhbmRhcmQgZGV2aWF0aW9uClN0YW5kYXJkIGVycm9yCkNvZWZmaWNpZW50IG9mIHZhcmlhdGlvbgpNaW5pbXVtCkZpcnN0IHF1YXJ0aWxlIChRMSkKVGhpcmQgcXVhcnRpbGUgKFEzKQpNYXhpbXVtCkludGVycXVhcnRpbGUgcmFuZ2UgKElRUikKCmBgYHtyfQpjb250aW5vdXNfbGl2ZXJfZGlzZWFzZV9kYXRhX3RhYmxlIDwtIGxpdmVyZGlzZWFzZV9kYXRhICU+JQogIHNlbGVjdChUb3RfQmlsLCBEaXJfQmlsLCBBbGtwaG9zLCBBbGFtaW5lLCBBc3BhcnRhdGUsIFRvdF9Qcm90LCBBbGJ1bWluLCBBX0dfUmF0aW8pCiAgCmBgYAoKYGBge3J9CmNvbnRpbm91c19kYXRhX3N1bW1hcnkgPC0gKHN0YXQuZGVzYyhjb250aW5vdXNfbGl2ZXJfZGlzZWFzZV9kYXRhX3RhYmxlKVssIC01XSkKSVFSIDwtIHNhcHBseShjb250aW5vdXNfbGl2ZXJfZGlzZWFzZV9kYXRhX3RhYmxlWywgLTVdLCBJUVIsIG5hLnJtID0gVFJVRSkKUTEgPC0gc2FwcGx5KGNvbnRpbm91c19saXZlcl9kaXNlYXNlX2RhdGFfdGFibGVbLCAtNV0sIHF1YW50aWxlLCBzZXEoMC4yNSksIG5hLnJtID0gVFJVRSkKUTMgPC0gc2FwcGx5KGNvbnRpbm91c19saXZlcl9kaXNlYXNlX2RhdGFfdGFibGVbLCAtNV0sIHF1YW50aWxlLCBzZXEoMC43NSksIG5hLnJtID0gVFJVRSkKcXVhcnRpbGVzIDwtcmJpbmQoSVFSLCBRMSwgUTMpCnJvd25hbWVzKHF1YXJ0aWxlcykgPC0gYygiSVFSIiwgIlExIiwgIlEzIikKY29udGlub3VzX2RhdGFfc3RhdHNfc3VtbWFyeSA8LSByYmluZChjb250aW5vdXNfZGF0YV9zdW1tYXJ5LCBxdWFydGlsZXMpCnJvdW5kKGNvbnRpbm91c19kYXRhX3N0YXRzX3N1bW1hcnksIDIpCmBgYAoKClByZXNlbnQgdGhlIHJlc3VsdHMgaW4gYSBjbGVhcmx5IG9yZ2FuaXplZCB0YWJsZS4KClRoZW4gYW5zd2VyOgoKRm9yIFRvdF9CaWwsIGNvbXBhcmUgdGhlIG1lYW4gYW5kIG1lZGlhbi4gV2hhdCBkb2VzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28gbWVhc3VyZXMgc3VnZ2VzdCBhYm91dCB0aGUgc2hhcGUgb2YgaXRzIGRpc3RyaWJ1dGlvbj8KLSBUaGUgbWVhbiBpcyBoaWdoZXIgdGhhbiB0aGUgbWVkaWFuLCB3aGljaCBjb3VsZCBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgcG9zaXRpdmx5IHNrZXdlZCBkaXN0cmlidXRpb24uIAoKVGhpcyBzbWFsbCBhZGRpdGlvbiBpcyB1c2VmdWwgYmVjYXVzZSBzdHVkZW50cyBuZWVkIHRvIGludGVycHJldCB0aGUgc3RhdGlzdGljcyByYXRoZXIgdGhhbiBtZXJlbHkgZ2VuZXJhdGUgYSBsYXJnZSB0YWJsZS4KCiMjIyM0KSBDYXRlZ29yaWNhbCB2YXJpYWJsZXMjIyMjCkZvciBTZXggYW5kIERpc2Vhc2U6CgphLiBDb25zdHJ1Y3QgYSBmcmVxdWVuY3kgdGFibGUgc2hvd2luZyBib3RoIHRoZSBudW1iZXIgKGZyZXF1ZW5jeSkgYW5kIHBlcmNlbnRhZ2Ugb2Ygb2JzZXJ2YXRpb25zIGluIGVhY2ggY2F0ZWdvcnkuCgpgYGB7cn0KbGl2ZXJfZGlzZWFzZV9jYXRlZ29yaWNhbF9kYXRhIDwtbGl2ZXJkaXNlYXNlX2RhdGEgJT4lCiAgc2VsZWN0KFNleCwgRGlzZWFzZSkKZGYgPC0gYXMuZGF0YS5mcmFtZShsaXZlcl9kaXNlYXNlX2NhdGVnb3JpY2FsX2RhdGEpCmhlYWQoZGYpCmBgYAoKYGBge3J9ClNleCA8LWRmJFNleApEaXNlYXNlIDwtZGYkRGlzZWFzZQpzZXgudGJsIDwtIHRhYmxlKFNleCkKZGlzZWFzZS50YmwgPC0gdGFibGUoRGlzZWFzZSkKCihzZXgudGJsKQooZGlzZWFzZS50YmwpCmBgYAoKCmBgYHtyfQpzZXguZGlzZWFzZXRibCA8LXRhYmxlKFNleCwgRGlzZWFzZSkKCnJvdW5kKHByb3AudGFibGUoc2V4LmRpc2Vhc2V0YmwsIDEpLCAyKSAqIDEwMApgYGAKCgpiLiBVc2luZyB0aGUgRGlzZWFzZSB2YXJpYWJsZSwgcmVwb3J0IHRoZSBwZXJjZW50YWdlIG9mIHBhdGllbnRzIGNsYXNzaWZpZWQgYXMgZGlzZWFzZWQuCmBgYHtyfQpzdW0oZGlzZWFzZS50YmwpCmRpc2Vhc2UudGJsWzFdCgpwZXJjZW50X2Rpc2Vhc2VkIDwtIHJvdW5kKGRpc2Vhc2UudGJsWzFdL3N1bShkaXNlYXNlLnRibCksIDIpCihwZXJjZW50X2Rpc2Vhc2VkKQoKYGBgCgoKIyMjIzUpIEdyYXBoaWNhbCBjb21wYXJpc29uIGJ5IGRpc2Vhc2Ugc3RhdHVzIyMjIwpTZWxlY3Qgb25lIGNvbnRpbnVvdXMgbGFib3JhdG9yeSBtZWFzdXJlbWVudCBmcm9tIHRoZSBmb2xsb3dpbmc6CgpUb3RfQmlsLCBEaXJfQmlsLCBBbGtfUGhvcywgQWxhbWluZSwgQXNwYXJ0YXRlLCBUb3RfUHJvdCwgQWxidW1pbiwgb3IgQV9HX1JhdGlvbi4KCmEuIENvbnN0cnVjdCBzaWRlLWJ5LXNpZGUgYm94IHBsb3RzIG9mIHlvdXIgc2VsZWN0ZWQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIERpc2Vhc2Ugc3RhdHVzICgwIHZzLiAxKS4KCmBgYHtyfQojVG90X0JpbApnZ2JveHBsb3QobGl2ZXJkaXNlYXNlX2RhdGEsIHggPSAiRGlzZWFzZSIsIHkgPSAiVG90X0JpbCIsCiAgICAgICAgICBjb2xvciA9ICJEaXNlYXNlIiwKICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiKSkKCgpgYGAKCmIuIEJyaWVmbHkgZGVzY3JpYmUgYW55IGRpZmZlcmVuY2VzIHlvdSBvYnNlcnZlIGJldHdlZW4gdGhlIHR3byBncm91cHMgaW4gdGVybXMgb2YgY2VudGVyLCBzcHJlYWQsIGFuZCBwb3NzaWJsZSBvdXRsaWVycy4KCi0gVGhvc2Ugbm90IGRpYWdub3NlZCB3aXRoIGEgZGlzZWFzZSBhcmUgY2VudGVyZWQgYXJvdW5kIGEgbG93ZXIgVG90YWwgQmlsaXJ1YmluLCB1bmRlciAyMC4gVGhlcmUgaXMgZXZlbiBzcHJlYWQgd2l0aCBmZXcgb3V0bGllcnMuIFRob3NlIGRpYWdub3NlZCB3aXRoIGxpdmVyIGRpc2Vhc2UgYXJlIG11Y2ggbW9yZSBkaXZlcnNpZSBpbiBkaXN0cmlidXRpb24sIHdpdGggbW9yZSBvdXRsaWVycyBhbmQgYSBmYXJ0aGVyIHNwcmVhZCBvZiBkYXRhIHBvaW50cyBpbiBoaWdoZXIgdG90YWwgYmlsaXJ1YmluIG51bWJlcnMuIFRoaXMgbWFrZXMgbG9naWNhbCBzZW5zZSBzaW5jZSB0aG9zZSBleHBlcmllbmNlIGRpZmZlcmVudCBsZXZlbHMgb2YgbGl2ZXIgZGlzZWFzZSB3b3VsZCBiZSBhYmxlIHRvIHByb2Nlc3MgdmFzdGx5IGRpZmZlcmVudCBhbW91bnRzIG9mIHRoaXMgd2FzdGUgcHJvZHVjdC4gCgoKCgo=