1. Consider the daily stock returns of American Express (AXP), Caterpillar (CAT), and Starbucks (SBUX) from January 1999 to December 2008. The data are simple returns given in the file d-3stocks9908.txt (date, axp, cat, sbux).

require(fBasics)
require(data.table)

da1<-fread("d-3stocks9908.txt",header=T)

(a) Compute the sample mean, standard deviation, skewness, excess kurtosis, minimum, and maximum of each simple return series. (Hint: use the R command basicStats of fBasics)

basicStats(da1[,2:4])

(b) Transform the simple returns to log returns. Compute the sample mean, standard deviation, skewness, excess kurtosis, minimum, and maximum of each log return series.

da2=log(da1[,2:4]+1)
basicStats(da2)

(c) Test the null hypothesis that the mean of the log returns of AXP is zero. (Hint: use the R command t.test)

t.test(da2$axp)

    One Sample t-test

data:  da2$axp
t = -0.31555, df = 2514, p-value = 0.7524
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.0011134506  0.0008047664
sample estimates:
    mean of x 
-0.0001543421 

Since p-value > 5%, we can not reject H0. Thus the true mean is equal to zero.

(d) Obtain the histogram (with nclass=40) and sample density plot of the daily log returns of AXP stock.

hist(da2$axp,nclass=40)

plot(density(da2$axp))

(e) Test if log return of AXP follows normal distribution by using at least two methods. (Need to give explanation)

Method 1: Jarque-Bera test

normalTest(da2$axp,method="jb")

Title:
 Jarque - Bera Normalality Test

Test Results:
  STATISTIC:
    X-squared: 4466.8422
  P VALUE:
    Asymptotic p Value: < 2.2e-16 

Description:
 Wed Jul 10 15:35:59 2019 by user: Pann

Since p value < 5%, we should reject H0. Thus the log return of AXP does not follow normal distribution.

Method 2: Test for symmetry

S1=skewness(da2$axp)/sqrt(6/2515)
print(S1)
[1] -6.892126

Since |S1| > Z_{1-5%/2} = 1.96, we should reject H0. Thus the log return of AXP does not follow normal distribution.

2. Answer the same questions as Problem 1 but using monthly returns for General Motors (GM), CRSP value-weighted index (VW), CRSP equal-weighted index (EW) and S&P composite index from January 1975 to December 2008. The returns of the indexes include dividend distributions. Data file is m-gm3dx7508.txt (date, gm, vw, ew, sp).

(a) Compute the sample mean, standard deviation, skewness, excess kurtosis, minimum, and maximum of each simple return series.

da3<-fread("m-gm3dx7508.txt",header=T)
basicStats(da3[,2:5])

(b) Transform the simple returns to log returns. Compute the sample mean, standard deviation, skewness, excess kurtosis, minimum, and maximum of each log return series.

da4=log(da3[,2:5]+1)
basicStats(da4)

(c) Test the null hypothesis that the mean of the log returns of GM is zero.

t.test(da4$gm)

    One Sample t-test

data:  da4$gm
t = 0.23206, df = 407, p-value = 0.8166
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.008231636  0.010435276
sample estimates:
 mean of x 
0.00110182 

Since p-value > 5%, we can not reject H0. Thus the true mean is equal to zero.

(d) Obtain the histogram (with nclass=40) and sample density plot of the daily log returns of GM stock.

hist(da4$gm,nclass=40)

plot(density(da4$gm))

(e) Test if log return of GM follows normal distribution by using at least two methods. (Need to give explanation)

Method 1: Jarque-Bera test

normalTest(da4$gm,method="jb")

Title:
 Jarque - Bera Normalality Test

Test Results:
  STATISTIC:
    X-squared: 351.3549
  P VALUE:
    Asymptotic p Value: < 2.2e-16 

Description:
 Wed Jul 10 22:40:33 2019 by user: Pann

Since p value is less than 5%, we should reject H0. Thus the log return of GM does not follow normal distribution.

Method 2: Test for tail thickness

K1=(kurtosis(da4$gm)-3)/sqrt(24/408)
print(K1)
[1] 16.72041

Since K > Z_{1-5%/2} = 1.96, we should reject H0. Thus the log return of GM does not follow normal distribution.

3. Consider the monthly stock returns of value-weighted index (VW) from January 1975 to December 2008 in Problem 2. Perform the tests and draw conclusions using the 5% significance level.

(a) Test H0: μ = 0 versus Ha : μ ≠ 0,where μ denotes the mean return.

t.test(da3$vw)

    One Sample t-test

data:  da3$vw
t = 4.5341, df = 407, p-value = 7.619e-06
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.005731219 0.014504752
sample estimates:
 mean of x 
0.01011799 

Since p-value < 5%, we should reject H0. Thus the mean of value-weighted index is not zero.

(b) Test H0: m3 = 0 versus Ha : m3 ≠ 0, where m3 denotes the skewness.

S2=skewness(da3$vw)/sqrt(6/408)
print(S2)
[1] -6.146732

Since |S2| > Z_{1-5%/2}=1.96, we should reject H0. Thus the return of value-weighted index does not follow normal distribution.

(c) Test H0: K = 3 versus Ha : K ≠ 3, where K denotes the kurtosis.

K2=(kurtosis(da3$vw)-3)/sqrt(24/408)
print(K2)
[1] 11.10727

Since K2 > Z_{1-5%/2} = 1.96, we should reject H0. Thus the return of value-weighted index does not follow normal distribution.

4. Consider the daily log returns of AXP stock from January 1999 to December 2008 as in Problem 1. Perform the following tests:

(a) Test the null hypothesis that the skewness measure of the returns is zero;

S3=skewness(da2$axp)/sqrt(6/2515)
print(S3)
[1] -6.892126

Since |S3| > Z_{1-5%/2}=1.96, we should reject H0. Thus the skewness measure of the returns is not zero.

(b) Test the null hypothesis that the excess kurtosis of the returns is zero.

K3=(kurtosis(da2$axp)-3)/sqrt(24/2515)
print(K3)
[1] 66.47812

Since K3 > Z_{1-5%/2}=1.96, we should reject H0. Thus the excess kurtosis of the returns is not zero.

5. Daily foreign exchange rates (spot rates) can be obtained from the Federal Reserve Bank in St Louis (FRED). The data are the noon buying rates in New York City certified by the Federal Reserve Bank of New York. Consider the exchange rates between the U.S. dollar and the Euro from January 4, 1999 to March 8, 2013. See the file d-exuseu.txt.

da5<-fread("d-exuseu.txt",header=T)

(a) Compute the daily log return of the exchange rate.

da6<-diff(log(da5$VALUE))

(b) Compute the sample mean, standard deviation, skewness, excess kurtosis, minimum, and maximum of the log returns of the exchange rate.

basicStats(da6)

(c) Obtain a density plot of the daily long returns of Dollar-Euro exchange rate.

plot(density(da6))

(d) Test H0: μ = 0 versus Ha : μ ≠ 0, where μ denotes the mean of the daily log return of Dollar-Euro exchange rate.

t.test(da6)

    One Sample t-test

data:  da6
t = 0.24489, df = 3565, p-value = 0.8066
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.0001870737  0.0002404769
sample estimates:
   mean of x 
2.670158e-05 

Since p-value > 5%, we can not reject H0. Thus the true mean is equal to zero.

6. Consider SP500 and IBM data (in file ‘SP.csv’ and ‘IBM.csv’ respectively):

da7<-fread("SP.csv",header=T)
da8<-fread("IBM.csv",header=T)

(a) Find the log return of SP and IBM by using ‘Adjusted Price’

da9<-diff(log(da7$SP.Adjusted))
da10<-diff(log(da8$IBM.Adjusted))

(b) Merge the above two return series into a new dataset (hint: using ‘data.frame’) and plot them (y is IBM, x is SP)

da11=data.frame(x=da9,y=da10)
plot(da11)

(c) Find the best linear model by using AIC as criterion (need to show all your models)

Model 1: Simple linear regression with intercept

m1 <- lm(y ~ x, da11)
summary(m1)

Call:
lm(formula = y ~ x, data = da11)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.086931 -0.006241  0.000360  0.006798  0.093286 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.0001795  0.0002345   0.766    0.444    
x           0.2314457  0.0109979  21.045   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01308 on 3111 degrees of freedom
Multiple R-squared:  0.1246,    Adjusted R-squared:  0.1243 
F-statistic: 442.9 on 1 and 3111 DF,  p-value: < 2.2e-16
AIC(m1)
[1] -18160.95

Model 2: Simple linear regression without intercept

m2 <- lm(y ~ -1 + x, da11)
summary(m2)

Call:
lm(formula = y ~ -1 + x, data = da11)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.086752 -0.006060  0.000539  0.006977  0.093462 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
x   0.2315     0.0110   21.05   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01308 on 3112 degrees of freedom
Multiple R-squared:  0.1247,    Adjusted R-squared:  0.1244 
F-statistic: 443.2 on 1 and 3112 DF,  p-value: < 2.2e-16
AIC(m2)
[1] -18162.37
idx <- c(1:length(da9))[da9 <= 0]
nsp <- rep(0,length(da9)) 
nsp[idx] = da9[idx]
c1 <- rep(0,length(da9))
c1[idx] = 1
da12 <- data.frame(x = da9, y = da10, c1, nsp) 
head(da12)

Model 3: With different intercepts (alpha) for positive and negative SP log returns

m3 <- lm(y ~ c1+x, da12)
summary(m3)

Call:
lm(formula = y ~ c1 + x, data = da12)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.086854 -0.006247  0.000366  0.006818  0.093189 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 9.841e-05  4.065e-04   0.242    0.809    
c1          1.614e-04  6.608e-04   0.244    0.807    
x           2.341e-01  1.550e-02  15.107   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01308 on 3110 degrees of freedom
Multiple R-squared:  0.1246,    Adjusted R-squared:  0.1241 
F-statistic: 221.4 on 2 and 3110 DF,  p-value: < 2.2e-16
AIC(m3)
[1] -18159.01

Model 4: With different coefficients (beta) for positive and negative SP log returns

m4 <- lm(y ~ nsp + x, da12)
summary(m4)

Call:
lm(formula = y ~ nsp + x, data = da12)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.086771 -0.006218  0.000382  0.006816  0.092673 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.566e-06  3.303e-04   0.008    0.994    
nsp         -2.357e-02  3.099e-02  -0.760    0.447    
x            2.432e-01  1.900e-02  12.803   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01308 on 3110 degrees of freedom
Multiple R-squared:  0.1248,    Adjusted R-squared:  0.1242 
F-statistic: 221.7 on 2 and 3110 DF,  p-value: < 2.2e-16
AIC(m4)
[1] -18159.53

Model 5: With different intercepts (alpha) and coeff (beta) for positive and negative SP log returns

m5 <- lm(y ~ c1 + nsp + x, da12)
summary(m5)

Call:
lm(formula = y ~ c1 + nsp + x, data = da12)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.086690 -0.006189  0.000400  0.006812  0.092568 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -8.292e-05  4.707e-04  -0.176    0.860    
c1           1.685e-04  6.609e-04   0.255    0.799    
nsp         -2.368e-02  3.100e-02  -0.764    0.445    
x            2.461e-01  2.202e-02  11.173   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01308 on 3109 degrees of freedom
Multiple R-squared:  0.1248,    Adjusted R-squared:  0.124 
F-statistic: 147.8 on 3 and 3109 DF,  p-value: < 2.2e-16
AIC(m5)
[1] -18157.6

Since AIC of model 2 is the smallest, the best linear model is y = 0.2315x.

LS0tDQp0aXRsZTogJ0hvbWV3b3JrMScNCmF1dGhvcjogIkhvbmd5aSBQYW4sIEthaSBXYW5nIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGZpZ19oZWlnaHQ6IDINCiAgICBmaWdfd2lkdGg6IDQNCiAgd29yZF9kb2N1bWVudDoNCiAgICBmaWdfaGVpZ2h0OiAzDQogICAgZmlnX3dpZHRoOiA2DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBmaWdfaGVpZ2h0OiAxMA0KICAgIGZpZ193aWR0aDogMTANCiAgICB0aGVtZTogY29zbW8NCi0tLQ0KIyMjIDEuIENvbnNpZGVyIHRoZSBkYWlseSBzdG9jayByZXR1cm5zIG9mIEFtZXJpY2FuIEV4cHJlc3MgKEFYUCksIENhdGVycGlsbGFyIChDQVQpLCBhbmQgU3RhcmJ1Y2tzIChTQlVYKSBmcm9tIEphbnVhcnkgMTk5OSB0byBEZWNlbWJlciAyMDA4LiBUaGUgZGF0YSBhcmUgc2ltcGxlIHJldHVybnMgZ2l2ZW4gaW4gdGhlIGZpbGUgZC0zc3RvY2tzOTkwOC50eHQgKGRhdGUsIGF4cCwgY2F0LCBzYnV4KS4NCg0KYGBge3J9DQpyZXF1aXJlKGZCYXNpY3MpDQpyZXF1aXJlKGRhdGEudGFibGUpDQoNCmRhMTwtZnJlYWQoImQtM3N0b2Nrczk5MDgudHh0IixoZWFkZXI9VCkNCmBgYA0KDQojIyMjIChhKSBDb21wdXRlIHRoZSBzYW1wbGUgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBza2V3bmVzcywgZXhjZXNzIGt1cnRvc2lzLCBtaW5pbXVtLCBhbmQgbWF4aW11bSBvZiBlYWNoIHNpbXBsZSByZXR1cm4gc2VyaWVzLiAoSGludDogdXNlIHRoZSBSIGNvbW1hbmQgYmFzaWNTdGF0cyBvZiBmQmFzaWNzKSANCmBgYHtyfQ0KYmFzaWNTdGF0cyhkYTFbLDI6NF0pDQpgYGANCg0KIyMjIyAoYikgVHJhbnNmb3JtIHRoZSBzaW1wbGUgcmV0dXJucyB0byBsb2cgcmV0dXJucy4gQ29tcHV0ZSB0aGUgc2FtcGxlIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiwgc2tld25lc3MsIGV4Y2VzcyBrdXJ0b3NpcywgbWluaW11bSwgYW5kIG1heGltdW0gb2YgZWFjaCBsb2cgcmV0dXJuIHNlcmllcy4NCmBgYHtyfQ0KZGEyPWxvZyhkYTFbLDI6NF0rMSkNCmJhc2ljU3RhdHMoZGEyKQ0KYGBgDQoNCiMjIyMgKGMpIFRlc3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBtZWFuIG9mIHRoZSBsb2cgcmV0dXJucyBvZiBBWFAgaXMgemVyby4gKEhpbnQ6IHVzZSB0aGUgUiBjb21tYW5kIHQudGVzdCkNCmBgYHtyfQ0KdC50ZXN0KGRhMiRheHApDQpgYGANCg0KU2luY2UgcC12YWx1ZSA+IDUlLCB3ZSBjYW4gbm90IHJlamVjdCBIMC4gVGh1cyB0aGUgdHJ1ZSBtZWFuIGlzIGVxdWFsIHRvIHplcm8uDQoNCiMjIyMgKGQpIE9idGFpbiB0aGUgaGlzdG9ncmFtICh3aXRoIG5jbGFzcz00MCkgYW5kIHNhbXBsZSBkZW5zaXR5IHBsb3Qgb2YgdGhlIGRhaWx5IGxvZyByZXR1cm5zIG9mIEFYUCBzdG9jay4NCmBgYHtyfQ0KaGlzdChkYTIkYXhwLG5jbGFzcz00MCkNCnBsb3QoZGVuc2l0eShkYTIkYXhwKSkNCmBgYA0KDQojIyMjIChlKSBUZXN0IGlmIGxvZyByZXR1cm4gb2YgQVhQIGZvbGxvd3Mgbm9ybWFsIGRpc3RyaWJ1dGlvbiBieSB1c2luZyBhdCBsZWFzdCB0d28gbWV0aG9kcy4gKE5lZWQgdG8gZ2l2ZSBleHBsYW5hdGlvbikNCg0KTWV0aG9kIDE6IEphcnF1ZS1CZXJhIHRlc3QNCmBgYHtyfQ0Kbm9ybWFsVGVzdChkYTIkYXhwLG1ldGhvZD0iamIiKQ0KYGBgDQpTaW5jZSBwIHZhbHVlIDwgNSUsIHdlIHNob3VsZCByZWplY3QgSDAuIFRodXMgdGhlIGxvZyByZXR1cm4gb2YgQVhQIGRvZXMgbm90IGZvbGxvdyBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQpNZXRob2QgMjogVGVzdCBmb3Igc3ltbWV0cnkNCmBgYHtyfQ0KUzE9c2tld25lc3MoZGEyJGF4cCkvc3FydCg2LzI1MTUpDQpwcmludChTMSkNCmBgYA0KDQpTaW5jZSB8UzF8ID4gWl97MS01JS8yfSA9IDEuOTYsIHdlIHNob3VsZCByZWplY3QgSDAuIFRodXMgdGhlIGxvZyByZXR1cm4gb2YgQVhQIGRvZXMgbm90IGZvbGxvdyBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyMgMi4gQW5zd2VyIHRoZSBzYW1lIHF1ZXN0aW9ucyBhcyBQcm9ibGVtIDEgYnV0IHVzaW5nIG1vbnRobHkgcmV0dXJucyBmb3IgR2VuZXJhbCBNb3RvcnMgKEdNKSwgQ1JTUCB2YWx1ZS13ZWlnaHRlZCBpbmRleCAoVlcpLCBDUlNQIGVxdWFsLXdlaWdodGVkIGluZGV4IChFVykgYW5kIFMmUCBjb21wb3NpdGUgaW5kZXggZnJvbSBKYW51YXJ5IDE5NzUgdG8gRGVjZW1iZXIgMjAwOC4gVGhlIHJldHVybnMgb2YgdGhlIGluZGV4ZXMgaW5jbHVkZSBkaXZpZGVuZCBkaXN0cmlidXRpb25zLiBEYXRhIGZpbGUgaXMgbS1nbTNkeDc1MDgudHh0IChkYXRlLCBnbSwgdncsIGV3LCBzcCkuDQoNCiMjIyMgKGEpIENvbXB1dGUgdGhlIHNhbXBsZSBtZWFuLCBzdGFuZGFyZCBkZXZpYXRpb24sIHNrZXduZXNzLCBleGNlc3Mga3VydG9zaXMsIG1pbmltdW0sIGFuZCBtYXhpbXVtIG9mIGVhY2ggc2ltcGxlIHJldHVybiBzZXJpZXMuIA0KYGBge3J9DQpkYTM8LWZyZWFkKCJtLWdtM2R4NzUwOC50eHQiLGhlYWRlcj1UKQ0KYmFzaWNTdGF0cyhkYTNbLDI6NV0pDQpgYGANCiMjIyMgKGIpIFRyYW5zZm9ybSB0aGUgc2ltcGxlIHJldHVybnMgdG8gbG9nIHJldHVybnMuIENvbXB1dGUgdGhlIHNhbXBsZSBtZWFuLCBzdGFuZGFyZCBkZXZpYXRpb24sIHNrZXduZXNzLCBleGNlc3Mga3VydG9zaXMsIG1pbmltdW0sIGFuZCBtYXhpbXVtIG9mIGVhY2ggbG9nIHJldHVybiBzZXJpZXMuDQoNCmBgYHtyfQ0KZGE0PWxvZyhkYTNbLDI6NV0rMSkNCmJhc2ljU3RhdHMoZGE0KQ0KYGBgDQoNCiMjIyMgKGMpIFRlc3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBtZWFuIG9mIHRoZSBsb2cgcmV0dXJucyBvZiBHTSBpcyB6ZXJvLg0KYGBge3J9DQp0LnRlc3QoZGE0JGdtKQ0KYGBgDQpTaW5jZSBwLXZhbHVlID4gNSUsIHdlIGNhbiBub3QgcmVqZWN0IEgwLiBUaHVzIHRoZSB0cnVlIG1lYW4gaXMgZXF1YWwgdG8gemVyby4NCg0KIyMjIyAoZCkgT2J0YWluIHRoZSBoaXN0b2dyYW0gKHdpdGggbmNsYXNzPTQwKSBhbmQgc2FtcGxlIGRlbnNpdHkgcGxvdCBvZiB0aGUgZGFpbHkgbG9nIHJldHVybnMgb2YgR00gc3RvY2suDQpgYGB7cn0NCmhpc3QoZGE0JGdtLG5jbGFzcz00MCkNCnBsb3QoZGVuc2l0eShkYTQkZ20pKQ0KYGBgDQoNCg0KIyMjIyAoZSkgVGVzdCBpZiBsb2cgcmV0dXJuIG9mIEdNIGZvbGxvd3Mgbm9ybWFsIGRpc3RyaWJ1dGlvbiBieSB1c2luZyBhdCBsZWFzdCB0d28gbWV0aG9kcy4gKE5lZWQgdG8gZ2l2ZSBleHBsYW5hdGlvbikNCg0KTWV0aG9kIDE6IEphcnF1ZS1CZXJhIHRlc3QNCmBgYHtyfQ0Kbm9ybWFsVGVzdChkYTQkZ20sbWV0aG9kPSJqYiIpDQpgYGANClNpbmNlIHAgdmFsdWUgaXMgbGVzcyB0aGFuIDUlLCB3ZSBzaG91bGQgcmVqZWN0IEgwLiBUaHVzIHRoZSBsb2cgcmV0dXJuIG9mIEdNIGRvZXMgbm90IGZvbGxvdyBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQpNZXRob2QgMjogVGVzdCBmb3IgdGFpbCB0aGlja25lc3MNCmBgYHtyfQ0KSzE9KGt1cnRvc2lzKGRhNCRnbSktMykvc3FydCgyNC80MDgpDQpwcmludChLMSkNCmBgYA0KU2luY2UgSyA+IFpfezEtNSUvMn0gPSAxLjk2LCB3ZSBzaG91bGQgcmVqZWN0IEgwLiBUaHVzIHRoZSBsb2cgcmV0dXJuIG9mIEdNIGRvZXMgbm90IGZvbGxvdyBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQoNCiMjIyAzLiBDb25zaWRlciB0aGUgbW9udGhseSBzdG9jayByZXR1cm5zIG9mIHZhbHVlLXdlaWdodGVkIGluZGV4IChWVykgZnJvbSBKYW51YXJ5IDE5NzUgdG8gRGVjZW1iZXIgMjAwOCBpbiBQcm9ibGVtIDIuIFBlcmZvcm0gdGhlIHRlc3RzIGFuZCBkcmF3IGNvbmNsdXNpb25zIHVzaW5nIHRoZSA1JSBzaWduaWZpY2FuY2UgbGV2ZWwuDQoNCiMjIyMgKGEpIFRlc3QgSDA6IM68ID0gMCB2ZXJzdXMgSGEgOiDOvCDiiaAgMCx3aGVyZSDOvCBkZW5vdGVzIHRoZSBtZWFuIHJldHVybi4NCmBgYHtyfQ0KdC50ZXN0KGRhMyR2dykNCmBgYA0KU2luY2UgcC12YWx1ZSA8IDUlLCB3ZSBzaG91bGQgcmVqZWN0IEgwLiBUaHVzIHRoZSBtZWFuIG9mIHZhbHVlLXdlaWdodGVkIGluZGV4IGlzIG5vdCB6ZXJvLg0KDQojIyMjIChiKSBUZXN0IEgwOiBtMyA9IDAgdmVyc3VzIEhhIDogbTMg4omgIDAsIHdoZXJlIG0zIGRlbm90ZXMgdGhlIHNrZXduZXNzLg0KYGBge3J9DQpTMj1za2V3bmVzcyhkYTMkdncpL3NxcnQoNi80MDgpDQpwcmludChTMikNCmBgYA0KU2luY2UgfFMyfCA+IFpfezEtNSUvMn09MS45Niwgd2Ugc2hvdWxkIHJlamVjdCBIMC4gVGh1cyB0aGUgcmV0dXJuIG9mIHZhbHVlLXdlaWdodGVkIGluZGV4IGRvZXMgbm90IGZvbGxvdyBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyMjIChjKSBUZXN0IEgwOiBLID0gMyB2ZXJzdXMgSGEgOiBLIOKJoCAzLCB3aGVyZSBLIGRlbm90ZXMgdGhlIGt1cnRvc2lzLg0KYGBge3J9DQpLMj0oa3VydG9zaXMoZGEzJHZ3KS0zKS9zcXJ0KDI0LzQwOCkNCnByaW50KEsyKQ0KYGBgDQpTaW5jZSBLMiA+IFpfezEtNSUvMn0gPSAxLjk2LCB3ZSBzaG91bGQgcmVqZWN0IEgwLiBUaHVzIHRoZSByZXR1cm4gb2YgdmFsdWUtd2VpZ2h0ZWQgaW5kZXggZG9lcyBub3QgZm9sbG93IG5vcm1hbCBkaXN0cmlidXRpb24uDQoNCiMjIyA0LiBDb25zaWRlciB0aGUgZGFpbHkgbG9nIHJldHVybnMgb2YgQVhQIHN0b2NrIGZyb20gSmFudWFyeSAxOTk5IHRvIERlY2VtYmVyIDIwMDggYXMgaW4gUHJvYmxlbSAxLiBQZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGVzdHM6DQoNCiMjIyMgKGEpIFRlc3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBza2V3bmVzcyBtZWFzdXJlIG9mIHRoZSByZXR1cm5zIGlzIHplcm87DQpgYGB7cn0NClMzPXNrZXduZXNzKGRhMiRheHApL3NxcnQoNi8yNTE1KQ0KcHJpbnQoUzMpDQpgYGANClNpbmNlIHxTM3wgPiBaX3sxLTUlLzJ9PTEuOTYsIHdlIHNob3VsZCByZWplY3QgSDAuIFRodXMgdGhlIHNrZXduZXNzIG1lYXN1cmUgb2YgdGhlIHJldHVybnMgaXMgbm90IHplcm8uDQoNCg0KDQojIyMjIChiKSBUZXN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGUgZXhjZXNzIGt1cnRvc2lzIG9mIHRoZSByZXR1cm5zIGlzIHplcm8uDQpgYGB7cn0NCkszPShrdXJ0b3NpcyhkYTIkYXhwKS0zKS9zcXJ0KDI0LzI1MTUpDQpwcmludChLMykNCmBgYA0KU2luY2UgSzMgPiBaX3sxLTUlLzJ9PTEuOTYsIHdlIHNob3VsZCByZWplY3QgSDAuIFRodXMgdGhlIGV4Y2VzcyBrdXJ0b3NpcyBvZiB0aGUgcmV0dXJucyBpcyBub3QgemVyby4NCg0KIyMjIDUuIERhaWx5IGZvcmVpZ24gZXhjaGFuZ2UgcmF0ZXMgKHNwb3QgcmF0ZXMpIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBGZWRlcmFsIFJlc2VydmUgQmFuayBpbiBTdCBMb3VpcyAoRlJFRCkuIFRoZSBkYXRhIGFyZSB0aGUgbm9vbiBidXlpbmcgcmF0ZXMgaW4gTmV3IFlvcmsgQ2l0eSBjZXJ0aWZpZWQgYnkgdGhlIEZlZGVyYWwgUmVzZXJ2ZSBCYW5rIG9mIE5ldyBZb3JrLiBDb25zaWRlciB0aGUgZXhjaGFuZ2UgcmF0ZXMgYmV0d2VlbiB0aGUgVS5TLiBkb2xsYXIgYW5kIHRoZSBFdXJvIGZyb20gSmFudWFyeSA0LCAxOTk5IHRvIE1hcmNoIDgsIDIwMTMuIFNlZSB0aGUgZmlsZSBkLWV4dXNldS50eHQuDQoNCmBgYHtyfQ0KZGE1PC1mcmVhZCgiZC1leHVzZXUudHh0IixoZWFkZXI9VCkNCmBgYA0KDQojIyMjIChhKSBDb21wdXRlIHRoZSBkYWlseSBsb2cgcmV0dXJuIG9mIHRoZSBleGNoYW5nZSByYXRlLg0KYGBge3J9DQpkYTY9ZGlmZihsb2coZGE1JFZBTFVFKSkNCmBgYA0KDQojIyMjIChiKSBDb21wdXRlIHRoZSBzYW1wbGUgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBza2V3bmVzcywgZXhjZXNzIGt1cnRvc2lzLCBtaW5pbXVtLCBhbmQgbWF4aW11bSBvZiB0aGUgbG9nIHJldHVybnMgb2YgdGhlIGV4Y2hhbmdlIHJhdGUuDQpgYGB7cn0NCmJhc2ljU3RhdHMoZGE2KQ0KYGBgDQoNCiMjIyMgKGMpIE9idGFpbiBhIGRlbnNpdHkgcGxvdCBvZiB0aGUgZGFpbHkgbG9uZyByZXR1cm5zIG9mIERvbGxhci1FdXJvIGV4Y2hhbmdlIHJhdGUuDQpgYGB7cn0NCnBsb3QoZGVuc2l0eShkYTYpKQ0KYGBgDQoNCiMjIyMgKGQpIFRlc3QgSDA6IM68ID0gMCB2ZXJzdXMgSGEgOiDOvCDiiaAgMCwgd2hlcmUgzrwgZGVub3RlcyB0aGUgbWVhbiBvZiB0aGUgZGFpbHkgbG9nIHJldHVybiBvZiBEb2xsYXItRXVybyBleGNoYW5nZSByYXRlLg0KYGBge3J9DQp0LnRlc3QoZGE2KQ0KYGBgDQpTaW5jZSBwLXZhbHVlID4gNSUsIHdlIGNhbiBub3QgcmVqZWN0IEgwLiBUaHVzIHRoZSB0cnVlIG1lYW4gaXMgZXF1YWwgdG8gemVyby4NCg0KIyMjIDYuIENvbnNpZGVyIFNQNTAwIGFuZCBJQk0gZGF0YSAoaW4gZmlsZSDigJhTUC5jc3bigJkgYW5kIOKAmElCTS5jc3bigJkgcmVzcGVjdGl2ZWx5KToNCmBgYHtyfQ0KZGE3PC1mcmVhZCgiU1AuY3N2IixoZWFkZXI9VCkNCmRhODwtZnJlYWQoIklCTS5jc3YiLGhlYWRlcj1UKQ0KYGBgDQoNCiMjIyMgKGEpIEZpbmQgdGhlIGxvZyByZXR1cm4gb2YgU1AgYW5kIElCTSBieSB1c2luZyDigJhBZGp1c3RlZCBQcmljZeKAmQ0KYGBge3J9DQpkYTk9ZGlmZihsb2coZGE3JFNQLkFkanVzdGVkKSkNCmRhMTA9ZGlmZihsb2coZGE4JElCTS5BZGp1c3RlZCkpDQpgYGANCg0KIyMjIyAoYikgTWVyZ2UgdGhlIGFib3ZlIHR3byByZXR1cm4gc2VyaWVzIGludG8gYSBuZXcgZGF0YXNldCAoaGludDogdXNpbmcg4oCYZGF0YS5mcmFtZeKAmSkgYW5kIHBsb3QgdGhlbSAoeSBpcyBJQk0sIHggaXMgU1ApDQpgYGB7cn0NCmRhMTE9ZGF0YS5mcmFtZSh4PWRhOSx5PWRhMTApDQpwbG90KGRhMTEpDQpgYGANCg0KIyMjIyAoYykgRmluZCB0aGUgYmVzdCBsaW5lYXIgbW9kZWwgYnkgdXNpbmcgQUlDIGFzIGNyaXRlcmlvbiAobmVlZCB0byBzaG93IGFsbCB5b3VyIG1vZGVscykNCg0KTW9kZWwgMTogU2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIHdpdGggaW50ZXJjZXB0DQpgYGB7cn0NCm0xIDwtIGxtKHkgfiB4LCBkYTExKQ0Kc3VtbWFyeShtMSkNCkFJQyhtMSkNCmBgYA0KTW9kZWwgMjogU2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIHdpdGhvdXQgaW50ZXJjZXB0DQpgYGB7cn0NCm0yIDwtIGxtKHkgfiAtMSArIHgsIGRhMTEpDQpzdW1tYXJ5KG0yKQ0KQUlDKG0yKQ0KYGBgDQoNCmBgYHtyfQ0KaWR4IDwtIGMoMTpsZW5ndGgoZGE5KSlbZGE5IDw9IDBdDQpuc3AgPC0gcmVwKDAsbGVuZ3RoKGRhOSkpIA0KbnNwW2lkeF0gPSBkYTlbaWR4XQ0KYzEgPC0gcmVwKDAsbGVuZ3RoKGRhOSkpDQpjMVtpZHhdID0gMQ0KZGExMiA8LSBkYXRhLmZyYW1lKHggPSBkYTksIHkgPSBkYTEwLCBjMSwgbnNwKSANCmhlYWQoZGExMikNCmBgYA0KTW9kZWwgMzogV2l0aCBkaWZmZXJlbnQgaW50ZXJjZXB0cyAoYWxwaGEpIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgU1AgbG9nIHJldHVybnMNCmBgYHtyfQ0KbTMgPC0gbG0oeSB+IGMxICsgeCwgZGExMikNCnN1bW1hcnkobTMpDQpBSUMobTMpDQpgYGANCg0KTW9kZWwgNDogV2l0aCBkaWZmZXJlbnQgY29lZmZpY2llbnRzIChiZXRhKSBmb3IgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFNQIGxvZyByZXR1cm5zDQpgYGB7cn0NCm00IDwtIGxtKHkgfiBuc3AgKyB4LCBkYTEyKQ0Kc3VtbWFyeShtNCkNCkFJQyhtNCkNCmBgYA0KTW9kZWwgNTogV2l0aCBkaWZmZXJlbnQgaW50ZXJjZXB0cyAoYWxwaGEpIGFuZCBjb2VmZiAoYmV0YSkgZm9yIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBTUCBsb2cgcmV0dXJucw0KDQpgYGB7cn0NCm01IDwtIGxtKHkgfiBjMSArIG5zcCArIHgsIGRhMTIpDQpzdW1tYXJ5KG01KQ0KQUlDKG01KQ0KYGBgDQoNClNpbmNlIEFJQyBvZiBtb2RlbCAyIGlzIHRoZSBzbWFsbGVzdCwgdGhlIGJlc3QgbGluZWFyIG1vZGVsIGlzIHkgPSAwLjIzMTV4Lg==