Every Wednesday and Friday I publish a Substack newsletter called Monte Carlo Football Picks. On Wednesday I publish projections for the Thursday Night game and Friday includes the picks for the rest of the week. If you are interested in the NFL, please subscribe, it’s FREE!

This file uses the early power ratings for Week 6 to simulate the Thursday Night Football game. The ratings are updated for injuries before publishing full picks on Fridays.

Load packages

library(tidyverse)
library(tidyquant)
library(ggimage)
library(ggrepel)
library(knitr)
library(kableExtra)

Load required data files

ratings <- read_csv("Week 06/inputs/power_ratings.csv") 
schedule <- read_csv("Week 06/inputs/schedule_tnf.csv")
scores <- read_csv("Week 06/inputs/common_scores.csv", col_types = "n")
df.logos <- read.csv("Week 06/inputs/nfl_logos.csv")

Function to simulate scores. Default line is 0, number of simulations is 100,000, home field advantage is 0 and average power rating is 25. These values will be used if not supplied in the schedule_tnf.csv file.

mc_sim <- function(home, away, data = ratings, line = 0, n = 100000, hfa = 0, mean = 25){
  
  #pull ratings together for both teams in matchup
  h_off <-ratings %>%
    filter(Team == home & Type == "off_rating") %>%
    select(Team, Type, MC_PR, MC_STD)
  
  h_def <-ratings %>%
    filter(Team == home & Type == "def_rating") %>%
    select(Team, Type, MC_PR, MC_STD)
  
  
  a_off <-ratings %>%
    filter(Team == away & Type == "off_rating") %>%
    select(Team, Type, MC_PR, MC_STD)
  
  a_def <-ratings %>%
    filter(Team == away & Type == "def_rating") %>%
    select(Team, Type, MC_PR, MC_STD)
  
  
  #generate scores
  set.seed(13)
  
  h_score <- round(rnorm(n, mean = h_off$MC_PR, sd = h_off$MC_STD) + 
    hfa +
    rnorm(n, mean = a_def$MC_PR, sd = a_def$MC_STD) - mean, digits = 0)
  
  a_score <- round(rnorm(n, mean = a_off$MC_PR, sd = a_off$MC_STD) +
    rnorm(n, mean = h_def$MC_PR, sd = h_def$MC_STD) - mean, digits = 0)
  
  matchup <<- bind_cols(hm = h_score, aw = a_score) %>%
    mutate(home_pf = VLOOKUP(hm, scores, rating, score)) %>%
    mutate(away_pf = VLOOKUP(aw, scores, rating, score)) %>%
    mutate(margin = home_pf - away_pf) %>%
    mutate(cover = if_else(margin + line > 0, 1, 0)) %>%
    mutate(win = if_else(margin > 0, 1, 0)) %>%
    mutate(home_team = home, away_team = away) %>%
    select(home_team, home_pf, away_team, away_pf, margin, cover, win)
    
  win_pct <- sum(matchup$win)/n
  cover_pct <- sum(matchup$cover)/n
  
  tibble(home, away, line, win_pct, cover_pct) %>%
    pivot_longer(cols = win_pct:cover_pct, names_to = "Type",
                 values_to = "Home_Confidence") %>%
    mutate(Away_Confidence = 1 - Home_Confidence)

}

Iterate mc_sim function over schedule.csv to get results for all games in the schedule_tnf.csv file.

predictions <- pmap_dfr(schedule, mc_sim)

hwp <- predictions %>%
  filter(Type == "win_pct") %>%
  mutate(type = "SU", location = "home") %>%
  select(type, team = home, opponent = away, line, location, confidence = Home_Confidence)

awp <- predictions %>%
  filter(Type == "win_pct") %>%
  mutate(type = "SU", location = "away", line = line * -1) %>%
  select(type, team = away, opponent = home, line, location, confidence = Away_Confidence)

hcp <- predictions %>%
  filter(Type == "cover_pct") %>%
  mutate(type = "ATS", location = "home") %>%
  select(type, team = home, opponent = away, line, location, confidence = Home_Confidence)

acp <- predictions %>%
  filter(Type == "cover_pct") %>%
  mutate(type = "ATS", location = "away", line = line * -1) %>%
  select(type, team = away, opponent = home, line, location, confidence = Away_Confidence) 

predictions2 <- bind_rows(hwp, awp, hcp, acp) %>%
  pivot_wider(names_from = type, values_from = confidence)

write_csv(predictions2, file = "Week 06/tnf_predictions.csv")

predictions2

The variable “matchup” is a global variable created when mc_sim is run. It saves the data of the last game that was run through the function. Use this data to plot score frequencies.

ggplot(matchup, aes(x = margin)) +
  geom_histogram(binwidth = 1, color = "black", fill = "white") +
  geom_vline(aes(xintercept = mean(margin)), color = "blue", linetype = "dashed", size = 1) +
  geom_vline(aes(xintercept = -6.5), color = "red", linetype = "dashed", size = 1) +
  ggtitle("Tampa Bay at Philadelphia \n Distribution of Projected Margin of Victory") +
  xlab("Eagles score minus Bucs score \n blue line = average margin \n red line = betting line") + ylab("Count") +
  scale_x_continuous(breaks = c(-35, -25, -20, -14, -10, -7, -3, 0, 3, 7, 10, 14, 20, 25)) +
  theme_classic() +
  theme_linedraw() +
  theme(
    plot.title = element_text(color="red", size=14, face="bold.italic"),
    axis.title.x = element_text(color="blue", size=14, face="bold"),
    axis.title.y = element_text(color="#993333", size=14, face="bold"),
    panel.grid.major = element_blank(),
          panel.grid.minor = element_blank()
)

Top 10 Scores

score_n <- matchup %>% count(home_pf, away_pf) %>% arrange(desc(n)) %>%
  rename("Home" = home_pf, "Away" = away_pf, "Count" = n)

kable(head(score_n, 10)) %>%
  kable_styling(font_size = 24, bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Home Away Count
20 38 2786
24 38 2712
27 38 2633
20 31 2609
17 38 2568
24 31 2506
20 27 2479
24 27 2430
27 27 2410
14 38 2398
NA

Top 10 Margins of Victory (Home score minus Away score)

margin_n <- matchup %>% count(margin) %>% arrange(desc(n)) %>%
  rename("Count" = n)

kable(head(margin_n, 10)) %>%
  kable_styling(font_size = 24, bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
margin Count
-7 10637
0 8673
-14 8523
-10 6506
-17 5724
-3 5591
-11 5540
-4 4840
-21 4585
7 4132
LS0tDQp0aXRsZTogIk1vbnRlIENhcmxvIFNpbXVsYXRpb25zOiBXZWVrIDYgVE5GIChCdWNzIEAgRWFnbGVzKSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkV2ZXJ5IFdlZG5lc2RheSBhbmQgRnJpZGF5IEkgcHVibGlzaCBhIFN1YnN0YWNrIG5ld3NsZXR0ZXIgY2FsbGVkIFtNb250ZSBDYXJsbyBGb290YmFsbCBQaWNrc10oaHR0cHM6Ly9tY2ZwLnN1YnN0YWNrLmNvbS8pLiBPbiBXZWRuZXNkYXkgSSBwdWJsaXNoIHByb2plY3Rpb25zIGZvciB0aGUgVGh1cnNkYXkgTmlnaHQgZ2FtZSBhbmQgRnJpZGF5IGluY2x1ZGVzIHRoZSBwaWNrcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHdlZWsuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgTkZMLCBwbGVhc2UgW3N1YnNjcmliZV0oaHR0cHM6Ly9tY2ZwLnN1YnN0YWNrLmNvbS8pLCBpdCdzIEZSRUUhDQoNClRoaXMgZmlsZSB1c2VzIHRoZSBlYXJseSBwb3dlciByYXRpbmdzIGZvciBXZWVrIDYgdG8gc2ltdWxhdGUgdGhlIFRodXJzZGF5IE5pZ2h0IEZvb3RiYWxsIGdhbWUuIFRoZSByYXRpbmdzIGFyZSB1cGRhdGVkIGZvciBpbmp1cmllcyBiZWZvcmUgcHVibGlzaGluZyBmdWxsIHBpY2tzIG9uIEZyaWRheXMuDQoNCg0KDQpMb2FkIHBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHlxdWFudCkNCmxpYnJhcnkoZ2dpbWFnZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmBgYA0KDQoNCg0KTG9hZCByZXF1aXJlZCBkYXRhIGZpbGVzDQoNCmBgYHtyfQ0KcmF0aW5ncyA8LSByZWFkX2NzdigiV2VlayAwNi9pbnB1dHMvcG93ZXJfcmF0aW5ncy5jc3YiKSANCnNjaGVkdWxlIDwtIHJlYWRfY3N2KCJXZWVrIDA2L2lucHV0cy9zY2hlZHVsZV90bmYuY3N2IikNCnNjb3JlcyA8LSByZWFkX2NzdigiV2VlayAwNi9pbnB1dHMvY29tbW9uX3Njb3Jlcy5jc3YiLCBjb2xfdHlwZXMgPSAibiIpDQpkZi5sb2dvcyA8LSByZWFkLmNzdigiV2VlayAwNi9pbnB1dHMvbmZsX2xvZ29zLmNzdiIpDQpgYGANCg0KDQoNCkZ1bmN0aW9uIHRvIHNpbXVsYXRlIHNjb3Jlcy4gRGVmYXVsdCBsaW5lIGlzIDAsIG51bWJlciBvZiBzaW11bGF0aW9ucyBpcyAxMDAsMDAwLCBob21lIGZpZWxkIGFkdmFudGFnZSBpcyAwIGFuZCBhdmVyYWdlIHBvd2VyIHJhdGluZyBpcyAyNS4gVGhlc2UgdmFsdWVzIHdpbGwgYmUgdXNlZCBpZiBub3Qgc3VwcGxpZWQgaW4gdGhlIHNjaGVkdWxlX3RuZi5jc3YgZmlsZS4NCg0KYGBge3J9DQptY19zaW0gPC0gZnVuY3Rpb24oaG9tZSwgYXdheSwgZGF0YSA9IHJhdGluZ3MsIGxpbmUgPSAwLCBuID0gMTAwMDAwLCBoZmEgPSAwLCBtZWFuID0gMjUpew0KICANCiAgI3B1bGwgcmF0aW5ncyB0b2dldGhlciBmb3IgYm90aCB0ZWFtcyBpbiBtYXRjaHVwDQogIGhfb2ZmIDwtcmF0aW5ncyAlPiUNCiAgICBmaWx0ZXIoVGVhbSA9PSBob21lICYgVHlwZSA9PSAib2ZmX3JhdGluZyIpICU+JQ0KICAgIHNlbGVjdChUZWFtLCBUeXBlLCBNQ19QUiwgTUNfU1REKQ0KICANCiAgaF9kZWYgPC1yYXRpbmdzICU+JQ0KICAgIGZpbHRlcihUZWFtID09IGhvbWUgJiBUeXBlID09ICJkZWZfcmF0aW5nIikgJT4lDQogICAgc2VsZWN0KFRlYW0sIFR5cGUsIE1DX1BSLCBNQ19TVEQpDQogIA0KICANCiAgYV9vZmYgPC1yYXRpbmdzICU+JQ0KICAgIGZpbHRlcihUZWFtID09IGF3YXkgJiBUeXBlID09ICJvZmZfcmF0aW5nIikgJT4lDQogICAgc2VsZWN0KFRlYW0sIFR5cGUsIE1DX1BSLCBNQ19TVEQpDQogIA0KICBhX2RlZiA8LXJhdGluZ3MgJT4lDQogICAgZmlsdGVyKFRlYW0gPT0gYXdheSAmIFR5cGUgPT0gImRlZl9yYXRpbmciKSAlPiUNCiAgICBzZWxlY3QoVGVhbSwgVHlwZSwgTUNfUFIsIE1DX1NURCkNCiAgDQogIA0KICAjZ2VuZXJhdGUgc2NvcmVzDQogIHNldC5zZWVkKDEzKQ0KICANCiAgaF9zY29yZSA8LSByb3VuZChybm9ybShuLCBtZWFuID0gaF9vZmYkTUNfUFIsIHNkID0gaF9vZmYkTUNfU1REKSArIA0KICAgIGhmYSArDQogICAgcm5vcm0obiwgbWVhbiA9IGFfZGVmJE1DX1BSLCBzZCA9IGFfZGVmJE1DX1NURCkgLSBtZWFuLCBkaWdpdHMgPSAwKQ0KICANCiAgYV9zY29yZSA8LSByb3VuZChybm9ybShuLCBtZWFuID0gYV9vZmYkTUNfUFIsIHNkID0gYV9vZmYkTUNfU1REKSArDQogICAgcm5vcm0obiwgbWVhbiA9IGhfZGVmJE1DX1BSLCBzZCA9IGhfZGVmJE1DX1NURCkgLSBtZWFuLCBkaWdpdHMgPSAwKQ0KICANCiAgbWF0Y2h1cCA8PC0gYmluZF9jb2xzKGhtID0gaF9zY29yZSwgYXcgPSBhX3Njb3JlKSAlPiUNCiAgICBtdXRhdGUoaG9tZV9wZiA9IFZMT09LVVAoaG0sIHNjb3JlcywgcmF0aW5nLCBzY29yZSkpICU+JQ0KICAgIG11dGF0ZShhd2F5X3BmID0gVkxPT0tVUChhdywgc2NvcmVzLCByYXRpbmcsIHNjb3JlKSkgJT4lDQogICAgbXV0YXRlKG1hcmdpbiA9IGhvbWVfcGYgLSBhd2F5X3BmKSAlPiUNCiAgICBtdXRhdGUoY292ZXIgPSBpZl9lbHNlKG1hcmdpbiArIGxpbmUgPiAwLCAxLCAwKSkgJT4lDQogICAgbXV0YXRlKHdpbiA9IGlmX2Vsc2UobWFyZ2luID4gMCwgMSwgMCkpICU+JQ0KICAgIG11dGF0ZShob21lX3RlYW0gPSBob21lLCBhd2F5X3RlYW0gPSBhd2F5KSAlPiUNCiAgICBzZWxlY3QoaG9tZV90ZWFtLCBob21lX3BmLCBhd2F5X3RlYW0sIGF3YXlfcGYsIG1hcmdpbiwgY292ZXIsIHdpbikNCiAgICANCiAgd2luX3BjdCA8LSBzdW0obWF0Y2h1cCR3aW4pL24NCiAgY292ZXJfcGN0IDwtIHN1bShtYXRjaHVwJGNvdmVyKS9uDQogIA0KICB0aWJibGUoaG9tZSwgYXdheSwgbGluZSwgd2luX3BjdCwgY292ZXJfcGN0KSAlPiUNCiAgICBwaXZvdF9sb25nZXIoY29scyA9IHdpbl9wY3Q6Y292ZXJfcGN0LCBuYW1lc190byA9ICJUeXBlIiwNCiAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkhvbWVfQ29uZmlkZW5jZSIpICU+JQ0KICAgIG11dGF0ZShBd2F5X0NvbmZpZGVuY2UgPSAxIC0gSG9tZV9Db25maWRlbmNlKQ0KDQp9DQoNCmBgYA0KDQoNCg0KSXRlcmF0ZSBtY19zaW0gZnVuY3Rpb24gb3ZlciBzY2hlZHVsZS5jc3YgdG8gZ2V0IHJlc3VsdHMgZm9yIGFsbCBnYW1lcyBpbiB0aGUgc2NoZWR1bGVfdG5mLmNzdiBmaWxlLg0KDQpgYGB7cn0NCnByZWRpY3Rpb25zIDwtIHBtYXBfZGZyKHNjaGVkdWxlLCBtY19zaW0pDQoNCmh3cCA8LSBwcmVkaWN0aW9ucyAlPiUNCiAgZmlsdGVyKFR5cGUgPT0gIndpbl9wY3QiKSAlPiUNCiAgbXV0YXRlKHR5cGUgPSAiU1UiLCBsb2NhdGlvbiA9ICJob21lIikgJT4lDQogIHNlbGVjdCh0eXBlLCB0ZWFtID0gaG9tZSwgb3Bwb25lbnQgPSBhd2F5LCBsaW5lLCBsb2NhdGlvbiwgY29uZmlkZW5jZSA9IEhvbWVfQ29uZmlkZW5jZSkNCg0KYXdwIDwtIHByZWRpY3Rpb25zICU+JQ0KICBmaWx0ZXIoVHlwZSA9PSAid2luX3BjdCIpICU+JQ0KICBtdXRhdGUodHlwZSA9ICJTVSIsIGxvY2F0aW9uID0gImF3YXkiLCBsaW5lID0gbGluZSAqIC0xKSAlPiUNCiAgc2VsZWN0KHR5cGUsIHRlYW0gPSBhd2F5LCBvcHBvbmVudCA9IGhvbWUsIGxpbmUsIGxvY2F0aW9uLCBjb25maWRlbmNlID0gQXdheV9Db25maWRlbmNlKQ0KDQpoY3AgPC0gcHJlZGljdGlvbnMgJT4lDQogIGZpbHRlcihUeXBlID09ICJjb3Zlcl9wY3QiKSAlPiUNCiAgbXV0YXRlKHR5cGUgPSAiQVRTIiwgbG9jYXRpb24gPSAiaG9tZSIpICU+JQ0KICBzZWxlY3QodHlwZSwgdGVhbSA9IGhvbWUsIG9wcG9uZW50ID0gYXdheSwgbGluZSwgbG9jYXRpb24sIGNvbmZpZGVuY2UgPSBIb21lX0NvbmZpZGVuY2UpDQoNCmFjcCA8LSBwcmVkaWN0aW9ucyAlPiUNCiAgZmlsdGVyKFR5cGUgPT0gImNvdmVyX3BjdCIpICU+JQ0KICBtdXRhdGUodHlwZSA9ICJBVFMiLCBsb2NhdGlvbiA9ICJhd2F5IiwgbGluZSA9IGxpbmUgKiAtMSkgJT4lDQogIHNlbGVjdCh0eXBlLCB0ZWFtID0gYXdheSwgb3Bwb25lbnQgPSBob21lLCBsaW5lLCBsb2NhdGlvbiwgY29uZmlkZW5jZSA9IEF3YXlfQ29uZmlkZW5jZSkgDQoNCnByZWRpY3Rpb25zMiA8LSBiaW5kX3Jvd3MoaHdwLCBhd3AsIGhjcCwgYWNwKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHR5cGUsIHZhbHVlc19mcm9tID0gY29uZmlkZW5jZSkNCg0Kd3JpdGVfY3N2KHByZWRpY3Rpb25zMiwgZmlsZSA9ICJXZWVrIDA2L3RuZl9wcmVkaWN0aW9ucy5jc3YiKQ0KDQpwcmVkaWN0aW9uczINCmBgYA0KDQoNCg0KVGhlIHZhcmlhYmxlICJtYXRjaHVwIiBpcyBhIGdsb2JhbCB2YXJpYWJsZSBjcmVhdGVkIHdoZW4gbWNfc2ltIGlzIHJ1bi4gSXQgc2F2ZXMgdGhlIGRhdGEgb2YgdGhlIGxhc3QgZ2FtZSB0aGF0IHdhcyBydW4gdGhyb3VnaCB0aGUgZnVuY3Rpb24uIFVzZSB0aGlzIGRhdGEgdG8gcGxvdCBzY29yZSBmcmVxdWVuY2llcy4NCg0KYGBge3J9DQpnZ3Bsb3QobWF0Y2h1cCwgYWVzKHggPSBtYXJnaW4pKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVhbihtYXJnaW4pKSwgY29sb3IgPSAiYmx1ZSIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAxKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSAtNi41KSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVGFtcGEgQmF5IGF0IFBoaWxhZGVscGhpYSBcbiBEaXN0cmlidXRpb24gb2YgUHJvamVjdGVkIE1hcmdpbiBvZiBWaWN0b3J5IikgKw0KICB4bGFiKCJFYWdsZXMgc2NvcmUgbWludXMgQnVjcyBzY29yZSBcbiBibHVlIGxpbmUgPSBhdmVyYWdlIG1hcmdpbiBcbiByZWQgbGluZSA9IGJldHRpbmcgbGluZSIpICsgeWxhYigiQ291bnQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC0zNSwgLTI1LCAtMjAsIC0xNCwgLTEwLCAtNywgLTMsIDAsIDMsIDcsIDEwLCAxNCwgMjAsIDI1KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZV9saW5lZHJhdygpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvcj0icmVkIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZC5pdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsdWUiLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjOTkzMzMzIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KKQ0KDQpgYGANCg0KDQoNClRvcCAxMCBTY29yZXMNCg0KYGBge3J9DQpzY29yZV9uIDwtIG1hdGNodXAgJT4lIGNvdW50KGhvbWVfcGYsIGF3YXlfcGYpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JQ0KICByZW5hbWUoIkhvbWUiID0gaG9tZV9wZiwgIkF3YXkiID0gYXdheV9wZiwgIkNvdW50IiA9IG4pDQoNCmthYmxlKGhlYWQoc2NvcmVfbiwgMTApKSAlPiUNCiAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAyNCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGQUxTRSkNCg0KYGBgDQoNCg0KDQpUb3AgMTAgTWFyZ2lucyBvZiBWaWN0b3J5IChIb21lIHNjb3JlIG1pbnVzIEF3YXkgc2NvcmUpDQoNCmBgYHtyfQ0KbWFyZ2luX24gPC0gbWF0Y2h1cCAlPiUgY291bnQobWFyZ2luKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUNCiAgcmVuYW1lKCJDb3VudCIgPSBuKQ0KDQprYWJsZShoZWFkKG1hcmdpbl9uLCAxMCkpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDI0LCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCg==