Directions: Complete two (2) of the 3 Tasks listed in the project.

  1. Complete either Task 1 or Task 2
  1. Complete Task 3

Note: If you Rmd file submission knits you will receive total of (5 points)

# load the packages needed
library(PASWR2)
Loading required package: lattice
Loading required package: ggplot2
library(ggplot2)
library(tidyverse)
── Attaching core tidyverse packages ────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ lubridate 1.9.3     ✔ tibble    3.2.1
✔ purrr     1.0.2     ✔ tidyr     1.3.1
── Conflicts ──────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(lattice)

1. (5 points) How many packages were loaded?

ANSWER: 4 packages were loaded and 8 packages came from tidyverse for a total of 12.

Task 1: This is problem 8 on page 196 in the text w/t added questions

Note: Problem 8/p. 196 is modified

Some claim that the final hours aboard the Titanic were marked by class warfare other claim it was characterized by male chivalry. The data frame TITANIC3 from the PASWR2 package contains information pertaining to class status pclass, survival of passengers survived, and gender sex, among others. Based on the information in the data frame:

Load and Access the Data from the package

A description of the variables can be found by running the code:

help("TITANIC3")
data("TITANIC3")

2. (5 points) How many observations and variables are in the TITANIC3 data?

Hint: Use the function dim(), glimpse() or str().

glimpse(TITANIC3)
Rows: 1,309
Columns: 14
$ pclass    <fct> 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1st, 1…
$ survived  <int> 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1,…
$ name      <fct> "Allen, Miss. Elisabeth Walton", "Allison, Master. Hudson Trevor", "Allison, Miss. Hel…
$ sex       <fct> female, male, female, male, female, male, female, male, female, male, male, female, fe…
$ age       <dbl> 29.0000, 0.9167, 2.0000, 30.0000, 25.0000, 48.0000, 63.0000, 39.0000, 53.0000, 71.0000…
$ sibsp     <int> 0, 1, 1, 1, 1, 0, 1, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0,…
$ parch     <int> 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,…
$ ticket    <fct> 24160, 113781, 113781, 113781, 113781, 19952, 13502, 112050, 11769, PC 17609, PC 17757…
$ fare      <dbl> 211.3375, 151.5500, 151.5500, 151.5500, 151.5500, 26.5500, 77.9583, 0.0000, 51.4792, 4…
$ cabin     <fct> B5, C22 C26, C22 C26, C22 C26, C22 C26, E12, D7, A36, C101, , C62 C64, C62 C64, B35, ,…
$ embarked  <fct> Southampton, Southampton, Southampton, Southampton, Southampton, Southampton, Southamp…
$ boat      <fct> 2, 11, , , , 3, 10, , D, , , 4, 9, 6, B, , , 6, 8, A, 5, 5, 5, 4, 8, , 7, 7, 8, D, , 7…
$ body      <int> NA, NA, NA, 135, NA, NA, NA, NA, NA, 22, 124, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ home.dest <fct> "St Louis, MO", "Montreal, PQ / Chesterville, ON", "Montreal, PQ / Chesterville, ON", …

ANSWER : There are 1309 rows and 14 columns in TITANIC3. (Fill in the blanks)

3. (5 points) Write code to show the first (or last) 6 observation in the TITANIC3 data?

TITANIC3 %>% head(n=6)
TITANIC3 %>% tail(n=6)
NA
NA

4. (5 points) Using the survived variable in the TITANIC3 data, which is of type integer (0/1) mutate it to a factor variable by running the code below and create new data frame TITANIC.

What are the new levels of survived and its type?

TITANIC <- TITANIC3 %>% mutate(survived = factor(survived, levels = 0:1, labels = c("No", "Yes")))

# Check the levels of the 'survived' variable
levels(TITANIC$survived)
[1] "No"  "Yes"
# Check the type of the 'survived' variable
class(TITANIC$survived)
[1] "factor"

ANSWER: The levels are now No and Yes and the type is factor.

5. (5 points) The code below produces summary for the TITANIC Data. Write code using the pipe %>% operator the produces the same result.

summary(TITANIC)
 pclass    survived                               name          sex           age         
 1st:323   No :809   Connolly, Miss. Kate           :   2   female:466   Min.   : 0.1667  
 2nd:277   Yes:500   Kelly, Mr. James               :   2   male  :843   1st Qu.:21.0000  
 3rd:709             Abbing, Mr. Anthony            :   1                Median :28.0000  
                     Abbott, Master. Eugene Joseph  :   1                Mean   :29.8811  
                     Abbott, Mr. Rossmore Edward    :   1                3rd Qu.:39.0000  
                     Abbott, Mrs. Stanton (Rosa Hunt:   1                Max.   :80.0000  
                     (Other)                        :1301                NA's   :263      
     sibsp            parch            ticket          fare                     cabin     
 Min.   :0.0000   Min.   :0.000   CA. 2343:  11   Min.   :  0.000                  :1014  
 1st Qu.:0.0000   1st Qu.:0.000   1601    :   8   1st Qu.:  7.896   B57 B59 B63 B66:   5  
 Median :0.0000   Median :0.000   CA 2144 :   8   Median : 14.454   C23 C25 C27    :   5  
 Mean   :0.4989   Mean   :0.385   3101295 :   7   Mean   : 33.295   G6             :   5  
 3rd Qu.:1.0000   3rd Qu.:0.000   347077  :   7   3rd Qu.: 31.275   B96 B98        :   4  
 Max.   :8.0000   Max.   :9.000   347082  :   7   Max.   :512.329   C22 C26        :   4  
                                  (Other) :1261   NA's   :1         (Other)        : 272  
        embarked        boat          body                      home.dest  
            :  2          :823   Min.   :  1.0                       :564  
 Cherbourg  :270   13     : 39   1st Qu.: 72.0   New York, NY        : 64  
 Queenstown :123   C      : 38   Median :155.0   London              : 14  
 Southampton:914   15     : 37   Mean   :160.8   Montreal, PQ        : 10  
                   14     : 33   3rd Qu.:256.0   Cornwall / Akron, OH:  9  
                   4      : 31   Max.   :328.0   Paris, France       :  9  
                   (Other):308   NA's   :1188    (Other)             :639  

YOUR CODE HERE:

TITANIC %>% summary()
 pclass    survived                               name          sex           age         
 1st:323   No :809   Connolly, Miss. Kate           :   2   female:466   Min.   : 0.1667  
 2nd:277   Yes:500   Kelly, Mr. James               :   2   male  :843   1st Qu.:21.0000  
 3rd:709             Abbing, Mr. Anthony            :   1                Median :28.0000  
                     Abbott, Master. Eugene Joseph  :   1                Mean   :29.8811  
                     Abbott, Mr. Rossmore Edward    :   1                3rd Qu.:39.0000  
                     Abbott, Mrs. Stanton (Rosa Hunt:   1                Max.   :80.0000  
                     (Other)                        :1301                NA's   :263      
     sibsp            parch            ticket          fare                     cabin     
 Min.   :0.0000   Min.   :0.000   CA. 2343:  11   Min.   :  0.000                  :1014  
 1st Qu.:0.0000   1st Qu.:0.000   1601    :   8   1st Qu.:  7.896   B57 B59 B63 B66:   5  
 Median :0.0000   Median :0.000   CA 2144 :   8   Median : 14.454   C23 C25 C27    :   5  
 Mean   :0.4989   Mean   :0.385   3101295 :   7   Mean   : 33.295   G6             :   5  
 3rd Qu.:1.0000   3rd Qu.:0.000   347077  :   7   3rd Qu.: 31.275   B96 B98        :   4  
 Max.   :8.0000   Max.   :9.000   347082  :   7   Max.   :512.329   C22 C26        :   4  
                                  (Other) :1261   NA's   :1         (Other)        : 272  
        embarked        boat          body                      home.dest  
            :  2          :823   Min.   :  1.0                       :564  
 Cherbourg  :270   13     : 39   1st Qu.: 72.0   New York, NY        : 64  
 Queenstown :123   C      : 38   Median :155.0   London              : 14  
 Southampton:914   15     : 37   Mean   :160.8   Montreal, PQ        : 10  
                   14     : 33   3rd Qu.:256.0   Cornwall / Akron, OH:  9  
                   4      : 31   Max.   :328.0   Paris, France       :  9  
                   (Other):308   NA's   :1188    (Other)             :639  

a) (5 points) Determine the fraction of survivors (survived) according to class (pclass).

Hint: Uncomment the 3 lines n the code chunk below and then use the prop.table function.


T1 <- TITANIC %>% select(survived, pclass) %>% table
# 
T1
        pclass
survived 1st 2nd 3rd
     No  123 158 528
     Yes 200 119 181
# 
prop.table(T1, margin = 2) # to produce the proportion per column (2), per row would be margin = 1
        pclass
survived       1st       2nd       3rd
     No  0.3808050 0.5703971 0.7447109
     Yes 0.6191950 0.4296029 0.2552891

ANSWER (Fill in the blank spaces): In 1st class percent survived is 61.9195%, 2nd class 42.96029%, 3rd class 25.52891%

b) (10 points) Compute the fraction of survivors according to class and gender. Among those who survived, which fraction is higher: men in the first class or women in the third class?

Hint: Use the code below that creates 3-way table and then use prop.table() similarly to part a).

T2 <- TITANIC %>% select(pclass, sex, survived) %>% table()

T2
, , survived = No

      sex
pclass female male
   1st      5  118
   2nd     12  146
   3rd    110  418

, , survived = Yes

      sex
pclass female male
   1st    139   61
   2nd     94   25
   3rd    106   75
prop.table(T2)
, , survived = No

      sex
pclass      female        male
   1st 0.003819710 0.090145149
   2nd 0.009167303 0.111535523
   3rd 0.084033613 0.319327731

, , survived = Yes

      sex
pclass      female        male
   1st 0.106187930 0.046600458
   2nd 0.071810542 0.019098549
   3rd 0.080977846 0.057295646

ANSWER (Fill in the blank spaces): Of those who survived 8.0977846 % were women in third class and 4.6600458 % were men in first class.

c) (10 points) How would you characterize the distribution of age (e.g., is it symmetric, positively/negatively skewed, unimodal, multimodal)?

Hint: Run the code below that produces some summary statistics and the density distribution. The commented code is old style of R programming, it is shown as it may resemble the textbook examples.

# Finding summary statistics

#median(TITANIC$age, na.rm = TRUE) # old style 
#mean(TITANIC$age, na.rm = TRUE) # old style

# dplyr style
TITANIC %>% summarise(mean = mean(age, na.rm = TRUE), meadian = median(age, na.rm = TRUE))

# IQR(TITANIC$age, na.rm = TRUE) 

TITANIC %>% pull(age) %>% IQR(na.rm = TRUE) # pull() does extract the column from the data frame as vector object
[1] 18
# look at the density function to see if it is uni or bi-modal distribution
ggplot(data = TITANIC, aes(x = age)) +
geom_density(fill = "lightgreen") +
theme_bw()
Warning: Removed 263 rows containing non-finite outside the scale range (`stat_density()`).

ANSWER: This is a positively skewed bi-modal distribution.

d) (5 points) Were the median and mean ages for females who survived higher or lower than for females who did not survive? Report the median and mean ages as well as an appropriate measure of spread for each statistic.

Hint: Using the dplyr package functions and the pipes operator %>% elegant code can produce summaries for each statistics - mean, median, sd, IRQ.

Without considering the pclass variable, namely regardless of passenger class:
Mean Summaries
# mean summaries
TITANIC %>% group_by(sex, survived) %>% summarise(avg = mean(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.
Standard deviation Summarries
# sd summaries
TITANIC %>% group_by(sex, survived) %>% summarise(stdev = sd(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

Median Summarries

# median summaries
TITANIC %>% group_by(sex, survived) %>% summarise(med = median(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

IQR Summarries

# IQR summaries
TITANIC %>% group_by(sex, survived) %>% summarise(IQR = IQR(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

Based on the summaries, answer the question below:

d-1)

For those who survived, the mean age for females is about 3 years older than the mean age for males?

d-2) For those who survived, the median age for females is 1.5 years older than the median age for males?

ANSWER: The mean and median of the ages of females who survived is older than the ones who died. Women who survived had a mean age of 29.81535 compared to the mean age of women who died which is 26.25521. The median of those who lived is 28.5 while for those who died it was 24.5

6. (10 points) Now Consider the survived variable in the TITANIC data too, create similar summary statistics and answer the question below.

For those who survived, which class the mean age for females is less than the mean age for males?

Third class

For those who survived, which class the median age for females is greater than the median age for males?

Second Class

Write your code in the chunk below:

# mean summaries
TITANIC %>% group_by(pclass, sex, survived) %>% summarise(avg = mean(age, na.rm = TRUE))
`summarise()` has grouped output by 'pclass', 'sex'. You can override using the `.groups` argument.
# median summaries

TITANIC %>% group_by(pclass, sex, survived) %>% summarise(med = median(age, na.rm = TRUE))
`summarise()` has grouped output by 'pclass', 'sex'. You can override using the `.groups` argument.
# write your code here

e) (5 points) Were the median and mean ages for males who survived higher or lower than for males who did not survive? Report the median and mean ages as well as an appropriate measure of spread for each statistic.

Hint: Read the output of the code in part d)

ANSWER: The mean and median for males who survived is younger than those who died. Males who survived had a mean age of 26.97778 vs those who died at 31.5164. Males who survived had a median age of 27 while those who died had a median age of 29.

f) (5 points) What was the age of the youngest female in the first class who survived?

Hint: Complete the code below by specify which variable you want to be arranged.

14 years old.

TITANIC %>% filter (sex =="female" & survived =="Yes" & pclass == "1st") %>% arrange(age)

Arranging in descending order is achieved by specifying in the arrange() function desc(var_name).

7. (5 points) What was the age of the oldest female (male) in the first class who survived?

YOUR CODE HERE:

TITANIC %>% filter(sex =="female" & survived =="Yes" & pclass == "1st") %>% arrange(desc(age))

TITANIC %>% filter (sex =="male" & survived =="Yes" & pclass == "1st") %>% arrange(desc(age))

ANSWER:

Oldest female in 1st class survived was 76 years of age.

Oldest male in 1st class survived was 80 years of age.

g) (10 points) Do the data suggest that the final hours aboard the Titanic were characterized by class warfare, male chivalry, some combination of both, or neither? Justify your answer based on computations above, or based on other explorations of the data.

Hint: Review and explain the exploratory graphs created by the code chunk. How they support you justification?

I think the data suggest that there was a combination of both based on the fact that large portion of those who died were men and a large portion where 3rd class.


TITANIC %>%  ggplot(aes(x = survived)) +
  geom_bar(aes(fill = sex), stat = "count", position = "stack" ) +
  theme_bw()


TITANIC %>%  ggplot(aes(x = survived)) +
  geom_bar(aes(fill = pclass), stat = "count", position = "stack" ) +
  theme_bw()

Task 1 (Extra Credit, 10 pts): Produce CLEAN data from the TITANIC data by removing all observation with NA

Comment: In most of the code you used/wrote in Task 1, functions were called with argument na.rm = TRUE, instructing the NA values to be dropped for the computations.

part 1) (5 points) Use the function na.omit()(or the filter()) function from dplyr package to create a clean data set that removes subjects if any observations on the subject are unknown Store the modified data frame in a data frame named CLEAN. Run the function dim() on the data frame CLEAN to find the number of observations(rows) in the CLEAN data.

COMPLETE THE CODE HERE, uncomment necessary lines before running:

CLEAN <- na.omit(TITANIC)

#or
#CLEAN <- TITANIC %>% filter(complete.cases(na.rm = TRUE))

#print the dimensions
dim(CLEAN)
[1] 119  14

part 2) (5 points) How many missing values in the data frame TITANIC are there? How many rows of TITANIC have no missing values, one missing value, two missing values, and three missing values, respectively? Note: the number of rows in CLEAN should agree with your answer for the number of rows in TITANIC that have no missing values. What are the cons of cleaning the data in the suggested way?

Use the code, explain what it does.

#get the number of missing values in columns
colNAs<- colSums(is.na(TITANIC))
(colNAs <- as.vector(colSums(is.na(TITANIC)))) # coerce to a vector 
 [1]    0    0    0    0  263    0    0    0    1    0    0    0 1188    0
rowNAs <- table(rowSums(is.na(TITANIC)))
(rowNAs <- as.vector(table(rowSums(is.na(TITANIC))))) # coerce to a vector
[1] 119 928 262

Comment: The missing values are for variables age, fare, and body.

Comment: There are 119 rows with no missing values, 928 rows with 1 missing value, and 262 rows with 2 missing values.

Comment how this align with the dimensions of your CLEAN data. > Your comment: The CLEAN data aligns with the 119 rows with no missing data across the 14 columns

Good practice: Save your customized data frame CLEAN in your working directory as a *.csv file using the function write.csv() using the argument row.names = FALSE.

write.csv(CLEAN, file="TITANIC_CLEAN.csv", row.names=FALSE)

Task 2: This is problem 9 on page 197 in the text as is.

Note: This is not guided task, you have to write your own code from scratch!

Use the CARS2004 data frame from the PASWR2 package, which contains the numbers of cars per 1000 inhabitants (cars), the total number of known mortal accidents (deaths), and the country population/1000 (population) for the 25 member countries of the European Union for the year 2004.

a) (10 points) Compute the total number of cars per 1000 inhabitants in each country, and store the result in an object named total.cars. Determine the total number of known automobile fatalities in 2004 divided by the total number of cars for each country and store the result in an object named death.rate.

YOUR CODE:

library()

ANSWER:

b) (10 points) Create a barplot showing the automobile death rate for each of the European Union member countries. Make the bars increase in magnitude so that the countries with the smallest automobile death rates appear first.

YOUR CODE:

ANSWER:

c) (10 points) Which country has the lowest automobile death rate? Which country has the highest automobile death rate?

YOUR CODE:

ANSWER:

d) (10 points) Which country has the lowest automobile death rate? Which country has the highest automobile death rate?

YOUR CODE:

ANSWER:

e) (10 points) Find the least squares estimates for regressing population on total.cars. Superimpose the least squares line on the scatterplot from (d). What population does the least squares model predict for a country with a total.cars value of 19224.630? Find the difference between the population predicted from the least squares model and the actual population for the country with a total.cars value of 19224.630.

YOUR CODE:

ANSWER:

f) (10 points) Create a scatterplot of total.cars versus death.rate. How would you characterize the relationship between the two variables?

YOUR CODE:

ANSWER:

g) (10 points) Compute Spearman’s rank correlation coefficient of total.cars and death.rate. (Hint: Use cor(x, y, method=“spearman”).) What is this coefficient measuring?

YOUR CODE:

ANSWER:

h) (10 points) Plot the logarithm of total.cars versus the logarithm of death.rate. How would you characterize the relationship?

YOUR CODE:

ANSWER:

Task 3 (10 points) Create a map with leaflet package, by completing the code below, that displays 5 UNC system schools using their geographic locations. Draw circles with radius proportionate to the school size using the addCircles() function.

Try: E.g. addCircles(weight = 1, radius = sqrt(UNC_schools$size)*100)

Task 3 (Extra Credit, 5 pts): Add at least two more UNC schools, using their location data and enrollment numbers. Modify the code above and update the map for all schools included.

LS0tDQp0aXRsZTogIlNUQVQyNzAgLSBQcm9qZWN0IDEiDQphdXRob3I6ICJNYXJjb3MgUGVyZXoiDQpkYXRlOiAnYHIgU3lzLkRhdGUoKWAnDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyMgRGlyZWN0aW9uczogQ29tcGxldGUgdHdvICgyKSBvZiB0aGUgMyBUYXNrcyBsaXN0ZWQgaW4gdGhlIHByb2plY3QuDQoNCj4gMS4gIENvbXBsZXRlIGVpdGhlciBUYXNrIDEgb3IgVGFzayAyDQoNCj4gMi4gIENvbXBsZXRlIFRhc2sgMw0KDQoqKk5vdGU6KiogSWYgeW91IGBSbWRgIGZpbGUgc3VibWlzc2lvbiBrbml0cyB5b3Ugd2lsbCByZWNlaXZlIHRvdGFsIG9mICoqKDUgcG9pbnRzKSoqDQoNCmBgYHtyIHBhY2thZ2VzLCBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGxvYWQgdGhlIHBhY2thZ2VzIG5lZWRlZA0KbGlicmFyeShQQVNXUjIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobGF0dGljZSkNCmBgYA0KDQojIyMjICoqMS4gKDUgcG9pbnRzKSoqIEhvdyBtYW55IHBhY2thZ2VzIHdlcmUgbG9hZGVkPw0KDQoqKkFOU1dFUioqOiA0IHBhY2thZ2VzIHdlcmUgbG9hZGVkIGFuZCA4IHBhY2thZ2VzIGNhbWUgZnJvbSB0aWR5dmVyc2UgZm9yIGEgdG90YWwgb2YgMTIuDQoNCiMjIFRhc2sgMTogKipUaGlzIGlzIHByb2JsZW0gOCBvbiBwYWdlIDE5NiBpbiB0aGUgdGV4dCoqIHcvdCBhZGRlZCBxdWVzdGlvbnMNCg0KTm90ZTogKipQcm9ibGVtIDgvcC4gMTk2IGlzIG1vZGlmaWVkKioNCg0KU29tZSBjbGFpbSB0aGF0IHRoZSBmaW5hbCBob3VycyBhYm9hcmQgdGhlIFRpdGFuaWMgd2VyZSBtYXJrZWQgYnkgY2xhc3Mgd2FyZmFyZSBvdGhlciBjbGFpbSBpdCB3YXMgY2hhcmFjdGVyaXplZCBieSBtYWxlIGNoaXZhbHJ5LiBUaGUgZGF0YSBmcmFtZSBgVElUQU5JQzNgIGZyb20gdGhlIGBQQVNXUjJgIHBhY2thZ2UgY29udGFpbnMgaW5mb3JtYXRpb24gcGVydGFpbmluZyB0byBjbGFzcyBzdGF0dXMgYHBjbGFzc2AsIHN1cnZpdmFsIG9mIHBhc3NlbmdlcnMgYHN1cnZpdmVkYCwgYW5kIGdlbmRlciBgc2V4YCwgYW1vbmcgb3RoZXJzLiBCYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgZnJhbWU6DQoNCiMjIyBMb2FkIGFuZCBBY2Nlc3MgdGhlIERhdGEgZnJvbSB0aGUgcGFja2FnZQ0KDQpBIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpYWJsZXMgY2FuIGJlIGZvdW5kIGJ5IHJ1bm5pbmcgdGhlIGNvZGU6DQoNCmBgYHtyIGRhdGEgZGVzY3JpcHRpb259DQpoZWxwKCJUSVRBTklDMyIpDQpkYXRhKCJUSVRBTklDMyIpDQpgYGANCg0KIyMjIyAqKjIuICg1IHBvaW50cykqKiBIb3cgbWFueSBvYnNlcnZhdGlvbnMgYW5kIHZhcmlhYmxlcyBhcmUgaW4gdGhlIGBUSVRBTklDM2AgZGF0YT8NCg0KKipIaW50OioqIFVzZSB0aGUgZnVuY3Rpb24gYGRpbSgpYCwgYGdsaW1wc2UoKWAgb3IgYHN0cigpYC4NCg0KYGBge3IgZGltZW50aW9uc30NCmdsaW1wc2UoVElUQU5JQzMpDQoNCmBgYA0KDQoqKkFOU1dFUiA6KiogVGhlcmUgYXJlIDEzMDkgcm93cyBhbmQgMTQgY29sdW1ucyBpbiBgVElUQU5JQzNgLiAoKipGaWxsIGluIHRoZSBibGFua3MqKikNCg0KIyMjIyAqKjMuICg1IHBvaW50cykqKiBXcml0ZSBjb2RlIHRvIHNob3cgdGhlIGZpcnN0IChvciBsYXN0KSA2IG9ic2VydmF0aW9uIGluIHRoZSBgVElUQU5JQzNgIGRhdGE/DQoNCmBgYHtyfQ0KVElUQU5JQzMgJT4lIGhlYWQobj02KQ0KVElUQU5JQzMgJT4lIHRhaWwobj02KQ0KDQoNCmBgYA0KDQojIyMjICoqNC4gKDUgcG9pbnRzKSoqIFVzaW5nIHRoZSBgc3Vydml2ZWRgIHZhcmlhYmxlIGluIHRoZSBgVElUQU5JQzNgIGRhdGEsIHdoaWNoIGlzIG9mIHR5cGUgaW50ZWdlciBgKDAvMSlgIG11dGF0ZSBpdCB0byBhIGZhY3RvciB2YXJpYWJsZSBieSBydW5uaW5nIHRoZSBjb2RlIGJlbG93IGFuZCBjcmVhdGUgKipuZXcqKiBkYXRhIGZyYW1lIGBUSVRBTklDYC4NCg0KV2hhdCBhcmUgdGhlIG5ldyBsZXZlbHMgb2YgYHN1cnZpdmVkYCBhbmQgaXRzIHR5cGU/DQoNCmBgYHtyfQ0KVElUQU5JQyA8LSBUSVRBTklDMyAlPiUgbXV0YXRlKHN1cnZpdmVkID0gZmFjdG9yKHN1cnZpdmVkLCBsZXZlbHMgPSAwOjEsIGxhYmVscyA9IGMoIk5vIiwgIlllcyIpKSkNCg0KIyBDaGVjayB0aGUgbGV2ZWxzIG9mIHRoZSAnc3Vydml2ZWQnIHZhcmlhYmxlDQpsZXZlbHMoVElUQU5JQyRzdXJ2aXZlZCkNCg0KIyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgJ3N1cnZpdmVkJyB2YXJpYWJsZQ0KY2xhc3MoVElUQU5JQyRzdXJ2aXZlZCkNCmBgYA0KDQoqKkFOU1dFUjogVGhlIGxldmVscyBhcmUgbm93IE5vIGFuZCBZZXMgYW5kIHRoZSB0eXBlIGlzIGZhY3Rvci4qKg0KDQojIyMjICoqNS4gKDUgcG9pbnRzKSoqIFRoZSBjb2RlIGJlbG93IHByb2R1Y2VzIHN1bW1hcnkgZm9yIHRoZSBgVElUQU5JQ2AgRGF0YS4gV3JpdGUgY29kZSB1c2luZyB0aGUgcGlwZSAlXD4lIG9wZXJhdG9yIHRoZSBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuDQoNCmBgYHtyfQ0Kc3VtbWFyeShUSVRBTklDKQ0KDQpgYGANCg0KWU9VUiBDT0RFIEhFUkU6DQoNCmBgYHtyfQ0KVElUQU5JQyAlPiUgc3VtbWFyeSgpDQoNCmBgYA0KDQojIyMjICoqYSkgKDUgcG9pbnRzKSoqIERldGVybWluZSB0aGUgZnJhY3Rpb24gb2Ygc3Vydml2b3JzIChgc3Vydml2ZWRgKSBhY2NvcmRpbmcgdG8gY2xhc3MgKGBwY2xhc3NgKS4NCg0KKipIaW50OioqIFVuY29tbWVudCB0aGUgMyBsaW5lcyBuIHRoZSBjb2RlIGNodW5rIGJlbG93IGFuZCB0aGVuIHVzZSB0aGUgYHByb3AudGFibGVgIGZ1bmN0aW9uLg0KDQpgYGB7ciBwYXJ0LWF9DQoNClQxIDwtIFRJVEFOSUMgJT4lIHNlbGVjdChzdXJ2aXZlZCwgcGNsYXNzKSAlPiUgdGFibGUNCiMgDQpUMQ0KIyANCnByb3AudGFibGUoVDEsIG1hcmdpbiA9IDIpICMgdG8gcHJvZHVjZSB0aGUgcHJvcG9ydGlvbiBwZXIgY29sdW1uICgyKSwgcGVyIHJvdyB3b3VsZCBiZSBtYXJnaW4gPSAxDQpgYGANCg0KKipBTlNXRVIgKEZpbGwgaW4gdGhlIGJsYW5rIHNwYWNlcyk6KiogSW4gMXN0IGNsYXNzIHBlcmNlbnQgc3Vydml2ZWQgaXMgNjEuOTE5NSUsIDJuZCBjbGFzcyA0Mi45NjAyOSUsIDNyZCBjbGFzcyAyNS41Mjg5MSUNCg0KIyMjIyAqKmIpICgxMCBwb2ludHMpKiogQ29tcHV0ZSB0aGUgZnJhY3Rpb24gb2Ygc3Vydml2b3JzIGFjY29yZGluZyB0byBjbGFzcyBhbmQgZ2VuZGVyLiBBbW9uZyB0aG9zZSB3aG8gc3Vydml2ZWQsIHdoaWNoIGZyYWN0aW9uIGlzIGhpZ2hlcjogbWVuIGluIHRoZSBmaXJzdCBjbGFzcyBvciB3b21lbiBpbiB0aGUgdGhpcmQgY2xhc3M/DQoNCkhpbnQ6IFVzZSB0aGUgY29kZSBiZWxvdyB0aGF0IGNyZWF0ZXMgMy13YXkgdGFibGUgYW5kIHRoZW4gdXNlIGBwcm9wLnRhYmxlKClgIHNpbWlsYXJseSB0byBwYXJ0IGEpLg0KDQpgYGB7ciBwYXJ0LWJ9DQpUMiA8LSBUSVRBTklDICU+JSBzZWxlY3QocGNsYXNzLCBzZXgsIHN1cnZpdmVkKSAlPiUgdGFibGUoKQ0KDQpUMg0KDQpwcm9wLnRhYmxlKFQyKQ0KDQpgYGANCg0KKipBTlNXRVIgKEZpbGwgaW4gdGhlIGJsYW5rIHNwYWNlcyk6KiogT2YgdGhvc2Ugd2hvIHN1cnZpdmVkIDguMDk3Nzg0NiAlIHdlcmUgKip3b21lbiBpbiB0aGlyZCBjbGFzcyoqIGFuZCA0LjY2MDA0NTggJSB3ZXJlICoqbWVuIGluIGZpcnN0IGNsYXNzKiouDQoNCiMjIyMgKipjKSAoMTAgcG9pbnRzKSoqIEhvdyB3b3VsZCB5b3UgY2hhcmFjdGVyaXplIHRoZSBkaXN0cmlidXRpb24gb2YgYWdlIChlLmcuLCBpcyBpdCBzeW1tZXRyaWMsIHBvc2l0aXZlbHkvbmVnYXRpdmVseSBza2V3ZWQsIHVuaW1vZGFsLCBtdWx0aW1vZGFsKT8NCg0KSGludDogUnVuIHRoZSBjb2RlIGJlbG93IHRoYXQgcHJvZHVjZXMgc29tZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIHRoZSBkZW5zaXR5IGRpc3RyaWJ1dGlvbi4gVGhlIGNvbW1lbnRlZCBjb2RlIGlzIG9sZCBzdHlsZSBvZiBSIHByb2dyYW1taW5nLCBpdCBpcyBzaG93biBhcyBpdCBtYXkgcmVzZW1ibGUgdGhlIHRleHRib29rIGV4YW1wbGVzLg0KDQpgYGB7ciBwYXJ0LWN9DQojIEZpbmRpbmcgc3VtbWFyeSBzdGF0aXN0aWNzDQoNCiNtZWRpYW4oVElUQU5JQyRhZ2UsIG5hLnJtID0gVFJVRSkgIyBvbGQgc3R5bGUgDQojbWVhbihUSVRBTklDJGFnZSwgbmEucm0gPSBUUlVFKSAjIG9sZCBzdHlsZQ0KDQojIGRwbHlyIHN0eWxlDQpUSVRBTklDICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4oYWdlLCBuYS5ybSA9IFRSVUUpLCBtZWFkaWFuID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCg0KIyBJUVIoVElUQU5JQyRhZ2UsIG5hLnJtID0gVFJVRSkgDQoNClRJVEFOSUMgJT4lIHB1bGwoYWdlKSAlPiUgSVFSKG5hLnJtID0gVFJVRSkgIyBwdWxsKCkgZG9lcyBleHRyYWN0IHRoZSBjb2x1bW4gZnJvbSB0aGUgZGF0YSBmcmFtZSBhcyB2ZWN0b3Igb2JqZWN0DQoNCiMgbG9vayBhdCB0aGUgZGVuc2l0eSBmdW5jdGlvbiB0byBzZWUgaWYgaXQgaXMgdW5pIG9yIGJpLW1vZGFsIGRpc3RyaWJ1dGlvbg0KZ2dwbG90KGRhdGEgPSBUSVRBTklDLCBhZXMoeCA9IGFnZSkpICsNCmdlb21fZGVuc2l0eShmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQp0aGVtZV9idygpDQoNCmBgYA0KDQoqKkFOU1dFUjoqKiBUaGlzIGlzIGEgcG9zaXRpdmVseSBza2V3ZWQgYmktbW9kYWwgZGlzdHJpYnV0aW9uLg0KDQojIyMjICoqZCkgKDUgcG9pbnRzKSoqIFdlcmUgdGhlIG1lZGlhbiBhbmQgbWVhbiBhZ2VzIGZvciBmZW1hbGVzIHdobyBzdXJ2aXZlZCBoaWdoZXIgb3IgbG93ZXIgdGhhbiBmb3IgZmVtYWxlcyB3aG8gZGlkIG5vdCBzdXJ2aXZlPyBSZXBvcnQgdGhlIG1lZGlhbiBhbmQgbWVhbiBhZ2VzIGFzIHdlbGwgYXMgYW4gYXBwcm9wcmlhdGUgbWVhc3VyZSBvZiBzcHJlYWQgZm9yIGVhY2ggc3RhdGlzdGljLg0KDQoqKkhpbnQ6KiogVXNpbmcgdGhlIGBkcGx5cmAgcGFja2FnZSBmdW5jdGlvbnMgYW5kIHRoZSBwaXBlcyBvcGVyYXRvciBgJT4lYCBlbGVnYW50IGNvZGUgY2FuIHByb2R1Y2Ugc3VtbWFyaWVzIGZvciBlYWNoIHN0YXRpc3RpY3MgLSBtZWFuLCBtZWRpYW4sIHNkLCBJUlEuDQoNCiMjIyMjIFdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIGBwY2xhc3NgIHZhcmlhYmxlLCBuYW1lbHkgcmVnYXJkbGVzcyBvZiBwYXNzZW5nZXIgY2xhc3M6DQoNCiMjIyMjIE1lYW4gU3VtbWFyaWVzDQoNCmBgYHtyfQ0KIyBtZWFuIHN1bW1hcmllcw0KVElUQU5JQyAlPiUgZ3JvdXBfYnkoc2V4LCBzdXJ2aXZlZCkgJT4lIHN1bW1hcmlzZShhdmcgPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCg0KYGBgDQoNCiMjIyMjIFN0YW5kYXJkIGRldmlhdGlvbiBTdW1tYXJyaWVzDQoNCmBgYHtyfQ0KIyBzZCBzdW1tYXJpZXMNClRJVEFOSUMgJT4lIGdyb3VwX2J5KHNleCwgc3Vydml2ZWQpICU+JSBzdW1tYXJpc2Uoc3RkZXYgPSBzZChhZ2UsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQojIyMjIE1lZGlhbiBTdW1tYXJyaWVzDQoNCmBgYHtyfQ0KIyBtZWRpYW4gc3VtbWFyaWVzDQpUSVRBTklDICU+JSBncm91cF9ieShzZXgsIHN1cnZpdmVkKSAlPiUgc3VtbWFyaXNlKG1lZCA9IG1lZGlhbihhZ2UsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQojIyMjIElRUiBTdW1tYXJyaWVzDQoNCmBgYHtyfQ0KIyBJUVIgc3VtbWFyaWVzDQpUSVRBTklDICU+JSBncm91cF9ieShzZXgsIHN1cnZpdmVkKSAlPiUgc3VtbWFyaXNlKElRUiA9IElRUihhZ2UsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQpCYXNlZCBvbiB0aGUgc3VtbWFyaWVzLCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGJlbG93Og0KDQoqKmQtMSkqKg0KDQpGb3IgdGhvc2Ugd2hvIHN1cnZpdmVkLCB0aGUgbWVhbiBhZ2UgZm9yIGZlbWFsZXMgaXMgKiphYm91dCAzIHllYXJzIG9sZGVyKiogdGhhbiB0aGUgbWVhbiBhZ2UgZm9yIG1hbGVzPw0KDQoqKmQtMikqKiBGb3IgdGhvc2Ugd2hvIHN1cnZpdmVkLCB0aGUgbWVkaWFuIGFnZSBmb3IgZmVtYWxlcyBpcyAqKjEuNSB5ZWFycyBvbGRlcioqIHRoYW4gdGhlIG1lZGlhbiBhZ2UgZm9yIG1hbGVzPw0KDQoqKkFOU1dFUjoqKiBUaGUgbWVhbiBhbmQgbWVkaWFuIG9mIHRoZSBhZ2VzIG9mIGZlbWFsZXMgd2hvIHN1cnZpdmVkIGlzIG9sZGVyIHRoYW4gdGhlIG9uZXMgd2hvIGRpZWQuIFdvbWVuIHdobyBzdXJ2aXZlZCBoYWQgYSBtZWFuIGFnZSBvZiAyOS44MTUzNSBjb21wYXJlZCB0byB0aGUgbWVhbiBhZ2Ugb2Ygd29tZW4gd2hvIGRpZWQgd2hpY2ggaXMgMjYuMjU1MjEuIFRoZSBtZWRpYW4gb2YgdGhvc2Ugd2hvIGxpdmVkIGlzIDI4LjUgd2hpbGUgZm9yIHRob3NlIHdobyBkaWVkIGl0IHdhcyAyNC41DQoNCiMjIyMgKio2LiAoMTAgcG9pbnRzKSoqIE5vdyBDb25zaWRlciB0aGUgYHN1cnZpdmVkYCB2YXJpYWJsZSBpbiB0aGUgYFRJVEFOSUNgIGRhdGEgdG9vLCBjcmVhdGUgc2ltaWxhciBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIGFuc3dlciB0aGUgcXVlc3Rpb24gYmVsb3cuDQoNCkZvciB0aG9zZSB3aG8gc3Vydml2ZWQsIHdoaWNoIGNsYXNzIHRoZSBtZWFuIGFnZSBmb3IgZmVtYWxlcyBpcyAqKmxlc3MqKiB0aGFuIHRoZSBtZWFuIGFnZSBmb3IgbWFsZXM/DQoNCioqVGhpcmQgY2xhc3MqKg0KDQpGb3IgdGhvc2Ugd2hvIHN1cnZpdmVkLCB3aGljaCBjbGFzcyB0aGUgbWVkaWFuIGFnZSBmb3IgZmVtYWxlcyBpcyAqKmdyZWF0ZXIqKiB0aGFuIHRoZSBtZWRpYW4gYWdlIGZvciBtYWxlcz8NCg0KKipTZWNvbmQgQ2xhc3MqKg0KDQpXcml0ZSB5b3VyIGNvZGUgaW4gdGhlIGNodW5rIGJlbG93Og0KDQpgYGB7cn0NCiMgbWVhbiBzdW1tYXJpZXMNClRJVEFOSUMgJT4lIGdyb3VwX2J5KHBjbGFzcywgc2V4LCBzdXJ2aXZlZCkgJT4lIHN1bW1hcmlzZShhdmcgPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCg0KDQoNCiMgbWVkaWFuIHN1bW1hcmllcw0KDQpUSVRBTklDICU+JSBncm91cF9ieShwY2xhc3MsIHNleCwgc3Vydml2ZWQpICU+JSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCg0KIyB3cml0ZSB5b3VyIGNvZGUgaGVyZQ0KYGBgDQoNCiMjIyMgKiplKSAoNSBwb2ludHMpKiogV2VyZSB0aGUgbWVkaWFuIGFuZCBtZWFuIGFnZXMgZm9yIG1hbGVzIHdobyBzdXJ2aXZlZCBoaWdoZXIgb3IgbG93ZXIgdGhhbiBmb3IgbWFsZXMgd2hvIGRpZCBub3Qgc3Vydml2ZT8gUmVwb3J0IHRoZSBtZWRpYW4gYW5kIG1lYW4gYWdlcyBhcyB3ZWxsIGFzIGFuIGFwcHJvcHJpYXRlIG1lYXN1cmUgb2Ygc3ByZWFkIGZvciBlYWNoIHN0YXRpc3RpYy4NCg0KKipIaW50OioqIFJlYWQgdGhlIG91dHB1dCBvZiB0aGUgY29kZSBpbiBwYXJ0IGQpDQoNCioqQU5TV0VSOioqIFRoZSBtZWFuIGFuZCBtZWRpYW4gZm9yIG1hbGVzIHdobyBzdXJ2aXZlZCBpcyB5b3VuZ2VyIHRoYW4gdGhvc2Ugd2hvIGRpZWQuIE1hbGVzIHdobyBzdXJ2aXZlZCBoYWQgYSBtZWFuIGFnZSBvZiAyNi45Nzc3OCB2cyB0aG9zZSB3aG8gZGllZCBhdCAzMS41MTY0LiBNYWxlcyB3aG8gc3Vydml2ZWQgaGFkIGEgbWVkaWFuIGFnZSBvZiAyNyB3aGlsZSB0aG9zZSB3aG8gZGllZCBoYWQgYSBtZWRpYW4gYWdlIG9mIDI5Lg0KDQojIyMjICoqZikgKDUgcG9pbnRzKSoqIFdoYXQgd2FzIHRoZSBhZ2Ugb2YgdGhlIHlvdW5nZXN0IGZlbWFsZSBpbiB0aGUgZmlyc3QgY2xhc3Mgd2hvIHN1cnZpdmVkPw0KDQoqKkhpbnQ6KiogQ29tcGxldGUgdGhlIGNvZGUgYmVsb3cgYnkgc3BlY2lmeSB3aGljaCB2YXJpYWJsZSB5b3Ugd2FudCB0byBiZSBhcnJhbmdlZC4NCg0KMTQgeWVhcnMgb2xkLg0KDQpgYGB7cn0NClRJVEFOSUMgJT4lIGZpbHRlciAoc2V4ID09ImZlbWFsZSIgJiBzdXJ2aXZlZCA9PSJZZXMiICYgcGNsYXNzID09ICIxc3QiKSAlPiUgYXJyYW5nZShhZ2UpDQpgYGANCg0KQXJyYW5naW5nIGluIGRlc2NlbmRpbmcgb3JkZXIgaXMgYWNoaWV2ZWQgYnkgc3BlY2lmeWluZyBpbiB0aGUgYGFycmFuZ2UoKWAgZnVuY3Rpb24gYGRlc2ModmFyX25hbWUpYC4NCg0KIyMjIyAqKjcuICg1IHBvaW50cykqKiBXaGF0IHdhcyB0aGUgYWdlIG9mIHRoZSBvbGRlc3QgZmVtYWxlIChtYWxlKSBpbiB0aGUgZmlyc3QgY2xhc3Mgd2hvIHN1cnZpdmVkPw0KDQpZT1VSIENPREUgSEVSRToNCg0KYGBge3J9DQpUSVRBTklDICU+JSBmaWx0ZXIoc2V4ID09ImZlbWFsZSIgJiBzdXJ2aXZlZCA9PSJZZXMiICYgcGNsYXNzID09ICIxc3QiKSAlPiUgYXJyYW5nZShkZXNjKGFnZSkpDQoNClRJVEFOSUMgJT4lIGZpbHRlciAoc2V4ID09Im1hbGUiICYgc3Vydml2ZWQgPT0iWWVzIiAmIHBjbGFzcyA9PSAiMXN0IikgJT4lIGFycmFuZ2UoZGVzYyhhZ2UpKQ0KYGBgDQoNCioqQU5TV0VSOioqDQoNCk9sZGVzdCBmZW1hbGUgaW4gMXN0IGNsYXNzIHN1cnZpdmVkIHdhcyA3NiB5ZWFycyBvZiBhZ2UuDQoNCk9sZGVzdCBtYWxlIGluIDFzdCBjbGFzcyBzdXJ2aXZlZCB3YXMgODAgeWVhcnMgb2YgYWdlLg0KDQojIyMjICoqZykgKDEwIHBvaW50cykqKiBEbyB0aGUgZGF0YSBzdWdnZXN0IHRoYXQgdGhlIGZpbmFsIGhvdXJzIGFib2FyZCB0aGUgVGl0YW5pYyB3ZXJlIGNoYXJhY3Rlcml6ZWQgYnkgY2xhc3Mgd2FyZmFyZSwgbWFsZSBjaGl2YWxyeSwgc29tZSBjb21iaW5hdGlvbiBvZiBib3RoLCBvciBuZWl0aGVyPyBKdXN0aWZ5IHlvdXIgYW5zd2VyIGJhc2VkIG9uIGNvbXB1dGF0aW9ucyBhYm92ZSwgb3IgYmFzZWQgb24gb3RoZXIgZXhwbG9yYXRpb25zIG9mIHRoZSBkYXRhLg0KDQoqKkhpbnQ6KiogUmV2aWV3IGFuZCBleHBsYWluIHRoZSBleHBsb3JhdG9yeSBncmFwaHMgY3JlYXRlZCBieSB0aGUgY29kZSBjaHVuay4gSG93IHRoZXkgc3VwcG9ydCB5b3UganVzdGlmaWNhdGlvbj8NCg0KSSB0aGluayB0aGUgZGF0YSBzdWdnZXN0IHRoYXQgdGhlcmUgd2FzIGEgY29tYmluYXRpb24gb2YgYm90aCBiYXNlZCBvbiB0aGUgZmFjdCB0aGF0IGxhcmdlIHBvcnRpb24gb2YgdGhvc2Ugd2hvIGRpZWQgd2VyZSBtZW4gYW5kIGEgbGFyZ2UgcG9ydGlvbiB3aGVyZSAzcmQgY2xhc3MuDQoNCmBgYHtyIHBhcnQgZXh0cmF9DQoNClRJVEFOSUMgJT4lICBnZ3Bsb3QoYWVzKHggPSBzdXJ2aXZlZCkpICsNCiAgZ2VvbV9iYXIoYWVzKGZpbGwgPSBzZXgpLCBzdGF0ID0gImNvdW50IiwgcG9zaXRpb24gPSAic3RhY2siICkgKw0KICB0aGVtZV9idygpDQoNClRJVEFOSUMgJT4lICBnZ3Bsb3QoYWVzKHggPSBzdXJ2aXZlZCkpICsNCiAgZ2VvbV9iYXIoYWVzKGZpbGwgPSBwY2xhc3MpLCBzdGF0ID0gImNvdW50IiwgcG9zaXRpb24gPSAic3RhY2siICkgKw0KICB0aGVtZV9idygpDQoNCmBgYA0KDQojIyBUYXNrIDEgKEV4dHJhIENyZWRpdCwgMTAgcHRzKTogUHJvZHVjZSBDTEVBTiBkYXRhIGZyb20gdGhlIFRJVEFOSUMgZGF0YSBieSByZW1vdmluZyBhbGwgb2JzZXJ2YXRpb24gd2l0aCBgTkFgDQoNCkNvbW1lbnQ6IEluIG1vc3Qgb2YgdGhlIGNvZGUgeW91IHVzZWQvd3JvdGUgaW4gKipUYXNrIDEqKiwgZnVuY3Rpb25zIHdlcmUgY2FsbGVkIHdpdGggYXJndW1lbnQgYG5hLnJtID0gVFJVRWAsIGluc3RydWN0aW5nIHRoZSBgTkFgIHZhbHVlcyB0byBiZSBkcm9wcGVkIGZvciB0aGUgY29tcHV0YXRpb25zLg0KDQoqKnBhcnQgMSkgKDUgcG9pbnRzKSoqIFVzZSB0aGUgZnVuY3Rpb24gYG5hLm9taXQoKWAob3IgdGhlIGBmaWx0ZXIoKWApIGZ1bmN0aW9uIGZyb20gYGRwbHlyYCBwYWNrYWdlIHRvIGNyZWF0ZSBhICoqY2xlYW4qKiBkYXRhIHNldCB0aGF0IHJlbW92ZXMgc3ViamVjdHMgaWYgYW55IG9ic2VydmF0aW9ucyBvbiB0aGUgc3ViamVjdCBhcmUgKip1bmtub3duKiogU3RvcmUgdGhlIG1vZGlmaWVkIGRhdGEgZnJhbWUgaW4gYSBkYXRhIGZyYW1lIG5hbWVkIGBDTEVBTmAuIFJ1biB0aGUgZnVuY3Rpb24gYGRpbSgpYCBvbiB0aGUgZGF0YSBmcmFtZSBgQ0xFQU5gIHRvIGZpbmQgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMocm93cykgaW4gdGhlIGBDTEVBTmAgZGF0YS4NCg0KQ09NUExFVEUgVEhFIENPREUgSEVSRSwgdW5jb21tZW50IG5lY2Vzc2FyeSBsaW5lcyBiZWZvcmUgcnVubmluZzoNCg0KYGBge3IgcGFydCAxIGV4dHJhX2NyZWRpdH0NCkNMRUFOIDwtIG5hLm9taXQoVElUQU5JQykNCg0KI3ByaW50IHRoZSBkaW1lbnNpb25zDQpkaW0oQ0xFQU4pDQpgYGANCg0KKipwYXJ0IDIpICg1IHBvaW50cykqKiBIb3cgbWFueSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgZGF0YSBmcmFtZSBgVElUQU5JQ2AgYXJlIHRoZXJlPyBIb3cgbWFueSByb3dzIG9mIGBUSVRBTklDYCBoYXZlIG5vIG1pc3NpbmcgdmFsdWVzLCBvbmUgbWlzc2luZyB2YWx1ZSwgdHdvIG1pc3NpbmcgdmFsdWVzLCBhbmQgdGhyZWUgbWlzc2luZyB2YWx1ZXMsIHJlc3BlY3RpdmVseT8gTm90ZTogdGhlIG51bWJlciBvZiByb3dzIGluIGBDTEVBTmAgc2hvdWxkIGFncmVlIHdpdGggeW91ciBhbnN3ZXIgZm9yIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBgVElUQU5JQ2AgdGhhdCBoYXZlIG5vIG1pc3NpbmcgdmFsdWVzLiBXaGF0IGFyZSB0aGUgY29ucyBvZiBjbGVhbmluZyB0aGUgZGF0YSBpbiB0aGUgc3VnZ2VzdGVkIHdheT8NCg0KVXNlIHRoZSBjb2RlLCBleHBsYWluIHdoYXQgaXQgZG9lcy4NCg0KYGBge3IgcGFydCAyIGV4dHJhX2NyZWRpdH0NCiNnZXQgdGhlIG51bWJlciBvZiBtaXNzaW5nIHZhbHVlcyBpbiBjb2x1bW5zDQpjb2xOQXM8LSBjb2xTdW1zKGlzLm5hKFRJVEFOSUMpKQ0KKGNvbE5BcyA8LSBhcy52ZWN0b3IoY29sU3Vtcyhpcy5uYShUSVRBTklDKSkpKSAjIGNvZXJjZSB0byBhIHZlY3RvciANCg0Kcm93TkFzIDwtIHRhYmxlKHJvd1N1bXMoaXMubmEoVElUQU5JQykpKQ0KKHJvd05BcyA8LSBhcy52ZWN0b3IodGFibGUocm93U3Vtcyhpcy5uYShUSVRBTklDKSkpKSkgIyBjb2VyY2UgdG8gYSB2ZWN0b3INCmBgYA0KDQoqKkNvbW1lbnQ6KiogVGhlIG1pc3NpbmcgdmFsdWVzIGFyZSBmb3IgdmFyaWFibGVzICoqYWdlLCBmYXJlLCBhbmQgYm9keSoqLg0KDQoqKkNvbW1lbnQ6KiogVGhlcmUgYXJlICoqMTE5Kiogcm93cyB3aXRoIG5vIG1pc3NpbmcgdmFsdWVzLCAqKjkyOCoqIHJvd3Mgd2l0aCAxIG1pc3NpbmcgdmFsdWUsIGFuZCAqKjI2MioqIHJvd3Mgd2l0aCAyIG1pc3NpbmcgdmFsdWVzLg0KDQpDb21tZW50IGhvdyB0aGlzIGFsaWduIHdpdGggdGhlIGRpbWVuc2lvbnMgb2YgeW91ciBgQ0xFQU5gIGRhdGEuIFw+ICoqWW91ciBjb21tZW50OiBUaGUgQ0xFQU4gZGF0YSBhbGlnbnMgd2l0aCB0aGUgMTE5IHJvd3Mgd2l0aCBubyBtaXNzaW5nIGRhdGEgYWNyb3NzIHRoZSAxNCBjb2x1bW5zKioNCg0KKipHb29kIHByYWN0aWNlOioqIFNhdmUgeW91ciBjdXN0b21pemVkIGRhdGEgZnJhbWUgYENMRUFOYCBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGFzIGEgYCouY3N2YCBmaWxlIHVzaW5nIHRoZSBmdW5jdGlvbiBgd3JpdGUuY3N2KClgIHVzaW5nIHRoZSBhcmd1bWVudCBgcm93Lm5hbWVzID0gRkFMU0VgLg0KDQpgYGB7ciBzYXZlfQ0Kd3JpdGUuY3N2KENMRUFOLCBmaWxlPSJUSVRBTklDX0NMRUFOLmNzdiIsIHJvdy5uYW1lcz1GQUxTRSkNCmBgYA0KDQojIyBUYXNrIDI6ICoqVGhpcyBpcyBwcm9ibGVtIDkgb24gcGFnZSAxOTcgaW4gdGhlIHRleHQqKiBhcyBpcy4NCg0KKipOb3RlOioqIFRoaXMgaXMgKipub3QgZ3VpZGVkKiogdGFzaywgeW91IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gY29kZSBmcm9tIHNjcmF0Y2ghDQoNClVzZSB0aGUgQ0FSUzIwMDQgZGF0YSBmcmFtZSBmcm9tIHRoZSBgUEFTV1IyYCBwYWNrYWdlLCB3aGljaCBjb250YWlucyB0aGUgbnVtYmVycyBvZiBjYXJzIHBlciBgMTAwMGAgaW5oYWJpdGFudHMgKGBjYXJzYCksIHRoZSB0b3RhbCBudW1iZXIgb2Yga25vd24gbW9ydGFsIGFjY2lkZW50cyAoYGRlYXRoc2ApLCBhbmQgdGhlIGNvdW50cnkgcG9wdWxhdGlvbi8xMDAwIChgcG9wdWxhdGlvbmApIGZvciB0aGUgMjUgbWVtYmVyIGNvdW50cmllcyBvZiB0aGUgRXVyb3BlYW4gVW5pb24gZm9yIHRoZSB5ZWFyIDIwMDQuDQoNCiMjIyMgKiphKSAoMTAgcG9pbnRzKSoqIENvbXB1dGUgdGhlIHRvdGFsIG51bWJlciBvZiBjYXJzIHBlciAxMDAwIGluaGFiaXRhbnRzIGluIGVhY2ggY291bnRyeSwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYW4gb2JqZWN0IG5hbWVkIGB0b3RhbC5jYXJzYC4gRGV0ZXJtaW5lIHRoZSB0b3RhbCBudW1iZXIgb2Yga25vd24gYXV0b21vYmlsZSBmYXRhbGl0aWVzIGluIDIwMDQgZGl2aWRlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIGNhcnMgZm9yIGVhY2ggY291bnRyeSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhbiBvYmplY3QgbmFtZWQgYGRlYXRoLnJhdGVgLg0KDQpZT1VSIENPREU6DQoNCmBgYHtyfQ0KbGlicmFyeSgpDQpgYGANCg0KKipBTlNXRVI6KioNCg0KIyMjIyAqKmIpICgxMCBwb2ludHMpKiogQ3JlYXRlIGEgYmFycGxvdCBzaG93aW5nIHRoZSBhdXRvbW9iaWxlIGRlYXRoIHJhdGUgZm9yIGVhY2ggb2YgdGhlIEV1cm9wZWFuIFVuaW9uIG1lbWJlciBjb3VudHJpZXMuIE1ha2UgdGhlIGJhcnMgaW5jcmVhc2UgaW4gbWFnbml0dWRlIHNvIHRoYXQgdGhlIGNvdW50cmllcyB3aXRoIHRoZSBzbWFsbGVzdCBhdXRvbW9iaWxlIGRlYXRoIHJhdGVzIGFwcGVhciBmaXJzdC4NCg0KWU9VUiBDT0RFOg0KDQpgYGB7cn0NCg0KYGBgDQoNCioqQU5TV0VSOioqDQoNCiMjIyMgKipjKSAoMTAgcG9pbnRzKSoqIFdoaWNoIGNvdW50cnkgaGFzIHRoZSBsb3dlc3QgYXV0b21vYmlsZSBkZWF0aCByYXRlPyBXaGljaCBjb3VudHJ5IGhhcyB0aGUgaGlnaGVzdCBhdXRvbW9iaWxlIGRlYXRoIHJhdGU/DQoNCllPVVIgQ09ERToNCg0KYGBge3J9DQoNCmBgYA0KDQoqKkFOU1dFUjoqKg0KDQojIyMjICoqZCkgKDEwIHBvaW50cykqKiBXaGljaCBjb3VudHJ5IGhhcyB0aGUgbG93ZXN0IGF1dG9tb2JpbGUgZGVhdGggcmF0ZT8gV2hpY2ggY291bnRyeSBoYXMgdGhlIGhpZ2hlc3QgYXV0b21vYmlsZSBkZWF0aCByYXRlPw0KDQpZT1VSIENPREU6DQoNCmBgYHtyfQ0KDQpgYGANCg0KKipBTlNXRVI6KioNCg0KIyMjIyAqKmUpICgxMCBwb2ludHMpKiogRmluZCB0aGUgbGVhc3Qgc3F1YXJlcyBlc3RpbWF0ZXMgZm9yIHJlZ3Jlc3NpbmcgcG9wdWxhdGlvbiBvbiBgdG90YWwuY2Fyc2AuIFN1cGVyaW1wb3NlIHRoZSBsZWFzdCBzcXVhcmVzIGxpbmUgb24gdGhlIHNjYXR0ZXJwbG90IGZyb20gKGQpLiBXaGF0IHBvcHVsYXRpb24gZG9lcyB0aGUgbGVhc3Qgc3F1YXJlcyBtb2RlbCBwcmVkaWN0IGZvciBhIGNvdW50cnkgd2l0aCBhIGB0b3RhbC5jYXJzYCB2YWx1ZSBvZiAxOTIyNC42MzA/IEZpbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9wdWxhdGlvbiBwcmVkaWN0ZWQgZnJvbSB0aGUgbGVhc3Qgc3F1YXJlcyBtb2RlbCBhbmQgdGhlIGFjdHVhbCBwb3B1bGF0aW9uIGZvciB0aGUgY291bnRyeSB3aXRoIGEgYHRvdGFsLmNhcnNgIHZhbHVlIG9mIDE5MjI0LjYzMC4NCg0KWU9VUiBDT0RFOg0KDQpgYGB7cn0NCg0KYGBgDQoNCioqQU5TV0VSOioqDQoNCiMjIyMgKipmKSAoMTAgcG9pbnRzKSoqIENyZWF0ZSBhIHNjYXR0ZXJwbG90IG9mIGB0b3RhbC5jYXJzYCB2ZXJzdXMgYGRlYXRoLnJhdGVgLiBIb3cgd291bGQgeW91IGNoYXJhY3Rlcml6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHR3byB2YXJpYWJsZXM/DQoNCllPVVIgQ09ERToNCg0KYGBge3J9DQoNCmBgYA0KDQoqKkFOU1dFUjoqKg0KDQojIyMjICoqZykgKDEwIHBvaW50cykqKiBDb21wdXRlIFNwZWFybWFuJ3MgcmFuayBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBvZiBgdG90YWwuY2Fyc2AgYW5kIGBkZWF0aC5yYXRlYC4gKEhpbnQ6IFVzZSBgY29yKHgsIHksIG1ldGhvZD3igJxzcGVhcm1hbuKAnSlgLikgV2hhdCBpcyB0aGlzIGNvZWZmaWNpZW50IG1lYXN1cmluZz8NCg0KWU9VUiBDT0RFOg0KDQpgYGB7cn0NCg0KYGBgDQoNCioqQU5TV0VSOioqDQoNCiMjIyMgKipoKSAoMTAgcG9pbnRzKSoqIFBsb3QgdGhlIGxvZ2FyaXRobSBvZiBgdG90YWwuY2Fyc2AgdmVyc3VzIHRoZSBsb2dhcml0aG0gb2YgYGRlYXRoLnJhdGVgLiBIb3cgd291bGQgeW91IGNoYXJhY3Rlcml6ZSB0aGUgcmVsYXRpb25zaGlwPw0KDQpZT1VSIENPREU6DQoNCmBgYHtyfQ0KDQpgYGANCg0KKipBTlNXRVI6KioNCg0KIyMgVGFzayAzICoqKDEwIHBvaW50cykqKiBDcmVhdGUgYSBtYXAgd2l0aCBsZWFmbGV0IHBhY2thZ2UsIGJ5IGNvbXBsZXRpbmcgdGhlIGNvZGUgYmVsb3csIHRoYXQgZGlzcGxheXMgNSBVTkMgc3lzdGVtIHNjaG9vbHMgdXNpbmcgdGhlaXIgZ2VvZ3JhcGhpYyBsb2NhdGlvbnMuIERyYXcgY2lyY2xlcyB3aXRoIHJhZGl1cyBwcm9wb3J0aW9uYXRlIHRvIHRoZSBzY2hvb2wgc2l6ZSB1c2luZyB0aGUgYGFkZENpcmNsZXMoKWAgZnVuY3Rpb24uDQoNClRyeTogRS5nLiBgYWRkQ2lyY2xlcyh3ZWlnaHQgPSAxLCByYWRpdXMgPSBzcXJ0KFVOQ19zY2hvb2xzJHNpemUpKjEwMClgDQoNCmBgYHtyfQ0KDQpzZXQuc2VlZCgxMjMpDQoNCmxpYnJhcnkobGVhZmxldCkNCg0KIyBUaGUgY29kZSBiZWxvdyB3aWxsIGNyZWF0ZSBsaXN0IG9mIDUgVU5DIHVuaXZlcnNpdHkgZGF0YSBwb2ludHMgd2l0aCBsYXQgJiBsbmcsIG5hbWUgYW5kIHNjaG9vbCBzaXplDQojIENyZWF0ZSBkYXRhIGZyYW1lIHdpdGggY29sdW1uIHZhcmlhYmxlcyBuYW1lIChvZiBVTkMgc2Nob29sKSwgc3R1ZGVudHMgKHNpemUpLCBsYXQsIGxuZykNClVOQ19zY2hvb2xzIDwtIGRhdGEuZnJhbWUobmFtZSA9IGMoIk5DIFN0YXRlIiwgIlVOQyBDaGFwZWwgSGlsbCIsICJGU1UiLCAiRUNVIiwgIlVOQyBDaGFybG90dGUiLCAiVU5DIEdyZWVuc2Jvcm8iLCAiVU5DIFdpbG1pbmd0b24iLCAiQ2FtcGJlbGwgVW5pdmVyc2l0eSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGMoMzAxMzAsIDI4MTM2LCA2MDAwLCAyNTk5MCwgMjU5OTAsIDEzODYyLCAxMzk2MCwgMjkzMyksDQogICAgICAgICAgICAgICAgICAgICAgICBsYXQgPSBjKDM2LjAzNzM2MzgsIDM1LjkwNTAzNTMsIDM1LjA3MjYsIDM1LjYwNzM3NjksIDM1LjIwMzYzMjUsIDM2LjA2ODksIDM0LjIyMzksIDM1LjQwODIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbG5nID0gYygtNzkuMDM1NTY2MywgLTc5LjA0Nzc1MzMsIC03OC44OTI0NzM5LCAtNzcuMzY3MTU2NiwgLTgwLjg0MDExNDUsIC03OS44MTAyLCAtNzcuODY5NiwgLTc4LjczOTgpKQ0KDQoNCiMgVXNlIHRoZSBkYXRhIGZyYW1lIHRvIGRyYXcgbWFwIGFuZCBjaXJjbGVzIHByb3BvcnRpb25hbCB0byB0aGUgc2Nob29sIHNpemVzIG9mIHRoZSBjaXRpZXMNClVOQ19zY2hvb2xzICU+JQ0KICBsZWFmbGV0KCkgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZENpcmNsZXMod2VpZ2h0ID0gMSwgcmFkaXVzID0gc3FydChVTkNfc2Nob29scyRzaXplKSo3NSkgIyB0cnkgYWRqdXN0aW5nIHRoZSByYWRpdXMgYnkgbXVsdGlwbHlpbmcgd2l0aCA1MCBpbnN0ZWFkIG9mIDEwMC4gV2hhdCBkbyB5b3Ugbm90aWNlPyBUaGUgQ2lyY2xlcyBnb3Qgc21hbGxlciBpbiBzaXplDQoNCmBgYA0KDQojIyBUYXNrIDMgKEV4dHJhIENyZWRpdCwgNSBwdHMpOiBBZGQgYXQgbGVhc3QgdHdvIG1vcmUgVU5DIHNjaG9vbHMsIHVzaW5nIHRoZWlyIGxvY2F0aW9uIGRhdGEgYW5kIGVucm9sbG1lbnQgbnVtYmVycy4gTW9kaWZ5IHRoZSBjb2RlIGFib3ZlIGFuZCB1cGRhdGUgdGhlIG1hcCBmb3IgYWxsIHNjaG9vbHMgaW5jbHVkZWQuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyMgRE8gTk9UIENIQU5HRSBBTllUSElORyBJTiBUSElTIENPREUgQ0hVTkshDQpkYXRlKCkNCnNlc3Npb25JbmZvKCkNClIuVmVyc2lvbigpDQpgYGANCg==