Section 1 - Creating Our First Model

1.1

Next, build a linear regression model to predict the dependent variable Temp, using MEI, CO2, CH4, N2O, CFC.11, CFC.12, TSI, and Aerosols as independent variables (Year and Month should NOT be used in the model). Use the training set to build the model.

Enter the model R2(the “Multiple R-squared” value):

Sys.setlocale("LC_ALL","C")
[1] "C"
climatechange = read.csv("climate_change.csv")
names(climatechange)
 [1] "Year"     "Month"    "MEI"      "CO2"      "CH4"     
 [6] "N2O"      "CFC.11"   "CFC.12"   "TSI"      "Aerosols"
[11] "Temp"    
training_set = subset(climatechange,Year<=2006)
testing_set = subset(climatechange,Year>2006)
model1 = lm(Temp ~ MEI+ CO2+ CH4+ N2O+ CFC.11+ CFC.12+TSI + Aerosols,data=training_set)
summary(model1)

Call:
lm(formula = Temp ~ MEI + CO2 + CH4 + N2O + CFC.11 + CFC.12 + 
    TSI + Aerosols, data = training_set)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.25888 -0.05913 -0.00082  0.05649  0.32433 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.246e+02  1.989e+01  -6.265 1.43e-09 ***
MEI          6.421e-02  6.470e-03   9.923  < 2e-16 ***
CO2          6.457e-03  2.285e-03   2.826  0.00505 ** 
CH4          1.240e-04  5.158e-04   0.240  0.81015    
N2O         -1.653e-02  8.565e-03  -1.930  0.05467 .  
CFC.11      -6.631e-03  1.626e-03  -4.078 5.96e-05 ***
CFC.12       3.808e-03  1.014e-03   3.757  0.00021 ***
TSI          9.314e-02  1.475e-02   6.313 1.10e-09 ***
Aerosols    -1.538e+00  2.133e-01  -7.210 5.41e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.09171 on 275 degrees of freedom
Multiple R-squared:  0.7509,    Adjusted R-squared:  0.7436 
F-statistic: 103.6 on 8 and 275 DF,  p-value: < 2.2e-16
#R2=0.7509

1.2

Which variables are significant in the model? We will consider a variable signficant only if the p-value is below 0.05. (Select all that apply.)

#MEI,CO2,CFC.11,CFC.12,TSI,Aerosols

Section 2 - Understanding the Model

2.1

Current scientific opinion is that nitrous oxide and CFC-11 are greenhouse gases: gases that are able to trap heat from the sun and contribute to the heating of the Earth. However, the regression coefficients of both the N2O and CFC-11 variables are negative, indicating that increasing atmospheric concentrations of either of these two compounds is associated with lower global temperatures.

Which of the following is the simplest correct explanation for this contradiction?

cor(testing_set)
               Year       Month        MEI         CO2         CH4
Year      1.0000000  0.00000000 -0.2754504  0.45486448  0.15566973
Month     0.0000000  1.00000000 -0.3482122 -0.41456660  0.09977867
MEI      -0.2754504 -0.34821220  1.0000000  0.17967635 -0.20659234
CO2       0.4548645 -0.41456660  0.1796764  1.00000000 -0.10884840
CH4       0.1556697  0.09977867 -0.2065923 -0.10884840  1.00000000
N2O       0.8580982  0.38683949 -0.3733920  0.20494622  0.46508421
CFC.11   -0.8235094 -0.53139807  0.4114444 -0.16392570 -0.01528102
CFC.12   -0.8603327 -0.45186554  0.3791321 -0.26511483  0.02475535
TSI      -0.5192894 -0.30973797  0.1062877 -0.08406383 -0.15950167
Aerosols -0.4710490  0.07026403  0.3757188 -0.56366539  0.43731727
Temp     -0.3204648 -0.09031795  0.5847178 -0.24338509 -0.18064309
                N2O      CFC.11      CFC.12           TSI
Year      0.8580982 -0.82350938 -0.86033267 -0.5192893884
Month     0.3868395 -0.53139807 -0.45186554 -0.3097379696
MEI      -0.3733920  0.41144443  0.37913213  0.1062877414
CO2       0.2049462 -0.16392570 -0.26511483 -0.0840638320
CH4       0.4650842 -0.01528102  0.02475535 -0.1595016694
N2O       1.0000000 -0.84899735 -0.84436514 -0.6014848059
CFC.11   -0.8489974  1.00000000  0.98967377  0.5848479042
CFC.12   -0.8443651  0.98967377  1.00000000  0.5466606219
TSI      -0.6014848  0.58484790  0.54666062  1.0000000000
Aerosols -0.2064317  0.45959367  0.51243221  0.1825236588
Temp     -0.3320878  0.29329997  0.30733294 -0.0001461234
            Aerosols          Temp
Year     -0.47104905 -0.3204648475
Month     0.07026403 -0.0903179484
MEI       0.37571876  0.5847177889
CO2      -0.56366539 -0.2433850854
CH4       0.43731727 -0.1806430942
N2O      -0.20643166 -0.3320878045
CFC.11    0.45959367  0.2932999707
CFC.12    0.51243221  0.3073329377
TSI       0.18252366 -0.0001461234
Aerosols  1.00000000  0.5420649667
Temp      0.54206497  1.0000000000
#All of the gas concentration variables reflect human development - N2O and CFC.11 are correlated with other variables in the data set.

2.2

Compute the correlations between all the variables in the training set. Which of the following independent variables is N2O highly correlated with (absolute correlation greater than 0.7)? Select all that apply.

cor(training_set)
                Year         Month           MEI         CO2
Year      1.00000000 -0.0279419602 -0.0369876842  0.98274939
Month    -0.02794196  1.0000000000  0.0008846905 -0.10673246
MEI      -0.03698768  0.0008846905  1.0000000000 -0.04114717
CO2       0.98274939 -0.1067324607 -0.0411471651  1.00000000
CH4       0.91565945  0.0185686624 -0.0334193014  0.87727963
N2O       0.99384523  0.0136315303 -0.0508197755  0.97671982
CFC.11    0.56910643 -0.0131112236  0.0690004387  0.51405975
CFC.12    0.89701166  0.0006751102  0.0082855443  0.85268963
TSI       0.17030201 -0.0346061935 -0.1544919227  0.17742893
Aerosols -0.34524670  0.0148895406  0.3402377871 -0.35615480
Temp      0.78679714 -0.0998567411  0.1724707512  0.78852921
                 CH4         N2O      CFC.11        CFC.12
Year      0.91565945  0.99384523  0.56910643  0.8970116635
Month     0.01856866  0.01363153 -0.01311122  0.0006751102
MEI      -0.03341930 -0.05081978  0.06900044  0.0082855443
CO2       0.87727963  0.97671982  0.51405975  0.8526896272
CH4       1.00000000  0.89983864  0.77990402  0.9636162478
N2O       0.89983864  1.00000000  0.52247732  0.8679307757
CFC.11    0.77990402  0.52247732  1.00000000  0.8689851828
CFC.12    0.96361625  0.86793078  0.86898518  1.0000000000
TSI       0.24552844  0.19975668  0.27204596  0.2553028138
Aerosols -0.26780919 -0.33705457 -0.04392120 -0.2251312440
Temp      0.70325502  0.77863893  0.40771029  0.6875575483
                 TSI    Aerosols        Temp
Year      0.17030201 -0.34524670  0.78679714
Month    -0.03460619  0.01488954 -0.09985674
MEI      -0.15449192  0.34023779  0.17247075
CO2       0.17742893 -0.35615480  0.78852921
CH4       0.24552844 -0.26780919  0.70325502
N2O       0.19975668 -0.33705457  0.77863893
CFC.11    0.27204596 -0.04392120  0.40771029
CFC.12    0.25530281 -0.22513124  0.68755755
TSI       1.00000000  0.05211651  0.24338269
Aerosols  0.05211651  1.00000000 -0.38491375
Temp      0.24338269 -0.38491375  1.00000000
#CO2,CH4,CFC.12

Which of the following independent variables is CFC.11 highly correlated with? Select all that apply.

cor(training_set)
                Year         Month           MEI         CO2
Year      1.00000000 -0.0279419602 -0.0369876842  0.98274939
Month    -0.02794196  1.0000000000  0.0008846905 -0.10673246
MEI      -0.03698768  0.0008846905  1.0000000000 -0.04114717
CO2       0.98274939 -0.1067324607 -0.0411471651  1.00000000
CH4       0.91565945  0.0185686624 -0.0334193014  0.87727963
N2O       0.99384523  0.0136315303 -0.0508197755  0.97671982
CFC.11    0.56910643 -0.0131112236  0.0690004387  0.51405975
CFC.12    0.89701166  0.0006751102  0.0082855443  0.85268963
TSI       0.17030201 -0.0346061935 -0.1544919227  0.17742893
Aerosols -0.34524670  0.0148895406  0.3402377871 -0.35615480
Temp      0.78679714 -0.0998567411  0.1724707512  0.78852921
                 CH4         N2O      CFC.11        CFC.12
Year      0.91565945  0.99384523  0.56910643  0.8970116635
Month     0.01856866  0.01363153 -0.01311122  0.0006751102
MEI      -0.03341930 -0.05081978  0.06900044  0.0082855443
CO2       0.87727963  0.97671982  0.51405975  0.8526896272
CH4       1.00000000  0.89983864  0.77990402  0.9636162478
N2O       0.89983864  1.00000000  0.52247732  0.8679307757
CFC.11    0.77990402  0.52247732  1.00000000  0.8689851828
CFC.12    0.96361625  0.86793078  0.86898518  1.0000000000
TSI       0.24552844  0.19975668  0.27204596  0.2553028138
Aerosols -0.26780919 -0.33705457 -0.04392120 -0.2251312440
Temp      0.70325502  0.77863893  0.40771029  0.6875575483
                 TSI    Aerosols        Temp
Year      0.17030201 -0.34524670  0.78679714
Month    -0.03460619  0.01488954 -0.09985674
MEI      -0.15449192  0.34023779  0.17247075
CO2       0.17742893 -0.35615480  0.78852921
CH4       0.24552844 -0.26780919  0.70325502
N2O       0.19975668 -0.33705457  0.77863893
CFC.11    0.27204596 -0.04392120  0.40771029
CFC.12    0.25530281 -0.22513124  0.68755755
TSI       1.00000000  0.05211651  0.24338269
Aerosols  0.05211651  1.00000000 -0.38491375
Temp      0.24338269 -0.38491375  1.00000000
#CH4,CFC.12 

Section 3 - Simplifying the Model

3.1

Given that the correlations are so high, let us focus on the N2O variable and build a model with only MEI, TSI, Aerosols and N2O as independent variables. Remember to use the training set to build the model.

Enter the coefficient of N2O in this reduced model:

model2 = lm(Temp ~ N2O+MEI+TSI+Aerosols, data= training_set)
summary(model2)

Call:
lm(formula = Temp ~ N2O + MEI + TSI + Aerosols, data = training_set)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.27916 -0.05975 -0.00595  0.05672  0.34195 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.162e+02  2.022e+01  -5.747 2.37e-08 ***
N2O          2.532e-02  1.311e-03  19.307  < 2e-16 ***
MEI          6.419e-02  6.652e-03   9.649  < 2e-16 ***
TSI          7.949e-02  1.487e-02   5.344 1.89e-07 ***
Aerosols    -1.702e+00  2.180e-01  -7.806 1.19e-13 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.09547 on 279 degrees of freedom
Multiple R-squared:  0.7261,    Adjusted R-squared:  0.7222 
F-statistic: 184.9 on 4 and 279 DF,  p-value: < 2.2e-16
#2.532e-02 : 0.7261

Section 4 - Automatically Building the Model

4.1

We have many variables in this problem, and as we have seen above, dropping some from the model does not decrease model quality. R provides a function, step, that will automate the procedure of trying different combinations of variables to find a good compromise of model simplicity and R2. This trade-off is formalized by the Akaike information criterion (AIC) - it can be informally thought of as the quality of the model with a penalty for the number of variables in the model.

The step function has one argument - the name of the initial model. It returns a simplified model. Use the step function in R to derive a new model, with the full model as the initial model (HINT: If your initial full model was called “climateLM”, you could create a new model with the step function by typing step(climateLM). Be sure to save your new model to a variable name so that you can look at the summary. For more information about the step function, type ?step in your R console.)

Enter the R2 value of the model produced by the step function:

model3 = step(model1)
Start:  AIC=-1348.16
Temp ~ MEI + CO2 + CH4 + N2O + CFC.11 + CFC.12 + TSI + Aerosols

           Df Sum of Sq    RSS     AIC
- CH4       1   0.00049 2.3135 -1350.1
<none>                  2.3130 -1348.2
- N2O       1   0.03132 2.3443 -1346.3
- CO2       1   0.06719 2.3802 -1342.0
- CFC.12    1   0.11874 2.4318 -1335.9
- CFC.11    1   0.13986 2.4529 -1333.5
- TSI       1   0.33516 2.6482 -1311.7
- Aerosols  1   0.43727 2.7503 -1301.0
- MEI       1   0.82823 3.1412 -1263.2

Step:  AIC=-1350.1
Temp ~ MEI + CO2 + N2O + CFC.11 + CFC.12 + TSI + Aerosols

           Df Sum of Sq    RSS     AIC
<none>                  2.3135 -1350.1
- N2O       1   0.03133 2.3448 -1348.3
- CO2       1   0.06672 2.3802 -1344.0
- CFC.12    1   0.13023 2.4437 -1336.5
- CFC.11    1   0.13938 2.4529 -1335.5
- TSI       1   0.33500 2.6485 -1313.7
- Aerosols  1   0.43987 2.7534 -1302.7
- MEI       1   0.83118 3.1447 -1264.9
summary(model3)

Call:
lm(formula = Temp ~ MEI + CO2 + N2O + CFC.11 + CFC.12 + TSI + 
    Aerosols, data = training_set)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.25770 -0.05994 -0.00104  0.05588  0.32203 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.245e+02  1.985e+01  -6.273 1.37e-09 ***
MEI          6.407e-02  6.434e-03   9.958  < 2e-16 ***
CO2          6.402e-03  2.269e-03   2.821 0.005129 ** 
N2O         -1.602e-02  8.287e-03  -1.933 0.054234 .  
CFC.11      -6.609e-03  1.621e-03  -4.078 5.95e-05 ***
CFC.12       3.868e-03  9.812e-04   3.942 0.000103 ***
TSI          9.312e-02  1.473e-02   6.322 1.04e-09 ***
Aerosols    -1.540e+00  2.126e-01  -7.244 4.36e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.09155 on 276 degrees of freedom
Multiple R-squared:  0.7508,    Adjusted R-squared:  0.7445 
F-statistic: 118.8 on 7 and 276 DF,  p-value: < 2.2e-16
#0.7508

Which of the following variable(s) were eliminated from the full model by the step function? Select all that apply.

#CH4

Section 5 - Testing on Unseen Data

5.1

We have developed an understanding of how well we can fit a linear regression to the training data, but does the model quality hold when applied to unseen data?

Using the model produced from the step function, calculate temperature predictions for the testing data set, using the predict function.

Enter the testing set R2:

R2
[1] 0.6286051
LS0tDQp0aXRsZTogIkFTMi0xIENsaW1hdGUgQ2hhbmdlIg0KYXV0aG9yOiAiPOeOi+asoz4gPE0wNjQxMTEwMzk+Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIFNlY3Rpb24gMSAtIENyZWF0aW5nIE91ciBGaXJzdCBNb2RlbA0KDQojIyMjIDEuMSANCk5leHQsIGJ1aWxkIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgdG8gcHJlZGljdCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIFRlbXAsIHVzaW5nIE1FSSwgQ08yLCBDSDQsIE4yTywgQ0ZDLjExLCBDRkMuMTIsIFRTSSwgYW5kIEFlcm9zb2xzIGFzIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoWWVhciBhbmQgTW9udGggc2hvdWxkIE5PVCBiZSB1c2VkIGluIHRoZSBtb2RlbCkuIFVzZSB0aGUgdHJhaW5pbmcgc2V0IHRvIGJ1aWxkIHRoZSBtb2RlbC4NCg0KRW50ZXIgdGhlIG1vZGVsIFIyKHRoZSAiTXVsdGlwbGUgUi1zcXVhcmVkIiB2YWx1ZSk6DQoNCmBgYHtyfQ0KU3lzLnNldGxvY2FsZSgiTENfQUxMIiwiQyIpDQpjbGltYXRlY2hhbmdlID0gcmVhZC5jc3YoImNsaW1hdGVfY2hhbmdlLmNzdiIpDQpuYW1lcyhjbGltYXRlY2hhbmdlKQ0KdHJhaW5pbmdfc2V0ID0gc3Vic2V0KGNsaW1hdGVjaGFuZ2UsWWVhcjw9MjAwNikNCnRlc3Rpbmdfc2V0ID0gc3Vic2V0KGNsaW1hdGVjaGFuZ2UsWWVhcj4yMDA2KQ0KbW9kZWwxID0gbG0oVGVtcCB+IE1FSSsgQ08yKyBDSDQrIE4yTysgQ0ZDLjExKyBDRkMuMTIrVFNJICsgQWVyb3NvbHMsZGF0YT10cmFpbmluZ19zZXQpDQpzdW1tYXJ5KG1vZGVsMSkNCiNSMj0wLjc1MDkNCmBgYA0KDQojIyMjIDEuMg0KV2hpY2ggdmFyaWFibGVzIGFyZSBzaWduaWZpY2FudCBpbiB0aGUgbW9kZWw/IFdlIHdpbGwgY29uc2lkZXIgYSB2YXJpYWJsZSBzaWduZmljYW50IG9ubHkgaWYgdGhlIHAtdmFsdWUgaXMgYmVsb3cgMC4wNS4gKFNlbGVjdCBhbGwgdGhhdCBhcHBseS4pDQoNCmBgYHtyfQ0KI01FSSxDTzIsQ0ZDLjExLENGQy4xMixUU0ksQWVyb3NvbHMNCmBgYA0KDQojIyMgU2VjdGlvbiAyIC0gVW5kZXJzdGFuZGluZyB0aGUgTW9kZWwNCg0KIyMjIyAyLjENCkN1cnJlbnQgc2NpZW50aWZpYyBvcGluaW9uIGlzIHRoYXQgbml0cm91cyBveGlkZSBhbmQgQ0ZDLTExIGFyZSBncmVlbmhvdXNlIGdhc2VzOiBnYXNlcyB0aGF0IGFyZSBhYmxlIHRvIHRyYXAgaGVhdCBmcm9tIHRoZSBzdW4gYW5kIGNvbnRyaWJ1dGUgdG8gdGhlIGhlYXRpbmcgb2YgdGhlIEVhcnRoLiBIb3dldmVyLCB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgb2YgYm90aCB0aGUgTjJPIGFuZCBDRkMtMTEgdmFyaWFibGVzIGFyZSBuZWdhdGl2ZSwgaW5kaWNhdGluZyB0aGF0IGluY3JlYXNpbmcgYXRtb3NwaGVyaWMgY29uY2VudHJhdGlvbnMgb2YgZWl0aGVyIG9mIHRoZXNlIHR3byBjb21wb3VuZHMgaXMgYXNzb2NpYXRlZCB3aXRoIGxvd2VyIGdsb2JhbCB0ZW1wZXJhdHVyZXMuDQoNCldoaWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgdGhlIHNpbXBsZXN0IGNvcnJlY3QgZXhwbGFuYXRpb24gZm9yIHRoaXMgY29udHJhZGljdGlvbj8NCg0KYGBge3J9DQpjb3IodGVzdGluZ19zZXQpDQojQWxsIG9mIHRoZSBnYXMgY29uY2VudHJhdGlvbiB2YXJpYWJsZXMgcmVmbGVjdCBodW1hbiBkZXZlbG9wbWVudCAtIE4yTyBhbmQgQ0ZDLjExIGFyZSBjb3JyZWxhdGVkIHdpdGggb3RoZXIgdmFyaWFibGVzIGluIHRoZSBkYXRhIHNldC4NCmBgYA0KDQojIyMjIDIuMg0KQ29tcHV0ZSB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gYWxsIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHRyYWluaW5nIHNldC4gV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaXMgTjJPIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggKGFic29sdXRlIGNvcnJlbGF0aW9uIGdyZWF0ZXIgdGhhbiAwLjcpPyBTZWxlY3QgYWxsIHRoYXQgYXBwbHkuDQoNCmBgYHtyfQ0KY29yKHRyYWluaW5nX3NldCkNCiNDTzIsQ0g0LENGQy4xMg0KYGBgDQoNCldoaWNoIG9mIHRoZSBmb2xsb3dpbmcgaW5kZXBlbmRlbnQgdmFyaWFibGVzIGlzIENGQy4xMSBoaWdobHkgY29ycmVsYXRlZCB3aXRoPyBTZWxlY3QgYWxsIHRoYXQgYXBwbHkuDQoNCmBgYHtyfQ0KY29yKHRyYWluaW5nX3NldCkNCiNDSDQsQ0ZDLjEyIA0KYGBgDQoNCiMjIyBTZWN0aW9uIDMgLSBTaW1wbGlmeWluZyB0aGUgTW9kZWwNCg0KIyMjIyAzLjENCkdpdmVuIHRoYXQgdGhlIGNvcnJlbGF0aW9ucyBhcmUgc28gaGlnaCwgbGV0IHVzIGZvY3VzIG9uIHRoZSBOMk8gdmFyaWFibGUgYW5kIGJ1aWxkIGEgbW9kZWwgd2l0aCBvbmx5IE1FSSwgVFNJLCBBZXJvc29scyBhbmQgTjJPIGFzIGluZGVwZW5kZW50IHZhcmlhYmxlcy4gUmVtZW1iZXIgdG8gdXNlIHRoZSB0cmFpbmluZyBzZXQgdG8gYnVpbGQgdGhlIG1vZGVsLg0KDQpFbnRlciB0aGUgY29lZmZpY2llbnQgb2YgTjJPIGluIHRoaXMgcmVkdWNlZCBtb2RlbDoNCg0KYGBge3J9DQptb2RlbDIgPSBsbShUZW1wIH4gTjJPK01FSStUU0krQWVyb3NvbHMsIGRhdGE9IHRyYWluaW5nX3NldCkNCnN1bW1hcnkobW9kZWwyKQ0KIzIuNTMyZS0wMiwgMC43MjYxDQpgYGANCg0KIyMjIFNlY3Rpb24gNCAtIEF1dG9tYXRpY2FsbHkgQnVpbGRpbmcgdGhlIE1vZGVsDQoNCiMjIyMgNC4xDQpXZSBoYXZlIG1hbnkgdmFyaWFibGVzIGluIHRoaXMgcHJvYmxlbSwgYW5kIGFzIHdlIGhhdmUgc2VlbiBhYm92ZSwgZHJvcHBpbmcgc29tZSBmcm9tIHRoZSBtb2RlbCBkb2VzIG5vdCBkZWNyZWFzZSBtb2RlbCBxdWFsaXR5LiBSIHByb3ZpZGVzIGEgZnVuY3Rpb24sIHN0ZXAsIHRoYXQgd2lsbCBhdXRvbWF0ZSB0aGUgcHJvY2VkdXJlIG9mIHRyeWluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHZhcmlhYmxlcyB0byBmaW5kIGEgZ29vZCBjb21wcm9taXNlIG9mIG1vZGVsIHNpbXBsaWNpdHkgYW5kIFIyLiBUaGlzIHRyYWRlLW9mZiBpcyBmb3JtYWxpemVkIGJ5IHRoZSBBa2Fpa2UgaW5mb3JtYXRpb24gY3JpdGVyaW9uIChBSUMpIC0gaXQgY2FuIGJlIGluZm9ybWFsbHkgdGhvdWdodCBvZiBhcyB0aGUgcXVhbGl0eSBvZiB0aGUgbW9kZWwgd2l0aCBhIHBlbmFsdHkgZm9yIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIGluIHRoZSBtb2RlbC4NCg0KVGhlIHN0ZXAgZnVuY3Rpb24gaGFzIG9uZSBhcmd1bWVudCAtIHRoZSBuYW1lIG9mIHRoZSBpbml0aWFsIG1vZGVsLiBJdCByZXR1cm5zIGEgc2ltcGxpZmllZCBtb2RlbC4gVXNlIHRoZSBzdGVwIGZ1bmN0aW9uIGluIFIgdG8gZGVyaXZlIGEgbmV3IG1vZGVsLCB3aXRoIHRoZSBmdWxsIG1vZGVsIGFzIHRoZSBpbml0aWFsIG1vZGVsIChISU5UOiBJZiB5b3VyIGluaXRpYWwgZnVsbCBtb2RlbCB3YXMgY2FsbGVkICJjbGltYXRlTE0iLCB5b3UgY291bGQgY3JlYXRlIGEgbmV3IG1vZGVsIHdpdGggdGhlIHN0ZXAgZnVuY3Rpb24gYnkgdHlwaW5nIHN0ZXAoY2xpbWF0ZUxNKS4gQmUgc3VyZSB0byBzYXZlIHlvdXIgbmV3IG1vZGVsIHRvIGEgdmFyaWFibGUgbmFtZSBzbyB0aGF0IHlvdSBjYW4gbG9vayBhdCB0aGUgc3VtbWFyeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0ZXAgZnVuY3Rpb24sIHR5cGUgP3N0ZXAgaW4geW91ciBSIGNvbnNvbGUuKQ0KDQpFbnRlciB0aGUgUjIgdmFsdWUgb2YgdGhlIG1vZGVsIHByb2R1Y2VkIGJ5IHRoZSBzdGVwIGZ1bmN0aW9uOg0KDQpgYGB7cn0NCm1vZGVsMyA9IHN0ZXAobW9kZWwxKQ0Kc3VtbWFyeShtb2RlbDMpDQojMC43NTA4DQpgYGANCg0KV2hpY2ggb2YgdGhlIGZvbGxvd2luZyB2YXJpYWJsZShzKSB3ZXJlIGVsaW1pbmF0ZWQgZnJvbSB0aGUgZnVsbCBtb2RlbCBieSB0aGUgc3RlcCBmdW5jdGlvbj8gU2VsZWN0IGFsbCB0aGF0IGFwcGx5Lg0KDQpgYGB7cn0NCiNDSDQNCmBgYA0KDQojIyMgU2VjdGlvbiA1IC0gVGVzdGluZyBvbiBVbnNlZW4gRGF0YQ0KDQojIyMjIDUuMQ0KV2UgaGF2ZSBkZXZlbG9wZWQgYW4gdW5kZXJzdGFuZGluZyBvZiBob3cgd2VsbCB3ZSBjYW4gZml0IGEgbGluZWFyIHJlZ3Jlc3Npb24gdG8gdGhlIHRyYWluaW5nIGRhdGEsIGJ1dCBkb2VzIHRoZSBtb2RlbCBxdWFsaXR5IGhvbGQgd2hlbiBhcHBsaWVkIHRvIHVuc2VlbiBkYXRhPw0KDQpVc2luZyB0aGUgbW9kZWwgcHJvZHVjZWQgZnJvbSB0aGUgc3RlcCBmdW5jdGlvbiwgY2FsY3VsYXRlIHRlbXBlcmF0dXJlIHByZWRpY3Rpb25zIGZvciB0aGUgdGVzdGluZyBkYXRhIHNldCwgdXNpbmcgdGhlIHByZWRpY3QgZnVuY3Rpb24uDQoNCkVudGVyIHRoZSB0ZXN0aW5nIHNldCBSMjoNCmBgYHtyfQ0KUHJlZGljdCA9IHByZWRpY3QobW9kZWwzLCB0ZXN0aW5nX3NldCkNClNTRSA9IHN1bSgodGVzdGluZ19zZXQkVGVtcCAtIFByZWRpY3QpXjIpDQpTU1QgPSBzdW0oKHRlc3Rpbmdfc2V0JFRlbXAgLSBtZWFuKHRyYWluaW5nX3NldCRUZW1wKSleMikNClIyID0gMS0gU1NFL1NTVA0KUjINCmBgYA0K