Task 1

First, we will read the data to ensure that it is correctly stated.

#Read data correctly
mydata = read.csv(file="data/marketing.csv")
head(mydata)

Next, we will apply the cor() function to the data to understand the correlations between variables. This is a great way to compare the correlations between all variables within the dataset.

Correlation matrix

corr= cor(mydata[2:6])
corr
           sales       radio       paper          tv         pos
sales  1.0000000  0.97713807 -0.28306828  0.95797025  0.01264860
radio  0.9771381  1.00000000 -0.23835848  0.96609579  0.06040209
paper -0.2830683 -0.23835848  1.00000000 -0.24587896 -0.09006241
tv     0.9579703  0.96609579 -0.24587896  1.00000000 -0.03602314
pos    0.0126486  0.06040209 -0.09006241 -0.03602314  1.00000000

Why is the value “1.0” down the diagonal? Which pairs seem to have the strongest correlations? Answer and list the pairs below the matrix.

The value 1.0 is down diagonal because these are the correlations between each variable and itself (and a variable is always perfectly correlated with itself).

Strong Correlation: as paper goes up sales go down ; tv positive = as much as we advertise our sales go up. Pos = you dont have +/- correlation

Here we will install the packages needed to do a corrplot and corrgram

install.packages("corrplot")
Error in install.packages : Updating loaded packages
install.packages("corrgram")
Error in install.packages : Updating loaded packages
library("corrplot")
library("corrgram")
corrplot(corr)

From the image above we can see that there are strong and not so strong correlation

Strong - radio and sales - tv and radio

weak - pos and radio - paper and sales - paper and pos

No Correlation - pos and sales - pos and tv

Below we will extract the variables and plot radio and sales given that they are the strongest correlation.

#Extract all variables
pos  = mydata$pos
paper = mydata$paper
tv = mydata$tv
sales = mydata$sales
radio = mydata$radio
#Plot of Radio and Sales using plot command from Worksheet 4
plot(radio,sales)

scatter.smooth(radio,sales)

*The image above demonstrate the strong correlation between radio sales given that they are all close to the regression line.

scatter.smooth(paper,sales)

The graph above is negatively correlated; line is not completely going down but it ducks down scattered all over the palce

scatter.smooth(tv,sales)

In the graph above values are on top of eachother. I assume there is not much diffence in spending. Therefore it doesnt matter how much you spend because it doesnt change the sales. There are slight increases and they are segmented by categories.

scatter.smooth(pos,sales)

Restarting R session...

Here tbhe values are all over the place. there is no trend line; misleading, doesnt say much

scatter.smooth(sales,sales)

The above graph is perfectly linear because a variable compared with itself matches up perfectly

From this plot, it seems the points are scattered in an almost linear way. So, we will try to fit a simple linear regression model to the graph.
The lm() function is a very useful one. The function is set up as lm(y~x) where the x variable, the independent variable, predicts values of the y variable, or the dependent variable.
In the regression below, we are using radio ads to predict sales. We print out a summary to view the quantitative facts about the linear model.
r #Simple Linear Regression - function lm(predicted variable~indep var) reg <- lm(sales ~ radio) #Summary of Model summary(reg)
```
Call: lm(formula = sales ~ radio)
Residuals: Min 1Q Median 3Q Max -1732.85 -198.88 62.64 415.26 637.70
Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -9741.92 1362.94 -7.148 1.17e-06 radio 347.69 17.83 19.499 1.49e-13

Signif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘’ 1

Residual standard error: 571.6 on 18 degrees of freedom Multiple R-squared: 0.9548, Adjusted R-squared: 0.9523 F-statistic: 380.2 on 1 and 18 DF, p-value: 1.492e-13 ```

this is the intercept. when writing an queation use this value coefficient will give you the equation of the line check adj. r s –> high, low ,etc as long as it high as we keep adding up its good and important

#linear model  (Y = a + mx)
#sales- predicted var ~ radio_X1
#Sales_predicted = -9741.92 + 347.69 * (radio)
Sales_predicted = -9741.92 + 347.69 * (75)
Sales_predicted
[1] 16334.83

Report and interpret the R-Squared value below. - our multiple R squared and our adjusted R squared are relatively close. - Multiple R: 0.9548 - Adjusted R: 0.9523

Because the R-Squared value is so high, it indicates that the model is a good fit, but not perfect. We will overlay a trend plot over the original plot we had. This will show how far the predictions are from the actual value. The distance from the actual versus the predicted is the residual.

#Plot Radio and Sales 
plot(radio,sales)
#Add a trend line plot using the linear model we created above
abline(reg, col="blue",lwd=2) 

Theline above used the summary(reg)

follow the same steps as above

#Simple Linear Regression - function lm(predicted variable~indep var)
reg <- lm(radio ~ tv)
#Summary of Model
summary(reg)

Call:
lm(formula = radio ~ tv)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.2306 -0.5473 -0.0973  1.0393  4.5028 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -90.96701   10.53261  -8.637 8.10e-08 ***
tv            0.62666    0.03947  15.875 4.97e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.951 on 18 degrees of freedom
Multiple R-squared:  0.9333,    Adjusted R-squared:  0.9296 
F-statistic:   252 on 1 and 18 DF,  p-value: 4.971e-12
Sales_predicted = -90.96701 + 0.62666  * (250)
Sales_predicted
[1] 65.69799
read.csv("data/marketing.csv")
head(mydata)
 #Plot Radio and tv 
plot(radio,tv)
#Add a trend line plot using the linear model we created above
abline(reg, col="blue",lwd=2)

From the plot above we can conclude that the correlation for radio and tv are going in an upward trend.


Task2

Sometimes, one variable is very good at predicting another variable. But most times, there are more than one factors that affect the prediction of another variable. While increased rainfall is a good predictor of increased crop supply, decreased herbivores can also result in an increase of crops. This idea is a loose metaphor for multiple linear regression.

In R, multiple linear regression takes the form of lm(y ~ x0 + x1 + x2 + ... ), where y is the value that is being predicted, or the dependent value and the x variables are the predictors or the independent values.

Lets create a multiple linear regression predicting sales using radio and tv.

#Multiple Linear Regression Model
mlr1 <-lm(sales ~ radio + tv)
#Summary of Multiple Linear Regression Model
summary(mlr1)

Call:
lm(formula = sales ~ radio + tv)

Residuals:
     Min       1Q   Median       3Q      Max 
-1729.58  -205.97    56.95   335.15   759.26 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -17150.46    6965.59  -2.462 0.024791 *  
radio          275.69      68.73   4.011 0.000905 ***
tv              48.34      44.58   1.084 0.293351    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 568.9 on 17 degrees of freedom
Multiple R-squared:  0.9577,    Adjusted R-squared:  0.9527 
F-statistic: 192.6 on 2 and 17 DF,  p-value: 2.098e-12
sales_predicted = -17150.46 +275.69 * (radio) + 48.34 * (tv)
sales_predicted = -17150.46 +275.69 *(75) + 48.34*(270)
sales_predicted
[1] 16578.09

R Sq: 0.9577 Adj R Sq:0.9527

read.csv("data/marketing.csv")
head(mydata)

For mlr1, the R-Squared values is 0.9577 and the Adj R-Squared is 0.9527.

Create a Multiple Linear Regression Model for each of the following, display the summary statistics, and write the values for R-Squared and Adj R-Squared:

#mlr2 = Sales predicted by radio, tv, and pos
mlr2<- lm(sales ~ radio + tv + pos)
summary(mlr2)

Call:
lm(formula = sales ~ radio + tv + pos)

Residuals:
     Min       1Q   Median       3Q      Max 
-1748.20  -187.42   -61.14   352.07   734.20 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) -15491.23    7697.08  -2.013  0.06130 . 
radio          291.36      75.48   3.860  0.00139 **
tv              38.26      48.90   0.782  0.44538   
pos           -107.62     191.25  -0.563  0.58142   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 580.7 on 16 degrees of freedom
Multiple R-squared:  0.9585,    Adjusted R-squared:  0.9508 
F-statistic: 123.3 on 3 and 16 DF,  p-value: 2.859e-11
#sales_predicted = -15491.23 + 291.36 * (radio) + 38.26 * (tv) -107.62 (pos)
sales_predicted = -15491.23 + 291.36*(75) + 38.26*(270) - 107.62* (1.3)
sales_predicted
[1] 16551.06

R Sq: 0.9585 Adj R Sq:0.9508

read.csv("data/marketing.csv")
#mlr3 = Sales predicted by radio, tv, pos, and paper
mlr3<- lm(sales ~ radio + tv + pos + paper)
summary(mlr3)

Call:
lm(formula = sales ~ radio + tv + pos + paper)

Residuals:
     Min       1Q   Median       3Q      Max 
-1558.13  -239.35     7.25   387.02   728.02 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept) -13801.015   7865.017  -1.755  0.09970 . 
radio          294.224     75.442   3.900  0.00142 **
tv              33.369     49.080   0.680  0.50693   
pos           -128.875    192.156  -0.671  0.51262   
paper           -9.159      8.991  -1.019  0.32449   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 580 on 15 degrees of freedom
Multiple R-squared:  0.9612,    Adjusted R-squared:  0.9509 
F-statistic: 92.96 on 4 and 15 DF,  p-value: 2.13e-10
#sales_predicted = -13801.015 + 294.224 * (radio) + 33.369 * (tv) - 128.875*(pos) -9.159*(paper)
sales_predicted = -13801.015 + 294.224 * (75) + 33.369 * (270) - 128.875*(1.3) -9.159*(82)
sales_predicted
[1] 16356.84

R Sq: 0.9612 Adj R Sq:0.9509

read.csv("data/marketing.csv")
head(mydata)

Based purely on the values for R-Squared and Adj R-Squared, which linear regression model is best in predicting sales. Explain why.

Based purely on the adjusted r squared I think that the best linear regression model is mlr1 because it is has the largest adjusted r squared out of the three. To confirm that this is true we will use that model to calculate our sales with the values below.

After deciding which model predicts sales best, we will confirm the it truly is the best model by predicting sales given independent variables.

Given that Radio = 69 , TV = 255 , POS = 1.5, and Paper = 75, calculate the predicted sales value for each of the three models above.

sales_predicted = -17150.46 +275.69 * (radio) + 48.34 * (tv)
sales_predicted = -17150.46 +275.69 *(69) + 48.34*(255)
sales_predicted
[1] 14198.85
read.csv("data/marketing.csv")
head(mydata)
#sales_predicted = -15491.23 + 291.36 * (radio) + 38.26 * (tv) -107.62 (pos)
sales_predicted = -15491.23 + 291.36*(69) + 38.26*(255) - 107.62* (1.5)
sales_predicted
[1] 14207.48
read.csv("data/marketing.csv")
head(mydata)
#sales_predicted = -13801.015 + 294.224 * (radio) + 33.369 * (tv) - 128.875*(pos) -9.159*(paper)
sales_predicted = -13801.015 + 294.224 * (69) + 33.369 * (255) - 128.875*(1.5) -9.159*(75)
sales_predicted
[1] 14129.3
read.csv("data/marketing.csv")
head(mydata)

Based on our data above we can confirm that the best model is mlr3 because it gives us the closest value of sales for the given values of radio, paper, tv, and pos


Task 3

To complete the last task, follow the directions found below. Make sure to screenshot and attach any pictures of the results obtained or any questions asked.

  1. Logon to your Watson Analytics account at watsonanalytics.com
  2. Upload the file marketing.csv unless already in your folder
  3. Use the Predictive module to analyze the data
  4. Note the predictive power strength of reported variables. Consider the one field predictive model only.
  5. How do Watson results reconcile with your findings based on the R regression analysis in task 2? Explain how.

Based on the one field predictive model from Watson it was concluded that radio does infact drive sales by about 93%. In other words 93 percent of sales are driven by radio. Therefore the more we use the radio to our advantage (promotional basis) the more our sales will increase. The images below state this information.From the results below and those we calculated in task two it can be concluded that radio and sales do have a strong correlation given that this is where the highest adjusted r square resulted.

LS0tDQp0aXRsZTogIkJ1c2luZXNzIEFuYWx5dGljcyBMYWIgV29ya3NoZWV0IDA1Ig0KYXV0aG9yOiAiTWFybGVuIFNvdGVsbyINCmRhdGU6ICJBdWd1c3QgNiwgMjAxNyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IENNRSBHcm91cCBGb3VuZGF0aW9uIEJ1c2luZXNzIEFuYWx5dGljcyBMYWINCi0tLQ0KDQojIyMgVGFzayAxDQoNCkZpcnN0LCB3ZSB3aWxsIHJlYWQgdGhlIGRhdGEgdG8gZW5zdXJlIHRoYXQgaXQgaXMgY29ycmVjdGx5IHN0YXRlZC4gDQoNCmBgYHtyfQ0KI1JlYWQgZGF0YSBjb3JyZWN0bHkNCm15ZGF0YSA9IHJlYWQuY3N2KGZpbGU9ImRhdGEvbWFya2V0aW5nLmNzdiIpDQpoZWFkKG15ZGF0YSkNCmBgYA0KDQpOZXh0LCB3ZSB3aWxsIGFwcGx5IHRoZSBgY29yKClgIGZ1bmN0aW9uIHRvIHRoZSBkYXRhIHRvIHVuZGVyc3RhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHZhcmlhYmxlcy4gVGhpcyBpcyBhIGdyZWF0IHdheSB0byBjb21wYXJlIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBhbGwgdmFyaWFibGVzIHdpdGhpbiB0aGUgZGF0YXNldC4NCg0KKipDb3JyZWxhdGlvbiBtYXRyaXgqKg0KYGBge3J9DQpjb3JyPSBjb3IobXlkYXRhWzI6Nl0pDQpjb3JyDQpgYGANCg0KV2h5IGlzIHRoZSB2YWx1ZSAiMS4wIiBkb3duIHRoZSBkaWFnb25hbD8gV2hpY2ggcGFpcnMgc2VlbSB0byBoYXZlIHRoZSBzdHJvbmdlc3QgY29ycmVsYXRpb25zPyBBbnN3ZXIgYW5kIGxpc3QgdGhlIHBhaXJzIGJlbG93IHRoZSBtYXRyaXguDQoNCipUaGUgdmFsdWUgMS4wIGlzIGRvd24gZGlhZ29uYWwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIGVhY2ggdmFyaWFibGUgYW5kIGl0c2VsZiAoYW5kIGEgdmFyaWFibGUgaXMgYWx3YXlzIHBlcmZlY3RseSBjb3JyZWxhdGVkIHdpdGggaXRzZWxmKS4qDQoNCipTdHJvbmcgQ29ycmVsYXRpb246IGFzIHBhcGVyIGdvZXMgdXAgc2FsZXMgZ28gZG93biA7IHR2IHBvc2l0aXZlID0gYXMgbXVjaCBhcyB3ZSBhZHZlcnRpc2Ugb3VyIHNhbGVzIGdvIHVwLioNCipQb3MgPSAgeW91IGRvbnQgaGF2ZSArLy0gY29ycmVsYXRpb24qDQoNCioqSGVyZSB3ZSB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2VzIG5lZWRlZCB0byBkbyBhIGNvcnJwbG90IGFuZCBjb3JyZ3JhbSoqDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikNCmluc3RhbGwucGFja2FnZXMoImNvcnJncmFtIikNCmxpYnJhcnkoImNvcnJwbG90IikNCmxpYnJhcnkoImNvcnJncmFtIikNCmNvcnJwbG90KGNvcnIpDQpgYGANCkZyb20gdGhlIGltYWdlIGFib3ZlIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgc3Ryb25nIGFuZCBub3Qgc28gc3Ryb25nIGNvcnJlbGF0aW9uDQoNCipTdHJvbmcqDQotIHJhZGlvIGFuZCBzYWxlcw0KLSB0diBhbmQgcmFkaW8NCg0KKndlYWsqDQotIHBvcyBhbmQgcmFkaW8NCi0gcGFwZXIgYW5kIHNhbGVzDQotIHBhcGVyIGFuZCBwb3MNCg0KKk5vIENvcnJlbGF0aW9uKg0KLSBwb3MgYW5kIHNhbGVzIA0KLSBwb3MgYW5kIHR2DQoNCg0KQmVsb3cgd2Ugd2lsbCBleHRyYWN0IHRoZSB2YXJpYWJsZXMgYW5kIHBsb3QgcmFkaW8gYW5kIHNhbGVzIGdpdmVuIHRoYXQgdGhleSBhcmUgdGhlIHN0cm9uZ2VzdCBjb3JyZWxhdGlvbi4NCmBgYHtyfQ0KI0V4dHJhY3QgYWxsIHZhcmlhYmxlcw0KcG9zICA9IG15ZGF0YSRwb3MNCnBhcGVyID0gbXlkYXRhJHBhcGVyDQp0diA9IG15ZGF0YSR0dg0Kc2FsZXMgPSBteWRhdGEkc2FsZXMNCnJhZGlvID0gbXlkYXRhJHJhZGlvDQoNCiNQbG90IG9mIFJhZGlvIGFuZCBTYWxlcyB1c2luZyBwbG90IGNvbW1hbmQgZnJvbSBXb3Jrc2hlZXQgNA0KcGxvdChyYWRpbyxzYWxlcykNCnNjYXR0ZXIuc21vb3RoKHJhZGlvLHNhbGVzKQ0KYGBgDQoqVGhlIGltYWdlIGFib3ZlIGRlbW9uc3RyYXRlIHRoZSBzdHJvbmcgY29ycmVsYXRpb24gYmV0d2VlbiByYWRpbyBzYWxlcyBnaXZlbiB0aGF0IHRoZXkgYXJlIGFsbCBjbG9zZSB0byB0aGUgcmVncmVzc2lvbiBsaW5lLg0KDQpgYGB7cn0NCnNjYXR0ZXIuc21vb3RoKHBhcGVyLHNhbGVzKQ0KYGBgDQpUaGUgZ3JhcGggYWJvdmUgaXMgbmVnYXRpdmVseSBjb3JyZWxhdGVkOyBsaW5lIGlzIG5vdCBjb21wbGV0ZWx5IGdvaW5nIGRvd24gYnV0IGl0IGR1Y2tzIGRvd24gc2NhdHRlcmVkIGFsbCBvdmVyIHRoZSBwYWxjZSANCg0KYGBge3J9DQpzY2F0dGVyLnNtb290aCh0dixzYWxlcykNCmBgYA0KSW4gdGhlIGdyYXBoIGFib3ZlIHZhbHVlcyBhcmUgb24gdG9wIG9mIGVhY2hvdGhlci4gSSBhc3N1bWUgdGhlcmUgaXMgbm90IG11Y2ggZGlmZmVuY2UgaW4gc3BlbmRpbmcuIFRoZXJlZm9yZSBpdCBkb2VzbnQgbWF0dGVyIGhvdyBtdWNoIHlvdSBzcGVuZCBiZWNhdXNlIGl0IGRvZXNudCBjaGFuZ2UgdGhlIHNhbGVzLiBUaGVyZSBhcmUgc2xpZ2h0IGluY3JlYXNlcyBhbmQgdGhleSBhcmUgc2VnbWVudGVkIGJ5IGNhdGVnb3JpZXMuDQoNCg0KYGBge3J9DQpzY2F0dGVyLnNtb290aChwb3Msc2FsZXMpDQpwbG90KHBvcyxzYWxlcykNCmBgYA0KSGVyZSB0YmhlIHZhbHVlcyBhcmUgYWxsIG92ZXIgdGhlIHBsYWNlLiB0aGVyZSBpcyBubyB0cmVuZCBsaW5lOyBtaXNsZWFkaW5nLCBkb2VzbnQgc2F5IG11Y2gNCg0KYGBge3J9DQpzY2F0dGVyLnNtb290aChzYWxlcyxzYWxlcykNCmBgYA0KKlRoZSBhYm92ZSBncmFwaCBpcyBwZXJmZWN0bHkgbGluZWFyIGJlY2F1c2UgYSB2YXJpYWJsZSBjb21wYXJlZCB3aXRoIGl0c2VsZiBtYXRjaGVzIHVwIHBlcmZlY3RseSoNCg0KLS0tLQ0KRnJvbSB0aGlzIHBsb3QsIGl0IHNlZW1zIHRoZSBwb2ludHMgYXJlIHNjYXR0ZXJlZCBpbiBhbiBhbG1vc3QgbGluZWFyIHdheS4gU28sIHdlIHdpbGwgdHJ5IHRvIGZpdCBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0byB0aGUgZ3JhcGguIA0KDQpUaGUgYGxtKClgIGZ1bmN0aW9uIGlzIGEgdmVyeSB1c2VmdWwgb25lLiBUaGUgZnVuY3Rpb24gaXMgc2V0IHVwIGFzIGBsbSh5fngpYCB3aGVyZSB0aGUgeCB2YXJpYWJsZSwgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlLCBwcmVkaWN0cyB2YWx1ZXMgb2YgdGhlIHkgdmFyaWFibGUsIG9yIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuDQoNCkluIHRoZSByZWdyZXNzaW9uIGJlbG93LCB3ZSBhcmUgdXNpbmcgcmFkaW8gYWRzIHRvIHByZWRpY3Qgc2FsZXMuIFdlIHByaW50IG91dCBhIHN1bW1hcnkgdG8gdmlldyB0aGUgcXVhbnRpdGF0aXZlIGZhY3RzIGFib3V0IHRoZSBsaW5lYXIgbW9kZWwuIA0KDQpgYGB7cn0NCiNTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24gLSBmdW5jdGlvbiBsbShwcmVkaWN0ZWQgdmFyaWFibGV+aW5kZXAgdmFyKQ0KcmVnIDwtIGxtKHNhbGVzIH4gcmFkaW8pDQoNCiNTdW1tYXJ5IG9mIE1vZGVsDQpzdW1tYXJ5KHJlZykNCmBgYA0KdGhpcyBpcyB0aGUgaW50ZXJjZXB0LiB3aGVuIHdyaXRpbmcgYW4gcXVlYXRpb24gdXNlIHRoaXMgdmFsdWUNCmNvZWZmaWNpZW50IHdpbGwgZ2l2ZSB5b3UgdGhlIGVxdWF0aW9uIG9mIHRoZSBsaW5lDQpjaGVjayBhZGouIHIgcyAtLT4gaGlnaCwgbG93ICxldGMNCmFzIGxvbmcgYXMgaXQgaGlnaCBhcyB3ZSBrZWVwIGFkZGluZyB1cCBpdHMgZ29vZCBhbmQgaW1wb3J0YW50DQoNCg0KYGBge3J9DQojbGluZWFyIG1vZGVsICAoWSA9IGEgKyBteCkNCiNzYWxlcy0gcHJlZGljdGVkIHZhciB+IHJhZGlvX1gxDQoNCiNTYWxlc19wcmVkaWN0ZWQgPSAtOTc0MS45MiArIDM0Ny42OSAqIChyYWRpbykNCg0KDQpTYWxlc19wcmVkaWN0ZWQgPSAtOTc0MS45MiArIDM0Ny42OSAqICg3NSkNClNhbGVzX3ByZWRpY3RlZA0KYGBgDQpSZXBvcnQgYW5kIGludGVycHJldCB0aGUgUi1TcXVhcmVkIHZhbHVlIGJlbG93LiANCi0gb3VyIG11bHRpcGxlIFIgc3F1YXJlZCBhbmQgb3VyIGFkanVzdGVkIFIgc3F1YXJlZCBhcmUgcmVsYXRpdmVseSBjbG9zZS4gDQotIE11bHRpcGxlIFI6IDAuOTU0OA0KLSBBZGp1c3RlZCBSOiAwLjk1MjMNCg0KQmVjYXVzZSB0aGUgUi1TcXVhcmVkIHZhbHVlIGlzIHNvIGhpZ2gsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBtb2RlbCBpcyBhIGdvb2QgZml0LCBidXQgbm90IHBlcmZlY3QuIFdlIHdpbGwgb3ZlcmxheSBhIHRyZW5kIHBsb3Qgb3ZlciB0aGUgb3JpZ2luYWwgcGxvdCB3ZSBoYWQuIFRoaXMgd2lsbCBzaG93IGhvdyBmYXIgdGhlIHByZWRpY3Rpb25zIGFyZSBmcm9tIHRoZSBhY3R1YWwgdmFsdWUuIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBhY3R1YWwgdmVyc3VzIHRoZSBwcmVkaWN0ZWQgaXMgdGhlIHJlc2lkdWFsLg0KDQpgYGB7cn0NCiNQbG90IFJhZGlvIGFuZCBTYWxlcyANCnBsb3QocmFkaW8sc2FsZXMpDQoNCiNBZGQgYSB0cmVuZCBsaW5lIHBsb3QgdXNpbmcgdGhlIGxpbmVhciBtb2RlbCB3ZSBjcmVhdGVkIGFib3ZlDQphYmxpbmUocmVnLCBjb2w9ImJsdWUiLGx3ZD0yKSANCmBgYA0KVGhlbGluZSBhYm92ZSB1c2VkIHRoZSBzdW1tYXJ5KHJlZykNCiANCiANCiAqKmZvbGxvdyB0aGUgc2FtZSBzdGVwcyBhcyBhYm92ZSoqDQpgYGB7cn0NCiNTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24gLSBmdW5jdGlvbiBsbShwcmVkaWN0ZWQgdmFyaWFibGV+aW5kZXAgdmFyKQ0KcmVnIDwtIGxtKHJhZGlvIH4gdHYpDQoNCiNTdW1tYXJ5IG9mIE1vZGVsDQpzdW1tYXJ5KHJlZykNCmBgYA0KIA0KYGBge3J9DQpTYWxlc19wcmVkaWN0ZWQgPSAtOTAuOTY3MDEgKyAwLjYyNjY2ICAqICgyNTApDQpTYWxlc19wcmVkaWN0ZWQNCmBgYA0KIA0KYGBge3J9DQpyZWFkLmNzdigiZGF0YS9tYXJrZXRpbmcuY3N2IikNCmhlYWQobXlkYXRhKQ0KYGBgDQogDQpgYGB7cn0NCiAjUGxvdCBSYWRpbyBhbmQgdHYgDQpwbG90KHJhZGlvLHR2KQ0KDQojQWRkIGEgdHJlbmQgbGluZSBwbG90IHVzaW5nIHRoZSBsaW5lYXIgbW9kZWwgd2UgY3JlYXRlZCBhYm92ZQ0KYWJsaW5lKHJlZywgY29sPSJibHVlIixsd2Q9MikNCmBgYA0KKkZyb20gdGhlIHBsb3QgYWJvdmUgd2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlIGNvcnJlbGF0aW9uIGZvciByYWRpbyBhbmQgdHYgYXJlIGdvaW5nIGluIGFuIHVwd2FyZCB0cmVuZC4qDQoNCi0tLS0tLS0tLS0NCg0KIyMjIFRhc2syDQoNClNvbWV0aW1lcywgb25lIHZhcmlhYmxlIGlzIHZlcnkgZ29vZCBhdCBwcmVkaWN0aW5nIGFub3RoZXIgdmFyaWFibGUuIEJ1dCBtb3N0IHRpbWVzLCB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBmYWN0b3JzIHRoYXQgYWZmZWN0IHRoZSBwcmVkaWN0aW9uIG9mIGFub3RoZXIgdmFyaWFibGUuIFdoaWxlIGluY3JlYXNlZCByYWluZmFsbCBpcyBhIGdvb2QgcHJlZGljdG9yIG9mIGluY3JlYXNlZCBjcm9wIHN1cHBseSwgZGVjcmVhc2VkIGhlcmJpdm9yZXMgY2FuIGFsc28gcmVzdWx0IGluIGFuIGluY3JlYXNlIG9mIGNyb3BzLiBUaGlzIGlkZWEgaXMgYSBsb29zZSBtZXRhcGhvciBmb3IgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24uIA0KDQpJbiBSLCBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiB0YWtlcyB0aGUgZm9ybSBvZiBgbG0oeSB+IHgwICsgeDEgKyB4MiArIC4uLiApYCwgd2hlcmUgeSBpcyB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZyBwcmVkaWN0ZWQsIG9yIHRoZSBkZXBlbmRlbnQgdmFsdWUgYW5kIHRoZSB4IHZhcmlhYmxlcyBhcmUgdGhlIHByZWRpY3RvcnMgb3IgdGhlIGluZGVwZW5kZW50IHZhbHVlcy4gDQoNCkxldHMgY3JlYXRlIGEgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gcHJlZGljdGluZyBzYWxlcyB1c2luZyByYWRpbyBhbmQgdHYuIA0KDQpgYGB7cn0NCiNNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbA0KbWxyMSA8LWxtKHNhbGVzIH4gcmFkaW8gKyB0dikNCg0KI1N1bW1hcnkgb2YgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwNCnN1bW1hcnkobWxyMSkNCmBgYA0KYGBge3J9DQpzYWxlc19wcmVkaWN0ZWQgPSAtMTcxNTAuNDYgKzI3NS42OSAqIChyYWRpbykgKyA0OC4zNCAqICh0dikNCg0Kc2FsZXNfcHJlZGljdGVkID0gLTE3MTUwLjQ2ICsyNzUuNjkgKig3NSkgKyA0OC4zNCooMjcwKQ0Kc2FsZXNfcHJlZGljdGVkDQpgYGANClIgU3E6IDAuOTU3Nw0KQWRqIFIgU3E6MC45NTI3DQoNCmBgYHtyfQ0KcmVhZC5jc3YoImRhdGEvbWFya2V0aW5nLmNzdiIpDQpoZWFkKG15ZGF0YSkNCmBgYA0KDQoNCg0KRm9yIG1scjEsIHRoZSBSLVNxdWFyZWQgdmFsdWVzIGlzIDAuOTU3NyBhbmQgdGhlIEFkaiBSLVNxdWFyZWQgaXMgMC45NTI3LiANCg0KQ3JlYXRlIGEgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZywgZGlzcGxheSB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzLCBhbmQgd3JpdGUgdGhlIHZhbHVlcyBmb3IgUi1TcXVhcmVkIGFuZCBBZGogUi1TcXVhcmVkOiANCmBgYHtyfQ0KI21scjIgPSBTYWxlcyBwcmVkaWN0ZWQgYnkgcmFkaW8sIHR2LCBhbmQgcG9zDQptbHIyPC0gbG0oc2FsZXMgfiByYWRpbyArIHR2ICsgcG9zKQ0Kc3VtbWFyeShtbHIyKQ0KYGBgDQoNCmBgYHtyfQ0KI3NhbGVzX3ByZWRpY3RlZCA9IC0xNTQ5MS4yMyArIDI5MS4zNiAqIChyYWRpbykgKyAzOC4yNiAqICh0dikgLTEwNy42MiAocG9zKQ0KDQpzYWxlc19wcmVkaWN0ZWQgPSAtMTU0OTEuMjMgKyAyOTEuMzYqKDc1KSArIDM4LjI2KigyNzApIC0gMTA3LjYyKiAoMS4zKQ0Kc2FsZXNfcHJlZGljdGVkDQpgYGANClIgU3E6IDAuOTU4NQ0KQWRqIFIgU3E6MC45NTA4DQoNCmBgYHtyfQ0KcmVhZC5jc3YoImRhdGEvbWFya2V0aW5nLmNzdiIpDQpgYGANCg0KDQpgYGB7cn0NCiNtbHIzID0gU2FsZXMgcHJlZGljdGVkIGJ5IHJhZGlvLCB0diwgcG9zLCBhbmQgcGFwZXINCm1scjM8LSBsbShzYWxlcyB+IHJhZGlvICsgdHYgKyBwb3MgKyBwYXBlcikNCnN1bW1hcnkobWxyMykNCmBgYA0KDQpgYGB7cn0NCiNzYWxlc19wcmVkaWN0ZWQgPSAtMTM4MDEuMDE1ICsgMjk0LjIyNCAqIChyYWRpbykgKyAzMy4zNjkgKiAodHYpIC0gMTI4Ljg3NSoocG9zKSAtOS4xNTkqKHBhcGVyKQ0KDQpzYWxlc19wcmVkaWN0ZWQgPSAtMTM4MDEuMDE1ICsgMjk0LjIyNCAqICg3NSkgKyAzMy4zNjkgKiAoMjcwKSAtIDEyOC44NzUqKDEuMykgLTkuMTU5Kig4MikNCnNhbGVzX3ByZWRpY3RlZA0KYGBgDQpSIFNxOiAwLjk2MTINCkFkaiBSIFNxOjAuOTUwOQ0KYGBge3J9DQpyZWFkLmNzdigiZGF0YS9tYXJrZXRpbmcuY3N2IikNCmhlYWQobXlkYXRhKQ0KYGBgDQoNCg0KQmFzZWQgcHVyZWx5IG9uIHRoZSB2YWx1ZXMgZm9yIFItU3F1YXJlZCBhbmQgQWRqIFItU3F1YXJlZCwgd2hpY2ggbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaXMgYmVzdCBpbiBwcmVkaWN0aW5nIHNhbGVzLiBFeHBsYWluIHdoeS4gDQoNCipCYXNlZCBwdXJlbHkgb24gdGhlIGFkanVzdGVkIHIgc3F1YXJlZCBJIHRoaW5rIHRoYXQgdGhlIGJlc3QgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaXMgYG1scjFgIGJlY2F1c2UgaXQgaXMgaGFzIHRoZSBsYXJnZXN0IGFkanVzdGVkIHIgc3F1YXJlZCBvdXQgb2YgdGhlIHRocmVlLiBUbyBjb25maXJtIHRoYXQgdGhpcyBpcyB0cnVlIHdlIHdpbGwgdXNlIHRoYXQgbW9kZWwgdG8gY2FsY3VsYXRlIG91ciBzYWxlcyB3aXRoIHRoZSB2YWx1ZXMgYmVsb3cuKg0KDQpBZnRlciBkZWNpZGluZyB3aGljaCBtb2RlbCBwcmVkaWN0cyBzYWxlcyBiZXN0LCB3ZSB3aWxsIGNvbmZpcm0gdGhlIGl0IHRydWx5IGlzIHRoZSBiZXN0IG1vZGVsIGJ5IHByZWRpY3Rpbmcgc2FsZXMgZ2l2ZW4gaW5kZXBlbmRlbnQgdmFyaWFibGVzLiANCg0KR2l2ZW4gdGhhdCBgUmFkaW8gPSA2OWAgLCBgVFYgPSAyNTVgICwgYFBPUyA9IDEuNWAsIGFuZCBgUGFwZXIgPSA3NWAsIGNhbGN1bGF0ZSB0aGUgcHJlZGljdGVkIHNhbGVzIHZhbHVlIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBtb2RlbHMgYWJvdmUuDQoNCmBgYHtyfQ0Kc2FsZXNfcHJlZGljdGVkID0gLTE3MTUwLjQ2ICsyNzUuNjkgKiAocmFkaW8pICsgNDguMzQgKiAodHYpDQoNCnNhbGVzX3ByZWRpY3RlZCA9IC0xNzE1MC40NiArMjc1LjY5ICooNjkpICsgNDguMzQqKDI1NSkNCnNhbGVzX3ByZWRpY3RlZA0KYGBgDQoNCmBgYHtyfQ0KcmVhZC5jc3YoImRhdGEvbWFya2V0aW5nLmNzdiIpDQpoZWFkKG15ZGF0YSkNCmBgYA0KDQpgYGB7cn0NCiNzYWxlc19wcmVkaWN0ZWQgPSAtMTU0OTEuMjMgKyAyOTEuMzYgKiAocmFkaW8pICsgMzguMjYgKiAodHYpIC0xMDcuNjIgKHBvcykNCg0Kc2FsZXNfcHJlZGljdGVkID0gLTE1NDkxLjIzICsgMjkxLjM2Kig2OSkgKyAzOC4yNiooMjU1KSAtIDEwNy42MiogKDEuNSkNCnNhbGVzX3ByZWRpY3RlZA0KYGBgDQoNCmBgYHtyfQ0KcmVhZC5jc3YoImRhdGEvbWFya2V0aW5nLmNzdiIpDQpoZWFkKG15ZGF0YSkNCmBgYA0KDQpgYGB7cn0NCiNzYWxlc19wcmVkaWN0ZWQgPSAtMTM4MDEuMDE1ICsgMjk0LjIyNCAqIChyYWRpbykgKyAzMy4zNjkgKiAodHYpIC0gMTI4Ljg3NSoocG9zKSAtOS4xNTkqKHBhcGVyKQ0KDQpzYWxlc19wcmVkaWN0ZWQgPSAtMTM4MDEuMDE1ICsgMjk0LjIyNCAqICg2OSkgKyAzMy4zNjkgKiAoMjU1KSAtIDEyOC44NzUqKDEuNSkgLTkuMTU5Kig3NSkNCnNhbGVzX3ByZWRpY3RlZA0KYGBgDQoNCmBgYHtyfQ0KcmVhZC5jc3YoImRhdGEvbWFya2V0aW5nLmNzdiIpDQpoZWFkKG15ZGF0YSkNCmBgYA0KQmFzZWQgb24gb3VyIGRhdGEgYWJvdmUgd2UgY2FuIGNvbmZpcm0gdGhhdCB0aGUgYmVzdCBtb2RlbCBpcyBgbWxyM2AgYmVjYXVzZSBpdCBnaXZlcyB1cyB0aGUgY2xvc2VzdCB2YWx1ZSBvZiBzYWxlcyBmb3IgdGhlIGdpdmVuIHZhbHVlcyBvZiByYWRpbywgcGFwZXIsIHR2LCBhbmQgcG9zDQoNCg0KDQotLS0tLS0tLS0tDQoNCiMjIyBUYXNrIDMNCg0KVG8gY29tcGxldGUgdGhlIGxhc3QgdGFzaywgZm9sbG93IHRoZSBkaXJlY3Rpb25zIGZvdW5kIGJlbG93LiBNYWtlIHN1cmUgdG8gc2NyZWVuc2hvdCBhbmQgYXR0YWNoIGFueSBwaWN0dXJlcyBvZiB0aGUgcmVzdWx0cyBvYnRhaW5lZCBvciBhbnkgcXVlc3Rpb25zIGFza2VkLiANCg0KICAxLiBMb2dvbiB0byB5b3VyIFdhdHNvbiBBbmFseXRpY3MgYWNjb3VudCBhdCB3YXRzb25hbmFseXRpY3MuY29tDQogIDIuIFVwbG9hZCB0aGUgZmlsZSBtYXJrZXRpbmcuY3N2IHVubGVzcyBhbHJlYWR5IGluIHlvdXIgZm9sZGVyDQogIDMuIFVzZSB0aGUgUHJlZGljdGl2ZSBtb2R1bGUgdG8gYW5hbHl6ZSB0aGUgZGF0YQ0KICA0LiBOb3RlIHRoZSBwcmVkaWN0aXZlIHBvd2VyIHN0cmVuZ3RoIG9mIHJlcG9ydGVkIHZhcmlhYmxlcy4gQ29uc2lkZXIgdGhlIG9uZSBmaWVsZCBwcmVkaWN0aXZlIG1vZGVsIG9ubHkuDQogIDUuIEhvdyBkbyBXYXRzb24gcmVzdWx0cyByZWNvbmNpbGUgd2l0aCB5b3VyIGZpbmRpbmdzIGJhc2VkIG9uIHRoZSBSIHJlZ3Jlc3Npb24gYW5hbHlzaXMgaW4gdGFzayAyPyBFeHBsYWluIGhvdy4NCiAgDQogIA0KKkJhc2VkIG9uIHRoZSBvbmUgZmllbGQgcHJlZGljdGl2ZSBtb2RlbCBmcm9tIFdhdHNvbiBpdCB3YXMgY29uY2x1ZGVkIHRoYXQgcmFkaW8gZG9lcyBpbmZhY3QgZHJpdmUgc2FsZXMgYnkgYWJvdXQgOTMlLiBJbiBvdGhlciB3b3JkcyA5MyBwZXJjZW50IG9mIHNhbGVzIGFyZSBkcml2ZW4gYnkgcmFkaW8uIFRoZXJlZm9yZSB0aGUgbW9yZSB3ZSB1c2UgdGhlIHJhZGlvIHRvIG91ciBhZHZhbnRhZ2UgKHByb21vdGlvbmFsIGJhc2lzKSB0aGUgbW9yZSBvdXIgc2FsZXMgd2lsbCBpbmNyZWFzZS4gVGhlIGltYWdlcyBiZWxvdyBzdGF0ZSB0aGlzIGluZm9ybWF0aW9uLkZyb20gdGhlIHJlc3VsdHMgYmVsb3cgYW5kIHRob3NlIHdlIGNhbGN1bGF0ZWQgaW4gdGFzayB0d28gaXQgY2FuIGJlIGNvbmNsdWRlZCB0aGF0IHJhZGlvIGFuZCBzYWxlcyBkbyBoYXZlIGEgc3Ryb25nIGNvcnJlbGF0aW9uIGdpdmVuIHRoYXQgdGhpcyBpcyB3aGVyZSB0aGUgaGlnaGVzdCBhZGp1c3RlZCByIHNxdWFyZSByZXN1bHRlZC4gKg0KDQohW10oaW1ncy9XYXRzb24uUE5HKQ0KDQohW10oaW1ncy9XYXRzb24gMi5QTkcpDQoNCg0KDQoNCg==