rm(list=ls())
library(tmap)
library(sf)
library(ggplot2)
library(ggmap)
library(ggthemes)
library(dplyr)
url <- "https://geodata.ucdavis.edu/gadm/gadm4.0/shp/gadm40_BGR_shp.zip"
Cleared the environment for better organization and then downloaded
the libraries necessary to create the maps.
download.file(url, "./bul.zip")
trying URL 'https://geodata.ucdavis.edu/gadm/gadm4.0/shp/gadm40_BGR_shp.zip'
Content type 'application/zip' length 1602712 bytes (1.5 MB)
==================================================
downloaded 1.5 MB
Downloaded the files.
unzip("./bul.zip", exdir = "bul")
Unzipped the files.
bul <- st_read("./bul/gadm40_BGR_2.shp")
Reading layer `gadm40_BGR_2' from data source
`/Users/sadieriggs/Downloads/DIDA 325/send 2/bul/gadm40_BGR_2.shp'
using driver `ESRI Shapefile'
Simple feature collection with 263 features and 12 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 22.34375 ymin: 41.23481 xmax: 28.60903 ymax: 44.21268
Geodetic CRS: WGS 84
Read the files.
map <- tm_shape(bul) + tm_fill("NAME_1") + tm_borders()
Generating a base map to get an idea of what it should look like.
print(map)

Printed the base map.
codes <- read.csv("simplecodes.csv")
mortalities <- read.csv("Bulgaria_Mortality_Rates_Municipalities_Mortality.csv")
newcodes_data <- merge(bul, codes, by = "ID_2", all.x = TRUE)
I made the .csv files containing the data for Bulgaria into data
frames. I then merged together the two Bulgaria data sets which contain
codes for different regions.
mortalities <- mortalities %>% mutate(Region.en=if_else(Region.en=="Sofia (capital)", "Grad Sofiya", Region.en))
mortalities <- mortalities %>% mutate(Region.en = if_else(Region.en=="Kurdzhali","Kardzhali",Region.en) )
mortalities <- mortalities %>% mutate(key=tolower(Region.en))
Fixed the alternative spelling issue that comes from disparities in
the names of locations.
merged_data <- merge(newcodes_data, mortalities, by= "key", all.y = TRUE)
#merged_data <- merge(bul, mortalities, by.x = "NAME_1", by.y = "Region.en", all.x = TRUE)
bul_list <- unique(bul$NAME_2)
mort_list <- unique(mortalities$Region.en)
merged_list <- unique(merged_data$region)
Merged the data containing the codes for regions and the mortality
data, then looked at all the unique values present in the
dataframes.
merged_data2 <- merged_data
max(merged_data2$X2019, na.rm=TRUE)
[1] 15635
min(merged_data2$X2019, na.rm=TRUE)
[1] 7
high_outliers <- merged_data2 %>% filter(X2019 > 4000)
Created a new data frame that will later be altered, and looking at
the minimum and maximum values to pinpoint outliers and remove them.
ggplot()+
geom_sf(bul, mapping = aes(), fill = "gray80")+
geom_sf(merged_data2, mapping = aes( fill = X2019))+
theme_minimal()+
labs(fill = "Mortality Rates", title = "Adult Mortality Rates in Bulgaria")+
theme(plot.title = element_text(hjust = 0.5))

Plotted a reference map that does not separate the mortality rates by
gender.
missing <- merged_data2 %>% filter(NAME_1.x == "Kardzhali")
Creates a new data frame containing only the data for the region
called Kardzhali. I was unfortunately missing data for this area, noted
by the grey areas on the map.
For the following graphs: I filtered the data so that the data for
female and male are put into separate data frames. I plotted the graphs
for 2019, 2020, and 2021 by gender for every year, changing the color of
the graphs to create more distinction. I also transformed the data into
a logarithmic scale to show differences through the scale, since the
mortality differences between regions were not very apparent.
library(ggplot2)
library(viridis)
filtered_data_female <- merged_data2 %>%
filter(Sex == "Female")
ggplot()+
geom_sf(bul, mapping = aes(), fill = "gray80")+
geom_sf(filtered_data_female, mapping = aes( fill = X2019))+
scale_fill_gradientn(colours=rev(magma(6)),
name="Mortality Rates",
na.value = "grey100",
trans = "log")+
theme_minimal()+
labs(fill = "Mortality Rates", title = "Adult Female Mortality Rates in Bulgaria (2019)")+
theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_male <- merged_data2 %>%
filter(Sex == "Male")
ggplot()+
geom_sf(bul, mapping = aes(), fill = "gray80")+
geom_sf(filtered_data_male, mapping = aes( fill = X2019))+
scale_fill_gradientn(colours=rev(magma(6)),
name="Mortality Rates",
na.value = "grey100",
trans = "log")+
theme_minimal()+
labs(fill = "Mortality Rates", title = "Adult Male Mortality Rates in Bulgaria (2019)")+
theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_female <- merged_data2 %>%
filter(Sex == "Female")
ggplot()+
geom_sf(bul, mapping = aes(), fill = "gray80")+
geom_sf(filtered_data_female, mapping = aes( fill = X2020))+
scale_fill_gradientn(colours=rev(magma(6)),
name="Mortality Rates",
na.value = "grey100",
trans = "log")+
theme_minimal()+
labs(fill = "Mortality Rates", title = "Adult Female Mortality Rates in Bulgaria (2020)")+
theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_male <- merged_data2 %>%
filter(Sex == "Male")
ggplot()+
geom_sf(bul, mapping = aes(), fill = "gray80")+
geom_sf(filtered_data_male, mapping = aes( fill = X2020))+
scale_fill_gradientn(colours=rev(magma(6)),
name="Mortality Rates",
na.value = "grey100",
trans = "log")+
theme_minimal()+
labs(fill = "Mortality Rates", title = "Adult Male Mortality Rates in Bulgaria (2020)")+
theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_female <- merged_data2 %>%
filter(Sex == "Female")
ggplot()+
geom_sf(bul, mapping = aes(), fill = "gray80")+
geom_sf(filtered_data_female, mapping = aes( fill = X2021))+
scale_fill_gradientn(colours=rev(magma(6)),
name="Mortality Rates",
na.value = "grey100",
trans = "log")+
theme_minimal()+
labs(fill = "Mortality Rates", title = "Adult Female Mortality Rates in Bulgaria (2021)")+
theme(plot.title = element_text(hjust = 0.5))

library(viridis)
filtered_data_male <- merged_data2 %>%
filter(Sex == "Male")
ggplot()+
geom_sf(bul, mapping = aes(), fill = "gray80")+
geom_sf(filtered_data_male, mapping = aes( fill = X2021))+
scale_fill_gradientn(colours=rev(magma(6)),
name="Mortality Rates",
na.value = "grey100",
trans = "log")+
theme_minimal()+
labs(fill = "Mortality Rates", title = "Adult Male Mortality Rates in Bulgaria (2021)")+
theme(plot.title = element_text(hjust = 0.5))

This was the start of an idea I had to create a bar graph that took
the mean of the mortality rates in 2019, 2020, and 2021, across both
genders in order to show a visual comparison between them This would
have been carried out had there been extra time to work on the
project
filtered_data_male <- filtered_data_male %>%
mutate(mean_male_2019 = mean(X2019, na.rm = TRUE),
mean_male_2020 = mean(X2020, na.rm = TRUE),
mean_male_2021 = mean(X2021, na.rm = TRUE))
filtered_data_female <- filtered_data_female %>%
mutate(mean_female_2019 = mean(X2019, na.rm = TRUE),
mean_female_2020 = mean(X2020, na.rm = TRUE),
mean_female_2021 = mean(X2021, na.rm = TRUE))
LS0tCnRpdGxlOiAiTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhIGZyb20gMjAxOS0yMDIxIGJ5IEdlbmRlciIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJtKGxpc3Q9bHMoKSkKCmxpYnJhcnkodG1hcCkKbGlicmFyeShzZikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KGRwbHlyKQoKdXJsIDwtICJodHRwczovL2dlb2RhdGEudWNkYXZpcy5lZHUvZ2FkbS9nYWRtNC4wL3NocC9nYWRtNDBfQkdSX3NocC56aXAiCmBgYApDbGVhcmVkIHRoZSBlbnZpcm9ubWVudCBmb3IgYmV0dGVyIG9yZ2FuaXphdGlvbiBhbmQgdGhlbiBkb3dubG9hZGVkIHRoZSBsaWJyYXJpZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSB0aGUgbWFwcy4KCgpgYGB7cn0KCmRvd25sb2FkLmZpbGUodXJsLCAiLi9idWwuemlwIikKCgpgYGAKRG93bmxvYWRlZCB0aGUgZmlsZXMuCgpgYGB7cn0KdW56aXAoIi4vYnVsLnppcCIsIGV4ZGlyID0gImJ1bCIpCgoKYGBgClVuemlwcGVkIHRoZSBmaWxlcy4KCgpgYGB7cn0KYnVsIDwtIHN0X3JlYWQoIi4vYnVsL2dhZG00MF9CR1JfMi5zaHAiKQoKYGBgClJlYWQgdGhlIGZpbGVzLgoKYGBge3J9Cm1hcCA8LSB0bV9zaGFwZShidWwpICsgdG1fZmlsbCgiTkFNRV8xIikgKyB0bV9ib3JkZXJzKCkKCmBgYApHZW5lcmF0aW5nIGEgYmFzZSBtYXAgdG8gZ2V0IGFuIGlkZWEgb2Ygd2hhdCBpdCBzaG91bGQgbG9vayBsaWtlLgoKCmBgYHtyfQoKcHJpbnQobWFwKQpgYGAKUHJpbnRlZCB0aGUgYmFzZSBtYXAuCgoKYGBge3J9CmNvZGVzIDwtIHJlYWQuY3N2KCJzaW1wbGVjb2Rlcy5jc3YiKQptb3J0YWxpdGllcyA8LSByZWFkLmNzdigiQnVsZ2FyaWFfTW9ydGFsaXR5X1JhdGVzX011bmljaXBhbGl0aWVzX01vcnRhbGl0eS5jc3YiKQoKbmV3Y29kZXNfZGF0YSA8LSBtZXJnZShidWwsIGNvZGVzLCBieSA9ICJJRF8yIiwgYWxsLnggPSBUUlVFKQoKYGBgCkkgbWFkZSB0aGUgLmNzdiBmaWxlcyBjb250YWluaW5nIHRoZSBkYXRhIGZvciBCdWxnYXJpYSBpbnRvIGRhdGEgZnJhbWVzLiBJIHRoZW4KbWVyZ2VkIHRvZ2V0aGVyIHRoZSB0d28gQnVsZ2FyaWEgZGF0YSBzZXRzIHdoaWNoIGNvbnRhaW4gY29kZXMgZm9yIGRpZmZlcmVudCByZWdpb25zLgoKCmBgYHtyfQptb3J0YWxpdGllcyA8LSAgbW9ydGFsaXRpZXMgJT4lICBtdXRhdGUoUmVnaW9uLmVuPWlmX2Vsc2UoUmVnaW9uLmVuPT0iU29maWEgKGNhcGl0YWwpIiwgIkdyYWQgU29maXlhIiwgUmVnaW9uLmVuKSkKCm1vcnRhbGl0aWVzIDwtIG1vcnRhbGl0aWVzICU+JSBtdXRhdGUoUmVnaW9uLmVuID0gaWZfZWxzZShSZWdpb24uZW49PSJLdXJkemhhbGkiLCJLYXJkemhhbGkiLFJlZ2lvbi5lbikgKQoKbW9ydGFsaXRpZXMgPC0gbW9ydGFsaXRpZXMgJT4lICBtdXRhdGUoa2V5PXRvbG93ZXIoUmVnaW9uLmVuKSkKYGBgCkZpeGVkIHRoZSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBpc3N1ZSB0aGF0IGNvbWVzIGZyb20gZGlzcGFyaXRpZXMgaW4gdGhlIG5hbWVzIG9mIGxvY2F0aW9ucy4KCgoKYGBge3J9CgptZXJnZWRfZGF0YSA8LSBtZXJnZShuZXdjb2Rlc19kYXRhLCBtb3J0YWxpdGllcywgYnk9ICJrZXkiLCBhbGwueSA9IFRSVUUpCgojbWVyZ2VkX2RhdGEgPC0gbWVyZ2UoYnVsLCBtb3J0YWxpdGllcywgYnkueCA9ICJOQU1FXzEiLCBieS55ID0gIlJlZ2lvbi5lbiIsIGFsbC54ID0gVFJVRSkKCmJ1bF9saXN0IDwtIHVuaXF1ZShidWwkTkFNRV8yKQptb3J0X2xpc3QgPC0gdW5pcXVlKG1vcnRhbGl0aWVzJFJlZ2lvbi5lbikKbWVyZ2VkX2xpc3QgPC0gdW5pcXVlKG1lcmdlZF9kYXRhJHJlZ2lvbikKCmBgYApNZXJnZWQgdGhlIGRhdGEgY29udGFpbmluZyB0aGUgY29kZXMgZm9yIHJlZ2lvbnMgYW5kIHRoZSBtb3J0YWxpdHkgZGF0YSwgdGhlbiBsb29rZWQgYXQgYWxsIHRoZSB1bmlxdWUgdmFsdWVzIHByZXNlbnQgaW4gdGhlIGRhdGFmcmFtZXMuCgoKCmBgYHtyfQptZXJnZWRfZGF0YTIgPC0gbWVyZ2VkX2RhdGEKCm1heChtZXJnZWRfZGF0YTIkWDIwMTksIG5hLnJtPVRSVUUpCm1pbihtZXJnZWRfZGF0YTIkWDIwMTksIG5hLnJtPVRSVUUpCmhpZ2hfb3V0bGllcnMgPC0gbWVyZ2VkX2RhdGEyICU+JSBmaWx0ZXIoWDIwMTkgPiA0MDAwKQpgYGAKQ3JlYXRlZCBhIG5ldyBkYXRhIGZyYW1lIHRoYXQgd2lsbCBsYXRlciBiZSBhbHRlcmVkLCBhbmQgbG9va2luZyBhdCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgdG8gcGlucG9pbnQgb3V0bGllcnMgYW5kIHJlbW92ZSB0aGVtLgoKCmBgYHtyfQpnZ3Bsb3QoKSsKICBnZW9tX3NmKGJ1bCwgbWFwcGluZyA9IGFlcygpLCBmaWxsID0gImdyYXk4MCIpKwogIGdlb21fc2YobWVyZ2VkX2RhdGEyLCBtYXBwaW5nID0gYWVzKCBmaWxsID0gWDIwMTkpKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IE1vcnRhbGl0eSBSYXRlcyBpbiBCdWxnYXJpYSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKUGxvdHRlZCBhIHJlZmVyZW5jZSBtYXAgdGhhdCBkb2VzIG5vdCBzZXBhcmF0ZSB0aGUgbW9ydGFsaXR5IHJhdGVzIGJ5IGdlbmRlci4KCmBgYHtyfQptaXNzaW5nIDwtIG1lcmdlZF9kYXRhMiAlPiUgZmlsdGVyKE5BTUVfMS54ID09ICJLYXJkemhhbGkiKQpgYGAKQ3JlYXRlcyBhIG5ldyBkYXRhIGZyYW1lIGNvbnRhaW5pbmcgb25seSB0aGUgZGF0YSBmb3IgdGhlIHJlZ2lvbiBjYWxsZWQgS2FyZHpoYWxpLiBJIHdhcyB1bmZvcnR1bmF0ZWx5IG1pc3NpbmcgZGF0YSBmb3IgdGhpcyBhcmVhLCBub3RlZCBieSB0aGUgZ3JleSBhcmVhcyBvbiB0aGUgbWFwLgoKCgoKRm9yIHRoZSBmb2xsb3dpbmcgZ3JhcGhzOgpJIGZpbHRlcmVkIHRoZSBkYXRhIHNvIHRoYXQgdGhlIGRhdGEgZm9yIGZlbWFsZSBhbmQgbWFsZSBhcmUgcHV0IGludG8gc2VwYXJhdGUgZGF0YSBmcmFtZXMuIEkgcGxvdHRlZCB0aGUgZ3JhcGhzIGZvciAyMDE5LCAyMDIwLCBhbmQgMjAyMSBieSBnZW5kZXIgZm9yIGV2ZXJ5IHllYXIsIGNoYW5naW5nIHRoZSBjb2xvciBvZiB0aGUgZ3JhcGhzIHRvIGNyZWF0ZSBtb3JlIGRpc3RpbmN0aW9uLiBJIGFsc28gdHJhbnNmb3JtZWQgdGhlIGRhdGEgaW50byBhIGxvZ2FyaXRobWljIHNjYWxlIHRvIHNob3cgZGlmZmVyZW5jZXMgdGhyb3VnaCB0aGUgc2NhbGUsIHNpbmNlIHRoZSBtb3J0YWxpdHkgZGlmZmVyZW5jZXMgYmV0d2VlbiByZWdpb25zIHdlcmUgbm90IHZlcnkgYXBwYXJlbnQuCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9mZW1hbGUgPC0gbWVyZ2VkX2RhdGEyICU+JQogIGZpbHRlcihTZXggPT0gIkZlbWFsZSIpCgpnZ3Bsb3QoKSsKICBnZW9tX3NmKGJ1bCwgbWFwcGluZyA9IGFlcygpLCBmaWxsID0gImdyYXk4MCIpKwogIGdlb21fc2YoZmlsdGVyZWRfZGF0YV9mZW1hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAxOSkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IEZlbWFsZSBNb3J0YWxpdHkgUmF0ZXMgaW4gQnVsZ2FyaWEgKDIwMTkpIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh2aXJpZGlzKQpmaWx0ZXJlZF9kYXRhX21hbGUgPC0gbWVyZ2VkX2RhdGEyICU+JQogIGZpbHRlcihTZXggPT0gIk1hbGUiKQoKZ2dwbG90KCkrCiAgZ2VvbV9zZihidWwsIG1hcHBpbmcgPSBhZXMoKSwgZmlsbCA9ICJncmF5ODAiKSsKICBnZW9tX3NmKGZpbHRlcmVkX2RhdGFfbWFsZSwgbWFwcGluZyA9IGFlcyggZmlsbCA9IFgyMDE5KSkrCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3Vycz1yZXYobWFnbWEoNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTW9ydGFsaXR5IFJhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXkxMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZyIpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKGZpbGwgPSAiTW9ydGFsaXR5IFJhdGVzIiwgdGl0bGUgPSAiQWR1bHQgTWFsZSBNb3J0YWxpdHkgUmF0ZXMgaW4gQnVsZ2FyaWEgKDIwMTkpIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHZpcmlkaXMpCmZpbHRlcmVkX2RhdGFfZmVtYWxlIDwtIG1lcmdlZF9kYXRhMiAlPiUKICBmaWx0ZXIoU2V4ID09ICJGZW1hbGUiKQoKZ2dwbG90KCkrCiAgZ2VvbV9zZihidWwsIG1hcHBpbmcgPSBhZXMoKSwgZmlsbCA9ICJncmF5ODAiKSsKICBnZW9tX3NmKGZpbHRlcmVkX2RhdGFfZmVtYWxlLCBtYXBwaW5nID0gYWVzKCBmaWxsID0gWDIwMjApKSsKICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzPXJldihtYWdtYSg2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJNb3J0YWxpdHkgUmF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTEwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIikrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMoZmlsbCA9ICJNb3J0YWxpdHkgUmF0ZXMiLCB0aXRsZSA9ICJBZHVsdCBGZW1hbGUgTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhICgyMDIwKSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9tYWxlIDwtIG1lcmdlZF9kYXRhMiAlPiUKICBmaWx0ZXIoU2V4ID09ICJNYWxlIikKCmdncGxvdCgpKwogIGdlb21fc2YoYnVsLCBtYXBwaW5nID0gYWVzKCksIGZpbGwgPSAiZ3JheTgwIikrCiAgZ2VvbV9zZihmaWx0ZXJlZF9kYXRhX21hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAyMCkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IE1hbGUgTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhICgyMDIwKSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9mZW1hbGUgPC0gbWVyZ2VkX2RhdGEyICU+JQogIGZpbHRlcihTZXggPT0gIkZlbWFsZSIpCgpnZ3Bsb3QoKSsKICBnZW9tX3NmKGJ1bCwgbWFwcGluZyA9IGFlcygpLCBmaWxsID0gImdyYXk4MCIpKwogIGdlb21fc2YoZmlsdGVyZWRfZGF0YV9mZW1hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAyMSkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IEZlbWFsZSBNb3J0YWxpdHkgUmF0ZXMgaW4gQnVsZ2FyaWEgKDIwMjEpIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKYGBge3J9CmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9tYWxlIDwtIG1lcmdlZF9kYXRhMiAlPiUKICBmaWx0ZXIoU2V4ID09ICJNYWxlIikKCmdncGxvdCgpKwogIGdlb21fc2YoYnVsLCBtYXBwaW5nID0gYWVzKCksIGZpbGwgPSAiZ3JheTgwIikrCiAgZ2VvbV9zZihmaWx0ZXJlZF9kYXRhX21hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAyMSkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IE1hbGUgTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhICgyMDIxKSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCgpUaGlzIHdhcyB0aGUgc3RhcnQgb2YgYW4gaWRlYSBJIGhhZCB0byBjcmVhdGUgYSBiYXIgZ3JhcGggdGhhdCB0b29rIHRoZSBtZWFuIG9mIHRoZSBtb3J0YWxpdHkgcmF0ZXMgaW4gMjAxOSwgMjAyMCwgYW5kIDIwMjEsIGFjcm9zcyBib3RoIGdlbmRlcnMgaW4gb3JkZXIgdG8gc2hvdyBhIHZpc3VhbCBjb21wYXJpc29uIGJldHdlZW4gdGhlbQpUaGlzIHdvdWxkIGhhdmUgYmVlbiBjYXJyaWVkIG91dCBoYWQgdGhlcmUgYmVlbiBleHRyYSB0aW1lIHRvIHdvcmsgb24gdGhlIHByb2plY3QKYGBge3J9CmZpbHRlcmVkX2RhdGFfbWFsZSA8LSBmaWx0ZXJlZF9kYXRhX21hbGUgJT4lCiAgbXV0YXRlKG1lYW5fbWFsZV8yMDE5ID0gbWVhbihYMjAxOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgbWVhbl9tYWxlXzIwMjAgPSBtZWFuKFgyMDIwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBtZWFuX21hbGVfMjAyMSA9IG1lYW4oWDIwMjEsIG5hLnJtID0gVFJVRSkpCmZpbHRlcmVkX2RhdGFfZmVtYWxlIDwtIGZpbHRlcmVkX2RhdGFfZmVtYWxlICU+JQogIG11dGF0ZShtZWFuX2ZlbWFsZV8yMDE5ID0gbWVhbihYMjAxOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgbWVhbl9mZW1hbGVfMjAyMCA9IG1lYW4oWDIwMjAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIG1lYW5fZmVtYWxlXzIwMjEgPSBtZWFuKFgyMDIxLCBuYS5ybSA9IFRSVUUpKQpgYGAKCgoKCgo=