Titanic Survival: Zelig 4 vs. Zelig 5
The model simulates and extracts quantities of interest by estimating effects of age, fare, sex and class on survival probablity using the Titanic data from the radiant.data package. The class slides used a Zelig 4 syntax, the following will show the the syntax of Zelig 4 followed by Zelig 5.
Loading Packages
library(Zelig)
library(texreg)
library(car)
library(mvtnorm)
Loading Data
library(radiant.data)
data(titanic)
Creating Variable - Survival
titanic <- titanic %>%
mutate(surv = as.integer(survived)) %>%
mutate(survival = sjmisc::rec(surv, rec = "2=0; 1=1")) %>%
select(pclass, survived, survival, everything())
Model - Surviving the titanic with Zelig 4 syntax
z_tit <- zelig(survival ~ age + sex*pclass + fare, model = "logit", data = titanic, cite = F)
summary(z_tit)
Model:
Call:
z5$zelig(formula = survival ~ age + sex * pclass + fare, data = titanic)
Deviance Residuals:
Min 1Q Median 3Q Max
-3.0634 -0.6641 -0.4943 0.4336 2.4941
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.8978215 0.6131092 7.988 0.00000000000000137
age -0.0387245 0.0068044 -5.691 0.00000001262563680
sexmale -3.8996177 0.5015659 -7.775 0.00000000000000755
pclass2nd -1.5923247 0.6024844 -2.643 0.00822
pclass3rd -4.1382715 0.5601819 -7.387 0.00000000000014976
fare -0.0009058 0.0020509 -0.442 0.65874
sexmale:pclass2nd -0.0600076 0.6372949 -0.094 0.92498
sexmale:pclass3rd 2.5019110 0.5479901 4.566 0.00000498035051247
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1409.99 on 1042 degrees of freedom
Residual deviance: 931.45 on 1035 degrees of freedom
AIC: 947.45
Number of Fisher Scoring iterations: 5
Next step: Use 'setx' method
Model - Zelig5
z_tit5 <- zlogit$new()
z_tit5$zelig(survival ~ age + sex*pclass + fare, data = titanic)
summary(z_tit5)
Model:
Call:
z_tit5$zelig(formula = survival ~ age + sex * pclass + fare,
data = titanic)
Deviance Residuals:
Min 1Q Median 3Q Max
-3.0634 -0.6641 -0.4943 0.4336 2.4941
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.8978215 0.6131092 7.988 0.00000000000000137
age -0.0387245 0.0068044 -5.691 0.00000001262563680
sexmale -3.8996177 0.5015659 -7.775 0.00000000000000755
pclass2nd -1.5923247 0.6024844 -2.643 0.00822
pclass3rd -4.1382715 0.5601819 -7.387 0.00000000000014976
fare -0.0009058 0.0020509 -0.442 0.65874
sexmale:pclass2nd -0.0600076 0.6372949 -0.094 0.92498
sexmale:pclass3rd 2.5019110 0.5479901 4.566 0.00000498035051247
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1409.99 on 1042 degrees of freedom
Residual deviance: 931.45 on 1035 degrees of freedom
AIC: 947.45
Number of Fisher Scoring iterations: 5
Next step: Use 'setx' method
Age effect
a.range = min(titanic$age):max(titanic$age)
x <- setx(z_tit5, age = a.range)
s <- sim(z_tit5, x = x)
ci.plot(s)

Age effect in Zelig5
z5.age <-zlogit$new()
z5.age$zelig(survival ~ age + sex*pclass + fare, data = titanic)
summary(z5.age)
Model:
Call:
z5.age$zelig(formula = survival ~ age + sex * pclass + fare,
data = titanic)
Deviance Residuals:
Min 1Q Median 3Q Max
-3.0634 -0.6641 -0.4943 0.4336 2.4941
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.8978215 0.6131092 7.988 0.00000000000000137
age -0.0387245 0.0068044 -5.691 0.00000001262563680
sexmale -3.8996177 0.5015659 -7.775 0.00000000000000755
pclass2nd -1.5923247 0.6024844 -2.643 0.00822
pclass3rd -4.1382715 0.5601819 -7.387 0.00000000000014976
fare -0.0009058 0.0020509 -0.442 0.65874
sexmale:pclass2nd -0.0600076 0.6372949 -0.094 0.92498
sexmale:pclass3rd 2.5019110 0.5479901 4.566 0.00000498035051247
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1409.99 on 1042 degrees of freedom
Residual deviance: 931.45 on 1035 degrees of freedom
AIC: 947.45
Number of Fisher Scoring iterations: 5
Next step: Use 'setx' method
z5.age$setrange(age = min(titanic$age):max(titanic$age))
z5.age$sim()
ci.plot(z5.age)

Fare effect
f.range = min(titanic$fare):max(titanic$fare)
x <- setx(z_tit, fare = f.range)
s <- sim(z_tit, x = x)
ci.plot(s)

Fare effect in Zelig5
z5.fare <-zlogit$new()
z5.fare$zelig(survival ~ age + sex*pclass + fare, data = titanic)
summary(z5.fare)
Model:
Call:
z5.fare$zelig(formula = survival ~ age + sex * pclass + fare,
data = titanic)
Deviance Residuals:
Min 1Q Median 3Q Max
-3.0634 -0.6641 -0.4943 0.4336 2.4941
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.8978215 0.6131092 7.988 0.00000000000000137
age -0.0387245 0.0068044 -5.691 0.00000001262563680
sexmale -3.8996177 0.5015659 -7.775 0.00000000000000755
pclass2nd -1.5923247 0.6024844 -2.643 0.00822
pclass3rd -4.1382715 0.5601819 -7.387 0.00000000000014976
fare -0.0009058 0.0020509 -0.442 0.65874
sexmale:pclass2nd -0.0600076 0.6372949 -0.094 0.92498
sexmale:pclass3rd 2.5019110 0.5479901 4.566 0.00000498035051247
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1409.99 on 1042 degrees of freedom
Residual deviance: 931.45 on 1035 degrees of freedom
AIC: 947.45
Number of Fisher Scoring iterations: 5
Next step: Use 'setx' method
z5.fare$setrange(fare = min(titanic$fare):max(titanic$fare))
z5.fare$sim()
ci.plot(z5.fare)

Sex effect
x <- setx(z_tit, sex = "male")
x1 <- setx(z_tit, sex = "female")
s <- sim(z_tit, x = x, x1 = x1)
summary(s)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.1390279 0.01975385 0.1379809 0.1054139 0.1787193
pv
0 1
[1,] 0.865 0.135
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.396558 0.04308903 0.3949084 0.3112113 0.4778312
pv
0 1
[1,] 0.578 0.422
fd
mean sd 50% 2.5% 97.5%
[1,] 0.2575301 0.04390234 0.2597158 0.1735156 0.3418706
Sex effect in Zelig5
z_tit5$setx(sex = "male")
z_tit5$setx1(sex = "female")
z_tit5$sim()
summary(z_tit5)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.141008 0.01892692 0.1401055 0.1065529 0.1825971
pv
0 1
[1,] 0.847 0.153
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.3948343 0.04429635 0.3940561 0.3077843 0.4820824
pv
0 1
[1,] 0.605 0.395
fd
mean sd 50% 2.5% 97.5%
[1,] 0.2538263 0.0448389 0.2531833 0.1695305 0.3436792
First difference
fd <- s$get_qi(xvalue="x1", qi="fd")
summary(fd)
V1
Min. :0.1329
1st Qu.:0.2235
Median :0.2597
Mean :0.2575
3rd Qu.:0.2885
Max. :0.3983
First difference in Zelig5
fd <- z_tit5$get_qi(xvalue="x1", qi="fd")
summary(fd)
V1
Min. :0.1131
1st Qu.:0.2246
Median :0.2532
Mean :0.2538
3rd Qu.:0.2811
Max. :0.4029
Plot- Zelig 5
plot(z_tit5)

How to test the class variations in sex difference using Zelig?
First Class
c1x <- setx(z_tit, sex = "male", pclass = "1st")
c1x1 <- setx(z_tit, sex = "female", pclass = "1st")
c1s <- sim(z_tit, x = c1x, x1 = c1x1)
First Class in Zelig 5
z_firstclass <- zlogit$new()
z_firstclass$zelig(survival ~ age + sex*pclass + fare, data = titanic)
z_firstclass$setx(sex = "male", pclass = "1st" )
z_firstclass$setx1(sex = "female", pclass = "1st")
z_firstclass$sim()
summary(z_firstclass)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.4533515 0.05137299 0.4537543 0.3558283 0.5509001
pv
0 1
[1,] 0.561 0.439
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.9730933 0.01344537 0.9760756 0.9402655 0.9909094
pv
0 1
[1,] 0.03 0.97
fd
mean sd 50% 2.5% 97.5%
[1,] 0.5197418 0.0509812 0.5214277 0.4188457 0.6179676
Second Class
c2x <- setx(z_tit, sex = "male", pclass = "2nd")
c2x1 <- setx(z_tit, sex = "female", pclass = "2nd")
c2s <- sim(z_tit, x = c2x, x1 = c2x1)
Second Class in Zelig 5
z_secondclass <- zlogit$new()
z_secondclass$zelig(survival ~ age + sex*pclass + fare, data = titanic)
z_secondclass$setx(sex = "male", pclass = "2nd")
z_secondclass$setx1(sex = "female", pclass = "2nd")
z_secondclass$sim()
summary(z_secondclass)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.1383051 0.0279243 0.1360758 0.08944321 0.197538
pv
0 1
[1,] 0.87 0.13
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.8902234 0.03228658 0.8948994 0.8166275 0.9403089
pv
0 1
[1,] 0.087 0.913
fd
mean sd 50% 2.5% 97.5%
[1,] 0.7519182 0.04177891 0.754372 0.6662137 0.8210498
Third Class
c3x <- setx(z_tit, sex = "male", pclass = "3rd")
c3x1 <- setx(z_tit, sex = "female", pclass = "3rd")
c3s <- sim(z_tit, x = c3x, x1 = c3x1)
Third Class in Zelig
z_thirdclass <- zlogit$new()
z_thirdclass$zelig(survival ~ age + sex*pclass + fare, data = titanic)
z_thirdclass$setx(sex = "male", pclass = "3rd")
z_thirdclass$setx1(sex = "female", pclass = "3rd")
z_thirdclass$sim()
summary(z_thirdclass)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.1399685 0.01972803 0.1392533 0.1029011 0.1858248
pv
0 1
[1,] 0.859 0.141
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.3956632 0.04307623 0.3945303 0.3145296 0.483128
pv
0 1
[1,] 0.592 0.408
fd
mean sd 50% 2.5% 97.5%
[1,] 0.2556948 0.04355542 0.2564176 0.1668021 0.3404756
plot(z_firstclass)

plot(z_secondclass)

plot(z_thirdclass)

Putting them together - in Zelig 5 syntax
d1 <- z_firstclass$get_qi(xvalue="x1", qi="fd")
d2 <- z_secondclass$get_qi(xvalue="x1", qi="fd")
d3 <- z_thirdclass$get_qi(xvalue="x1", qi="fd")
dfd <- as.data.frame(cbind(d1, d2, d3))
head(dfd)
library(tidyr)
tidd <- dfd %>%
gather(class, simv, 1:3)
head(tidd)
library(dplyr)
tidd %>%
group_by(class) %>%
summarise(mean = mean(simv), sd = sd(simv))
library(ggplot2)
ggplot(tidd, aes(simv)) + geom_histogram() + facet_grid(~class)

LS0tCnRpdGxlOiAiSG9tZXdvcmsgNi4xIC0gUHJvZmVzc29yIFNvbmcncyBaZWxpZyA0IE1vZGVsIGluIFplbGlnIDUgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCiMjVGl0YW5pYyBTdXJ2aXZhbDogWmVsaWcgNCB2cy4gWmVsaWcgNQojIyMjI1RoZSBtb2RlbCBzaW11bGF0ZXMgYW5kIGV4dHJhY3RzIHF1YW50aXRpZXMgb2YgaW50ZXJlc3QgYnkgZXN0aW1hdGluZyBlZmZlY3RzIG9mIGFnZSwgZmFyZSwgc2V4IGFuZCBjbGFzcyBvbiBzdXJ2aXZhbCBwcm9iYWJsaXR5IHVzaW5nIHRoZSBUaXRhbmljIGRhdGEgZnJvbSB0aGUgcmFkaWFudC5kYXRhIHBhY2thZ2UuIFRoZSBjbGFzcyBzbGlkZXMgdXNlZCBhIFplbGlnIDQgc3ludGF4LCB0aGUgZm9sbG93aW5nIHdpbGwgc2hvdyB0aGUgdGhlIHN5bnRheCBvZiBaZWxpZyA0IGZvbGxvd2VkIGJ5IFplbGlnIDUuCgojIyNMb2FkaW5nIFBhY2thZ2VzCmBgYHtyfQpsaWJyYXJ5KFplbGlnKQpsaWJyYXJ5KHRleHJlZykKbGlicmFyeShjYXIpCmxpYnJhcnkobXZ0bm9ybSkKYGBgCiMjI0xvYWRpbmcgRGF0YQpgYGB7cn0KbGlicmFyeShyYWRpYW50LmRhdGEpCmRhdGEodGl0YW5pYykKYGBgCgojIyNDcmVhdGluZyBWYXJpYWJsZSAtIFN1cnZpdmFsCmBgYHtyfQp0aXRhbmljIDwtIHRpdGFuaWMgJT4lCiAgbXV0YXRlKHN1cnYgPSBhcy5pbnRlZ2VyKHN1cnZpdmVkKSkgJT4lIAogIG11dGF0ZShzdXJ2aXZhbCA9IHNqbWlzYzo6cmVjKHN1cnYsIHJlYyA9ICIyPTA7IDE9MSIpKSAlPiUgCiAgc2VsZWN0KHBjbGFzcywgc3Vydml2ZWQsIHN1cnZpdmFsLCBldmVyeXRoaW5nKCkpCmBgYAoKIyMjTW9kZWwgLSBTdXJ2aXZpbmcgdGhlIHRpdGFuaWMgd2l0aCBaZWxpZyA0IHN5bnRheApgYGB7cn0Kel90aXQgPC0gemVsaWcoc3Vydml2YWwgfiBhZ2UgKyBzZXgqcGNsYXNzICsgZmFyZSwgbW9kZWwgPSAibG9naXQiLCBkYXRhID0gdGl0YW5pYywgY2l0ZSA9IEYpCnN1bW1hcnkoel90aXQpCmBgYAoKIyMjTW9kZWwgLSBaZWxpZzUgCmBgYHtyfQp6X3RpdDUgPC0gemxvZ2l0JG5ldygpCnpfdGl0NSR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArIHNleCpwY2xhc3MgKyBmYXJlLCBkYXRhID0gdGl0YW5pYykKc3VtbWFyeSh6X3RpdDUpCmBgYAoKIyMjQWdlIGVmZmVjdApgYGB7cn0KYS5yYW5nZSA9IG1pbih0aXRhbmljJGFnZSk6bWF4KHRpdGFuaWMkYWdlKQp4IDwtIHNldHgoel90aXQ1LCBhZ2UgPSBhLnJhbmdlKQpzIDwtIHNpbSh6X3RpdDUsIHggPSB4KQpjaS5wbG90KHMpCmBgYAoKIyMjQWdlIGVmZmVjdCBpbiBaZWxpZzUKYGBge3J9Cno1LmFnZSA8LXpsb2dpdCRuZXcoKQp6NS5hZ2UkemVsaWcoc3Vydml2YWwgfiBhZ2UgKyBzZXgqcGNsYXNzICsgZmFyZSwgZGF0YSA9IHRpdGFuaWMpCnN1bW1hcnkoejUuYWdlKQp6NS5hZ2Ukc2V0cmFuZ2UoYWdlID0gbWluKHRpdGFuaWMkYWdlKTptYXgodGl0YW5pYyRhZ2UpKQp6NS5hZ2Ukc2ltKCkKY2kucGxvdCh6NS5hZ2UpCmBgYAojIyNGYXJlIGVmZmVjdApgYGB7cn0KZi5yYW5nZSA9IG1pbih0aXRhbmljJGZhcmUpOm1heCh0aXRhbmljJGZhcmUpCnggPC0gc2V0eCh6X3RpdCwgZmFyZSA9IGYucmFuZ2UpCnMgPC0gc2ltKHpfdGl0LCB4ID0geCkKY2kucGxvdChzKQpgYGAKIyMjRmFyZSBlZmZlY3QgaW4gWmVsaWc1CmBgYHtyfQp6NS5mYXJlIDwtemxvZ2l0JG5ldygpCno1LmZhcmUkemVsaWcoc3Vydml2YWwgfiBhZ2UgKyBzZXgqcGNsYXNzICsgZmFyZSwgZGF0YSA9IHRpdGFuaWMpCnN1bW1hcnkoejUuZmFyZSkKejUuZmFyZSRzZXRyYW5nZShmYXJlID0gbWluKHRpdGFuaWMkZmFyZSk6bWF4KHRpdGFuaWMkZmFyZSkpCno1LmZhcmUkc2ltKCkKY2kucGxvdCh6NS5mYXJlKQpgYGAKIyMjU2V4IGVmZmVjdApgYGB7cn0KeCA8LSBzZXR4KHpfdGl0LCBzZXggPSAibWFsZSIpCngxIDwtIHNldHgoel90aXQsIHNleCA9ICJmZW1hbGUiKQpzIDwtIHNpbSh6X3RpdCwgeCA9IHgsIHgxID0geDEpCnN1bW1hcnkocykKYGBgCgojIyNTZXggZWZmZWN0IGluIFplbGlnNQpgYGB7cn0Kel90aXQ1JHNldHgoc2V4ID0gIm1hbGUiKQp6X3RpdDUkc2V0eDEoc2V4ID0gImZlbWFsZSIpCnpfdGl0NSRzaW0oKQpzdW1tYXJ5KHpfdGl0NSkKYGBgCiMjI0ZpcnN0IGRpZmZlcmVuY2UKYGBge3J9CmZkIDwtIHMkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpzdW1tYXJ5KGZkKQpgYGAKIyMjRmlyc3QgZGlmZmVyZW5jZSBpbiBaZWxpZzUKYGBge3J9CmZkIDwtIHpfdGl0NSRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCnN1bW1hcnkoZmQpCmBgYAoKIyMjUGxvdC0gWmVsaWcgNQpgYGB7cn0KcGxvdCh6X3RpdDUpCmBgYAoKIyMjSG93IHRvIHRlc3QgdGhlIGNsYXNzIHZhcmlhdGlvbnMgaW4gc2V4IGRpZmZlcmVuY2UgdXNpbmcgWmVsaWc/CiMjIyNGaXJzdCBDbGFzcwpgYGB7cn0KYzF4IDwtIHNldHgoel90aXQsIHNleCA9ICJtYWxlIiwgcGNsYXNzID0gIjFzdCIpCmMxeDEgPC0gc2V0eCh6X3RpdCwgc2V4ID0gImZlbWFsZSIsIHBjbGFzcyA9ICIxc3QiKQpjMXMgPC0gc2ltKHpfdGl0LCB4ID0gYzF4LCB4MSA9IGMxeDEpCmBgYAojIyNGaXJzdCBDbGFzcyBpbiBaZWxpZyA1CmBgYHtyfQp6X2ZpcnN0Y2xhc3MgPC0gemxvZ2l0JG5ldygpCnpfZmlyc3RjbGFzcyR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArIHNleCpwY2xhc3MgKyBmYXJlLCBkYXRhID0gdGl0YW5pYykKel9maXJzdGNsYXNzJHNldHgoc2V4ID0gIm1hbGUiLCBwY2xhc3MgPSAiMXN0IiApCnpfZmlyc3RjbGFzcyRzZXR4MShzZXggPSAiZmVtYWxlIiwgcGNsYXNzID0gIjFzdCIpCnpfZmlyc3RjbGFzcyRzaW0oKQpzdW1tYXJ5KHpfZmlyc3RjbGFzcykKYGBgCiMjIyNTZWNvbmQgQ2xhc3MKYGBge3J9CmMyeCA8LSBzZXR4KHpfdGl0LCBzZXggPSAibWFsZSIsIHBjbGFzcyA9ICIybmQiKQpjMngxIDwtIHNldHgoel90aXQsIHNleCA9ICJmZW1hbGUiLCBwY2xhc3MgPSAiMm5kIikKYzJzIDwtIHNpbSh6X3RpdCwgeCA9IGMyeCwgeDEgPSBjMngxKQpgYGAKCiMjI1NlY29uZCBDbGFzcyBpbiBaZWxpZyA1CmBgYHtyfQp6X3NlY29uZGNsYXNzIDwtIHpsb2dpdCRuZXcoKQp6X3NlY29uZGNsYXNzJHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcyArIGZhcmUsIGRhdGEgPSB0aXRhbmljKQp6X3NlY29uZGNsYXNzJHNldHgoc2V4ID0gIm1hbGUiLCBwY2xhc3MgPSAiMm5kIikKel9zZWNvbmRjbGFzcyRzZXR4MShzZXggPSAgImZlbWFsZSIsIHBjbGFzcyA9ICIybmQiKQp6X3NlY29uZGNsYXNzJHNpbSgpCnN1bW1hcnkoel9zZWNvbmRjbGFzcykKYGBgCiMjIyNUaGlyZCBDbGFzcwpgYGB7cn0KYzN4IDwtIHNldHgoel90aXQsIHNleCA9ICJtYWxlIiwgcGNsYXNzID0gIjNyZCIpCmMzeDEgPC0gc2V0eCh6X3RpdCwgc2V4ID0gImZlbWFsZSIsIHBjbGFzcyA9ICIzcmQiKQpjM3MgPC0gc2ltKHpfdGl0LCB4ID0gYzN4LCB4MSA9IGMzeDEpCmBgYAoKIyMjVGhpcmQgQ2xhc3MgaW4gWmVsaWcKYGBge3J9CnpfdGhpcmRjbGFzcyA8LSB6bG9naXQkbmV3KCkKel90aGlyZGNsYXNzJHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcyArIGZhcmUsIGRhdGEgPSB0aXRhbmljKQp6X3RoaXJkY2xhc3Mkc2V0eChzZXggPSAibWFsZSIsIHBjbGFzcyA9ICIzcmQiKQp6X3RoaXJkY2xhc3Mkc2V0eDEoc2V4ID0gICJmZW1hbGUiLCBwY2xhc3MgPSAiM3JkIikKel90aGlyZGNsYXNzJHNpbSgpCnN1bW1hcnkoel90aGlyZGNsYXNzKQpgYGAKCmBgYHtyfQpwbG90KHpfZmlyc3RjbGFzcykKcGxvdCh6X3NlY29uZGNsYXNzKQpwbG90KHpfdGhpcmRjbGFzcykKYGBgCiMjI1B1dHRpbmcgdGhlbSB0b2dldGhlciAtIGluIFplbGlnIDUgc3ludGF4CmBgYHtyfQpkMSA8LSB6X2ZpcnN0Y2xhc3MkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpkMiA8LSB6X3NlY29uZGNsYXNzJGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikKZDMgPC0gel90aGlyZGNsYXNzJGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikKCmRmZCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGQxLCBkMiwgZDMpKQpoZWFkKGRmZCkKYGBgCgoKYGBge3J9CmxpYnJhcnkodGlkeXIpCgp0aWRkIDwtIGRmZCAlPiUgCiAgZ2F0aGVyKGNsYXNzLCBzaW12LCAxOjMpCmhlYWQodGlkZCkKYGBgCgpgYGB7cn0KbGlicmFyeShkcGx5cikKdGlkZCAlPiUgCiAgZ3JvdXBfYnkoY2xhc3MpICU+JSAKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc2ltdiksIHNkID0gc2Qoc2ltdikpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgpnZ3Bsb3QodGlkZCwgYWVzKHNpbXYpKSArIGdlb21faGlzdG9ncmFtKCkgKyBmYWNldF9ncmlkKH5jbGFzcykKYGBgCgo=