library(tidyverse)
library(arrow)
library(gt)
library(ggrepel)
library(scales)
# This file holds ONLY the three exhibits used in the written piece. The full
# analytical workbook lives in 2026_wk01_review.Rmd -- that is where the story
# gets found; this is where it gets published.
source("../R/04_storyline_engine.R")
source("../R/05_viz_style.R")
TEAM <- "Syracuse"
SEASON <- params$season
WEEK <- params$week
FIG_DIR <- sprintf("figures/%d_wk%02d_story", SEASON, WEEK)
hist <- read_parquet("~/cfb-data/processed/team_game_metrics.parquet")
cur <- read_parquet("~/cfb-data/processed/team_game_metrics_2026.parquet")
fbs_teams <- unique(hist$team[hist$is_fbs_matchup])
# The reference class: FBS teams playing FCS opponents, all seasons on record.
ref <- hist |>
filter(team %in% fbs_teams, !is_fbs_matchup, !low_volume,
is.finite(off_avg_start_ytg))
# This week's peer group: the same situation, the same weekend.
peers <- cur |>
filter(team %in% fbs_teams, !low_volume, !is_fbs_matchup, week == WEEK)
su <- peers |> filter(team == TEAM)
# Helper: yards-to-goal reads as field position for a general audience.
as_field_pos <- function(ytg) sprintf("own %.1f", 100 - ytg)
n_seasons <- dplyr::n_distinct(ref$season)
su_rank <- rank(ref$off_avg_start_ytg)[0] # placeholder, computed below
su_rank <- rank(peers$off_avg_start_ytg)[peers$team == TEAM]
Exhibit 1 — The historical baseline
q <- quantile(ref$off_avg_start_ytg, c(0.10, 0.50), na.rm = TRUE)
# Computed, not hardcoded, so the projection can never drift out of sync with
# the table around it.
proj <- build_expectations(hist, TEAM, SEASON - 1, fbs_only = FALSE) |>
filter(metric == "off_avg_start_ytg")
proj_expected <- mean(c(proj$proj_form, proj$proj_own), na.rm = TRUE)
tibble::tibble(
Measure = c(
sprintf("Typical FBS team vs an FCS opponent (median of %s games)",
format(nrow(ref), big.mark = ",")),
"\"Notable\" bar, set before kickoff (top 10%)",
sprintf("%s — projected before the game", TEAM),
sprintf("%s — actual", TEAM)
),
`Yards to goal` = c(q[[2]], q[[1]], proj_expected, su$off_avg_start_ytg),
) |>
mutate(`Field position` = as_field_pos(`Yards to goal`)) |>
gt() |>
tab_header(
title = md("**Syracuse started 13 yards closer to the end zone than a typical FBS team does against an FCS opponent**"),
subtitle = md(sprintf(
"Average drive start | %d seasons of FBS-vs-FCS matchups (%d–%d), %s team-games",
n_seasons, min(ref$season), max(ref$season),
format(nrow(ref), big.mark = ",")))
) |>
fmt_number(columns = `Yards to goal`, decimals = 1) |>
cols_align("center", columns = -Measure) |>
cols_align("left", columns = Measure) |>
tab_style(
style = list(cell_fill(color = "#FFF3E6"), cell_text(weight = "bold")),
locations = cells_body(rows = grepl("actual", Measure))
) |>
tab_source_note(md(paste0(
"**", su_caption("2026 Week 1 | Syracuse vs New Hampshire"),
"** — lower yards-to-goal means better field position."))) |>
gt_theme_su()
| Syracuse started 13 yards closer to the end zone than a typical FBS team does against an FCS opponent |
| Average drive start | 12 seasons of FBS-vs-FCS matchups (2014–2025), 1,332 team-games |
| Measure |
Yards to goal |
Field position |
| Typical FBS team vs an FCS opponent (median of 1,332 games) |
66.6 |
own 33.4 |
| "Notable" bar, set before kickoff (top 10%) |
58.1 |
own 41.9 |
| Syracuse — projected before the game |
66.4 |
own 33.6 |
| Syracuse — actual |
53.5 |
own 46.5 |
| Data: CollegeFootballData via cfbfastR | 2026 Week 1 | Syracuse vs New Hampshire — lower yards-to-goal means better field position. |
Exhibit 2 — Third of 47 this week
fp <- peers |>
mutate(is_su = team == TEAM) |>
arrange(off_avg_start_ytg) |>
mutate(team = factor(team, levels = team))
p_fieldpos <- ggplot(fp, aes(x = off_avg_start_ytg, y = team, color = is_su)) +
geom_vline(xintercept = median(fp$off_avg_start_ytg), linetype = "dashed",
color = SU$muted, linewidth = 0.4) +
geom_point(aes(size = is_su)) +
ggrepel::geom_text_repel(
data = filter(fp, is_su),
aes(label = sprintf("%s — %.1f yards to goal\n(own %.1f)",
team, off_avg_start_ytg, 100 - off_avg_start_ytg)),
nudge_x = 2, nudge_y=2, size = 3.5, fontface = "bold", segment.color = NA,
lineheight = 0.95
) +
scale_color_manual(values = c(`FALSE` = SU$muted, `TRUE` = SU$orange), guide = "none") +
scale_size_manual(values = c(`FALSE` = 2, `TRUE` = 4), guide = "none") +
scale_x_reverse() +
labs(
title = sprintf("%s had the %s-best starting field position of any FBS team facing an FCS opponent in Week 1",
TEAM, scales::ordinal(su_rank)),
subtitle = sprintf(
"Average drive start, yards to goal — further right is better | %d comparable teams | Dashed line = group median",
nrow(fp)),
x = "Average yards to goal at drive start", y = NULL,
caption = su_caption("2026 Week 1 | FBS teams facing FCS opponents")
) +
theme_su(legend_pos = "none") +
theme(axis.text.y = element_text(size = 8))
save_fig(p_fieldpos, "field_position_vs_peers", height = 6.5)

Exhibit 3 — What each starting position produced
raw_wk <- sprintf("~/cfb-data/raw/pbp_inseason/pbp_%d_wk%02d.parquet", SEASON, WEEK)
drives <- read_parquet(raw_wk) |>
filter(pos_team == TEAM) |>
group_by(drive_id) |>
summarise(start_ytg = first(drive_start_yards_to_goal),
pts = first(drive_pts), .groups = "drop") |>
filter(!is.na(start_ytg), !is.na(pts))
drives |>
mutate(bucket = case_when(
start_ytg <= 50 ~ "1",
start_ytg <= 65 ~ "2",
TRUE ~ "3"
)) |>
group_by(bucket) |>
summarise(Drives = n(), Points = sum(pts), .groups = "drop") |>
mutate(
`Starting field position` = c(
"New Hampshire's side of midfield",
"Own 35 to midfield",
"Inside own 35"
)[as.integer(bucket)],
`Points per drive` = Points / Drives
) |>
select(`Starting field position`, Drives, Points, `Points per drive`) |>
gt() |>
tab_header(
title = md("**Short fields produced the most points, but the offense scored from everywhere**"),
subtitle = md(sprintf(
"%s offensive drives only | %d drives, %d points | Not split by score margin or time of game",
TEAM, nrow(drives), sum(drives$pts)))
) |>
fmt_number(columns = `Points per drive`, decimals = 2) |>
cols_align("center", columns = -`Starting field position`) |>
cols_align("left", columns = `Starting field position`) |>
tab_style(style = cell_text(weight = "bold"),
locations = cells_body(columns = `Starting field position`)) |>
data_color(columns = Points, method = "numeric", palette = SU_SEQ) |>
tab_source_note(md(paste0(
"**", su_caption("2026 Week 1 | Syracuse vs New Hampshire"),
"** — excludes the fumble-return touchdown and the safety, which were not offensive drives."))) |>
gt_theme_su()
| Short fields produced the most points, but the offense scored from everywhere |
| Syracuse offensive drives only | 15 drives, 54 points | Not split by score margin or time of game |
| Starting field position |
Drives |
Points |
Points per drive |
| New Hampshire's side of midfield |
6 |
26 |
4.33 |
| Own 35 to midfield |
3 |
17 |
5.67 |
| Inside own 35 |
6 |
11 |
1.83 |
| Data: CollegeFootballData via cfbfastR | 2026 Week 1 | Syracuse vs New Hampshire — excludes the fumble-return touchdown and the safety, which were not offensive drives. |
LS0tCnRpdGxlOiAiRmllbGQgUG9zaXRpb24gYW5kIHRoZSBTeXJhY3VzZSBXaW4iCnN1YnRpdGxlOiAiV2VlayAxIDIwMjYg4oCUIGV4aGliaXRzIGZvciBwdWJsaWNhdGlvbiIKYXV0aG9yOiAiQ2hyaXMgSmltZW5leiIKZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIgpwYXJhbXM6CiAgc2Vhc29uOiAyMDI2CiAgd2VlazogMQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBmbGF0bHkKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgRU5DT0RJTkc6IGEgc2hlbGwgd2l0aCBubyBMQU5HIHNldCBzdGFydHMgUiBpbiB0aGUgQyAvIFVTLUFTQ0lJIGxvY2FsZSwgYW5kCiMgZ3QgYW5kIGdncGxvdCB0aGVuIEVTQ0FQRSBldmVyeSBub24tQVNDSUkgY2hhcmFjdGVyIC0tIGVtIGRhc2hlcyBjb21lIG91dCBhcwojIGEgbGl0ZXJhbCAiPFUrMjAxND4iIGluIHRoZSByZW5kZXJlZCBvdXRwdXQuIEZvcmNpbmcgVVRGLTggaGVyZSBrZWVwcwojIHR5cG9ncmFwaGljIGNoYXJhY3RlcnMgaW50YWN0LCB3aGljaCBtYXR0ZXJzIGZvciBwdWJsaWNhdGlvbi1yZWFkeSBleGhpYml0cy4KZm9yIChsb2MgaW4gYygiZW5fVVMuVVRGLTgiLCAiQy5VVEYtOCIsICJVVEYtOCIpKSB7CiAgaWYgKG56Y2hhcihzdXBwcmVzc1dhcm5pbmdzKFN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsIGxvYykpKSkgYnJlYWsKfQoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNiwgZHBpID0gMTUwKQpgYGAKCmBgYHtyIGxpYnJhcmllc30KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYXJyb3cpCmxpYnJhcnkoZ3QpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShzY2FsZXMpCmBgYAoKYGBge3Igc3R5bGV9CiMgVGhpcyBmaWxlIGhvbGRzIE9OTFkgdGhlIHRocmVlIGV4aGliaXRzIHVzZWQgaW4gdGhlIHdyaXR0ZW4gcGllY2UuIFRoZSBmdWxsCiMgYW5hbHl0aWNhbCB3b3JrYm9vayBsaXZlcyBpbiAyMDI2X3drMDFfcmV2aWV3LlJtZCAtLSB0aGF0IGlzIHdoZXJlIHRoZSBzdG9yeQojIGdldHMgZm91bmQ7IHRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBwdWJsaXNoZWQuCnNvdXJjZSgiLi4vUi8wNF9zdG9yeWxpbmVfZW5naW5lLlIiKQpzb3VyY2UoIi4uL1IvMDVfdml6X3N0eWxlLlIiKQoKVEVBTSAgIDwtICJTeXJhY3VzZSIKU0VBU09OIDwtIHBhcmFtcyRzZWFzb24KV0VFSyAgIDwtIHBhcmFtcyR3ZWVrCgpGSUdfRElSIDwtIHNwcmludGYoImZpZ3VyZXMvJWRfd2slMDJkX3N0b3J5IiwgU0VBU09OLCBXRUVLKQpgYGAKCmBgYHtyIGRhdGF9Cmhpc3QgPC0gcmVhZF9wYXJxdWV0KCJ+L2NmYi1kYXRhL3Byb2Nlc3NlZC90ZWFtX2dhbWVfbWV0cmljcy5wYXJxdWV0IikKY3VyICA8LSByZWFkX3BhcnF1ZXQoIn4vY2ZiLWRhdGEvcHJvY2Vzc2VkL3RlYW1fZ2FtZV9tZXRyaWNzXzIwMjYucGFycXVldCIpCgpmYnNfdGVhbXMgPC0gdW5pcXVlKGhpc3QkdGVhbVtoaXN0JGlzX2Zic19tYXRjaHVwXSkKCiMgVGhlIHJlZmVyZW5jZSBjbGFzczogRkJTIHRlYW1zIHBsYXlpbmcgRkNTIG9wcG9uZW50cywgYWxsIHNlYXNvbnMgb24gcmVjb3JkLgpyZWYgPC0gaGlzdCB8PgogIGZpbHRlcih0ZWFtICVpbiUgZmJzX3RlYW1zLCAhaXNfZmJzX21hdGNodXAsICFsb3dfdm9sdW1lLAogICAgICAgICBpcy5maW5pdGUob2ZmX2F2Z19zdGFydF95dGcpKQoKIyBUaGlzIHdlZWsncyBwZWVyIGdyb3VwOiB0aGUgc2FtZSBzaXR1YXRpb24sIHRoZSBzYW1lIHdlZWtlbmQuCnBlZXJzIDwtIGN1ciB8PgogIGZpbHRlcih0ZWFtICVpbiUgZmJzX3RlYW1zLCAhbG93X3ZvbHVtZSwgIWlzX2Zic19tYXRjaHVwLCB3ZWVrID09IFdFRUspCgpzdSA8LSBwZWVycyB8PiBmaWx0ZXIodGVhbSA9PSBURUFNKQoKIyBIZWxwZXI6IHlhcmRzLXRvLWdvYWwgcmVhZHMgYXMgZmllbGQgcG9zaXRpb24gZm9yIGEgZ2VuZXJhbCBhdWRpZW5jZS4KYXNfZmllbGRfcG9zIDwtIGZ1bmN0aW9uKHl0Zykgc3ByaW50Zigib3duICUuMWYiLCAxMDAgLSB5dGcpCgpuX3NlYXNvbnMgPC0gZHBseXI6Om5fZGlzdGluY3QocmVmJHNlYXNvbikKc3VfcmFuayAgIDwtIHJhbmsocmVmJG9mZl9hdmdfc3RhcnRfeXRnKVswXSAgIyBwbGFjZWhvbGRlciwgY29tcHV0ZWQgYmVsb3cKc3VfcmFuayAgIDwtIHJhbmsocGVlcnMkb2ZmX2F2Z19zdGFydF95dGcpW3BlZXJzJHRlYW0gPT0gVEVBTV0KYGBgCgojIyBFeGhpYml0IDEg4oCUIFRoZSBoaXN0b3JpY2FsIGJhc2VsaW5lCgpgYGB7ciBleGhpYml0LTF9CnEgPC0gcXVhbnRpbGUocmVmJG9mZl9hdmdfc3RhcnRfeXRnLCBjKDAuMTAsIDAuNTApLCBuYS5ybSA9IFRSVUUpCgojIENvbXB1dGVkLCBub3QgaGFyZGNvZGVkLCBzbyB0aGUgcHJvamVjdGlvbiBjYW4gbmV2ZXIgZHJpZnQgb3V0IG9mIHN5bmMgd2l0aAojIHRoZSB0YWJsZSBhcm91bmQgaXQuCnByb2ogPC0gYnVpbGRfZXhwZWN0YXRpb25zKGhpc3QsIFRFQU0sIFNFQVNPTiAtIDEsIGZic19vbmx5ID0gRkFMU0UpIHw+CiAgZmlsdGVyKG1ldHJpYyA9PSAib2ZmX2F2Z19zdGFydF95dGciKQpwcm9qX2V4cGVjdGVkIDwtIG1lYW4oYyhwcm9qJHByb2pfZm9ybSwgcHJvaiRwcm9qX293biksIG5hLnJtID0gVFJVRSkKCnRpYmJsZTo6dGliYmxlKAogIE1lYXN1cmUgPSBjKAogICAgc3ByaW50ZigiVHlwaWNhbCBGQlMgdGVhbSB2cyBhbiBGQ1Mgb3Bwb25lbnQgKG1lZGlhbiBvZiAlcyBnYW1lcykiLAogICAgICAgICAgICBmb3JtYXQobnJvdyhyZWYpLCBiaWcubWFyayA9ICIsIikpLAogICAgIlwiTm90YWJsZVwiIGJhciwgc2V0IGJlZm9yZSBraWNrb2ZmICh0b3AgMTAlKSIsCiAgICBzcHJpbnRmKCIlcyDigJQgcHJvamVjdGVkIGJlZm9yZSB0aGUgZ2FtZSIsIFRFQU0pLAogICAgc3ByaW50ZigiJXMg4oCUIGFjdHVhbCIsIFRFQU0pCiAgKSwKICBgWWFyZHMgdG8gZ29hbGAgPSBjKHFbWzJdXSwgcVtbMV1dLCBwcm9qX2V4cGVjdGVkLCBzdSRvZmZfYXZnX3N0YXJ0X3l0ZyksCikgfD4KICBtdXRhdGUoYEZpZWxkIHBvc2l0aW9uYCA9IGFzX2ZpZWxkX3BvcyhgWWFyZHMgdG8gZ29hbGApKSB8PgogIGd0KCkgfD4KICB0YWJfaGVhZGVyKAogICAgdGl0bGUgPSBtZCgiKipTeXJhY3VzZSBzdGFydGVkIDEzIHlhcmRzIGNsb3NlciB0byB0aGUgZW5kIHpvbmUgdGhhbiBhIHR5cGljYWwgRkJTIHRlYW0gZG9lcyBhZ2FpbnN0IGFuIEZDUyBvcHBvbmVudCoqIiksCiAgICBzdWJ0aXRsZSA9IG1kKHNwcmludGYoCiAgICAgICJBdmVyYWdlIGRyaXZlIHN0YXJ0IHwgJWQgc2Vhc29ucyBvZiBGQlMtdnMtRkNTIG1hdGNodXBzICglZOKAkyVkKSwgJXMgdGVhbS1nYW1lcyIsCiAgICAgIG5fc2Vhc29ucywgbWluKHJlZiRzZWFzb24pLCBtYXgocmVmJHNlYXNvbiksCiAgICAgIGZvcm1hdChucm93KHJlZiksIGJpZy5tYXJrID0gIiwiKSkpCiAgKSB8PgogIGZtdF9udW1iZXIoY29sdW1ucyA9IGBZYXJkcyB0byBnb2FsYCwgZGVjaW1hbHMgPSAxKSB8PgogIGNvbHNfYWxpZ24oImNlbnRlciIsIGNvbHVtbnMgPSAtTWVhc3VyZSkgfD4KICBjb2xzX2FsaWduKCJsZWZ0IiwgY29sdW1ucyA9IE1lYXN1cmUpIHw+CiAgdGFiX3N0eWxlKAogICAgc3R5bGUgPSBsaXN0KGNlbGxfZmlsbChjb2xvciA9ICIjRkZGM0U2IiksIGNlbGxfdGV4dCh3ZWlnaHQgPSAiYm9sZCIpKSwKICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkocm93cyA9IGdyZXBsKCJhY3R1YWwiLCBNZWFzdXJlKSkKICApIHw+CiAgdGFiX3NvdXJjZV9ub3RlKG1kKHBhc3RlMCgKICAgICIqKiIsIHN1X2NhcHRpb24oIjIwMjYgV2VlayAxIHwgU3lyYWN1c2UgdnMgTmV3IEhhbXBzaGlyZSIpLAogICAgIioqIOKAlCBsb3dlciB5YXJkcy10by1nb2FsIG1lYW5zIGJldHRlciBmaWVsZCBwb3NpdGlvbi4iKSkpIHw+CiAgZ3RfdGhlbWVfc3UoKQpgYGAKCiMjIEV4aGliaXQgMiDigJQgVGhpcmQgb2YgNDcgdGhpcyB3ZWVrCgpgYGB7ciBleGhpYml0LTIsIGZpZy5hc3AgPSAwLjYyfQpmcCA8LSBwZWVycyB8PgogIG11dGF0ZShpc19zdSA9IHRlYW0gPT0gVEVBTSkgfD4KICBhcnJhbmdlKG9mZl9hdmdfc3RhcnRfeXRnKSB8PgogIG11dGF0ZSh0ZWFtID0gZmFjdG9yKHRlYW0sIGxldmVscyA9IHRlYW0pKQoKcF9maWVsZHBvcyA8LSBnZ3Bsb3QoZnAsIGFlcyh4ID0gb2ZmX2F2Z19zdGFydF95dGcsIHkgPSB0ZWFtLCBjb2xvciA9IGlzX3N1KSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihmcCRvZmZfYXZnX3N0YXJ0X3l0ZyksIGxpbmV0eXBlID0gImRhc2hlZCIsCiAgICAgICAgICAgICBjb2xvciA9IFNVJG11dGVkLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3BvaW50KGFlcyhzaXplID0gaXNfc3UpKSArCiAgZ2dyZXBlbDo6Z2VvbV90ZXh0X3JlcGVsKAogICAgZGF0YSA9IGZpbHRlcihmcCwgaXNfc3UpLAogICAgYWVzKGxhYmVsID0gc3ByaW50ZigiJXMg4oCUICUuMWYgeWFyZHMgdG8gZ29hbFxuKG93biAlLjFmKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0sIG9mZl9hdmdfc3RhcnRfeXRnLCAxMDAgLSBvZmZfYXZnX3N0YXJ0X3l0ZykpLAogICAgbnVkZ2VfeCA9IDIsIG51ZGdlX3k9Miwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIHNlZ21lbnQuY29sb3IgPSBOQSwKICAgIGxpbmVoZWlnaHQgPSAwLjk1CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoYEZBTFNFYCA9IFNVJG11dGVkLCBgVFJVRWAgPSBTVSRvcmFuZ2UpLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoYEZBTFNFYCA9IDIsIGBUUlVFYCA9IDQpLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3hfcmV2ZXJzZSgpICsKICBsYWJzKAogICAgdGl0bGUgPSBzcHJpbnRmKCIlcyBoYWQgdGhlICVzLWJlc3Qgc3RhcnRpbmcgZmllbGQgcG9zaXRpb24gb2YgYW55IEZCUyB0ZWFtIGZhY2luZyBhbiBGQ1Mgb3Bwb25lbnQgaW4gV2VlayAxIiwKICAgICAgICAgICAgICAgICAgICBURUFNLCBzY2FsZXM6Om9yZGluYWwoc3VfcmFuaykpLAogICAgc3VidGl0bGUgPSBzcHJpbnRmKAogICAgICAiQXZlcmFnZSBkcml2ZSBzdGFydCwgeWFyZHMgdG8gZ29hbCDigJQgZnVydGhlciByaWdodCBpcyBiZXR0ZXIgfCAlZCBjb21wYXJhYmxlIHRlYW1zIHwgRGFzaGVkIGxpbmUgPSBncm91cCBtZWRpYW4iLAogICAgICBucm93KGZwKSksCiAgICB4ID0gIkF2ZXJhZ2UgeWFyZHMgdG8gZ29hbCBhdCBkcml2ZSBzdGFydCIsIHkgPSBOVUxMLAogICAgY2FwdGlvbiA9IHN1X2NhcHRpb24oIjIwMjYgV2VlayAxIHwgRkJTIHRlYW1zIGZhY2luZyBGQ1Mgb3Bwb25lbnRzIikKICApICsKICB0aGVtZV9zdShsZWdlbmRfcG9zID0gIm5vbmUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKQoKc2F2ZV9maWcocF9maWVsZHBvcywgImZpZWxkX3Bvc2l0aW9uX3ZzX3BlZXJzIiwgaGVpZ2h0ID0gNi41KQpgYGAKCiMjIEV4aGliaXQgMyDigJQgV2hhdCBlYWNoIHN0YXJ0aW5nIHBvc2l0aW9uIHByb2R1Y2VkCgpgYGB7ciBleGhpYml0LTN9CnJhd193ayA8LSBzcHJpbnRmKCJ+L2NmYi1kYXRhL3Jhdy9wYnBfaW5zZWFzb24vcGJwXyVkX3drJTAyZC5wYXJxdWV0IiwgU0VBU09OLCBXRUVLKQoKZHJpdmVzIDwtIHJlYWRfcGFycXVldChyYXdfd2spIHw+CiAgZmlsdGVyKHBvc190ZWFtID09IFRFQU0pIHw+CiAgZ3JvdXBfYnkoZHJpdmVfaWQpIHw+CiAgc3VtbWFyaXNlKHN0YXJ0X3l0ZyA9IGZpcnN0KGRyaXZlX3N0YXJ0X3lhcmRzX3RvX2dvYWwpLAogICAgICAgICAgICBwdHMgPSBmaXJzdChkcml2ZV9wdHMpLCAuZ3JvdXBzID0gImRyb3AiKSB8PgogIGZpbHRlcighaXMubmEoc3RhcnRfeXRnKSwgIWlzLm5hKHB0cykpCgpkcml2ZXMgfD4KICBtdXRhdGUoYnVja2V0ID0gY2FzZV93aGVuKAogICAgc3RhcnRfeXRnIDw9IDUwIH4gIjEiLAogICAgc3RhcnRfeXRnIDw9IDY1IH4gIjIiLAogICAgVFJVRSAgICAgICAgICAgIH4gIjMiCiAgKSkgfD4KICBncm91cF9ieShidWNrZXQpIHw+CiAgc3VtbWFyaXNlKERyaXZlcyA9IG4oKSwgUG9pbnRzID0gc3VtKHB0cyksIC5ncm91cHMgPSAiZHJvcCIpIHw+CiAgbXV0YXRlKAogICAgYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCA9IGMoCiAgICAgICJOZXcgSGFtcHNoaXJlJ3Mgc2lkZSBvZiBtaWRmaWVsZCIsCiAgICAgICJPd24gMzUgdG8gbWlkZmllbGQiLAogICAgICAiSW5zaWRlIG93biAzNSIKICAgIClbYXMuaW50ZWdlcihidWNrZXQpXSwKICAgIGBQb2ludHMgcGVyIGRyaXZlYCA9IFBvaW50cyAvIERyaXZlcwogICkgfD4KICBzZWxlY3QoYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCwgRHJpdmVzLCBQb2ludHMsIGBQb2ludHMgcGVyIGRyaXZlYCkgfD4KICBndCgpIHw+CiAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gbWQoIioqU2hvcnQgZmllbGRzIHByb2R1Y2VkIHRoZSBtb3N0IHBvaW50cywgYnV0IHRoZSBvZmZlbnNlIHNjb3JlZCBmcm9tIGV2ZXJ5d2hlcmUqKiIpLAogICAgc3VidGl0bGUgPSBtZChzcHJpbnRmKAogICAgICAiJXMgb2ZmZW5zaXZlIGRyaXZlcyBvbmx5IHwgJWQgZHJpdmVzLCAlZCBwb2ludHMgfCBOb3Qgc3BsaXQgYnkgc2NvcmUgbWFyZ2luIG9yIHRpbWUgb2YgZ2FtZSIsCiAgICAgIFRFQU0sIG5yb3coZHJpdmVzKSwgc3VtKGRyaXZlcyRwdHMpKSkKICApIHw+CiAgZm10X251bWJlcihjb2x1bW5zID0gYFBvaW50cyBwZXIgZHJpdmVgLCBkZWNpbWFscyA9IDIpIHw+CiAgY29sc19hbGlnbigiY2VudGVyIiwgY29sdW1ucyA9IC1gU3RhcnRpbmcgZmllbGQgcG9zaXRpb25gKSB8PgogIGNvbHNfYWxpZ24oImxlZnQiLCBjb2x1bW5zID0gYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCkgfD4KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQod2VpZ2h0ID0gImJvbGQiKSwKICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCkpIHw+CiAgZGF0YV9jb2xvcihjb2x1bW5zID0gUG9pbnRzLCBtZXRob2QgPSAibnVtZXJpYyIsIHBhbGV0dGUgPSBTVV9TRVEpIHw+CiAgdGFiX3NvdXJjZV9ub3RlKG1kKHBhc3RlMCgKICAgICIqKiIsIHN1X2NhcHRpb24oIjIwMjYgV2VlayAxIHwgU3lyYWN1c2UgdnMgTmV3IEhhbXBzaGlyZSIpLAogICAgIioqIOKAlCBleGNsdWRlcyB0aGUgZnVtYmxlLXJldHVybiB0b3VjaGRvd24gYW5kIHRoZSBzYWZldHksIHdoaWNoIHdlcmUgbm90IG9mZmVuc2l2ZSBkcml2ZXMuIikpKSB8PgogIGd0X3RoZW1lX3N1KCkKYGBgCgojIyBGaWd1cmVzIHdyaXR0ZW4gdG8gZGlzawoKYGBge3IgbWFuaWZlc3R9CmZpZ3MgPC0gbGlzdC5maWxlcyhGSUdfRElSLCBwYXR0ZXJuID0gIlxcLnBuZyQiLCBmdWxsLm5hbWVzID0gVFJVRSkKaWYgKGxlbmd0aChmaWdzKSA9PSAwKSB7CiAgY2F0KCJObyBmaWd1cmVzIHdyaXR0ZW4uXG4iKQp9IGVsc2UgewogIGNhdCgiMzAwLWRwaSBQTkdzIHJlYWR5IHRvIGRyb3AgaW50byB0aGUgcGllY2U6XG5cbiIpCiAgZm9yIChmIGluIGZpZ3MpIGNhdCgiICAiLCBmLCAiICAoIiwgcm91bmQoZmlsZS5pbmZvKGYpJHNpemUgLyAxMDI0KSwgIiBLQilcbiIsIHNlcCA9ICIiKQogIGNhdCgiXG5UaGUgdHdvIGd0IHRhYmxlcyByZW5kZXIgYWJvdmU7IHNjcmVlbnNob3QgdGhlbSBmcm9tIHRoaXMgcGFnZSwgb3JcbiIpCiAgY2F0KCJpbnN0YWxsIHdlYnNob3QyIHRvIGV4cG9ydCB0aGVtIGFzIGltYWdlcyBhdXRvbWF0aWNhbGx5LlxuIikKfQpgYGAK