library(viridis)
library(dplyr)
library(ggplot2)
data_set <- read.csv('primary_results.csv')
#View(data_set)
1. ¿Cuantos candidatos estaban en las primarias?
cand_list<- data_set %>%
select(candidate) %>%
filter(trimws(candidate)!= "No Preference" , trimws(candidate) != "Uncommitted")%>%
group_by(candidate) %>%
summarise()
print(cand_list)
De la información mostrada anteriormente es claro que la cantidad de cantidatos en las primarias eran 14.
2. ¿Cuantos candidatos estaban en las primarias?
party_cand<-data_set %>%
select(candidate, party) %>%
filter(trimws(candidate)!= "No Preference" , trimws(candidate) != "Uncommitted" ,
party == "Republican") %>%
group_by(candidate) %>%
summarise()
party_cand
De la información anterior es claro que 11 cantidatos eran Republicanos.
3. ¿Que partido obtuvo la mayor cantidad de votos en Florida?
votes_florida<- data_set %>%
filter(trimws(candidate)!= "No Preference" , trimws(candidate)!= "Uncommitted")%>%
filter(state == "Florida") %>%
select(candidate, votes, party) %>%
group_by(party) %>%
summarise(Total=sum(votes))
votes_florida
Graficando tenemos:
votes_florida %>% ggplot(aes(x=party, y=Total))+
geom_bar(stat = "identity", fill=c("blue", "red"))

4. ¿Que condado de Florida es el que tiene la mayor cantidad de votantes?
total_florida<- data_set %>%
filter(trimws(candidate)!= "No Preference" , trimws(candidate)!= "Uncommitted")%>%
filter(state == "Florida") %>%
select(county, votes) %>%
group_by(county) %>%
summarise(Total=sum(votes)) %>%
mutate(index=c(1: nrow(total_florida)))
total_florida
florida_plot <- total_florida %>%
ggplot(aes(x=index, y=Total, fill=index)) +
geom_bar(stat = "identity", width = 1) + #GeometrÃÂa de la grafica
theme_minimal() + #Colores
scale_x_continuous(breaks=seq(1,nrow(total_florida),by=4))#Cambio de escala eje x
florida_plot

5. En el condado de florida, que tuvo la mayor cantidad de votantes, ¿Que candidato tuvo la mayor cantidad de votos y de que partido era?
florida_summary <- data_set %>%
filter(!(trimws(candidate)) %in% c( "No Preference", "Uncommitted")) %>%
filter(state == "Florida") %>%
select(candidate, votes) %>%
group_by(candidate) %>%
summarise(Total_Votes = sum(votes))
florida_summary
Graficando tenemos:
florida_summary_plot <- florida_summary %>%
ggplot(aes(x=candidate, y=Total_Votes)) +
geom_bar(stat = "identity",
fill=c("red", "blue", "green", "orange", "yellow", "brown"))
florida_summary_plot

6- ¿Cuantas personas Votaron por Hillary Clinton y cuantas por Donald Trump en estados unidos?
Clin_Trump<- data_set %>%
filter(!(trimws(candidate)) %in% c("No Preference", "Uncommitted"))%>%
filter(candidate == "Donald Trump" | candidate == "Hillary Clinton") %>%
select(candidate, votes) %>%
group_by(candidate) %>%
summarise(Votes=sum(votes))
Clin_Trump
7. ¿Cual es la probabilidad de que si alguien sea republicano en florida haya votado por Jeb Bush?
florida_republic <- data_set %>%
filter(!(trimws(candidate)) %in% c("No Preference", "Uncommitted"))%>%
filter(party == "Republican", state == "Florida") %>%
select(votes) %>%
summarise(Total=sum(votes))
florida_republic
La cardinalida del evento votante que voto por Jeb Bush, republicano y de florida es de 0
Por lo tanto la probabilidad sera de 0
8. Dado que una persona voto por Ted Cruz, ¿Cual es la probabilidad que sea de California?
Primero calcularemos la probabilidad de que un votante haya votado por Ted Cruz.
Votantes por Ted Cruz
ted_vots<- data_set %>%
filter(candidate == "Ted Cruz")%>%
select(votes) %>%
summarise(Total=sum(votes))
#ted_vots
Total de Votantes
total_vots <- data_set %>%
select(votes) %>%
summarise(Total=sum(votes))
#total_vots
Probabilidad de Voto por Ted Cruz
prob1<-ted_vots/total_vots
colnames(prob1)<-c("Probabilidad 1")
prob1
Ahora calcularemos la probabilidad de que un votante sea de California:
Votantes de California
vote_calif<-data_set %>%
filter(state == "California") %>%
select(votes) %>%
summarise(Total_California=sum(votes))
#vote_calif
Probabilidad de Voto en California:
prob2<-vote_calif/total_vots
colnames(prob2)<-c("Probabilidad 2")
prob2
Ahora calcularemos la probabilidad de la intersección ya que los dos eventos anteriores son independiente .
cruz_california <- data_set %>%
filter(state=="California", candidate=="Ted Cruz") %>%
select(votes) %>%
summarise(Cruz_Cal = sum(votes))
#Calculo de Probabilidad
prob3<- cruz_california/total_vots
colnames(prob3)<-c("Probabilidad 3")
prob3
Finalmente calcularemos la probabilidad de que un votante sea de California, dado que voto por Ted Cruz
prob4<-prob3/prob2
colnames(prob4)<-c("Probabilidad 4")
prob4
9. Dado que un persona es de Texas, ¿Cual es la probabilidad que vote por Donald Trump?
Calcularemos la probabilidad de que un votante sea de Texas
Votantes de Texas
texas_votes<-data_set %>%
filter(state == "Texas") %>%
select(votes) %>%
summarise(Texas_Votes=sum(votes))
#texas_votes
Probabilidad de Voto en Texas
prob5<- texas_votes/total_vots
colnames(prob5)<-c("Probabilidad 5")
prob5
Votantes por Donald Trump
trump_votes <- data_set %>%
filter(candidate == "Donald Trump") %>%
select(votes) %>%
summarise(Trump_Votes = sum(votes))
#trump_votes
Probabilidad de Voto por Trump
prob6<-trump_votes/total_vots
colnames(prob6)<-c("Probabilidad 5")
prob6
Ahora calcularemos la probabilidad de la intersección ya que los dos eventos anteriores son independiente .
trump_texas <- data_set %>%
filter(candidate=="Donald Trump", state=="Texas") %>%
select(votes) %>%
summarise(Total=sum(votes))
#Calculo de probabilidad
prob7<- trump_texas/total_vots
colnames(prob7)<-c("Probabilidad 7")
prob7
Finalmente calcularemos la probabilidad de que un votante vote por Dondal Trump, dado que es de Texas:
prob8<- prob7/prob5
colnames(prob8)<-c("Probabilidad 8")
prob8
10. ¿Que condado de los Estados Unidos es el que tuvo la mayor cantidad de votantes?
vote_condado<- data_set %>%
filter(!(trimws(candidate)) %in% c("No Preference", "Uncommitted"))%>%
select(county, votes)%>%
group_by(county) %>%
summarise(Votes = sum(votes))
vote_condado
max_votes<-which.max(vote_condado$Votes) #Obtenemos el Maximo.
condados<-vote_condado$county
(condados[max_votes][1])
[1] Los Angeles
2633 Levels: Abbeville Abbot Abington Acadia Accomack Acton Acushnet ... Ziebach
LS0tDQp0aXRsZTogIkVsZWNjaW9uZXMgVVNBIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZGF0YV9zZXQgPC0gcmVhZC5jc3YoJ3ByaW1hcnlfcmVzdWx0cy5jc3YnKQ0KI1ZpZXcoZGF0YV9zZXQpDQpgYGANCg0KDQojIyMgMS4gv0N1YW50b3MgY2FuZGlkYXRvcyBlc3RhYmFuIGVuIGxhcyBwcmltYXJpYXM/DQpgYGB7cn0NCmNhbmRfbGlzdDwtIGRhdGFfc2V0ICU+JQ0KICBzZWxlY3QoY2FuZGlkYXRlKSAlPiUNCiAgZmlsdGVyKHRyaW13cyhjYW5kaWRhdGUpIT0gIk5vIFByZWZlcmVuY2UiICwgdHJpbXdzKGNhbmRpZGF0ZSkgIT0gIlVuY29tbWl0dGVkIiklPiUNCiAgZ3JvdXBfYnkoY2FuZGlkYXRlKSAlPiUNCiAgc3VtbWFyaXNlKCkNCnByaW50KGNhbmRfbGlzdCkNCmBgYA0KDQojIyMjIERlIGxhIGluZm9ybWFjafNuIG1vc3RyYWRhIGFudGVyaW9ybWVudGUgZXMgY2xhcm8gcXVlIGxhIGNhbnRpZGFkIGRlIGNhbnRpZGF0b3MgZW4gbGFzIHByaW1hcmlhcyBlcmFuICoqYHIgbnJvdyhjYW5kX2xpc3QpYCoqLg0KDQojIyMgMi4gv0N1YW50b3MgY2FuZGlkYXRvcyBlc3RhYmFuIGVuIGxhcyBwcmltYXJpYXM/DQoNCmBgYHtyfQ0KcGFydHlfY2FuZDwtZGF0YV9zZXQgJT4lIA0KICBzZWxlY3QoY2FuZGlkYXRlLCBwYXJ0eSkgJT4lDQogIGZpbHRlcih0cmltd3MoY2FuZGlkYXRlKSE9ICJObyBQcmVmZXJlbmNlIiAsIHRyaW13cyhjYW5kaWRhdGUpICE9ICJVbmNvbW1pdHRlZCIgLCANCiAgICAgICAgIHBhcnR5ID09ICJSZXB1YmxpY2FuIikgJT4lDQogIGdyb3VwX2J5KGNhbmRpZGF0ZSkgJT4lDQogIHN1bW1hcmlzZSgpDQpwYXJ0eV9jYW5kDQpgYGANCiMjIyMgRGUgbGEgaW5mb3JtYWNp824gYW50ZXJpb3IgZXMgY2xhcm8gcXVlICoqYHIgbnJvdyhwYXJ0eV9jYW5kKWAqKiBjYW50aWRhdG9zIGVyYW4gUmVwdWJsaWNhbm9zLiANCg0KIyMjIDMuIL9RdWUgcGFydGlkbyBvYnR1dm8gbGEgbWF5b3IgY2FudGlkYWQgZGUgdm90b3MgZW4gRmxvcmlkYT8NCmBgYHtyfQ0Kdm90ZXNfZmxvcmlkYTwtIGRhdGFfc2V0ICU+JQ0KICBmaWx0ZXIodHJpbXdzKGNhbmRpZGF0ZSkhPSAiTm8gUHJlZmVyZW5jZSIgLCB0cmltd3MoY2FuZGlkYXRlKSE9ICJVbmNvbW1pdHRlZCIpJT4lDQogIGZpbHRlcihzdGF0ZSA9PSAiRmxvcmlkYSIpICU+JQ0KICBzZWxlY3QoY2FuZGlkYXRlLCB2b3RlcywgcGFydHkpICU+JQ0KICBncm91cF9ieShwYXJ0eSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbD1zdW0odm90ZXMpKQ0Kdm90ZXNfZmxvcmlkYQ0KYGBgDQojIyMjIEdyYWZpY2FuZG8gdGVuZW1vczoNCmBgYHtyfQ0Kdm90ZXNfZmxvcmlkYSAlPiUgZ2dwbG90KGFlcyh4PXBhcnR5LCB5PVRvdGFsKSkrDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsPWMoImJsdWUiLCAicmVkIikpDQpgYGANCiMjIyA0LiC/UXVlIGNvbmRhZG8gZGUgRmxvcmlkYSBlcyBlbCBxdWUgdGllbmUgbGEgbWF5b3IgY2FudGlkYWQgZGUgdm90YW50ZXM/DQpgYGB7cn0NCnRvdGFsX2Zsb3JpZGE8LSBkYXRhX3NldCAlPiUNCiAgZmlsdGVyKHRyaW13cyhjYW5kaWRhdGUpIT0gIk5vIFByZWZlcmVuY2UiICwgdHJpbXdzKGNhbmRpZGF0ZSkhPSAiVW5jb21taXR0ZWQiKSU+JQ0KICBmaWx0ZXIoc3RhdGUgPT0gIkZsb3JpZGEiKSAlPiUNCiAgc2VsZWN0KGNvdW50eSwgdm90ZXMpICU+JQ0KICBncm91cF9ieShjb3VudHkpICAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsPXN1bSh2b3RlcykpICU+JQ0KICBtdXRhdGUoaW5kZXg9YygxOiBucm93KHRvdGFsX2Zsb3JpZGEpKSkNCnRvdGFsX2Zsb3JpZGENCmBgYA0KDQpgYGB7cn0NCmZsb3JpZGFfcGxvdCA8LSB0b3RhbF9mbG9yaWRhICU+JSANCiAgZ2dwbG90KGFlcyh4PWluZGV4LCB5PVRvdGFsLCBmaWxsPWluZGV4KSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSkgKyAjR2VvbWV0cu1hIGRlIGxhIGdyYWZpY2ENCiAgdGhlbWVfbWluaW1hbCgpICsgI0NvbG9yZXMNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMSxucm93KHRvdGFsX2Zsb3JpZGEpLGJ5PTQpKSNDYW1iaW8gZGUgZXNjYWxhIGVqZSB4DQpmbG9yaWRhX3Bsb3QNCmBgYA0KDQojIyMgNS4gRW4gZWwgY29uZGFkbyBkZSBmbG9yaWRhLCBxdWUgdHV2byBsYSBtYXlvciBjYW50aWRhZCBkZSB2b3RhbnRlcywgv1F1ZSBjYW5kaWRhdG8gdHV2byBsYSBtYXlvciBjYW50aWRhZCBkZSB2b3RvcyB5IGRlIHF1ZSBwYXJ0aWRvIGVyYT8NCmBgYHtyfQ0KZmxvcmlkYV9zdW1tYXJ5IDwtIGRhdGFfc2V0ICU+JQ0KICBmaWx0ZXIoISh0cmltd3MoY2FuZGlkYXRlKSkgJWluJSBjKCAiTm8gUHJlZmVyZW5jZSIsICJVbmNvbW1pdHRlZCIpKSAlPiUNCiAgZmlsdGVyKHN0YXRlID09ICJGbG9yaWRhIikgJT4lDQogIHNlbGVjdChjYW5kaWRhdGUsIHZvdGVzKSAlPiUNCiAgZ3JvdXBfYnkoY2FuZGlkYXRlKSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsX1ZvdGVzID0gc3VtKHZvdGVzKSkNCmZsb3JpZGFfc3VtbWFyeQ0KYGBgDQojIyMjIEdyYWZpY2FuZG8gdGVuZW1vczoNCmBgYHtyfQ0KZmxvcmlkYV9zdW1tYXJ5X3Bsb3QgPC0gZmxvcmlkYV9zdW1tYXJ5ICU+JQ0KICBnZ3Bsb3QoYWVzKHg9Y2FuZGlkYXRlLCB5PVRvdGFsX1ZvdGVzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgDQogICAgICAgICAgICBmaWxsPWMoInJlZCIsICJibHVlIiwgImdyZWVuIiwgIm9yYW5nZSIsICJ5ZWxsb3ciLCAiYnJvd24iKSkNCmZsb3JpZGFfc3VtbWFyeV9wbG90DQpgYGANCiMjIyA2LSC/Q3VhbnRhcyBwZXJzb25hcyBWb3Rhcm9uIHBvciBIaWxsYXJ5IENsaW50b24geSBjdWFudGFzIHBvciBEb25hbGQgVHJ1bXAgZW4gZXN0YWRvcyB1bmlkb3M/DQpgYGB7cn0NCkNsaW5fVHJ1bXA8LSBkYXRhX3NldCAlPiUNCiAgZmlsdGVyKCEodHJpbXdzKGNhbmRpZGF0ZSkpICVpbiUgYygiTm8gUHJlZmVyZW5jZSIsICJVbmNvbW1pdHRlZCIpKSU+JQ0KICBmaWx0ZXIoY2FuZGlkYXRlID09ICJEb25hbGQgVHJ1bXAiIHwgY2FuZGlkYXRlID09ICJIaWxsYXJ5IENsaW50b24iKSAlPiUNCiAgc2VsZWN0KGNhbmRpZGF0ZSwgdm90ZXMpICU+JQ0KICBncm91cF9ieShjYW5kaWRhdGUpICU+JQ0KICBzdW1tYXJpc2UoVm90ZXM9c3VtKHZvdGVzKSkNCkNsaW5fVHJ1bXANCmBgYA0KDQojIyMgNy4gv0N1YWwgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBzaSBhbGd1aWVuIHNlYSByZXB1YmxpY2FubyBlbiBmbG9yaWRhIGhheWEgdm90YWRvIHBvciBKZWIgQnVzaD8NCmBgYHtyfQ0KZmxvcmlkYV9yZXB1YmxpYyA8LSBkYXRhX3NldCAlPiUNCiAgZmlsdGVyKCEodHJpbXdzKGNhbmRpZGF0ZSkpICVpbiUgYygiTm8gUHJlZmVyZW5jZSIsICJVbmNvbW1pdHRlZCIpKSU+JQ0KICBmaWx0ZXIocGFydHkgPT0gIlJlcHVibGljYW4iLCBzdGF0ZSA9PSAiRmxvcmlkYSIpICU+JQ0KICBzZWxlY3Qodm90ZXMpICU+JQ0KICBzdW1tYXJpc2UoVG90YWw9c3VtKHZvdGVzKSkNCmZsb3JpZGFfcmVwdWJsaWMNCmBgYA0KIyMjIyBMYSBjYXJkaW5hbGlkYWQgZGVsIGVzcGFjaW9uIG11ZXN0cmFsIGVzdGEgZm9ybWFkYSBwb3IgKipgciBmbG9yaWRhX3JlcHVibGljW1sxXV1gKiogdm90YW50ZXMsIGVzIGRlY2lyIHZvdGFudGVzIHF1ZSBzb24gcmVwdWJsaWNhbm9zIGRlIGZsb3JpZGEuDQoNCmBgYHtyfQ0KZmxvcmlkYV9yZXB1YmxpY19idXNoIDwtIGRhdGFfc2V0ICU+JQ0KICBmaWx0ZXIoISh0cmltd3MoY2FuZGlkYXRlKSkgJWluJSBjKCJObyBQcmVmZXJlbmNlIiwgIlVuY29tbWl0dGVkIikpJT4lDQogIGZpbHRlcihwYXJ0eSA9PSAiUmVwdWJsaWNhbiIsIHN0YXRlID09ICJGbG9yaWRhIiwgY2FuZGlkYXRlID09ICJKZWIgQnVzaCIpICU+JQ0KICBzZWxlY3Qodm90ZXMpICU+JQ0KICBzdW1tYXJpc2UoVG90YWw9c3VtKHZvdGVzKSkNCmZsb3JpZGFfcmVwdWJsaWNfYnVzaA0KYGBgDQojIyMjIExhIGNhcmRpbmFsaWRhIGRlbCBldmVudG8gdm90YW50ZSBxdWUgdm90byBwb3IgSmViIEJ1c2gsIHJlcHVibGljYW5vIHkgZGUgZmxvcmlkYSBlcyBkZSAqKmByIGZsb3JpZGFfcmVwdWJsaWNfYnVzaFtbMV1dYCoqDQoNCiMjIyMgUG9yIGxvIHRhbnRvIGxhIHByb2JhYmlsaWRhZCBzZXJhIGRlICoqMCoqDQoNCiMjIyA4LiBEYWRvIHF1ZSB1bmEgcGVyc29uYSB2b3RvIHBvciBUZWQgQ3J1eiwgv0N1YWwgZXMgbGEgcHJvYmFiaWxpZGFkIHF1ZSBzZWEgZGUgQ2FsaWZvcm5pYT8NCg0KIyMjIyBQcmltZXJvIGNhbGN1bGFyZW1vcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIHZvdGFudGUgaGF5YSB2b3RhZG8gcG9yIFRlZCBDcnV6Lg0KDQojIyMjIyBWb3RhbnRlcyBwb3IgVGVkIENydXoNCmBgYHtyfQ0KdGVkX3ZvdHM8LSBkYXRhX3NldCAlPiUNCiAgZmlsdGVyKGNhbmRpZGF0ZSA9PSAiVGVkIENydXoiKSU+JQ0KICBzZWxlY3Qodm90ZXMpICU+JQ0KICBzdW1tYXJpc2UoVG90YWw9c3VtKHZvdGVzKSkNCiN0ZWRfdm90cw0KYGBgDQojIyMjIyBUb3RhbCBkZSBWb3RhbnRlcw0KYGBge3J9DQp0b3RhbF92b3RzIDwtIGRhdGFfc2V0ICU+JQ0KICBzZWxlY3Qodm90ZXMpICU+JQ0KICBzdW1tYXJpc2UoVG90YWw9c3VtKHZvdGVzKSkgDQojdG90YWxfdm90cw0KYGBgDQojIyMjIyBQcm9iYWJpbGlkYWQgZGUgVm90byBwb3IgVGVkIENydXoNCmBgYHtyfQ0KcHJvYjE8LXRlZF92b3RzL3RvdGFsX3ZvdHMNCmNvbG5hbWVzKHByb2IxKTwtYygiUHJvYmFiaWxpZGFkIDEiKQ0KcHJvYjENCmBgYA0KIyMjIyBBaG9yYSBjYWxjdWxhcmVtb3MgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biB2b3RhbnRlIHNlYSBkZSBDYWxpZm9ybmlhOg0KDQojIyMjIyBWb3RhbnRlcyBkZSBDYWxpZm9ybmlhDQpgYGB7cn0NCnZvdGVfY2FsaWY8LWRhdGFfc2V0ICU+JQ0KICBmaWx0ZXIoc3RhdGUgPT0gIkNhbGlmb3JuaWEiKSAlPiUNCiAgc2VsZWN0KHZvdGVzKSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsX0NhbGlmb3JuaWE9c3VtKHZvdGVzKSkNCiN2b3RlX2NhbGlmDQpgYGANCiMjIyMgUHJvYmFiaWxpZGFkIGRlIFZvdG8gZW4gQ2FsaWZvcm5pYToNCmBgYHtyfQ0KcHJvYjI8LXZvdGVfY2FsaWYvdG90YWxfdm90cw0KY29sbmFtZXMocHJvYjIpPC1jKCJQcm9iYWJpbGlkYWQgMiIpDQpwcm9iMg0KYGBgDQojIyMjIEFob3JhIGNhbGN1bGFyZW1vcyBsYSBwcm9iYWJpbGlkYWQgZGUgbGEgaW50ZXJzZWNjafNuIHlhIHF1ZSBsb3MgZG9zIGV2ZW50b3MgYW50ZXJpb3JlcyBzb24gaW5kZXBlbmRpZW50ZSAuDQpgYGB7cn0NCmNydXpfY2FsaWZvcm5pYSA8LSBkYXRhX3NldCAlPiUNCiAgZmlsdGVyKHN0YXRlPT0iQ2FsaWZvcm5pYSIsIGNhbmRpZGF0ZT09IlRlZCBDcnV6IikgJT4lDQogIHNlbGVjdCh2b3RlcykgJT4lDQogIHN1bW1hcmlzZShDcnV6X0NhbCA9IHN1bSh2b3RlcykpDQoNCiNDYWxjdWxvIGRlIFByb2JhYmlsaWRhZA0KcHJvYjM8LSBjcnV6X2NhbGlmb3JuaWEvdG90YWxfdm90cw0KY29sbmFtZXMocHJvYjMpPC1jKCJQcm9iYWJpbGlkYWQgMyIpDQpwcm9iMw0KYGBgDQoNCiMjIyMgRmluYWxtZW50ZSBjYWxjdWxhcmVtb3MgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biB2b3RhbnRlIHNlYSBkZSBDYWxpZm9ybmlhLCBkYWRvIHF1ZSB2b3RvIHBvciBUZWQgQ3J1eg0KYGBge3J9DQpwcm9iNDwtcHJvYjMvcHJvYjINCmNvbG5hbWVzKHByb2I0KTwtYygiUHJvYmFiaWxpZGFkIDQiKQ0KcHJvYjQNCmBgYA0KDQojIyMgOS4gRGFkbyBxdWUgdW4gcGVyc29uYSBlcyBkZSBUZXhhcywgv0N1YWwgZXMgbGEgcHJvYmFiaWxpZGFkIHF1ZSB2b3RlIHBvciBEb25hbGQgVHJ1bXA/IA0KDQojIyMjIENhbGN1bGFyZW1vcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIHZvdGFudGUgc2VhIGRlIFRleGFzDQoNCiMjIyMjIFZvdGFudGVzIGRlIFRleGFzDQpgYGB7cn0NCnRleGFzX3ZvdGVzPC1kYXRhX3NldCAlPiUNCiAgZmlsdGVyKHN0YXRlID09ICJUZXhhcyIpICU+JQ0KICBzZWxlY3Qodm90ZXMpICU+JQ0KICBzdW1tYXJpc2UoVGV4YXNfVm90ZXM9c3VtKHZvdGVzKSkNCiN0ZXhhc192b3Rlcw0KYGBgDQoNCiMjIyMjIFByb2JhYmlsaWRhZCBkZSBWb3RvIGVuIFRleGFzDQpgYGB7cn0NCnByb2I1PC0gdGV4YXNfdm90ZXMvdG90YWxfdm90cw0KY29sbmFtZXMocHJvYjUpPC1jKCJQcm9iYWJpbGlkYWQgNSIpDQpwcm9iNQ0KYGBgDQoNCiMjIyMjIFZvdGFudGVzIHBvciBEb25hbGQgVHJ1bXANCmBgYHtyfQ0KdHJ1bXBfdm90ZXMgPC0gZGF0YV9zZXQgJT4lDQogIGZpbHRlcihjYW5kaWRhdGUgPT0gIkRvbmFsZCBUcnVtcCIpICU+JQ0KICBzZWxlY3Qodm90ZXMpICU+JQ0KICBzdW1tYXJpc2UoVHJ1bXBfVm90ZXMgPSBzdW0odm90ZXMpKQ0KI3RydW1wX3ZvdGVzDQpgYGANCg0KIyMjIyMgUHJvYmFiaWxpZGFkIGRlIFZvdG8gcG9yIFRydW1wDQpgYGB7cn0NCnByb2I2PC10cnVtcF92b3Rlcy90b3RhbF92b3RzDQpjb2xuYW1lcyhwcm9iNik8LWMoIlByb2JhYmlsaWRhZCA2IikNCnByb2I2DQpgYGANCiMjIyMjIEFob3JhIGNhbGN1bGFyZW1vcyBsYSBwcm9iYWJpbGlkYWQgZGUgbGEgaW50ZXJzZWNjafNuIHlhIHF1ZSBsb3MgZG9zIGV2ZW50b3MgYW50ZXJpb3JlcyBzb24gaW5kZXBlbmRpZW50ZSAuDQpgYGB7cn0NCnRydW1wX3RleGFzIDwtIGRhdGFfc2V0ICU+JSANCiAgZmlsdGVyKGNhbmRpZGF0ZT09IkRvbmFsZCBUcnVtcCIsIHN0YXRlPT0iVGV4YXMiKSAlPiUNCiAgc2VsZWN0KHZvdGVzKSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsPXN1bSh2b3RlcykpDQojQ2FsY3VsbyBkZSBwcm9iYWJpbGlkYWQNCnByb2I3PC0gdHJ1bXBfdGV4YXMvdG90YWxfdm90cw0KY29sbmFtZXMocHJvYjcpPC1jKCJQcm9iYWJpbGlkYWQgNyIpDQpwcm9iNw0KYGBgDQojIyMjIyBGaW5hbG1lbnRlIGNhbGN1bGFyZW1vcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIHZvdGFudGUgdm90ZSBwb3IgRG9uZGFsIFRydW1wLCBkYWRvIHF1ZSBlcyBkZSBUZXhhczoNCmBgYHtyfQ0KcHJvYjg8LSBwcm9iNy9wcm9iNQ0KY29sbmFtZXMocHJvYjgpPC1jKCJQcm9iYWJpbGlkYWQgOCIpDQpwcm9iOA0KYGBgDQojIyMxMC4gv1F1ZSBjb25kYWRvIGRlIGxvcyBFc3RhZG9zIFVuaWRvcyBlcyBlbCBxdWUgdHV2byBsYSBtYXlvciBjYW50aWRhZCBkZSB2b3RhbnRlcz8NCmBgYHtyfQ0Kdm90ZV9jb25kYWRvPC0gZGF0YV9zZXQgJT4lDQogIGZpbHRlcighKHRyaW13cyhjYW5kaWRhdGUpKSAlaW4lIGMoIk5vIFByZWZlcmVuY2UiLCAiVW5jb21taXR0ZWQiKSklPiUNCiAgc2VsZWN0KGNvdW50eSwgdm90ZXMpJT4lDQogIGdyb3VwX2J5KGNvdW50eSkgJT4lDQogIHN1bW1hcmlzZShWb3RlcyA9IHN1bSh2b3RlcykpDQp2b3RlX2NvbmRhZG8NCmBgYA0KYGBge3J9DQptYXhfdm90ZXM8LXdoaWNoLm1heCh2b3RlX2NvbmRhZG8kVm90ZXMpICNPYnRlbmVtb3MgZWwgTWF4aW1vLg0KY29uZGFkb3M8LXZvdGVfY29uZGFkbyRjb3VudHkNCihjb25kYWRvc1ttYXhfdm90ZXNdWzFdKQ0KYGBgDQoNCg0KDQo=