Data curtesy of honu
on the SIBR discord server. Available here, up to Season 24 Day 54 and updated data available here.
library(tidyverse)
library(emoGG)
library(gganimate)
library(cowplot)
library(magick)
nav <- read.csv("trajectory/navigation.csv") %>% #pull(Team) %>% unique() %>% sort()
mutate(Team = case_when(Team == "---- -------" ~ "Shoe Thieves",
Team == "--------" ~ "Sunbeams",
Team == "------------" ~ "Firefighters",
Team == "---------" ~ "Mechanics",
TRUE ~ Team),
Emoji = case_when(Team == "Crabs" ~ "1f980",
Team == "Dale" ~ "1f6a4",
Team == "Firefighters" ~ "1f525",
Team == "Flowers" ~ "1f337",
Team == "Garages" ~ "1f3b8",
Team == "Georgias" ~ "1f531",
Team == "Jazz Hands" ~ "1f917",
Team == "Lift" ~ "1F3CB",
Team == "Lovers" ~ "1f444",
Team == "Magic" ~ "2728",
Team == "Mechanics" ~ "1f527",
Team == "Millennials" ~ "1f4f1",
Team == "Moist Talkers" ~ "1F5E3",
Team == "Paws" ~ "1F43E",
Team == "Pies" ~ "1F967",
Team == "Queens" ~ "1f48e",
Team == "Shoe Thieves" ~ "1F45F",
Team == "Spies" ~ "1f575",
Team == "Steaks" ~ "1f969",
Team == "Sunbeams" ~ "1F31E",
Team == "Tacos" ~ "1f32e",
Team == "Tigers" ~ "1f42f",
Team == "Wild Wings" ~ "1f357",
Team == "Worms" ~ "1f40c"))
nav
vault <- image_read("trajectory/vault.png")
pulsar <- image_read("trajectory/pulsar.png")
desert <- image_read("trajectory/desert.png")
horizon <- image_read("trajectory/horizon.png")
supernova <- image_read("trajectory/supernova.png")
nav %>%
ggplot(aes(x=X, y=Y)) +
coord_fixed() +
annotation_raster(supernova,
xmin=-.15, xmax=.15,
ymin=-.15, ymax=.15) +
annotation_raster(vault,
xmin=-1.3, xmax=-1,
ymin=1, ymax=1.3) +
annotation_raster(pulsar,
xmin=1, xmax=1.3,
ymin=1, ymax=1.3) +
annotation_raster(horizon,
xmin=-1.3, xmax=-1,
ymin=-1.3, ymax=-1) +
annotation_raster(desert,
xmin=1, xmax=1.3,
ymin=-1.3, ymax=-1) +
geom_path(#arrow = arrow(angle = 15, length = unit(0.05, "inches"), ends = "last", type = "closed"),
aes(alpha = Day,
colour = Team)) +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Crabs",], emoji = "1f980") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Dale",], emoji = "1f6a4") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Firefighters",], emoji = "1f525") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Flowers",], emoji = "1f337") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Garages",], emoji = "1f3b8") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Georgias",], emoji = "1f531") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Jazz Hands",], emoji = "1f450") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Lift",], emoji = "1f3cb") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Lovers",], emoji = "1f48b") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Magic",], emoji = "2728") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Mechanics",], emoji = "1f527") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Millennials",], emoji = "1f4f1") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Moist Talkers",],emoji = "1f5e3") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Paws",], emoji = "1f43e") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Pies",], emoji = "1f967") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Queens",], emoji = "1f48e") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Shoe Thieves",], emoji = "1f45f") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Spies",], emoji = "1f575") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Steaks",], emoji = "1f969") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Sunbeams",], emoji = "1f31e") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Tacos",], emoji = "1f32e") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Tigers",], emoji = "1f405") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Wild Wings",], emoji = "1f357") +
geom_emoji(data = nav[nav$Day==max(nav$Day) & nav$Team=="Worms",], emoji = "1f40c") +
theme(panel.background = element_rect(fill="black"),
plot.background = element_rect(fill="black"),
panel.grid.minor = element_line(colour = "gray25"),
legend.position = "none") +
scale_alpha_continuous(range = c(0.25, 1)) +
scale_colour_manual(values = c("#593037", # "Crabs"
"#BF00FF", # "Dale"
"#8D2A3C", # "Firefighters"
"#f7d1ff", # "Flowers"
"#30436E", # "Garages"
"#00DBC2", # "Georgias"
"#6388ad", # "Jazz Hands"
"#E536C8", # "Lift"
"#D2264A", # "Lovers"
"#BF0043", # "Magic"
"#FF430A", # "Mechanics"
"#F8D6D7", # "Millennials"
"#e5f4f5", # "Moist Talkers"
"#EBBD24", # "Paws"
"#008080", # "Pies"
"#9D42F5", # "Queens"
"#ffce0a", # "Shoe Thieves"
"#67556B", # "Spies"
"#8c8d8f", # "Steaks"
"#FFFBAB", # "Sunbeams"
"#64376e", # "Tacos"
"#5c1c1c", # "Tigers"
"#FF4F00", # "Wild Wings"
"#5C4822")) +# "Worms"
scale_x_continuous(limits = c(-1.2, 1.2),
minor_breaks = c(-1,0,1),
labels = NULL,
breaks = NULL) +
scale_y_continuous(limits = c(-1.2, 1.2),
minor_breaks = c(-1,0,1),
labels = NULL,
breaks = NULL) +
xlab("") + ylab("")
nav %>%
ggplot(aes(x=X, y=Y)) +
annotation_raster(supernova,
xmin=-.15, xmax=.15,
ymin=-.15, ymax=.15) +
annotation_raster(vault,
xmin=-1.3, xmax=-1,
ymin=1, ymax=1.3) +
annotation_raster(pulsar,
xmin=1, xmax=1.3,
ymin=1, ymax=1.3) +
annotation_raster(horizon,
xmin=-1.3, xmax=-1,
ymin=-1.3, ymax=-1) +
annotation_raster(desert,
xmin=1, xmax=1.3,
ymin=-1.3, ymax=-1) +
geom_path(aes(colour = Team,
group = Team)) +
geom_emoji(data = nav[nav$Team=="Crabs",], emoji = "1f980") +
geom_emoji(data = nav[nav$Team=="Dale",], emoji = "1f6a4") +
geom_emoji(data = nav[nav$Team=="Firefighters",], emoji = "1f525") +
geom_emoji(data = nav[nav$Team=="Flowers",], emoji = "1f337") +
geom_emoji(data = nav[nav$Team=="Garages",], emoji = "1f3b8") +
geom_emoji(data = nav[nav$Team=="Georgias",], emoji = "1f531") +
geom_emoji(data = nav[nav$Team=="Jazz Hands",], emoji = "1f450") +
geom_emoji(data = nav[nav$Team=="Lift",], emoji = "1f3cb") +
geom_emoji(data = nav[nav$Team=="Lovers",], emoji = "1f48b") +
geom_emoji(data = nav[nav$Team=="Magic",], emoji = "2728") +
geom_emoji(data = nav[nav$Team=="Mechanics",], emoji = "1f527") +
geom_emoji(data = nav[nav$Team=="Millennials",], emoji = "1f4f1") +
geom_emoji(data = nav[nav$Team=="Moist Talkers",],emoji = "1f5e3") +
geom_emoji(data = nav[nav$Team=="Paws",], emoji = "1f43e") +
geom_emoji(data = nav[nav$Team=="Pies",], emoji = "1f967") +
geom_emoji(data = nav[nav$Team=="Queens",], emoji = "1f48e") +
geom_emoji(data = nav[nav$Team=="Shoe Thieves",], emoji = "1f45f") +
geom_emoji(data = nav[nav$Team=="Spies",], emoji = "1f575") +
geom_emoji(data = nav[nav$Team=="Steaks",], emoji = "1f969") +
geom_emoji(data = nav[nav$Team=="Sunbeams",], emoji = "1f31e") +
geom_emoji(data = nav[nav$Team=="Tacos",], emoji = "1f32e") +
geom_emoji(data = nav[nav$Team=="Tigers",], emoji = "1f405") +
geom_emoji(data = nav[nav$Team=="Wild Wings",], emoji = "1f357") +
geom_emoji(data = nav[nav$Team=="Worms",], emoji = "1f40c") +
theme(panel.background = element_rect(fill="black"),
plot.background = element_rect(fill="black"),
panel.grid.minor = element_line(colour = "gray25"),
legend.position = "none") +
scale_colour_manual(values = c("#593037", # "Crabs"
"#BF00FF", # "Dale"
"#8D2A3C", # "Firefighters"
"#f7d1ff", # "Flowers"
"#30436E", # "Garages"
"#00DBC2", # "Georgias"
"#6388ad", # "Jazz Hands"
"#E536C8", # "Lift"
"#D2264A", # "Lovers"
"#BF0043", # "Magic"
"#FF430A", # "Mechanics"
"#F8D6D7", # "Millennials"
"#e5f4f5", # "Moist Talkers"
"#EBBD24", # "Paws"
"#008080", # "Pies"
"#9D42F5", # "Queens"
"#ffce0a", # "Shoe Thieves"
"#67556B", # "Spies"
"#8c8d8f", # "Steaks"
"#FFFBAB", # "Sunbeams"
"#64376e", # "Tacos"
"#5c1c1c", # "Tigers"
"#FF4F00", # "Wild Wings"
"#5C4822")) +# "Worms"
scale_x_continuous(limits = c(-1.2, 1.2),
minor_breaks = c(-1,0,1),
labels = NULL,
breaks = NULL) +
scale_y_continuous(limits = c(-1.2, 1.2),
minor_breaks = c(-1,0,1),
labels = NULL,
breaks = NULL) +
coord_fixed() +
xlab("") + ylab("") -> trajectory
trajectory +
transition_reveal(along = Day) +
shadow_wake(wake_length = .4, exclude_layer = c(7:30)) -> trajectory_animated
trajectory_animated
LS0tCnRpdGxlOiAiVGVhbSBUcmFqZWN0b3J5IgphdXRob3I6ICJieSBMYXVyZW4gQWNrZXJtYW4iCmRhdGU6ICIyMDIxIEp1bHkgMjgiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgICAgaW5jbHVkZXM6IAogICAgICAgICAgaW5faGVhZGVyOiBnb29nbGVfYW5hbHl0aWNzLmh0bWwKLS0tCgpEYXRhIGN1cnRlc3kgb2YgYGhvbnVgIG9uIHRoZSBTSUJSIGRpc2NvcmQgc2VydmVyLiBBdmFpbGFibGUgW2hlcmVdKG5hdmlnYXRpb24uY3N2KSwgdXAgdG8gU2Vhc29uIDI0IERheSA1NCBhbmQgdXBkYXRlZCBkYXRhIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly9mYWN1bHR5LnNpYnIuZGV2L35ob251L25hdmlnYXRpb24uaHRtbCkuCgpgYGB7ciBzZXRfdXB9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGVtb0dHKQpsaWJyYXJ5KGdnYW5pbWF0ZSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KG1hZ2ljaykKbmF2IDwtIHJlYWQuY3N2KCJ0cmFqZWN0b3J5L25hdmlnYXRpb24uY3N2IikgJT4lICNwdWxsKFRlYW0pICU+JSB1bmlxdWUoKSAlPiUgc29ydCgpCiAgbXV0YXRlKFRlYW0gPSBjYXNlX3doZW4oVGVhbSA9PSAiLS0tLSAtLS0tLS0tIiB+ICJTaG9lIFRoaWV2ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIi0tLS0tLS0tIiB+ICJTdW5iZWFtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiLS0tLS0tLS0tLS0tIiB+ICJGaXJlZmlnaHRlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIi0tLS0tLS0tLSIgfiAiTWVjaGFuaWNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gVGVhbSksCiAgICAgICAgIEVtb2ppID0gY2FzZV93aGVuKFRlYW0gPT0gIkNyYWJzIiB+ICIxZjk4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIkRhbGUiIH4gIjFmNmE0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiRmlyZWZpZ2h0ZXJzIiB+ICIxZjUyNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIkZsb3dlcnMiIH4gIjFmMzM3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiR2FyYWdlcyIgfiAiMWYzYjgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtID09ICJHZW9yZ2lhcyIgfiAiMWY1MzEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtID09ICJKYXp6IEhhbmRzIiB+ICIxZjkxNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIkxpZnQiIH4gIjFGM0NCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiTG92ZXJzIiB+ICIxZjQ0NCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIk1hZ2ljIiB+ICIyNzI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiTWVjaGFuaWNzIiB+ICIxZjUyNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIk1pbGxlbm5pYWxzIiB+ICIxZjRmMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIk1vaXN0IFRhbGtlcnMiIH4gIjFGNUUzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiUGF3cyIgfiAiMUY0M0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtID09ICJQaWVzIiB+ICIxRjk2NyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIlF1ZWVucyIgfiAiMWY0OGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtID09ICJTaG9lIFRoaWV2ZXMiIH4gIjFGNDVGIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiU3BpZXMiIH4gIjFmNTc1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbSA9PSAiU3RlYWtzIiB+ICIxZjk2OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIlN1bmJlYW1zIiB+ICIxRjMxRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIlRhY29zIiB+ICIxZjMyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIlRpZ2VycyIgfiAiMWY0MmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtID09ICJXaWxkIFdpbmdzIiB+ICIxZjM1NyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW0gPT0gIldvcm1zIiB+ICIxZjQwYyIpKQoKbmF2CmBgYAoKCmBgYHtyIHN0YXRpY30KdmF1bHQgPC0gaW1hZ2VfcmVhZCgidHJhamVjdG9yeS92YXVsdC5wbmciKQpwdWxzYXIgPC0gaW1hZ2VfcmVhZCgidHJhamVjdG9yeS9wdWxzYXIucG5nIikKZGVzZXJ0IDwtIGltYWdlX3JlYWQoInRyYWplY3RvcnkvZGVzZXJ0LnBuZyIpCmhvcml6b24gPC0gaW1hZ2VfcmVhZCgidHJhamVjdG9yeS9ob3Jpem9uLnBuZyIpCnN1cGVybm92YSA8LSBpbWFnZV9yZWFkKCJ0cmFqZWN0b3J5L3N1cGVybm92YS5wbmciKQoKbmF2ICU+JSAKICBnZ3Bsb3QoYWVzKHg9WCwgeT1ZKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIGFubm90YXRpb25fcmFzdGVyKHN1cGVybm92YSwgCiAgICAgICAgICAgICAgICAgICAgeG1pbj0tLjE1LCB4bWF4PS4xNSwgCiAgICAgICAgICAgICAgICAgICAgeW1pbj0tLjE1LCB5bWF4PS4xNSkgKwogIGFubm90YXRpb25fcmFzdGVyKHZhdWx0LCAKICAgICAgICAgICAgICAgICAgICB4bWluPS0xLjMsIHhtYXg9LTEsIAogICAgICAgICAgICAgICAgICAgIHltaW49MSwgeW1heD0xLjMpICsKICBhbm5vdGF0aW9uX3Jhc3RlcihwdWxzYXIsIAogICAgICAgICAgICAgICAgICAgIHhtaW49MSwgeG1heD0xLjMsIAogICAgICAgICAgICAgICAgICAgIHltaW49MSwgeW1heD0xLjMpICsKICBhbm5vdGF0aW9uX3Jhc3Rlcihob3Jpem9uLCAKICAgICAgICAgICAgICAgICAgICB4bWluPS0xLjMsIHhtYXg9LTEsIAogICAgICAgICAgICAgICAgICAgIHltaW49LTEuMywgeW1heD0tMSkgKwogIGFubm90YXRpb25fcmFzdGVyKGRlc2VydCwgCiAgICAgICAgICAgICAgICAgICAgeG1pbj0xLCB4bWF4PTEuMywgCiAgICAgICAgICAgICAgICAgICAgeW1pbj0tMS4zLCB5bWF4PS0xKSArCiAgZ2VvbV9wYXRoKCNhcnJvdyA9IGFycm93KGFuZ2xlID0gMTUsIGxlbmd0aCA9IHVuaXQoMC4wNSwgImluY2hlcyIpLCBlbmRzID0gImxhc3QiLCB0eXBlID0gImNsb3NlZCIpLAogICAgICAgICAgICBhZXMoYWxwaGEgPSBEYXksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSBUZWFtKSkgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09IkNyYWJzIixdLCAgICAgICAgZW1vamkgPSAiMWY5ODAiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiREYXk9PW1heChuYXYkRGF5KSAmIG5hdiRUZWFtPT0iRGFsZSIsXSwgICAgICAgICBlbW9qaSA9ICIxZjZhNCIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJGaXJlZmlnaHRlcnMiLF0sIGVtb2ppID0gIjFmNTI1IikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09IkZsb3dlcnMiLF0sICAgICAgZW1vamkgPSAiMWYzMzciKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiREYXk9PW1heChuYXYkRGF5KSAmIG5hdiRUZWFtPT0iR2FyYWdlcyIsXSwgICAgICBlbW9qaSA9ICIxZjNiOCIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJHZW9yZ2lhcyIsXSwgICAgIGVtb2ppID0gIjFmNTMxIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09IkphenogSGFuZHMiLF0sICAgZW1vamkgPSAiMWY0NTAiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiREYXk9PW1heChuYXYkRGF5KSAmIG5hdiRUZWFtPT0iTGlmdCIsXSwgICAgICAgICBlbW9qaSA9ICIxZjNjYiIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJMb3ZlcnMiLF0sICAgICAgIGVtb2ppID0gIjFmNDhiIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09Ik1hZ2ljIixdLCAgICAgICAgZW1vamkgPSAiMjcyOCIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJNZWNoYW5pY3MiLF0sICAgIGVtb2ppID0gIjFmNTI3IikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09Ik1pbGxlbm5pYWxzIixdLCAgZW1vamkgPSAiMWY0ZjEiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiREYXk9PW1heChuYXYkRGF5KSAmIG5hdiRUZWFtPT0iTW9pc3QgVGFsa2VycyIsXSxlbW9qaSA9ICIxZjVlMyIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJQYXdzIixdLCAgICAgICAgIGVtb2ppID0gIjFmNDNlIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09IlBpZXMiLF0sICAgICAgICAgZW1vamkgPSAiMWY5NjciKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiREYXk9PW1heChuYXYkRGF5KSAmIG5hdiRUZWFtPT0iUXVlZW5zIixdLCAgICAgICBlbW9qaSA9ICIxZjQ4ZSIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJTaG9lIFRoaWV2ZXMiLF0sIGVtb2ppID0gIjFmNDVmIikgKyAKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJTcGllcyIsXSwgICAgICAgIGVtb2ppID0gIjFmNTc1IikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09IlN0ZWFrcyIsXSwgICAgICAgZW1vamkgPSAiMWY5NjkiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiREYXk9PW1heChuYXYkRGF5KSAmIG5hdiRUZWFtPT0iU3VuYmVhbXMiLF0sICAgICBlbW9qaSA9ICIxZjMxZSIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JERheT09bWF4KG5hdiREYXkpICYgbmF2JFRlYW09PSJUYWNvcyIsXSwgICAgICAgIGVtb2ppID0gIjFmMzJlIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09IlRpZ2VycyIsXSwgICAgICAgZW1vamkgPSAiMWY0MDUiKSArIAogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkRGF5PT1tYXgobmF2JERheSkgJiBuYXYkVGVhbT09IldpbGQgV2luZ3MiLF0sICAgZW1vamkgPSAiMWYzNTciKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiREYXk9PW1heChuYXYkRGF5KSAmIG5hdiRUZWFtPT0iV29ybXMiLF0sICAgICAgICBlbW9qaSA9ICIxZjQwYyIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9ImJsYWNrIiksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfcmVjdChmaWxsPSJibGFjayIpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyYXkyNSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHNjYWxlX2FscGhhX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMjUsIDEpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjNTkzMDM3IiwgIyAiQ3JhYnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQkYwMEZGIiwgIyAiRGFsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM4RDJBM0MiLCAjICJGaXJlZmlnaHRlcnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZjdkMWZmIiwgIyAiRmxvd2VycyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMzMDQzNkUiLCAjICJHYXJhZ2VzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzAwREJDMiIsICMgIkdlb3JnaWFzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzYzODhhZCIsICMgIkphenogSGFuZHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRTUzNkM4IiwgIyAiTGlmdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNEMjI2NEEiLCAjICJMb3ZlcnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQkYwMDQzIiwgIyAiTWFnaWMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRkY0MzBBIiwgIyAiTWVjaGFuaWNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0Y4RDZENyIsICMgIk1pbGxlbm5pYWxzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2U1ZjRmNSIsICMgIk1vaXN0IFRhbGtlcnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRUJCRDI0IiwgIyAiUGF3cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMwMDgwODAiLCAjICJQaWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzlENDJGNSIsICMgIlF1ZWVucyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNmZmNlMGEiLCAjICJTaG9lIFRoaWV2ZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNjc1NTZCIiwgIyAiU3BpZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjOGM4ZDhmIiwgIyAiU3RlYWtzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0ZGRkJBQiIsICMgIlN1bmJlYW1zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzY0Mzc2ZSIsICMgIlRhY29zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzVjMWMxYyIsICMgIlRpZ2VycyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNGRjRGMDAiLCAjICJXaWxkIFdpbmdzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzVDNDgyMiIpKSArIyAiV29ybXMiCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEuMiwgMS4yKSwKICAgICAgICAgICAgICAgICAgICAgbWlub3JfYnJlYWtzID0gYygtMSwwLDEpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBOVUxMKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEuMiwgMS4yKSwKICAgICAgICAgICAgICAgICAgICAgbWlub3JfYnJlYWtzID0gYygtMSwwLDEpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBOVUxMKSArCiAgeGxhYigiIikgKyB5bGFiKCIiKQpgYGAKCmBgYHtyIGFuaW1hdGVkfQpuYXYgJT4lIAogIGdncGxvdChhZXMoeD1YLCB5PVkpKSArCiAgYW5ub3RhdGlvbl9yYXN0ZXIoc3VwZXJub3ZhLCAKICAgICAgICAgICAgICAgICAgICB4bWluPS0uMTUsIHhtYXg9LjE1LCAKICAgICAgICAgICAgICAgICAgICB5bWluPS0uMTUsIHltYXg9LjE1KSArCiAgYW5ub3RhdGlvbl9yYXN0ZXIodmF1bHQsIAogICAgICAgICAgICAgICAgICAgIHhtaW49LTEuMywgeG1heD0tMSwgCiAgICAgICAgICAgICAgICAgICAgeW1pbj0xLCB5bWF4PTEuMykgKwogIGFubm90YXRpb25fcmFzdGVyKHB1bHNhciwgCiAgICAgICAgICAgICAgICAgICAgeG1pbj0xLCB4bWF4PTEuMywgCiAgICAgICAgICAgICAgICAgICAgeW1pbj0xLCB5bWF4PTEuMykgKwogIGFubm90YXRpb25fcmFzdGVyKGhvcml6b24sIAogICAgICAgICAgICAgICAgICAgIHhtaW49LTEuMywgeG1heD0tMSwgCiAgICAgICAgICAgICAgICAgICAgeW1pbj0tMS4zLCB5bWF4PS0xKSArCiAgYW5ub3RhdGlvbl9yYXN0ZXIoZGVzZXJ0LCAKICAgICAgICAgICAgICAgICAgICB4bWluPTEsIHhtYXg9MS4zLCAKICAgICAgICAgICAgICAgICAgICB5bWluPS0xLjMsIHltYXg9LTEpICsKICBnZW9tX3BhdGgoYWVzKGNvbG91ciA9IFRlYW0sCiAgICAgICAgICAgICAgICBncm91cCA9IFRlYW0pKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iQ3JhYnMiLF0sICAgICAgICBlbW9qaSA9ICIxZjk4MCIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JFRlYW09PSJEYWxlIixdLCAgICAgICAgIGVtb2ppID0gIjFmNmE0IikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09IkZpcmVmaWdodGVycyIsXSwgZW1vamkgPSAiMWY1MjUiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iRmxvd2VycyIsXSwgICAgICBlbW9qaSA9ICIxZjMzNyIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JFRlYW09PSJHYXJhZ2VzIixdLCAgICAgIGVtb2ppID0gIjFmM2I4IikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09Ikdlb3JnaWFzIixdLCAgICAgZW1vamkgPSAiMWY1MzEiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iSmF6eiBIYW5kcyIsXSwgICBlbW9qaSA9ICIxZjQ1MCIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JFRlYW09PSJMaWZ0IixdLCAgICAgICAgIGVtb2ppID0gIjFmM2NiIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09IkxvdmVycyIsXSwgICAgICAgZW1vamkgPSAiMWY0OGIiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iTWFnaWMiLF0sICAgICAgICBlbW9qaSA9ICIyNzI4IikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09Ik1lY2hhbmljcyIsXSwgICAgZW1vamkgPSAiMWY1MjciKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iTWlsbGVubmlhbHMiLF0sICBlbW9qaSA9ICIxZjRmMSIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JFRlYW09PSJNb2lzdCBUYWxrZXJzIixdLGVtb2ppID0gIjFmNWUzIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09IlBhd3MiLF0sICAgICAgICAgZW1vamkgPSAiMWY0M2UiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iUGllcyIsXSwgICAgICAgICBlbW9qaSA9ICIxZjk2NyIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JFRlYW09PSJRdWVlbnMiLF0sICAgICAgIGVtb2ppID0gIjFmNDhlIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09IlNob2UgVGhpZXZlcyIsXSwgZW1vamkgPSAiMWY0NWYiKSArIAogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09IlNwaWVzIixdLCAgICAgICAgZW1vamkgPSAiMWY1NzUiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iU3RlYWtzIixdLCAgICAgICBlbW9qaSA9ICIxZjk2OSIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JFRlYW09PSJTdW5iZWFtcyIsXSwgICAgIGVtb2ppID0gIjFmMzFlIikgKwogIGdlb21fZW1vamkoZGF0YSA9IG5hdltuYXYkVGVhbT09IlRhY29zIixdLCAgICAgICAgZW1vamkgPSAiMWYzMmUiKSArCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iVGlnZXJzIixdLCAgICAgICBlbW9qaSA9ICIxZjQwNSIpICsgCiAgZ2VvbV9lbW9qaShkYXRhID0gbmF2W25hdiRUZWFtPT0iV2lsZCBXaW5ncyIsXSwgICBlbW9qaSA9ICIxZjM1NyIpICsKICBnZW9tX2Vtb2ppKGRhdGEgPSBuYXZbbmF2JFRlYW09PSJXb3JtcyIsXSwgICAgICAgIGVtb2ppID0gIjFmNDBjIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iYmxhY2siKSwKICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iYmxhY2siKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmF5MjUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM1OTMwMzciLCAjICJDcmFicyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNCRjAwRkYiLCAjICJEYWxlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzhEMkEzQyIsICMgIkZpcmVmaWdodGVycyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNmN2QxZmYiLCAjICJGbG93ZXJzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzMwNDM2RSIsICMgIkdhcmFnZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMDBEQkMyIiwgIyAiR2VvcmdpYXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNjM4OGFkIiwgIyAiSmF6eiBIYW5kcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNFNTM2QzgiLCAjICJMaWZ0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0QyMjY0QSIsICMgIkxvdmVycyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNCRjAwNDMiLCAjICJNYWdpYyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNGRjQzMEEiLCAjICJNZWNoYW5pY3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRjhENkQ3IiwgIyAiTWlsbGVubmlhbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZTVmNGY1IiwgIyAiTW9pc3QgVGFsa2VycyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNFQkJEMjQiLCAjICJQYXdzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzAwODA4MCIsICMgIlBpZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjOUQ0MkY1IiwgIyAiUXVlZW5zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2ZmY2UwYSIsICMgIlNob2UgVGhpZXZlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM2NzU1NkIiLCAjICJTcGllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM4YzhkOGYiLCAjICJTdGVha3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRkZGQkFCIiwgIyAiU3VuYmVhbXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNjQzNzZlIiwgIyAiVGFjb3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNWMxYzFjIiwgIyAiVGlnZXJzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0ZGNEYwMCIsICMgIldpbGQgV2luZ3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNUM0ODIyIikpICsjICJXb3JtcyIKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMS4yLCAxLjIpLAogICAgICAgICAgICAgICAgICAgICBtaW5vcl9icmVha3MgPSBjKC0xLDAsMSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IE5VTEwpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMS4yLCAxLjIpLAogICAgICAgICAgICAgICAgICAgICBtaW5vcl9icmVha3MgPSBjKC0xLDAsMSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IE5VTEwpICsKICBjb29yZF9maXhlZCgpICsKICB4bGFiKCIiKSArIHlsYWIoIiIpIC0+IHRyYWplY3RvcnkKCnRyYWplY3RvcnkgKyAKICB0cmFuc2l0aW9uX3JldmVhbChhbG9uZyA9IERheSkgKwogIHNoYWRvd193YWtlKHdha2VfbGVuZ3RoID0gLjQsIGV4Y2x1ZGVfbGF5ZXIgPSBjKDc6MzApKSAtPiB0cmFqZWN0b3J5X2FuaW1hdGVkCgp0cmFqZWN0b3J5X2FuaW1hdGVkCmBgYAoKIVtdKHRyYWplY3RvcnkvdHJhamVjdG9yeV8yOC01NC5naWYpCgo=