This notebook uses TidyTuesday Week 11/2021 Bechdel Test data from FiveThirtyEight.

Data set description (from TidyTuesday):
1. raw_bechdel : includes data from 1970 - 2020, for ONLY bechdel testing
2. movies: includes IMDB scores, budget/gross revenue, and ratings but only from 1970 - 2013

# load library
library(tidyverse)
library(tidytuesdayR)
library(gghalves)
library(ggpubr)
library(scales)
library(ggExtra)
library(tidytext)
library(gt)
# load data
tuesdata <- tidytuesdayR::tt_load('2021-03-09')
--- Compiling #TidyTuesday Information for 2021-03-09 ----
--- There are 2 files available ---
--- Starting Download ---

    Downloading file 1 of 2: `raw_bechdel.csv`
    Downloading file 2 of 2: `movies.csv`
--- Download complete ---
b = tuesdata$raw_bechdel
m = tuesdata$movies
summary(b$year)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1888    1989    2006    1997    2013    2021 
summary(m$year)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1970    1998    2005    2003    2009    2013 

Outcomes and metascore

# Outcomes and Metascore
# shared on twitter (https://twitter.com/leeolney3/status/1369238810085777410/photo/1)
m %>% 
  filter(!is.na(metascore)) %>%
  filter(between(year, 1970,2020)) %>%
  mutate(binary= ifelse(binary=="FAIL","Bechdel Test: Fail","Bechdel Test: Pass")) %>%
  ggplot(aes(x=clean_test, y=metascore, color=clean_test)) + 
  geom_half_point(size=0.8, alpha=0.5) + 
  geom_half_boxplot(outlier.size = -1) + 
  facet_grid(~binary,scales = "free", space = "free") +
  scale_color_manual(values=c("#f79d65","#f4845f","#f27059","#f25c54","#33658a")) + 
  theme_bw() +
  theme(axis.title=element_text(size=9, face="bold"),
        legend.position = "none",
        strip.background = element_blank(),
        axis.ticks=element_blank(),
        plot.title=element_text(face="bold", lineheight = 10),
        plot.caption=element_text(color="#6d6a75", size=8),
        #plot.title.position = "plot",
        plot.margin=unit(c(0.4,1.2,0.4,0.3),"cm")) +
  labs(x="Outcomes of Bechdel Test",
       y="Metascore",
       title="Bechdel Test Outcomes and Metascore of Movies (1970 to 2013)",
       caption="Data from FiveThirtyEight")

# Outcomes and Domestic Gross 
m1 = m
m1$domgross_2013= as.numeric(m1$domgross_2013)

ylab = c(0,500,1000,1500)
m1 %>% 
  filter(!is.na(domgross_2013)) %>%
  filter(between(year, 1970,2020)) %>%
  mutate(binary= ifelse(binary=="FAIL","Bechdel Test: Fail","Bechdel Test: Pass")) %>%
  ggplot(aes(x=clean_test, y=domgross_2013, color=clean_test)) + 
  geom_half_point(size=0.8, alpha=0.5) + 
  geom_half_boxplot(outlier.size = -1) + 
  #geom_jitter(size=0.8, alpha=0.2, color="yellow") + 
  #geom_boxplot(fill=NA) + 
  facet_grid(~binary,scales = "free", space = "free",) +
  scale_y_continuous(labels = paste(ylab, "M"),
                     breaks = 10^6 * ylab
  ) + 
  scale_color_manual(values=c("#f79d65","#f4845f","#f27059","#f25c54","#33658a")) + 
  theme_bw() +
  theme(axis.title=element_text(size=9),
        legend.position = "none",
        #plot.title.position = "plot",
        strip.background = element_blank(),
        plot.title=element_text(face="bold")
        )+
  labs(x="Outcome of Bechdel Test",
       y="Domestic gross (in millions)",
       title="Bechdel Test Outcomes and Domestic Gross of Movies (1970 to 2013)",
       subtitle= "Domestic gross normalised to 2013 dollars")

Bechdel test ratings (0-3)

b %>% group_by(rating) %>% tally() %>% mutate(prop=round(n/sum(n),3))
b %>% 
  filter(between(year, 1970,2020)) %>%
  group_by(year, rating) %>%
  tally() %>% mutate(prop=round(n/sum(n),3)) %>%
  mutate(rating_long = case_when(rating==0 ~"Unscored",
                   rating==1 ~"At least two named women",
                   rating==2 ~"Women talk to each other",
                   rating==3 ~"About something besides a man"
                   )) %>%
  ggplot(aes(x=year, y=prop, color= rating_long)) + 
  geom_point(key_glyph = draw_key_point, alpha=0.8) + 
  scale_color_manual(values=c("#a8201a","#0f8b8d","#143642","#ec9a29")) +
  scale_y_continuous(labels = scales::percent_format()) +
  theme_light(base_size=10) + 
  theme(legend.position="top",
        #plot.title.position="plot",
        legend.justification='left',
        legend.title=element_text(size=9),
        legend.margin=margin(0,0,0,0),
        plot.title=element_text(face="bold")
        ) +
  guides(color=guide_legend(ncol=2,override.aes = list(shape = 15, size =4))) + 
  labs(x="Year",y="Percentage",color="Rating",
       title="Bechdel Test Ratings of Movies from 1970 to 2020",
       caption="Data from FiveThirtyEight")

Movie count by genre

m= m %>% filter(!is.na(type)) 
m %>% 
  select(imdb, genre) %>% 
  unnest_tokens(word, genre) %>% 
  filter(!is.na(word)) %>% 
  group_by(word) %>% 
  tally(sort=T) %>% 
  filter(word!="fi") %>% mutate(word=ifelse(word=="sci","sci-fi",word)) %>% 
  ggplot(aes(y=reorder(word,n), x=n)) + 
  geom_point() + 
  theme_light(base_size = 10) + 
  theme(plot.title=element_text(face="bold")) +
  labs(x="Count",
       y="Genre",
       title="Movies Count by Genre")

Median IMDB rating and metascare

# median IMDB rating and Metascore 
# reference: Tobias Stalder (https://twitter.com/toeb18/status/1369265527714103298/photo/1)
m_median= m %>% 
  select(year, binary, budget, metascore, imdb_rating, genre, type)%>%
  drop_na(genre, metascore, binary, imdb_rating, type) %>% 
  filter(year>=1980) %>%
  group_by(year, binary) %>%
  summarise(`Metascore` = median(metascore),
            `IMDB Rating` = median(imdb_rating)) %>%
  pivot_longer(cols=`Metascore`:`IMDB Rating`, values_drop_na=TRUE) %>%
  mutate(binary= ifelse(binary=="FAIL","Fail","Pass"))

ggplot(m_median, aes(x=year, y= value, color=binary)) + 
  ggbump::geom_bump(aes(x = year, y = value, color = binary), show.legend = TRUE) +
  scale_color_manual(values = c("#b7094c","#0091ad")) + 
  facet_wrap(~name, scales="free") + 
  theme_light(base_size = 10) + 
  theme(legend.position = "top",
        legend.justification = "left",
        legend.title=element_text(size=9),
        strip.text = element_text(color="white", face="bold"),
        strip.background = element_rect(fill="slategrey"),
        plot.title=element_text(face="bold")) + 
  guides(color=guide_legend(override.aes = list(shape = 15, size =7))) + 
  labs(x="",y="", color="Bechdel Test", title="Median IMDB Rating and Metascore, by Bechdel Test Outcome")

NA

Budget, domestic gross, imdb, bechdel test

# budget, domestic gross, imdb, bechdel test (movies 1970 to 2013)
# reference: Sherosha Raj (https://twitter.com/SheroshaR/status/1369455581422092288/photo/1)

p1 = m1 %>%
  filter(budget>100000000) %>%
  ggplot(aes(x=budget_2013/1000000, y=domgross_2013/1000000, color=binary, size=imdb_votes/1000)) +
  geom_point(alpha=0.5) + 
  scale_color_manual(values = c("#b7094c","#0091ad")) +
  scale_x_continuous(label = label_number(suffix="M"), trans = "log10") +
  scale_y_continuous(label=label_number(suffix="M"), trans = "log10") + 
  scale_size_continuous(label=label_number(suffix="K")) + 
  theme_light(base_size = 10) +
  theme(legend.position="bottom",
        axis.ticks=element_blank(),
        panel.grid=element_blank(),
        axis.title = element_text(size=10, face="bold"),
        legend.title=element_text(size=9.5, face="bold"),
        plot.title=element_text(face="bold")) + 
  labs(x="Budget (log)",
       y="Domestic gross (log)",
       size="IMDB votes",
       color="Bechdel Test",
       subtitle="Budget and domestic gross normalised to 2013 dollars",
       title="Movies from 1970 to 2013, with budget over 100 million") 

ggMarginal(p1, groupColour = T, groupFill = T) #type='boxplot

Total gross revenue by decade

m1 = m
m1$domgross_2013= as.numeric(m1$domgross_2013)
m1$intgross_2013= as.numeric(m1$intgross_2013)
m1$int_dom_2013 = m1$domgross_2013 + m1$intgross_2013

m1 %>% 
  mutate(decade= year-(year %% 10)) %>% # get decade 
  ggplot(aes(x=factor(decade), y=int_dom_2013/1000000000, color=binary)) + 
  geom_boxplot() + 
  scale_color_manual(values = c("#b7094c","#0091ad")) + 
  scale_y_continuous(label=label_number(suffix="B")) +
  theme_light(base_size=10) + 
  theme(plot.title=element_text(face="bold")) +
  labs(y="Total Gross",
       x="Decade",
       color="Bechdel Test", 
       title="Total Gross Revenue (Domestic and International)",
       subtitle="Movies from 1970 to 2013, gross values normalised to 2013 dollars")

Content rating and bechdel test

table(m$rated)

        G       N/A     NC-17 Not Rated        PG     PG-13         R     TV-14     TV-PG   Unrated         X 
       36        10         7        15       257       565       691         1         1         5         4 
m %>% 
  filter(rated == "R"| rated =="PG-13" | rated == "PG") %>% 
  group_by(rated, binary) %>% 
  tally() %>%
  mutate(percent=round(n/sum(n),4)) %>%
  mutate(binary = ifelse(binary=="FAIL","Fail","Pass")) %>% 
  rename("Bechdel Test" = "binary", "Rated"="rated") %>%
  ungroup() %>%
  gt() %>%
  tab_header(title="Movies 1970 to 2013", subtitle= "Content Rating and Bechdel Test Outcome") %>%
  fmt_percent(columns=vars(percent)) %>%
  #data_color(columns=vars(Rated),
             #colors=scales::col_factor(palette=c("#c9ada7","#9a8c98","#4a4e69"),
                                       #domain=c("PG","PG-13","R"))) %>%
  data_color(column=vars(percent),
             colors=scales::col_numeric(palette=c("#d9ed92","#34a0a4"),
                                        domain=c(0.41,0.59)))
Movies 1970 to 2013
Content Rating and Bechdel Test Outcome
Rated Bechdel Test n percent
PG Fail 150 58.37%
PG Pass 107 41.63%
PG-13 Fail 298 52.74%
PG-13 Pass 267 47.26%
R Fail 394 57.02%
R Pass 297 42.98%
NA

Domestic gross by content rating and bechdel test

m1 %>%
  filter(rated == "R"| rated =="PG-13" | rated == "PG") %>% 
  ggplot(aes(x=rated, y=domgross_2013/1000000, color= binary)) + 
  geom_boxplot() + 
  scale_color_manual(values = c("#b7094c","#0091ad")) + 
  scale_y_continuous(name="Domestic Gross", label=label_number(suffix="M")) + 
  theme_light(base_size=10) + 
  theme(plot.title=element_text(face="bold")) +
  labs(x="Content Rating",
       color="Bechdel Test", 
       title="Domestic Gross by Content Rating and Bechdel Test Outcome",
       subtitle="Movies from 1970 to 2013, values normalised to 2013 dollars")

LS0tCnRpdGxlOiAiMTEvMjAyMSBCZWNoZGVsIFRlc3QiCmRhdGU6ICIyMDIxLzAzLzA5IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIG5vdGVib29rIHVzZXMgW1RpZHlUdWVzZGF5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5KSBXZWVrIDExLzIwMjEgW0JlY2hkZWwgVGVzdF0oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9ibG9iL21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMy0wOS9yZWFkbWUubWQpIGRhdGEgZnJvbSBbRml2ZVRoaXJ0eUVpZ2h0XShodHRwczovL2dpdGh1Yi5jb20vZml2ZXRoaXJ0eWVpZ2h0L2RhdGEvdHJlZS9tYXN0ZXIvYmVjaGRlbCkuIAoKRGF0YSBzZXQgZGVzY3JpcHRpb24gKGZyb20gW1RpZHlUdWVzZGF5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L2Jsb2IvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAzLTA5L3JlYWRtZS5tZCkpOiAgICAgCjEuICoqcmF3X2JlY2hkZWwqKiA6IGluY2x1ZGVzIGRhdGEgZnJvbSAxOTcwIC0gMjAyMCwgZm9yIE9OTFkgYmVjaGRlbCB0ZXN0aW5nICAgIAoyLiAqKm1vdmllcyoqOiBpbmNsdWRlcyBJTURCIHNjb3JlcywgYnVkZ2V0L2dyb3NzIHJldmVudWUsIGFuZCByYXRpbmdzIGJ1dCBvbmx5IGZyb20gMTk3MCAtIDIwMTMgICAgCgoKYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBsb2FkIGxpYnJhcnkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeXR1ZXNkYXlSKQpsaWJyYXJ5KGdnaGFsdmVzKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZ2dFeHRyYSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeShndCkKYGBgCgoKYGBge3J9CiMgbG9hZCBkYXRhCnR1ZXNkYXRhIDwtIHRpZHl0dWVzZGF5Ujo6dHRfbG9hZCgnMjAyMS0wMy0wOScpCmIgPSB0dWVzZGF0YSRyYXdfYmVjaGRlbAptID0gdHVlc2RhdGEkbW92aWVzCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KGIkeWVhcikKc3VtbWFyeShtJHllYXIpCmBgYAoKIyMjIE91dGNvbWVzIGFuZCBtZXRhc2NvcmUKCmBgYHtyfQojIE91dGNvbWVzIGFuZCBNZXRhc2NvcmUKIyBzaGFyZWQgb24gdHdpdHRlciAoaHR0cHM6Ly90d2l0dGVyLmNvbS9sZWVvbG5leTMvc3RhdHVzLzEzNjkyMzg4MTAwODU3Nzc0MTAvcGhvdG8vMSkKbSAlPiUgCiAgZmlsdGVyKCFpcy5uYShtZXRhc2NvcmUpKSAlPiUKICBmaWx0ZXIoYmV0d2Vlbih5ZWFyLCAxOTcwLDIwMjApKSAlPiUKICBtdXRhdGUoYmluYXJ5PSBpZmVsc2UoYmluYXJ5PT0iRkFJTCIsIkJlY2hkZWwgVGVzdDogRmFpbCIsIkJlY2hkZWwgVGVzdDogUGFzcyIpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Y2xlYW5fdGVzdCwgeT1tZXRhc2NvcmUsIGNvbG9yPWNsZWFuX3Rlc3QpKSArIAogIGdlb21faGFsZl9wb2ludChzaXplPTAuOCwgYWxwaGE9MC41KSArIAogIGdlb21faGFsZl9ib3hwbG90KG91dGxpZXIuc2l6ZSA9IC0xKSArIAogIGZhY2V0X2dyaWQofmJpbmFyeSxzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjZjc5ZDY1IiwiI2Y0ODQ1ZiIsIiNmMjcwNTkiLCIjZjI1YzU0IiwiIzMzNjU4YSIpKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9OSwgZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBsaW5laGVpZ2h0ID0gMTApLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoY29sb3I9IiM2ZDZhNzUiLCBzaXplPTgpLAogICAgICAgICNwbG90LnRpdGxlLnBvc2l0aW9uID0gInBsb3QiLAogICAgICAgIHBsb3QubWFyZ2luPXVuaXQoYygwLjQsMS4yLDAuNCwwLjMpLCJjbSIpKSArCiAgbGFicyh4PSJPdXRjb21lcyBvZiBCZWNoZGVsIFRlc3QiLAogICAgICAgeT0iTWV0YXNjb3JlIiwKICAgICAgIHRpdGxlPSJCZWNoZGVsIFRlc3QgT3V0Y29tZXMgYW5kIE1ldGFzY29yZSBvZiBNb3ZpZXMgKDE5NzAgdG8gMjAxMykiLAogICAgICAgY2FwdGlvbj0iRGF0YSBmcm9tIEZpdmVUaGlydHlFaWdodCIpCmBgYAoKCmBgYHtyfQojIE91dGNvbWVzIGFuZCBEb21lc3RpYyBHcm9zcyAKbTEgPSBtCm0xJGRvbWdyb3NzXzIwMTM9IGFzLm51bWVyaWMobTEkZG9tZ3Jvc3NfMjAxMykKCnlsYWIgPSBjKDAsNTAwLDEwMDAsMTUwMCkKbTEgJT4lIAogIGZpbHRlcighaXMubmEoZG9tZ3Jvc3NfMjAxMykpICU+JQogIGZpbHRlcihiZXR3ZWVuKHllYXIsIDE5NzAsMjAyMCkpICU+JQogIG11dGF0ZShiaW5hcnk9IGlmZWxzZShiaW5hcnk9PSJGQUlMIiwiQmVjaGRlbCBUZXN0OiBGYWlsIiwiQmVjaGRlbCBUZXN0OiBQYXNzIikpICU+JQogIGdncGxvdChhZXMoeD1jbGVhbl90ZXN0LCB5PWRvbWdyb3NzXzIwMTMsIGNvbG9yPWNsZWFuX3Rlc3QpKSArIAogIGdlb21faGFsZl9wb2ludChzaXplPTAuOCwgYWxwaGE9MC41KSArIAogIGdlb21faGFsZl9ib3hwbG90KG91dGxpZXIuc2l6ZSA9IC0xKSArIAogICNnZW9tX2ppdHRlcihzaXplPTAuOCwgYWxwaGE9MC4yLCBjb2xvcj0ieWVsbG93IikgKyAKICAjZ2VvbV9ib3hwbG90KGZpbGw9TkEpICsgCiAgZmFjZXRfZ3JpZCh+YmluYXJ5LHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIsKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBhc3RlKHlsYWIsICJNIiksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IDEwXjYgKiB5bGFiCiAgKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI2Y3OWQ2NSIsIiNmNDg0NWYiLCIjZjI3MDU5IiwiI2YyNWM1NCIsIiMzMzY1OGEiKSkgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTkpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAjcGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwbG90IiwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKQogICAgICAgICkrCiAgbGFicyh4PSJPdXRjb21lIG9mIEJlY2hkZWwgVGVzdCIsCiAgICAgICB5PSJEb21lc3RpYyBncm9zcyAoaW4gbWlsbGlvbnMpIiwKICAgICAgIHRpdGxlPSJCZWNoZGVsIFRlc3QgT3V0Y29tZXMgYW5kIERvbWVzdGljIEdyb3NzIG9mIE1vdmllcyAoMTk3MCB0byAyMDEzKSIsCiAgICAgICBzdWJ0aXRsZT0gIkRvbWVzdGljIGdyb3NzIG5vcm1hbGlzZWQgdG8gMjAxMyBkb2xsYXJzIikKCmBgYAoKCgojIyMgQmVjaGRlbCB0ZXN0IHJhdGluZ3MgKDAtMykKCmBgYHtyfQpiICU+JSBncm91cF9ieShyYXRpbmcpICU+JSB0YWxseSgpICU+JSBtdXRhdGUocHJvcD1yb3VuZChuL3N1bShuKSwzKSkKYGBgCgoKYGBge3J9CmIgJT4lIAogIGZpbHRlcihiZXR3ZWVuKHllYXIsIDE5NzAsMjAyMCkpICU+JQogIGdyb3VwX2J5KHllYXIsIHJhdGluZykgJT4lCiAgdGFsbHkoKSAlPiUgbXV0YXRlKHByb3A9cm91bmQobi9zdW0obiksMykpICU+JQogIG11dGF0ZShyYXRpbmdfbG9uZyA9IGNhc2Vfd2hlbihyYXRpbmc9PTAgfiJVbnNjb3JlZCIsCiAgICAgICAgICAgICAgICAgICByYXRpbmc9PTEgfiJBdCBsZWFzdCB0d28gbmFtZWQgd29tZW4iLAogICAgICAgICAgICAgICAgICAgcmF0aW5nPT0yIH4iV29tZW4gdGFsayB0byBlYWNoIG90aGVyIiwKICAgICAgICAgICAgICAgICAgIHJhdGluZz09MyB+IkFib3V0IHNvbWV0aGluZyBiZXNpZGVzIGEgbWFuIgogICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9cHJvcCwgY29sb3I9IHJhdGluZ19sb25nKSkgKyAKICBnZW9tX3BvaW50KGtleV9nbHlwaCA9IGRyYXdfa2V5X3BvaW50LCBhbHBoYT0wLjgpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjYTgyMDFhIiwiIzBmOGI4ZCIsIiMxNDM2NDIiLCIjZWM5YTI5IikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArCiAgdGhlbWVfbGlnaHQoYmFzZV9zaXplPTEwKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIiwKICAgICAgICAjcGxvdC50aXRsZS5wb3NpdGlvbj0icGxvdCIsCiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249J2xlZnQnLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05KSwKICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigwLDAsMCwwKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikKICAgICAgICApICsKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MixvdmVycmlkZS5hZXMgPSBsaXN0KHNoYXBlID0gMTUsIHNpemUgPTQpKSkgKyAKICBsYWJzKHg9IlllYXIiLHk9IlBlcmNlbnRhZ2UiLGNvbG9yPSJSYXRpbmciLAogICAgICAgdGl0bGU9IkJlY2hkZWwgVGVzdCBSYXRpbmdzIG9mIE1vdmllcyBmcm9tIDE5NzAgdG8gMjAyMCIsCiAgICAgICBjYXB0aW9uPSJEYXRhIGZyb20gRml2ZVRoaXJ0eUVpZ2h0IikKYGBgCgojIyMgTW92aWUgY291bnQgYnkgZ2VucmUKCmBgYHtyfQptPSBtICU+JSBmaWx0ZXIoIWlzLm5hKHR5cGUpKSAKbSAlPiUgCiAgc2VsZWN0KGltZGIsIGdlbnJlKSAlPiUgCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBnZW5yZSkgJT4lIAogIGZpbHRlcighaXMubmEod29yZCkpICU+JSAKICBncm91cF9ieSh3b3JkKSAlPiUgCiAgdGFsbHkoc29ydD1UKSAlPiUgCiAgZmlsdGVyKHdvcmQhPSJmaSIpICU+JSBtdXRhdGUod29yZD1pZmVsc2Uod29yZD09InNjaSIsInNjaS1maSIsd29yZCkpICU+JSAKICBnZ3Bsb3QoYWVzKHk9cmVvcmRlcih3b3JkLG4pLCB4PW4pKSArIAogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZSA9IDEwKSArIAogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSkgKwogIGxhYnMoeD0iQ291bnQiLAogICAgICAgeT0iR2VucmUiLAogICAgICAgdGl0bGU9Ik1vdmllcyBDb3VudCBieSBHZW5yZSIpCmBgYAoKCiMjIyBNZWRpYW4gSU1EQiByYXRpbmcgYW5kIG1ldGFzY2FyZQoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgbWVkaWFuIElNREIgcmF0aW5nIGFuZCBNZXRhc2NvcmUgCiMgcmVmZXJlbmNlOiBUb2JpYXMgU3RhbGRlciAoaHR0cHM6Ly90d2l0dGVyLmNvbS90b2ViMTgvc3RhdHVzLzEzNjkyNjU1Mjc3MTQxMDMyOTgvcGhvdG8vMSkKCm1fbWVkaWFuPSBtICU+JSAKICBzZWxlY3QoeWVhciwgYmluYXJ5LCBidWRnZXQsIG1ldGFzY29yZSwgaW1kYl9yYXRpbmcsIGdlbnJlLCB0eXBlKSU+JQogIGRyb3BfbmEoZ2VucmUsIG1ldGFzY29yZSwgYmluYXJ5LCBpbWRiX3JhdGluZywgdHlwZSkgJT4lIAogIGZpbHRlcih5ZWFyPj0xOTgwKSAlPiUKICBncm91cF9ieSh5ZWFyLCBiaW5hcnkpICU+JQogIHN1bW1hcmlzZShgTWV0YXNjb3JlYCA9IG1lZGlhbihtZXRhc2NvcmUpLAogICAgICAgICAgICBgSU1EQiBSYXRpbmdgID0gbWVkaWFuKGltZGJfcmF0aW5nKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHM9YE1ldGFzY29yZWA6YElNREIgUmF0aW5nYCwgdmFsdWVzX2Ryb3BfbmE9VFJVRSkgJT4lCiAgbXV0YXRlKGJpbmFyeT0gaWZlbHNlKGJpbmFyeT09IkZBSUwiLCJGYWlsIiwiUGFzcyIpKQoKZ2dwbG90KG1fbWVkaWFuLCBhZXMoeD15ZWFyLCB5PSB2YWx1ZSwgY29sb3I9YmluYXJ5KSkgKyAKICBnZ2J1bXA6Omdlb21fYnVtcChhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSwgY29sb3IgPSBiaW5hcnkpLCBzaG93LmxlZ2VuZCA9IFRSVUUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2I3MDk0YyIsIiMwMDkxYWQiKSkgKyAKICBmYWNldF93cmFwKH5uYW1lLCBzY2FsZXM9ImZyZWUiKSArIAogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZSA9IDEwKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gImxlZnQiLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05KSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJ3aGl0ZSIsIGZhY2U9ImJvbGQiKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InNsYXRlZ3JleSIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSkgKyAKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2hhcGUgPSAxNSwgc2l6ZSA9NykpKSArIAogIGxhYnMoeD0iIix5PSIiLCBjb2xvcj0iQmVjaGRlbCBUZXN0IiwgdGl0bGU9Ik1lZGlhbiBJTURCIFJhdGluZyBhbmQgTWV0YXNjb3JlLCBieSBCZWNoZGVsIFRlc3QgT3V0Y29tZSIpCiAKYGBgCgojIyMgQnVkZ2V0LCBkb21lc3RpYyBncm9zcywgaW1kYiwgYmVjaGRlbCB0ZXN0CgpgYGB7ciwgd2FybmluZz1GQUxTRX0KIyBidWRnZXQsIGRvbWVzdGljIGdyb3NzLCBpbWRiLCBiZWNoZGVsIHRlc3QgKG1vdmllcyAxOTcwIHRvIDIwMTMpCiMgcmVmZXJlbmNlOiBTaGVyb3NoYSBSYWogKGh0dHBzOi8vdHdpdHRlci5jb20vU2hlcm9zaGFSL3N0YXR1cy8xMzY5NDU1NTgxNDIyMDkyMjg4L3Bob3RvLzEpCgpwMSA9IG0xICU+JQogIGZpbHRlcihidWRnZXQ+MTAwMDAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9YnVkZ2V0XzIwMTMvMTAwMDAwMCwgeT1kb21ncm9zc18yMDEzLzEwMDAwMDAsIGNvbG9yPWJpbmFyeSwgc2l6ZT1pbWRiX3ZvdGVzLzEwMDApKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNiNzA5NGMiLCIjMDA5MWFkIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBsYWJlbF9udW1iZXIoc3VmZml4PSJNIiksIHRyYW5zID0gImxvZzEwIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1sYWJlbF9udW1iZXIoc3VmZml4PSJNIiksIHRyYW5zID0gImxvZzEwIikgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobGFiZWw9bGFiZWxfbnVtYmVyKHN1ZmZpeD0iSyIpKSArIAogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05LjUsIGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikpICsgCiAgbGFicyh4PSJCdWRnZXQgKGxvZykiLAogICAgICAgeT0iRG9tZXN0aWMgZ3Jvc3MgKGxvZykiLAogICAgICAgc2l6ZT0iSU1EQiB2b3RlcyIsCiAgICAgICBjb2xvcj0iQmVjaGRlbCBUZXN0IiwKICAgICAgIHN1YnRpdGxlPSJCdWRnZXQgYW5kIGRvbWVzdGljIGdyb3NzIG5vcm1hbGlzZWQgdG8gMjAxMyBkb2xsYXJzIiwKICAgICAgIHRpdGxlPSJNb3ZpZXMgZnJvbSAxOTcwIHRvIDIwMTMsIHdpdGggYnVkZ2V0IG92ZXIgMTAwIG1pbGxpb24iKSAKCmdnTWFyZ2luYWwocDEsIGdyb3VwQ29sb3VyID0gVCwgZ3JvdXBGaWxsID0gVCkgI3R5cGU9J2JveHBsb3QKYGBgCgojIyMgVG90YWwgZ3Jvc3MgcmV2ZW51ZSBieSBkZWNhZGUKCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQptMSA9IG0KbTEkZG9tZ3Jvc3NfMjAxMz0gYXMubnVtZXJpYyhtMSRkb21ncm9zc18yMDEzKQptMSRpbnRncm9zc18yMDEzPSBhcy5udW1lcmljKG0xJGludGdyb3NzXzIwMTMpCm0xJGludF9kb21fMjAxMyA9IG0xJGRvbWdyb3NzXzIwMTMgKyBtMSRpbnRncm9zc18yMDEzCgptMSAlPiUgCiAgbXV0YXRlKGRlY2FkZT0geWVhci0oeWVhciAlJSAxMCkpICU+JSAjIGdldCBkZWNhZGUgCiAgZ2dwbG90KGFlcyh4PWZhY3RvcihkZWNhZGUpLCB5PWludF9kb21fMjAxMy8xMDAwMDAwMDAwLCBjb2xvcj1iaW5hcnkpKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNiNzA5NGMiLCIjMDA5MWFkIikpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPWxhYmVsX251bWJlcihzdWZmaXg9IkIiKSkgKwogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZT0xMCkgKyAKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikpICsKICBsYWJzKHk9IlRvdGFsIEdyb3NzIiwKICAgICAgIHg9IkRlY2FkZSIsCiAgICAgICBjb2xvcj0iQmVjaGRlbCBUZXN0IiwgCiAgICAgICB0aXRsZT0iVG90YWwgR3Jvc3MgUmV2ZW51ZSAoRG9tZXN0aWMgYW5kIEludGVybmF0aW9uYWwpIiwKICAgICAgIHN1YnRpdGxlPSJNb3ZpZXMgZnJvbSAxOTcwIHRvIDIwMTMsIGdyb3NzIHZhbHVlcyBub3JtYWxpc2VkIHRvIDIwMTMgZG9sbGFycyIpCmBgYAoKIyMjIENvbnRlbnQgcmF0aW5nIGFuZCBiZWNoZGVsIHRlc3QgCgpgYGB7cn0KdGFibGUobSRyYXRlZCkKCm0gJT4lIAogIGZpbHRlcihyYXRlZCA9PSAiUiJ8IHJhdGVkID09IlBHLTEzIiB8IHJhdGVkID09ICJQRyIpICU+JSAKICBncm91cF9ieShyYXRlZCwgYmluYXJ5KSAlPiUgCiAgdGFsbHkoKSAlPiUKICBtdXRhdGUocGVyY2VudD1yb3VuZChuL3N1bShuKSw0KSkgJT4lCiAgbXV0YXRlKGJpbmFyeSA9IGlmZWxzZShiaW5hcnk9PSJGQUlMIiwiRmFpbCIsIlBhc3MiKSkgJT4lIAogIHJlbmFtZSgiQmVjaGRlbCBUZXN0IiA9ICJiaW5hcnkiLCAiUmF0ZWQiPSJyYXRlZCIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9Ik1vdmllcyAxOTcwIHRvIDIwMTMiLCBzdWJ0aXRsZT0gIkNvbnRlbnQgUmF0aW5nIGFuZCBCZWNoZGVsIFRlc3QgT3V0Y29tZSIpICU+JQogIGZtdF9wZXJjZW50KGNvbHVtbnM9dmFycyhwZXJjZW50KSkgJT4lCiAgI2RhdGFfY29sb3IoY29sdW1ucz12YXJzKFJhdGVkKSwKICAgICAgICAgICAgICNjb2xvcnM9c2NhbGVzOjpjb2xfZmFjdG9yKHBhbGV0dGU9YygiI2M5YWRhNyIsIiM5YThjOTgiLCIjNGE0ZTY5IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkb21haW49YygiUEciLCJQRy0xMyIsIlIiKSkpICU+JQogIGRhdGFfY29sb3IoY29sdW1uPXZhcnMocGVyY2VudCksCiAgICAgICAgICAgICBjb2xvcnM9c2NhbGVzOjpjb2xfbnVtZXJpYyhwYWxldHRlPWMoIiNkOWVkOTIiLCIjMzRhMGE0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW49YygwLjQxLDAuNTkpKSkKICAKYGBgCgojIyMgRG9tZXN0aWMgZ3Jvc3MgYnkgY29udGVudCByYXRpbmcgYW5kIGJlY2hkZWwgdGVzdAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9Cm0xICU+JQogIGZpbHRlcihyYXRlZCA9PSAiUiJ8IHJhdGVkID09IlBHLTEzIiB8IHJhdGVkID09ICJQRyIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmF0ZWQsIHk9ZG9tZ3Jvc3NfMjAxMy8xMDAwMDAwLCBjb2xvcj0gYmluYXJ5KSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjYjcwOTRjIiwiIzAwOTFhZCIpKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJEb21lc3RpYyBHcm9zcyIsIGxhYmVsPWxhYmVsX251bWJlcihzdWZmaXg9Ik0iKSkgKyAKICB0aGVtZV9saWdodChiYXNlX3NpemU9MTApICsgCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpKSArCiAgbGFicyh4PSJDb250ZW50IFJhdGluZyIsCiAgICAgICBjb2xvcj0iQmVjaGRlbCBUZXN0IiwgCiAgICAgICB0aXRsZT0iRG9tZXN0aWMgR3Jvc3MgYnkgQ29udGVudCBSYXRpbmcgYW5kIEJlY2hkZWwgVGVzdCBPdXRjb21lIiwKICAgICAgIHN1YnRpdGxlPSJNb3ZpZXMgZnJvbSAxOTcwIHRvIDIwMTMsIHZhbHVlcyBub3JtYWxpc2VkIHRvIDIwMTMgZG9sbGFycyIpCmBgYAoKCgoKCgo=