library(tidyverse)
library(dplyr)
library(ggplot2)
library(sf)
list.files()
[1] "Antioquia.nb.html"        
[2] "Antioquia.Rmd"            
[3] "EVA.ANTIOQUIA.csv"        
[4] "MGN_MPIO_POLITICO.shp"    
[5] "MGN_MPIO_POLITICO.shp.xml"
eva_antioquia <- read.csv("EVA.ANTIOQUIA.csv")
class(eva_antioquia)

“A partir de aquí empiezan la lectura de los datos”

head(eva_antioquia)
lmunicipio <- select(eva_antioquia, MUNI)
lmunicipio
NA
vercafe <- filter(eva_antioquia, CULTI == "CAFE" )
eva_antioquia %>% group_by(CULTI, MUNI) %>% summarise(max_rend = max(RENDI, na.rm = TRUE)) %>%
  slice(which.max(max_rend))
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning in max(RENDI, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
`summarise()` has grouped output by 'CULTI'. You can override using the `.groups` argument.

” Se busca conocer cuales cultivos son los más populares en Antioquía”

eva_antioquia %>% 
  group_by(GCULTI, MUNI, ANO) %>%
  summarize(max_prod = max(PRODUC, na.rm = TRUE)) %>%
    slice(which.max(max_prod)) %>%
    arrange(desc(max_prod)) -> ton_prod_max
ton_prod_max
eva_antioquia %>% 
  group_by(CULTI, MUNI, ANO) %>%
  summarize(max_prod = max(PRODUC, na.rm = TRUE)) %>%
    slice(which.max(max_prod)) %>%
    arrange(desc(max_prod)) -> culti_max
Warning in max(PRODUC, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
`summarise()` has grouped output by 'CULTI', 'MUNI'. You can override using the `.groups` argument.
culti_max
eva_antioquia %>% 
  filter(MUNI=="URRAO" & CULTI=="PLATANO") %>% 
  group_by(ANO, CULTI) %>%
  select(MUNI, CULTI, PRODUC, ANO) ->  platano_urrao
platano_urrao

“Ya que sabemos cuales son los cultivos más prominentes en el Departamento vamos a proceder con su visualización”

g <- ggplot(aes(x=ANO, y=PRODUC/1000), data = platano_urrao) + geom_bar(stat='identity') + labs(y='Produccion de Plátano en Urrao [Ton x 1000]')
g + ggtitle("Evolution of Plátano Crop Production in Urrao from 2007 to 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

eva_antioquia %>% 
  group_by(ANO, CULTI, ASEMB, PRODUC, RENDI, ACOSE) %>%
  summarize(max_prod = max(PRODUC, na.rm = TRUE)) %>%
    slice(which.max(max_prod)) %>%
    arrange(desc(max_prod)) -> max_prod_antioquia
max_prod_antioquia
eva_antioquia %>% 
  filter(CULTI=="PLATANO") %>% 
  group_by(ANO, CULTI) %>%
  select(MUNI, CULTI, PRODUC, ANO, ASEMB, RENDI, ACOSE) ->  platano_antioquia
platano_antioquia
NA
p <- ggplot(aes(x=ANO, y=PRODUC/1000), data = platano_antioquia) + geom_bar(stat='identity') + labs(y='Produccion de Plátano en Antioquía [Ton x 1000]')
p + ggtitle("Evolution of Plátano Crop Production in Antioquia from 2007 to 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

q <- ggplot(aes(x=ANO, y=ASEMB), data = platano_antioquia) + geom_bar(stat='identity') + labs(y='Área sembrada de Plátano en Antioquía [Ha]')
q + ggtitle("Evolución de Área sembrada de Plátano en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

r <- ggplot(aes(x=ANO, y=RENDI), data = platano_antioquia) + geom_bar(stat='identity') + labs(y='Rendimiento de Plátano en Antioquía [TON/Ha cosechada]')
r + ggtitle("Evolución del Rendimiento de Plátano en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")
Warning: Removed 10 rows containing missing values
(position_stack).

s <- ggplot(aes(x=ANO, y=ACOSE), data = platano_antioquia) + geom_bar(stat='identity') + labs(y='Área cosechada de Plátano en Antioquía [Ha]')
s + ggtitle("Evolución del Área cosechada de Plátano en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

eva_antioquia %>% 
  filter(CULTI=="CAFE") %>% 
  group_by(ANO, CULTI) %>%
  select(MUNI, CULTI, PRODUC, ANO, ASEMB, RENDI, ACOSE) ->  cafe_antioquia
cafe_antioquia
c <- ggplot(aes(x=ANO, y=PRODUC/1000), data = cafe_antioquia) + geom_bar(stat='identity') + labs(y='Produccion de Café en Antioquía [Ton x 1000]')
c + ggtitle("Evolución de la producción de Café en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

d <- ggplot(aes(x=ANO, y=ASEMB), data = cafe_antioquia) + geom_bar(stat='identity') + labs(y='Área de Café sembrada en Antioquía [Ha]')
d + ggtitle("Evolución del Área sembrada de Café en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

e <- ggplot(aes(x=ANO, y=ACOSE), data = cafe_antioquia) + geom_bar(stat='identity') + labs(y='Área de Café cosechada en Antioquía [Ha]')
e + ggtitle("Evolución del Área cosechada de Café en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

f <- ggplot(aes(x=ANO, y=RENDI), data = cafe_antioquia) + geom_bar(stat='identity') + labs(y='Rendimiento de Café  en Antioquía [TON/ Ha cosechada]')
f + ggtitle("Evolución del rendimiento de Café en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")
Warning: Removed 3 rows containing missing values
(position_stack).

eva_antioquia %>% 
  filter(CULTI=="AGUACATE") %>% 
  group_by(ANO, CULTI) %>%
  select(MUNI, CULTI, PRODUC, ANO, ASEMB, RENDI, ACOSE) ->  aguacate_antioquia
aguacate_antioquia
a <- ggplot(aes(x=ANO, y=PRODUC/1000), data = aguacate_antioquia) + geom_bar(stat='identity') + labs(y='Producción de Aguacate  en Antioquía [TON x 1000]')
a + ggtitle("Evolución de la producción de Aguacate en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

b <- ggplot(aes(x=ANO, y=ASEMB), data = aguacate_antioquia) + geom_bar(stat='identity') + labs(y='Área de Aguacate sembrada en Antioquía [Ha]')
b + ggtitle("Evolución del Área de Aguacate sembrada en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

x <- ggplot(aes(x=ANO, y=ACOSE), data = aguacate_antioquia) + geom_bar(stat='identity') + labs(y='Área de Aguacate cosechada en Antioquía [Ha]')
x + ggtitle("Evolución del Área de Aguacate cosechada en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")

y <- ggplot(aes(x=ANO, y=RENDI), data = aguacate_antioquia) + geom_bar(stat='identity') + labs(y='Rendimiento de Aguacate  en Antioquía [TON/ Ha cosechada]')
y + ggtitle("Evolución del rendimiento de Aguacate en Antioquia desde 2007 hasta 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")
Warning: Removed 110 rows containing missing values
(position_stack).

data <- eva_antioquia %>%
       filter(CULTI== "PLATANO" & ANO==2018 & PRODUC>17000) %>% 
       select(MUNI, PRODUC)
  
  
# Basic piechart
ggplot(data, aes(x="", y=PRODUC/1000, fill=MUNI)) +
  geom_bar(stat="identity", width=1) +
  coord_polar("y", start=0)

data <- eva_antioquia %>%
       filter(CULTI== "CAFE" & ANO==2018 & PRODUC>5000) %>% 
       select(MUNI, PRODUC)
  
  
# Basic piechart
ggplot(data, aes(x="", y=PRODUC/1000, fill=MUNI)) +
  geom_bar(stat="identity", width=1) +
  coord_polar("y", start=0)

data <- eva_antioquia %>%
       filter(CULTI== "AGUACATE" & ANO==2018 & PRODUC>5000) %>% 
       select(MUNI, PRODUC)
  
  
# Basic piechart
ggplot(data, aes(x="", y=PRODUC/1000, fill=MUNI)) +
  geom_bar(stat="identity", width=1) +
  coord_polar("y", start=0)

plot(cars)
LS0tDQp0aXRsZTogIkVzdHVkaW8gRVZBIEFudGlvcXVpYSINCkF1dG9yZXM6ICJNYXLDrWEgU2FudGFmZSB5IEFuZHLDqXMgSGluY2FwacOpIg0KRmVjaGE6ICIxMC4xMS4yMDIxIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpkZl9wcmludDogcGFnZWQNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2YpDQpgYGANCg0KYGBge3J9DQpsaXN0LmZpbGVzKCkNCg0KYGBgDQpgYGB7cn0NCmV2YV9hbnRpb3F1aWEgPC0gcmVhZC5jc3YoIkVWQS5BTlRJT1FVSUEuY3N2IikNCg0KYGBgDQpgYGB7cn0NCmNsYXNzKGV2YV9hbnRpb3F1aWEpDQoNCg0KYGBgDQoiQSBwYXJ0aXIgZGUgYXF1w60gZW1waWV6YW4gbGEgbGVjdHVyYSBkZSBsb3MgZGF0b3MiDQpgYGB7cn0NCmhlYWQoZXZhX2FudGlvcXVpYSkNCmBgYA0KYGBge3J9DQpsbXVuaWNpcGlvIDwtIHNlbGVjdChldmFfYW50aW9xdWlhLCBNVU5JKQ0KYGBgDQpgYGB7cn0NCmxtdW5pY2lwaW8NCg0KYGBgDQpgYGB7cn0NCnZlcmNhZmUgPC0gZmlsdGVyKGV2YV9hbnRpb3F1aWEsIENVTFRJID09ICJDQUZFIiApDQpgYGANCmBgYHtyfQ0KZXZhX2FudGlvcXVpYSAlPiUgZ3JvdXBfYnkoQ1VMVEksIE1VTkkpICU+JSBzdW1tYXJpc2UobWF4X3JlbmQgPSBtYXgoUkVOREksIG5hLnJtID0gVFJVRSkpICU+JQ0KICBzbGljZSh3aGljaC5tYXgobWF4X3JlbmQpKQ0KYGBgDQoiIFNlIGJ1c2NhIGNvbm9jZXIgY3VhbGVzIGN1bHRpdm9zIHNvbiBsb3MgbcOhcyBwb3B1bGFyZXMgZW4gQW50aW9xdcOtYSINCmBgYHtyfQ0KZXZhX2FudGlvcXVpYSAlPiUgDQogIGdyb3VwX2J5KEdDVUxUSSwgTVVOSSwgQU5PKSAlPiUNCiAgc3VtbWFyaXplKG1heF9wcm9kID0gbWF4KFBST0RVQywgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgc2xpY2Uod2hpY2gubWF4KG1heF9wcm9kKSkgJT4lDQogICAgYXJyYW5nZShkZXNjKG1heF9wcm9kKSkgLT4gdG9uX3Byb2RfbWF4DQpgYGANCmBgYHtyfQ0KdG9uX3Byb2RfbWF4DQpgYGANCmBgYHtyfQ0KZXZhX2FudGlvcXVpYSAlPiUgDQogIGdyb3VwX2J5KENVTFRJLCBNVU5JLCBBTk8pICU+JQ0KICBzdW1tYXJpemUobWF4X3Byb2QgPSBtYXgoUFJPRFVDLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICBzbGljZSh3aGljaC5tYXgobWF4X3Byb2QpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobWF4X3Byb2QpKSAtPiBjdWx0aV9tYXgNCmBgYA0KYGBge3J9DQpjdWx0aV9tYXgNCmBgYA0KYGBge3J9DQpldmFfYW50aW9xdWlhICU+JSANCiAgZmlsdGVyKE1VTkk9PSJVUlJBTyIgJiBDVUxUST09IlBMQVRBTk8iKSAlPiUgDQogIGdyb3VwX2J5KEFOTywgQ1VMVEkpICU+JQ0KICBzZWxlY3QoTVVOSSwgQ1VMVEksIFBST0RVQywgQU5PKSAtPiAgcGxhdGFub191cnJhbw0KYGBgDQpgYGB7cn0NCnBsYXRhbm9fdXJyYW8NCmBgYA0KIllhIHF1ZSBzYWJlbW9zIGN1YWxlcyBzb24gbG9zIGN1bHRpdm9zIG3DoXMgcHJvbWluZW50ZXMgZW4gZWwgRGVwYXJ0YW1lbnRvIHZhbW9zIGEgcHJvY2VkZXIgY29uIHN1IHZpc3VhbGl6YWNpw7NuIg0KYGBge3J9DQpnIDwtIGdncGxvdChhZXMoeD1BTk8sIHk9UFJPRFVDLzEwMDApLCBkYXRhID0gcGxhdGFub191cnJhbykgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSdQcm9kdWNjaW9uIGRlIFBsw6F0YW5vIGVuIFVycmFvIFtUb24geCAxMDAwXScpDQpgYGANCmBgYHtyfQ0KZyArIGdndGl0bGUoIkV2b2x1dGlvbiBvZiBQbMOhdGFubyBDcm9wIFByb2R1Y3Rpb24gaW4gVXJyYW8gZnJvbSAyMDA3IHRvIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVWQSBkYXRhIChNaW5hZ3JpY3VsdHVyYSwgMjAyMCkiKQ0KYGBgDQpgYGB7cn0NCmV2YV9hbnRpb3F1aWEgJT4lIA0KICBncm91cF9ieShBTk8sIENVTFRJLCBBU0VNQiwgUFJPRFVDLCBSRU5ESSwgQUNPU0UpICU+JQ0KICBzdW1tYXJpemUobWF4X3Byb2QgPSBtYXgoUFJPRFVDLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICBzbGljZSh3aGljaC5tYXgobWF4X3Byb2QpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobWF4X3Byb2QpKSAtPiBtYXhfcHJvZF9hbnRpb3F1aWENCmBgYA0KYGBge3J9DQptYXhfcHJvZF9hbnRpb3F1aWENCmBgYA0KYGBge3J9DQpldmFfYW50aW9xdWlhICU+JSANCiAgZmlsdGVyKENVTFRJPT0iUExBVEFOTyIpICU+JSANCiAgZ3JvdXBfYnkoQU5PLCBDVUxUSSkgJT4lDQogIHNlbGVjdChNVU5JLCBDVUxUSSwgUFJPRFVDLCBBTk8sIEFTRU1CLCBSRU5ESSwgQUNPU0UpIC0+ICBwbGF0YW5vX2FudGlvcXVpYQ0KYGBgDQpgYGB7cn0NCnBsYXRhbm9fYW50aW9xdWlhDQoNCmBgYA0KYGBge3J9DQpwIDwtIGdncGxvdChhZXMoeD1BTk8sIHk9UFJPRFVDLzEwMDApLCBkYXRhID0gcGxhdGFub19hbnRpb3F1aWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBQbMOhdGFubyBlbiBBbnRpb3F1w61hIFtUb24geCAxMDAwXScpDQpgYGANCmBgYHtyfQ0KcCArIGdndGl0bGUoIkV2b2x1dGlvbiBvZiBQbMOhdGFubyBDcm9wIFByb2R1Y3Rpb24gaW4gQW50aW9xdWlhIGZyb20gMjAwNyB0byAyMDE4IikgKyBsYWJzKGNhcHRpb249ICJCYXNlZCBvbiBFVkEgZGF0YSAoTWluYWdyaWN1bHR1cmEsIDIwMjApIikNCmBgYA0KYGBge3J9DQpxIDwtIGdncGxvdChhZXMoeD1BTk8sIHk9QVNFTUIpLCBkYXRhID0gcGxhdGFub19hbnRpb3F1aWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nw4FyZWEgc2VtYnJhZGEgZGUgUGzDoXRhbm8gZW4gQW50aW9xdcOtYSBbSGFdJykNCmBgYA0KDQpgYGB7cn0NCnEgKyBnZ3RpdGxlKCJFdm9sdWNpw7NuIGRlIMOBcmVhIHNlbWJyYWRhIGRlIFBsw6F0YW5vIGVuIEFudGlvcXVpYSBkZXNkZSAyMDA3IGhhc3RhIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVWQSBkYXRhIChNaW5hZ3JpY3VsdHVyYSwgMjAyMCkiKQ0KYGBgDQoNCg0KYGBge3J9DQpyIDwtIGdncGxvdChhZXMoeD1BTk8sIHk9UkVOREkpLCBkYXRhID0gcGxhdGFub19hbnRpb3F1aWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUmVuZGltaWVudG8gZGUgUGzDoXRhbm8gZW4gQW50aW9xdcOtYSBbVE9OL0hhIGNvc2VjaGFkYV0nKQ0KYGBgDQoNCmBgYHtyfQ0KciArIGdndGl0bGUoIkV2b2x1Y2nDs24gZGVsIFJlbmRpbWllbnRvIGRlIFBsw6F0YW5vIGVuIEFudGlvcXVpYSBkZXNkZSAyMDA3IGhhc3RhIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVWQSBkYXRhIChNaW5hZ3JpY3VsdHVyYSwgMjAyMCkiKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KcyA8LSBnZ3Bsb3QoYWVzKHg9QU5PLCB5PUFDT1NFKSwgZGF0YSA9IHBsYXRhbm9fYW50aW9xdWlhKSArIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyBsYWJzKHk9J8OBcmVhIGNvc2VjaGFkYSBkZSBQbMOhdGFubyBlbiBBbnRpb3F1w61hIFtIYV0nKQ0KYGBgDQoNCmBgYHtyfQ0KcyArIGdndGl0bGUoIkV2b2x1Y2nDs24gZGVsIMOBcmVhIGNvc2VjaGFkYSBkZSBQbMOhdGFubyBlbiBBbnRpb3F1aWEgZGVzZGUgMjAwNyBoYXN0YSAyMDE4IikgKyBsYWJzKGNhcHRpb249ICJCYXNlZCBvbiBFVkEgZGF0YSAoTWluYWdyaWN1bHR1cmEsIDIwMjApIikNCmBgYA0KDQpgYGB7cn0NCmV2YV9hbnRpb3F1aWEgJT4lIA0KICBmaWx0ZXIoQ1VMVEk9PSJDQUZFIikgJT4lIA0KICBncm91cF9ieShBTk8sIENVTFRJKSAlPiUNCiAgc2VsZWN0KE1VTkksIENVTFRJLCBQUk9EVUMsIEFOTywgQVNFTUIsIFJFTkRJLCBBQ09TRSkgLT4gIGNhZmVfYW50aW9xdWlhDQpgYGANCmBgYHtyfQ0KY2FmZV9hbnRpb3F1aWENCmBgYA0KYGBge3J9DQpjIDwtIGdncGxvdChhZXMoeD1BTk8sIHk9UFJPRFVDLzEwMDApLCBkYXRhID0gY2FmZV9hbnRpb3F1aWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBDYWbDqSBlbiBBbnRpb3F1w61hIFtUb24geCAxMDAwXScpDQpgYGANCmBgYHtyfQ0KYyArIGdndGl0bGUoIkV2b2x1Y2nDs24gZGUgbGEgcHJvZHVjY2nDs24gZGUgQ2Fmw6kgZW4gQW50aW9xdWlhIGRlc2RlIDIwMDcgaGFzdGEgMjAxOCIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDIwKSIpDQpgYGANCg0KYGBge3J9DQpkIDwtIGdncGxvdChhZXMoeD1BTk8sIHk9QVNFTUIpLCBkYXRhID0gY2FmZV9hbnRpb3F1aWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nw4FyZWEgZGUgQ2Fmw6kgc2VtYnJhZGEgZW4gQW50aW9xdcOtYSBbSGFdJykNCmBgYA0KYGBge3J9DQpkICsgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZWwgw4FyZWEgc2VtYnJhZGEgZGUgQ2Fmw6kgZW4gQW50aW9xdWlhIGRlc2RlIDIwMDcgaGFzdGEgMjAxOCIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDIwKSIpDQpgYGANCmBgYHtyfQ0KZSA8LSBnZ3Bsb3QoYWVzKHg9QU5PLCB5PUFDT1NFKSwgZGF0YSA9IGNhZmVfYW50aW9xdWlhKSArIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyBsYWJzKHk9J8OBcmVhIGRlIENhZsOpIGNvc2VjaGFkYSBlbiBBbnRpb3F1w61hIFtIYV0nKQ0KYGBgDQpgYGB7cn0NCmUgKyBnZ3RpdGxlKCJFdm9sdWNpw7NuIGRlbCDDgXJlYSBjb3NlY2hhZGEgZGUgQ2Fmw6kgZW4gQW50aW9xdWlhIGRlc2RlIDIwMDcgaGFzdGEgMjAxOCIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDIwKSIpDQpgYGANCmBgYHtyfQ0KZiA8LSBnZ3Bsb3QoYWVzKHg9QU5PLCB5PVJFTkRJKSwgZGF0YSA9IGNhZmVfYW50aW9xdWlhKSArIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyBsYWJzKHk9J1JlbmRpbWllbnRvIGRlIENhZsOpICBlbiBBbnRpb3F1w61hIFtUT04vIEhhIGNvc2VjaGFkYV0nKQ0KYGBgDQpgYGB7cn0NCmYgKyBnZ3RpdGxlKCJFdm9sdWNpw7NuIGRlbCByZW5kaW1pZW50byBkZSBDYWbDqSBlbiBBbnRpb3F1aWEgZGVzZGUgMjAwNyBoYXN0YSAyMDE4IikgKyBsYWJzKGNhcHRpb249ICJCYXNlZCBvbiBFVkEgZGF0YSAoTWluYWdyaWN1bHR1cmEsIDIwMjApIikNCmBgYA0KYGBge3J9DQpldmFfYW50aW9xdWlhICU+JSANCiAgZmlsdGVyKENVTFRJPT0iQUdVQUNBVEUiKSAlPiUgDQogIGdyb3VwX2J5KEFOTywgQ1VMVEkpICU+JQ0KICBzZWxlY3QoTVVOSSwgQ1VMVEksIFBST0RVQywgQU5PLCBBU0VNQiwgUkVOREksIEFDT1NFKSAtPiAgYWd1YWNhdGVfYW50aW9xdWlhDQpgYGANCmBgYHtyfQ0KYWd1YWNhdGVfYW50aW9xdWlhDQpgYGANCmBgYHtyfQ0KYSA8LSBnZ3Bsb3QoYWVzKHg9QU5PLCB5PVBST0RVQy8xMDAwKSwgZGF0YSA9IGFndWFjYXRlX2FudGlvcXVpYSkgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSdQcm9kdWNjacOzbiBkZSBBZ3VhY2F0ZSAgZW4gQW50aW9xdcOtYSBbVE9OIHggMTAwMF0nKQ0KYGBgDQpgYGB7cn0NCmEgKyBnZ3RpdGxlKCJFdm9sdWNpw7NuIGRlIGxhIHByb2R1Y2Npw7NuIGRlIEFndWFjYXRlIGVuIEFudGlvcXVpYSBkZXNkZSAyMDA3IGhhc3RhIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVWQSBkYXRhIChNaW5hZ3JpY3VsdHVyYSwgMjAyMCkiKQ0KYGBgDQpgYGB7cn0NCmIgPC0gZ2dwbG90KGFlcyh4PUFOTywgeT1BU0VNQiksIGRhdGEgPSBhZ3VhY2F0ZV9hbnRpb3F1aWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nw4FyZWEgZGUgQWd1YWNhdGUgc2VtYnJhZGEgZW4gQW50aW9xdcOtYSBbSGFdJykNCmBgYA0KYGBge3J9DQpiICsgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZWwgw4FyZWEgZGUgQWd1YWNhdGUgc2VtYnJhZGEgZW4gQW50aW9xdWlhIGRlc2RlIDIwMDcgaGFzdGEgMjAxOCIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDIwKSIpDQpgYGANCmBgYHtyfQ0KeCA8LSBnZ3Bsb3QoYWVzKHg9QU5PLCB5PUFDT1NFKSwgZGF0YSA9IGFndWFjYXRlX2FudGlvcXVpYSkgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSfDgXJlYSBkZSBBZ3VhY2F0ZSBjb3NlY2hhZGEgZW4gQW50aW9xdcOtYSBbSGFdJykNCmBgYA0KYGBge3J9DQp4ICsgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZWwgw4FyZWEgZGUgQWd1YWNhdGUgY29zZWNoYWRhIGVuIEFudGlvcXVpYSBkZXNkZSAyMDA3IGhhc3RhIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVWQSBkYXRhIChNaW5hZ3JpY3VsdHVyYSwgMjAyMCkiKQ0KYGBgDQpgYGB7cn0NCnkgPC0gZ2dwbG90KGFlcyh4PUFOTywgeT1SRU5ESSksIGRhdGEgPSBhZ3VhY2F0ZV9hbnRpb3F1aWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUmVuZGltaWVudG8gZGUgQWd1YWNhdGUgIGVuIEFudGlvcXXDrWEgW1RPTi8gSGEgY29zZWNoYWRhXScpDQpgYGANCmBgYHtyfQ0KeSArIGdndGl0bGUoIkV2b2x1Y2nDs24gZGVsIHJlbmRpbWllbnRvIGRlIEFndWFjYXRlIGVuIEFudGlvcXVpYSBkZXNkZSAyMDA3IGhhc3RhIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVWQSBkYXRhIChNaW5hZ3JpY3VsdHVyYSwgMjAyMCkiKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YSA8LSBldmFfYW50aW9xdWlhICU+JQ0KICAgICAgIGZpbHRlcihDVUxUST09ICJQTEFUQU5PIiAmIEFOTz09MjAxOCAmIFBST0RVQz4xNzAwMCkgJT4lIA0KICAgICAgIHNlbGVjdChNVU5JLCBQUk9EVUMpDQogIA0KICANCiMgQmFzaWMgcGllY2hhcnQNCmdncGxvdChkYXRhLCBhZXMoeD0iIiwgeT1QUk9EVUMvMTAwMCwgZmlsbD1NVU5JKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTEpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKQ0KYGBgDQpgYGB7cn0NCmRhdGEgPC0gZXZhX2FudGlvcXVpYSAlPiUNCiAgICAgICBmaWx0ZXIoQ1VMVEk9PSAiQ0FGRSIgJiBBTk89PTIwMTggJiBQUk9EVUM+NTAwMCkgJT4lIA0KICAgICAgIHNlbGVjdChNVU5JLCBQUk9EVUMpDQogIA0KICANCiMgQmFzaWMgcGllY2hhcnQNCmdncGxvdChkYXRhLCBhZXMoeD0iIiwgeT1QUk9EVUMvMTAwMCwgZmlsbD1NVU5JKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTEpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKQ0KYGBgDQpgYGB7cn0NCmRhdGEgPC0gZXZhX2FudGlvcXVpYSAlPiUNCiAgICAgICBmaWx0ZXIoQ1VMVEk9PSAiQUdVQUNBVEUiICYgQU5PPT0yMDE4ICYgUFJPRFVDPjUwMDApICU+JSANCiAgICAgICBzZWxlY3QoTVVOSSwgUFJPRFVDKQ0KICANCiAgDQojIEJhc2ljIHBpZWNoYXJ0DQpnZ3Bsb3QoZGF0YSwgYWVzKHg9IiIsIHk9UFJPRFVDLzEwMDAsIGZpbGw9TVVOSSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0xKSArDQogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkNCmBgYA0KYGBge3J9DQpwbG90KGNhcnMpDQpgYGANCg0K