This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(haven)
library(tidyverse)
library(dplyr)
library(readxl)
NCI_17_18 <- read_excel("NCI 17-18.xlsx")
View(NCI_17_18)
library(readxl)
state_disprov <- read_excel("state disprov.xlsx")
View(state_disprov)
NCI_merge <- left_join(NCI_17_18, state_disprov, by = "STATENUM")
glimpse(NCI_merge)
NCI.select <- NCI_merge %>%
  select(.,
         STATENUM,
         STATENAM,
         DIS_PROV,
         VOTE15,
         AGE,
         RACE15_AMERIN,
         RACE15_ASIAN,
         RACE15_BLACK,
         RACE15_DK,
         RACE15_HAWAII,
         RACE15_WHITE,
         RACE15_LATINO,
         RACE15_OTHER,
         LGLSTAT15,
         LEVELMR08,
         EXPRESS15,
         MOBILITY08,
         GENDER)
NCI.clean <- NCI.select %>%
  filter(!(LEVELMR08 %in%
             c("5", "6", "98")))%>%
  filter(!(VOTE15 %in%
             c("99")))%>%
  filter(!(EXPRESS15 %in%
             c("99")))%>%
  filter(!(MOBILITY08 %in%
             c("99")))%>%
  filter(!(LGLSTAT15 %in%
             c("99")))%>%
  mutate(., 
         vote.re = case_when(
           VOTE15 == 1 ~ 0,
           VOTE15 == 2 ~ 1,
           VOTE15 == 3 ~ 1
         )) %>%
  mutate(.,
         mobility.re = case_when(
           MOBILITY08 == 1 ~ 0,
           MOBILITY08 == 2 ~ 1,
           MOBILITY08 == 3 ~ 1
         ))  %>%
  mutate(.,
         communication = case_when(
           EXPRESS15 == 1 ~ 0,
           EXPRESS15 == 2 ~ 1,
           EXPRESS15 == 3 ~ 1,
           EXPRESS15 == 4 ~ 1,
           EXPRESS15 == 5 ~ 1
         )) %>%
  mutate (.,
          guardian = case_when(
            LGLSTAT15 == 1 ~ 0,
            LGLSTAT15 == 2 ~ 1,
            LGLSTAT15 == 3 ~ 1,
            LGLSTAT15 == 4 ~ 1
          )) %>%
  mutate(.,
         white = case_when(
           RACE15_WHITE == 1 ~ 0,
           RACE15_WHITE == 2 ~ 1
         ))  %>%
  mutate(.,
         black = case_when(
           RACE15_BLACK == 1 ~ 0,
           RACE15_BLACK == 2 ~ 1
         ))  %>%
 mutate(.,
         latino = case_when(
           RACE15_LATINO == 1 ~ 0,
           RACE15_LATINO == 2 ~ 1
         )) %>%
   mutate(.,
         other = case_when(
           RACE15_AMERIN == 1 ~ 0,
           RACE15_AMERIN == 2 ~ 1,
           RACE15_ASIAN == 1 ~ 0,
           RACE15_ASIAN == 2 ~ 1,
           RACE15_HAWAII == 1 ~ 0,
           RACE15_HAWAII == 2 ~ 1,
           RACE15_OTHER == 1 ~ 0,
           RACE15_OTHER == 2 ~ 1
         )) %>%
  mutate(.,
         gender.re = case_when(
           GENDER == 1 ~ 0,
           GENDER == 2 ~ 1,
           GENDER == 3 ~ 2
         ))%>%
  mutate(.,
         levelid = as.factor(LEVELMR08))
           
age.cat <- rep(NA,19862)
age.cat[NCI.clean$AGE <= 29] <- 1
age.cat[NCI.clean$AGE >= 30 & NCI.clean$AGE <=44] <- 2
age.cat[NCI.clean$AGE >=45 & NCI.clean$AGE <=59] <- 3
age.cat[NCI.clean$AGE >=60] <- 4
NCI.clean$age.cat <- as.factor(age.cat)
glimpse(NCI.clean)
``
table(NCI.clean$white)
table(NCI.clean$STATENAM)
table(NCI.clean$gender.re)
table(NCI.clean$age.cat)
table(NCI.clean$guardian)
table(NCI.clean$levelid)
table(NCI.clean$communication)
table(NCI.clean$mobility.re)
table(NCI.clean$DIS_PROV)
table(NCI.clean$black)
table(NCI.clean$latino)
table(NCI.clean$other)
table(NCI.clean$vote.re)
library(lme4)
model.null <- glmer(vote.re ~ (1|STATENUM), family = binomial, data = NCI.clean)
summary(model.null)
model.2 <- glmer(vote.re ~ age.cat + levelid + communication + mobility.re + gender.re + other + black +  white + latino + guardian+ (1|STATENUM), family = binomial, data = NCI.clean)
summary(model.2)
model.3 <- glmer(vote.re ~ age.cat + levelid + communication + mobility.re + gender.re + other + black +  white + latino + guardian + DIS_PROV + (1|STATENUM), family = binomial, data = NCI.clean)
summary(model.3)
ICC.null <- 0.3244 / (0.3244 + (pi^2/3))
ICC.null
library(janitor)
tabyl(NCI.clean$vote.re, sort=FALSE)
tabyl(NCI.clean$white, sort=FALSE)
tabyl(NCI.clean$black, sort=FALSE)
tabyl(NCI.clean$latino, sort=FALSE)
tabyl(NCI.clean$other, sort=FALSE)
tabyl(NCI.clean$age.cat, sort=FALSE)
tabyl(NCI.clean$gender.re, sort=FALSE)
tabyl(NCI.clean$mobility.re, sort=FALSE)
tabyl(NCI.clean$communication, sort=FALSE)
tabyl(NCI.clean$LEVELMR08, sort=FALSE)
tabyl(NCI.clean$guardian, sort=FALSE)
tabyl(NCI.clean$DIS_PROV, sort=FALSE)
tabyl(NCI.clean$STATENAM, sort=FALSE)
library(modelsummary)
library(broom.mixed)
models <- list(model.null, model.2, model.3)
modelsummary(models, output = 'default')
model.4 <- glmer(vote.re ~ age.cat + levelid + communication + mobility.re + gender.re + other + black +  white + latino + guardian + DIS_PROV + (guardian|STATENUM), family = binomial, data = NCI.clean)
summary(model.4)
model.5 <- glmer(vote.re ~ age.cat + levelid + communication + mobility.re + gender.re + other + black +  white + latino + guardian + DIS_PROV + (levelid|STATENUM), family = binomial, data = NCI.clean)
summary(model.5)
model.6 <- glmer(vote.re ~ age.cat + levelid + communication + mobility.re + gender.re + other + black +  white + latino + guardian + DIS_PROV + guardian:DIS_PROV + (1|STATENUM), family = binomial, data = NCI.clean)
summary(model.6)
model.7 <- glmer(vote.re ~ age.cat + levelid + communication + mobility.re + gender.re + other + black +  white + latino + guardian + DIS_PROV + levelid:DIS_PROV + (1|STATENUM), family = binomial, data = NCI.clean)
summary(model.7)
models2 <- list(model.7)
modelsummary(models2, output = 'default')
library(ggplot2)
library(jtools)
help("cat_plot")
library(interactions)
interact_plot(model.7, pred = DIS_PROV, modx = levelid)
table(NCI.clean$STATENAM)
#odds ratios and probabilities for model 2--probably not useful#
age2.odds <- exp(.374891)
age2.odds
age2.prob <- (1.454833)/(1+1.454833)
age2.prob
age3.odds <- exp(.30341)
age3.prob <- exp(.30341)/(1+exp(.30341))
age3.odds
age3.prob
age4.odds <-exp(.19816)
age4.prob <- exp(.19816)+(1+exp(.19816))
age4.odds
age4.prob
id2.odds <- exp(-.83680)
id2.prob <- exp(-.8368)/(1+exp(-.8368))
id2.odds
id2.prob
id3.odds <- exp(-1.56064)
id3.prob <- exp(-1.56064)/(1+exp(-1.56064))
id3.odds
id3.prob
id4.odds <- exp(-2.04651)
id4.prob <- exp(-2.04651)/(1+exp(-2.04651))
id4.odds
id4.prob
black.odds <- exp(.63635)
black.prob <- exp(.63635)/(1+exp(.63635))
black.odds
black.prob
white.odds <- exp(.46405)
white.prob <- exp(.46405)/(1+exp(.46405))
white.odds
white.prob
guardian.odds <- exp(-.45986)
guardian.prob <- exp(-.45986)/(1+exp(-.45986))
guardian.odds
guardian.prob
#model 7 disenfranchisement provision odds and probability#
dis.odds <- exp(-0.30423)
dis.prob <- exp(-0.30423)/(1+exp(-0.30423))
dis.odds
dis.prob
#model 7 interaction id moderate (2)#
id2.dis.odds <-exp(-.7912+-.65939+-.30423+-.25213)
id2.dis.odds
id2.dis.prob <- 0.134398/(1+0.134398)
id2.dis.prob
#model 7 interaction id severe (3)#
id3.dis.odds <- exp(-.7912+-1.25549 + -.30423 + -.45732)
id3.dis.odds
id3.dis.prob <- 0.06031105/(1+0.06031105)
id3.dis.prob
#model 7 interaction id profound (4)#
id4.dis.odds <- exp(-.7912+-1.4816 +-.30423 +-.96945)
id4.dis.odds
id4.dis.prob <- 0.02882593/(1+0.02882593)
id4.dis.prob
#model 7 main effect id moderate (2)#
model7id2.odds <-exp(-.7912+-.65393)
model7id2.odds
model7id2.prob <- 0.2357154/(1+0.2357154)
model7id2.prob
#model 7 main effect id severe (3)#
model7id3.odds <-exp(-.7912+-1.25549)
model7id3.odds

model2id3.prob <- 0.1317525/(1+0.1317525)
model2id3.prob
#model 7 main effect id profound (4)#
model7id4.odds <- exp(-.7912 + -1.48416)
model7id4.odds
model7id4.prob <- 0.1027599/(1+0.1027599)
#model 7 main effect ID mild (1)
model7id1.odds <- exp(-.7912)
model7id1.odds
model7id1.prob <- 0.4533005/(1+0.4533005)
model7id1.prob
#model 7 id mild (1) and disenfranchisement#
model7id1.dis.odds <-exp(-.7912+-.30423)
model7id1.dis.odds
model7id1.dis.prob <- 0.3343958/(1+0.3343958)
model7id1.dis.prob

```

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIk5DSSBWb3RpbmciDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KTkNJXzE3XzE4IDwtIHJlYWRfZXhjZWwoIk5DSSAxNy0xOC54bHN4IikNClZpZXcoTkNJXzE3XzE4KQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0Kc3RhdGVfZGlzcHJvdiA8LSByZWFkX2V4Y2VsKCJzdGF0ZSBkaXNwcm92Lnhsc3giKQ0KVmlldyhzdGF0ZV9kaXNwcm92KQ0KYGBgDQoNCmBgYHtyfQ0KTkNJX21lcmdlIDwtIGxlZnRfam9pbihOQ0lfMTdfMTgsIHN0YXRlX2Rpc3Byb3YsIGJ5ID0gIlNUQVRFTlVNIikNCmdsaW1wc2UoTkNJX21lcmdlKQ0KYGBgDQpgYGB7cn0NCk5DSS5zZWxlY3QgPC0gTkNJX21lcmdlICU+JQ0KICBzZWxlY3QoLiwNCiAgICAgICAgIFNUQVRFTlVNLA0KICAgICAgICAgU1RBVEVOQU0sDQogICAgICAgICBESVNfUFJPViwNCiAgICAgICAgIFZPVEUxNSwNCiAgICAgICAgIEFHRSwNCiAgICAgICAgIFJBQ0UxNV9BTUVSSU4sDQogICAgICAgICBSQUNFMTVfQVNJQU4sDQogICAgICAgICBSQUNFMTVfQkxBQ0ssDQogICAgICAgICBSQUNFMTVfREssDQogICAgICAgICBSQUNFMTVfSEFXQUlJLA0KICAgICAgICAgUkFDRTE1X1dISVRFLA0KICAgICAgICAgUkFDRTE1X0xBVElOTywNCiAgICAgICAgIFJBQ0UxNV9PVEhFUiwNCiAgICAgICAgIExHTFNUQVQxNSwNCiAgICAgICAgIExFVkVMTVIwOCwNCiAgICAgICAgIEVYUFJFU1MxNSwNCiAgICAgICAgIE1PQklMSVRZMDgsDQogICAgICAgICBHRU5ERVIpDQpgYGANCmBgYHtyfQ0KTkNJLmNsZWFuIDwtIE5DSS5zZWxlY3QgJT4lDQogIGZpbHRlcighKExFVkVMTVIwOCAlaW4lDQogICAgICAgICAgICAgYygiNSIsICI2IiwgIjk4IikpKSU+JQ0KICBmaWx0ZXIoIShWT1RFMTUgJWluJQ0KICAgICAgICAgICAgIGMoIjk5IikpKSU+JQ0KICBmaWx0ZXIoIShFWFBSRVNTMTUgJWluJQ0KICAgICAgICAgICAgIGMoIjk5IikpKSU+JQ0KICBmaWx0ZXIoIShNT0JJTElUWTA4ICVpbiUNCiAgICAgICAgICAgICBjKCI5OSIpKSklPiUNCiAgZmlsdGVyKCEoTEdMU1RBVDE1ICVpbiUNCiAgICAgICAgICAgICBjKCI5OSIpKSklPiUNCiAgbXV0YXRlKC4sIA0KICAgICAgICAgdm90ZS5yZSA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgVk9URTE1ID09IDEgfiAwLA0KICAgICAgICAgICBWT1RFMTUgPT0gMiB+IDEsDQogICAgICAgICAgIFZPVEUxNSA9PSAzIH4gMQ0KICAgICAgICAgKSkgJT4lDQogIG11dGF0ZSguLA0KICAgICAgICAgbW9iaWxpdHkucmUgPSBjYXNlX3doZW4oDQogICAgICAgICAgIE1PQklMSVRZMDggPT0gMSB+IDAsDQogICAgICAgICAgIE1PQklMSVRZMDggPT0gMiB+IDEsDQogICAgICAgICAgIE1PQklMSVRZMDggPT0gMyB+IDENCiAgICAgICAgICkpICAlPiUNCiAgbXV0YXRlKC4sDQogICAgICAgICBjb21tdW5pY2F0aW9uID0gY2FzZV93aGVuKA0KICAgICAgICAgICBFWFBSRVNTMTUgPT0gMSB+IDAsDQogICAgICAgICAgIEVYUFJFU1MxNSA9PSAyIH4gMSwNCiAgICAgICAgICAgRVhQUkVTUzE1ID09IDMgfiAxLA0KICAgICAgICAgICBFWFBSRVNTMTUgPT0gNCB+IDEsDQogICAgICAgICAgIEVYUFJFU1MxNSA9PSA1IH4gMQ0KICAgICAgICAgKSkgJT4lDQogIG11dGF0ZSAoLiwNCiAgICAgICAgICBndWFyZGlhbiA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgIExHTFNUQVQxNSA9PSAxIH4gMCwNCiAgICAgICAgICAgIExHTFNUQVQxNSA9PSAyIH4gMSwNCiAgICAgICAgICAgIExHTFNUQVQxNSA9PSAzIH4gMSwNCiAgICAgICAgICAgIExHTFNUQVQxNSA9PSA0IH4gMQ0KICAgICAgICAgICkpICU+JQ0KICBtdXRhdGUoLiwNCiAgICAgICAgIHdoaXRlID0gY2FzZV93aGVuKA0KICAgICAgICAgICBSQUNFMTVfV0hJVEUgPT0gMSB+IDAsDQogICAgICAgICAgIFJBQ0UxNV9XSElURSA9PSAyIH4gMQ0KICAgICAgICAgKSkgICU+JQ0KICBtdXRhdGUoLiwNCiAgICAgICAgIGJsYWNrID0gY2FzZV93aGVuKA0KICAgICAgICAgICBSQUNFMTVfQkxBQ0sgPT0gMSB+IDAsDQogICAgICAgICAgIFJBQ0UxNV9CTEFDSyA9PSAyIH4gMQ0KICAgICAgICAgKSkgICU+JQ0KIG11dGF0ZSguLA0KICAgICAgICAgbGF0aW5vID0gY2FzZV93aGVuKA0KICAgICAgICAgICBSQUNFMTVfTEFUSU5PID09IDEgfiAwLA0KICAgICAgICAgICBSQUNFMTVfTEFUSU5PID09IDIgfiAxDQogICAgICAgICApKSAlPiUNCiAgIG11dGF0ZSguLA0KICAgICAgICAgb3RoZXIgPSBjYXNlX3doZW4oDQogICAgICAgICAgIFJBQ0UxNV9BTUVSSU4gPT0gMSB+IDAsDQogICAgICAgICAgIFJBQ0UxNV9BTUVSSU4gPT0gMiB+IDEsDQogICAgICAgICAgIFJBQ0UxNV9BU0lBTiA9PSAxIH4gMCwNCiAgICAgICAgICAgUkFDRTE1X0FTSUFOID09IDIgfiAxLA0KICAgICAgICAgICBSQUNFMTVfSEFXQUlJID09IDEgfiAwLA0KICAgICAgICAgICBSQUNFMTVfSEFXQUlJID09IDIgfiAxLA0KICAgICAgICAgICBSQUNFMTVfT1RIRVIgPT0gMSB+IDAsDQogICAgICAgICAgIFJBQ0UxNV9PVEhFUiA9PSAyIH4gMQ0KICAgICAgICAgKSkgJT4lDQogIG11dGF0ZSguLA0KICAgICAgICAgZ2VuZGVyLnJlID0gY2FzZV93aGVuKA0KICAgICAgICAgICBHRU5ERVIgPT0gMSB+IDAsDQogICAgICAgICAgIEdFTkRFUiA9PSAyIH4gMSwNCiAgICAgICAgICAgR0VOREVSID09IDMgfiAyDQogICAgICAgICApKSU+JQ0KICBtdXRhdGUoLiwNCiAgICAgICAgIGxldmVsaWQgPSBhcy5mYWN0b3IoTEVWRUxNUjA4KSkNCiAgICAgICAgICAgDQphZ2UuY2F0IDwtIHJlcChOQSwxOTg2MikNCmFnZS5jYXRbTkNJLmNsZWFuJEFHRSA8PSAyOV0gPC0gMQ0KYWdlLmNhdFtOQ0kuY2xlYW4kQUdFID49IDMwICYgTkNJLmNsZWFuJEFHRSA8PTQ0XSA8LSAyDQphZ2UuY2F0W05DSS5jbGVhbiRBR0UgPj00NSAmIE5DSS5jbGVhbiRBR0UgPD01OV0gPC0gMw0KYWdlLmNhdFtOQ0kuY2xlYW4kQUdFID49NjBdIDwtIDQNCk5DSS5jbGVhbiRhZ2UuY2F0IDwtIGFzLmZhY3RvcihhZ2UuY2F0KQ0KYGBgDQoNCg0KYGBge3J9DQpnbGltcHNlKE5DSS5jbGVhbikNCmBgYA0KDQpgYGANCmBgDQpgYGANCmBgYHtyfQ0KdGFibGUoTkNJLmNsZWFuJHdoaXRlKQ0KYGBgDQpgYGB7cn0NCnRhYmxlKE5DSS5jbGVhbiRTVEFURU5BTSkNCmBgYA0KYGBge3J9DQp0YWJsZShOQ0kuY2xlYW4kZ2VuZGVyLnJlKQ0KYGBgDQpgYGB7cn0NCnRhYmxlKE5DSS5jbGVhbiRhZ2UuY2F0KQ0KYGBgDQpgYGB7cn0NCnRhYmxlKE5DSS5jbGVhbiRndWFyZGlhbikNCmBgYA0KYGBge3J9DQp0YWJsZShOQ0kuY2xlYW4kbGV2ZWxpZCkNCmBgYA0KYGBge3J9DQp0YWJsZShOQ0kuY2xlYW4kY29tbXVuaWNhdGlvbikNCmBgYA0KYGBge3J9DQp0YWJsZShOQ0kuY2xlYW4kbW9iaWxpdHkucmUpDQpgYGANCmBgYHtyfQ0KdGFibGUoTkNJLmNsZWFuJERJU19QUk9WKQ0KYGBgDQpgYGB7cn0NCnRhYmxlKE5DSS5jbGVhbiRibGFjaykNCmBgYA0KYGBge3J9DQp0YWJsZShOQ0kuY2xlYW4kbGF0aW5vKQ0KYGBgDQpgYGB7cn0NCnRhYmxlKE5DSS5jbGVhbiRvdGhlcikNCmBgYA0KYGBge3J9DQp0YWJsZShOQ0kuY2xlYW4kdm90ZS5yZSkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGxtZTQpDQptb2RlbC5udWxsIDwtIGdsbWVyKHZvdGUucmUgfiAoMXxTVEFURU5VTSksIGZhbWlseSA9IGJpbm9taWFsLCBkYXRhID0gTkNJLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC5udWxsKQ0KYGBgDQpgYGB7cn0NCm1vZGVsLjIgPC0gZ2xtZXIodm90ZS5yZSB+IGFnZS5jYXQgKyBsZXZlbGlkICsgY29tbXVuaWNhdGlvbiArIG1vYmlsaXR5LnJlICsgZ2VuZGVyLnJlICsgb3RoZXIgKyBibGFjayArICB3aGl0ZSArIGxhdGlubyArIGd1YXJkaWFuKyAoMXxTVEFURU5VTSksIGZhbWlseSA9IGJpbm9taWFsLCBkYXRhID0gTkNJLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC4yKQ0KYGBgDQpgYGB7cn0NCm1vZGVsLjMgPC0gZ2xtZXIodm90ZS5yZSB+IGFnZS5jYXQgKyBsZXZlbGlkICsgY29tbXVuaWNhdGlvbiArIG1vYmlsaXR5LnJlICsgZ2VuZGVyLnJlICsgb3RoZXIgKyBibGFjayArICB3aGl0ZSArIGxhdGlubyArIGd1YXJkaWFuICsgRElTX1BST1YgKyAoMXxTVEFURU5VTSksIGZhbWlseSA9IGJpbm9taWFsLCBkYXRhID0gTkNJLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC4zKQ0KYGBgDQpgYGB7cn0NCklDQy5udWxsIDwtIDAuMzI0NCAvICgwLjMyNDQgKyAocGleMi8zKSkNCklDQy5udWxsDQpgYGANCmBgYHtyfQ0KbGlicmFyeShqYW5pdG9yKQ0KYGBgDQpgYGB7cn0NCnRhYnlsKE5DSS5jbGVhbiR2b3RlLnJlLCBzb3J0PUZBTFNFKQ0KYGBgDQoNCmBgYHtyfQ0KdGFieWwoTkNJLmNsZWFuJHdoaXRlLCBzb3J0PUZBTFNFKQ0KYGBgDQpgYGB7cn0NCnRhYnlsKE5DSS5jbGVhbiRibGFjaywgc29ydD1GQUxTRSkNCmBgYA0KYGBge3J9DQp0YWJ5bChOQ0kuY2xlYW4kbGF0aW5vLCBzb3J0PUZBTFNFKQ0KYGBgDQpgYGB7cn0NCnRhYnlsKE5DSS5jbGVhbiRvdGhlciwgc29ydD1GQUxTRSkNCmBgYA0KYGBge3J9DQp0YWJ5bChOQ0kuY2xlYW4kYWdlLmNhdCwgc29ydD1GQUxTRSkNCmBgYA0KYGBge3J9DQp0YWJ5bChOQ0kuY2xlYW4kZ2VuZGVyLnJlLCBzb3J0PUZBTFNFKQ0KYGBgDQpgYGB7cn0NCnRhYnlsKE5DSS5jbGVhbiRtb2JpbGl0eS5yZSwgc29ydD1GQUxTRSkNCmBgYA0KYGBge3J9DQp0YWJ5bChOQ0kuY2xlYW4kY29tbXVuaWNhdGlvbiwgc29ydD1GQUxTRSkNCmBgYA0KYGBge3J9DQp0YWJ5bChOQ0kuY2xlYW4kTEVWRUxNUjA4LCBzb3J0PUZBTFNFKQ0KYGBgDQpgYGB7cn0NCnRhYnlsKE5DSS5jbGVhbiRndWFyZGlhbiwgc29ydD1GQUxTRSkNCmBgYA0KYGBge3J9DQp0YWJ5bChOQ0kuY2xlYW4kRElTX1BST1YsIHNvcnQ9RkFMU0UpDQpgYGANCmBgYHtyfQ0KdGFieWwoTkNJLmNsZWFuJFNUQVRFTkFNLCBzb3J0PUZBTFNFKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkobW9kZWxzdW1tYXJ5KQ0KbGlicmFyeShicm9vbS5taXhlZCkNCmBgYA0KYGBge3J9DQptb2RlbHMgPC0gbGlzdChtb2RlbC5udWxsLCBtb2RlbC4yLCBtb2RlbC4zKQ0KbW9kZWxzdW1tYXJ5KG1vZGVscywgb3V0cHV0ID0gJ2RlZmF1bHQnKQ0KYGBgDQpgYGB7cn0NCm1vZGVsLjQgPC0gZ2xtZXIodm90ZS5yZSB+IGFnZS5jYXQgKyBsZXZlbGlkICsgY29tbXVuaWNhdGlvbiArIG1vYmlsaXR5LnJlICsgZ2VuZGVyLnJlICsgb3RoZXIgKyBibGFjayArICB3aGl0ZSArIGxhdGlubyArIGd1YXJkaWFuICsgRElTX1BST1YgKyAoZ3VhcmRpYW58U1RBVEVOVU0pLCBmYW1pbHkgPSBiaW5vbWlhbCwgZGF0YSA9IE5DSS5jbGVhbikNCnN1bW1hcnkobW9kZWwuNCkNCmBgYA0KYGBge3J9DQptb2RlbC41IDwtIGdsbWVyKHZvdGUucmUgfiBhZ2UuY2F0ICsgbGV2ZWxpZCArIGNvbW11bmljYXRpb24gKyBtb2JpbGl0eS5yZSArIGdlbmRlci5yZSArIG90aGVyICsgYmxhY2sgKyAgd2hpdGUgKyBsYXRpbm8gKyBndWFyZGlhbiArIERJU19QUk9WICsgKGxldmVsaWR8U1RBVEVOVU0pLCBmYW1pbHkgPSBiaW5vbWlhbCwgZGF0YSA9IE5DSS5jbGVhbikNCnN1bW1hcnkobW9kZWwuNSkNCmBgYA0KYGBge3J9DQptb2RlbC42IDwtIGdsbWVyKHZvdGUucmUgfiBhZ2UuY2F0ICsgbGV2ZWxpZCArIGNvbW11bmljYXRpb24gKyBtb2JpbGl0eS5yZSArIGdlbmRlci5yZSArIG90aGVyICsgYmxhY2sgKyAgd2hpdGUgKyBsYXRpbm8gKyBndWFyZGlhbiArIERJU19QUk9WICsgZ3VhcmRpYW46RElTX1BST1YgKyAoMXxTVEFURU5VTSksIGZhbWlseSA9IGJpbm9taWFsLCBkYXRhID0gTkNJLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC42KQ0KYGBgDQpgYGB7cn0NCm1vZGVsLjcgPC0gZ2xtZXIodm90ZS5yZSB+IGFnZS5jYXQgKyBsZXZlbGlkICsgY29tbXVuaWNhdGlvbiArIG1vYmlsaXR5LnJlICsgZ2VuZGVyLnJlICsgb3RoZXIgKyBibGFjayArICB3aGl0ZSArIGxhdGlubyArIGd1YXJkaWFuICsgRElTX1BST1YgKyBsZXZlbGlkOkRJU19QUk9WICsgKDF8U1RBVEVOVU0pLCBmYW1pbHkgPSBiaW5vbWlhbCwgZGF0YSA9IE5DSS5jbGVhbikNCnN1bW1hcnkobW9kZWwuNykNCmBgYA0KYGBge3J9DQptb2RlbHMyIDwtIGxpc3QobW9kZWwuNykNCm1vZGVsc3VtbWFyeShtb2RlbHMyLCBvdXRwdXQgPSAnZGVmYXVsdCcpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoanRvb2xzKQ0KYGBgDQpgYGB7cn0NCmhlbHAoImNhdF9wbG90IikNCmxpYnJhcnkoaW50ZXJhY3Rpb25zKQ0KYGBgDQpgYGB7cn0NCmludGVyYWN0X3Bsb3QobW9kZWwuNywgcHJlZCA9IERJU19QUk9WLCBtb2R4ID0gbGV2ZWxpZCkNCg0KYGBgDQpgYGB7cn0NCnRhYmxlKE5DSS5jbGVhbiRTVEFURU5BTSkNCmBgYA0KYGBge3J9DQojb2RkcyByYXRpb3MgYW5kIHByb2JhYmlsaXRpZXMgZm9yIG1vZGVsIDItLXByb2JhYmx5IG5vdCB1c2VmdWwjDQphZ2UyLm9kZHMgPC0gZXhwKC4zNzQ4OTEpDQphZ2UyLm9kZHMNCmBgYA0KYGBge3J9DQphZ2UyLnByb2IgPC0gKDEuNDU0ODMzKS8oMSsxLjQ1NDgzMykNCmFnZTIucHJvYg0KYGBgDQpgYGB7cn0NCmFnZTMub2RkcyA8LSBleHAoLjMwMzQxKQ0KYWdlMy5wcm9iIDwtIGV4cCguMzAzNDEpLygxK2V4cCguMzAzNDEpKQ0KYWdlMy5vZGRzDQphZ2UzLnByb2INCmBgYA0KYGBge3J9DQphZ2U0Lm9kZHMgPC1leHAoLjE5ODE2KQ0KYWdlNC5wcm9iIDwtIGV4cCguMTk4MTYpKygxK2V4cCguMTk4MTYpKQ0KYWdlNC5vZGRzDQphZ2U0LnByb2INCmBgYA0KYGBge3J9DQppZDIub2RkcyA8LSBleHAoLS44MzY4MCkNCmlkMi5wcm9iIDwtIGV4cCgtLjgzNjgpLygxK2V4cCgtLjgzNjgpKQ0KaWQyLm9kZHMNCmlkMi5wcm9iDQpgYGANCmBgYHtyfQ0KaWQzLm9kZHMgPC0gZXhwKC0xLjU2MDY0KQ0KaWQzLnByb2IgPC0gZXhwKC0xLjU2MDY0KS8oMStleHAoLTEuNTYwNjQpKQ0KaWQzLm9kZHMNCmlkMy5wcm9iDQpgYGANCmBgYHtyfQ0KaWQ0Lm9kZHMgPC0gZXhwKC0yLjA0NjUxKQ0KaWQ0LnByb2IgPC0gZXhwKC0yLjA0NjUxKS8oMStleHAoLTIuMDQ2NTEpKQ0KaWQ0Lm9kZHMNCmlkNC5wcm9iDQpgYGANCmBgYHtyfQ0KYmxhY2sub2RkcyA8LSBleHAoLjYzNjM1KQ0KYmxhY2sucHJvYiA8LSBleHAoLjYzNjM1KS8oMStleHAoLjYzNjM1KSkNCmJsYWNrLm9kZHMNCmJsYWNrLnByb2INCmBgYA0KYGBge3J9DQp3aGl0ZS5vZGRzIDwtIGV4cCguNDY0MDUpDQp3aGl0ZS5wcm9iIDwtIGV4cCguNDY0MDUpLygxK2V4cCguNDY0MDUpKQ0Kd2hpdGUub2Rkcw0Kd2hpdGUucHJvYg0KYGBgDQpgYGB7cn0NCmd1YXJkaWFuLm9kZHMgPC0gZXhwKC0uNDU5ODYpDQpndWFyZGlhbi5wcm9iIDwtIGV4cCgtLjQ1OTg2KS8oMStleHAoLS40NTk4NikpDQpndWFyZGlhbi5vZGRzDQpndWFyZGlhbi5wcm9iDQpgYGANCmBgYHtyfQ0KI21vZGVsIDcgZGlzZW5mcmFuY2hpc2VtZW50IHByb3Zpc2lvbiBvZGRzIGFuZCBwcm9iYWJpbGl0eSMNCmRpcy5vZGRzIDwtIGV4cCgtMC4zMDQyMykNCmRpcy5wcm9iIDwtIGV4cCgtMC4zMDQyMykvKDErZXhwKC0wLjMwNDIzKSkNCmRpcy5vZGRzDQpkaXMucHJvYg0KYGBgDQpgYGB7cn0NCiNtb2RlbCA3IGludGVyYWN0aW9uIGlkIG1vZGVyYXRlICgyKSMNCmlkMi5kaXMub2RkcyA8LWV4cCgtLjc5MTIrLS42NTkzOSstLjMwNDIzKy0uMjUyMTMpDQppZDIuZGlzLm9kZHMNCmBgYA0KYGBge3J9DQppZDIuZGlzLnByb2IgPC0gMC4xMzQzOTgvKDErMC4xMzQzOTgpDQppZDIuZGlzLnByb2INCg0KYGBgDQpgYGB7cn0NCiNtb2RlbCA3IGludGVyYWN0aW9uIGlkIHNldmVyZSAoMykjDQppZDMuZGlzLm9kZHMgPC0gZXhwKC0uNzkxMistMS4yNTU0OSArIC0uMzA0MjMgKyAtLjQ1NzMyKQ0KaWQzLmRpcy5vZGRzDQpgYGANCg0KDQpgYGB7cn0NCmlkMy5kaXMucHJvYiA8LSAwLjA2MDMxMTA1LygxKzAuMDYwMzExMDUpDQppZDMuZGlzLnByb2INCmBgYA0KYGBge3J9DQojbW9kZWwgNyBpbnRlcmFjdGlvbiBpZCBwcm9mb3VuZCAoNCkjDQppZDQuZGlzLm9kZHMgPC0gZXhwKC0uNzkxMistMS40ODE2ICstLjMwNDIzICstLjk2OTQ1KQ0KaWQ0LmRpcy5vZGRzDQpgYGANCmBgYHtyfQ0KaWQ0LmRpcy5wcm9iIDwtIDAuMDI4ODI1OTMvKDErMC4wMjg4MjU5MykNCmlkNC5kaXMucHJvYg0KYGBgDQpgYGB7cn0NCiNtb2RlbCA3IG1haW4gZWZmZWN0IGlkIG1vZGVyYXRlICgyKSMNCm1vZGVsN2lkMi5vZGRzIDwtZXhwKC0uNzkxMistLjY1MzkzKQ0KbW9kZWw3aWQyLm9kZHMNCg0KYGBgDQpgYGB7cn0NCm1vZGVsN2lkMi5wcm9iIDwtIDAuMjM1NzE1NC8oMSswLjIzNTcxNTQpDQptb2RlbDdpZDIucHJvYg0KYGBgDQpgYGB7cn0NCiNtb2RlbCA3IG1haW4gZWZmZWN0IGlkIHNldmVyZSAoMykjDQptb2RlbDdpZDMub2RkcyA8LWV4cCgtLjc5MTIrLTEuMjU1NDkpDQptb2RlbDdpZDMub2Rkcw0KYGBgDQpgYGB7cn0NCg0KbW9kZWwyaWQzLnByb2IgPC0gMC4xMzE3NTI1LygxKzAuMTMxNzUyNSkNCm1vZGVsMmlkMy5wcm9iDQpgYGANCmBgYHtyfQ0KI21vZGVsIDcgbWFpbiBlZmZlY3QgaWQgcHJvZm91bmQgKDQpIw0KbW9kZWw3aWQ0Lm9kZHMgPC0gZXhwKC0uNzkxMiArIC0xLjQ4NDE2KQ0KbW9kZWw3aWQ0Lm9kZHMNCmBgYA0KYGBge3J9DQptb2RlbDdpZDQucHJvYiA8LSAwLjEwMjc1OTkvKDErMC4xMDI3NTk5KQ0KYGBgDQoNCg0KYGBge3J9DQojbW9kZWwgNyBtYWluIGVmZmVjdCBJRCBtaWxkICgxKQ0KbW9kZWw3aWQxLm9kZHMgPC0gZXhwKC0uNzkxMikNCm1vZGVsN2lkMS5vZGRzDQpgYGANCmBgYHtyfQ0KbW9kZWw3aWQxLnByb2IgPC0gMC40NTMzMDA1LygxKzAuNDUzMzAwNSkNCm1vZGVsN2lkMS5wcm9iDQpgYGANCmBgYHtyfQ0KI21vZGVsIDcgaWQgbWlsZCAoMSkgYW5kIGRpc2VuZnJhbmNoaXNlbWVudCMNCm1vZGVsN2lkMS5kaXMub2RkcyA8LWV4cCgtLjc5MTIrLS4zMDQyMykNCm1vZGVsN2lkMS5kaXMub2Rkcw0KYGBgDQpgYGB7cn0NCm1vZGVsN2lkMS5kaXMucHJvYiA8LSAwLjMzNDM5NTgvKDErMC4zMzQzOTU4KQ0KbW9kZWw3aWQxLmRpcy5wcm9iDQpgYGANCg0KYGBgDQpgYGANCmBgYA0KDQpgYGANCg0KYGBgDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==