# Read in data
#The firstbasestats.csv file contains all the first base players’ stats.
#We can read this file in R using the read.csv() function.
firstbase = read.csv("firstbasestats.csv")
#Declared the variable firstbase
#Use the function read.csv() to read the file "firstbasestats.csv" and assign the contens to the variable firstbase
str(firstbase)
'data.frame': 23 obs. of 15 variables:
$ Player : chr "Freddie Freeman" "Jose Abreu" "Nate Lowe" "Paul Goldschmidt" ...
$ Pos : chr "1B" "1B" "1B" "1B" ...
$ Team : chr "LAD" "CHW" "TEX" "STL" ...
$ GP : int 159 157 157 151 160 140 160 145 146 143 ...
$ AB : int 612 601 593 561 638 551 583 555 545 519 ...
$ H : int 199 183 179 178 175 152 141 139 132 124 ...
$ X2B : int 47 40 26 41 35 27 25 28 40 23 ...
$ HR : int 21 15 27 35 32 20 36 22 8 18 ...
$ RBI : int 100 75 76 115 97 84 94 85 53 63 ...
$ AVG : num 0.325 0.305 0.302 0.317 0.274 0.276 0.242 0.251 0.242 0.239 ...
$ OBP : num 0.407 0.379 0.358 0.404 0.339 0.34 0.327 0.305 0.288 0.319 ...
$ SLG : num 0.511 0.446 0.492 0.578 0.48 0.437 0.477 0.423 0.36 0.391 ...
$ OPS : num 0.918 0.824 0.851 0.981 0.818 0.777 0.804 0.729 0.647 0.71 ...
$ WAR : num 5.77 4.19 3.21 7.86 3.85 3.07 5.05 1.32 -0.33 1.87 ...
$ Payroll.Salary2023: num 27000000 19500000 4050000 26000000 14500000 ...
#Use the str() funtion to provides a concise summary of the structure of firstbase, including the number of observations (rows) and variables (columns), along with the data type and first few values of each variable.
summary(firstbase)
Player Pos Team GP AB H X2B HR RBI
Length:23 Length:23 Length:23 Min. : 5.0 Min. : 14.0 Min. : 3.0 Min. : 1.00 Min. : 0.00 Min. : 1.00
Class :character Class :character Class :character 1st Qu.:105.5 1st Qu.:309.0 1st Qu.: 74.5 1st Qu.:13.50 1st Qu.: 8.00 1st Qu.: 27.00
Mode :character Mode :character Mode :character Median :131.0 Median :465.0 Median :115.0 Median :23.00 Median :18.00 Median : 63.00
Mean :120.2 Mean :426.9 Mean :110.0 Mean :22.39 Mean :17.09 Mean : 59.43
3rd Qu.:152.0 3rd Qu.:558.0 3rd Qu.:146.5 3rd Qu.:28.00 3rd Qu.:24.50 3rd Qu.: 84.50
Max. :160.0 Max. :638.0 Max. :199.0 Max. :47.00 Max. :36.00 Max. :115.00
AVG OBP SLG OPS WAR Payroll.Salary2023
Min. :0.2020 Min. :0.2140 Min. :0.2860 Min. :0.5000 Min. :-1.470 Min. : 720000
1st Qu.:0.2180 1st Qu.:0.3030 1st Qu.:0.3505 1st Qu.:0.6445 1st Qu.: 0.190 1st Qu.: 739200
Median :0.2420 Median :0.3210 Median :0.4230 Median :0.7290 Median : 1.310 Median : 4050000
Mean :0.2499 Mean :0.3242 Mean :0.4106 Mean :0.7346 Mean : 1.788 Mean : 6972743
3rd Qu.:0.2750 3rd Qu.:0.3395 3rd Qu.:0.4690 3rd Qu.:0.8175 3rd Qu.: 3.140 3rd Qu.: 8150000
Max. :0.3250 Max. :0.4070 Max. :0.5780 Max. :0.9810 Max. : 7.860 Max. :27000000
#We used the function summary() to generate a summary of each variable (column) in firstbase. The output includes:
#For numeric variables (int or num):
#Minimum value (Min): The smallest value in the variable.
#1st Quartile (1st Qu): The value below which 25% of the data falls (Q1 or lower quartile).
#Median (Median or 50th percentile): The middle value in the sorted variable (Q2).
#Mean (Mean): The average value of the variable.
#3rd Quartile (3rd Qu): The value below which 75% of the data falls (Q3 or upper quartile).
#Maximum value (Max): The largest value in the variable.
#For categorical or character variables (chr):
#Counts of each unique value.
#Example
#Length:23: Indicates there are 23 observations (rows) in firstbase.
#Class :character, Mode :character: Indicates Player is a character variable (names of players).
# Linear Regression (one variable)
#lm() function is used to fit linear models, and the summary() function provides a detailed summary of the fitted model.
#lm(Payroll.Salary2023 ~ RBI, data = firstbase): This line of code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable) and RBI is the independent variable (predictor variable). data = firstbase specifies that R should use the data stored in the data frame firstbase.
#model1 <- lm(...): Assigns the linear regression model object to the variable model1.
#summary(model1): The summary() function then provides a detailed summary of the fitted linear regression model model1. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.
model1 = lm(Payroll.Salary2023 ~ RBI, data=firstbase)
summary(model1)
Call:
lm(formula = Payroll.Salary2023 ~ RBI, data = firstbase)
Residuals:
Min 1Q Median 3Q Max
-10250331 -5220790 -843455 2386848 13654950
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2363744 2866320 -0.825 0.41883
RBI 157088 42465 3.699 0.00133 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6516000 on 21 degrees of freedom
Multiple R-squared: 0.3945, Adjusted R-squared: 0.3657
F-statistic: 13.68 on 1 and 21 DF, p-value: 0.001331
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.
#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.
#Model Fit:
#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 6516000.
#Multiple R-squared: This is the coefficient of determination, which measures the proportion of variance in the dependent variable (Payroll.Salary2023) that is explained by #the independent variable (RBI). In this case, Multiple R-squared is 0.3945, indicating that 39.45% of the variance in Payroll.Salary2023 is explained by RBI.
#Adjusted R-squared: This is the R-squared adjusted for the number of predictors in the model. It penalizes for adding predictors that do not improve the model's fit. In this case, Adjusted R-squared is 0.3657, which is slightly lower than Multiple R-squared.
#F-statistic: This statistic tests the overall significance of the model. It compares the fit of the intercept-only model (null model) with the fit of the current model. In this case, the F-statistic is 13.68 with 1 and 21 degrees of freedom, and the associated p-value (0.001331) indicates that the model as a whole is statistically significant.
# Sum of Squared Errors
#This expression retrieves the residuals from the linear regression model model1.
model1$residuals
1 2 3 4 5 6 7 8 9 10 11 12 13
13654950.2 10082148.6 -5524939.3 10298631.2 1626214.0 -6731642.8 -5902522.2 -10250330.7 -4711916.8 -532796.1 -6667082.5 -6696203.1 7582148.6
14 15 16 17 18 19 20 21 22 23
-4916640.9 -1898125.3 -336532.3 -995042.5 -1311618.3 -843454.5 8050721.3 1250336.9 1847040.4 2926656.0
#SSE represents the sum of the squared differences between the observed values of the dependent variable
#model1$residuals^2: This calculates the squared value of each residual in model1.
#sum(model1$residuals^2): This computes the sum of all squared residuals, resulting in the SSE
SSE = sum(model1$residuals^2)
SSE #Printing the values of SSE. In this case 8.914926e+14
[1] 8.914926e+14
# Linear Regression (two variables)
#fit a multiple linear regression model. In this case model2, which includes more than one predictor variable (AVG and RBI)
model2 = lm(Payroll.Salary2023 ~ AVG + RBI, data=firstbase)
#This code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable), and AVG and RBI are the independent variables (predictor variables) taken from the firstbase dataset.
#model2 <- lm(...): Assigns the linear regression model object to the variable model2.
#summary(model2): The summary() function then provides a detailed summary of the fitted linear regression model model2. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.
summary(model2)
Call:
lm(formula = Payroll.Salary2023 ~ AVG + RBI, data = firstbase)
Residuals:
Min 1Q Median 3Q Max
-9097952 -4621582 -33233 3016541 10260245
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -18083756 9479037 -1.908 0.0709 .
AVG 74374031 42934155 1.732 0.0986 .
RBI 108850 49212 2.212 0.0388 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6226000 on 20 degrees of freedom
Multiple R-squared: 0.4735, Adjusted R-squared: 0.4209
F-statistic: 8.994 on 2 and 20 DF, p-value: 0.001636
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.
#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.
#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 6226000.
#Statistical Significance:
#RBI is statistically significant (p-value = 0.0388).
#AVG shows marginal significance (p-value = 0.0986)
#Model Fit.
#Multiple R-squared: Approximately 47.35% of the variance in Payroll.Salary2023 is explained by AVG and RBI.
# Sum of Squared Errors
#SSE represents the sum of the squared differences between the observed values of the dependent variable
#model1$residuals^2: This calculates the squared value of each residual in model1.
#sum(model1$residuals^2): This computes the sum of all squared residuals, resulting in the SSE
SSE = sum(model2$residuals^2)
SSE #Printing the values of SSE. In this case 7.751841e+14
[1] 7.751841e+14
# Linear Regression (all variables)
#fit a multiple linear regression model. In this case model3, which includes more than one predictor variable (HR,RBI,AVG,OPB and OPS)
#This code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable), and HR,RBI,AVG,OPB and OPS are the independent variables (predictor variables) taken from the firstbase dataset.
#model3 <- lm(...): Assigns the linear regression model object to the variable model3.
#summary(model3): The summary() function then provides a detailed summary of the fitted linear regression model model3. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.
model3 = lm(Payroll.Salary2023 ~ HR + RBI + AVG + OBP+ OPS, data=firstbase)
summary(model3)
Call:
lm(formula = Payroll.Salary2023 ~ HR + RBI + AVG + OBP + OPS,
data = firstbase)
Residuals:
Min 1Q Median 3Q Max
-9611440 -3338119 64016 4472451 9490309
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -31107859 11738494 -2.650 0.0168 *
HR -341069 552069 -0.618 0.5449
RBI 115786 113932 1.016 0.3237
AVG -63824769 104544645 -0.611 0.5496
OBP 27054948 131210166 0.206 0.8391
OPS 60181012 95415131 0.631 0.5366
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6023000 on 17 degrees of freedom
Multiple R-squared: 0.5811, Adjusted R-squared: 0.4579
F-statistic: 4.717 on 5 and 17 DF, p-value: 0.006951
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.
#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.
#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 6023000.
#Model Fit.
#Multiple R-squared: Approximately 58.11% of the variance in Payroll.Salary2023 is explained by HR,RBI,AVG,OPB and OPS.
# Sum of Squared Errors
SSE = sum(model3$residuals^2)
SSE
[1] 6.167793e+14
# Remove HR
# Linear Regression (all variables)
#fit a multiple linear regression model. In this case model3, which includes more than one predictor variable (RBI,AVG,OPB and OPS)
#This code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable), and RBI,AVG,OPB and OPS are the independent variables (predictor variables) taken from the firstbase dataset.
#model4 <- lm(...): Assigns the linear regression model object to the variable model4.
#summary(model3): The summary() function then provides a detailed summary of the fitted linear regression model model2. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.
model4 = lm(Payroll.Salary2023 ~ RBI + AVG + OBP + OPS, data=firstbase)
summary(model4)
Call:
lm(formula = Payroll.Salary2023 ~ RBI + AVG + OBP + OPS, data = firstbase)
Residuals:
Min 1Q Median 3Q Max
-9399551 -3573842 98921 3979339 9263512
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -29466887 11235931 -2.623 0.0173 *
RBI 71495 87015 0.822 0.4220
AVG -11035457 59192453 -0.186 0.8542
OBP 86360720 87899074 0.982 0.3389
OPS 9464546 47788458 0.198 0.8452
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5919000 on 18 degrees of freedom
Multiple R-squared: 0.5717, Adjusted R-squared: 0.4765
F-statistic: 6.007 on 4 and 18 DF, p-value: 0.00298
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.
#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.
#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 5919000.
#Model Fit.
#Multiple R-squared: Approximately 57.17% of the variance in Payroll.Salary2023 is explained by RBI,AVG,OPB and OPS.
firstbase<-firstbase[,-(1:3)]
# Correlations
cor(firstbase$RBI, firstbase$Payroll.Salary2023)
[1] 0.6281239
cor(firstbase$AVG, firstbase$OBP)
[1] 0.8028894
cor(firstbase)
GP AB H X2B HR RBI AVG OBP SLG OPS WAR Payroll.Salary2023
GP 1.0000000 0.9779421 0.9056508 0.8446267 0.7432552 0.8813917 0.4430808 0.4841583 0.6875270 0.6504483 0.5645243 0.4614889
AB 0.9779421 1.0000000 0.9516701 0.8924632 0.7721339 0.9125839 0.5126292 0.5026125 0.7471949 0.6980141 0.6211558 0.5018820
H 0.9056508 0.9516701 1.0000000 0.9308318 0.7155225 0.9068893 0.7393167 0.6560021 0.8211406 0.8069779 0.7688712 0.6249911
X2B 0.8446267 0.8924632 0.9308318 1.0000000 0.5889699 0.8485911 0.6613085 0.5466537 0.7211259 0.6966830 0.6757470 0.6450730
HR 0.7432552 0.7721339 0.7155225 0.5889699 1.0000000 0.8929048 0.3444242 0.4603408 0.8681501 0.7638721 0.6897677 0.5317619
RBI 0.8813917 0.9125839 0.9068893 0.8485911 0.8929048 1.0000000 0.5658479 0.5704463 0.8824090 0.8156612 0.7885666 0.6281239
AVG 0.4430808 0.5126292 0.7393167 0.6613085 0.3444242 0.5658479 1.0000000 0.8028894 0.7254274 0.7989005 0.7855945 0.5871543
OBP 0.4841583 0.5026125 0.6560021 0.5466537 0.4603408 0.5704463 0.8028894 1.0000000 0.7617499 0.8987390 0.7766375 0.7025979
SLG 0.6875270 0.7471949 0.8211406 0.7211259 0.8681501 0.8824090 0.7254274 0.7617499 1.0000000 0.9686752 0.8611140 0.6974086
OPS 0.6504483 0.6980141 0.8069779 0.6966830 0.7638721 0.8156612 0.7989005 0.8987390 0.9686752 1.0000000 0.8799893 0.7394981
WAR 0.5645243 0.6211558 0.7688712 0.6757470 0.6897677 0.7885666 0.7855945 0.7766375 0.8611140 0.8799893 1.0000000 0.8086359
Payroll.Salary2023 0.4614889 0.5018820 0.6249911 0.6450730 0.5317619 0.6281239 0.5871543 0.7025979 0.6974086 0.7394981 0.8086359 1.0000000
#In this code we use the function cor() to compute the correlation matrix for numeric columns of the entire dataset, in this case firstbase.
#Removing AVG
model5 = lm(Payroll.Salary2023 ~ RBI + OBP+OPS, data=firstbase)
summary(model5)
Call:
lm(formula = Payroll.Salary2023 ~ RBI + OBP + OPS, data = firstbase)
Residuals:
Min 1Q Median 3Q Max
-9465449 -3411234 259746 4102864 8876798
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -29737007 10855411 -2.739 0.013 *
RBI 72393 84646 0.855 0.403
OBP 82751360 83534224 0.991 0.334
OPS 7598051 45525575 0.167 0.869
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5767000 on 19 degrees of freedom
Multiple R-squared: 0.5709, Adjusted R-squared: 0.5031
F-statistic: 8.426 on 3 and 19 DF, p-value: 0.000913
model6 = lm(Payroll.Salary2023 ~ RBI + OBP, data=firstbase)
summary(model6)
Call:
lm(formula = Payroll.Salary2023 ~ RBI + OBP, data = firstbase)
Residuals:
Min 1Q Median 3Q Max
-9045497 -3487008 139497 4084739 9190185
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -28984802 9632560 -3.009 0.00693 **
RBI 84278 44634 1.888 0.07360 .
OBP 95468873 33385182 2.860 0.00969 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5625000 on 20 degrees of freedom
Multiple R-squared: 0.5703, Adjusted R-squared: 0.5273
F-statistic: 13.27 on 2 and 20 DF, p-value: 0.0002149
# Read in test set
#The firstbasestats_test.csv file contains a test sample of only 2 of the first base players’ stats.
#We can read this file in R using the read.csv() function.
firstbaseTest = read.csv("firstbasestats_test.csv")
#Declared the variable firstbaseTest
#Use the function read.csv() to read the file "firstbasestats.csv" and assign the contens to the variable firstbase
str(firstbaseTest)
'data.frame': 2 obs. of 15 variables:
$ Player : chr "Matt Olson" "Josh Bell"
$ Pos : chr "1B" "1B"
$ Team : chr "ATL" "SD"
$ GP : int 162 156
$ AB : int 616 552
$ H : int 148 147
$ X2B : int 44 29
$ HR : int 34 17
$ RBI : int 103 71
$ AVG : num 0.24 0.266
$ OBP : num 0.325 0.362
$ SLG : num 0.477 0.422
$ OPS : num 0.802 0.784
$ WAR : num 3.29 3.5
$ Payroll.Salary2023: num 21000000 16500000
#Use the str() funtion to provides a concise summary of the structure of firstbase, including the number of observations (rows) and variables (columns), along with the data type and first few values of each variable.
# Make test set predictions
predictTest = predict(model6, newdata=firstbaseTest)
predictTest
1 2
10723186 11558647
# Compute R-squared
SSE = sum((firstbaseTest$Payroll.Salary2023 - predictTest)^2)
SST = sum((firstbaseTest$Payroll.Salary2023 - mean(firstbase$Payroll.Salary2023))^2)
1 - SSE/SST
[1] 0.5477734
LS0tDQp0aXRsZTogIkFjdGl2aXR5XzYiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KIyBSZWFkIGluIGRhdGENCiNUaGUgZmlyc3RiYXNlc3RhdHMuY3N2IGZpbGUgY29udGFpbnMgYWxsIHRoZSBmaXJzdCBiYXNlIHBsYXllcnPigJkgc3RhdHMuIA0KI1dlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQpmaXJzdGJhc2UgPSByZWFkLmNzdigiZmlyc3RiYXNlc3RhdHMuY3N2IikNCiNEZWNsYXJlZCB0aGUgdmFyaWFibGUgZmlyc3RiYXNlIA0KI1VzZSB0aGUgZnVuY3Rpb24gcmVhZC5jc3YoKSB0byByZWFkIHRoZSBmaWxlICJmaXJzdGJhc2VzdGF0cy5jc3YiIGFuZCBhc3NpZ24gdGhlIGNvbnRlbnMgdG8gdGhlIHZhcmlhYmxlIGZpcnN0YmFzZQ0Kc3RyKGZpcnN0YmFzZSkNCiNVc2UgdGhlIHN0cigpIGZ1bnRpb24gdG8gcHJvdmlkZXMgYSBjb25jaXNlIHN1bW1hcnkgb2YgdGhlIHN0cnVjdHVyZSBvZiBmaXJzdGJhc2UsIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyAocm93cykgYW5kIHZhcmlhYmxlcyAoY29sdW1ucyksIGFsb25nIHdpdGggdGhlIGRhdGEgdHlwZSBhbmQgZmlyc3QgZmV3IHZhbHVlcyBvZiBlYWNoIHZhcmlhYmxlLg0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoZmlyc3RiYXNlKQ0KI1dlIHVzZWQgdGhlIGZ1bmN0aW9uIHN1bW1hcnkoKSB0byBnZW5lcmF0ZSBhIHN1bW1hcnkgb2YgZWFjaCB2YXJpYWJsZSAoY29sdW1uKSBpbiBmaXJzdGJhc2UuIFRoZSBvdXRwdXQgaW5jbHVkZXM6DQoNCiNGb3IgbnVtZXJpYyB2YXJpYWJsZXMgKGludCBvciBudW0pOg0KDQojTWluaW11bSB2YWx1ZSAoTWluKTogVGhlIHNtYWxsZXN0IHZhbHVlIGluIHRoZSB2YXJpYWJsZS4NCiMxc3QgUXVhcnRpbGUgKDFzdCBRdSk6IFRoZSB2YWx1ZSBiZWxvdyB3aGljaCAyNSUgb2YgdGhlIGRhdGEgZmFsbHMgKFExIG9yIGxvd2VyIHF1YXJ0aWxlKS4NCiNNZWRpYW4gKE1lZGlhbiBvciA1MHRoIHBlcmNlbnRpbGUpOiBUaGUgbWlkZGxlIHZhbHVlIGluIHRoZSBzb3J0ZWQgdmFyaWFibGUgKFEyKS4NCiNNZWFuIChNZWFuKTogVGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLg0KIzNyZCBRdWFydGlsZSAoM3JkIFF1KTogVGhlIHZhbHVlIGJlbG93IHdoaWNoIDc1JSBvZiB0aGUgZGF0YSBmYWxscyAoUTMgb3IgdXBwZXIgcXVhcnRpbGUpLg0KI01heGltdW0gdmFsdWUgKE1heCk6IFRoZSBsYXJnZXN0IHZhbHVlIGluIHRoZSB2YXJpYWJsZS4NCg0KI0ZvciBjYXRlZ29yaWNhbCBvciBjaGFyYWN0ZXIgdmFyaWFibGVzIChjaHIpOg0KDQojQ291bnRzIG9mIGVhY2ggdW5pcXVlIHZhbHVlLg0KDQojRXhhbXBsZSANCiNMZW5ndGg6MjM6IEluZGljYXRlcyB0aGVyZSBhcmUgMjMgb2JzZXJ2YXRpb25zIChyb3dzKSBpbiBmaXJzdGJhc2UuDQojQ2xhc3MgOmNoYXJhY3RlciwgTW9kZSA6Y2hhcmFjdGVyOiBJbmRpY2F0ZXMgUGxheWVyIGlzIGEgY2hhcmFjdGVyIHZhcmlhYmxlIChuYW1lcyBvZiBwbGF5ZXJzKS4NCg0KYGBgDQpgYGB7cn0NCiMgTGluZWFyIFJlZ3Jlc3Npb24gKG9uZSB2YXJpYWJsZSkNCiNsbSgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZml0IGxpbmVhciBtb2RlbHMsIGFuZCB0aGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHByb3ZpZGVzIGEgZGV0YWlsZWQgc3VtbWFyeSBvZiB0aGUgZml0dGVkIG1vZGVsLiANCg0KI2xtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IFJCSSwgZGF0YSA9IGZpcnN0YmFzZSk6IFRoaXMgbGluZSBvZiBjb2RlIGZpdHMgYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCAobG0pIHdoZXJlIFBheXJvbGwuU2FsYXJ5MjAyMyBpcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChyZXNwb25zZSB2YXJpYWJsZSkgYW5kIFJCSSBpcyB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgKHByZWRpY3RvciB2YXJpYWJsZSkuIGRhdGEgPSBmaXJzdGJhc2Ugc3BlY2lmaWVzIHRoYXQgUiBzaG91bGQgdXNlIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgZGF0YSBmcmFtZSBmaXJzdGJhc2UuDQoNCiNtb2RlbDEgPC0gbG0oLi4uKTogQXNzaWducyB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgb2JqZWN0IHRvIHRoZSB2YXJpYWJsZSBtb2RlbDEuDQoNCiNzdW1tYXJ5KG1vZGVsMSk6IFRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdGhlbiBwcm92aWRlcyBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIGZpdHRlZCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBtb2RlbDEuIFRoaXMgc3VtbWFyeSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGNvZWZmaWNpZW50cywgc3RhbmRhcmQgZXJyb3JzLCB0LXN0YXRpc3RpY3MsIHAtdmFsdWVzLCBhbmQgZ29vZG5lc3Mtb2YtZml0IG1lYXN1cmVzIGxpa2UgUi1zcXVhcmVkLg0KDQptb2RlbDEgPSBsbShQYXlyb2xsLlNhbGFyeTIwMjMgfiBSQkksIGRhdGE9Zmlyc3RiYXNlKQ0Kc3VtbWFyeShtb2RlbDEpDQoNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI01vZGVsIEZpdDoNCiNSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcjogVGhpcyBpcyBhbiBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByZXNpZHVhbHMuIEluIHRoaXMgY2FzZSwgaXQncyBhcHByb3hpbWF0ZWx5IDY1MTYwMDAuDQojTXVsdGlwbGUgUi1zcXVhcmVkOiBUaGlzIGlzIHRoZSBjb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uLCB3aGljaCBtZWFzdXJlcyB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZSBpbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIHRoYXQgaXMgZXhwbGFpbmVkIGJ5ICN0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgKFJCSSkuIEluIHRoaXMgY2FzZSwgTXVsdGlwbGUgUi1zcXVhcmVkIGlzIDAuMzk0NSwgaW5kaWNhdGluZyB0aGF0IDM5LjQ1JSBvZiB0aGUgdmFyaWFuY2UgaW4gUGF5cm9sbC5TYWxhcnkyMDIzIGlzIGV4cGxhaW5lZCBieSBSQkkuDQojQWRqdXN0ZWQgUi1zcXVhcmVkOiBUaGlzIGlzIHRoZSBSLXNxdWFyZWQgYWRqdXN0ZWQgZm9yIHRoZSBudW1iZXIgb2YgcHJlZGljdG9ycyBpbiB0aGUgbW9kZWwuIEl0IHBlbmFsaXplcyBmb3IgYWRkaW5nIHByZWRpY3RvcnMgdGhhdCBkbyBub3QgaW1wcm92ZSB0aGUgbW9kZWwncyBmaXQuIEluIHRoaXMgY2FzZSwgQWRqdXN0ZWQgUi1zcXVhcmVkIGlzIDAuMzY1Nywgd2hpY2ggaXMgc2xpZ2h0bHkgbG93ZXIgdGhhbiBNdWx0aXBsZSBSLXNxdWFyZWQuDQojRi1zdGF0aXN0aWM6IFRoaXMgc3RhdGlzdGljIHRlc3RzIHRoZSBvdmVyYWxsIHNpZ25pZmljYW5jZSBvZiB0aGUgbW9kZWwuIEl0IGNvbXBhcmVzIHRoZSBmaXQgb2YgdGhlIGludGVyY2VwdC1vbmx5IG1vZGVsIChudWxsIG1vZGVsKSB3aXRoIHRoZSBmaXQgb2YgdGhlIGN1cnJlbnQgbW9kZWwuIEluIHRoaXMgY2FzZSwgdGhlIEYtc3RhdGlzdGljIGlzIDEzLjY4IHdpdGggMSBhbmQgMjEgZGVncmVlcyBvZiBmcmVlZG9tLCBhbmQgdGhlIGFzc29jaWF0ZWQgcC12YWx1ZSAoMC4wMDEzMzEpIGluZGljYXRlcyB0aGF0IHRoZSBtb2RlbCBhcyBhIHdob2xlIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuDQoNCmBgYA0KYGBge3J9DQojIFN1bSBvZiBTcXVhcmVkIEVycm9ycw0KI1RoaXMgZXhwcmVzc2lvbiByZXRyaWV2ZXMgdGhlIHJlc2lkdWFscyBmcm9tIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBtb2RlbDEuDQptb2RlbDEkcmVzaWR1YWxzDQpgYGANCg0KYGBge3J9DQojU1NFIHJlcHJlc2VudHMgdGhlIHN1bSBvZiB0aGUgc3F1YXJlZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvYnNlcnZlZCB2YWx1ZXMgb2YgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KI21vZGVsMSRyZXNpZHVhbHNeMjogVGhpcyBjYWxjdWxhdGVzIHRoZSBzcXVhcmVkIHZhbHVlIG9mIGVhY2ggcmVzaWR1YWwgaW4gbW9kZWwxLg0KI3N1bShtb2RlbDEkcmVzaWR1YWxzXjIpOiBUaGlzIGNvbXB1dGVzIHRoZSBzdW0gb2YgYWxsIHNxdWFyZWQgcmVzaWR1YWxzLCByZXN1bHRpbmcgaW4gdGhlIFNTRQ0KU1NFID0gc3VtKG1vZGVsMSRyZXNpZHVhbHNeMikNClNTRSAjUHJpbnRpbmcgdGhlIHZhbHVlcyBvZiBTU0UuIEluIHRoaXMgY2FzZSA4LjkxNDkyNmUrMTQNCmBgYA0KYGBge3J9DQojIExpbmVhciBSZWdyZXNzaW9uICh0d28gdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWwyLCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoQVZHIGFuZCBSQkkpDQptb2RlbDIgPSBsbShQYXlyb2xsLlNhbGFyeTIwMjMgfiBBVkcgKyBSQkksIGRhdGE9Zmlyc3RiYXNlKQ0KI1RoaXMgY29kZSBmaXRzIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgKGxtKSB3aGVyZSBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSAocmVzcG9uc2UgdmFyaWFibGUpLCBhbmQgQVZHIGFuZCBSQkkgYXJlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvciB2YXJpYWJsZXMpIHRha2VuIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0Lg0KDQojbW9kZWwyIDwtIGxtKC4uLik6IEFzc2lnbnMgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG9iamVjdCB0byB0aGUgdmFyaWFibGUgbW9kZWwyLg0KDQojc3VtbWFyeShtb2RlbDIpOiBUaGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHRoZW4gcHJvdmlkZXMgYSBkZXRhaWxlZCBzdW1tYXJ5IG9mIHRoZSBmaXR0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgbW9kZWwyLiBUaGlzIHN1bW1hcnkgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBjb2VmZmljaWVudHMsIHN0YW5kYXJkIGVycm9ycywgdC1zdGF0aXN0aWNzLCBwLXZhbHVlcywgYW5kIGdvb2RuZXNzLW9mLWZpdCBtZWFzdXJlcyBsaWtlIFItc3F1YXJlZC4NCg0Kc3VtbWFyeShtb2RlbDIpDQoNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI1Jlc2lkdWFsIHN0YW5kYXJkIGVycm9yOiBUaGlzIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc2lkdWFscy4gSW4gdGhpcyBjYXNlLCBpdCdzIGFwcHJveGltYXRlbHkgNjIyNjAwMC4NCiNTdGF0aXN0aWNhbCBTaWduaWZpY2FuY2U6DQojUkJJIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKHAtdmFsdWUgPSAwLjAzODgpLg0KI0FWRyBzaG93cyBtYXJnaW5hbCBzaWduaWZpY2FuY2UgKHAtdmFsdWUgPSAwLjA5ODYpDQoNCiNNb2RlbCBGaXQuDQojTXVsdGlwbGUgUi1zcXVhcmVkOiBBcHByb3hpbWF0ZWx5IDQ3LjM1JSBvZiB0aGUgdmFyaWFuY2UgaW4gUGF5cm9sbC5TYWxhcnkyMDIzIGlzIGV4cGxhaW5lZCBieSBBVkcgYW5kIFJCSS4NCg0KYGBgDQpgYGB7cn0NCiMgU3VtIG9mIFNxdWFyZWQgRXJyb3JzDQojU1NFIHJlcHJlc2VudHMgdGhlIHN1bSBvZiB0aGUgc3F1YXJlZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvYnNlcnZlZCB2YWx1ZXMgb2YgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KI21vZGVsMSRyZXNpZHVhbHNeMjogVGhpcyBjYWxjdWxhdGVzIHRoZSBzcXVhcmVkIHZhbHVlIG9mIGVhY2ggcmVzaWR1YWwgaW4gbW9kZWwxLg0KI3N1bShtb2RlbDEkcmVzaWR1YWxzXjIpOiBUaGlzIGNvbXB1dGVzIHRoZSBzdW0gb2YgYWxsIHNxdWFyZWQgcmVzaWR1YWxzLCByZXN1bHRpbmcgaW4gdGhlIFNTRQ0KU1NFID0gc3VtKG1vZGVsMiRyZXNpZHVhbHNeMikNClNTRSAjUHJpbnRpbmcgdGhlIHZhbHVlcyBvZiBTU0UuIEluIHRoaXMgY2FzZSA3Ljc1MTg0MWUrMTQNCmBgYA0KYGBge3J9DQojIExpbmVhciBSZWdyZXNzaW9uIChhbGwgdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWwzLCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoSFIsUkJJLEFWRyxPUEIgYW5kIE9QUykNCiNUaGlzIGNvZGUgZml0cyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIChsbSkgd2hlcmUgUGF5cm9sbC5TYWxhcnkyMDIzIGlzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKHJlc3BvbnNlIHZhcmlhYmxlKSwgYW5kIEhSLFJCSSxBVkcsT1BCIGFuZCBPUFMgYXJlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvciB2YXJpYWJsZXMpIHRha2VuIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0Lg0KDQojbW9kZWwzIDwtIGxtKC4uLik6IEFzc2lnbnMgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG9iamVjdCB0byB0aGUgdmFyaWFibGUgbW9kZWwzLg0KDQojc3VtbWFyeShtb2RlbDMpOiBUaGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHRoZW4gcHJvdmlkZXMgYSBkZXRhaWxlZCBzdW1tYXJ5IG9mIHRoZSBmaXR0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgbW9kZWwzLiBUaGlzIHN1bW1hcnkgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBjb2VmZmljaWVudHMsIHN0YW5kYXJkIGVycm9ycywgdC1zdGF0aXN0aWNzLCBwLXZhbHVlcywgYW5kIGdvb2RuZXNzLW9mLWZpdCBtZWFzdXJlcyBsaWtlIFItc3F1YXJlZC4NCg0KbW9kZWwzID0gbG0oUGF5cm9sbC5TYWxhcnkyMDIzIH4gSFIgKyBSQkkgKyBBVkcgKyBPQlArIE9QUywgZGF0YT1maXJzdGJhc2UpDQpzdW1tYXJ5KG1vZGVsMykNCg0KI1Jlc2lkdWFsczoNCiNSZXNpZHVhbHM6IFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb2JzZXJ2ZWQgdmFsdWVzIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKFBheXJvbGwuU2FsYXJ5MjAyMykgYW5kIHRoZSB2YWx1ZXMgcHJlZGljdGVkIGJ5IHRoZSBtb2RlbC4gVGhlIHN1bW1hcnkgc2hvd3MgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiB0aGUgcmVzaWR1YWxzOg0KI01pbiwgMVEsIE1lZGlhbiwgM1EsIE1heDogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgbWluaW11bSwgMXN0IHF1YXJ0aWxlLCBtZWRpYW4sIDNyZCBxdWFydGlsZSwgYW5kIG1heGltdW0gb2YgdGhlIHJlc2lkdWFscywgcmVzcGVjdGl2ZWx5LiBUaGV5IHByb3ZpZGUgaW5zaWdodCBpbnRvIHRoZSBkaXN0cmlidXRpb24gYW5kIHJhbmdlIG9mIGVycm9ycyBpbiB0aGUgbW9kZWwgcHJlZGljdGlvbnMuDQoNCiNTdGQuIEVycm9yOiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIGVycm9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZWZmaWNpZW50cy4gVGhleSBtZWFzdXJlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgY29lZmZpY2llbnQgZXN0aW1hdGUuDQojdCB2YWx1ZTogVGhpcyBpcyB0aGUgdC1zdGF0aXN0aWMgdmFsdWUsIHdoaWNoIG1lYXN1cmVzIHRoZSBzaWduaWZpY2FuY2Ugb2YgZWFjaCBjb2VmZmljaWVudCBlc3RpbWF0ZS4gSXQncyBjYWxjdWxhdGVkIGFzIEVzdGltYXRlIC8gU3RkLiBFcnJvci4NCiNQcig+fHR8KTogVGhpcyBpcyB0aGUgcC12YWx1ZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb2VmZmljaWVudC4gSXQgaW5kaWNhdGVzIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgdGhlIGRhdGEgaWYgdGhlIG51bGwgaHlwb3RoZXNpcyAodGhhdCB0aGUgY29lZmZpY2llbnQgaXMgemVybykgd2VyZSB0cnVlLg0KDQojUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3I6IFRoaXMgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcmVzaWR1YWxzLiBJbiB0aGlzIGNhc2UsIGl0J3MgYXBwcm94aW1hdGVseSA2MDIzMDAwLg0KDQojTW9kZWwgRml0Lg0KI011bHRpcGxlIFItc3F1YXJlZDogQXBwcm94aW1hdGVseSA1OC4xMSUgb2YgdGhlIHZhcmlhbmNlIGluIFBheXJvbGwuU2FsYXJ5MjAyMyBpcyBleHBsYWluZWQgYnkgSFIsUkJJLEFWRyxPUEIgYW5kIE9QUy4NCg0KYGBgDQpgYGB7cn0NCiMgU3VtIG9mIFNxdWFyZWQgRXJyb3JzDQpTU0UgPSBzdW0obW9kZWwzJHJlc2lkdWFsc14yKQ0KU1NFICNQcmludGluZyB0aGUgdmFsdWVzIG9mIFNTRS4gSW4gdGhpcyBjYXNlIDYuMTY3NzkzZSsxNA0KYGBgDQpgYGB7cn0NCiMgUmVtb3ZlIEhSDQojIExpbmVhciBSZWdyZXNzaW9uIChhbGwgdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWw0LCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoUkJJLEFWRyxPUEIgYW5kIE9QUykNCiNUaGlzIGNvZGUgZml0cyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIChsbSkgd2hlcmUgUGF5cm9sbC5TYWxhcnkyMDIzIGlzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKHJlc3BvbnNlIHZhcmlhYmxlKSwgYW5kIFJCSSxBVkcsT1BCIGFuZCBPUFMgYXJlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvciB2YXJpYWJsZXMpIHRha2VuIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0Lg0KDQojbW9kZWw0IDwtIGxtKC4uLik6IEFzc2lnbnMgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG9iamVjdCB0byB0aGUgdmFyaWFibGUgbW9kZWw0Lg0KDQojc3VtbWFyeShtb2RlbDQpOiBUaGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHRoZW4gcHJvdmlkZXMgYSBkZXRhaWxlZCBzdW1tYXJ5IG9mIHRoZSBmaXR0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgbW9kZWw0LiBUaGlzIHN1bW1hcnkgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBjb2VmZmljaWVudHMsIHN0YW5kYXJkIGVycm9ycywgdC1zdGF0aXN0aWNzLCBwLXZhbHVlcywgYW5kIGdvb2RuZXNzLW9mLWZpdCBtZWFzdXJlcyBsaWtlIFItc3F1YXJlZC4NCm1vZGVsNCA9IGxtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IFJCSSArIEFWRyArIE9CUCArIE9QUywgZGF0YT1maXJzdGJhc2UpDQpzdW1tYXJ5KG1vZGVsNCkNCg0KI1Jlc2lkdWFsczoNCiNSZXNpZHVhbHM6IFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb2JzZXJ2ZWQgdmFsdWVzIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKFBheXJvbGwuU2FsYXJ5MjAyMykgYW5kIHRoZSB2YWx1ZXMgcHJlZGljdGVkIGJ5IHRoZSBtb2RlbC4gVGhlIHN1bW1hcnkgc2hvd3MgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiB0aGUgcmVzaWR1YWxzOg0KI01pbiwgMVEsIE1lZGlhbiwgM1EsIE1heDogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgbWluaW11bSwgMXN0IHF1YXJ0aWxlLCBtZWRpYW4sIDNyZCBxdWFydGlsZSwgYW5kIG1heGltdW0gb2YgdGhlIHJlc2lkdWFscywgcmVzcGVjdGl2ZWx5LiBUaGV5IHByb3ZpZGUgaW5zaWdodCBpbnRvIHRoZSBkaXN0cmlidXRpb24gYW5kIHJhbmdlIG9mIGVycm9ycyBpbiB0aGUgbW9kZWwgcHJlZGljdGlvbnMuDQoNCiNTdGQuIEVycm9yOiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIGVycm9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZWZmaWNpZW50cy4gVGhleSBtZWFzdXJlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgY29lZmZpY2llbnQgZXN0aW1hdGUuDQojdCB2YWx1ZTogVGhpcyBpcyB0aGUgdC1zdGF0aXN0aWMgdmFsdWUsIHdoaWNoIG1lYXN1cmVzIHRoZSBzaWduaWZpY2FuY2Ugb2YgZWFjaCBjb2VmZmljaWVudCBlc3RpbWF0ZS4gSXQncyBjYWxjdWxhdGVkIGFzIEVzdGltYXRlIC8gU3RkLiBFcnJvci4NCiNQcig+fHR8KTogVGhpcyBpcyB0aGUgcC12YWx1ZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb2VmZmljaWVudC4gSXQgaW5kaWNhdGVzIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgdGhlIGRhdGEgaWYgdGhlIG51bGwgaHlwb3RoZXNpcyAodGhhdCB0aGUgY29lZmZpY2llbnQgaXMgemVybykgd2VyZSB0cnVlLg0KDQojUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3I6IFRoaXMgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcmVzaWR1YWxzLiBJbiB0aGlzIGNhc2UsIGl0J3MgYXBwcm94aW1hdGVseSA1OTE5MDAwLg0KDQojTW9kZWwgRml0Lg0KI011bHRpcGxlIFItc3F1YXJlZDogQXBwcm94aW1hdGVseSA1Ny4xNyUgb2YgdGhlIHZhcmlhbmNlIGluIFBheXJvbGwuU2FsYXJ5MjAyMyBpcyBleHBsYWluZWQgYnkgUkJJLEFWRyxPUEIgYW5kIE9QUy4NCmBgYA0KYGBge3J9DQpmaXJzdGJhc2U8LWZpcnN0YmFzZVssLSgxOjMpXQ0KI1RoaXMgY29kZSByZW1vdmVzIHRoZSBmaXJzdCB0aHJlZSBjb2x1bW5zIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0LiANCmBgYA0KYGBge3J9DQojIENvcnJlbGF0aW9ucw0KY29yKGZpcnN0YmFzZSRSQkksIGZpcnN0YmFzZSRQYXlyb2xsLlNhbGFyeTIwMjMpDQojVGhlIGFib3ZlIGNvZGUgdXNlcyB0aGUgY29yKCkgZnVuY3Rpb24gdG8gZmluZCB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0d28gdmFyaWFibGVzIChSQkkgYW5kIFBheXJvbGwuU2FsYXJ5MjAyMykuIEluIHRoaXMgY2FzZSB0aGUgYW5zd2VyIGlzIDAuNjI4MTIzOQ0KDQojVGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGluZGljYXRlcyBhIHN0cm9uZyBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHR3byB2YXJpYWJsZXMsDQoNCiNUaGUgcG9zaXRpdmUgdmFsdWUgKDAuNjI4MTIzOSkgc3VnZ2VzdHMgYSBtb2RlcmF0ZSBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gUkJJIChSdW5zIEJhdHRlZCBJbikgYW5kIFBheXJvbGwuU2FsYXJ5MjAyMy4gQXMgUkJJIGluY3JlYXNlcywgUGF5cm9sbC5TYWxhcnkyMDIzIHRlbmRzIHRvIGluY3JlYXNlIGFzIHdlbGwsIHRob3VnaCBub3QgbmVjZXNzYXJpbHkgaW4gYSBwZXJmZWN0bHkgbGluZWFyIGZhc2hpb24uDQpgYGANCmBgYHtyfQ0KY29yKGZpcnN0YmFzZSRBVkcsIGZpcnN0YmFzZSRPQlApDQoNCiNUaGUgYWJvdmUgY29kZSB1c2VzIHRoZSBjb3IoKSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHR3byBudW1lcmljIHZlY3RvcnMgKEFWRyBhbmQgT0JQKS4gSW4gdGhpcyBjYXNlIHRoZSBhbnN3ZXIgaXMgMC44MDI4ODk0DQoNCiNUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgaW5kaWNhdGVzIGEgc3Ryb25nIHBvc2l0aXZlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBBVkcgYW5kIE9CUC4NCg0KI1RoZSBwb3NpdGl2ZSB2YWx1ZSAoMC44MDI4ODk0KSBzdWdnZXN0cyB0aGF0IGFzIEFWRyAoQmF0dGluZyBBdmVyYWdlKSBpbmNyZWFzZXMsIE9CUCAoT24tQmFzZSBQZXJjZW50YWdlKSB0ZW5kcyB0byBpbmNyZWFzZSBhcyB3ZWxsLCBzdWdnZXN0aW5nIHRoYXQgcGxheWVycyB3aXRoIGhpZ2hlciBiYXR0aW5nIGF2ZXJhZ2VzIGFsc28gdGVuZCB0byBoYXZlIGhpZ2hlciBvbi1iYXNlIHBlcmNlbnRhZ2VzLlRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAoMC44MDI4ODk0KSBzdWdnZXN0cyBhIHJvYnVzdCBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBBVkcgYW5kIE9CUC4NCmBgYA0KYGBge3J9DQpjb3IoZmlyc3RiYXNlKQ0KI0luIHRoaXMgY29kZSB3ZSB1c2UgdGhlIGZ1bmN0aW9uIGNvcigpIHRvIGNvbXB1dGUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBmb3IgbnVtZXJpYyBjb2x1bW5zIG9mIHRoZSBlbnRpcmUgZGF0YXNldCwgaW4gdGhpcyBjYXNlIGZpcnN0YmFzZS4NCmBgYA0KYGBge3J9DQojUmVtb3ZpbmcgQVZHDQptb2RlbDUgPSBsbShQYXlyb2xsLlNhbGFyeTIwMjMgfiBSQkkgKyBPQlAgKyBPUFMsIGRhdGE9Zmlyc3RiYXNlKQ0KIyBMaW5lYXIgUmVncmVzc2lvbiAoYWxsIHZhcmlhYmxlcykNCiNmaXQgYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gSW4gdGhpcyBjYXNlIG1vZGVsNSwgd2hpY2ggaW5jbHVkZXMgbW9yZSB0aGFuIG9uZSBwcmVkaWN0b3IgdmFyaWFibGUgKFJCSSxPUEIgYW5kIE9QUykNCiNUaGlzIGNvZGUgZml0cyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIChsbSkgd2hlcmUgUGF5cm9sbC5TYWxhcnkyMDIzIGlzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKHJlc3BvbnNlIHZhcmlhYmxlKSwgYW5kIFJCSSxPUEIgYW5kIE9QUyBhcmUgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyAocHJlZGljdG9yIHZhcmlhYmxlcykgdGFrZW4gZnJvbSB0aGUgZmlyc3RiYXNlIGRhdGFzZXQuDQoNCiNtb2RlbDUgPC0gbG0oLi4uKTogQXNzaWducyB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgb2JqZWN0IHRvIHRoZSB2YXJpYWJsZSBtb2RlbDUuDQoNCiNzdW1tYXJ5KG1vZGVsNSk6IFRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdGhlbiBwcm92aWRlcyBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIGZpdHRlZCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBtb2RlbDUuIFRoaXMgc3VtbWFyeSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGNvZWZmaWNpZW50cywgc3RhbmRhcmQgZXJyb3JzLCB0LXN0YXRpc3RpY3MsIHAtdmFsdWVzLCBhbmQgZ29vZG5lc3Mtb2YtZml0IG1lYXN1cmVzIGxpa2UgUi1zcXVhcmVkLg0Kc3VtbWFyeShtb2RlbDUpDQoNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI1Jlc2lkdWFsIHN0YW5kYXJkIGVycm9yOiBUaGlzIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc2lkdWFscy4gSW4gdGhpcyBjYXNlLCBpdCdzIGFwcHJveGltYXRlbHkgNTc2NzAwMC4NCg0KI01vZGVsIEZpdC4NCiNNdWx0aXBsZSBSLXNxdWFyZWQ6IEFwcHJveGltYXRlbHkgNTcuMDklIG9mIHRoZSB2YXJpYW5jZSBpbiBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgZXhwbGFpbmVkIGJ5IFJCSSxPUEIgYW5kIE9QUy4NCg0KYGBgDQpgYGB7cn0NCm1vZGVsNiA9IGxtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IFJCSSArIE9CUCwgZGF0YT1maXJzdGJhc2UpDQojIExpbmVhciBSZWdyZXNzaW9uIChhbGwgdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWw2LCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoUkJJLCBhbmQgT1BCKQ0KI1RoaXMgY29kZSBmaXRzIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgKGxtKSB3aGVyZSBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSAocmVzcG9uc2UgdmFyaWFibGUpLCBhbmQgUkJJLE9QQiBhbmQgT1BTIGFyZSB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzIChwcmVkaWN0b3IgdmFyaWFibGVzKSB0YWtlbiBmcm9tIHRoZSBmaXJzdGJhc2UgZGF0YXNldC4NCg0KI21vZGVsNiA8LSBsbSguLi4pOiBBc3NpZ25zIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBvYmplY3QgdG8gdGhlIHZhcmlhYmxlIG1vZGVsNi4NCg0KI3N1bW1hcnkobW9kZWw2KTogVGhlIHN1bW1hcnkoKSBmdW5jdGlvbiB0aGVuIHByb3ZpZGVzIGEgZGV0YWlsZWQgc3VtbWFyeSBvZiB0aGUgZml0dGVkIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG1vZGVsNi4gVGhpcyBzdW1tYXJ5IGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgY29lZmZpY2llbnRzLCBzdGFuZGFyZCBlcnJvcnMsIHQtc3RhdGlzdGljcywgcC12YWx1ZXMsIGFuZCBnb29kbmVzcy1vZi1maXQgbWVhc3VyZXMgbGlrZSBSLXNxdWFyZWQuDQpzdW1tYXJ5KG1vZGVsNikNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI1Jlc2lkdWFsIHN0YW5kYXJkIGVycm9yOiBUaGlzIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc2lkdWFscy4gSW4gdGhpcyBjYXNlLCBpdCdzIGFwcHJveGltYXRlbHkgNTYyNTAwMC4NCg0KI01vZGVsIEZpdC4NCiNNdWx0aXBsZSBSLXNxdWFyZWQ6IEFwcHJveGltYXRlbHkgNTcuMDklIG9mIHRoZSB2YXJpYW5jZSBpbiBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgZXhwbGFpbmVkIGJ5IFJCSSwgYW5kIE9QQi4NCg0KYGBgDQpgYGB7cn0NCiMgUmVhZCBpbiB0ZXN0IHNldA0KI1RoZSBmaXJzdGJhc2VzdGF0c190ZXN0LmNzdiBmaWxlIGNvbnRhaW5zIGEgdGVzdCBzYW1wbGUgb2Ygb25seSAyIG9mIHRoZSBmaXJzdCBiYXNlIHBsYXllcnPigJkgc3RhdHMuIA0KI1dlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KZmlyc3RiYXNlVGVzdCA9IHJlYWQuY3N2KCJmaXJzdGJhc2VzdGF0c190ZXN0LmNzdiIpDQojRGVjbGFyZWQgdGhlIHZhcmlhYmxlIGZpcnN0YmFzZVRlc3QgDQojVXNlIHRoZSBmdW5jdGlvbiByZWFkLmNzdigpIHRvIHJlYWQgdGhlIGZpbGUgImZpcnN0YmFzZXN0YXRzLmNzdiIgYW5kIGFzc2lnbiB0aGUgY29udGVucyB0byB0aGUgdmFyaWFibGUgZmlyc3RiYXNlDQpzdHIoZmlyc3RiYXNlVGVzdCkNCiNVc2UgdGhlIHN0cigpIGZ1bnRpb24gdG8gcHJvdmlkZXMgYSBjb25jaXNlIHN1bW1hcnkgb2YgdGhlIHN0cnVjdHVyZSBvZiBmaXJzdGJhc2UsIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyAocm93cykgYW5kIHZhcmlhYmxlcyAoY29sdW1ucyksIGFsb25nIHdpdGggdGhlIGRhdGEgdHlwZSBhbmQgZmlyc3QgZmV3IHZhbHVlcyBvZiBlYWNoIHZhcmlhYmxlLg0KYGBgDQpgYGB7cn0NCiMgTWFrZSB0ZXN0IHNldCBwcmVkaWN0aW9ucw0KI0luIHRoaXMgY29kZSB3ZSB1c2UgdGhlIHByZWRpY3QoKSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBwcmVkaWN0aW9ucyB1c2luZyBtb2RlbDYgb24gbmV3IGRhdGEgKGZpcnN0YmFzZVRlc3QpLiANCnByZWRpY3RUZXN0ID0gcHJlZGljdChtb2RlbDYsIG5ld2RhdGE9Zmlyc3RiYXNlVGVzdCkNCnByZWRpY3RUZXN0DQojRmluYWxseSB1c2UgdGhlIHByaW50KCkgZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgcmVzdWx0cy4NCmBgYA0KYGBge3J9DQojIENvbXB1dGUgUi1zcXVhcmVkDQpTU0UgPSBzdW0oKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzIC0gcHJlZGljdFRlc3QpXjIpDQpTU1QgPSBzdW0oKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzIC0gbWVhbihmaXJzdGJhc2UkUGF5cm9sbC5TYWxhcnkyMDIzKSleMikNCjEgLSBTU0UvU1NUDQojSW4gdGhpcyBhYm92ZSBjb2RlIHdlIHVzZSBTU0UgYW5kIFNTVCBmdW5jdGlvbnMNCiNTU0U6IFN1bSBvZiBTcXVhcmVkIEVycm9ycywgd2hpY2ggbWVhc3VyZXMgdGhlIHZhcmlhdGlvbiBpbiB0aGUgYWN0dWFsIHZhbHVlcyB0aGF0IGlzIG5vdCBleHBsYWluZWQgYnkgdGhlIG1vZGVsLg0KDQojcHJlZGljdFRlc3Q6IFRoaXMgaXMgdGhlIHZlY3RvciBvZiBwcmVkaWN0ZWQgdmFsdWVzIG9idGFpbmVkIGZyb20geW91ciBtb2RlbCAobW9kZWw2KSBhcHBsaWVkIHRvIGZpcnN0YmFzZVRlc3QuDQojZmlyc3RiYXNlVGVzdCRQYXlyb2xsLlNhbGFyeTIwMjM6IFRoZXNlIGFyZSB0aGUgYWN0dWFsIHZhbHVlcyBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgKFBheXJvbGwuU2FsYXJ5MjAyMykgaW4geW91ciB0ZXN0IGRhdGFzZXQuDQojc3VtKChmaXJzdGJhc2VUZXN0JFBheXJvbGwuU2FsYXJ5MjAyMyAtIHByZWRpY3RUZXN0KV4yKTogQ2FsY3VsYXRlcyB0aGUgc3VtIG9mIHNxdWFyZWQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYWN0dWFsIHZhbHVlcyAoZmlyc3RiYXNlVGVzdCRQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgcHJlZGljdGVkIHZhbHVlcyAocHJlZGljdFRlc3QpLg0KDQojU1NUOiBUb3RhbCBTdW0gb2YgU3F1YXJlcywgd2hpY2ggbWVhc3VyZXMgdGhlIHRvdGFsIHZhcmlhdGlvbiBpbiB0aGUgYWN0dWFsIHZhbHVlcy4NCg0KI21lYW4oZmlyc3RiYXNlJFBheXJvbGwuU2FsYXJ5MjAyMyk6IFRoaXMgY29tcHV0ZXMgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGZyb20geW91ciBlbnRpcmUgZGF0YXNldCAoZmlyc3RiYXNlKS4NCiNzdW0oKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzIC0gbWVhbihmaXJzdGJhc2UkUGF5cm9sbC5TYWxhcnkyMDIzKSleMik6IENhbGN1bGF0ZXMgdGhlIHN1bSBvZiBzcXVhcmVkIGRpZmZlcmVuY2VzIGJldHdlZW4gZWFjaCBhY3R1YWwgdmFsdWUgKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzKSBhbmQgdGhlIG1lYW4gb2YgYWxsIGFjdHVhbCB2YWx1ZXMgKG1lYW4oZmlyc3RiYXNlJFBheXJvbGwuU2FsYXJ5MjAyMykpLg0KDQojSW4gdGhpcyBjYXNlIHRoZSByZXN1bHQgb2YgMC41NDc3NzM0IG1lYW5zIHRoYXQgYXBwcm94aW1hdGVseSA1NC43NyUgb2YgdGhlIHZhcmlhYmlsaXR5IGluIFBheXJvbGwuU2FsYXJ5MjAyMyBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvcnMpIGluY2x1ZGVkIGluIHlvdXIgbW9kZWwgKG1vZGVsNikuDQoNCmBgYA0KDQoNCg0KDQoNCg0K