Questions 11, 20. Perceived risk.

## Create survey object.
options(digits = 4)
options(survey.lonely.psu = "adjust")
des <- svydesign(ids = ~1, weights = ~weight, data = df[is.na(df$weight)==F, ])

Q11. How do you rate your risk of getting influenza if you visited each of the following locations?

# subset question data, rename columns, gather into single column
q11_df <- df %>%
  select(CaseID, PPGENDER, PPAGE, ppagecat, PPETHM, PPINCIMP, PPEDUC, PPEDUCAT,
         work, PPWORK, marital, PPMARIT, PPMSACAT, ppreg9, PPSTATEN, PPHOUSE, PPRENT, PPNET,
         Q11_1:Q11_11, weight) %>%
  rename(Work = Q11_1,
         Schools = Q11_2,
         Day_care = Q11_3,
         Stores = Q11_4,
         Restaurants = Q11_5,
         Libraries = Q11_6,
         Hospitals = Q11_7,
         Doctors_office = Q11_8,
         Public_transp = Q11_9,
         Family_friends = Q11_10,
         Other = Q11_11) %>%
  gather(Q11_q, Q11_r, Work:Other, na.rm = T) %>%
  mutate(Q11_q = as.factor(Q11_q))
# survey design
options(digits = 4)
options(survey.lonely.psu = "adjust")
des11 <- svydesign(ids = ~1, weights = ~weight, data = q11_df[is.na(q11_df$weight)==F, ])

Gender, age, ethnicity, income

# weighted data frame
q11 <- data.frame(svytable(~Q11_q + Q11_r + PPGENDER + ppagecat + PPETHM + PPINCIMP, des11, round = T))
# plot templates
title <- ggtitle("How do you rate your risk of getting influenza if you visited each of the following locations?")
## main plot
p <- ggplot(q11, aes(Q11_q, weight = Freq)) + ptext
p + geom_bar(position = 'fill') + aes(fill = Q11_r) + title

# plot2: exclude 'Don_t know' response
p2 <- ggplot(q11[q11$Q11_r != "Don_t Know", ], aes(Q11_q, weight = Freq)) + ptext
p2 + geom_bar(position = "fill") + aes(Q11_q, fill = Q11_r)

p2 + geom_bar() + aes(Q11_r, fill = Q11_r) + facet_wrap(~Q11_q) + ptext2

p2 + geom_bar() + aes(Q11_q, fill = Q11_q) + facet_wrap(~Q11_r) + ptext2

# select 'High Risk' response only?
#px <- ggplot(q11[q11$Q11_r == "High Risk", ], aes(weight = Freq)) + ptext
# by gender
p2 + geom_bar() + aes(PPGENDER, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By gender")

p2 + geom_bar(position = "fill") + aes(PPGENDER, fill = Q11_r) + facet_wrap(~Q11_q)

p2 + geom_bar() + aes(Q11_q, fill = PPGENDER) + facet_wrap(~Q11_r)

p2 + geom_bar(position = 'fill') + aes(Q11_q, fill = PPGENDER) + facet_wrap(~Q11_r) + ggtitle("By gender")

p2 + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_grid(Q11_q~Q11_r) + coord_flip() + ptext2

# age boxplot
# need to subset by group
svyboxplot(PPAGE~Q11_q, des11, main = "Age boxplot per response")

# by age group
p2 + geom_bar() + aes(ppagecat, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By age group")

p2 + geom_bar(position = "fill") + aes(ppagecat, fill = Q11_r) + facet_wrap(~Q11_q)

p2 + geom_bar() + aes(Q11_q, fill = ppagecat) + facet_wrap(~Q11_r)

p2 + geom_bar(position = 'fill') + aes(Q11_q, fill = ppagecat) + facet_wrap(~Q11_r) + ggtitle("By age group")

p2 + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_grid(Q11_q~Q11_r) + ptext2

# by ethnic group
p2 + geom_bar() + aes(PPETHM, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By ethnic group")
Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  : 
  first argument must be atomic

p2 + geom_bar(position = "fill") + aes(PPETHM, fill = Q11_r) + facet_wrap(~Q11_q)

p2 + geom_bar() + aes(Q11_q, fill = PPETHM) + facet_wrap(~Q11_r)

p2 + geom_bar(position = 'fill') + aes(Q11_q, fill = PPETHM) + facet_wrap(~Q11_r) + ggtitle("By ethnic group")

p2 + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_grid(Q11_q~Q11_r) + ptext2

p2 + geom_bar() + aes(Q11_r, fill = Q11_r) + facet_grid(Q11_q~PPETHM) + ptext2

# by income
p2 + geom_bar() + aes(PPINCIMP, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By income") + ptext2

p2 + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q11_r) + facet_wrap(~Q11_q) + ptext2

p2 + geom_bar() + aes(Q11_q, fill = PPINCIMP) + facet_wrap(~Q11_r)

p2 + geom_bar(position = 'fill') + aes(Q11_q, fill = PPINCIMP) + facet_wrap(~Q11_r) + ggtitle("By income group")

p2 + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_grid(Q11_q~Q11_r) + ptext2

Education, work, marital status

# update weighted data frame
q11.2 <- data.frame(svytable(~Q11_q + Q11_r + PPEDUC + PPEDUCAT + work + PPWORK + marital + PPMARIT, des11, round = T))
# restate plots
p3 <- ggplot(q11.2[q11.2$Q11_r != "Don_t Know", ], aes(Q11_q, weight = Freq)) + ptext
# by education
p3 + geom_bar() + aes(PPEDUCAT, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By education")

p3 + geom_bar(position = "fill") + aes(PPEDUCAT, fill = Q11_r) + facet_wrap(~Q11_q)

p3 + geom_bar() + aes(Q11_q, fill = PPEDUCAT) + facet_wrap(~Q11_r)

p3 + geom_bar(position = 'fill') + aes(Q11_q, fill = PPEDUCAT) + facet_wrap(~Q11_r) + ggtitle("By education")

p3 + geom_bar() + aes(PPEDUCAT, fill = PPEDUCAT) + facet_grid(Q11_q~Q11_r) + ptext2

p3 + geom_bar() + aes(Q11_r, fill = Q11_r) + facet_grid(Q11_q~PPEDUCAT) + ptext2

# by work
p3 + geom_bar() + aes(work, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By employment status")

p3 + geom_bar(position = "fill") + aes(work, fill = Q11_r) + facet_wrap(~Q11_q)

# by marital
p3 + geom_bar() + aes(marital, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(marital, fill = Q11_r) + facet_wrap(~Q11_q)

Metro status, region, state, house type, housing status, internet availability

# update weighted data frame
q11.3 <- data.frame(svytable(~Q11_q + Q11_r + PPMSACAT + ppreg9 + PPSTATEN + PPHOUSE + PPRENT + PPNET, des11, round = T))
# restate plots
p4 <- ggplot(q11.3[q11.3$Q11_r != "Don_t Know", ], aes(Q11_q, weight = Freq)) + ptext
# by metro status
p4 + geom_bar(position = "fill") + aes(Q11_r, fill = PPMSACAT) + facet_wrap(~Q11_q) + ggtitle("By metro status")

p4 + geom_bar(position = "fill") + aes(PPMSACAT, fill = Q11_r) + facet_wrap(~Q11_q)

# by region
p4 + geom_bar(position = "fill") + aes(Q11_r, fill = ppreg9) + facet_wrap(~Q11_q) + ggtitle("By region")

p4 + geom_bar() + aes(ppreg9, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By region")

# by state
p4 + geom_bar() + aes(Q11_r, fill = PPSTATEN) + facet_wrap(~Q11_q) + ggtitle("By state")

p4 + geom_bar() + aes(PPSTATEN, fill = Q11_q) + coord_flip() + ggtitle("By state")

# by house type
p4 + geom_bar(position = "fill") + aes(Q11_r, fill = PPHOUSE) + facet_wrap(~Q11_q)

p4 + geom_bar(position = "fill") + aes(fill = PPHOUSE) + ggtitle("By house type")

# housing status
p4 + geom_bar(position = "fill") + aes(Q11_r, fill = PPHOUSE) + facet_wrap(~Q11_q)

p4 + geom_bar() + aes(PPHOUSE, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By housing")

# by internet availability
p4 + geom_bar(position = "fill") + aes(Q11_r, fill = PPNET) + facet_wrap(~Q11_q)

p4 + geom_bar(position = "fill") + aes(PPNET, fill = Q11_r) + facet_wrap(~Q11_q) + ggtitle("By internet availability")

Q20. How effective do you think the influenza vaccine is in protecting people from becoming sick with influenza?

Gender, age, ethnicity, income, education

# weighted data frame
q20 <- data.frame(svytable(~Q20 + PPGENDER + ppagecat + PPETHM + PPINCIMP + 
                             PPEDUC + PPEDUCAT, des, round = T))
# plot templates
title <- ggtitle("How effective do you think the influenza vaccine is in protecting people from becoming sick with influenza?")
## main plot
p <- ggplot(q20, aes(Q20, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Don_t know' column
p2 <- ggplot(q20[!(q20$Q20)=='Don_t know', ], aes(Q20, weight = Freq)) + ptext
# by gender
p + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_wrap(~Q20)+ ggtitle("By gender")

p + geom_bar(position = "fill") + aes(PPGENDER, fill = Q20)

# age boxplot
svyboxplot(PPAGE~Q20, des, main = "Age boxplot per response")

# by age group
p + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_wrap(~Q20) + ggtitle("By age group")

p + geom_bar(position = "fill") + aes(ppagecat, fill = Q20) + ggtitle("By age group")

# by ethnic group
p + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_wrap(~Q20) + ggtitle("By ethnic group")

p + geom_bar(position = "fill") + aes(PPETHM, fill = Q20) + ggtitle("By ethnic group")

p + geom_bar(position = "fill") + aes(fill = PPETHM)

p + geom_bar() + aes(fill = PPETHM) + ggtitle("By ethnic group")

p + geom_bar() + aes(fill = Q20) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

# by income
p2 + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_wrap(~Q20) + ptext2 + ggtitle("By income")

p2 + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q20) + ggtitle("By income")

p2 + geom_bar() + aes(fill = Q20) + facet_wrap(~PPINCIMP) + ggtitle("By income")

p2 + geom_bar(position = "fill") + aes(fill = PPINCIMP) + ggtitle("By income")

# by education
p + geom_bar() + aes(PPEDUC, fill = PPEDUC) + facet_wrap(~Q20) + ptext2 + ggtitle("By education")

p + geom_bar(position = "fill") + aes(PPEDUC, fill = Q20) + ggtitle("By education")

p + geom_bar() + aes(fill = Q20) + facet_wrap(~PPEDUC) + ggtitle("By education")

p + geom_bar(position = "dodge") + aes(fill = PPEDUCAT) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(fill = PPEDUCAT) + ggtitle("By education")

Marital status, metro status, region, state of residency, house type, housing status, internet availability

# update weighted data frame
q20.2 <- data.frame(svytable(~Q20 + marital + PPMARIT + PPMSACAT + ppreg9 + 
                            PPSTATEN + PPHOUSE + PPRENT + PPNET, des, round = T))
# restate plots
p3 <- ggplot(q20.2, aes(Q20, weight = Freq)) + ptext
p4 <- ggplot(q20.2[!(q20.2$Q20)=='Don_t know', ], aes(Q20, weight = Freq)) + ptext
# by marital
p3 + geom_bar() + aes(marital, fill = marital) + facet_wrap(~Q20) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(marital, fill = Q20)

p3 + geom_bar() + aes(PPMARIT, fill = PPMARIT) + facet_wrap(~Q20)

p3 + geom_bar() + aes(PPMARIT, fill = Q20) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(PPMARIT, fill = Q20) + ggtitle("By marital status")

# by metro
p3 + geom_bar() + aes(fill = PPMSACAT) + ggtitle("By metro status")

p3 + geom_bar(position = "fill") + aes(PPMSACAT, fill = Q20)

# by region
p3 + geom_bar() + aes(ppreg9, fill = ppreg9) + facet_wrap(~Q20)+ ggtitle("By region")

p3 + geom_bar(position = "fill") + aes(ppreg9, fill = Q20) + ggtitle("US regions by response")

p3 + geom_bar(position = "fill") + aes(fill = ppreg9) + ggtitle("Responses by US region")

# by state
p3 + geom_bar() + aes(PPSTATEN, fill = Q20) + coord_flip() + ggtitle("By state")

p3 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q20) + coord_flip() + ggtitle("By state")

# by house type
p3 + geom_bar(position = 'fill') + aes(fill = PPHOUSE) + ggtitle("By house type")

p3 + geom_bar() + aes(fill = Q20) + facet_wrap(~PPHOUSE) + ggtitle("By house type")

p3 + geom_bar() + aes(PPHOUSE, fill = Q20) + ggtitle("By house type")

p3 + geom_bar(position = "fill") + aes(PPHOUSE, fill = Q20) + ggtitle("By house type")

# by housing status
p3 + geom_bar() + aes(fill = PPRENT) + ggtitle("By housing status")

p3 + geom_bar(position = 'fill') + aes(fill = PPRENT)

p3 + geom_bar() + aes(PPRENT, fill = Q20) + ggtitle("By housing status")

p3 + geom_bar(position = "fill") + aes(PPRENT, fill = Q20) + ggtitle("By housing status")

# by internet availability
p3 + geom_bar() + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = "fill") + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = "dodge") + aes(PPNET, fill = Q20) + ggtitle("Internet status")

p3 + geom_bar(position = "fill") + aes(PPNET, fill = Q20) + ggtitle("Internet status")

LS0tCnRpdGxlOiAnQmVoYXZpb3IgcGFydCAyOiBQZXJjZWl2ZWQgcmlzaycKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgogIGh0bWxfZG9jdW1lbnQ6CiAgICBmaWdfaGVpZ2h0OiA0CiAgICBmaWdfd2lkdGg6IDYKICAgIHRoZW1lOiBwYXBlcgogICAga2VlcF9tZDogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCi0tLQoKUXVlc3Rpb25zIDExLCAyMC4KUGVyY2VpdmVkIHJpc2suCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GfQojIyBTZXR1cC4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBULCBjYWNoZSA9IFQsIGNhY2hlLmNvbW1lbnRzID0gRiwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGLCBzaXplID0gInNtYWxsIikKcm0obGlzdCA9IGxzKGFsbC5uYW1lcyA9IFQpKQpsaWJyYXJ5KHJtYXJrZG93bik7IGxpYnJhcnkoa25pdHIpOyBsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeSh0aWR5cik7IGxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KHN1cnZleSkKYGBgCgpgYGB7ciBsb2FkLWRhdGEsIGluY2x1ZGU9Rn0KIyMgTG9hZCBkYXRhLgpsb2FkKCJ+L2dpdC9mbHUtc3VydmV5L2RhdGEvY2xlYW5pbmcyLlJEYXRhIikKbG9hZCgifi9naXQvZmx1LXN1cnZleS9kYXRhL3JlY29kaW5nLlJEYXRhIikgICMgbG9hZCAiZGF0YXIiCmRmIDwtIGRhdGFyICAjIHJlY29kZWQgdmFyaWFibGVzCmBgYAoKYGBge3IgZ3JvdXAtZGF0YSwgaW5jbHVkZT1GfQojIyBSZWdyb3VwIHZhcmlhYmxlcy4KIyBpbmNvbWUKaW5jb21lLm1hcCA8LSBjKHJlcCgidW5kZXIgJDEwayIsIDMpLCByZXAoIiQxMGsgdG8gJDI1ayIsIDQpLAogICAgICAgICAgICAgICAgcmVwKCIkMjVrIHRvICQ1MGsiLCA0KSwgcmVwKCIkNTBrIHRvICQ3NWsiLCAyKSwKICAgICAgICAgICAgICAgIHJlcCgiJDc1ayB0byAkMTAwayIsIDIpLCByZXAoIiQxMDBrIHRvICQxNTBrIiwgMiksCiAgICAgICAgICAgICAgICByZXAoIm92ZXIgJDE1MGsiLCAyKSkKZGYkaW5jb21lIDwtIGNvZGUoZGF0YXIkUFBJTkNJTVAsIGluY29tZS5tYXAsICJ1bmRlciAkMTBrIikKaW5jb21lLmxhYiA8LSBjKCJ1bmRlciAkMTBrIiwgIiQxMGsgdG8gJDI1ayIsICIkMjVrIHRvICQ1MGsiLAogICAgICAgICAgICAgICAgIiQ1MGsgdG8gJDc1ayIsICIkNzVrIHRvICQxMDBrIiwgIiQxMDBrIHRvICQxNTBrIiwKICAgICAgICAgICAgICAgICJvdmVyICQxNTBrIikKZGYkaW5jb21lIDwtIGZhY3RvcihkZiRpbmNvbWUsIGxldmVscyA9IGluY29tZS5sYWIpCgojIG1hcml0YWwgc3RhdXMKbWFyaXRhbC5tYXAgPC0gYygic2luZ2xlIiwgInBhcnRuZXJlZCIsICJwYXJ0bmVyZWQiLCAic2luZ2xlIiwgInNpbmdsZSIsICJzaW5nbGUiKQpkZiRtYXJpdGFsIDwtIGNvZGUoZGF0YWYkUFBNQVJJVCwgbWFyaXRhbC5tYXAsICJzaW5nbGUiKQoKIyB3b3JrIHN0YXR1cwp3b3JrLm1hcCA8LSBjKHJlcCgidW5lbXBsb3llZCIsIDUpLAogICAgICAgICAgICAgIHJlcCgiZW1wbG95ZWQiLCAyKSkKZGYkd29yayA8LSBjb2RlKGRhdGFmJFBQV09SSywgd29yay5tYXAsICJ1bmVtcGxveWVkIikKYGBgCgpgYGB7ciBkZXMtc3VydmV5fQojIyBDcmVhdGUgc3VydmV5IG9iamVjdC4Kb3B0aW9ucyhkaWdpdHMgPSA0KQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1ID0gImFkanVzdCIpCgpkZXMgPC0gc3Z5ZGVzaWduKGlkcyA9IH4xLCB3ZWlnaHRzID0gfndlaWdodCwgZGF0YSA9IGRmW2lzLm5hKGRmJHdlaWdodCk9PUYsIF0pCmBgYAoKYGBge3IgcGxvdC10ZW1wLCBpbmNsdWRlPUZ9CiMjIENyZWF0ZSBnZ3Bsb3QgdGVtcGxhdGVzLgpwdGV4dCA8LSB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjkpKSwKICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKcHRleHQyIDwtIHB0ZXh0ICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCgojIyBRMTEuIEhvdyBkbyB5b3UgcmF0ZSB5b3VyIHJpc2sgb2YgZ2V0dGluZyBpbmZsdWVuemEgaWYgeW91IHZpc2l0ZWQgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGxvY2F0aW9ucz8KCmBgYHtyIHExMS1kYXRhfQojIHN1YnNldCBxdWVzdGlvbiBkYXRhLCByZW5hbWUgY29sdW1ucywgZ2F0aGVyIGludG8gc2luZ2xlIGNvbHVtbgpxMTFfZGYgPC0gZGYgJT4lCiAgc2VsZWN0KENhc2VJRCwgUFBHRU5ERVIsIFBQQUdFLCBwcGFnZWNhdCwgUFBFVEhNLCBQUElOQ0lNUCwgUFBFRFVDLCBQUEVEVUNBVCwKICAgICAgICAgd29yaywgUFBXT1JLLCBtYXJpdGFsLCBQUE1BUklULCBQUE1TQUNBVCwgcHByZWc5LCBQUFNUQVRFTiwgUFBIT1VTRSwgUFBSRU5ULCBQUE5FVCwKICAgICAgICAgUTExXzE6UTExXzExLCB3ZWlnaHQpICU+JQogIHJlbmFtZShXb3JrID0gUTExXzEsCiAgICAgICAgIFNjaG9vbHMgPSBRMTFfMiwKICAgICAgICAgRGF5X2NhcmUgPSBRMTFfMywKICAgICAgICAgU3RvcmVzID0gUTExXzQsCiAgICAgICAgIFJlc3RhdXJhbnRzID0gUTExXzUsCiAgICAgICAgIExpYnJhcmllcyA9IFExMV82LAogICAgICAgICBIb3NwaXRhbHMgPSBRMTFfNywKICAgICAgICAgRG9jdG9yc19vZmZpY2UgPSBRMTFfOCwKICAgICAgICAgUHVibGljX3RyYW5zcCA9IFExMV85LAogICAgICAgICBGYW1pbHlfZnJpZW5kcyA9IFExMV8xMCwKICAgICAgICAgT3RoZXIgPSBRMTFfMTEpICU+JQogIGdhdGhlcihRMTFfcSwgUTExX3IsIFdvcms6T3RoZXIsIG5hLnJtID0gVCkgJT4lCiAgbXV0YXRlKFExMV9xID0gYXMuZmFjdG9yKFExMV9xKSkKCiMgc3VydmV5IGRlc2lnbgpvcHRpb25zKGRpZ2l0cyA9IDQpCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3UgPSAiYWRqdXN0IikKZGVzMTEgPC0gc3Z5ZGVzaWduKGlkcyA9IH4xLCB3ZWlnaHRzID0gfndlaWdodCwgZGF0YSA9IHExMV9kZltpcy5uYShxMTFfZGYkd2VpZ2h0KT09RiwgXSkKYGBgCgojIyMgR2VuZGVyLCBhZ2UsIGV0aG5pY2l0eSwgaW5jb21lCgpgYGB7ciBxMTEtcGxvdC0xfQojIHdlaWdodGVkIGRhdGEgZnJhbWUKcTExIDwtIGRhdGEuZnJhbWUoc3Z5dGFibGUoflExMV9xICsgUTExX3IgKyBQUEdFTkRFUiArIHBwYWdlY2F0ICsgUFBFVEhNICsgUFBJTkNJTVAsIGRlczExLCByb3VuZCA9IFQpKQoKIyBwbG90IHRlbXBsYXRlcwp0aXRsZSA8LSBnZ3RpdGxlKCJIb3cgZG8geW91IHJhdGUgeW91ciByaXNrIG9mIGdldHRpbmcgaW5mbHVlbnphIGlmIHlvdSB2aXNpdGVkIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM/IikKCiMjIG1haW4gcGxvdApwIDwtIGdncGxvdChxMTEsIGFlcyhRMTFfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gUTExX3IpICsgdGl0bGUKYGBgCgpgYGB7ciBxMTEtcGxvdC0xYn0KIyBwbG90MjogZXhjbHVkZSAnRG9uX3Qga25vdycgcmVzcG9uc2UKcDIgPC0gZ2dwbG90KHExMVtxMTEkUTExX3IgIT0gIkRvbl90IEtub3ciLCBdLCBhZXMoUTExX3EsIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFExMV9xLCBmaWxsID0gUTExX3IpCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhRMTFfciwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKSArIHB0ZXh0MgpwMiArIGdlb21fYmFyKCkgKyBhZXMoUTExX3EsIGZpbGwgPSBRMTFfcSkgKyBmYWNldF93cmFwKH5RMTFfcikgKyBwdGV4dDIKCiMgc2VsZWN0ICdIaWdoIFJpc2snIHJlc3BvbnNlIG9ubHk/CiNweCA8LSBnZ3Bsb3QocTExW3ExMSRRMTFfciA9PSAiSGlnaCBSaXNrIiwgXSwgYWVzKHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CgojIGJ5IGdlbmRlcgpwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBHRU5ERVIsIGZpbGwgPSBRMTFfcikgKyBmYWNldF93cmFwKH5RMTFfcSkgKyBnZ3RpdGxlKCJCeSBnZW5kZXIiKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUEdFTkRFUiwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKQpwMiArIGdlb21fYmFyKCkgKyBhZXMoUTExX3EsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF93cmFwKH5RMTFfcikKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoUTExX3EsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF93cmFwKH5RMTFfcikgKyBnZ3RpdGxlKCJCeSBnZW5kZXIiKQpwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBHRU5ERVIsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF9ncmlkKFExMV9xflExMV9yKSArIGNvb3JkX2ZsaXAoKSArIHB0ZXh0MgoKCiMgYWdlIGJveHBsb3QKIyBuZWVkIHRvIHN1YnNldCBieSBncm91cApzdnlib3hwbG90KFBQQUdFflExMV9xLCBkZXMxMSwgbWFpbiA9ICJBZ2UgYm94cGxvdCBwZXIgcmVzcG9uc2UiKQoKCiMgYnkgYWdlIGdyb3VwCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhwcGFnZWNhdCwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKSArIGdndGl0bGUoIkJ5IGFnZSBncm91cCIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhRMTFfcSwgZmlsbCA9IHBwYWdlY2F0KSArIGZhY2V0X3dyYXAoflExMV9yKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhRMTFfcSwgZmlsbCA9IHBwYWdlY2F0KSArIGZhY2V0X3dyYXAoflExMV9yKSArIGdndGl0bGUoIkJ5IGFnZSBncm91cCIpCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhwcGFnZWNhdCwgZmlsbCA9IHBwYWdlY2F0KSArIGZhY2V0X2dyaWQoUTExX3F+UTExX3IpICsgcHRleHQyCgoKIyBieSBldGhuaWMgZ3JvdXAKcDIgKyBnZW9tX2JhcigpICsgYWVzKFBQRVRITSwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRVRITSwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKQpwMiArIGdlb21fYmFyKCkgKyBhZXMoUTExX3EsIGZpbGwgPSBQUEVUSE0pICsgZmFjZXRfd3JhcCh+UTExX3IpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFExMV9xLCBmaWxsID0gUFBFVEhNKSArIGZhY2V0X3dyYXAoflExMV9yKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVUSE0sIGZpbGwgPSBQUEVUSE0pICsgZmFjZXRfZ3JpZChRMTFfcX5RMTFfcikgKyBwdGV4dDIKcDIgKyBnZW9tX2JhcigpICsgYWVzKFExMV9yLCBmaWxsID0gUTExX3IpICsgZmFjZXRfZ3JpZChRMTFfcX5QUEVUSE0pICsgcHRleHQyCgoKIyBieSBpbmNvbWUKcDIgKyBnZW9tX2JhcigpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpICsgZ2d0aXRsZSgiQnkgaW5jb21lIikgKyBwdGV4dDIKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBJTkNJTVAsIGZpbGwgPSBRMTFfcikgKyBmYWNldF93cmFwKH5RMTFfcSkgKyBwdGV4dDIKcDIgKyBnZW9tX2JhcigpICsgYWVzKFExMV9xLCBmaWxsID0gUFBJTkNJTVApICsgZmFjZXRfd3JhcCh+UTExX3IpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFExMV9xLCBmaWxsID0gUFBJTkNJTVApICsgZmFjZXRfd3JhcCh+UTExX3IpICsgZ2d0aXRsZSgiQnkgaW5jb21lIGdyb3VwIikKcDIgKyBnZW9tX2JhcigpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUFBJTkNJTVApICsgZmFjZXRfZ3JpZChRMTFfcX5RMTFfcikgKyBwdGV4dDIKCmBgYAoKIyMjIEVkdWNhdGlvbiwgd29yaywgbWFyaXRhbCBzdGF0dXMKCmBgYHtyIHExMS1wbG90LTJ9CiMgdXBkYXRlIHdlaWdodGVkIGRhdGEgZnJhbWUKcTExLjIgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTExX3EgKyBRMTFfciArIFBQRURVQyArIFBQRURVQ0FUICsgd29yayArIFBQV09SSyArIG1hcml0YWwgKyBQUE1BUklULCBkZXMxMSwgcm91bmQgPSBUKSkKCiMgcmVzdGF0ZSBwbG90cwpwMyA8LSBnZ3Bsb3QocTExLjJbcTExLjIkUTExX3IgIT0gIkRvbl90IEtub3ciLCBdLCBhZXMoUTExX3EsIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CmBgYAoKYGBge3IgcTExLXBsb3QtMmJ9CiMgYnkgZWR1Y2F0aW9uCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVEVUNBVCwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRURVQ0FULCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhRMTFfcSwgZmlsbCA9IFBQRURVQ0FUKSArIGZhY2V0X3dyYXAoflExMV9yKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhRMTFfcSwgZmlsbCA9IFBQRURVQ0FUKSArIGZhY2V0X3dyYXAoflExMV9yKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVEVUNBVCwgZmlsbCA9IFBQRURVQ0FUKSArIGZhY2V0X2dyaWQoUTExX3F+UTExX3IpICsgcHRleHQyCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhRMTFfciwgZmlsbCA9IFExMV9yKSArIGZhY2V0X2dyaWQoUTExX3F+UFBFRFVDQVQpICsgcHRleHQyCgoKIyBieSB3b3JrCnAzICsgZ2VvbV9iYXIoKSArIGFlcyh3b3JrLCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpICsgZ2d0aXRsZSgiQnkgZW1wbG95bWVudCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyh3b3JrLCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpCgoKIyBieSBtYXJpdGFsCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpCgpgYGAKCiMjIyBNZXRybyBzdGF0dXMsIHJlZ2lvbiwgc3RhdGUsIGhvdXNlIHR5cGUsIGhvdXNpbmcgc3RhdHVzLCBpbnRlcm5ldCBhdmFpbGFiaWxpdHkKCmBgYHtyIHExMS1wbG90LTN9CiMgdXBkYXRlIHdlaWdodGVkIGRhdGEgZnJhbWUKcTExLjMgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTExX3EgKyBRMTFfciArIFBQTVNBQ0FUICsgcHByZWc5ICsgUFBTVEFURU4gKyBQUEhPVVNFICsgUFBSRU5UICsgUFBORVQsIGRlczExLCByb3VuZCA9IFQpKQoKIyByZXN0YXRlIHBsb3RzCnA0IDwtIGdncGxvdChxMTEuM1txMTEuMyRRMTFfciAhPSAiRG9uX3QgS25vdyIsIF0sIGFlcyhRMTFfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKYGBgCgpgYGB7ciBxMTEtcGxvdC0zYn0KIyBieSBtZXRybyBzdGF0dXMKcDQgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUTExX3IsIGZpbGwgPSBQUE1TQUNBVCkgKyBmYWNldF93cmFwKH5RMTFfcSkgKyBnZ3RpdGxlKCJCeSBtZXRybyBzdGF0dXMiKQpwNCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUE1TQUNBVCwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKQoKIyBieSByZWdpb24KcDQgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUTExX3IsIGZpbGwgPSBwcHJlZzkpICsgZmFjZXRfd3JhcCh+UTExX3EpICsgZ2d0aXRsZSgiQnkgcmVnaW9uIikKcDQgKyBnZW9tX2JhcigpICsgYWVzKHBwcmVnOSwgZmlsbCA9IFExMV9yKSArIGZhY2V0X3dyYXAoflExMV9xKSArIGdndGl0bGUoIkJ5IHJlZ2lvbiIpCgojIGJ5IHN0YXRlCnA0ICsgZ2VvbV9iYXIoKSArIGFlcyhRMTFfciwgZmlsbCA9IFBQU1RBVEVOKSArIGZhY2V0X3dyYXAoflExMV9xKSArIGdndGl0bGUoIkJ5IHN0YXRlIikKcDQgKyBnZW9tX2JhcigpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTExX3EpICsgY29vcmRfZmxpcCgpICsgZ2d0aXRsZSgiQnkgc3RhdGUiKQoKIyBieSBob3VzZSB0eXBlCnA0ICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFExMV9yLCBmaWxsID0gUFBIT1VTRSkgKyBmYWNldF93cmFwKH5RMTFfcSkKcDQgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQSE9VU0UpICsgZ2d0aXRsZSgiQnkgaG91c2UgdHlwZSIpCgojIGhvdXNpbmcgc3RhdHVzCnA0ICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFExMV9yLCBmaWxsID0gUFBIT1VTRSkgKyBmYWNldF93cmFwKH5RMTFfcSkKcDQgKyBnZW9tX2JhcigpICsgYWVzKFBQSE9VU0UsIGZpbGwgPSBRMTFfcikgKyBmYWNldF93cmFwKH5RMTFfcSkgKyBnZ3RpdGxlKCJCeSBob3VzaW5nIikKCiMgYnkgaW50ZXJuZXQgYXZhaWxhYmlsaXR5CnA0ICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFExMV9yLCBmaWxsID0gUFBORVQpICsgZmFjZXRfd3JhcCh+UTExX3EpCnA0ICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQTkVULCBmaWxsID0gUTExX3IpICsgZmFjZXRfd3JhcCh+UTExX3EpICsgZ2d0aXRsZSgiQnkgaW50ZXJuZXQgYXZhaWxhYmlsaXR5IikKCmBgYAoKCgojIyBRMjAuIEhvdyBlZmZlY3RpdmUgZG8geW91IHRoaW5rIHRoZSBpbmZsdWVuemEgdmFjY2luZSBpcyBpbiBwcm90ZWN0aW5nIHBlb3BsZSBmcm9tIGJlY29taW5nIHNpY2sgd2l0aCBpbmZsdWVuemE/CgojIyMgR2VuZGVyLCBhZ2UsIGV0aG5pY2l0eSwgaW5jb21lLCBlZHVjYXRpb24KCmBgYHtyIHEyMC1wbG90LTF9CiMgd2VpZ2h0ZWQgZGF0YSBmcmFtZQpxMjAgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTIwICsgUFBHRU5ERVIgKyBwcGFnZWNhdCArIFBQRVRITSArIFBQSU5DSU1QICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBFRFVDICsgUFBFRFVDQVQsIGRlcywgcm91bmQgPSBUKSkKCiMgcGxvdCB0ZW1wbGF0ZXMKdGl0bGUgPC0gZ2d0aXRsZSgiSG93IGVmZmVjdGl2ZSBkbyB5b3UgdGhpbmsgdGhlIGluZmx1ZW56YSB2YWNjaW5lIGlzIGluIHByb3RlY3RpbmcgcGVvcGxlIGZyb20gYmVjb21pbmcgc2ljayB3aXRoIGluZmx1ZW56YT8iKQoKIyMgbWFpbiBwbG90CnAgPC0gZ2dwbG90KHEyMCwgYWVzKFEyMCwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKcCArIGdlb21fYmFyKCkgKyB0aXRsZQpgYGAKCmBgYHtyIHEyMC1wbG90LTFifQojIyBwbG90MjogZXhjbHVkZSAnRG9uX3Qga25vdycgY29sdW1uCnAyIDwtIGdncGxvdChxMjBbIShxMjAkUTIwKT09J0Rvbl90IGtub3cnLCBdLCBhZXMoUTIwLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dAoKIyBieSBnZW5kZXIKcCArIGdlb21fYmFyKCkgKyBhZXMoUFBHRU5ERVIsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF93cmFwKH5RMjApKyBnZ3RpdGxlKCJCeSBnZW5kZXIiKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQR0VOREVSLCBmaWxsID0gUTIwKQoKIyBhZ2UgYm94cGxvdApzdnlib3hwbG90KFBQQUdFflEyMCwgZGVzLCBtYWluID0gIkFnZSBib3hwbG90IHBlciByZXNwb25zZSIpCgojIGJ5IGFnZSBncm91cApwICsgZ2VvbV9iYXIoKSArIGFlcyhwcGFnZWNhdCwgZmlsbCA9IHBwYWdlY2F0KSArIGZhY2V0X3dyYXAoflEyMCkgKyBnZ3RpdGxlKCJCeSBhZ2UgZ3JvdXAiKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gUTIwKSArIGdndGl0bGUoIkJ5IGFnZSBncm91cCIpCgojIGJ5IGV0aG5pYyBncm91cApwICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVUSE0sIGZpbGwgPSBQUEVUSE0pICsgZmFjZXRfd3JhcCh+UTIwKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFVEhNLCBmaWxsID0gUTIwKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRVRITSkKcCArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQRVRITSkgKyBnZ3RpdGxlKCJCeSBldGhuaWMgZ3JvdXAiKQpwICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUTIwKSArIGZhY2V0X3dyYXAoflBQRVRITSkgKyBnZ3RpdGxlKCJCeSBldGhuaWMgZ3JvdXAiKQoKIyBieSBpbmNvbWUKcDIgKyBnZW9tX2JhcigpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUFBJTkNJTVApICsgZmFjZXRfd3JhcCh+UTIwKSArIHB0ZXh0MiArIGdndGl0bGUoIkJ5IGluY29tZSIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUTIwKSArIGdndGl0bGUoIkJ5IGluY29tZSIpCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUTIwKSArIGZhY2V0X3dyYXAoflBQSU5DSU1QKSArIGdndGl0bGUoIkJ5IGluY29tZSIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBQUElOQ0lNUCkgKyBnZ3RpdGxlKCJCeSBpbmNvbWUiKQoKIyBieSBlZHVjYXRpb24KcCArIGdlb21fYmFyKCkgKyBhZXMoUFBFRFVDLCBmaWxsID0gUFBFRFVDKSArIGZhY2V0X3dyYXAoflEyMCkgKyBwdGV4dDIgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRURVQywgZmlsbCA9IFEyMCkgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUTIwKSArIGZhY2V0X3dyYXAoflBQRURVQykgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArIGFlcyhmaWxsID0gUFBFRFVDQVQpICsgZ2d0aXRsZSgiQnkgZWR1Y2F0aW9uIikKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBFRFVDQVQpICsgZ2d0aXRsZSgiQnkgZWR1Y2F0aW9uIikKCmBgYAoKIyMjIE1hcml0YWwgc3RhdHVzLCBtZXRybyBzdGF0dXMsIHJlZ2lvbiwgc3RhdGUgb2YgcmVzaWRlbmN5LCBob3VzZSB0eXBlLCBob3VzaW5nIHN0YXR1cywgaW50ZXJuZXQgYXZhaWxhYmlsaXR5CgpgYGB7ciBxMjAtcGxvdC0yfQojIHVwZGF0ZSB3ZWlnaHRlZCBkYXRhIGZyYW1lCnEyMC4yIDwtIGRhdGEuZnJhbWUoc3Z5dGFibGUoflEyMCArIG1hcml0YWwgKyBQUE1BUklUICsgUFBNU0FDQVQgKyBwcHJlZzkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQU1RBVEVOICsgUFBIT1VTRSArIFBQUkVOVCArIFBQTkVULCBkZXMsIHJvdW5kID0gVCkpCiMgcmVzdGF0ZSBwbG90cwpwMyA8LSBnZ3Bsb3QocTIwLjIsIGFlcyhRMjAsIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CnA0IDwtIGdncGxvdChxMjAuMlshKHEyMC4yJFEyMCk9PSdEb25fdCBrbm93JywgXSwgYWVzKFEyMCwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKYGBgCgpgYGB7ciBxMjAtcGxvdC0yYn0KIyBieSBtYXJpdGFsCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gbWFyaXRhbCkgKyBmYWNldF93cmFwKH5RMjApICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gUTIwKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNQVJJVCwgZmlsbCA9IFBQTUFSSVQpICsgZmFjZXRfd3JhcCh+UTIwKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNQVJJVCwgZmlsbCA9IFEyMCkgKyBnZ3RpdGxlKCJCeSBtYXJpdGFsIHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQTUFSSVQsIGZpbGwgPSBRMjApICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQoKIyBieSBtZXRybwpwMyArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQTVNBQ0FUKSArIGdndGl0bGUoIkJ5IG1ldHJvIHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQTVNBQ0FULCBmaWxsID0gUTIwKQoKIyBieSByZWdpb24KcDMgKyBnZW9tX2JhcigpICsgYWVzKHBwcmVnOSwgZmlsbCA9IHBwcmVnOSkgKyBmYWNldF93cmFwKH5RMjApKyBnZ3RpdGxlKCJCeSByZWdpb24iKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhwcHJlZzksIGZpbGwgPSBRMjApICsgZ2d0aXRsZSgiVVMgcmVnaW9ucyBieSByZXNwb25zZSIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBwcHJlZzkpICsgZ2d0aXRsZSgiUmVzcG9uc2VzIGJ5IFVTIHJlZ2lvbiIpCgojIGJ5IHN0YXRlCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUFNUQVRFTiwgZmlsbCA9IFEyMCkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJCeSBzdGF0ZSIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTIwKSArIGNvb3JkX2ZsaXAoKSArIGdndGl0bGUoIkJ5IHN0YXRlIikKCiMgYnkgaG91c2UgdHlwZQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gUFBIT1VTRSkgKyBnZ3RpdGxlKCJCeSBob3VzZSB0eXBlIikKcDMgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBRMjApICsgZmFjZXRfd3JhcCh+UFBIT1VTRSkgKyBnZ3RpdGxlKCJCeSBob3VzZSB0eXBlIikKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQSE9VU0UsIGZpbGwgPSBRMjApICsgZ2d0aXRsZSgiQnkgaG91c2UgdHlwZSIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQSE9VU0UsIGZpbGwgPSBRMjApICsgZ2d0aXRsZSgiQnkgaG91c2UgdHlwZSIpCgojIGJ5IGhvdXNpbmcgc3RhdHVzCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUFBSRU5UKSArIGdndGl0bGUoIkJ5IGhvdXNpbmcgc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IFBQUkVOVCkKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQUkVOVCwgZmlsbCA9IFEyMCkgKyBnZ3RpdGxlKCJCeSBob3VzaW5nIHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQUkVOVCwgZmlsbCA9IFEyMCkgKyBnZ3RpdGxlKCJCeSBob3VzaW5nIHN0YXR1cyIpCgojIGJ5IGludGVybmV0IGF2YWlsYWJpbGl0eQpwMyArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQTkVUKSArIGdndGl0bGUoIkludGVybmV0IHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBQUE5FVCkgKyBnZ3RpdGxlKCJJbnRlcm5ldCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKyBhZXMoUFBORVQsIGZpbGwgPSBRMjApICsgZ2d0aXRsZSgiSW50ZXJuZXQgc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBORVQsIGZpbGwgPSBRMjApICsgZ2d0aXRsZSgiSW50ZXJuZXQgc3RhdHVzIikKCmBgYAoK