Part 1: Exploring the Zelig Package (Zelig 4 vs. Zelig 5 Syntax)
Using the Titanic dataset from the radiant.data package, I re-implemented the regression analyses conducted in class (slides 5.2-5.18) using the Zelig 5 syntax.
Preparing the Data: Recoding and Selecting Variables
library(radiant.data)
data(titanic)
titanic=titanic %>%
mutate(surv = as.integer(survived)) %>%
mutate(survival = sjmisc::rec(surv, rec = "2=0; 1=1")) %>%
select(pclass, survived, survival, everything())
head(titanic)
Slide 5.2: Interaction Model
#Zelig 4:
#z_tit <- zelig(survival ~ age + sex*pclass + fare, model = "logit", data = titanic, cite = F)
#Zelig 5:
z5_tit <- zlogit$new()
z5_tit$zelig(survival ~ age + sex*pclass + fare, data = titanic)
summary(z5_tit)
Model:
Call:
z5_tit$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 1.37e-15
age -0.0387245 0.0068044 -5.691 1.26e-08
sexmale -3.8996177 0.5015659 -7.775 7.55e-15
pclass2nd -1.5923247 0.6024844 -2.643 0.00822
pclass3rd -4.1382715 0.5601819 -7.387 1.50e-13
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 4.98e-06
(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
Slides 5.3-5.4: Age Effect
library(Zelig)
#Zelig 4:
#a.range = min(titanic$age):max(titanic$age)
#x <- setx(z_tit, age = a.range)
#s <- sim(z_tit, x = x)
#ci.plot(s)
#Zelig 5:
a.range=min(titanic$age):max(titanic$age)
z5_tit$setrange(age=a.range)
z5_tit$sim()
z5_tit$graph()

Looking at the full age range, we find that infants have a higher expected value of survivial (median~.35) than people who are older, but uncertainty is higher for infants than for those who are older (we are more certain in low survival rate when older)
Slides 5.5-5.6: Fare Effect
#Zelig 4:
#f.range = min(titanic$fare):max(titanic$fare)
#x <- setx(z_tit, fare = f.range)
#s <- sim(z_tit, x = x)
#ci.plot(s)
#Zelig 5:
f.range = min(titanic$fare):max(titanic$fare)
z5_tit$setrange(fare=f.range)
z5_tit$sim()
z5_tit$graph()

Looking at the full fare range, we find that the expected value of surviving is almost constant as fare increases (with a very minor decrease in survival and a large increase in uncertainty as fare increases). This suggests that fare does not really influence survival chance (after controlling for class).
Slides 5.7-5.9: Sex Difference
#Zelig 4:
#x <- setx(z_tit, sex = "male")
#x1 <- setx(z_tit, sex = "female")
#s <- sim(z_tit, x = x, x1 = x1)
#fd <- s$get_qi(xvalue="x1", qi="fd")
#summary(fd)
#plot(s)
#Zelig 5:
z5_tit$setx(sex="male")
z5_tit$setx1(sex="female")
z5_tit$sim()
fd<-z5_tit$get_qi(xvalue="x1", qi="fd")
summary(fd)
V1
Min. :0.1364
1st Qu.:0.2291
Median :0.2556
Mean :0.2578
3rd Qu.:0.2859
Max. :0.3928
Looking at the simulated first difference between males and females in expected survival, we find that on average, females have a .26 higher chance of surviving than males (can be as low as .14 and as high as .39)
z5_tit$graph()

Slides 5.10-5.15: Class Variation in Sex Difference
#Zelig 4:
#c1x <- setx(z_tit, sex = "male", pclass = "1st")
#c1x1 <- setx(z_tit, sex = "female", pclass = "1st")
#c1s <- sim(z_tit, x = c1x, x1 = c1x1)
#Zelig 5:
z5.1 <- zlogit$new()
z5.1$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5.1$setx(sex="male", pclass="1st")
z5.1$setx1(sex="female", pclass="1st")
z5.1$sim()
z5.1$graph()

Slide 5.12:
For first class, the difference in expected value of survival between females and males is about .52, suggesting that first class females have a .52 higher chance of surviving than first class males.
#Zelig 4:
#c2x <- setx(z_tit, sex = "male", pclass = "2nd")
#c2x1 <- setx(z_tit, sex = "female", pclass = "2nd")
#c2s <- sim(z_tit, x = c2x, x1 = c2x1)
#Zelig 5:
z5.2 <- zlogit$new()
z5.2$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5.2$setx(sex="male", pclass="2nd")
z5.2$setx1(sex="female", pclass="2nd")
z5.2$sim()
z5.2$graph()

Slide 5.13:
For second class, the simulated first difference between male and female survival increases to about .75, suggesting that second class females have a .75 higher chance of survial than second class males.
#Zelig 4:
#c3x <- setx(z_tit, sex = "male", pclass = "3rd")
#c3x1 <- setx(z_tit, sex = "female", pclass = "3rd")
#c3s <- sim(z_tit, x = c3x, x1 = c3x1)
#Zelig 5:
z5.3 <- zlogit$new()
z5.3$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5.3$setx(sex="male", pclass="3rd")
z5.3$setx1(sex="female", pclass="3rd")
z5.3$sim()
z5.3$graph()

Slide 5.14:
For third class, the simulated first difference between female and male survival drops to about .26, suggesting that third class women have a .26 higher chance of survival than third class men. (As we move down the class ranks, women’s expected survival decreases.)
Slide 5.15: Putting Them in One Place
d1 <- z5.1$get_qi(xvalue="x1", qi="fd")
d2 <- z5.2$get_qi(xvalue="x1", qi="fd")
d3 <- z5.3$get_qi(xvalue="x1", qi="fd")
dfd <- as.data.frame(cbind(d1, d2, d3))
head(dfd)
Slide 5.17: Group by Class
library(dplyr)
tidd %>%
group_by(class) %>%
summarise(mean = mean(simv), sd = sd(simv))
Slide 5.18: Plotting
Looking at the expected first difference between female and male passengers across all 3 classes, we can see the first difference is highest in second class and lowest in third class. Male and female passengers have closer expected survival rates in third class.
library(ggplot2)
ggplot(tidd, aes(simv)) + geom_histogram() + facet_grid(~class)

Part 2: Exploring the Zelig Package Using My Own Dataset (Marvel Characters as Living or Deceased)
Using a FiveThirtyEight Comic Characters Dataset found on Kaggle, this week’s homework seeks to determine how variables such as alignment (good, bad, or neutral), gender (male or female), identity (public or secret), and number of appearances (as of 2014) explain the likelihood of whether a Marvel character would be alive in the comics or not. Since my dependent variable is dichotomous, I conducted a logit regression analysis.
Preparing the Data: Recoding and Selecting Variables
My dependent variable was recoded as binary (alive_binary), where 1=living and 0=deceased. My identity variable was also recoded so that “Public Identity”" included “No Dual Identity” and “Known to Authorities.” For my gender variable, “Agender” and “Genderfluid” characters were recoded as “Other.”
library(readr)
library(dplyr)
library(magrittr)
Marvel<-read_csv("/Users/jenniferganeles/Downloads/marvel-wikia-data.csv")
marvel_heroes<-
mutate (Marvel, alive_binary=
recode(ALIVE, "Living Characters"=1,"Deceased Characters"=0),
Gender=
recode(SEX, "Agender Characters"="Other", "Genderfluid Characters"="Other"),
Identity=
recode(ID, "No Dual Identity"="Public Identity", "Known to Authorities Identity"="Public Identity"),
alignment = factor(ALIGN),
gender = factor(Gender),
identity=factor(Identity))%>%
filter(!is.na(APPEARANCES),
!is.na(alignment))%>%
select(ALIVE, alive_binary, alignment, gender, identity, APPEARANCES)
head(marvel_heroes)
Running Three Regression Models and Determining the Best Model Fit
Both AIC and BIC agree that Model 2 is the best model, which contains all selected variables but without an interaction term.
M1<-zlogit$new()
M1$zelig(alive_binary~ identity+gender, data=marvel_heroes)
M2<-zlogit$new()
M2$zelig(alive_binary~ identity+gender+alignment+APPEARANCES, data=marvel_heroes)
M3<-zlogit$new()
M3$zelig(alive_binary~ identity+gender*APPEARANCES+alignment, data=marvel_heroes)
texreg::htmlreg(list(M1, M2, M3),doctype = FALSE)
Statistical models
|
|
Model 1
|
Model 2
|
Model 3
|
|
(Intercept)
|
1.38***
|
0.94***
|
0.94***
|
|
|
(0.05)
|
(0.07)
|
(0.07)
|
|
identitySecret Identity
|
-0.13**
|
-0.02
|
-0.02
|
|
|
(0.05)
|
(0.05)
|
(0.05)
|
|
genderMale Characters
|
-0.37***
|
-0.23***
|
-0.23***
|
|
|
(0.06)
|
(0.06)
|
(0.06)
|
|
genderOther
|
0.54
|
0.69
|
0.42
|
|
|
(0.54)
|
(0.54)
|
(0.65)
|
|
alignmentGood Characters
|
|
0.63***
|
0.63***
|
|
|
|
(0.05)
|
(0.05)
|
|
alignmentNeutral Characters
|
|
0.31***
|
0.31***
|
|
|
|
(0.07)
|
(0.07)
|
|
APPEARANCES
|
|
0.00**
|
0.00
|
|
|
|
(0.00)
|
(0.00)
|
|
genderMale Characters:APPEARANCES
|
|
|
-0.00
|
|
|
|
|
(0.00)
|
|
genderOther:APPEARANCES
|
|
|
0.03
|
|
|
|
|
(0.06)
|
|
AIC
|
11511.20
|
11354.41
|
11357.65
|
|
BIC
|
11540.06
|
11404.92
|
11422.58
|
|
Log Likelihood
|
-5751.60
|
-5670.21
|
-5669.82
|
|
Deviance
|
11503.20
|
11340.41
|
11339.65
|
|
Num. obs.
|
10047
|
10047
|
10047
|
|
p < 0.001, p < 0.01, p < 0.05
|
*The above table displays the regression results in terms of log odds, but I want to produce more understandable coefficients using simulation…
Bad vs. Good Characters:
Looking at the simulated first difference between bad and good characters, my analysis shows that on average, good characters have a .12 higher chance of being alive than bad characters (first difference can be as low as .09 and as high as .15).
M2$setx(alignment="Bad Characters")
M2$setx1(alignment="Good Characters")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
V1
Min. :0.08721
1st Qu.:0.11400
Median :0.12094
Mean :0.12105
3rd Qu.:0.12795
Max. :0.15065
M2$graph()

Bad vs. Neutral Characters:
Looking at the simulated first difference between bad and neutral characters, my analysis shows that on average, neutral characters have a .06 higher chance of being alive than bad characters (first difference can be as low as .02 and as high as .10).
M2$setx(alignment="Bad Characters")
M2$setx1(alignment="Neutral Characters")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
V1
Min. :0.02291
1st Qu.:0.05597
Median :0.06499
Mean :0.06473
3rd Qu.:0.07356
Max. :0.10435
M2$graph()

Male vs. Female Characters:
Looking at the first difference between male and female characters, my analysis shows that on average, female characters have a .05 higher chance of being alive than male characters (first difference can be as low as .01 and as high as .09).
M2$setx(gender="Male Characters")
M2$setx1(gender="Female Characters")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
V1
Min. :0.01015
1st Qu.:0.04152
Median :0.04910
Mean :0.04912
3rd Qu.:0.05680
Max. :0.08541
M2$graph()

Secret vs. Public Identity:
Here, the analysis shows that on average, characters with public identities have a .004 higher chance of being alive than characters with secret identities. However, this difference is not significant (as the AIC/BIC table showed above) and the first difference can be as high as .036 and as low as -.029 (meaning, characters with public identities can also have a lower percentage of being alive). Therefore, whether a character’s identity is secret or public does not seem to have much influence on their chances of being alive.
M2$setx(identity="Secret Identity")
M2$setx1(identity="Public Identity")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
V1
Min. :-0.028765
1st Qu.:-0.002651
Median : 0.004200
Mean : 0.004119
3rd Qu.: 0.011159
Max. : 0.035572
M2$graph()

Number of Appearances Effect:
Looking at a range between 0 and 1000 appearances, I found that the expected value of being alive increases as the number of appearances in the comic increases. This makes sense since characters would likely appear in the comics as living (rather than as deceased). However, the uncertainty of being alive also increases as number of appearances increase.
M2$setrange(APPEARANCES=0:1000)
M2$sim()
|================================================================|100% ~0 s remaining
M2$graph()

Conclusion:
After running a logistic regression using Zelig, I was able to determine the chances of a Marvel character being alive or not by exploring independent variables such as alignemnt, gender, identity, and appearance number. I found that characters who are good or neutral are more likely to be alive in the comics than those who are bad, and characters who are female are more likely to be alive than those who are male. Whether a character’s identity is secret or public does not have much influence on whether he/she is alive in the comics. Lastly, characters have a higher chance of being alive as they appear more often in the comics; however, as number of appearances increases, the uncertainty of being alive increases as well.
LS0tCnRpdGxlOiAiU29jIDcxMjogSG9tZXdvcmsgNiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoqSmVubmlmZXIgR2FuZWxlcyoKPGJyLz4qMy8yNC8xOSoKCiMjUGFydCAxOiBFeHBsb3JpbmcgdGhlIFplbGlnIFBhY2thZ2UgKFplbGlnIDQgdnMuIFplbGlnIDUgU3ludGF4KQpVc2luZyB0aGUgVGl0YW5pYyBkYXRhc2V0IGZyb20gdGhlIHJhZGlhbnQuZGF0YSBwYWNrYWdlLCBJIHJlLWltcGxlbWVudGVkIHRoZSByZWdyZXNzaW9uIGFuYWx5c2VzIGNvbmR1Y3RlZCBpbiBjbGFzcyAoc2xpZGVzIDUuMi01LjE4KSB1c2luZyB0aGUgWmVsaWcgNSBzeW50YXguCgojIyNQcmVwYXJpbmcgdGhlIERhdGE6IFJlY29kaW5nIGFuZCBTZWxlY3RpbmcgVmFyaWFibGVzCmBgYHtyfQpsaWJyYXJ5KHJhZGlhbnQuZGF0YSkKZGF0YSh0aXRhbmljKQp0aXRhbmljPXRpdGFuaWMgJT4lCiAgbXV0YXRlKHN1cnYgPSBhcy5pbnRlZ2VyKHN1cnZpdmVkKSkgJT4lIAogIG11dGF0ZShzdXJ2aXZhbCA9IHNqbWlzYzo6cmVjKHN1cnYsIHJlYyA9ICIyPTA7IDE9MSIpKSAlPiUgCiAgc2VsZWN0KHBjbGFzcywgc3Vydml2ZWQsIHN1cnZpdmFsLCBldmVyeXRoaW5nKCkpCmhlYWQodGl0YW5pYykKYGBgCgojIyNTbGlkZSA1LjI6IEludGVyYWN0aW9uIE1vZGVsCmBgYHtyfQojWmVsaWcgNDogCiN6X3RpdCA8LSB6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArIHNleCpwY2xhc3MgKyBmYXJlLCBtb2RlbCA9ICJsb2dpdCIsIGRhdGEgPSB0aXRhbmljLCBjaXRlID0gRikKI1plbGlnIDU6Cno1X3RpdCA8LSB6bG9naXQkbmV3KCkKejVfdGl0JHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcyArIGZhcmUsIGRhdGEgPSB0aXRhbmljKQpzdW1tYXJ5KHo1X3RpdCkKYGBgCgojIyMgU2xpZGVzIDUuMy01LjQ6IEFnZSBFZmZlY3QKCmBgYHtyfQpsaWJyYXJ5KFplbGlnKQoKI1plbGlnIDQ6IAojYS5yYW5nZSA9IG1pbih0aXRhbmljJGFnZSk6bWF4KHRpdGFuaWMkYWdlKQojeCA8LSBzZXR4KHpfdGl0LCBhZ2UgPSBhLnJhbmdlKQojcyA8LSBzaW0oel90aXQsIHggPSB4KQojY2kucGxvdChzKQoKI1plbGlnIDU6CmEucmFuZ2U9bWluKHRpdGFuaWMkYWdlKTptYXgodGl0YW5pYyRhZ2UpCno1X3RpdCRzZXRyYW5nZShhZ2U9YS5yYW5nZSkKejVfdGl0JHNpbSgpCno1X3RpdCRncmFwaCgpCgpgYGAKTG9va2luZyBhdCB0aGUgZnVsbCBhZ2UgcmFuZ2UsIHdlIGZpbmQgdGhhdCBpbmZhbnRzIGhhdmUgYSBoaWdoZXIgZXhwZWN0ZWQgdmFsdWUgb2Ygc3Vydml2aWFsIChtZWRpYW5+LjM1KSB0aGFuIHBlb3BsZSB3aG8gYXJlIG9sZGVyLCBidXQgdW5jZXJ0YWludHkgaXMgaGlnaGVyIGZvciBpbmZhbnRzIHRoYW4gZm9yIHRob3NlIHdobyBhcmUgb2xkZXIgKHdlIGFyZSBtb3JlIGNlcnRhaW4gaW4gbG93IHN1cnZpdmFsIHJhdGUgd2hlbiBvbGRlcikKCiMjI1NsaWRlcyA1LjUtNS42OiBGYXJlIEVmZmVjdAoKYGBge3J9CiNaZWxpZyA0OgojZi5yYW5nZSA9IG1pbih0aXRhbmljJGZhcmUpOm1heCh0aXRhbmljJGZhcmUpCiN4IDwtIHNldHgoel90aXQsIGZhcmUgPSBmLnJhbmdlKQojcyA8LSBzaW0oel90aXQsIHggPSB4KQojY2kucGxvdChzKQoKI1plbGlnIDU6CmYucmFuZ2UgPSBtaW4odGl0YW5pYyRmYXJlKTptYXgodGl0YW5pYyRmYXJlKQp6NV90aXQkc2V0cmFuZ2UoZmFyZT1mLnJhbmdlKQp6NV90aXQkc2ltKCkKejVfdGl0JGdyYXBoKCkKYGBgCkxvb2tpbmcgYXQgdGhlIGZ1bGwgZmFyZSByYW5nZSwgd2UgZmluZCB0aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBvZiBzdXJ2aXZpbmcgaXMgYWxtb3N0IGNvbnN0YW50IGFzIGZhcmUgaW5jcmVhc2VzICh3aXRoIGEgdmVyeSBtaW5vciBkZWNyZWFzZSBpbiBzdXJ2aXZhbCBhbmQgYSBsYXJnZSBpbmNyZWFzZSBpbiB1bmNlcnRhaW50eSBhcyBmYXJlIGluY3JlYXNlcykuIFRoaXMgc3VnZ2VzdHMgdGhhdCBmYXJlIGRvZXMgbm90IHJlYWxseSBpbmZsdWVuY2Ugc3Vydml2YWwgY2hhbmNlIChhZnRlciBjb250cm9sbGluZyBmb3IgY2xhc3MpLgoKIyMjU2xpZGVzIDUuNy01Ljk6IFNleCBEaWZmZXJlbmNlCgpgYGB7cn0KI1plbGlnIDQ6CiN4IDwtIHNldHgoel90aXQsIHNleCA9ICJtYWxlIikKI3gxIDwtIHNldHgoel90aXQsIHNleCA9ICJmZW1hbGUiKQojcyA8LSBzaW0oel90aXQsIHggPSB4LCB4MSA9IHgxKQojZmQgPC0gcyRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCiNzdW1tYXJ5KGZkKQojcGxvdChzKQoKI1plbGlnIDU6Cno1X3RpdCRzZXR4KHNleD0ibWFsZSIpCno1X3RpdCRzZXR4MShzZXg9ImZlbWFsZSIpCno1X3RpdCRzaW0oKQpmZDwtejVfdGl0JGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikKc3VtbWFyeShmZCkKYGBgCkxvb2tpbmcgYXQgdGhlIHNpbXVsYXRlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMgaW4gZXhwZWN0ZWQgc3Vydml2YWwsIHdlIGZpbmQgdGhhdCBvbiBhdmVyYWdlLCBmZW1hbGVzIGhhdmUgYSAuMjYgaGlnaGVyIGNoYW5jZSBvZiBzdXJ2aXZpbmcgdGhhbiBtYWxlcyAoY2FuIGJlIGFzIGxvdyBhcyAuMTQgYW5kIGFzIGhpZ2ggYXMgLjM5KQpgYGB7cn0KejVfdGl0JGdyYXBoKCkKYGBgCgoKIyMjU2xpZGVzIDUuMTAtNS4xNTogQ2xhc3MgVmFyaWF0aW9uIGluIFNleCBEaWZmZXJlbmNlCgpgYGB7cn0KI1plbGlnIDQ6CiNjMXggPC0gc2V0eCh6X3RpdCwgc2V4ID0gIm1hbGUiLCBwY2xhc3MgPSAiMXN0IikKI2MxeDEgPC0gc2V0eCh6X3RpdCwgc2V4ID0gImZlbWFsZSIsIHBjbGFzcyA9ICIxc3QiKQojYzFzIDwtIHNpbSh6X3RpdCwgeCA9IGMxeCwgeDEgPSBjMXgxKQoKI1plbGlnIDU6Cno1LjEgPC0gemxvZ2l0JG5ldygpCno1LjEkemVsaWcoc3Vydml2YWwgfiBhZ2UgK3NleCpwY2xhc3MgKyBmYXJlLCBkYXRhPXRpdGFuaWMpCno1LjEkc2V0eChzZXg9Im1hbGUiLCBwY2xhc3M9IjFzdCIpCno1LjEkc2V0eDEoc2V4PSJmZW1hbGUiLCBwY2xhc3M9IjFzdCIpCno1LjEkc2ltKCkKejUuMSRncmFwaCgpCmBgYAoqKlNsaWRlIDUuMTI6KioKPGJyLz5Gb3IgZmlyc3QgY2xhc3MsIHRoZSBkaWZmZXJlbmNlIGluIGV4cGVjdGVkIHZhbHVlIG9mIHN1cnZpdmFsIGJldHdlZW4gZmVtYWxlcyBhbmQgbWFsZXMgaXMgYWJvdXQgLjUyLCBzdWdnZXN0aW5nIHRoYXQgZmlyc3QgY2xhc3MgZmVtYWxlcyBoYXZlIGEgLjUyIGhpZ2hlciBjaGFuY2Ugb2Ygc3Vydml2aW5nIHRoYW4gZmlyc3QgY2xhc3MgbWFsZXMuCgoKYGBge3J9CiNaZWxpZyA0OgojYzJ4IDwtIHNldHgoel90aXQsIHNleCA9ICJtYWxlIiwgcGNsYXNzID0gIjJuZCIpCiNjMngxIDwtIHNldHgoel90aXQsIHNleCA9ICJmZW1hbGUiLCBwY2xhc3MgPSAiMm5kIikKI2MycyA8LSBzaW0oel90aXQsIHggPSBjMngsIHgxID0gYzJ4MSkKCiNaZWxpZyA1Ogp6NS4yIDwtIHpsb2dpdCRuZXcoKQp6NS4yJHplbGlnKHN1cnZpdmFsIH4gYWdlICtzZXgqcGNsYXNzICsgZmFyZSwgZGF0YT10aXRhbmljKQp6NS4yJHNldHgoc2V4PSJtYWxlIiwgcGNsYXNzPSIybmQiKQp6NS4yJHNldHgxKHNleD0iZmVtYWxlIiwgcGNsYXNzPSIybmQiKQp6NS4yJHNpbSgpCno1LjIkZ3JhcGgoKQpgYGAKKipTbGlkZSA1LjEzOioqCjxici8+Rm9yIHNlY29uZCBjbGFzcywgdGhlIHNpbXVsYXRlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHN1cnZpdmFsIGluY3JlYXNlcyB0byBhYm91dCAuNzUsIHN1Z2dlc3RpbmcgdGhhdCBzZWNvbmQgY2xhc3MgZmVtYWxlcyBoYXZlIGEgLjc1IGhpZ2hlciBjaGFuY2Ugb2Ygc3VydmlhbCB0aGFuIHNlY29uZCBjbGFzcyBtYWxlcy4KCmBgYHtyfQojWmVsaWcgNDoKI2MzeCA8LSBzZXR4KHpfdGl0LCBzZXggPSAibWFsZSIsIHBjbGFzcyA9ICIzcmQiKQojYzN4MSA8LSBzZXR4KHpfdGl0LCBzZXggPSAiZmVtYWxlIiwgcGNsYXNzID0gIjNyZCIpCiNjM3MgPC0gc2ltKHpfdGl0LCB4ID0gYzN4LCB4MSA9IGMzeDEpCgojWmVsaWcgNToKejUuMyA8LSB6bG9naXQkbmV3KCkKejUuMyR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArc2V4KnBjbGFzcyArIGZhcmUsIGRhdGE9dGl0YW5pYykKejUuMyRzZXR4KHNleD0ibWFsZSIsIHBjbGFzcz0iM3JkIikKejUuMyRzZXR4MShzZXg9ImZlbWFsZSIsIHBjbGFzcz0iM3JkIikKejUuMyRzaW0oKQp6NS4zJGdyYXBoKCkKYGBgCioqU2xpZGUgNS4xNDoqKgo8YnIvPkZvciB0aGlyZCBjbGFzcywgdGhlIHNpbXVsYXRlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gZmVtYWxlIGFuZCBtYWxlIHN1cnZpdmFsIGRyb3BzIHRvIGFib3V0IC4yNiwgc3VnZ2VzdGluZyB0aGF0IHRoaXJkIGNsYXNzIHdvbWVuIGhhdmUgYSAuMjYgaGlnaGVyIGNoYW5jZSBvZiBzdXJ2aXZhbCB0aGFuIHRoaXJkIGNsYXNzIG1lbi4gKEFzIHdlIG1vdmUgZG93biB0aGUgY2xhc3MgcmFua3MsIHdvbWVuJ3MgZXhwZWN0ZWQgc3Vydml2YWwgZGVjcmVhc2VzLikKCiMjI1NsaWRlIDUuMTU6IFB1dHRpbmcgVGhlbSBpbiBPbmUgUGxhY2UKYGBge3J9CmQxIDwtIHo1LjEkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpkMiA8LSB6NS4yJGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikKZDMgPC0gejUuMyRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCiAgCmRmZCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGQxLCBkMiwgZDMpKQpoZWFkKGRmZCkKYGBgCiMjI1NsaWRlIDUuMTY6IENoYW5naW5nIGZyb20gV2lkZSB0byBMb25nIEZvcm1hdApgYGB7cn0KbGlicmFyeSh0aWR5cikKdGlkZCA8LSBkZmQgJT4lIAogIGdhdGhlcihjbGFzcywgc2ltdiwgMTozKQpoZWFkKHRpZGQpCmBgYAojIyNTbGlkZSA1LjE3OiBHcm91cCBieSBDbGFzcwpgYGB7cn0KbGlicmFyeShkcGx5cikKdGlkZCAlPiUgCiAgZ3JvdXBfYnkoY2xhc3MpICU+JSAKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc2ltdiksIHNkID0gc2Qoc2ltdikpCmBgYAojIyNTbGlkZSA1LjE4OiBQbG90dGluZwpMb29raW5nIGF0IHRoZSBleHBlY3RlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gZmVtYWxlIGFuZCBtYWxlIHBhc3NlbmdlcnMgYWNyb3NzIGFsbCAzIGNsYXNzZXMsIHdlIGNhbiBzZWUgdGhlIGZpcnN0IGRpZmZlcmVuY2UgaXMgaGlnaGVzdCBpbiBzZWNvbmQgY2xhc3MgYW5kIGxvd2VzdCBpbiB0aGlyZCBjbGFzcy4gTWFsZSBhbmQgZmVtYWxlIHBhc3NlbmdlcnMgaGF2ZSBjbG9zZXIgZXhwZWN0ZWQgc3Vydml2YWwgcmF0ZXMgaW4gdGhpcmQgY2xhc3MuCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KHRpZGQsIGFlcyhzaW12KSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgZmFjZXRfZ3JpZCh+Y2xhc3MpCmBgYAoKIyNQYXJ0IDI6IEV4cGxvcmluZyB0aGUgWmVsaWcgUGFja2FnZSBVc2luZyBNeSBPd24gRGF0YXNldCAoTWFydmVsIENoYXJhY3RlcnMgYXMgTGl2aW5nIG9yIERlY2Vhc2VkKQoKVXNpbmcgYSBGaXZlVGhpcnR5RWlnaHQgQ29taWMgQ2hhcmFjdGVycyBEYXRhc2V0IGZvdW5kIG9uIEthZ2dsZSwgdGhpcyB3ZWVrJ3MgaG9tZXdvcmsgc2Vla3MgdG8gZGV0ZXJtaW5lIGhvdyB2YXJpYWJsZXMgc3VjaCBhcyBhbGlnbm1lbnQgKGdvb2QsIGJhZCwgb3IgbmV1dHJhbCksIGdlbmRlciAobWFsZSBvciBmZW1hbGUpLCBpZGVudGl0eSAocHVibGljIG9yIHNlY3JldCksIGFuZCBudW1iZXIgb2YgYXBwZWFyYW5jZXMgKGFzIG9mIDIwMTQpIGV4cGxhaW4gdGhlIGxpa2VsaWhvb2Qgb2Ygd2hldGhlciBhIE1hcnZlbCBjaGFyYWN0ZXIgd291bGQgYmUgYWxpdmUgaW4gdGhlIGNvbWljcyBvciBub3QuIFNpbmNlIG15IGRlcGVuZGVudCB2YXJpYWJsZSBpcyBkaWNob3RvbW91cywgSSBjb25kdWN0ZWQgYSBsb2dpdCByZWdyZXNzaW9uIGFuYWx5c2lzLiAKCiMjI1ByZXBhcmluZyB0aGUgRGF0YTogUmVjb2RpbmcgYW5kIFNlbGVjdGluZyBWYXJpYWJsZXMKTXkgZGVwZW5kZW50IHZhcmlhYmxlIHdhcyByZWNvZGVkIGFzIGJpbmFyeSAoKmFsaXZlX2JpbmFyeSopLCB3aGVyZSAxPWxpdmluZyBhbmQgMD1kZWNlYXNlZC4gTXkgKmlkZW50aXR5KiB2YXJpYWJsZSB3YXMgYWxzbyByZWNvZGVkIHNvIHRoYXQgIlB1YmxpYyBJZGVudGl0eSIiIGluY2x1ZGVkICJObyBEdWFsIElkZW50aXR5IiBhbmQgIktub3duIHRvIEF1dGhvcml0aWVzLiIgRm9yIG15ICpnZW5kZXIqIHZhcmlhYmxlLCAiQWdlbmRlciIgYW5kICJHZW5kZXJmbHVpZCIgY2hhcmFjdGVycyB3ZXJlIHJlY29kZWQgYXMgIk90aGVyLiIKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShtYWdyaXR0cikKTWFydmVsPC1yZWFkX2NzdigiL1VzZXJzL2plbm5pZmVyZ2FuZWxlcy9Eb3dubG9hZHMvbWFydmVsLXdpa2lhLWRhdGEuY3N2IikKbWFydmVsX2hlcm9lczwtCiAgbXV0YXRlIChNYXJ2ZWwsIGFsaXZlX2JpbmFyeT0KICAgICAgICAgICByZWNvZGUoQUxJVkUsICJMaXZpbmcgQ2hhcmFjdGVycyI9MSwiRGVjZWFzZWQgQ2hhcmFjdGVycyI9MCksCiAgICAgICAgICBHZW5kZXI9CiAgICAgICAgICAgIHJlY29kZShTRVgsICJBZ2VuZGVyIENoYXJhY3RlcnMiPSJPdGhlciIsICJHZW5kZXJmbHVpZCBDaGFyYWN0ZXJzIj0iT3RoZXIiKSwKICAgICAgICAgIElkZW50aXR5PQogICAgICAgICAgICByZWNvZGUoSUQsICJObyBEdWFsIElkZW50aXR5Ij0iUHVibGljIElkZW50aXR5IiwgIktub3duIHRvIEF1dGhvcml0aWVzIElkZW50aXR5Ij0iUHVibGljIElkZW50aXR5IiksCiAgICAgICAgICBhbGlnbm1lbnQgPSBmYWN0b3IoQUxJR04pLAogICAgICAgICAgZ2VuZGVyID0gZmFjdG9yKEdlbmRlciksCiAgICAgICAgICBpZGVudGl0eT1mYWN0b3IoSWRlbnRpdHkpKSU+JQogICAgZmlsdGVyKCFpcy5uYShBUFBFQVJBTkNFUyksCiAgICAgICAgICAgIWlzLm5hKGFsaWdubWVudCkpJT4lCiAgCiAgc2VsZWN0KEFMSVZFLCBhbGl2ZV9iaW5hcnksIGFsaWdubWVudCwgZ2VuZGVyLCBpZGVudGl0eSwgQVBQRUFSQU5DRVMpCmhlYWQobWFydmVsX2hlcm9lcykKCmBgYAoKIyMjUnVubmluZyBUaHJlZSBSZWdyZXNzaW9uIE1vZGVscyBhbmQgRGV0ZXJtaW5pbmcgdGhlIEJlc3QgTW9kZWwgRml0CkJvdGggQUlDIGFuZCBCSUMgYWdyZWUgdGhhdCBNb2RlbCAyIGlzIHRoZSBiZXN0IG1vZGVsLCB3aGljaCBjb250YWlucyBhbGwgc2VsZWN0ZWQgdmFyaWFibGVzIGJ1dCB3aXRob3V0IGFuIGludGVyYWN0aW9uIHRlcm0uCmBgYHtyIHJlc3VsdHM9J2FzaXMnfQpNMTwtemxvZ2l0JG5ldygpCk0xJHplbGlnKGFsaXZlX2JpbmFyeX4gaWRlbnRpdHkrZ2VuZGVyLCBkYXRhPW1hcnZlbF9oZXJvZXMpCk0yPC16bG9naXQkbmV3KCkKTTIkemVsaWcoYWxpdmVfYmluYXJ5fiBpZGVudGl0eStnZW5kZXIrYWxpZ25tZW50K0FQUEVBUkFOQ0VTLCBkYXRhPW1hcnZlbF9oZXJvZXMpCk0zPC16bG9naXQkbmV3KCkKTTMkemVsaWcoYWxpdmVfYmluYXJ5fiBpZGVudGl0eStnZW5kZXIqQVBQRUFSQU5DRVMrYWxpZ25tZW50LCBkYXRhPW1hcnZlbF9oZXJvZXMpCnRleHJlZzo6aHRtbHJlZyhsaXN0KE0xLCBNMiwgTTMpLGRvY3R5cGUgPSBGQUxTRSkKYGBgCioqKlRoZSBhYm92ZSB0YWJsZSBkaXNwbGF5cyB0aGUgcmVncmVzc2lvbiByZXN1bHRzIGluIHRlcm1zIG9mIGxvZyBvZGRzLCBidXQgSSB3YW50IHRvIHByb2R1Y2UgbW9yZSB1bmRlcnN0YW5kYWJsZSBjb2VmZmljaWVudHMgdXNpbmcgc2ltdWxhdGlvbi4uLioqCgojIyNCYWQgdnMuIEdvb2QgQ2hhcmFjdGVyczoKTG9va2luZyBhdCB0aGUgc2ltdWxhdGVkIGZpcnN0IGRpZmZlcmVuY2UgYmV0d2VlbiBiYWQgYW5kIGdvb2QgY2hhcmFjdGVycywgbXkgYW5hbHlzaXMgc2hvd3MgdGhhdCBvbiBhdmVyYWdlLCBnb29kIGNoYXJhY3RlcnMgaGF2ZSBhIC4xMiBoaWdoZXIgY2hhbmNlIG9mIGJlaW5nIGFsaXZlIHRoYW4gYmFkIGNoYXJhY3RlcnMgKGZpcnN0IGRpZmZlcmVuY2UgY2FuIGJlIGFzIGxvdyBhcyAuMDkgYW5kIGFzIGhpZ2ggYXMgLjE1KS4KYGBge3J9Ck0yJHNldHgoYWxpZ25tZW50PSJCYWQgQ2hhcmFjdGVycyIpCk0yJHNldHgxKGFsaWdubWVudD0iR29vZCBDaGFyYWN0ZXJzIikKTTIkc2ltKCkKZmQgPC0gTTIkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpzdW1tYXJ5KGZkKQpNMiRncmFwaCgpCmBgYAoKCiMjI0JhZCB2cy4gTmV1dHJhbCBDaGFyYWN0ZXJzOgpMb29raW5nIGF0IHRoZSBzaW11bGF0ZWQgZmlyc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhZCBhbmQgbmV1dHJhbCBjaGFyYWN0ZXJzLCBteSBhbmFseXNpcyBzaG93cyB0aGF0IG9uIGF2ZXJhZ2UsIG5ldXRyYWwgY2hhcmFjdGVycyBoYXZlIGEgLjA2IGhpZ2hlciBjaGFuY2Ugb2YgYmVpbmcgYWxpdmUgdGhhbiBiYWQgY2hhcmFjdGVycyAoZmlyc3QgZGlmZmVyZW5jZSBjYW4gYmUgYXMgbG93IGFzIC4wMiBhbmQgYXMgaGlnaCBhcyAuMTApLgpgYGB7cn0KTTIkc2V0eChhbGlnbm1lbnQ9IkJhZCBDaGFyYWN0ZXJzIikKTTIkc2V0eDEoYWxpZ25tZW50PSJOZXV0cmFsIENoYXJhY3RlcnMiKQpNMiRzaW0oKQpmZCA8LSBNMiRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCnN1bW1hcnkoZmQpCk0yJGdyYXBoKCkKYGBgCiMjI01hbGUgdnMuIEZlbWFsZSBDaGFyYWN0ZXJzOgpMb29raW5nIGF0IHRoZSBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIGNoYXJhY3RlcnMsIG15IGFuYWx5c2lzIHNob3dzIHRoYXQgb24gYXZlcmFnZSwgZmVtYWxlIGNoYXJhY3RlcnMgaGF2ZSBhIC4wNSBoaWdoZXIgY2hhbmNlIG9mIGJlaW5nIGFsaXZlIHRoYW4gbWFsZSBjaGFyYWN0ZXJzIChmaXJzdCBkaWZmZXJlbmNlIGNhbiBiZSBhcyBsb3cgYXMgLjAxIGFuZCBhcyBoaWdoIGFzIC4wOSkuCgpgYGB7cn0KTTIkc2V0eChnZW5kZXI9Ik1hbGUgQ2hhcmFjdGVycyIpCk0yJHNldHgxKGdlbmRlcj0iRmVtYWxlIENoYXJhY3RlcnMiKQpNMiRzaW0oKQpmZCA8LSBNMiRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCnN1bW1hcnkoZmQpCk0yJGdyYXBoKCkKYGBgCiMjI1NlY3JldCB2cy4gUHVibGljIElkZW50aXR5OgpIZXJlLCB0aGUgYW5hbHlzaXMgc2hvd3MgdGhhdCBvbiBhdmVyYWdlLCBjaGFyYWN0ZXJzIHdpdGggcHVibGljIGlkZW50aXRpZXMgaGF2ZSBhIC4wMDQgaGlnaGVyIGNoYW5jZSBvZiBiZWluZyBhbGl2ZSB0aGFuIGNoYXJhY3RlcnMgd2l0aCBzZWNyZXQgaWRlbnRpdGllcy4gSG93ZXZlciwgdGhpcyBkaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCAoYXMgdGhlIEFJQy9CSUMgdGFibGUgc2hvd2VkIGFib3ZlKSBhbmQgdGhlIGZpcnN0IGRpZmZlcmVuY2UgY2FuIGJlIGFzIGhpZ2ggYXMgLjAzNiBhbmQgYXMgbG93IGFzIC0uMDI5IChtZWFuaW5nLCBjaGFyYWN0ZXJzIHdpdGggcHVibGljIGlkZW50aXRpZXMgY2FuIGFsc28gaGF2ZSBhIGxvd2VyIHBlcmNlbnRhZ2Ugb2YgYmVpbmcgYWxpdmUpLiBUaGVyZWZvcmUsIHdoZXRoZXIgYSBjaGFyYWN0ZXIncyBpZGVudGl0eSBpcyBzZWNyZXQgb3IgcHVibGljIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBtdWNoIGluZmx1ZW5jZSBvbiB0aGVpciBjaGFuY2VzIG9mIGJlaW5nIGFsaXZlLiAKYGBge3J9Ck0yJHNldHgoaWRlbnRpdHk9IlNlY3JldCBJZGVudGl0eSIpCk0yJHNldHgxKGlkZW50aXR5PSJQdWJsaWMgSWRlbnRpdHkiKQpNMiRzaW0oKQpmZCA8LSBNMiRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCnN1bW1hcnkoZmQpCk0yJGdyYXBoKCkKYGBgCiMjI051bWJlciBvZiBBcHBlYXJhbmNlcyBFZmZlY3Q6Ckxvb2tpbmcgYXQgYSByYW5nZSBiZXR3ZWVuIDAgYW5kIDEwMDAgYXBwZWFyYW5jZXMsIEkgZm91bmQgdGhhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgYmVpbmcgYWxpdmUgaW5jcmVhc2VzIGFzIHRoZSBudW1iZXIgb2YgYXBwZWFyYW5jZXMgaW4gdGhlIGNvbWljIGluY3JlYXNlcy4gVGhpcyBtYWtlcyBzZW5zZSBzaW5jZSBjaGFyYWN0ZXJzIHdvdWxkIGxpa2VseSBhcHBlYXIgaW4gdGhlIGNvbWljcyBhcyBsaXZpbmcgKHJhdGhlciB0aGFuIGFzIGRlY2Vhc2VkKS4gSG93ZXZlciwgdGhlIHVuY2VydGFpbnR5IG9mIGJlaW5nIGFsaXZlIGFsc28gaW5jcmVhc2VzIGFzIG51bWJlciBvZiBhcHBlYXJhbmNlcyBpbmNyZWFzZS4KYGBge3J9Ck0yJHNldHJhbmdlKEFQUEVBUkFOQ0VTPTA6MTAwMCkKTTIkc2ltKCkKTTIkZ3JhcGgoKQpgYGAKIyNDb25jbHVzaW9uOgpBZnRlciBydW5uaW5nIGEgbG9naXN0aWMgcmVncmVzc2lvbiB1c2luZyBaZWxpZywgSSB3YXMgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNoYW5jZXMgb2YgYSBNYXJ2ZWwgY2hhcmFjdGVyIGJlaW5nIGFsaXZlIG9yIG5vdCBieSBleHBsb3JpbmcgaW5kZXBlbmRlbnQgdmFyaWFibGVzIHN1Y2ggYXMgYWxpZ25lbW50LCBnZW5kZXIsIGlkZW50aXR5LCBhbmQgYXBwZWFyYW5jZSBudW1iZXIuIEkgZm91bmQgdGhhdCBjaGFyYWN0ZXJzIHdobyBhcmUgZ29vZCBvciBuZXV0cmFsIGFyZSBtb3JlIGxpa2VseSB0byBiZSBhbGl2ZSBpbiB0aGUgY29taWNzIHRoYW4gdGhvc2Ugd2hvIGFyZSBiYWQsIGFuZCBjaGFyYWN0ZXJzIHdobyBhcmUgZmVtYWxlIGFyZSBtb3JlIGxpa2VseSB0byBiZSBhbGl2ZSB0aGFuIHRob3NlIHdobyBhcmUgbWFsZS4gV2hldGhlciBhIGNoYXJhY3RlcidzIGlkZW50aXR5IGlzIHNlY3JldCBvciBwdWJsaWMgZG9lcyBub3QgaGF2ZSBtdWNoIGluZmx1ZW5jZSBvbiB3aGV0aGVyIGhlL3NoZSBpcyBhbGl2ZSBpbiB0aGUgY29taWNzLiBMYXN0bHksIGNoYXJhY3RlcnMgaGF2ZSBhIGhpZ2hlciBjaGFuY2Ugb2YgYmVpbmcgYWxpdmUgYXMgdGhleSBhcHBlYXIgbW9yZSBvZnRlbiBpbiB0aGUgY29taWNzOyBob3dldmVyLCBhcyBudW1iZXIgb2YgYXBwZWFyYW5jZXMgaW5jcmVhc2VzLCB0aGUgdW5jZXJ0YWludHkgb2YgYmVpbmcgYWxpdmUgaW5jcmVhc2VzIGFzIHdlbGwuCgo=