Ernesto Gomez
October 30, 2017
Introduction
Recent events involving mass shooters gunning down large groups of people in the United States has catalyzed a national conversation around guns, gun ownership, background checks, and mental health. This analysis is concerned with the question around access to guns and whether access to a larger arsenal on the part of a mass shooter is likelier to result in more fatalities. A multilevel method will be utilized to further analyze the relationship between fatalities and weaponry size and possible variations amongst all 50 states, who have varying rates of gun ownership. In the end, mental illness will be introduced to test for its influence in fatalities. The analysis will begin with an ecological analysis, complete pooling model, a no pool modeling, and conclude with multilevel modeling to ultimately determine the best fit and contributing factors to fatalities.
Method
To conduct this analysis, the primary data used was extracted from the Stanford Mass Shootings in America (MSA). Additionally, the percentage of gun ownership across the United States, taken from a heatmap based on General Social Survey data and stratified on the state-level, is also utilized and merged into the dataset.
Variables contained within the dataframe are defined and coded as follows:
- totalvictims - This variable will be the dependent variable, it is a measurement of the total number of fatalities for every incidence of a mass shooting.
- mentalhistory - This variable measures whether a mass shooter had a reported or confirmed history of mental illness, “Yes” for a history of mental illness and “No” for no history.
- mentalill - A recoded 1,0 variable of history of mental illness, 1 for “Yes” and 0 for “No”.
- totalguns - This variable is a measurement of the total number of guns used during a particular shooting.
- statefull - The state in which a mass shooting incidence took place.
- PercHavGun - The percentage of gun ownership from a particular state (derived from the General Social Survey’s Trends in Gun Ownership in the United States) matched by state.
library(nlme)
library(tidyverse)
library(dplyr)
library(sjmisc)
library(magrittr)
library(lmerTest)
library(texreg)
library(visreg)
library(ggplot2)
masshoot <- data.frame(read_csv("/Users/ernesto/Documents/Advanced Analytics/Data/MassShootings.csv")) %>%
rename("mentalhistory" = History.of.Mental.Illness...General,
"totalvictims" = Total.Number.of.Victims,
"state" = State,
"totalguns" = Total.Number.of.Guns) %>%
select(state, totalvictims, mentalhistory, totalguns) %>%
filter(!is.na(totalvictims),
!is.na(state),
!is.na(mentalhistory),
!is.na(totalguns),
!totalvictims %in% c("Unknown"),
!state %in% c("Unknown"),
!mentalhistory %in% c("Unknown"),
!totalguns %in% c("Unknown")) %>%
mutate(mentalill=as.factor(ifelse(mentalhistory=="Yes", 1, 0)),
totalguns=as.numeric(totalguns))
#newtotalguns=as.factor(ifelse(totalguns<4, totalguns,
#ifelse(totalguns>=4, "4+","na"))))
statefull = c("Alaska","Alabama","Arkansas",
"Arizona","California","Colorado",
"Connecticut","District of Columbia","Delaware",
"Florida" , "Georgia" ,"Hawaii",
"Iowa","Idaho","Illinois","Indiana","Kansas",
"Kentucky","Louisiana","Massachusetts",
"Maryland","Maine" ,"Michigan","Minnesota",
"Missouri","Mississippi","Montana",
"North Carolina","North Dakota","Nebraska",
"New Hampshire" , "New Jersey" , "New Mexico",
"Nevada","New York","Ohio","Oklahoma" ,"Oregon",
"Pennsylvania" , "Rhode Island",
"South Carolina", "South Dakota" ,"Tennessee" ,
"Texas" , "Utah", "Virginia","Vermont" ,"Washington",
"Wisconsin", "West Virginia" , "Wyoming")
PercHavGuns= c(57.8, 51.7, 55.3,
31.1, 21.3, 34.7,
16.7, 3.6, 25.5,
24.5, 40.3, 6.7,
42.9, 55.3, 20.2, 39.1, 42.1,
47.7, 44.1, 12.6,
21.3, 40.5, 38.4, 41.7,
41.7, 55.3, 57.7,
41.3, 50.7, 38.6,
30.0, 12.3, 34.8,
33.8, 18.0, 32.4, 42.9, 39.8,
34.7, 12.8,
42.3, 56.6, 43.9,
35.9, 43.9, 35.1, 42.0, 33.1,
44.4, 55.4, 59.7)
stateguns <- data.frame(statefull, PercHavGuns)
mshoot <- merge(stateguns, masshoot, all.x=FALSE, all.y=TRUE, by.x="statefull", by.y="state") %>%
mutate(statefull=as.factor(statefull))
print(mshoot)
Ecological Analysis
The ecological regression seeks to understand whether, at the state level, does the number of guns owned relate to the number of mass shooting incidences in that state? What is found is that simply because a particular state has a higher rate of gun ownership this does not necessarily result in higher incidences of mass shootings. This is somewhat interesting because one might expect a state with more guns to mean easier access, greater ubiquity of access to guns, individuals who own more than one gun, and thus potentially a higher likelihood of more shootings and subsequently deaths.
shootd <- mshoot %>%
group_by(statefull) %>%
summarise(gunown=mean(PercHavGuns), totalvictims=sum(totalvictims), incidence=n())
summary(lm(incidence ~ gunown, data = shootd))
Call:
lm(formula = incidence ~ gunown, data = shootd)
Residuals:
Min 1Q Median 3Q Max
-5.8074 -2.0221 -0.8676 1.1989 20.5414
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.08169 1.86923 3.789 0.000488 ***
gunown -0.07620 0.04687 -1.626 0.111657
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.264 on 41 degrees of freedom
Multiple R-squared: 0.06056, Adjusted R-squared: 0.03765
F-statistic: 2.643 on 1 and 41 DF, p-value: 0.1117
Fatalities and Number of Guns Used - A Complete Pooling Model
This individual analysis/complete pooling model examines the number of guns used during an incidence and whether this influences the number of fatalities. The model’s results indicate a highly statistically significant increase in fatalities the more guns used by a shooter during an incident.
cpooling <- lm(totalvictims ~ totalguns, data=mshoot)
summary(cpooling)
Call:
lm(formula = totalvictims ~ totalguns, data = mshoot)
Residuals:
Min 1Q Median 3Q Max
-19.701 -3.323 -2.206 0.677 54.217
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.1700 0.8145 3.892 0.000127 ***
totalguns 3.1531 0.3990 7.903 0.0000000000000775 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 7.706 on 260 degrees of freedom
Multiple R-squared: 0.1937, Adjusted R-squared: 0.1906
F-statistic: 62.46 on 1 and 260 DF, p-value: 0.00000000000007745
Fatalities and Number of Guns - A No Pooling Model
Intercept
When considering the intercept model, which is an indication of fatalities, we see that most intercepts range between 0-18 when there is no consideration of number of guns used.
dcoef <- mshoot %>%
group_by(statefull) %>%
do(mod=lm(totalvictims ~ totalguns, data=.))
coef <- dcoef %>% do(data.frame(intc=coef(.$mod)[1]))
ggplot(coef, aes(x=intc)) + geom_histogram(fill="black")

Slope
Our slope models show a consistently positive impact, suggesting that the more guns used during a particular shooting resulted in more fatalities.
dcoef1 <- mshoot %>%
group_by(statefull) %>%
do(mod=lm(totalvictims ~ totalguns, data=.))
coef1 <- dcoef1 %>% do(data.frame(totalgunc = coef(.$mod)[2]))
ggplot (coef1, aes(x=totalgunc)) + geom_histogram(fill="darkred")

Multilevel Modeling
Fatalities & Number of Guns by State - A Random Intercept Model
m1_lme <- lme(totalvictims~totalguns, data=mshoot, random = ~1|statefull, method="ML")
summary(m1_lme)
Linear mixed-effects model fit by maximum likelihood
Data: mshoot
AIC BIC logLik
1816.377 1830.651 -904.1887
Random effects:
Formula: ~1 | statefull
(Intercept) Residual
StdDev: 1.854707 7.44623
Fixed effects: totalvictims ~ totalguns
Value Std.Error DF t-value p-value
(Intercept) 3.152600 0.8656005 215 3.642096 0.0003
totalguns 3.076404 0.3953991 215 7.780504 0.0000
Correlation:
(Intr)
totalguns -0.747
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-2.51797073 -0.38017819 -0.19661757 0.09522077 6.91271424
Number of Observations: 262
Number of Groups: 46
Fatalities and Number of Guns by State - A Random Slope Model
m2_lme <- lme(totalvictims~totalguns, data=mshoot, random = ~totalguns|statefull, method="ML")
summary(m2_lme)
Linear mixed-effects model fit by maximum likelihood
Data: mshoot
AIC BIC logLik
1779.533 1800.943 -883.7663
Random effects:
Formula: ~totalguns | statefull
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 3.066593 (Intr)
totalguns 3.203568 -0.987
Residual 6.566262
Fixed effects: totalvictims ~ totalguns
Value Std.Error DF t-value p-value
(Intercept) 2.708586 1.0514729 215 2.575992 0.0107
totalguns 3.447483 0.7935152 215 4.344570 0.0000
Correlation:
(Intr)
totalguns -0.892
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-3.5028251 -0.4510911 -0.2105835 0.1330508 5.2161427
Number of Observations: 262
Number of Groups: 46
Model(s) Summary
When accounting for the variations/differences between states we continue to see a statistically significant relationship between number of guns used and fatalities, which still increase as the number of guns used similarly increases.
Introducing Covariate - The Effect of Mental Illness
The model maintains its significance in regards to number of guns used, and the model also reveal statistical significance and an increase in fatalities when considering mental illness amongst convicted mass shooters.
m3_lme <- lme(totalvictims ~ totalguns+mentalill, data=mshoot, random = ~totalguns|statefull, method="ML")
summary(m3_lme)
Linear mixed-effects model fit by maximum likelihood
Data: mshoot
AIC BIC logLik
1765.498 1790.476 -875.749
Random effects:
Formula: ~totalguns | statefull
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 2.721248 (Intr)
totalguns 2.925215 -0.987
Residual 6.393374
Fixed effects: totalvictims ~ totalguns + mentalill
Value Std.Error DF t-value p-value
(Intercept) 1.891857 1.0171853 214 1.859894 0.0643
totalguns 3.164054 0.7467198 214 4.237271 0.0000
mentalill1 3.541143 0.8743448 214 4.050054 0.0001
Correlation:
(Intr) ttlgns
totalguns -0.845
mentalill1 -0.208 -0.084
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-3.2790555 -0.4322534 -0.1487146 0.2175075 5.2065406
Number of Observations: 262
Number of Groups: 46
Mental Illness and Access to Many Guns by State - An Interaction Model
When interacting number of guns used and mental illness – do shooters with a history of mental history kill more with more guns – the model is weakened and loses significance. There may be no interactive effect.
m4_lme <- lme(totalvictims ~ totalguns*mentalill, data=mshoot, random = ~totalguns|statefull, method="ML")
summary(m4_lme)
Linear mixed-effects model fit by maximum likelihood
Data: mshoot
AIC BIC logLik
1765.536 1794.082 -874.7678
Random effects:
Formula: ~totalguns | statefull
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 2.684024 (Intr)
totalguns 2.770195 -0.976
Residual 6.390776
Fixed effects: totalvictims ~ totalguns * mentalill
Value Std.Error DF t-value p-value
(Intercept) 2.748995 1.1913864 213 2.3073917 0.0220
totalguns 2.540068 0.8506662 213 2.9859753 0.0032
mentalill1 1.516140 1.6772752 213 0.9039303 0.3671
totalguns:mentalill1 1.342273 0.9392529 213 1.4290860 0.1544
Correlation:
(Intr) ttlgns mntll1
totalguns -0.886
mentalill1 -0.543 0.407
totalguns:mentalill1 0.528 -0.523 -0.853
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-3.0193090 -0.4341919 -0.1737580 0.2379613 5.0829045
Number of Observations: 262
Number of Groups: 46
Model Selection
Our third multilevel model proves to be the best fit when models are grouped and viewed for the lowest AIC value.
AIC(cpooling, m1_lme, m2_lme, m3_lme, m4_lme)
Best Fit Models
htmlreg(list(m2_lme, m3_lme, m4_lme))
Statistical models
|
|
Model 1
|
Model 2
|
Model 3
|
|
(Intercept)
|
2.71*
|
1.89
|
2.75*
|
|
|
(1.05)
|
(1.02)
|
(1.19)
|
|
totalguns
|
3.45***
|
3.16***
|
2.54**
|
|
|
(0.79)
|
(0.75)
|
(0.85)
|
|
mentalill1
|
|
3.54***
|
1.52
|
|
|
|
(0.87)
|
(1.68)
|
|
totalguns:mentalill1
|
|
|
1.34
|
|
|
|
|
(0.94)
|
|
AIC
|
1779.53
|
1765.50
|
1765.54
|
|
BIC
|
1800.94
|
1790.48
|
1794.08
|
|
Log Likelihood
|
-883.77
|
-875.75
|
-874.77
|
|
Num. obs.
|
262
|
262
|
262
|
|
Num. groups
|
46
|
46
|
46
|
|
p < 0.001, p < 0.01, p < 0.05
|
In Conclusion
A graphical representation of the best fit model indicates that more guns used means more fatalities. Additionally, if a shooter is reported to have a history of mental illness they are also likelier to kill more than those with no prior history. The interaction between the two showed no significant effect.
visreg(m3_lme)


Note
It was my intention to also include the covariate in the pooling/no pooling models but encountered an error last minute when adjusting the lm to account for the covariate in the slopes. I tried to understand how to fix it but couldn’t. My mistake.
LS0tCnRpdGxlOiAiRXhhbWluaW5nIE1hc3MgU2hvb3RpbmdzIGFuZCBGYXRhbGl0aWVzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMjI0VybmVzdG8gR29tZXoKIyMjIyNPY3RvYmVyIDMwLCAyMDE3Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgojIyoqSW50cm9kdWN0aW9uKioKClJlY2VudCBldmVudHMgaW52b2x2aW5nIG1hc3Mgc2hvb3RlcnMgZ3VubmluZyBkb3duIGxhcmdlIGdyb3VwcyBvZiBwZW9wbGUgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgaGFzIGNhdGFseXplZCBhIG5hdGlvbmFsIGNvbnZlcnNhdGlvbiBhcm91bmQgZ3VucywgZ3VuIG93bmVyc2hpcCwgYmFja2dyb3VuZCBjaGVja3MsIGFuZCBtZW50YWwgaGVhbHRoLiBUaGlzIGFuYWx5c2lzIGlzIGNvbmNlcm5lZCB3aXRoIHRoZSBxdWVzdGlvbiBhcm91bmQgYWNjZXNzIHRvIGd1bnMgYW5kIHdoZXRoZXIgYWNjZXNzIHRvIGEgbGFyZ2VyIGFyc2VuYWwgb24gdGhlIHBhcnQgb2YgYSBtYXNzIHNob290ZXIgaXMgbGlrZWxpZXIgdG8gcmVzdWx0IGluIG1vcmUgZmF0YWxpdGllcy4gQSBtdWx0aWxldmVsIG1ldGhvZCB3aWxsIGJlIHV0aWxpemVkIHRvIGZ1cnRoZXIgYW5hbHl6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZmF0YWxpdGllcyBhbmQgd2VhcG9ucnkgc2l6ZSBhbmQgcG9zc2libGUgdmFyaWF0aW9ucyBhbW9uZ3N0IGFsbCA1MCBzdGF0ZXMsIHdobyBoYXZlIHZhcnlpbmcgcmF0ZXMgb2YgZ3VuIG93bmVyc2hpcC4gSW4gdGhlIGVuZCwgbWVudGFsIGlsbG5lc3Mgd2lsbCBiZSBpbnRyb2R1Y2VkIHRvIHRlc3QgZm9yIGl0cyBpbmZsdWVuY2UgaW4gZmF0YWxpdGllcy4gVGhlIGFuYWx5c2lzIHdpbGwgYmVnaW4gd2l0aCBhbiBlY29sb2dpY2FsIGFuYWx5c2lzLCBjb21wbGV0ZSBwb29saW5nIG1vZGVsLCBhIG5vIHBvb2wgbW9kZWxpbmcsIGFuZCBjb25jbHVkZSB3aXRoIG11bHRpbGV2ZWwgbW9kZWxpbmcgdG8gdWx0aW1hdGVseSBkZXRlcm1pbmUgdGhlIGJlc3QgZml0IGFuZCBjb250cmlidXRpbmcgZmFjdG9ycyB0byBmYXRhbGl0aWVzLgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiMjKipNZXRob2QqKgoKVG8gY29uZHVjdCB0aGlzIGFuYWx5c2lzLCB0aGUgcHJpbWFyeSBkYXRhIHVzZWQgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBTdGFuZm9yZCBNYXNzIFNob290aW5ncyBpbiBBbWVyaWNhIChNU0EpLiBBZGRpdGlvbmFsbHksIHRoZSBwZXJjZW50YWdlIG9mIGd1biBvd25lcnNoaXAgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLCB0YWtlbiBmcm9tIGEgaGVhdG1hcCBiYXNlZCBvbiBHZW5lcmFsIFNvY2lhbCBTdXJ2ZXkgZGF0YSBhbmQgc3RyYXRpZmllZCBvbiB0aGUgc3RhdGUtbGV2ZWwsIGlzIGFsc28gdXRpbGl6ZWQgYW5kIG1lcmdlZCBpbnRvIHRoZSBkYXRhc2V0LgoKVmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGRhdGFmcmFtZSBhcmUgZGVmaW5lZCBhbmQgY29kZWQgYXMgZm9sbG93czoKCiogKip0b3RhbHZpY3RpbXMqKiAtIFRoaXMgdmFyaWFibGUgd2lsbCBiZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLCBpdCBpcyBhIG1lYXN1cmVtZW50IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZmF0YWxpdGllcyBmb3IgZXZlcnkgaW5jaWRlbmNlIG9mIGEgbWFzcyBzaG9vdGluZy4KKyAqKm1lbnRhbGhpc3RvcnkqKiAtIFRoaXMgdmFyaWFibGUgbWVhc3VyZXMgd2hldGhlciBhIG1hc3Mgc2hvb3RlciBoYWQgYSByZXBvcnRlZCBvciBjb25maXJtZWQgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcywgIlllcyIgZm9yIGEgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcyBhbmQgIk5vIiBmb3Igbm8gaGlzdG9yeS4KKyAqKm1lbnRhbGlsbCoqIC0gQSByZWNvZGVkIDEsMCB2YXJpYWJsZSBvZiBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzLCAxIGZvciAiWWVzIiBhbmQgMCBmb3IgIk5vIi4KKyAqKnRvdGFsZ3VucyoqIC0gVGhpcyB2YXJpYWJsZSBpcyBhIG1lYXN1cmVtZW50IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3VucyB1c2VkIGR1cmluZyBhIHBhcnRpY3VsYXIgc2hvb3RpbmcuCisgKipzdGF0ZWZ1bGwqKiAtIFRoZSBzdGF0ZSBpbiB3aGljaCBhIG1hc3Mgc2hvb3RpbmcgaW5jaWRlbmNlIHRvb2sgcGxhY2UuCisgKipQZXJjSGF2R3VuKiogLSBUaGUgcGVyY2VudGFnZSBvZiBndW4gb3duZXJzaGlwIGZyb20gYSBwYXJ0aWN1bGFyIHN0YXRlIChkZXJpdmVkIGZyb20gdGhlIEdlbmVyYWwgU29jaWFsIFN1cnZleeKAmXMgVHJlbmRzIGluIEd1biBPd25lcnNoaXAgaW4gdGhlIFVuaXRlZCBTdGF0ZXMpIG1hdGNoZWQgYnkgc3RhdGUuIAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkobmxtZSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc2ptaXNjKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KHRleHJlZykKbGlicmFyeSh2aXNyZWcpCmxpYnJhcnkoZ2dwbG90MikKCm1hc3Nob290IDwtIGRhdGEuZnJhbWUocmVhZF9jc3YoIi9Vc2Vycy9lcm5lc3RvL0RvY3VtZW50cy9BZHZhbmNlZCBBbmFseXRpY3MvRGF0YS9NYXNzU2hvb3RpbmdzLmNzdiIpKSAlPiUKICByZW5hbWUoIm1lbnRhbGhpc3RvcnkiID0gSGlzdG9yeS5vZi5NZW50YWwuSWxsbmVzcy4uLkdlbmVyYWwsCiAgICAidG90YWx2aWN0aW1zIiA9IFRvdGFsLk51bWJlci5vZi5WaWN0aW1zLAogICAgInN0YXRlIiA9IFN0YXRlLAogICAgICJ0b3RhbGd1bnMiID0gVG90YWwuTnVtYmVyLm9mLkd1bnMpICU+JQogIHNlbGVjdChzdGF0ZSwgdG90YWx2aWN0aW1zLCBtZW50YWxoaXN0b3J5LCB0b3RhbGd1bnMpICU+JQogIGZpbHRlcighaXMubmEodG90YWx2aWN0aW1zKSwKICAgICAgICAgIWlzLm5hKHN0YXRlKSwKICAgICAgICAgIWlzLm5hKG1lbnRhbGhpc3RvcnkpLAogICAgICAgICAhaXMubmEodG90YWxndW5zKSwgCiAgICAgICAgIXRvdGFsdmljdGltcyAlaW4lIGMoIlVua25vd24iKSwKICAgICAgICAhc3RhdGUgJWluJSBjKCJVbmtub3duIiksCiAgICAgICAgIW1lbnRhbGhpc3RvcnkgJWluJSBjKCJVbmtub3duIiksCiAgICAgICAgIXRvdGFsZ3VucyAlaW4lIGMoIlVua25vd24iKSkgJT4lCiAgICAgICAgICBtdXRhdGUobWVudGFsaWxsPWFzLmZhY3RvcihpZmVsc2UobWVudGFsaGlzdG9yeT09IlllcyIsIDEsIDApKSwKICAgICAgICAgICAgICB0b3RhbGd1bnM9YXMubnVtZXJpYyh0b3RhbGd1bnMpKQogICAgICAgICAgICAgICNuZXd0b3RhbGd1bnM9YXMuZmFjdG9yKGlmZWxzZSh0b3RhbGd1bnM8NCwgdG90YWxndW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmVsc2UodG90YWxndW5zPj00LCAiNCsiLCJuYSIpKSkpCgoKc3RhdGVmdWxsID0gYygiQWxhc2thIiwiQWxhYmFtYSIsIkFya2Fuc2FzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcml6b25hIiwiQ2FsaWZvcm5pYSIsIkNvbG9yYWRvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3RpY3V0IiwiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCJEZWxhd2FyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbG9yaWRhIiAsICJHZW9yZ2lhIiAsIkhhd2FpaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJb3dhIiwiSWRhaG8iLCJJbGxpbm9pcyIsIkluZGlhbmEiLCJLYW5zYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2VudHVja3kiLCJMb3Vpc2lhbmEiLCJNYXNzYWNodXNldHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnlsYW5kIiwiTWFpbmUiICwiTWljaGlnYW4iLCJNaW5uZXNvdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc291cmkiLCJNaXNzaXNzaXBwaSIsIk1vbnRhbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ydGggQ2Fyb2xpbmEiLCJOb3J0aCBEYWtvdGEiLCJOZWJyYXNrYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXcgSGFtcHNoaXJlIiAsICJOZXcgSmVyc2V5IiAsICAiTmV3IE1leGljbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXZhZGEiLCJOZXcgWW9yayIsIk9oaW8iLCJPa2xhaG9tYSIgLCJPcmVnb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVubnN5bHZhbmlhIiAsICJSaG9kZSBJc2xhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggQ2Fyb2xpbmEiLCAiU291dGggRGFrb3RhIiAsIlRlbm5lc3NlZSIgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRleGFzIiAsICJVdGFoIiwgIlZpcmdpbmlhIiwiVmVybW9udCIgLCJXYXNoaW5ndG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpc2NvbnNpbiIsICJXZXN0IFZpcmdpbmlhIiAsICJXeW9taW5nIikKClBlcmNIYXZHdW5zPSBjKDU3LjgsIDUxLjcsIDU1LjMsCiAgICAgICAgICAgICAgIDMxLjEsIDIxLjMsIDM0LjcsCiAgICAgICAgICAgICAgIDE2LjcsIDMuNiwgMjUuNSwKICAgICAgICAgICAgICAgMjQuNSwgNDAuMywgNi43LAogICAgICAgICAgICAgICA0Mi45LCA1NS4zLCAyMC4yLCAzOS4xLCA0Mi4xLAogICAgICAgICAgICAgICA0Ny43LCA0NC4xLCAxMi42LAogICAgICAgICAgICAgICAyMS4zLCA0MC41LCAzOC40LCA0MS43LAogICAgICAgICAgICAgICA0MS43LCA1NS4zLCA1Ny43LAogICAgICAgICAgICAgICA0MS4zLCA1MC43LCAzOC42LAogICAgICAgICAgICAgICAzMC4wLCAxMi4zLCAzNC44LAogICAgICAgICAgICAgICAzMy44LCAxOC4wLCAzMi40LCA0Mi45LCAzOS44LAogICAgICAgICAgICAgICAzNC43LCAxMi44LAogICAgICAgICAgICAgICA0Mi4zLCA1Ni42LCA0My45LAogICAgICAgICAgICAgICAzNS45LCA0My45LCAzNS4xLCA0Mi4wLCAzMy4xLAogICAgICAgICAgICAgICA0NC40LCA1NS40LCA1OS43KQoKc3RhdGVndW5zIDwtIGRhdGEuZnJhbWUoc3RhdGVmdWxsLCBQZXJjSGF2R3VucykKCm1zaG9vdCA8LSBtZXJnZShzdGF0ZWd1bnMsIG1hc3Nob290LCBhbGwueD1GQUxTRSwgYWxsLnk9VFJVRSwgYnkueD0ic3RhdGVmdWxsIiwgYnkueT0ic3RhdGUiKSAlPiUKICBtdXRhdGUoc3RhdGVmdWxsPWFzLmZhY3RvcihzdGF0ZWZ1bGwpKQoKcHJpbnQobXNob290KQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiMjKipFY29sb2dpY2FsIEFuYWx5c2lzKioKClRoZSBlY29sb2dpY2FsIHJlZ3Jlc3Npb24gc2Vla3MgdG8gdW5kZXJzdGFuZCB3aGV0aGVyLCBhdCB0aGUgc3RhdGUgbGV2ZWwsIGRvZXMgdGhlIG51bWJlciBvZiBndW5zIG93bmVkIHJlbGF0ZSB0byB0aGUgbnVtYmVyIG9mIG1hc3Mgc2hvb3RpbmcgaW5jaWRlbmNlcyBpbiB0aGF0IHN0YXRlPyBXaGF0IGlzIGZvdW5kIGlzIHRoYXQgc2ltcGx5IGJlY2F1c2UgYSBwYXJ0aWN1bGFyIHN0YXRlIGhhcyBhIGhpZ2hlciByYXRlIG9mIGd1biBvd25lcnNoaXAgdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXN1bHQgaW4gaGlnaGVyIGluY2lkZW5jZXMgb2YgbWFzcyBzaG9vdGluZ3MuIFRoaXMgaXMgc29tZXdoYXQgaW50ZXJlc3RpbmcgYmVjYXVzZSBvbmUgbWlnaHQgZXhwZWN0IGEgc3RhdGUgd2l0aCBtb3JlIGd1bnMgdG8gbWVhbiBlYXNpZXIgYWNjZXNzLCBncmVhdGVyIHViaXF1aXR5IG9mIGFjY2VzcyB0byBndW5zLCBpbmRpdmlkdWFscyB3aG8gb3duIG1vcmUgdGhhbiBvbmUgZ3VuLCBhbmQgdGh1cyBwb3RlbnRpYWxseSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIG1vcmUgc2hvb3RpbmdzIGFuZCBzdWJzZXF1ZW50bHkgZGVhdGhzLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNob290ZCA8LSBtc2hvb3QgJT4lCiAgZ3JvdXBfYnkoc3RhdGVmdWxsKSAlPiUKICBzdW1tYXJpc2UoZ3Vub3duPW1lYW4oUGVyY0hhdkd1bnMpLCB0b3RhbHZpY3RpbXM9c3VtKHRvdGFsdmljdGltcyksIGluY2lkZW5jZT1uKCkpCgpzdW1tYXJ5KGxtKGluY2lkZW5jZSB+IGd1bm93biwgZGF0YSA9IHNob290ZCkpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKIyMqKkZhdGFsaXRpZXMgYW5kIE51bWJlciBvZiBHdW5zIFVzZWQgLSBBIENvbXBsZXRlIFBvb2xpbmcgTW9kZWwqKgoKVGhpcyBpbmRpdmlkdWFsIGFuYWx5c2lzL2NvbXBsZXRlIHBvb2xpbmcgbW9kZWwgZXhhbWluZXMgdGhlIG51bWJlciBvZiBndW5zIHVzZWQgZHVyaW5nIGFuIGluY2lkZW5jZSBhbmQgd2hldGhlciB0aGlzIGluZmx1ZW5jZXMgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzLiBUaGUgbW9kZWwncyByZXN1bHRzIGluZGljYXRlIGEgaGlnaGx5IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gZmF0YWxpdGllcyB0aGUgbW9yZSBndW5zIHVzZWQgYnkgYSBzaG9vdGVyIGR1cmluZyBhbiBpbmNpZGVudC4gCgpgYGB7cn0KY3Bvb2xpbmcgPC0gbG0odG90YWx2aWN0aW1zIH4gdG90YWxndW5zLCBkYXRhPW1zaG9vdCkKc3VtbWFyeShjcG9vbGluZykKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjKipGYXRhbGl0aWVzIGFuZCBOdW1iZXIgb2YgR3VucyAtIEEgTm8gUG9vbGluZyBNb2RlbCoqCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjIyoqSW50ZXJjZXB0KioKCldoZW4gY29uc2lkZXJpbmcgdGhlIGludGVyY2VwdCBtb2RlbCwgd2hpY2ggaXMgYW4gaW5kaWNhdGlvbiBvZiBmYXRhbGl0aWVzLCB3ZSBzZWUgdGhhdCBtb3N0IGludGVyY2VwdHMgcmFuZ2UgYmV0d2VlbiAwLTE4IHdoZW4gdGhlcmUgaXMgbm8gY29uc2lkZXJhdGlvbiBvZiBudW1iZXIgb2YgZ3VucyB1c2VkLgoKYGBge3IsIGZpZy5oZWlnaHQ9MS41LCBmaWcud2lkdGg9MiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGNvZWYgPC0gbXNob290ICU+JQogIGdyb3VwX2J5KHN0YXRlZnVsbCkgJT4lCiAgZG8obW9kPWxtKHRvdGFsdmljdGltcyB+IHRvdGFsZ3VucywgZGF0YT0uKSkKY29lZiA8LSBkY29lZiAlPiUgZG8oZGF0YS5mcmFtZShpbnRjPWNvZWYoLiRtb2QpWzFdKSkKZ2dwbG90KGNvZWYsIGFlcyh4PWludGMpKSArIGdlb21faGlzdG9ncmFtKGZpbGw9ImJsYWNrIikKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjIyoqU2xvcGUqKgoKT3VyIHNsb3BlIG1vZGVscyBzaG93IGEgY29uc2lzdGVudGx5IHBvc2l0aXZlIGltcGFjdCwgc3VnZ2VzdGluZyB0aGF0IHRoZSBtb3JlIGd1bnMgdXNlZCBkdXJpbmcgYSBwYXJ0aWN1bGFyIHNob290aW5nIHJlc3VsdGVkIGluIG1vcmUgZmF0YWxpdGllcy4KCmBgYHtyLCBmaWcuaGVpZ2h0PTEuNSwgZmlnLndpZHRoPTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRjb2VmMSA8LSBtc2hvb3QgJT4lCiAgZ3JvdXBfYnkoc3RhdGVmdWxsKSAlPiUKICBkbyhtb2Q9bG0odG90YWx2aWN0aW1zIH4gdG90YWxndW5zLCBkYXRhPS4pKQpjb2VmMSA8LSBkY29lZjEgJT4lIGRvKGRhdGEuZnJhbWUodG90YWxndW5jID0gY29lZiguJG1vZClbMl0pKQpnZ3Bsb3QgKGNvZWYxLCBhZXMoeD10b3RhbGd1bmMpKSArIGdlb21faGlzdG9ncmFtKGZpbGw9ImRhcmtyZWQiKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiMjTXVsdGlsZXZlbCBNb2RlbGluZwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKIyMqKkZhdGFsaXRpZXMgJiBOdW1iZXIgb2YgR3VucyBieSBTdGF0ZSAtIEEgUmFuZG9tIEludGVyY2VwdCBNb2RlbCoqCgpgYGB7cn0KbTFfbG1lIDwtIGxtZSh0b3RhbHZpY3RpbXN+dG90YWxndW5zLCBkYXRhPW1zaG9vdCwgcmFuZG9tID0gfjF8c3RhdGVmdWxsLCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtMV9sbWUpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKIyMqKkZhdGFsaXRpZXMgYW5kIE51bWJlciBvZiBHdW5zIGJ5IFN0YXRlIC0gQSBSYW5kb20gU2xvcGUgTW9kZWwqKgoKYGBge3J9Cm0yX2xtZSA8LSBsbWUodG90YWx2aWN0aW1zfnRvdGFsZ3VucywgZGF0YT1tc2hvb3QsIHJhbmRvbSA9IH50b3RhbGd1bnN8c3RhdGVmdWxsLCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtMl9sbWUpCmBgYAoKIyMjTW9kZWwocykgU3VtbWFyeQoKV2hlbiBhY2NvdW50aW5nIGZvciB0aGUgdmFyaWF0aW9ucy9kaWZmZXJlbmNlcyBiZXR3ZWVuIHN0YXRlcyB3ZSBjb250aW51ZSB0byBzZWUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG51bWJlciBvZiBndW5zIHVzZWQgYW5kIGZhdGFsaXRpZXMsIHdoaWNoIHN0aWxsIGluY3JlYXNlIGFzIHRoZSBudW1iZXIgb2YgZ3VucyB1c2VkIHNpbWlsYXJseSBpbmNyZWFzZXMuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIyoqSW50cm9kdWNpbmcgQ292YXJpYXRlIC0gVGhlIEVmZmVjdCBvZiBNZW50YWwgSWxsbmVzcyoqCgpUaGUgbW9kZWwgbWFpbnRhaW5zIGl0cyBzaWduaWZpY2FuY2UgaW4gcmVnYXJkcyB0byBudW1iZXIgb2YgZ3VucyB1c2VkLCBhbmQgdGhlIG1vZGVsIGFsc28gcmV2ZWFsIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBhbmQgYW4gaW5jcmVhc2UgaW4gZmF0YWxpdGllcyB3aGVuIGNvbnNpZGVyaW5nIG1lbnRhbCBpbGxuZXNzIGFtb25nc3QgY29udmljdGVkIG1hc3Mgc2hvb3RlcnMuCgpgYGB7cn0KbTNfbG1lIDwtIGxtZSh0b3RhbHZpY3RpbXMgfiB0b3RhbGd1bnMrbWVudGFsaWxsLCBkYXRhPW1zaG9vdCwgcmFuZG9tID0gfnRvdGFsZ3Vuc3xzdGF0ZWZ1bGwsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG0zX2xtZSkKYGBgCgojIyoqTWVudGFsIElsbG5lc3MgYW5kIEFjY2VzcyB0byBNYW55IEd1bnMgYnkgU3RhdGUgLSBBbiBJbnRlcmFjdGlvbiBNb2RlbCoqCgpXaGVuIGludGVyYWN0aW5nIG51bWJlciBvZiBndW5zIHVzZWQgYW5kIG1lbnRhbCBpbGxuZXNzIC0tIGRvIHNob290ZXJzIHdpdGggYSBoaXN0b3J5IG9mIG1lbnRhbCBoaXN0b3J5IGtpbGwgbW9yZSB3aXRoIG1vcmUgZ3VucyAtLSB0aGUgbW9kZWwgaXMgd2Vha2VuZWQgYW5kIGxvc2VzIHNpZ25pZmljYW5jZS4gVGhlcmUgbWF5IGJlIG5vIGludGVyYWN0aXZlIGVmZmVjdC4gCgpgYGB7cn0KbTRfbG1lIDwtIGxtZSh0b3RhbHZpY3RpbXMgfiB0b3RhbGd1bnMqbWVudGFsaWxsLCBkYXRhPW1zaG9vdCwgcmFuZG9tID0gfnRvdGFsZ3Vuc3xzdGF0ZWZ1bGwsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG00X2xtZSkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgojIyoqTW9kZWwgU2VsZWN0aW9uKioKCk91ciB0aGlyZCBtdWx0aWxldmVsIG1vZGVsIHByb3ZlcyB0byBiZSB0aGUgYmVzdCBmaXQgd2hlbiBtb2RlbHMgYXJlIGdyb3VwZWQgYW5kIHZpZXdlZCBmb3IgdGhlIGxvd2VzdCBBSUMgdmFsdWUuIApgYGB7cn0KQUlDKGNwb29saW5nLCBtMV9sbWUsIG0yX2xtZSwgbTNfbG1lLCBtNF9sbWUpCmBgYAoKIyMqKkJlc3QgRml0IE1vZGVscyoqCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSJhc2lzIn0KaHRtbHJlZyhsaXN0KG0yX2xtZSwgbTNfbG1lLCBtNF9sbWUpKQpgYGAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjKipJbiBDb25jbHVzaW9uKioKCkEgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiZXN0IGZpdCBtb2RlbCBpbmRpY2F0ZXMgdGhhdCBtb3JlIGd1bnMgdXNlZCBtZWFucyBtb3JlIGZhdGFsaXRpZXMuIEFkZGl0aW9uYWxseSwgaWYgYSBzaG9vdGVyIGlzIHJlcG9ydGVkIHRvIGhhdmUgYSBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzIHRoZXkgYXJlIGFsc28gbGlrZWxpZXIgdG8ga2lsbCBtb3JlIHRoYW4gdGhvc2Ugd2l0aCBubyBwcmlvciBoaXN0b3J5LiBUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgdHdvIHNob3dlZCBubyBzaWduaWZpY2FudCBlZmZlY3QuIAoKYGBge3IsIGZpZy5oZWlnaHQ9MS41LCBmaWcud2lkdGg9MiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdmlzcmVnKG0zX2xtZSkKYGBgCgojIyMjI05vdGUKSXQgd2FzIG15IGludGVudGlvbiB0byBhbHNvIGluY2x1ZGUgdGhlIGNvdmFyaWF0ZSBpbiB0aGUgcG9vbGluZy9ubyBwb29saW5nIG1vZGVscyBidXQgZW5jb3VudGVyZWQgYW4gZXJyb3IgbGFzdCBtaW51dGUgd2hlbiBhZGp1c3RpbmcgdGhlIGxtIHRvIGFjY291bnQgZm9yIHRoZSBjb3ZhcmlhdGUgaW4gdGhlIHNsb3Blcy4gSSB0cmllZCB0byB1bmRlcnN0YW5kIGhvdyB0byBmaXggaXQgYnV0IGNvdWxkbid0LiBNeSBtaXN0YWtlLiAgCg==