Napoleon’s 1812 winter retreat from Moscow

Something that I wanted to add to the map of Napoleon’s Russian invasion was scale. As someone who loves maps, I found it difficult to see how long this journey actually was. The very last image of this document shows the map created in class, without the temperatures and city names, except it is mapped onto a real map using a package called ggmap.

Source: https://github.com/andrewheiss/fancy-minard

library(HistData)
troops <- Minard.troops#movement of french troops
str(troops)
'data.frame':   51 obs. of  5 variables:
 $ long     : num  24 24.5 25.5 26 27 28 28.5 29 30 30.3 ...
 $ lat      : num  54.9 55 54.5 54.7 54.8 54.9 55 55.1 55.2 55.3 ...
 $ survivors: int  340000 340000 340000 320000 300000 280000 240000 210000 180000 175000 ...
 $ direction: Factor w/ 2 levels "A","R": 1 1 1 1 1 1 1 1 1 1 ...
 $ group    : int  1 1 1 1 1 1 1 1 1 1 ...

One line of code…

#skeleton of the path.
ggplot(troops, aes(x = long, y = lat, group = group)) + 
  geom_path()

Adding information . adding color representing direction (forward and backward, marching and retreating)

ggplot(troops, aes(x = long, y = lat, group = group, 
                   color = direction, size = survivors)) + 
  geom_path()

Slightly polished…

ggplot(troops, aes(x = long, y = lat, group = group, 
                   color = direction, size = survivors)) + 
  geom_path(lineend = "round")

Highlighting the size of the change . scale size

ggplot(troops, aes(x = long, y = lat, group = group, 
                   color = direction, size = survivors)) +
  geom_path(lineend = "round") +
  scale_size(range = c(0.5, 15))

Changing the color to make it . more like the original drawing in the slides.

ggplot(troops, aes(x = long, y = lat, group = group, 
                   color = direction, size = survivors)) +
  geom_path(lineend = "round") +
  scale_size(range = c(0.5, 15)) + 
  scale_colour_manual(values = c("#DFC17E", "#252523")) #new, from google search

  +
  labs(x = NULL, y = NULL) #new, removing x and y labels
Error in +labs(x = NULL, y = NULL) : invalid argument to unary operator

Adding city names

cities <- Minard.cities
str(cities)
'data.frame':   20 obs. of  3 variables:
 $ long: num  24 25.3 26.4 26.8 27.7 27.6 28.5 28.7 29.2 30.2 ...
 $ lat : num  55 54.7 54.4 54.3 55.2 53.9 54.3 55.5 54.4 55.3 ...
 $ city: Factor w/ 20 levels "Bobr","Chjat",..: 5 18 15 9 4 7 16 13 1 19 ...
ggplot() +
  geom_path(data = troops, aes(x = long, y = lat, group = group, 
                               color = direction, size = survivors),
            lineend = "round") +
  geom_point(data = cities, aes(x = long, y = lat)) +
  geom_text(data = cities, aes(x = long, y = lat, label = city), vjust =1) +
  scale_size(range = c(0.5, 15)) + 
  scale_colour_manual(values = c("#DFC17E", "#252523")) +
  labs(x = NULL, y = NULL) + 
  guides(color = FALSE, size = FALSE)

Some further improvements .

library(ggrepel)#optimizes ggplot2, using geom_text_repel
ggplot() +
  geom_path(data = troops, aes(x = long, y = lat, group = group, 
                               color = direction, size = survivors),
            lineend = "round") +
  geom_point(data = cities, aes(x = long, y = lat),
             color = "#DC5B44") +
  geom_text_repel(data = cities, aes(x = long, y = lat, label = city),
                  color = "#DC5B44", family = "Open Sans Condensed Bold") +
  scale_size(range = c(0.5, 15)) + 
  scale_colour_manual(values = c("#DFC17E", "#252523")) +
  labs(x = NULL, y = NULL) + 
  guides(color = FALSE, size = FALSE)

This is much better

march.1812.plot.simple <- ggplot() +
  geom_path(data = troops, aes(x = long, y = lat, group = group, 
                               color = direction, size = survivors),
            lineend = "round") +
  geom_point(data = cities, aes(x = long, y = lat),
             color = "#DC5B44") +
  geom_text_repel(data = cities, aes(x = long, y = lat, label = city),
                  color = "#DC5B44", family = "Open Sans Condensed Bold") +
  scale_size(range = c(0.5, 15)) + 
  scale_colour_manual(values = c("#DFC17E", "#252523")) +
  labs(x = NULL, y = NULL) +
  guides(color = FALSE, size = FALSE) +
  theme_void()
march.1812.plot.simple

temps <- Minard.temp
temps.nice <- temps %>%
  mutate(nice.label = paste0(temp, "°, ", date))
str(temps.nice)
'data.frame':   9 obs. of  5 variables:
 $ long      : num  37.6 36 33.2 32 29.2 28.5 27.2 26.7 25.3
 $ temp      : int  0 0 -9 -21 -11 -20 -24 -30 -26
 $ days      : int  6 6 16 5 10 4 3 5 1
 $ date      : Factor w/ 8 levels "Dec01","Dec06",..: 7 8 4 5 NA 6 1 2 3
 $ nice.label: chr  "0°, Oct18" "0°, Oct24" "-9°, Nov09" "-21°, Nov14" ...
temps.1812.plot <- ggplot(data = temps.nice, aes(x = long, y = temp)) +
  geom_line() +
  geom_label(aes(label = nice.label),
            family = "Open Sans Condensed Bold", size = 2.5) + 
  labs(x = NULL, y = "° Celsius") +
  scale_x_continuous(limits = ggplot_build(march.1812.plot.simple)$layout$panel_ranges[[1]]$x.range) +
  scale_y_continuous(position = "right") +
  coord_cartesian(ylim = c(-35, 5)) +  # Add some space above/below
  theme_bw(base_family = "Open Sans Condensed Light") +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_blank(),
        axis.text.x = element_blank(), axis.ticks = element_blank(),
        panel.border = element_blank())
library(gridExtra)
# Combine the two plots to create a larger graph
both.1812.plot.simple <- gtable_rbind(ggplotGrob(march.1812.plot.simple),
                               ggplotGrob(temps.1812.plot))#making a new ggplot2 object, one for the army, and the other for the temp
# Adjust panels
panels <- both.1812.plot.simple$layout$t[grep("panel", both.1812.plot.simple$layout$name)]
# Because this plot doesn't use coord_equal, since it's not a map, we can use whatever relative numbers we want, like a 3:1 ratio
both.1812.plot.simple$heights[panels] <- unit(c(3, 1), "null")
grid::grid.newpage()

grid::grid.draw(both.1812.plot.simple)

I see that Napoleon’s trail stretched from Lithuania and Balrus into the western part of Russia. A very long distance to travel back in the freezing cold winter.

library(ggmap)
ggmap(both.1812.plot.simple) +
  geom_path(data = troops, aes(x = long, y = lat, group = group, 
                               color = direction, size = survivors),
            lineend = "round") +
  scale_size(range = c(0.5, 5)) + 
  scale_colour_manual(values = c("#DFC17E", "#252523")) +
  guides(color = FALSE, size = FALSE) +
  theme_nothing()  # This is a special theme that comes with ggmap

LS0tDQp0aXRsZTogIk5hcG9sZW9uIg0KYXV0aG9yOiAiQWJpZ2FpbCBTdHJpY2siDQpkYXRlOiAiQXByaWwgMTQsIDIwMTkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojTmFwb2xlb24ncyAxODEyIHdpbnRlciByZXRyZWF0IGZyb20gTW9zY293DQpTb21ldGhpbmcgdGhhdCBJIHdhbnRlZCB0byBhZGQgdG8gdGhlIG1hcCBvZiBOYXBvbGVvbidzIFJ1c3NpYW4gaW52YXNpb24gd2FzIHNjYWxlLiBBcyBzb21lb25lIHdobyBsb3ZlcyBtYXBzLCBJIGZvdW5kIGl0IGRpZmZpY3VsdCB0byBzZWUgaG93IGxvbmcgdGhpcyBqb3VybmV5IGFjdHVhbGx5IHdhcy4gVGhlIHZlcnkgbGFzdCBpbWFnZSBvZiB0aGlzIGRvY3VtZW50IHNob3dzIHRoZSBtYXAgY3JlYXRlZCBpbiBjbGFzcywgd2l0aG91dCB0aGUgdGVtcGVyYXR1cmVzIGFuZCBjaXR5IG5hbWVzLCBleGNlcHQgaXQgaXMgbWFwcGVkIG9udG8gYSByZWFsIG1hcCB1c2luZyBhIHBhY2thZ2UgY2FsbGVkIGdnbWFwLg0KDQpTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdoZWlzcy9mYW5jeS1taW5hcmQNCmBgYHtyfQ0KbGlicmFyeShIaXN0RGF0YSkNCg0KdHJvb3BzIDwtIE1pbmFyZC50cm9vcHMNCg0Kc3RyKHRyb29wcykNCmBgYA0KT25lIGxpbmUgb2YgY29kZS4uLg0KYGBge3J9DQpnZ3Bsb3QodHJvb3BzLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApKSArIA0KICBnZW9tX3BhdGgoKQ0KYGBgDQoNCkFkZGluZyBpbmZvcm1hdGlvbiAuIGFkZGluZyBjb2xvciByZXByZXNlbnRpbmcgZGlyZWN0aW9uIChmb3J3YXJkIGFuZCBiYWNrd2FyZCwgbWFyY2hpbmcgYW5kIHJldHJlYXRpbmcpDQpgYGB7cn0NCmdncGxvdCh0cm9vcHMsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBkaXJlY3Rpb24sIHNpemUgPSBzdXJ2aXZvcnMpKSArIA0KICBnZW9tX3BhdGgoKQ0KYGBgDQoNClNsaWdodGx5IHBvbGlzaGVkLi4uDQpgYGB7cn0NCmdncGxvdCh0cm9vcHMsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBkaXJlY3Rpb24sIHNpemUgPSBzdXJ2aXZvcnMpKSArIA0KICBnZW9tX3BhdGgobGluZWVuZCA9ICJyb3VuZCIpDQpgYGANCg0KSGlnaGxpZ2h0aW5nIHRoZSBzaXplIG9mIHRoZSBjaGFuZ2UgLiBzY2FsZSBzaXplDQpgYGB7cn0NCmdncGxvdCh0cm9vcHMsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBkaXJlY3Rpb24sIHNpemUgPSBzdXJ2aXZvcnMpKSArDQogIGdlb21fcGF0aChsaW5lZW5kID0gInJvdW5kIikgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygwLjUsIDE1KSkNCmBgYA0KDQpDaGFuZ2luZyB0aGUgY29sb3IgdG8gbWFrZSBpdCAuIG1vcmUgbGlrZSB0aGUgb3JpZ2luYWwgZHJhd2luZyBpbiB0aGUgc2xpZGVzLg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCh0cm9vcHMsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBkaXJlY3Rpb24sIHNpemUgPSBzdXJ2aXZvcnMpKSArDQogIGdlb21fcGF0aChsaW5lZW5kID0gInJvdW5kIikgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygwLjUsIDE1KSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjREZDMTdFIiwgIiMyNTI1MjMiKSkgDQogICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpIA0KICArIA0KICBndWlkZXMoY29sb3IgPSBGQUxTRSwgc2l6ZSA9IEZBTFNFKSAjbmV3LCB0YWtlcyBvZmYgbGVnZW5kIA0KYGBgDQoNCkFkZGluZyBjaXR5IG5hbWVzDQpgYGB7cn0NCmNpdGllcyA8LSBNaW5hcmQuY2l0aWVzDQoNCnN0cihjaXRpZXMpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoKSArDQogIGdlb21fcGF0aChkYXRhID0gdHJvb3BzLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZGlyZWN0aW9uLCBzaXplID0gc3Vydml2b3JzKSwNCiAgICAgICAgICAgIGxpbmVlbmQgPSAicm91bmQiKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNpdGllcywgYWVzKHggPSBsb25nLCB5ID0gbGF0KSkgKw0KICBnZW9tX3RleHQoZGF0YSA9IGNpdGllcywgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBsYWJlbCA9IGNpdHkpLCB2anVzdCA9MSkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygwLjUsIDE1KSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjREZDMTdFIiwgIiMyNTI1MjMiKSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKyANCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UsIHNpemUgPSBGQUxTRSkNCmBgYA0KDQpTb21lIGZ1cnRoZXIgaW1wcm92ZW1lbnRzIC4NCmBgYHtyfQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQpnZ3Bsb3QoKSArDQogIGdlb21fcGF0aChkYXRhID0gdHJvb3BzLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZGlyZWN0aW9uLCBzaXplID0gc3Vydml2b3JzKSwNCiAgICAgICAgICAgIGxpbmVlbmQgPSAicm91bmQiKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNpdGllcywgYWVzKHggPSBsb25nLCB5ID0gbGF0KSwNCiAgICAgICAgICAgICBjb2xvciA9ICIjREM1QjQ0IikgKw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNpdGllcywgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBsYWJlbCA9IGNpdHkpLA0KICAgICAgICAgICAgICAgICAgY29sb3IgPSAiI0RDNUI0NCIsIGZhbWlseSA9ICJPcGVuIFNhbnMgQ29uZGVuc2VkIEJvbGQiKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDAuNSwgMTUpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiNERkMxN0UiLCAiIzI1MjUyMyIpKSArDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArIA0KICBndWlkZXMoY29sb3IgPSBGQUxTRSwgc2l6ZSA9IEZBTFNFKQ0KYGBgDQoNClRoaXMgaXMgbXVjaCBiZXR0ZXINCmBgYHtyfQ0KbWFyY2guMTgxMi5wbG90LnNpbXBsZSA8LSBnZ3Bsb3QoKSArDQogIGdlb21fcGF0aChkYXRhID0gdHJvb3BzLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZGlyZWN0aW9uLCBzaXplID0gc3Vydml2b3JzKSwNCiAgICAgICAgICAgIGxpbmVlbmQgPSAicm91bmQiKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNpdGllcywgYWVzKHggPSBsb25nLCB5ID0gbGF0KSwNCiAgICAgICAgICAgICBjb2xvciA9ICIjREM1QjQ0IikgKw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNpdGllcywgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBsYWJlbCA9IGNpdHkpLA0KICAgICAgICAgICAgICAgICAgY29sb3IgPSAiI0RDNUI0NCIsIGZhbWlseSA9ICJPcGVuIFNhbnMgQ29uZGVuc2VkIEJvbGQiKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDAuNSwgMTUpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiNERkMxN0UiLCAiIzI1MjUyMyIpKSArDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArDQogIGd1aWRlcyhjb2xvciA9IEZBTFNFLCBzaXplID0gRkFMU0UpICsNCiAgdGhlbWVfdm9pZCgpDQoNCm1hcmNoLjE4MTIucGxvdC5zaW1wbGUNCmBgYA0KDQpgYGB7cn0NCnRlbXBzIDwtIE1pbmFyZC50ZW1wDQp0ZW1wcy5uaWNlIDwtIHRlbXBzICU+JQ0KICBtdXRhdGUobmljZS5sYWJlbCA9IHBhc3RlMCh0ZW1wLCAisCwgIiwgZGF0ZSkpDQoNCnN0cih0ZW1wcy5uaWNlKQ0KYGBgDQoNCmBgYHtyfQ0KdGVtcHMuMTgxMi5wbG90IDwtIGdncGxvdChkYXRhID0gdGVtcHMubmljZSwgYWVzKHggPSBsb25nLCB5ID0gdGVtcCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX2xhYmVsKGFlcyhsYWJlbCA9IG5pY2UubGFiZWwpLA0KICAgICAgICAgICAgZmFtaWx5ID0gIk9wZW4gU2FucyBDb25kZW5zZWQgQm9sZCIsIHNpemUgPSAyLjUpICsgDQogIGxhYnMoeCA9IE5VTEwsIHkgPSAisCBDZWxzaXVzIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gZ2dwbG90X2J1aWxkKG1hcmNoLjE4MTIucGxvdC5zaW1wbGUpJGxheW91dCRwYW5lbF9yYW5nZXNbWzFdXSR4LnJhbmdlKSArDQogIHNjYWxlX3lfY29udGludW91cyhwb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0zNSwgNSkpICsgICMgQWRkIHNvbWUgc3BhY2UgYWJvdmUvYmVsb3cNCiAgdGhlbWVfYncoYmFzZV9mYW1pbHkgPSAiT3BlbiBTYW5zIENvbmRlbnNlZCBMaWdodCIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShncmlkRXh0cmEpDQojIENvbWJpbmUgdGhlIHR3byBwbG90cyB0byBjcmVhdGUgYSBsYXJnZXIgZ3JhcGgNCmJvdGguMTgxMi5wbG90LnNpbXBsZSA8LSBndGFibGVfcmJpbmQoZ2dwbG90R3JvYihtYXJjaC4xODEyLnBsb3Quc2ltcGxlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZ3Bsb3RHcm9iKHRlbXBzLjE4MTIucGxvdCkpI21ha2luZyBhIG5ldyBnZ3Bsb3QyIG9iamVjdCwgb25lIGZvciB0aGUgYXJteSwgYW5kIHRoZSBvdGhlciBmb3IgdGhlIHRlbXANCg0KIyBBZGp1c3QgcGFuZWxzDQpwYW5lbHMgPC0gYm90aC4xODEyLnBsb3Quc2ltcGxlJGxheW91dCR0W2dyZXAoInBhbmVsIiwgYm90aC4xODEyLnBsb3Quc2ltcGxlJGxheW91dCRuYW1lKV0NCg0KIyBCZWNhdXNlIHRoaXMgcGxvdCBkb2Vzbid0IHVzZSBjb29yZF9lcXVhbCwgc2luY2UgaXQncyBub3QgYSBtYXAsIHdlIGNhbiB1c2Ugd2hhdGV2ZXIgcmVsYXRpdmUgbnVtYmVycyB3ZSB3YW50LCBsaWtlIGEgMzoxIHJhdGlvDQpib3RoLjE4MTIucGxvdC5zaW1wbGUkaGVpZ2h0c1twYW5lbHNdIDwtIHVuaXQoYygzLCAxKSwgIm51bGwiKQ0KDQpncmlkOjpncmlkLm5ld3BhZ2UoKQ0KZ3JpZDo6Z3JpZC5kcmF3KGJvdGguMTgxMi5wbG90LnNpbXBsZSkNCmBgYA0KIyMjSSBzZWUgdGhhdCBOYXBvbGVvbidzIHRyYWlsIHN0cmV0Y2hlZCBmcm9tIExpdGh1YW5pYSBhbmQgQmFscnVzIGludG8gdGhlIHdlc3Rlcm4gcGFydCBvZiBSdXNzaWEuIEEgdmVyeSBsb25nIGRpc3RhbmNlIHRvIHRyYXZlbCBiYWNrIGluIHRoZSBmcmVlemluZyBjb2xkIHdpbnRlci4gDQpgYGB7cn0NCmxpYnJhcnkoZ2dtYXApDQpnZ21hcChib3RoLjE4MTIucGxvdC5zaW1wbGUpICsNCiAgZ2VvbV9wYXRoKGRhdGEgPSB0cm9vcHMsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBkaXJlY3Rpb24sIHNpemUgPSBzdXJ2aXZvcnMpLA0KICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMC41LCA1KSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjREZDMTdFIiwgIiMyNTI1MjMiKSkgKw0KICBndWlkZXMoY29sb3IgPSBGQUxTRSwgc2l6ZSA9IEZBTFNFKSArDQogIHRoZW1lX25vdGhpbmcoKSAgIyBUaGlzIGlzIGEgc3BlY2lhbCB0aGVtZSB0aGF0IGNvbWVzIHdpdGggZ2dtYXANCmBgYA==