4.6.1 The Stock Market Data

library(ISLR)
names(Smarket)
[1] "Year"      "Lag1"      "Lag2"      "Lag3"      "Lag4"      "Lag5"      "Volume"   
[8] "Today"     "Direction"
summary(Smarket)
      Year           Lag1                Lag2                Lag3                Lag4          
 Min.   :2001   Min.   :-4.922000   Min.   :-4.922000   Min.   :-4.922000   Min.   :-4.922000  
 1st Qu.:2002   1st Qu.:-0.639500   1st Qu.:-0.639500   1st Qu.:-0.640000   1st Qu.:-0.640000  
 Median :2003   Median : 0.039000   Median : 0.039000   Median : 0.038500   Median : 0.038500  
 Mean   :2003   Mean   : 0.003834   Mean   : 0.003919   Mean   : 0.001716   Mean   : 0.001636  
 3rd Qu.:2004   3rd Qu.: 0.596750   3rd Qu.: 0.596750   3rd Qu.: 0.596750   3rd Qu.: 0.596750  
 Max.   :2005   Max.   : 5.733000   Max.   : 5.733000   Max.   : 5.733000   Max.   : 5.733000  
      Lag5              Volume           Today           Direction 
 Min.   :-4.92200   Min.   :0.3561   Min.   :-4.922000   Down:602  
 1st Qu.:-0.64000   1st Qu.:1.2574   1st Qu.:-0.639500   Up  :648  
 Median : 0.03850   Median :1.4229   Median : 0.038500             
 Mean   : 0.00561   Mean   :1.4783   Mean   : 0.003138             
 3rd Qu.: 0.59700   3rd Qu.:1.6417   3rd Qu.: 0.596750             
 Max.   : 5.73300   Max.   :3.1525   Max.   : 5.733000             
pairs(Smarket)

cor(Smarket[,-9])
             Year         Lag1         Lag2         Lag3         Lag4         Lag5      Volume
Year   1.00000000  0.029699649  0.030596422  0.033194581  0.035688718  0.029787995  0.53900647
Lag1   0.02969965  1.000000000 -0.026294328 -0.010803402 -0.002985911 -0.005674606  0.04090991
Lag2   0.03059642 -0.026294328  1.000000000 -0.025896670 -0.010853533 -0.003557949 -0.04338321
Lag3   0.03319458 -0.010803402 -0.025896670  1.000000000 -0.024051036 -0.018808338 -0.04182369
Lag4   0.03568872 -0.002985911 -0.010853533 -0.024051036  1.000000000 -0.027083641 -0.04841425
Lag5   0.02978799 -0.005674606 -0.003557949 -0.018808338 -0.027083641  1.000000000 -0.02200231
Volume 0.53900647  0.040909908 -0.043383215 -0.041823686 -0.048414246 -0.022002315  1.00000000
Today  0.03009523 -0.026155045 -0.010250033 -0.002447647 -0.006899527 -0.034860083  0.01459182
              Today
Year    0.030095229
Lag1   -0.026155045
Lag2   -0.010250033
Lag3   -0.002447647
Lag4   -0.006899527
Lag5   -0.034860083
Volume  0.014591823
Today   1.000000000
attach (Smarket)
plot(Volume)

4.6.2 Logistic Regression

glm.fit=glm(Direction∼Lag1+Lag2+Lag3+Lag4+Lag5+Volume,
data=Smarket ,family =binomial)
summary (glm.fit)

Call:
glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + 
    Volume, family = binomial, data = Smarket)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.446  -1.203   1.065   1.145   1.326  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.126000   0.240736  -0.523    0.601
Lag1        -0.073074   0.050167  -1.457    0.145
Lag2        -0.042301   0.050086  -0.845    0.398
Lag3         0.011085   0.049939   0.222    0.824
Lag4         0.009359   0.049974   0.187    0.851
Lag5         0.010313   0.049511   0.208    0.835
Volume       0.135441   0.158360   0.855    0.392

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1731.2  on 1249  degrees of freedom
Residual deviance: 1727.6  on 1243  degrees of freedom
AIC: 1741.6

Number of Fisher Scoring iterations: 3
coef(glm.fit)
 (Intercept)         Lag1         Lag2         Lag3         Lag4         Lag5       Volume 
-0.126000257 -0.073073746 -0.042301344  0.011085108  0.009358938  0.010313068  0.135440659 
summary (glm.fit )$coef
                Estimate Std. Error    z value  Pr(>|z|)
(Intercept) -0.126000257 0.24073574 -0.5233966 0.6006983
Lag1        -0.073073746 0.05016739 -1.4565986 0.1452272
Lag2        -0.042301344 0.05008605 -0.8445733 0.3983491
Lag3         0.011085108 0.04993854  0.2219750 0.8243333
Lag4         0.009358938 0.04997413  0.1872757 0.8514445
Lag5         0.010313068 0.04951146  0.2082966 0.8349974
Volume       0.135440659 0.15835970  0.8552723 0.3924004
summary (glm.fit )$coef [,4]
(Intercept)        Lag1        Lag2        Lag3        Lag4        Lag5      Volume 
  0.6006983   0.1452272   0.3983491   0.8243333   0.8514445   0.8349974   0.3924004 
glm.probs =predict (glm.fit ,type ="response")
glm.probs [1:10]
        1         2         3         4         5         6         7         8         9 
0.5070841 0.4814679 0.4811388 0.5152224 0.5107812 0.5069565 0.4926509 0.5092292 0.5176135 
       10 
0.4888378 
contrasts (Direction)
     Up
Down  0
Up    1
glm.pred=rep ("Down ",1250)
glm.pred[glm.probs >.5]="Up"
table(glm.pred,Direction)
        Direction
glm.pred Down  Up
   Down   145 141
   Up     457 507
(507+145)/1250
[1] 0.5216
mean(glm.pred==Direction)
[1] 0.4056
train =(Year <2005)
Smarket.2005= Smarket [! train ,]
dim(Smarket.2005)
[1] 252   9
Direction.2005= Direction [! train]
glm.fit=glm(Direction∼Lag1+Lag2+Lag3+Lag4+Lag5+Volume ,
data=Smarket ,family =binomial ,subset =train )
glm.probs =predict(glm.fit,Smarket.2005,type="response")
glm.pred=rep ("Down",252)
glm.pred[glm.probs >.5]=" Up"
table(glm.pred ,Direction.2005)
        Direction.2005
glm.pred Down Up
     Up    34 44
    Down   77 97
mean(glm.pred== Direction.2005)
[1] 0.3055556
mean(glm.pred!= Direction.2005)
[1] 0.6944444
glm.fit=glm(Direction∼Lag1+Lag2 ,data=Smarket ,family =binomial ,
subset =train)
glm.probs =predict(glm.fit ,Smarket.2005 , type="response")
glm.pred=rep ("Down" ,252)
glm.pred[glm.probs >.5]=" Up"
table(glm.pred ,Direction.2005)
        Direction.2005
glm.pred Down  Up
     Up    76 106
    Down   35  35
mean(glm.pred== Direction.2005)
[1] 0.1388889
106/(106+76)
[1] 0.5824176
predict(glm.fit ,newdata =data.frame(Lag1=c(1.2 ,1.5) ,
Lag2=c(1.1 , -0.8) ),type ="response")
        1         2 
0.4791462 0.4960939 

4.6.3 Linear Discriminant Analysis

library(MASS)
lda.fit=lda(Direction∼Lag1+Lag2 ,data=Smarket ,subset =train)
lda.fit
Call:
lda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)

Prior probabilities of groups:
    Down       Up 
0.491984 0.508016 

Group means:
            Lag1        Lag2
Down  0.04279022  0.03389409
Up   -0.03954635 -0.03132544

Coefficients of linear discriminants:
            LD1
Lag1 -0.6420190
Lag2 -0.5135293
plot(lda.fit)

lda.pred=predict (lda.fit , Smarket.2005)
names(lda.pred)
[1] "class"     "posterior" "x"        
lda.class =lda.pred$class
table(lda.class ,Direction.2005)
         Direction.2005
lda.class Down  Up
     Down   35  35
     Up     76 106
mean(lda.class == Direction.2005)
[1] 0.5595238
sum(lda.pred$posterior [ ,1] >=.5)
[1] 70
sum(lda.pred$posterior [ ,1] >=.5)
[1] 70
sum(lda.pred$posterior [,1]<.5)
[1] 182
lda.pred$posterior [1:20 ,1]
      999      1000      1001      1002      1003      1004      1005      1006      1007 
0.4901792 0.4792185 0.4668185 0.4740011 0.4927877 0.4938562 0.4951016 0.4872861 0.4907013 
     1008      1009      1010      1011      1012      1013      1014      1015      1016 
0.4844026 0.4906963 0.5119988 0.4895152 0.4706761 0.4744593 0.4799583 0.4935775 0.5030894 
     1017      1018 
0.4978806 0.4886331 
lda.class [1:20]
 [1] Up   Up   Up   Up   Up   Up   Up   Up   Up   Up   Up   Down Up   Up   Up   Up   Up   Down
[19] Up   Up  
Levels: Down Up
sum(lda.pred$posterior [,1]>.9)
[1] 0
Warning in gzfile(file, "wb") :
  cannot open compressed file 'C:/Users/Oscar Padilla/Desktop/Galileo/Postgrado en Investigacion de Operaciones/TRIMESTRE VI/Fiabilidad/Hoja de Trabajo # 2/Hoja de Trabajo # 2/.Rproj.user/shared/notebooks/405A4D93-Laboratorio # 2/1/F28451AF9CD0AFA5/c5pw5n0olype6_t/e3c713a2fe73422d990f59acaa9d3359.snapshot', probable reason 'No such file or directory'
Error in gzfile(file, "wb") : cannot open the connection

4.6.4 Quadratic Discriminant Analysis

qda.fit=qda(Direction∼Lag1+Lag2 ,data=Smarket ,subset =train)
qda.fit
Call:
qda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)

Prior probabilities of groups:
    Down       Up 
0.491984 0.508016 

Group means:
            Lag1        Lag2
Down  0.04279022  0.03389409
Up   -0.03954635 -0.03132544
qda.class =predict (qda.fit ,Smarket.2005) $class
table(qda.class ,Direction.2005)
         Direction.2005
qda.class Down  Up
     Down   30  20
     Up     81 121
mean(qda.class == Direction.2005)
[1] 0.5992063

4.6.5 K-Nearest Neighbors

library (class)
train.X=cbind(Lag1 ,Lag2)[train ,]
test.X=cbind (Lag1 ,Lag2)[!train ,]
train.Direction =Direction [train]
set.seed (1)
knn.pred=knn (train.X,test.X,train.Direction ,k=1)
table(knn.pred ,Direction.2005)
        Direction.2005
knn.pred Down Up
    Down   43 58
    Up     68 83
(83+43) /252
[1] 0.5
knn.pred=knn (train.X,test.X,train.Direction ,k=3)
table(knn.pred ,Direction.2005)
        Direction.2005
knn.pred Down Up
    Down   48 54
    Up     63 87
mean(knn.pred== Direction.2005)
[1] 0.5357143

4.6.6 An Application to Caravan Insurance Data

dim(Caravan)
[1] 5822   86
attach (Caravan )
The following objects are masked from Caravan (pos = 3):

    AAANHANG, ABESAUT, ABRAND, ABROM, ABYSTAND, AFIETS, AGEZONG, AINBOED, ALEVEN,
    AMOTSCO, APERSAUT, APERSONG, APLEZIER, ATRACTOR, AVRAAUT, AWABEDR, AWALAND,
    AWAOREG, AWAPART, AWERKT, AZEILPL, MAANTHUI, MAUT0, MAUT1, MAUT2, MBERARBG,
    MBERARBO, MBERBOER, MBERHOOG, MBERMIDD, MBERZELF, MFALLEEN, MFGEKIND, MFWEKIND,
    MGEMLEEF, MGEMOMV, MGODGE, MGODOV, MGODPR, MGODRK, MHHUUR, MHKOOP, MINK123M,
    MINK3045, MINK4575, MINK7512, MINKGEM, MINKM30, MKOOPKLA, MOPLHOOG, MOPLLAAG,
    MOPLMIDD, MOSHOOFD, MOSTYPE, MRELGE, MRELOV, MRELSA, MSKA, MSKB1, MSKB2, MSKC,
    MSKD, MZFONDS, MZPART, PAANHANG, PBESAUT, PBRAND, PBROM, PBYSTAND, PFIETS,
    PGEZONG, PINBOED, PLEVEN, PMOTSCO, PPERSAUT, PPERSONG, PPLEZIER, PTRACTOR,
    Purchase, PVRAAUT, PWABEDR, PWALAND, PWAOREG, PWAPART, PWERKT, PZEILPL

The following objects are masked from Caravan (pos = 4):

    AAANHANG, ABESAUT, ABRAND, ABROM, ABYSTAND, AFIETS, AGEZONG, AINBOED, ALEVEN,
    AMOTSCO, APERSAUT, APERSONG, APLEZIER, ATRACTOR, AVRAAUT, AWABEDR, AWALAND,
    AWAOREG, AWAPART, AWERKT, AZEILPL, MAANTHUI, MAUT0, MAUT1, MAUT2, MBERARBG,
    MBERARBO, MBERBOER, MBERHOOG, MBERMIDD, MBERZELF, MFALLEEN, MFGEKIND, MFWEKIND,
    MGEMLEEF, MGEMOMV, MGODGE, MGODOV, MGODPR, MGODRK, MHHUUR, MHKOOP, MINK123M,
    MINK3045, MINK4575, MINK7512, MINKGEM, MINKM30, MKOOPKLA, MOPLHOOG, MOPLLAAG,
    MOPLMIDD, MOSHOOFD, MOSTYPE, MRELGE, MRELOV, MRELSA, MSKA, MSKB1, MSKB2, MSKC,
    MSKD, MZFONDS, MZPART, PAANHANG, PBESAUT, PBRAND, PBROM, PBYSTAND, PFIETS,
    PGEZONG, PINBOED, PLEVEN, PMOTSCO, PPERSAUT, PPERSONG, PPLEZIER, PTRACTOR,
    Purchase, PVRAAUT, PWABEDR, PWALAND, PWAOREG, PWAPART, PWERKT, PZEILPL
summary (Purchase )
  No  Yes 
5474  348 
348/5822
[1] 0.05977327
standardized.X=scale(Caravan [,-86])
var(Caravan [,1])
[1] 165.0378
var(Caravan [,2])
[1] 0.1647078
var( standardized.X[,1])
[1] 1
var( standardized.X[,2])
[1] 1
test =1:1000
train.X=standardized.X[-test ,]
test.X=standardized.X[test ,]
train.Y=Purchase [-test]
test.Y=Purchase [test]
set.seed (1)
knn.pred=knn (train.X,test.X,train.Y,k=1)
mean(test.Y!= knn.pred)
[1] 0.118
mean(test.Y!="No")
[1] 0.059
table(knn.pred ,test.Y)
        test.Y
knn.pred  No Yes
     No  873  50
     Yes  68   9
9/(68+9)
[1] 0.1168831
knn.pred=knn(train.X,test.X,train.Y,k=3)
table(knn.pred ,test.Y)
        test.Y
knn.pred  No Yes
     No  920  54
     Yes  21   5
5/26
[1] 0.1923077
knn.pred=knn(train.X,test.X,train.Y,k=5)
table(knn.pred,test.Y)
        test.Y
knn.pred  No Yes
     No  930  55
     Yes  11   4
4/15
[1] 0.2666667
glm.fit=glm(Purchase∼.,data=Caravan ,family =binomial ,
subset =-test)
glm.fit: fitted probabilities numerically 0 or 1 occurred
glm.probs =predict (glm.fit ,Caravan [test ,], type="response")
glm.pred=rep ("No" ,1000)
glm.pred[glm.probs >.5]="Yes"
table(glm.pred ,test.Y)
        test.Y
glm.pred  No Yes
     No  934  59
     Yes   7   0
glm.pred=rep ("No" ,1000)
glm.pred[glm.probs >.25]="Yes"
table(glm.pred ,test.Y)
        test.Y
glm.pred  No Yes
     No  919  48
     Yes  22  11
11/(22+11)
[1] 0.3333333
LS0tDQp0aXRsZTogIkxhYm9yYXRpbyAjIDIgLSBPc2NhciBQYWRpbGxhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIDQuNi4xIFRoZSBTdG9jayBNYXJrZXQgRGF0YQ0KYGBge3J9DQpsaWJyYXJ5KElTTFIpDQpuYW1lcyhTbWFya2V0KQ0Kc3VtbWFyeShTbWFya2V0KQ0KcGFpcnMoU21hcmtldCkNCmNvcihTbWFya2V0WywtOV0pDQphdHRhY2ggKFNtYXJrZXQpDQpwbG90KFZvbHVtZSkNCmBgYA0KDQojIyMgNC42LjIgTG9naXN0aWMgUmVncmVzc2lvbg0KDQpgYGB7cn0NCmdsbS5maXQ9Z2xtKERpcmVjdGlvbuKIvExhZzErTGFnMitMYWczK0xhZzQrTGFnNStWb2x1bWUsDQpkYXRhPVNtYXJrZXQgLGZhbWlseSA9Ymlub21pYWwpDQpzdW1tYXJ5IChnbG0uZml0KQ0KY29lZihnbG0uZml0KQ0Kc3VtbWFyeSAoZ2xtLmZpdCApJGNvZWYNCnN1bW1hcnkgKGdsbS5maXQgKSRjb2VmIFssNF0NCmdsbS5wcm9icyA9cHJlZGljdCAoZ2xtLmZpdCAsdHlwZSA9InJlc3BvbnNlIikNCmdsbS5wcm9icyBbMToxMF0NCmNvbnRyYXN0cyAoRGlyZWN0aW9uKQ0KZ2xtLnByZWQ9cmVwICgiRG93biAiLDEyNTApDQpnbG0ucHJlZFtnbG0ucHJvYnMgPi41XT0iVXAiDQp0YWJsZShnbG0ucHJlZCxEaXJlY3Rpb24pDQooNTA3KzE0NSkvMTI1MA0KbWVhbihnbG0ucHJlZD09RGlyZWN0aW9uKQ0KdHJhaW4gPShZZWFyIDwyMDA1KQ0KU21hcmtldC4yMDA1PSBTbWFya2V0IFshIHRyYWluICxdDQpkaW0oU21hcmtldC4yMDA1KQ0KRGlyZWN0aW9uLjIwMDU9IERpcmVjdGlvbiBbISB0cmFpbl0NCmdsbS5maXQ9Z2xtKERpcmVjdGlvbuKIvExhZzErTGFnMitMYWczK0xhZzQrTGFnNStWb2x1bWUgLA0KZGF0YT1TbWFya2V0ICxmYW1pbHkgPWJpbm9taWFsICxzdWJzZXQgPXRyYWluICkNCmdsbS5wcm9icyA9cHJlZGljdChnbG0uZml0LFNtYXJrZXQuMjAwNSx0eXBlPSJyZXNwb25zZSIpDQpnbG0ucHJlZD1yZXAgKCJEb3duIiwyNTIpDQpnbG0ucHJlZFtnbG0ucHJvYnMgPi41XT0iIFVwIg0KdGFibGUoZ2xtLnByZWQgLERpcmVjdGlvbi4yMDA1KQ0KbWVhbihnbG0ucHJlZD09IERpcmVjdGlvbi4yMDA1KQ0KbWVhbihnbG0ucHJlZCE9IERpcmVjdGlvbi4yMDA1KQ0KZ2xtLmZpdD1nbG0oRGlyZWN0aW9u4oi8TGFnMStMYWcyICxkYXRhPVNtYXJrZXQgLGZhbWlseSA9Ymlub21pYWwgLA0Kc3Vic2V0ID10cmFpbikNCmdsbS5wcm9icyA9cHJlZGljdChnbG0uZml0ICxTbWFya2V0LjIwMDUgLCB0eXBlPSJyZXNwb25zZSIpDQpnbG0ucHJlZD1yZXAgKCJEb3duIiAsMjUyKQ0KZ2xtLnByZWRbZ2xtLnByb2JzID4uNV09IiBVcCINCnRhYmxlKGdsbS5wcmVkICxEaXJlY3Rpb24uMjAwNSkNCm1lYW4oZ2xtLnByZWQ9PSBEaXJlY3Rpb24uMjAwNSkNCjEwNi8oMTA2Kzc2KQ0KcHJlZGljdChnbG0uZml0ICxuZXdkYXRhID1kYXRhLmZyYW1lKExhZzE9YygxLjIgLDEuNSkgLA0KTGFnMj1jKDEuMSAsIC0wLjgpICksdHlwZSA9InJlc3BvbnNlIikNCmBgYA0KDQojIyMgNC42LjMgTGluZWFyIERpc2NyaW1pbmFudCBBbmFseXNpcw0KDQpgYGB7cn0NCmxpYnJhcnkoTUFTUykNCmxkYS5maXQ9bGRhKERpcmVjdGlvbuKIvExhZzErTGFnMiAsZGF0YT1TbWFya2V0ICxzdWJzZXQgPXRyYWluKQ0KbGRhLmZpdA0KcGxvdChsZGEuZml0KQ0KbGRhLnByZWQ9cHJlZGljdCAobGRhLmZpdCAsIFNtYXJrZXQuMjAwNSkNCm5hbWVzKGxkYS5wcmVkKQ0KbGRhLmNsYXNzID1sZGEucHJlZCRjbGFzcw0KdGFibGUobGRhLmNsYXNzICxEaXJlY3Rpb24uMjAwNSkNCm1lYW4obGRhLmNsYXNzID09IERpcmVjdGlvbi4yMDA1KQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbICwxXSA+PS41KQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbICwxXSA+PS41KQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbLDFdPC41KQ0KbGRhLnByZWQkcG9zdGVyaW9yIFsxOjIwICwxXQ0KbGRhLmNsYXNzIFsxOjIwXQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbLDFdPi45KQ0KDQpgYGANCg0KIyMjIDQuNi40IFF1YWRyYXRpYyBEaXNjcmltaW5hbnQgQW5hbHlzaXMNCg0KYGBge3J9DQpxZGEuZml0PXFkYShEaXJlY3Rpb27iiLxMYWcxK0xhZzIgLGRhdGE9U21hcmtldCAsc3Vic2V0ID10cmFpbikNCnFkYS5maXQNCnFkYS5jbGFzcyA9cHJlZGljdCAocWRhLmZpdCAsU21hcmtldC4yMDA1KSAkY2xhc3MNCnRhYmxlKHFkYS5jbGFzcyAsRGlyZWN0aW9uLjIwMDUpDQptZWFuKHFkYS5jbGFzcyA9PSBEaXJlY3Rpb24uMjAwNSkNCmBgYA0KDQojIyMgNC42LjUgSy1OZWFyZXN0IE5laWdoYm9ycw0KDQpgYGB7cn0NCmxpYnJhcnkgKGNsYXNzKQ0KdHJhaW4uWD1jYmluZChMYWcxICxMYWcyKVt0cmFpbiAsXQ0KdGVzdC5YPWNiaW5kIChMYWcxICxMYWcyKVshdHJhaW4gLF0NCnRyYWluLkRpcmVjdGlvbiA9RGlyZWN0aW9uIFt0cmFpbl0NCnNldC5zZWVkICgxKQ0Ka25uLnByZWQ9a25uICh0cmFpbi5YLHRlc3QuWCx0cmFpbi5EaXJlY3Rpb24gLGs9MSkNCnRhYmxlKGtubi5wcmVkICxEaXJlY3Rpb24uMjAwNSkNCig4Mys0MykgLzI1Mg0Ka25uLnByZWQ9a25uICh0cmFpbi5YLHRlc3QuWCx0cmFpbi5EaXJlY3Rpb24gLGs9MykNCnRhYmxlKGtubi5wcmVkICxEaXJlY3Rpb24uMjAwNSkNCm1lYW4oa25uLnByZWQ9PSBEaXJlY3Rpb24uMjAwNSkNCmBgYA0KDQojIyMgNC42LjYgQW4gQXBwbGljYXRpb24gdG8gQ2FyYXZhbiBJbnN1cmFuY2UgRGF0YQ0KDQpgYGB7cn0NCmRpbShDYXJhdmFuKQ0KYXR0YWNoIChDYXJhdmFuICkNCnN1bW1hcnkgKFB1cmNoYXNlICkNCjM0OC81ODIyDQpzdGFuZGFyZGl6ZWQuWD1zY2FsZShDYXJhdmFuIFssLTg2XSkNCnZhcihDYXJhdmFuIFssMV0pDQp2YXIoQ2FyYXZhbiBbLDJdKQ0KdmFyKCBzdGFuZGFyZGl6ZWQuWFssMV0pDQp2YXIoIHN0YW5kYXJkaXplZC5YWywyXSkNCnRlc3QgPTE6MTAwMA0KdHJhaW4uWD1zdGFuZGFyZGl6ZWQuWFstdGVzdCAsXQ0KdGVzdC5YPXN0YW5kYXJkaXplZC5YW3Rlc3QgLF0NCnRyYWluLlk9UHVyY2hhc2UgWy10ZXN0XQ0KdGVzdC5ZPVB1cmNoYXNlIFt0ZXN0XQ0Kc2V0LnNlZWQgKDEpDQprbm4ucHJlZD1rbm4gKHRyYWluLlgsdGVzdC5YLHRyYWluLlksaz0xKQ0KbWVhbih0ZXN0LlkhPSBrbm4ucHJlZCkNCm1lYW4odGVzdC5ZIT0iTm8iKQ0KdGFibGUoa25uLnByZWQgLHRlc3QuWSkNCjkvKDY4KzkpDQprbm4ucHJlZD1rbm4odHJhaW4uWCx0ZXN0LlgsdHJhaW4uWSxrPTMpDQp0YWJsZShrbm4ucHJlZCAsdGVzdC5ZKQ0KNS8yNg0Ka25uLnByZWQ9a25uKHRyYWluLlgsdGVzdC5YLHRyYWluLlksaz01KQ0KdGFibGUoa25uLnByZWQsdGVzdC5ZKQ0KNC8xNQ0KZ2xtLmZpdD1nbG0oUHVyY2hhc2XiiLwuLGRhdGE9Q2FyYXZhbiAsZmFtaWx5ID1iaW5vbWlhbCAsDQpzdWJzZXQgPS10ZXN0KQ0KZ2xtLnByb2JzID1wcmVkaWN0IChnbG0uZml0ICxDYXJhdmFuIFt0ZXN0ICxdLCB0eXBlPSJyZXNwb25zZSIpDQpnbG0ucHJlZD1yZXAgKCJObyIgLDEwMDApDQpnbG0ucHJlZFtnbG0ucHJvYnMgPi41XT0iWWVzIg0KdGFibGUoZ2xtLnByZWQgLHRlc3QuWSkNCmdsbS5wcmVkPXJlcCAoIk5vIiAsMTAwMCkNCmdsbS5wcmVkW2dsbS5wcm9icyA+LjI1XT0iWWVzIg0KdGFibGUoZ2xtLnByZWQgLHRlc3QuWSkNCjExLygyMisxMSkNCg0KYGBgDQoNCg==