Code

expe <- read_excel("DATA - 10683_2007_9171_MOESM2_ESM.xls")
colnames(expe) <- expe[4,]
expe <- as.data.frame(expe[-c(1:4),])
expe[is.na(expe)==FALSE] <- as.numeric(expe[is.na(expe)==FALSE])
#Original graph
#G1
forgr1.df <- select(expe, Period, Group, Treatment, mycont)
forgr1.df$Period <- as.double(forgr1.df$Period)
forgr1.df$mycont <- as.double(forgr1.df$mycont)
forgr1.df <- filter(forgr1.df, Period>5)
forgr1.df$Group <- as.character(forgr1.df$Group)
forgr1_res.df <- as.data.frame(aggregate(forgr1.df[,4], list(forgr1.df$Treatment), mean))
forgr1_res.df$x <- round(forgr1_res.df$x,digits = 2)
forgr1_res.df$Group.1 <- as.character(forgr1_res.df$Group.1)
EEDAFigure1 <- ggplot(forgr1_res.df, aes(x=Group.1,y=x,fill=Group.1),color="black")+
  geom_bar(stat="identity")+
  scale_fill_brewer(palette="Set2")+
  geom_text(label=forgr1_res.df$x,vjust=-.25)+
  labs(title = "Average contribution by treatment (data from periods 6–10)",
       x="Treatment",
       y="Average contribution",
       fill=NULL)+
  theme_light()+
  theme(legend.background = element_rect(linetype="solid",color="Black"))
#ggsave("EEDA-Figure1.png",EEDAFigure1)
#G2
forgr2.df <- select(expe, Period, Group, Treatment, mycont)
forgr2.df$Period <- as.double(forgr2.df$Period)
forgr2.df$mycont <- as.double(forgr2.df$mycont)
forgr2.df$Group <- as.character(forgr2.df$Group)
forgr2_res.df <- data.frame(aggregate(x=forgr2.df$mycont,
                                      by=list(forgr2.df$Period,forgr2.df$Treatment),
                                      FUN=mean))
forgr2_res.df$x <- round(forgr2_res.df$x,digits = 2)
forgr2_res.df$Group.1 <- as.integer(forgr2_res.df$Group.1)
forgr2_res.df$Group.2 <- as.character(forgr2_res.df$Group.2)
EEDAFigure2 <- ggplot(forgr2_res.df,aes(x=Group.1,y=x))+
  scale_x_continuous(breaks=c(1:10))+
  scale_y_continuous(breaks=seq(0,20,2))+
  geom_point(aes(shape=Group.2))+
  geom_line(aes(group =Group.2))+
  scale_shape_manual(values=c(1,0,15,5,8))+
  labs(title = "Average contribution over time across treatments",
       x="Period",
       y="Average contribution",
       shape=NULL)+
  theme_light()+
  theme(legend.position = c(0.07, 0.22),
        legend.background = element_rect(linetype="solid",color="Black"),
        plot.title = element_text(hjust = 0.5))
#ggsave("EEDA-Figure2.png",EEDAFigure2)
#G3
forgr3.df <- select(expe, Period, Group, Treatment, TotalProfit)
forgr3.df$Period <- as.double(forgr3.df$Period)
forgr3.df$TotalProfit <- as.double(forgr3.df$TotalProfit)
forgr3.df$Group <- as.character(forgr3.df$Group)
forgr3_res.df <- data.frame(aggregate(x=forgr3.df$TotalProfit,
                                      by=list(forgr3.df$Period,forgr3.df$Treatment),
                                      FUN=mean))
forgr3_res.df$x <- round(forgr3_res.df$x,digits = 2)
forgr3_res.df$Group.1 <- as.integer(forgr3_res.df$Group.1)
forgr3_res.df$Group.2 <- as.character(forgr3_res.df$Group.2)
Base <- forgr3_res.df$x[forgr3_res.df$Group.2==0]
Base <- c(rep(Base,4))
forgr3_res.df <- forgr3_res.df[-c(1:10),]
forgr3_res.df$rce <- (forgr3_res.df$x-Base-25)/Base
EEDAFigure3 <- ggplot(forgr3_res.df,aes(x=Group.1,y=rce))+
  geom_hline(aes(yintercept = 0),colour="gray28")+
  scale_x_continuous(breaks=c(1:10))+
  geom_point(aes(shape=Group.2))+
  geom_line(aes(group =Group.2))+
  scale_shape_manual(values=c(0,15,5,8))+
  labs(title = "CRE over time across treatments",
       x="Period",
       y="CRE",
       shape=NULL)+
  theme_bw()+
  theme(legend.position = c(0.9, 0.22),
        legend.background = element_rect(linetype="solid",color="Black"),
        plot.title = element_text(hjust = 0.5))
#ggsave("EEDA-Figure3.png",EEDAFigure3)
expe <- read_excel("DATA - 10683_2007_9171_MOESM2_ESM.xls")
colnames(expe) <- expe[4,]
expe <- as.data.frame(expe[-c(1:4),])
expe[is.na(expe)==FALSE] <- as.numeric(expe[is.na(expe)==FALSE])
#New
#Graph
#H1
#Y=delta Contribution (C t - C t-1)
#X=R.Punishment t-1
h1.df <- select(expe, Period, Group, Treatment, Subject, mycont, tot_red)
h1.df$Treatment <- as.integer(h1.df$Treatment)
h1.df <- filter(h1.df,Treatment>0)
h1.df$Period <- as.double(h1.df$Period)
h1.df$mycont <- as.double(h1.df$mycont)
h1.df$tot_red <- as.double(h1.df$tot_red)
h1.df$Group <- as.character(h1.df$Group)
h1.df$Subject <- as.character(h1.df$Subject)
allpopu1 <- unique(h1.df$Subject)
h1.df$delta <- NA
for(i in 1:length(allpopu1)){
  for(j in 2:10){
    this <- h1.df[(h1.df$Period==j & h1.df$Subject==allpopu1[i]),]$mycont
    last <- h1.df[(h1.df$Period==(j-1) & h1.df$Subject==allpopu1[i]),]$mycont
    h1.df[(h1.df$Period==j & h1.df$Subject==allpopu1[i]),]$delta <- (this - last)
  }
}
h1_res.df <- data.frame(lastpunish=h1.df[(h1.df$Period<10),]$tot_red,
                        delta=h1.df[(h1.df$Period>1),]$delta)
h1_res.df$count <- 1
h1_res2.df <- aggregate(count~lastpunish+delta,
                        data=h1_res.df,
                        sum)
EEDANewH1 <-  ggplot(h1_res2.df,aes(x=lastpunish,y=delta))+
  geom_point(aes(size=log(count),color=log(count)))+
  scale_color_viridis_c()+
  labs(title = "Last Punishment v.s. ΔCont",
       x="Last Punishment",
       y="ΔCont",
       size="ln(Count)",
       color="ln(Count)")+
  theme_bw()+
  theme(legend.background = element_rect(linetype="solid",color="Black"),
        plot.title = element_text(hjust = 0.5))
#ggsave("EEDA-NewH1.png",EEDANewH1)
#H2
#Y=Punishment t
#X=Ci-Cj(j!=i) t
#Xc=Pool t
h2.df <- select(expe,Group,Subject,Period,Treatment,mycont,totcont,`p[1]`,`p[2]`,`p[3]`,`p[4]`)
h2.df$Treatment <- as.integer(h2.df$Treatment)
h2.df <- filter(h2.df,Treatment>0)
h2.df$Group <- as.character(h2.df$Group)
h2.df$Subject <- as.integer(h2.df$Subject)
h2.df$Period <- as.double(h2.df$Period)
h2.df$mycont <- as.double(h2.df$mycont)
h2.df$totcont <- as.double(h2.df$totcont)
h2.df$`p[1]` <- as.double(h2.df$`p[1]`)
h2.df$`p[2]` <- as.double(h2.df$`p[2]`)
h2.df$`p[3]` <- as.double(h2.df$`p[3]`)
h2.df$`p[4]` <- as.double(h2.df$`p[4]`)
h2.df$d1 <- 0
h2.df$d2 <- 0
h2.df$d3 <- 0
h2.df$d4 <- 0
diffmat = function(x){
  D = matrix(as.numeric(NA), NROW(x), NROW(x))
  for (i in 1:NROW(x)){
    d = x[[i]] - x[-i]
    D[i,-i] = d
  }
  if (!all(is.na(diag(D)))){
    stop("Not all diagonal elements zero")
  }
  diag(D) = 0
  if (!is.null(names(x))) colnames(D) = rownames(D) = names(x)
  return(D)
}
k <- nrow(h2.df)/4
for( w in 1:k){
  j <- w*4
  h2.df[(j-3):j,(11:14)] <- diffmat(h2.df[(j-3):j,5])
}
h2.df$tp1 <- h2.df$Treatment*h2.df$`p[1]`
h2.df$tp2 <- h2.df$Treatment*h2.df$`p[2]`
h2.df$tp3 <- h2.df$Treatment*h2.df$`p[3]`
h2.df$tp4 <- h2.df$Treatment*h2.df$`p[4]`
h2_res.df <- c(NA,NA,NA,NA)
for(i in 1:nrow(h2.df)){
  place <- h2.df$Subject[i] %% 10
  for(j in 1:4){
    if(j!=place){
      p <- h2.df[i,(j+6)]
      tp <- h2.df[i,(j+14)]
      d <- h2.df[i,(j+10)]
      pool <- h2.df$totcont[i]
      h2_res.df <- rbind(h2_res.df, c(p,tp,d,pool))
    }
  }
}
h2_res.df <- as.data.frame(h2_res.df[-1,])
colnames(h2_res.df) <- c("punish","rpunish","delta","pool")
h2_res.df$count <- 1
h2_res2.df <- aggregate(count ~ punish + delta,
                        data=h2_res.df,
                        sum)
h2_res3.df <- filter(h2_res2.df,delta>=0)
EEDANewH2 <- ggplot(h2_res3.df,aes(x=delta,y=punish))+
  geom_point(aes(size=log(count),color=log(count)))+
  scale_color_viridis_c()+
  labs(title = "MORE Cont v.s. Punish",
       x="More Contribution",
       y="Punish",
       size="ln(Count)",
       color="ln(Count)",
       caption = "(Only when dif(mycont) is non-negative)")+
  theme_bw()+
  theme(legend.background = element_rect(linetype="solid",color="Black"),
        plot.title = element_text(hjust = 0.5))
#ggsave("EEDA-NewH2.png",EEDANewH2)
EEDANewH2.1 <- ggplot(h2_res2.df,aes(x=delta,y=punish))+
  geom_point(aes(size=log(count),color=log(count)))+
  scale_color_viridis_c()+
  labs(title = "Dif Cont v.s. Punish",
       x="DIfference in Contribution",
       y="Punish",
       size="ln(Count)",
       color="ln(Count)")+
  theme_bw()+
  theme(legend.background = element_rect(linetype="solid",color="Black"),
        plot.title = element_text(hjust = 0.5))
#ggsave("EEDA-NewH2.1.png",EEDANewH2.1)
#Regression
#H1
#Y=delta Contribution (C t - C t-1)
#X=R.Punishment t-1
resh1 <- lm(delta~lastpunish,h1_res.df)
resh1m1 <- data.frame(lastpunish=h1.df[(h1.df$Period<10 & h1.df$Treatment==1),]$tot_red,
                      delta=h1.df[(h1.df$Period>1 & h1.df$Treatment==1),]$delta)
resh1m2 <- data.frame(lastpunish=h1.df[(h1.df$Period<10 & h1.df$Treatment==2),]$tot_red,
                      delta=h1.df[(h1.df$Period>1 & h1.df$Treatment==2),]$delta)
resh1m3 <- data.frame(lastpunish=h1.df[(h1.df$Period<10 & h1.df$Treatment==3),]$tot_red,
                      delta=h1.df[(h1.df$Period>1 & h1.df$Treatment==3),]$delta)
resh1m4 <- data.frame(lastpunish=h1.df[(h1.df$Period<10 & h1.df$Treatment==4),]$tot_red,
                      delta=h1.df[(h1.df$Period>1 & h1.df$Treatment==4),]$delta)
resh11 <- lm(delta~lastpunish,resh1m1)
resh12 <- lm(delta~lastpunish,resh1m2)
resh13 <- lm(delta~lastpunish,resh1m3)
resh14 <- lm(delta~lastpunish,resh1m4)
tl <- c("All","'1'","'2'","'3'","'4'")
#stargazer(resh1,resh11,resh12,resh13,resh14, title="Hypothesis 1",column.labels=tl, align=TRUE, digits=2, out="EET1.htm")
#H2
#Y=Punishment t
#X=Ci-Cj(j!=i) t
#Xc=Pool t
h2_ols.df <- c(NA,NA,NA,NA,NA)
for(i in 1:nrow(h2.df)){
  place <- h2.df$Subject[i] %% 10
  for(j in 1:4){
    if(j!=place){
      tr <- h2.df$Treatment[i]
      p <- h2.df[i,(j+6)]
      tp <- h2.df[i,(j+14)]
      d <- h2.df[i,(j+10)]
      pool <- h2.df$totcont[i]
      h2_ols.df <- rbind(h2_ols.df, c(tr,p,tp,d,pool))
    }
  }
}
h2_ols.df <- as.data.frame(h2_ols.df)
h2_ols.df <- h2_ols.df[-1,]
h2_ols.df$Negative <- 0
colnames(h2_ols.df) <- c("Treatment","Punish","Rpunish","Delta","Pool","Negative")
h2_ols.df$Negative[h2_ols.df$Delta<0] <- 1
h2_ols.df1 <- filter(h2_ols.df,Treatment==1)
h2_ols.df2 <- filter(h2_ols.df,Treatment==2)
h2_ols.df3 <- filter(h2_ols.df,Treatment==3)
h2_ols.df4 <- filter(h2_ols.df,Treatment==4)
resh2 <- lm(Punish ~ Delta + Negative + Negative*Delta + Pool, h2_ols.df)
resh21<- lm(Punish ~ Delta + Negative + Negative*Delta + Pool, h2_ols.df1)
resh22<- lm(Punish ~ Delta + Negative + Negative*Delta + Pool, h2_ols.df2)
resh23<- lm(Punish ~ Delta + Negative + Negative*Delta + Pool, h2_ols.df3)
resh24<- lm(Punish ~ Delta + Negative + Negative*Delta + Pool, h2_ols.df4)
#stargazer(resh2,resh21,resh22,resh23,resh24, title="Hypothesis 2",column.labels=tl, align=TRUE, digits=2, out="EET2.htm")

Result

EEDAFigure1

EEDAFigure2

EEDAFigure3

Hypothesis 1 - Contribute more after more punishment

EEDANewH1

stargazer(resh1,resh11,resh12,resh13,resh14, title="Hypothesis 1",column.labels=tl, align=TRUE, digits=2,type = 'html',style = "qje",df = FALSE)
Hypothesis 1
delta
All ‘1’ ‘2’ ‘3’ ‘4’
(1) (2) (3) (4) (5)
lastpunish 0.44*** 0.80*** 0.36*** 0.38*** 0.39***
(0.03) (0.13) (0.07) (0.04) (0.05)
Constant -0.80*** -1.69*** -1.03*** -0.45** -0.15
(0.17) (0.45) (0.35) (0.22) (0.23)
N 864 216 216 216 216
R2 0.16 0.16 0.10 0.32 0.22
Adjusted R2 0.15 0.15 0.09 0.32 0.21
Residual Std. Error 4.44 6.12 4.56 2.94 3.18
F Statistic 158.18*** 39.54*** 23.16*** 103.00*** 58.89***
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.

Hypothesis 2 - Punish the free riders

EEDANewH2

EEDANewH2.1

stargazer(resh2,resh21,resh22,resh23,resh24, title="Hypothesis 2",column.labels=tl, align=TRUE, digits=2,type = 'html',style = "qje",df = FALSE)
Hypothesis 2
Punish
All ‘1’ ‘2’ ‘3’ ‘4’
(1) (2) (3) (4) (5)
Delta 0.14*** 0.15*** 0.10*** 0.17*** 0.12***
(0.005) (0.01) (0.01) (0.01) (0.004)
Negative 0.10* 0.13 0.21* -0.004 0.06
(0.05) (0.14) (0.12) (0.08) (0.05)
Pool 0.003*** 0.01*** 0.004** -0.003 0.003***
(0.001) (0.002) (0.002) (0.002) (0.001)
Delta:Negative -0.14*** -0.15*** -0.11*** -0.16*** -0.12***
(0.01) (0.02) (0.01) (0.02) (0.01)
Constant -0.15*** -0.25*** -0.16 0.24* -0.19***
(0.05) (0.09) (0.12) (0.14) (0.07)
N 2,880 720 720 720 720
R2 0.25 0.25 0.15 0.34 0.61
Adjusted R2 0.25 0.25 0.15 0.34 0.61
Residual Std. Error 0.89 1.24 0.97 0.72 0.32
F Statistic 237.74*** 59.56*** 31.64*** 92.68*** 284.74***
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.

LS0tCnRpdGxlOiAiRGF0YSBhbmFseXNpcyBDb2RlIgphdXRob3I6ICJDaGVhdGluZyBhbmQgTHlpbmcgZ3JvdXAgMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoqKioKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNldHdkKCJ+L0Rlc2t0b3AvUiIpCnJtKGxpc3Q9bHMoYWxsPVRSVUUpKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGhhdmVuKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHN0YXJnYXplcikKYGBgCgo+IENvZGUKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBlIDwtIHJlYWRfZXhjZWwoIkRBVEEgLSAxMDY4M18yMDA3XzkxNzFfTU9FU00yX0VTTS54bHMiKQpjb2xuYW1lcyhleHBlKSA8LSBleHBlWzQsXQpleHBlIDwtIGFzLmRhdGEuZnJhbWUoZXhwZVstYygxOjQpLF0pCmV4cGVbaXMubmEoZXhwZSk9PUZBTFNFXSA8LSBhcy5udW1lcmljKGV4cGVbaXMubmEoZXhwZSk9PUZBTFNFXSkKCgojT3JpZ2luYWwgZ3JhcGgKCiNHMQpmb3JncjEuZGYgPC0gc2VsZWN0KGV4cGUsIFBlcmlvZCwgR3JvdXAsIFRyZWF0bWVudCwgbXljb250KQpmb3JncjEuZGYkUGVyaW9kIDwtIGFzLmRvdWJsZShmb3JncjEuZGYkUGVyaW9kKQpmb3JncjEuZGYkbXljb250IDwtIGFzLmRvdWJsZShmb3JncjEuZGYkbXljb250KQoKZm9yZ3IxLmRmIDwtIGZpbHRlcihmb3JncjEuZGYsIFBlcmlvZD41KQoKZm9yZ3IxLmRmJEdyb3VwIDwtIGFzLmNoYXJhY3Rlcihmb3JncjEuZGYkR3JvdXApCmZvcmdyMV9yZXMuZGYgPC0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUoZm9yZ3IxLmRmWyw0XSwgbGlzdChmb3JncjEuZGYkVHJlYXRtZW50KSwgbWVhbikpCmZvcmdyMV9yZXMuZGYkeCA8LSByb3VuZChmb3JncjFfcmVzLmRmJHgsZGlnaXRzID0gMikKZm9yZ3IxX3Jlcy5kZiRHcm91cC4xIDwtIGFzLmNoYXJhY3Rlcihmb3JncjFfcmVzLmRmJEdyb3VwLjEpCgoKRUVEQUZpZ3VyZTEgPC0gZ2dwbG90KGZvcmdyMV9yZXMuZGYsIGFlcyh4PUdyb3VwLjEseT14LGZpbGw9R3JvdXAuMSksY29sb3I9ImJsYWNrIikrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQyIikrCiAgZ2VvbV90ZXh0KGxhYmVsPWZvcmdyMV9yZXMuZGYkeCx2anVzdD0tLjI1KSsKICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgY29udHJpYnV0aW9uIGJ5IHRyZWF0bWVudCAoZGF0YSBmcm9tIHBlcmlvZHMgNuKAkzEwKSIsCiAgICAgICB4PSJUcmVhdG1lbnQiLAogICAgICAgeT0iQXZlcmFnZSBjb250cmlidXRpb24iLAogICAgICAgZmlsbD1OVUxMKSsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGxpbmV0eXBlPSJzb2xpZCIsY29sb3I9IkJsYWNrIikpCiNnZ3NhdmUoIkVFREEtRmlndXJlMS5wbmciLEVFREFGaWd1cmUxKQoKCiNHMgoKZm9yZ3IyLmRmIDwtIHNlbGVjdChleHBlLCBQZXJpb2QsIEdyb3VwLCBUcmVhdG1lbnQsIG15Y29udCkKZm9yZ3IyLmRmJFBlcmlvZCA8LSBhcy5kb3VibGUoZm9yZ3IyLmRmJFBlcmlvZCkKZm9yZ3IyLmRmJG15Y29udCA8LSBhcy5kb3VibGUoZm9yZ3IyLmRmJG15Y29udCkKZm9yZ3IyLmRmJEdyb3VwIDwtIGFzLmNoYXJhY3Rlcihmb3JncjIuZGYkR3JvdXApCgpmb3JncjJfcmVzLmRmIDwtIGRhdGEuZnJhbWUoYWdncmVnYXRlKHg9Zm9yZ3IyLmRmJG15Y29udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT1saXN0KGZvcmdyMi5kZiRQZXJpb2QsZm9yZ3IyLmRmJFRyZWF0bWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOPW1lYW4pKQpmb3JncjJfcmVzLmRmJHggPC0gcm91bmQoZm9yZ3IyX3Jlcy5kZiR4LGRpZ2l0cyA9IDIpCmZvcmdyMl9yZXMuZGYkR3JvdXAuMSA8LSBhcy5pbnRlZ2VyKGZvcmdyMl9yZXMuZGYkR3JvdXAuMSkKZm9yZ3IyX3Jlcy5kZiRHcm91cC4yIDwtIGFzLmNoYXJhY3Rlcihmb3JncjJfcmVzLmRmJEdyb3VwLjIpCgpFRURBRmlndXJlMiA8LSBnZ3Bsb3QoZm9yZ3IyX3Jlcy5kZixhZXMoeD1Hcm91cC4xLHk9eCkpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygxOjEwKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyMCwyKSkrCiAgZ2VvbV9wb2ludChhZXMoc2hhcGU9R3JvdXAuMikpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPUdyb3VwLjIpKSsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMSwwLDE1LDUsOCkpKwogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBjb250cmlidXRpb24gb3ZlciB0aW1lIGFjcm9zcyB0cmVhdG1lbnRzIiwKICAgICAgIHg9IlBlcmlvZCIsCiAgICAgICB5PSJBdmVyYWdlIGNvbnRyaWJ1dGlvbiIsCiAgICAgICBzaGFwZT1OVUxMKSsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4wNywgMC4yMiksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QobGluZXR5cGU9InNvbGlkIixjb2xvcj0iQmxhY2siKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKI2dnc2F2ZSgiRUVEQS1GaWd1cmUyLnBuZyIsRUVEQUZpZ3VyZTIpCgojRzMKCmZvcmdyMy5kZiA8LSBzZWxlY3QoZXhwZSwgUGVyaW9kLCBHcm91cCwgVHJlYXRtZW50LCBUb3RhbFByb2ZpdCkKZm9yZ3IzLmRmJFBlcmlvZCA8LSBhcy5kb3VibGUoZm9yZ3IzLmRmJFBlcmlvZCkKZm9yZ3IzLmRmJFRvdGFsUHJvZml0IDwtIGFzLmRvdWJsZShmb3JncjMuZGYkVG90YWxQcm9maXQpCmZvcmdyMy5kZiRHcm91cCA8LSBhcy5jaGFyYWN0ZXIoZm9yZ3IzLmRmJEdyb3VwKQoKZm9yZ3IzX3Jlcy5kZiA8LSBkYXRhLmZyYW1lKGFnZ3JlZ2F0ZSh4PWZvcmdyMy5kZiRUb3RhbFByb2ZpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT1saXN0KGZvcmdyMy5kZiRQZXJpb2QsZm9yZ3IzLmRmJFRyZWF0bWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOPW1lYW4pKQoKZm9yZ3IzX3Jlcy5kZiR4IDwtIHJvdW5kKGZvcmdyM19yZXMuZGYkeCxkaWdpdHMgPSAyKQpmb3JncjNfcmVzLmRmJEdyb3VwLjEgPC0gYXMuaW50ZWdlcihmb3JncjNfcmVzLmRmJEdyb3VwLjEpCmZvcmdyM19yZXMuZGYkR3JvdXAuMiA8LSBhcy5jaGFyYWN0ZXIoZm9yZ3IzX3Jlcy5kZiRHcm91cC4yKQoKQmFzZSA8LSBmb3JncjNfcmVzLmRmJHhbZm9yZ3IzX3Jlcy5kZiRHcm91cC4yPT0wXQpCYXNlIDwtIGMocmVwKEJhc2UsNCkpCmZvcmdyM19yZXMuZGYgPC0gZm9yZ3IzX3Jlcy5kZlstYygxOjEwKSxdCgpmb3JncjNfcmVzLmRmJHJjZSA8LSAoZm9yZ3IzX3Jlcy5kZiR4LUJhc2UtMjUpL0Jhc2UKCkVFREFGaWd1cmUzIDwtIGdncGxvdChmb3JncjNfcmVzLmRmLGFlcyh4PUdyb3VwLjEseT1yY2UpKSsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gMCksY29sb3VyPSJncmF5MjgiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMToxMCkpKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlPUdyb3VwLjIpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID1Hcm91cC4yKSkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDAsMTUsNSw4KSkrCiAgbGFicyh0aXRsZSA9ICJDUkUgb3ZlciB0aW1lIGFjcm9zcyB0cmVhdG1lbnRzIiwKICAgICAgIHg9IlBlcmlvZCIsCiAgICAgICB5PSJDUkUiLAogICAgICAgc2hhcGU9TlVMTCkrCiAgdGhlbWVfYncoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKDAuOSwgMC4yMiksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QobGluZXR5cGU9InNvbGlkIixjb2xvcj0iQmxhY2siKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCiNnZ3NhdmUoIkVFREEtRmlndXJlMy5wbmciLEVFREFGaWd1cmUzKQpgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBlIDwtIHJlYWRfZXhjZWwoIkRBVEEgLSAxMDY4M18yMDA3XzkxNzFfTU9FU00yX0VTTS54bHMiKQpjb2xuYW1lcyhleHBlKSA8LSBleHBlWzQsXQpleHBlIDwtIGFzLmRhdGEuZnJhbWUoZXhwZVstYygxOjQpLF0pCmV4cGVbaXMubmEoZXhwZSk9PUZBTFNFXSA8LSBhcy5udW1lcmljKGV4cGVbaXMubmEoZXhwZSk9PUZBTFNFXSkKI05ldwoKI0dyYXBoCgojSDEKI1k9ZGVsdGEgQ29udHJpYnV0aW9uIChDIHQgLSBDIHQtMSkKI1g9Ui5QdW5pc2htZW50IHQtMQoKaDEuZGYgPC0gc2VsZWN0KGV4cGUsIFBlcmlvZCwgR3JvdXAsIFRyZWF0bWVudCwgU3ViamVjdCwgbXljb250LCB0b3RfcmVkKQpoMS5kZiRUcmVhdG1lbnQgPC0gYXMuaW50ZWdlcihoMS5kZiRUcmVhdG1lbnQpCmgxLmRmIDwtIGZpbHRlcihoMS5kZixUcmVhdG1lbnQ+MCkKCmgxLmRmJFBlcmlvZCA8LSBhcy5kb3VibGUoaDEuZGYkUGVyaW9kKQpoMS5kZiRteWNvbnQgPC0gYXMuZG91YmxlKGgxLmRmJG15Y29udCkKaDEuZGYkdG90X3JlZCA8LSBhcy5kb3VibGUoaDEuZGYkdG90X3JlZCkKaDEuZGYkR3JvdXAgPC0gYXMuY2hhcmFjdGVyKGgxLmRmJEdyb3VwKQpoMS5kZiRTdWJqZWN0IDwtIGFzLmNoYXJhY3RlcihoMS5kZiRTdWJqZWN0KQoKYWxscG9wdTEgPC0gdW5pcXVlKGgxLmRmJFN1YmplY3QpCmgxLmRmJGRlbHRhIDwtIE5BCmZvcihpIGluIDE6bGVuZ3RoKGFsbHBvcHUxKSl7CiAgZm9yKGogaW4gMjoxMCl7CiAgICB0aGlzIDwtIGgxLmRmWyhoMS5kZiRQZXJpb2Q9PWogJiBoMS5kZiRTdWJqZWN0PT1hbGxwb3B1MVtpXSksXSRteWNvbnQKICAgIGxhc3QgPC0gaDEuZGZbKGgxLmRmJFBlcmlvZD09KGotMSkgJiBoMS5kZiRTdWJqZWN0PT1hbGxwb3B1MVtpXSksXSRteWNvbnQKICAgIGgxLmRmWyhoMS5kZiRQZXJpb2Q9PWogJiBoMS5kZiRTdWJqZWN0PT1hbGxwb3B1MVtpXSksXSRkZWx0YSA8LSAodGhpcyAtIGxhc3QpCiAgfQp9CgpoMV9yZXMuZGYgPC0gZGF0YS5mcmFtZShsYXN0cHVuaXNoPWgxLmRmWyhoMS5kZiRQZXJpb2Q8MTApLF0kdG90X3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE9aDEuZGZbKGgxLmRmJFBlcmlvZD4xKSxdJGRlbHRhKQpoMV9yZXMuZGYkY291bnQgPC0gMQpoMV9yZXMyLmRmIDwtIGFnZ3JlZ2F0ZShjb3VudH5sYXN0cHVuaXNoK2RlbHRhLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWgxX3Jlcy5kZiwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtKQpFRURBTmV3SDEgPC0gIGdncGxvdChoMV9yZXMyLmRmLGFlcyh4PWxhc3RwdW5pc2gseT1kZWx0YSkpKwogIGdlb21fcG9pbnQoYWVzKHNpemU9bG9nKGNvdW50KSxjb2xvcj1sb2coY291bnQpKSkrCiAgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkrCiAgbGFicyh0aXRsZSA9ICJMYXN0IFB1bmlzaG1lbnQgdi5zLiDOlENvbnQiLAogICAgICAgeD0iTGFzdCBQdW5pc2htZW50IiwKICAgICAgIHk9Is6UQ29udCIsCiAgICAgICBzaXplPSJsbihDb3VudCkiLAogICAgICAgY29sb3I9ImxuKENvdW50KSIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUobGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QobGluZXR5cGU9InNvbGlkIixjb2xvcj0iQmxhY2siKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCiNnZ3NhdmUoIkVFREEtTmV3SDEucG5nIixFRURBTmV3SDEpCgoKCiNIMgojWT1QdW5pc2htZW50IHQKI1g9Q2ktQ2ooaiE9aSkgdAojWGM9UG9vbCB0CgpoMi5kZiA8LSBzZWxlY3QoZXhwZSxHcm91cCxTdWJqZWN0LFBlcmlvZCxUcmVhdG1lbnQsbXljb250LHRvdGNvbnQsYHBbMV1gLGBwWzJdYCxgcFszXWAsYHBbNF1gKQoKaDIuZGYkVHJlYXRtZW50IDwtIGFzLmludGVnZXIoaDIuZGYkVHJlYXRtZW50KQpoMi5kZiA8LSBmaWx0ZXIoaDIuZGYsVHJlYXRtZW50PjApCgpoMi5kZiRHcm91cCA8LSBhcy5jaGFyYWN0ZXIoaDIuZGYkR3JvdXApCmgyLmRmJFN1YmplY3QgPC0gYXMuaW50ZWdlcihoMi5kZiRTdWJqZWN0KQpoMi5kZiRQZXJpb2QgPC0gYXMuZG91YmxlKGgyLmRmJFBlcmlvZCkKaDIuZGYkbXljb250IDwtIGFzLmRvdWJsZShoMi5kZiRteWNvbnQpCmgyLmRmJHRvdGNvbnQgPC0gYXMuZG91YmxlKGgyLmRmJHRvdGNvbnQpCgpoMi5kZiRgcFsxXWAgPC0gYXMuZG91YmxlKGgyLmRmJGBwWzFdYCkKaDIuZGYkYHBbMl1gIDwtIGFzLmRvdWJsZShoMi5kZiRgcFsyXWApCmgyLmRmJGBwWzNdYCA8LSBhcy5kb3VibGUoaDIuZGYkYHBbM11gKQpoMi5kZiRgcFs0XWAgPC0gYXMuZG91YmxlKGgyLmRmJGBwWzRdYCkKCmgyLmRmJGQxIDwtIDAKaDIuZGYkZDIgPC0gMApoMi5kZiRkMyA8LSAwCmgyLmRmJGQ0IDwtIDAKCgoKZGlmZm1hdCA9IGZ1bmN0aW9uKHgpewogIEQgPSBtYXRyaXgoYXMubnVtZXJpYyhOQSksIE5ST1coeCksIE5ST1coeCkpCiAgZm9yIChpIGluIDE6TlJPVyh4KSl7CiAgICBkID0geFtbaV1dIC0geFstaV0KICAgIERbaSwtaV0gPSBkCiAgfQogIGlmICghYWxsKGlzLm5hKGRpYWcoRCkpKSl7CiAgICBzdG9wKCJOb3QgYWxsIGRpYWdvbmFsIGVsZW1lbnRzIHplcm8iKQogIH0KICBkaWFnKEQpID0gMAogIGlmICghaXMubnVsbChuYW1lcyh4KSkpIGNvbG5hbWVzKEQpID0gcm93bmFtZXMoRCkgPSBuYW1lcyh4KQogIHJldHVybihEKQp9CgprIDwtIG5yb3coaDIuZGYpLzQKCmZvciggdyBpbiAxOmspewogIGogPC0gdyo0CiAgaDIuZGZbKGotMyk6aiwoMTE6MTQpXSA8LSBkaWZmbWF0KGgyLmRmWyhqLTMpOmosNV0pCn0KCmgyLmRmJHRwMSA8LSBoMi5kZiRUcmVhdG1lbnQqaDIuZGYkYHBbMV1gCmgyLmRmJHRwMiA8LSBoMi5kZiRUcmVhdG1lbnQqaDIuZGYkYHBbMl1gCmgyLmRmJHRwMyA8LSBoMi5kZiRUcmVhdG1lbnQqaDIuZGYkYHBbM11gCmgyLmRmJHRwNCA8LSBoMi5kZiRUcmVhdG1lbnQqaDIuZGYkYHBbNF1gCgpoMl9yZXMuZGYgPC0gYyhOQSxOQSxOQSxOQSkKCmZvcihpIGluIDE6bnJvdyhoMi5kZikpewogIHBsYWNlIDwtIGgyLmRmJFN1YmplY3RbaV0gJSUgMTAKICBmb3IoaiBpbiAxOjQpewogICAgaWYoaiE9cGxhY2UpewogICAgICBwIDwtIGgyLmRmW2ksKGorNildCiAgICAgIHRwIDwtIGgyLmRmW2ksKGorMTQpXQogICAgICBkIDwtIGgyLmRmW2ksKGorMTApXQogICAgICBwb29sIDwtIGgyLmRmJHRvdGNvbnRbaV0KICAgICAgaDJfcmVzLmRmIDwtIHJiaW5kKGgyX3Jlcy5kZiwgYyhwLHRwLGQscG9vbCkpCiAgICB9CiAgfQp9CmgyX3Jlcy5kZiA8LSBhcy5kYXRhLmZyYW1lKGgyX3Jlcy5kZlstMSxdKQpjb2xuYW1lcyhoMl9yZXMuZGYpIDwtIGMoInB1bmlzaCIsInJwdW5pc2giLCJkZWx0YSIsInBvb2wiKQoKaDJfcmVzLmRmJGNvdW50IDwtIDEKaDJfcmVzMi5kZiA8LSBhZ2dyZWdhdGUoY291bnQgfiBwdW5pc2ggKyBkZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1oMl9yZXMuZGYsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bSkKaDJfcmVzMy5kZiA8LSBmaWx0ZXIoaDJfcmVzMi5kZixkZWx0YT49MCkKCkVFREFOZXdIMiA8LSBnZ3Bsb3QoaDJfcmVzMy5kZixhZXMoeD1kZWx0YSx5PXB1bmlzaCkpKwogIGdlb21fcG9pbnQoYWVzKHNpemU9bG9nKGNvdW50KSxjb2xvcj1sb2coY291bnQpKSkrCiAgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkrCiAgbGFicyh0aXRsZSA9ICJNT1JFIENvbnQgdi5zLiBQdW5pc2giLAogICAgICAgeD0iTW9yZSBDb250cmlidXRpb24iLAogICAgICAgeT0iUHVuaXNoIiwKICAgICAgIHNpemU9ImxuKENvdW50KSIsCiAgICAgICBjb2xvcj0ibG4oQ291bnQpIiwKICAgICAgIGNhcHRpb24gPSAiKE9ubHkgd2hlbiBkaWYobXljb250KSBpcyBub24tbmVnYXRpdmUpIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZShsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChsaW5ldHlwZT0ic29saWQiLGNvbG9yPSJCbGFjayIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQojZ2dzYXZlKCJFRURBLU5ld0gyLnBuZyIsRUVEQU5ld0gyKQoKRUVEQU5ld0gyLjEgPC0gZ2dwbG90KGgyX3JlczIuZGYsYWVzKHg9ZGVsdGEseT1wdW5pc2gpKSsKICBnZW9tX3BvaW50KGFlcyhzaXplPWxvZyhjb3VudCksY29sb3I9bG9nKGNvdW50KSkpKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYygpKwogIGxhYnModGl0bGUgPSAiRGlmIENvbnQgdi5zLiBQdW5pc2giLAogICAgICAgeD0iRElmZmVyZW5jZSBpbiBDb250cmlidXRpb24iLAogICAgICAgeT0iUHVuaXNoIiwKICAgICAgIHNpemU9ImxuKENvdW50KSIsCiAgICAgICBjb2xvcj0ibG4oQ291bnQpIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZShsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChsaW5ldHlwZT0ic29saWQiLGNvbG9yPSJCbGFjayIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKI2dnc2F2ZSgiRUVEQS1OZXdIMi4xLnBuZyIsRUVEQU5ld0gyLjEpCgoKCiNSZWdyZXNzaW9uCgojSDEKI1k9ZGVsdGEgQ29udHJpYnV0aW9uIChDIHQgLSBDIHQtMSkKI1g9Ui5QdW5pc2htZW50IHQtMQoKcmVzaDEgPC0gbG0oZGVsdGF+bGFzdHB1bmlzaCxoMV9yZXMuZGYpCgpyZXNoMW0xIDwtIGRhdGEuZnJhbWUobGFzdHB1bmlzaD1oMS5kZlsoaDEuZGYkUGVyaW9kPDEwICYgaDEuZGYkVHJlYXRtZW50PT0xKSxdJHRvdF9yZWQsCiAgICAgICAgICAgICAgICAgICAgICBkZWx0YT1oMS5kZlsoaDEuZGYkUGVyaW9kPjEgJiBoMS5kZiRUcmVhdG1lbnQ9PTEpLF0kZGVsdGEpCnJlc2gxbTIgPC0gZGF0YS5mcmFtZShsYXN0cHVuaXNoPWgxLmRmWyhoMS5kZiRQZXJpb2Q8MTAgJiBoMS5kZiRUcmVhdG1lbnQ9PTIpLF0kdG90X3JlZCwKICAgICAgICAgICAgICAgICAgICAgIGRlbHRhPWgxLmRmWyhoMS5kZiRQZXJpb2Q+MSAmIGgxLmRmJFRyZWF0bWVudD09MiksXSRkZWx0YSkKcmVzaDFtMyA8LSBkYXRhLmZyYW1lKGxhc3RwdW5pc2g9aDEuZGZbKGgxLmRmJFBlcmlvZDwxMCAmIGgxLmRmJFRyZWF0bWVudD09MyksXSR0b3RfcmVkLAogICAgICAgICAgICAgICAgICAgICAgZGVsdGE9aDEuZGZbKGgxLmRmJFBlcmlvZD4xICYgaDEuZGYkVHJlYXRtZW50PT0zKSxdJGRlbHRhKQpyZXNoMW00IDwtIGRhdGEuZnJhbWUobGFzdHB1bmlzaD1oMS5kZlsoaDEuZGYkUGVyaW9kPDEwICYgaDEuZGYkVHJlYXRtZW50PT00KSxdJHRvdF9yZWQsCiAgICAgICAgICAgICAgICAgICAgICBkZWx0YT1oMS5kZlsoaDEuZGYkUGVyaW9kPjEgJiBoMS5kZiRUcmVhdG1lbnQ9PTQpLF0kZGVsdGEpCgpyZXNoMTEgPC0gbG0oZGVsdGF+bGFzdHB1bmlzaCxyZXNoMW0xKQpyZXNoMTIgPC0gbG0oZGVsdGF+bGFzdHB1bmlzaCxyZXNoMW0yKQpyZXNoMTMgPC0gbG0oZGVsdGF+bGFzdHB1bmlzaCxyZXNoMW0zKQpyZXNoMTQgPC0gbG0oZGVsdGF+bGFzdHB1bmlzaCxyZXNoMW00KQp0bCA8LSBjKCJBbGwiLCInMSciLCInMiciLCInMyciLCInNCciKQojc3RhcmdhemVyKHJlc2gxLHJlc2gxMSxyZXNoMTIscmVzaDEzLHJlc2gxNCwgdGl0bGU9Ikh5cG90aGVzaXMgMSIsY29sdW1uLmxhYmVscz10bCwgYWxpZ249VFJVRSwgZGlnaXRzPTIsIG91dD0iRUVUMS5odG0iKQoKCiNIMgojWT1QdW5pc2htZW50IHQKI1g9Q2ktQ2ooaiE9aSkgdAojWGM9UG9vbCB0CgoKaDJfb2xzLmRmIDwtIGMoTkEsTkEsTkEsTkEsTkEpCgpmb3IoaSBpbiAxOm5yb3coaDIuZGYpKXsKICBwbGFjZSA8LSBoMi5kZiRTdWJqZWN0W2ldICUlIDEwCiAgZm9yKGogaW4gMTo0KXsKICAgIGlmKGohPXBsYWNlKXsKICAgICAgdHIgPC0gaDIuZGYkVHJlYXRtZW50W2ldCiAgICAgIHAgPC0gaDIuZGZbaSwoais2KV0KICAgICAgdHAgPC0gaDIuZGZbaSwoaisxNCldCiAgICAgIGQgPC0gaDIuZGZbaSwoaisxMCldCiAgICAgIHBvb2wgPC0gaDIuZGYkdG90Y29udFtpXQogICAgICBoMl9vbHMuZGYgPC0gcmJpbmQoaDJfb2xzLmRmLCBjKHRyLHAsdHAsZCxwb29sKSkKICAgIH0KICB9Cn0KaDJfb2xzLmRmIDwtIGFzLmRhdGEuZnJhbWUoaDJfb2xzLmRmKQpoMl9vbHMuZGYgPC0gaDJfb2xzLmRmWy0xLF0KaDJfb2xzLmRmJE5lZ2F0aXZlIDwtIDAKCgpjb2xuYW1lcyhoMl9vbHMuZGYpIDwtIGMoIlRyZWF0bWVudCIsIlB1bmlzaCIsIlJwdW5pc2giLCJEZWx0YSIsIlBvb2wiLCJOZWdhdGl2ZSIpCmgyX29scy5kZiROZWdhdGl2ZVtoMl9vbHMuZGYkRGVsdGE8MF0gPC0gMQoKaDJfb2xzLmRmMSA8LSBmaWx0ZXIoaDJfb2xzLmRmLFRyZWF0bWVudD09MSkKaDJfb2xzLmRmMiA8LSBmaWx0ZXIoaDJfb2xzLmRmLFRyZWF0bWVudD09MikKaDJfb2xzLmRmMyA8LSBmaWx0ZXIoaDJfb2xzLmRmLFRyZWF0bWVudD09MykKaDJfb2xzLmRmNCA8LSBmaWx0ZXIoaDJfb2xzLmRmLFRyZWF0bWVudD09NCkKCnJlc2gyIDwtIGxtKFB1bmlzaCB+IERlbHRhICsgTmVnYXRpdmUgKyBOZWdhdGl2ZSpEZWx0YSArIFBvb2wsIGgyX29scy5kZikKcmVzaDIxPC0gbG0oUHVuaXNoIH4gRGVsdGEgKyBOZWdhdGl2ZSArIE5lZ2F0aXZlKkRlbHRhICsgUG9vbCwgaDJfb2xzLmRmMSkKcmVzaDIyPC0gbG0oUHVuaXNoIH4gRGVsdGEgKyBOZWdhdGl2ZSArIE5lZ2F0aXZlKkRlbHRhICsgUG9vbCwgaDJfb2xzLmRmMikKcmVzaDIzPC0gbG0oUHVuaXNoIH4gRGVsdGEgKyBOZWdhdGl2ZSArIE5lZ2F0aXZlKkRlbHRhICsgUG9vbCwgaDJfb2xzLmRmMykKcmVzaDI0PC0gbG0oUHVuaXNoIH4gRGVsdGEgKyBOZWdhdGl2ZSArIE5lZ2F0aXZlKkRlbHRhICsgUG9vbCwgaDJfb2xzLmRmNCkKCiNzdGFyZ2F6ZXIocmVzaDIscmVzaDIxLHJlc2gyMixyZXNoMjMscmVzaDI0LCB0aXRsZT0iSHlwb3RoZXNpcyAyIixjb2x1bW4ubGFiZWxzPXRsLCBhbGlnbj1UUlVFLCBkaWdpdHM9Miwgb3V0PSJFRVQyLmh0bSIpCmBgYAoKCj4gUmVzdWx0CgpgYGB7cn0KRUVEQUZpZ3VyZTEKYGBgCgpgYGB7cn0KRUVEQUZpZ3VyZTIKYGBgCgpgYGB7cn0KRUVEQUZpZ3VyZTMKYGBgCgoKCj4gSHlwb3RoZXNpcyAxIC0gQ29udHJpYnV0ZSBtb3JlIGFmdGVyIG1vcmUgcHVuaXNobWVudAoKYGBge3J9CkVFREFOZXdIMQpgYGAKCgpgYGB7ciwgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30Kc3RhcmdhemVyKHJlc2gxLHJlc2gxMSxyZXNoMTIscmVzaDEzLHJlc2gxNCwgdGl0bGU9Ikh5cG90aGVzaXMgMSIsY29sdW1uLmxhYmVscz10bCwgYWxpZ249VFJVRSwgZGlnaXRzPTIsdHlwZSA9ICdodG1sJyxzdHlsZSA9ICJxamUiLGRmID0gRkFMU0UpCgpgYGAKCj4gSHlwb3RoZXNpcyAyIC0gUHVuaXNoIHRoZSBmcmVlIHJpZGVycwoKYGBge3J9CkVFREFOZXdIMgpgYGAKCmBgYHtyfQpFRURBTmV3SDIuMQpgYGAKCgpgYGB7ciwgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30Kc3RhcmdhemVyKHJlc2gyLHJlc2gyMSxyZXNoMjIscmVzaDIzLHJlc2gyNCwgdGl0bGU9Ikh5cG90aGVzaXMgMiIsY29sdW1uLmxhYmVscz10bCwgYWxpZ249VFJVRSwgZGlnaXRzPTIsdHlwZSA9ICdodG1sJyxzdHlsZSA9ICJxamUiLGRmID0gRkFMU0UpCmBgYAoKCgoqKio=