MATERNAL, NEONATAL, AND CHILD HEALTH
- Number of children under five years of age that received treatment for an acute respiratory infection from an appropriate provider [5 fee proxy]
a<-datag
a$Pneumonie<-rowSums(a[,22:23])
a<-aggregate(a[,c(18,66)],list(a$periodname),sum)
a$cible<-round(cibles$Pneumonie[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$Pneumonie*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')
b<-datab
b$pneum<-rowSums(b[,23:24],na.rm=T)
names(datag)[22:23]<-c("Pneumonis","Pneumonig")
datag%>%group_by(zs)%>%summarise(pneum=sum(Pneumonis+Pneumonig,na.rm=T))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=pneum,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=pneum),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

names(b)[23:24]<-c("Pneumonis","Pneumonig")
b%>%group_by(periodname)%>%summarise(pneum=sum(pneum,na.rm=T))->p
ggplot(p,aes(x=periodname,y=pneum))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(pneum,0)),size=3,vjust=-.5)+labs(x="",y="Pneumonie < 5")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(5000,8500))

#geom_bar(stat='identity',fill="lightblue",col="tomato",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=pneum),cex=3,vjust=2)
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("19872"),c("21581"),c("92.1"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))
- Number of insecticide-treated nets (ITN) distributed during antenatal and/or child immunization visits
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("22958"),c("26045"),c("88.1"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))
b<-datab
b$Mild<-rowSums(b[,30:36],na.rm=T)
names(datag)[29:35]<-paste0("mild",1:7)
datag%>%group_by(zs)%>%summarise(Mild=sum(mild1+mild2+mild3+mild4+mild5+mild6+mild7))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Mild,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Mild),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

b%>%group_by(periodname)%>%summarise(Mild=sum(Mild))->p
ggplot(p,aes(x=periodname,y=Mild))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Mild,0)),size=3,vjust=-.5)+labs(x="",title="MIILD", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(0,18000))

- Number of cases of child diarrhea treated in USG-supported programs [7 fee proxy]
a<-datag
a$Diarrhee<-rowSums(a[,21:23])
a<-aggregate(a[,c(15,66)],list(a$periodname),sum)
a$cible<-round(cibles$Diarrhee[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$Diarrhee*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')
b<-datab
b$Diarrh<-rowSums(b[,20:22],na.rm=T)
names(b)[22]<-"dias"
names(datag)[21]<-"dias"
datag%>%group_by(zs)%>%summarise(Diarrh=sum(Diarr_sev1+Diarr_sev2+dias,na.rm=T))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Diarrh,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Diarrh),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

b%>%group_by(periodname)%>%summarise(Diarrh=sum(Diarrh))->p
ggplot(p,aes(x=periodname,y=Diarrh))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Diarrh,0)),size=3,vjust=-.5)+labs(x="",y="",title="Diarrhee < 5 ans")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(6000,12000))

NA
NA
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("25543"),c("25486"),c("100.2"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))
- Number of children less than 12 months of age who received three doses of pentavalent vaccine [9 fee proxy]
a<-datag
a$Penta<-rowSums(a[,41:43])
a<-aggregate(a[,c(41,66)],list(a$periodname),sum,na.rm=T)
a$cible<-round(cibles$Penta[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$Penta*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')
b<-datab
b$Penta<-rowSums(b[,27:29],na.rm=T)
names(datag)[26:28]<-paste0("Penta",1:3)
datag%>%group_by(zs)%>%summarise(Penta=sum(Penta1+Penta2+Penta3))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Penta,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Penta),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

b%>%group_by(periodname)%>%summarise(Penta=sum(Penta))->p
ggplot(p,aes(x=periodname,y=Penta))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Penta,0)),size=3,vjust=-.5)+labs(x="",y="",title="VACCIN PENTAVALENT")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(6000,8000))

NA
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("30652"),c("31353"),c("97.8"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))
- Percent of children less than 12 months of age who received measles vaccine from USG-supported programs [10]
a<-datag
a$VAR<-rowSums(a[,31:33])
a<-aggregate(a[,c(31,50)],list(a$periodname),sum)
a$cible<-round(cibles$VAR[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$VAR*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')
b<-datab
b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[41:43]<-paste0("Var",1:3)
names(datag)[47]<-"pop"
datag%>%group_by(zs)%>%summarise(Vara=sum(Var1+Var2+Var3,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(Var=round(Vara*120000/(popa*4)))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Var,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Var),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

names(b)[42:44]<-paste0("Var",1:3)
names(b)[48]<-"pop"
b%>%group_by(periodname)%>%summarise(Vara=sum(Var,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(Var=round(Vara*120000/(popa*4)))->p
ggplot(p,aes(x=periodname,y=Var))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Var,0)),size=3,vjust=-.5)+labs(x="",y="",title="% VAR")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,90))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("31408"),c("30168"),c("96.1"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))
- Percentage of pregnant women attending at least one antenatal care (ANC) visit with a skilled provider from USG- supported health facilities
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("91"),c("37518"),c("41245"),c("100"),c("91"))
#knitr::kable(a,"pandoc",align='lcccccr',col.names=c("Region","Province","Achievement","Numerator","Denominator","Target","Achievment Rate(%)"))
b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
#names(datag)[41:43]<-paste0("Var",1:3)
#names(datag)[47]<-"pop"
datag%>%group_by(zs)%>%summarise(cpna=sum(CPN,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN=round(cpna*120000/(popa*4)))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=CPN,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=CPN),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

#names(b)[42:44]<-paste0("Var",1:3)
names(b)[48]<-"pop"
b%>%group_by(periodname)%>%summarise(cpna=sum(CPN,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN=round(cpna*120000/(popa*4)))->p
ggplot(p,aes(x=periodname,y=CPN))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(CPN,0)),size=3,vjust=-.5)+labs(x="",y="",title="% CPN1")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(80,140))

- Percentage of pregnant women attending at least one and at least 4 antenatal care (ANC) with a skilled provider from USG-supported health facilities [12 fee]
a<-datag
a$CPN_4<-a[,4]
a<-aggregate(a[,c(4,50)],list(a$periodname),sum)
a$cible<-round(cibles$CPN4[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$CPN_4*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')
b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
#names(datag)[41:43]<-paste0("Var",1:3)
#names(datag)[47]<-"pop"
datag%>%group_by(zs)%>%summarise(cpna=sum(CPN.4,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN4=round(cpna*120000/(popa*4)))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=CPN4,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=CPN4),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

#names(b)[42:44]<-paste0("Var",1:3)
names(b)[48]<-"pop"
b%>%group_by(periodname)%>%summarise(cpna=sum(CPN.4,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN4=round(cpna*120000/(popa*4)))->p
ggplot(p,aes(x=periodname,y=CPN4))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(CPN4,0)),size=3,vjust=-.5)+labs(x="",y="",title="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,60))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("19860"),c("17897"),c("111"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))
- Percentage of deliveries with an SBA in USG-supported facilities
a<-datag
a$Acc<-a[,8]
a<-aggregate(a[,c(8,37,50)],list(a$periodname),sum)
tot2(a)
total$Acc_P<-round(total$Acc*1200/(total[,3]*.04),0)
total$cible4<-round(total[,3]*.04/12)
total[,2:3]<-NULL
total$cible=90
total<-total[,c(1,2,4,5,3)]
#knitr::kable(total,"pandoc",align='lcccr',col.names=c("Mois","AccAssist","Cible4","Cible90","%"))
b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[8]<-"Accouch_ass"
names(datag)[62]<-"Accouch"
datag%>%group_by(zs)%>%summarise(Accoucha=sum(Accouch_ass,na.rm=T),acca=sum(Accouch,na.rm=T))%>% mutate(Accouch_ass=round(Accoucha*100/acca))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Accouch_ass,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Accouch_ass),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

names(b)[9]<-"Accouch_ass"
names(b)[63]<-"Accouch"
b%>%group_by(periodname)%>%summarise(Accoucha=sum(Accouch_ass,na.rm=T),acca=sum(Accouch,na.rm=T))%>% mutate(Accouch_ass=round(Accoucha*100/acca))->p
ggplot(p,aes(x=periodname,y=Accouch_ass))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Accouch_ass,0)),size=3,vjust=-.5)+labs(x="",y="",title="% Accouchements assistés")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,140))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("76"),c("31364"),c("41245"),c("90"),c("84.5"))
#knitr::kable(a,"pandoc",align='lcccccr',col.names=c("Region","Province","Q1 Achievement","Numerator","Denominator","Target","Achievment Rate"))
- Number of women giving birth who received uterotonics in the third stage of labor (OR immediately after birth) through USG-supported programs [2.1.4]
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("1584"),c("2178"),c("72.7"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))
b<-datab
datag%>%group_by(zs)%>%summarise(GATPA=sum(GATPA))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=GATPA,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=GATPA),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

b%>%group_by(periodname)%>%summarise(GATPA=sum(GATPA,na.rm=T))->p
ggplot(p,aes(x=periodname,y=GATPA))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(GATPA,0)),size=3,vjust=-.5)+labs(x="", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(100,900))

- Number and percentage of newborns receiving essential newborn care through USG-supported programs
a<-datag
a$Soins_ess<-a[,29]
a<-aggregate(a[,c(9,29,50)],list(a$periodname),sum)
tot2(a)
total$cible<-100
#total$Soess_P<-round(total$Soins_ess*100/total[,2])
total[,3]<-NULL
total$cible=100
#knitr::kable(total,"pandoc",align='lcccr',col.names=c("Mois","NaissViv","SoinsEss","Cible","%"))
b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[38]<-"Soess"
names(datag)[11]<-"Naissv"
datag%>%group_by(zs)%>%summarise(Soessa=sum(Soess,na.rm=T),naissva=sum(Naissv,na.rm=T))%>% mutate(Soess=round(Soessa*100/naissva))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Soess,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Soess),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

names(b)[39]<-"Soess"
names(b)[12]<-"Naissv"
b%>%group_by(periodname)%>%summarise(Soessa=sum(Soess,na.rm=T),naissva=sum(Naissv,na.rm=T))%>% mutate(Soess=round(Soessa*100/naissva))->p
ggplot(p,aes(x=periodname,y=Soess))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Soess,0)),size=3,vjust=-.5)+labs(x="",y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,100))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("90"),c("100"),c("89.9"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))
- Number of postpartum/newborn visits within three days of birth in USG-supported programs [2.1.6]
a<-datag
a$CPON_1<-a[,28]
a<-aggregate(a[,c(28,50)],list(a$periodname),sum)
a$cible<-round(as.numeric(as.character(cibles$CPoN1[3]))/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$CPON_1*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')
b<-datab
names(datag)[37]<-"Cpon1"
datag%>%group_by(zs)%>%summarise(Cpon1=sum(Cpon1))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Cpon1,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Cpon1),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

names(b)[38]<-"Cpon1"
b%>%group_by(periodname)%>%summarise(Cpon1=sum(Cpon1,na.rm=T))->p
ggplot(p,aes(x=periodname,y=Cpon1))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Cpon1,0)),size=3,vjust=-.5)+labs(x="", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(8000,13000))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("28028"),c("23559"),c("119"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))
- Drop-out rate in DTP-HepB-Hib3 among children less than 12 months of age [2.1.9]
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("2.3"),c("4"),c("142.8"))
#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))
b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[75:77]<-paste0("Penta_1",1:3)
names(datag)[26:28]<-paste0("Penta_3",1:3)
datag%>%group_by(zs)%>%summarise(Penta1=sum(Penta_11+Penta_12+Penta_13,na.rm=T),Penta3=sum(Penta_31+Penta_32+Penta_33,na.rm=T))%>% mutate(Drop=round((Penta1-Penta3)/Penta1,2))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Drop,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Drop),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")

names(b)[76:78]<-paste0("Penta_1",1:3)
names(b)[27:29]<-paste0("Penta_3",1:3)
b%>%group_by(periodname)%>%summarise(Penta1=sum(Penta_11+Penta_12+Penta_13,na.rm=T),Penta3=sum(Penta_31+Penta_32+Penta_33,na.rm=T))%>% mutate(Drop=round((Penta1-Penta3)/Penta1,2))->p
ggplot(p,aes(x=periodname,y=Drop))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Drop,2)),size=3,vjust=-.5)+labs(x="",y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(0,1.5))

LS0tDQp0aXRsZTogIlJBUFBPUlRfUUlfSEwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpDQpgYGANCg0KJm5ic3A7DQoNCg0KIyMgMy4gUkVQT1JUSU5HIEJZIFBST0dSQU0gQVJFQQ0KJm5ic3A7DQoNCmBgYHtyLG1lc3NhZ2U9Rn0NCmRhdGFiPC1yZWFkLmNzdigiREFUQUIuY3N2IikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiNiPC1uYW1lcyhkYXRhYikNCiNiPC1nc3ViKCJcXC4rIiwiXFwuIixiKQ0KI2Q8LSdzb21ldGhpbmcnDQojZm9yIChpIGluIDE6NSl7ZFtpXTwtYltpXX0NCiNmb3IgKGkgaW4gNjpsZW5ndGgoYikpew0KICNmPC1zdHJzcGxpdChiW2ldLCJcXC4iKQ0KICAjZjwtdW5saXN0KGYpDQogICNkW2ldPC1wYXN0ZShmWzRdLGZbNV0sZltsZW5ndGgoZildLHNlcD0iLiIpfQ0KICNkWzQ6NV08LWdzdWIoIltBXFwuMlxcLjFcXC5dIiwnJyxkWzQ6NV0pDQogDQpuYW1lcyhkYXRhYilbNjo4XTwtcGFzdGUwKCJTUCIsMTozKQ0KbmFtZXMoZGF0YWIpWzI1OjI2XTwtcGFzdGUwKCJwYWx1IixjKCJzIiwiZyIpLHNlcD0iXyIpDQpuYW1lcyhkYXRhYilbMjA6MjFdPC1wYXN0ZTAoIkRpYXJyX3NldiIsMToyKQ0KDQojZGF0YWckcGVyaW9kbmFtZTwtYXMuY2hhcmFjdGVyKGRhdGFnJHBlcmlvZG5hbWUpDQojZGF0YWckcGVyaW9kbmFtZVtkYXRhZyRwZXJpb2RuYW1lPT0iSmFudmllciJdPC0iMS5KYW52Ig0KZGF0YWIkcGVyaW9kbmFtZTwtcGFzdGUwKG1hdGNoKGRhdGFiJHBlcmlvZG5hbWUsYygiT2N0b2JyZSIsIk5vdmVtYnJlIiwiRMOpY2VtYnJlIiwiSmFudmllciIsIkbDqXZyaWVyIiwiTWFycyIpKSwiLiIsZGF0YWIkcGVyaW9kbmFtZSkNCmRhdGFnPC1kYXRhYltkYXRhYiRwZXJpb2RuYW1lICVpbiUgYygiNC5KYW52aWVyIiwiNS5Gw6l2cmllciIsIjYuTWFycyIpLF0NCiNkYXRhZyRwZXJpb2RuYW1lW2RhdGFnJHBlcmlvZG5hbWU9PSJGw6l2cmllciJdPC0iMi5GZXYiDQojZGF0YWckcGVyaW9kbmFtZVtkYXRhZyRwZXJpb2RuYW1lPT0iTWFycyJdPC0iMy5NYXJzIg0KbmFtZXMoZGF0YWIpWzMxOjM1XTwtcGFzdGUwKCJNaWxkQ3BzIiwxOjUpDQojc2luaygiTmFtZXNiLnR4dCIpDQojbmFtZXMoZGF0YWIpDQojc2luaygpDQoNCmRhdGFnPC1hZ2dyZWdhdGUoZGF0YWdbLDQ6bmNvbChkYXRhZyldLGxpc3QoZGF0YWckenMsZGF0YWckcGVyaW9kbmFtZSksc3VtLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbMToyXTwtYygienMiLCJwZXJpb2RuYW1lIikNCg0KI3NpbmsoIk5hbWVzZy50eHQiKQ0KI25hbWVzKGRhdGFnKQ0KI3NpbmsoKQ0KDQp0b3QyIDwtIGZ1bmN0aW9uKHhkKXsNCiAgcDwtYyhhcy5jaGFyYWN0ZXIoeGRbLDFdKSwnVG90YWwnKQ0KICBhPC1hcHBseSh4ZFssMjpuY29sKHhkKV0sMixzdW0sbmEucm09VCkNCiAgYTwtcmJpbmQoeGRbLDI6bmNvbCh4ZCldLGEpDQogIHU8LWRhdGEuZnJhbWUocCxhKQ0KICBuYW1lcyh1KVsxXTwtIk1vaXMiDQogIGFzc2lnbigidG90YWwiLHUsZW52aXI9Lkdsb2JhbEVudikNCn0NCg0KY2libGVzPC1yZWFkLmNzdigiQzovVXNlcnMvTXV5dW5nYVAvRG9jdW1lbnRzL1BST1NBTkkgVVNBSUQvUVVBUlRFUiBSRVBPUlQvWTIgUkVQT1JUL0NJQkxFUzIuY3N2IikNCmNpYmxlYTwtcmVhZC5jc3YyKCJDOi9Vc2Vycy9NdXl1bmdhUC9Eb2N1bWVudHMvUFJPU0FOSSBVU0FJRC9BTkFMWVNJUy9ZMi9jaWJsZXMuY3N2IikNCiNjaWJsZWc8LWFnZ3JlZ2F0ZShjaWJsZXNbLDM6bmNvbChjaWJsZXMpXSxsaXN0KGNpYmxlcyRHcm91cC4yKSxzdW0sbmEucm09VCkNCiNuYW1lcyhjaWJsZWcpWzFdPC0nenMnDQpkYXRhYzwtcmVhZC5jc3YoIkRBVEFDLmNzdiIpDQojbmFtZXMoZGF0YWMpPC1uYW1lcyhkYXRhYikNCmNsdXM8LWRhdGEuZnJhbWUoenM9dW5pcXVlKGRhdGFiJHpzKSkNCmNsdXMkcG9wPC1pZmVsc2UoY2x1cyR6cyVpbiVjKCJCYWthIiwiS2F5YW1iYSIsIktpbmRhIiwiTHdhbWJhIiksIjFMb3ciLGlmZWxzZShjbHVzJHpzJWluJWMoIkJ1dHVtYmEiLCJLYWJvbmRvRCIsIkthbWluYSIsIktpbmtvbmRqYSIsIk11a2FuZ2EiLCJTb25nYSIpLCIyTWlkZGxlIiwiM0hpZ2giKSkNCmNsdXM8LWNsdXNbb3JkZXIoY2x1cyR6cyksXQ0KDQpgYGANCiAgICANCg0KIyMjIE1BTEFSSUENCg0KJm5ic3A7DQoNCg0KJm5ic3A7DQotICoqTnVtYmVyIG9mIGNoaWxkcmVuIHVuZGVyIDUgeWVhcnMgb2YgYWdlIHdpdGggY29uZmlybWVkIG1hbGFyaWEgd2hvIHJlY2VpdmVkIHRyZWF0bWVudCBmb3IgbWFsYXJpYSBmcm9tIGFuIGFwcHJvcHJpYXRlIHByb3ZpZGVyIGluIFVTRy1zdXBwb3J0ZWQgYXJlYXMgWzE1IGZlZSBwcm94eV0qKiAgDQoNCiZuYnNwOw0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCI5NDA3IiksYygiNzQ0MzAiKSxjKCIxMjYuNCIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7DQouICANCiZuYnNwOw0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIn0NCmE8LWRhdGFnDQphJHBhbHU8LXJvd1N1bXMoYVssMjQ6MjVdKQ0KYTwtYWdncmVnYXRlKGFbLGMoMjAsNjYpXSxsaXN0KGEkcGVyaW9kbmFtZSksc3VtKQ0KYSRjaWJsZTwtcm91bmQoY2libGVzJFBhbHVkaXNtZVszXS8xMikNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJHBhbHUqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCmI8LWRhdGFiDQpiJHBhbHU8LXJvd1N1bXMoYlssMjU6MjZdLG5hLnJtPVQpDQojZGF0YWckUGFsdTwtcm93U3VtcyhkYXRhZ1ssMjA6MjFdLG5hLnJtPVQpDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShQYWx1PXN1bShwYWx1c18rcGFsdWdfKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1QYWx1LGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9UGFsdSksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKFBhbHU9c3VtKHBhbHUpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9UGFsdSkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChQYWx1LDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoMjAwMDAsNDAwMDApKQ0KICANCiAgI2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5JyxmaWxsPSJsaWdodGJsdWUiLGNvbD0idG9tYXRvIixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1QYWx1KSxjZXg9Myx2anVzdD0yKQ0KDQpgYGANCg0KLQkqKlBlcmNlbnQgb2YgcHJlZ25hbnQgd29tZW4gd2hvIHJlY2VpdmVkIGRvc2VzIG9mIHN1bGZhZG94aW5lLyBweXJpbWV0aGFtaW5lIChTL1ApIGZvciBJbnRlcm1pdHRlbnQgUHJldmVudGl2ZSBUcmVhdG1lbnQgKElQVCkgZHVyaW5nIEFOQyB2aXNpdHMgWzIuNF0qKg0KDQombmJzcDsNCiZuYnNwOw0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIn0NCmE8LWRhdGFnDQphJFNQPC1yb3dTdW1zKGFbLDU6N10pDQphPC1hZ2dyZWdhdGUoYVssYygzLDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LWFbLDJdKjMNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJFNQKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJFNQPC1yb3dTdW1zKGJbLDY6OF0sbmEucm09VCkNCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKHNwYT1zdW0oU1AxK1NQMitTUDMsbmEucm09VCksY3BuYT1zdW0oQ1BOLG5hLnJtPVQpKSU+JSBtdXRhdGUoU1A9cm91bmQoc3BhKjEwMC8oY3BuYSozKSkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9U1AsZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1TUCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKHNwYT1zdW0oU1AxK1NQMitTUDMsbmEucm09VCksY3BuYT1zdW0oQ1BOLG5hLnJtPVQpKSU+JSBtdXRhdGUoU1A9cm91bmQoc3BhKjEwMC8oY3BuYSozKSkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1TUCkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChTUCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiUgU1AiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDUwLDkwKSkNCg0KYGBgDQoNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiOTEuMCIpLGMoIjM3NTE4IiksYygiNDEyNDUiKSxjKCIxMDAiKSxjKCc5MS4wJykpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY2NjcicsY29sLm5hbWVzPWMoIlJlZ2lvbiIsIlByb3ZpbmNlIiwiQWNoaWV2ZW1lbnQiLCdOdW1lcmF0b3InLCdEZW5vbWluYXRvcicsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCg0KDQombmJzcDsNCiZuYnNwOw0KDQojIyBNQVRFUk5BTCwgTkVPTkFUQUwsIEFORCBDSElMRCBIRUFMVEgNCiZuYnNwOw0KJm5ic3A7DQotCSoqTnVtYmVyIG9mIGNoaWxkcmVuIHVuZGVyIGZpdmUgeWVhcnMgb2YgYWdlIHRoYXQgcmVjZWl2ZWQgdHJlYXRtZW50IGZvciBhbiBhY3V0ZSByZXNwaXJhdG9yeSBpbmZlY3Rpb24gZnJvbSBhbiBhcHByb3ByaWF0ZSBwcm92aWRlciBbNSBmZWUgcHJveHldKiogDQpgYGB7cn0NCmE8LWRhdGFnDQphJFBuZXVtb25pZTwtcm93U3VtcyhhWywyMjoyM10pDQphPC1hZ2dyZWdhdGUoYVssYygxOCw2NildLGxpc3QoYSRwZXJpb2RuYW1lKSxzdW0pDQphJGNpYmxlPC1yb3VuZChjaWJsZXMkUG5ldW1vbmllWzNdLzEyKQ0KdG90MihhKQ0KdG90YWxbLDJdPC1OVUxMDQojdG90YWwkcGVyY2VudDwtcm91bmQodG90YWwkUG5ldW1vbmllKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJHBuZXVtPC1yb3dTdW1zKGJbLDIzOjI0XSxuYS5ybT1UKQ0KDQpuYW1lcyhkYXRhZylbMjI6MjNdPC1jKCJQbmV1bW9uaXMiLCJQbmV1bW9uaWciKQ0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UocG5ldW09c3VtKFBuZXVtb25pcytQbmV1bW9uaWcsbmEucm09VCkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9cG5ldW0sZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wbmV1bSksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbMjM6MjRdPC1jKCJQbmV1bW9uaXMiLCJQbmV1bW9uaWciKQ0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKHBuZXVtPXN1bShwbmV1bSxuYS5ybT1UKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PXBuZXVtKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKHBuZXVtLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iUG5ldW1vbmllIDwgNSIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNTAwMCw4NTAwKSkNCiAgDQogICNnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsZmlsbD0ibGlnaHRibHVlIixjb2w9InRvbWF0byIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9cG5ldW0pLGNleD0zLHZqdXN0PTIpDQpgYGANCg0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIxOTg3MiIpLGMoIjIxNTgxIiksYygiOTIuMSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSglKSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCg0KDQoNCiZuYnNwOw0KJm5ic3A7DQoNCi0gKipOdW1iZXIgb2YgaW5zZWN0aWNpZGUtdHJlYXRlZCBuZXRzIChJVE4pIGRpc3RyaWJ1dGVkIGR1cmluZyBhbnRlbmF0YWwgYW5kL29yIGNoaWxkIGltbXVuaXphdGlvbiB2aXNpdHMqKg0KDQoNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjIyOTU4IiksYygiMjYwNDUiKSxjKCI4OC4xIikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlKCUpIikpDQoNCmI8LWRhdGFiDQpiJE1pbGQ8LXJvd1N1bXMoYlssMzA6MzZdLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbMjk6MzVdPC1wYXN0ZTAoIm1pbGQiLDE6NykNCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKE1pbGQ9c3VtKG1pbGQxK21pbGQyK21pbGQzK21pbGQ0K21pbGQ1K21pbGQ2K21pbGQ3KSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1NaWxkLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9TWlsZCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKE1pbGQ9c3VtKE1pbGQpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9TWlsZCkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChNaWxkLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIsdGl0bGU9Ik1JSUxEIiwgeT0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9YygwLDE4MDAwKSkNCg0KYGBgDQoNCiZuYnNwOw0KJm5ic3A7DQoNCg0KJm5ic3A7DQoNCi0JKipOdW1iZXIgb2YgY2FzZXMgb2YgY2hpbGQgZGlhcnJoZWEgdHJlYXRlZCBpbiBVU0ctc3VwcG9ydGVkIHByb2dyYW1zIFs3IGZlZSBwcm94eV0qKg0KJm5ic3A7DQpgYGB7cn0NCmE8LWRhdGFnDQphJERpYXJyaGVlPC1yb3dTdW1zKGFbLDIxOjIzXSkNCmE8LWFnZ3JlZ2F0ZShhWyxjKDE1LDY2KV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyREaWFycmhlZVszXS8xMikNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJERpYXJyaGVlKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJERpYXJyaDwtcm93U3VtcyhiWywyMDoyMl0sbmEucm09VCkNCm5hbWVzKGIpWzIyXTwtImRpYXMiDQpuYW1lcyhkYXRhZylbMjFdPC0iZGlhcyINCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKERpYXJyaD1zdW0oRGlhcnJfc2V2MStEaWFycl9zZXYyK2RpYXMsbmEucm09VCkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9RGlhcnJoLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9RGlhcnJoKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoRGlhcnJoPXN1bShEaWFycmgpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9RGlhcnJoKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKERpYXJyaCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiIsdGl0bGU9IkRpYXJyaGVlIDwgNSBhbnMiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDYwMDAsMTIwMDApKQ0KDQoNCmBgYA0KDQoNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMjU1NDMiKSxjKCIyNTQ4NiIpLGMoIjEwMC4yIikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmBgYA0KDQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KJm5ic3A7DQoNCg0KLQkqKk51bWJlciBvZiBjaGlsZHJlbiBsZXNzIHRoYW4gMTIgbW9udGhzIG9mIGFnZSB3aG8gcmVjZWl2ZWQgdGhyZWUgZG9zZXMgb2YgcGVudGF2YWxlbnQgdmFjY2luZSBbOSBmZWUgcHJveHldKioNCiZuYnNwOw0KYGBge3J9DQphPC1kYXRhZw0KYSRQZW50YTwtcm93U3VtcyhhWyw0MTo0M10pDQphPC1hZ2dyZWdhdGUoYVssYyg0MSw2NildLGxpc3QoYSRwZXJpb2RuYW1lKSxzdW0sbmEucm09VCkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyRQZW50YVszXS8xMikNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJFBlbnRhKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJFBlbnRhPC1yb3dTdW1zKGJbLDI3OjI5XSxuYS5ybT1UKQ0KbmFtZXMoZGF0YWcpWzI2OjI4XTwtcGFzdGUwKCJQZW50YSIsMTozKQ0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoUGVudGE9c3VtKFBlbnRhMStQZW50YTIrUGVudGEzKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1QZW50YSxmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPVBlbnRhKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoUGVudGE9c3VtKFBlbnRhKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PVBlbnRhKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKFBlbnRhLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIix0aXRsZT0iVkFDQ0lOIFBFTlRBVkFMRU5UIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg2MDAwLDgwMDApKQ0KICANCmBgYA0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIzMDY1MiIpLGMoIjMxMzUzIiksYygiOTcuOCIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCg0KLQkqKlBlcmNlbnQgb2YgY2hpbGRyZW4gbGVzcyB0aGFuIDEyIG1vbnRocyBvZiBhZ2Ugd2hvIHJlY2VpdmVkIG1lYXNsZXMgdmFjY2luZSBmcm9tIFVTRy1zdXBwb3J0ZWQgcHJvZ3JhbXMgWzEwXSoqDQombmJzcDsNCmBgYHtyfQ0KYTwtZGF0YWcNCmEkVkFSPC1yb3dTdW1zKGFbLDMxOjMzXSkNCmE8LWFnZ3JlZ2F0ZShhWyxjKDMxLDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyRWQVJbM10vMTIpDQp0b3QyKGEpDQp0b3RhbFssMl08LU5VTEwNCiN0b3RhbCRwZXJjZW50PC1yb3VuZCh0b3RhbCRWQVIqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCg0KYjwtZGF0YWINCmIkVmFyPC1yb3dTdW1zKGJbLDQyOjQ0XSxuYS5ybT1UKQ0KbmFtZXMoZGF0YWcpWzQxOjQzXTwtcGFzdGUwKCJWYXIiLDE6MykNCm5hbWVzKGRhdGFnKVs0N108LSJwb3AiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShWYXJhPXN1bShWYXIxK1ZhcjIrVmFyMyxuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShWYXI9cm91bmQoVmFyYSoxMjAwMDAvKHBvcGEqNCkpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PVZhcixmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPVZhciksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbNDI6NDRdPC1wYXN0ZTAoIlZhciIsMTozKQ0KbmFtZXMoYilbNDhdPC0icG9wIg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKFZhcmE9c3VtKFZhcixuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShWYXI9cm91bmQoVmFyYSoxMjAwMDAvKHBvcGEqNCkpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9VmFyKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKFZhciwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiIsdGl0bGU9IiUgVkFSIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg0MCw5MCkpDQoNCmBgYA0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIzMTQwOCIpLGMoIjMwMTY4IiksYygiOTYuMSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiANCiZuYnNwOw0KJm5ic3A7DQoNCi0gKipQZXJjZW50YWdlIG9mIHByZWduYW50IHdvbWVuIGF0dGVuZGluZyBhdCBsZWFzdCBvbmUgYW50ZW5hdGFsIGNhcmUgKEFOQykgdmlzaXQgd2l0aCBhIHNraWxsZWQgIHByb3ZpZGVyIGZyb20gVVNHLSBzdXBwb3J0ZWQgaGVhbHRoIGZhY2lsaXRpZXMqKg0KJm5ic3A7DQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCI5MSIpLGMoIjM3NTE4IiksYygiNDEyNDUiKSxjKCIxMDAiKSxjKCI5MSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiTnVtZXJhdG9yIiwiRGVub21pbmF0b3IiLCJUYXJnZXQiLCJBY2hpZXZtZW50IFJhdGUoJSkiKSkNCg0KYjwtZGF0YWINCiNiJFZhcjwtcm93U3VtcyhiWyw0Mjo0NF0sbmEucm09VCkNCiNuYW1lcyhkYXRhZylbNDE6NDNdPC1wYXN0ZTAoIlZhciIsMTozKQ0KI25hbWVzKGRhdGFnKVs0N108LSJwb3AiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShjcG5hPXN1bShDUE4sbmEucm09VCkscG9wYT1zdW0ocG9wLG5hLnJtPVQpKSU+JSBtdXRhdGUoQ1BOPXJvdW5kKGNwbmEqMTIwMDAwLyhwb3BhKjQpKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1DUE4sZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1DUE4pLGNleD0zLHZqdXN0PTIpK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IllsT3JCciIpDQoNCiNuYW1lcyhiKVs0Mjo0NF08LXBhc3RlMCgiVmFyIiwxOjMpDQpuYW1lcyhiKVs0OF08LSJwb3AiDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoY3BuYT1zdW0oQ1BOLG5hLnJtPVQpLHBvcGE9c3VtKHBvcCxuYS5ybT1UKSklPiUgbXV0YXRlKENQTj1yb3VuZChjcG5hKjEyMDAwMC8ocG9wYSo0KSkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1DUE4pKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ1BOLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIix0aXRsZT0iJSBDUE4xIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg4MCwxNDApKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCiZuYnNwOw0KDQotCSoqUGVyY2VudGFnZSBvZiBwcmVnbmFudCB3b21lbiBhdHRlbmRpbmcgYXQgbGVhc3Qgb25lIGFuZCBhdCBsZWFzdCA0IGFudGVuYXRhbCBjYXJlIChBTkMpIHdpdGggYSBza2lsbGVkIHByb3ZpZGVyIGZyb20gVVNHLXN1cHBvcnRlZCBoZWFsdGggZmFjaWxpdGllcyBbMTIgZmVlXSoqDQombmJzcDsNCmBgYHtyfQ0KYTwtZGF0YWcNCmEkQ1BOXzQ8LWFbLDRdDQphPC1hZ2dyZWdhdGUoYVssYyg0LDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyRDUE40WzNdLzEyKQ0KdG90MihhKQ0KdG90YWxbLDJdPC1OVUxMDQojdG90YWwkcGVyY2VudDwtcm91bmQodG90YWwkQ1BOXzQqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCg0KYjwtZGF0YWINCiNiJFZhcjwtcm93U3VtcyhiWyw0Mjo0NF0sbmEucm09VCkNCiNuYW1lcyhkYXRhZylbNDE6NDNdPC1wYXN0ZTAoIlZhciIsMTozKQ0KI25hbWVzKGRhdGFnKVs0N108LSJwb3AiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShjcG5hPXN1bShDUE4uNCxuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShDUE40PXJvdW5kKGNwbmEqMTIwMDAwLyhwb3BhKjQpKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1DUE40LGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9Q1BONCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KI25hbWVzKGIpWzQyOjQ0XTwtcGFzdGUwKCJWYXIiLDE6MykNCm5hbWVzKGIpWzQ4XTwtInBvcCINCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShjcG5hPXN1bShDUE4uNCxuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShDUE40PXJvdW5kKGNwbmEqMTIwMDAwLyhwb3BhKjQpKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PUNQTjQpKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ1BONCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiIsdGl0bGU9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNDAsNjApKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIxOTg2MCIpLGMoIjE3ODk3IiksYygiMTExIikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmBgYA0KDQombmJzcDsNCg0KLQkqKlBlcmNlbnRhZ2Ugb2YgZGVsaXZlcmllcyB3aXRoIGFuIFNCQSBpbiBVU0ctc3VwcG9ydGVkIGZhY2lsaXRpZXMqKiAgDQoNCmBgYHtyfQ0KYTwtZGF0YWcNCmEkQWNjPC1hWyw4XQ0KYTwtYWdncmVnYXRlKGFbLGMoOCwzNyw1MCldLGxpc3QoYSRwZXJpb2RuYW1lKSxzdW0pDQp0b3QyKGEpDQp0b3RhbCRBY2NfUDwtcm91bmQodG90YWwkQWNjKjEyMDAvKHRvdGFsWywzXSouMDQpLDApDQp0b3RhbCRjaWJsZTQ8LXJvdW5kKHRvdGFsWywzXSouMDQvMTIpDQp0b3RhbFssMjozXTwtTlVMTA0KdG90YWwkY2libGU9OTANCnRvdGFsPC10b3RhbFssYygxLDIsNCw1LDMpXQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJNb2lzIiwiQWNjQXNzaXN0IiwiQ2libGU0IiwiQ2libGU5MCIsIiUiKSkNCg0KYjwtZGF0YWINCiNiJFZhcjwtcm93U3VtcyhiWyw0Mjo0NF0sbmEucm09VCkNCm5hbWVzKGRhdGFnKVs4XTwtIkFjY291Y2hfYXNzIg0KbmFtZXMoZGF0YWcpWzYyXTwtIkFjY291Y2giDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShBY2NvdWNoYT1zdW0oQWNjb3VjaF9hc3MsbmEucm09VCksYWNjYT1zdW0oQWNjb3VjaCxuYS5ybT1UKSklPiUgbXV0YXRlKEFjY291Y2hfYXNzPXJvdW5kKEFjY291Y2hhKjEwMC9hY2NhKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1BY2NvdWNoX2FzcyxmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPUFjY291Y2hfYXNzKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpuYW1lcyhiKVs5XTwtIkFjY291Y2hfYXNzIg0KbmFtZXMoYilbNjNdPC0iQWNjb3VjaCINCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShBY2NvdWNoYT1zdW0oQWNjb3VjaF9hc3MsbmEucm09VCksYWNjYT1zdW0oQWNjb3VjaCxuYS5ybT1UKSklPiUgbXV0YXRlKEFjY291Y2hfYXNzPXJvdW5kKEFjY291Y2hhKjEwMC9hY2NhKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PUFjY291Y2hfYXNzKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKEFjY291Y2hfYXNzLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIix0aXRsZT0iJSBBY2NvdWNoZW1lbnRzIGFzc2lzdMOpcyIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNDAsMTQwKSkNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCI3NiIpLGMoIjMxMzY0IiksYygiNDEyNDUiKSxjKCI5MCIpLGMoIjg0LjUiKSkNCg0KI2tuaXRyOjprYWJsZShhLCJwYW5kb2MiLGFsaWduPSdsY2NjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJRMSBBY2hpZXZlbWVudCIsIk51bWVyYXRvciIsIkRlbm9taW5hdG9yIiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmBgYA0KDQombmJzcDsNCg0KJm5ic3A7DQoNCi0JKipOdW1iZXIgb2Ygd29tZW4gZ2l2aW5nIGJpcnRoIHdobyByZWNlaXZlZCB1dGVyb3RvbmljcyBpbiB0aGUgdGhpcmQgc3RhZ2Ugb2YgbGFib3IgKE9SIGltbWVkaWF0ZWx5IGFmdGVyIGJpcnRoKSB0aHJvdWdoIFVTRy1zdXBwb3J0ZWQgcHJvZ3JhbXMgWzIuMS40XSoqDQombmJzcDsNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMTU4NCIpLGMoIjIxNzgiKSxjKCI3Mi43IikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmI8LWRhdGFiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShHQVRQQT1zdW0oR0FUUEEpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PUdBVFBBLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9R0FUUEEpLGNleD0zLHZqdXN0PTIpK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IllsT3JCciIpDQoNCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShHQVRQQT1zdW0oR0FUUEEsbmEucm09VCkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1HQVRQQSkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChHQVRQQSwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLCB5PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDEwMCw5MDApKQ0KYGBgDQoNCiZuYnNwOw0KJm5ic3A7DQoNCg0KLQkqKk51bWJlciBhbmQgcGVyY2VudGFnZSBvZiBuZXdib3JucyByZWNlaXZpbmcgZXNzZW50aWFsIG5ld2Jvcm4gY2FyZSB0aHJvdWdoIFVTRy1zdXBwb3J0ZWQgcHJvZ3JhbXMqKg0KDQpgYGB7cn0NCmE8LWRhdGFnDQphJFNvaW5zX2VzczwtYVssMjldDQphPC1hZ2dyZWdhdGUoYVssYyg5LDI5LDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCnRvdDIoYSkNCnRvdGFsJGNpYmxlPC0xMDANCiN0b3RhbCRTb2Vzc19QPC1yb3VuZCh0b3RhbCRTb2luc19lc3MqMTAwL3RvdGFsWywyXSkNCnRvdGFsWywzXTwtTlVMTA0KdG90YWwkY2libGU9MTAwDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NjcicsY29sLm5hbWVzPWMoIk1vaXMiLCJOYWlzc1ZpdiIsIlNvaW5zRXNzIiwiQ2libGUiLCIlIikpDQoNCmI8LWRhdGFiDQojYiRWYXI8LXJvd1N1bXMoYlssNDI6NDRdLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbMzhdPC0iU29lc3MiDQpuYW1lcyhkYXRhZylbMTFdPC0iTmFpc3N2Ig0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoU29lc3NhPXN1bShTb2VzcyxuYS5ybT1UKSxuYWlzc3ZhPXN1bShOYWlzc3YsbmEucm09VCkpJT4lIG11dGF0ZShTb2Vzcz1yb3VuZChTb2Vzc2EqMTAwL25haXNzdmEpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PVNvZXNzLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9U29lc3MpLGNleD0zLHZqdXN0PTIpK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IllsT3JCciIpDQoNCm5hbWVzKGIpWzM5XTwtIlNvZXNzIg0KbmFtZXMoYilbMTJdPC0iTmFpc3N2Ig0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKFNvZXNzYT1zdW0oU29lc3MsbmEucm09VCksbmFpc3N2YT1zdW0oTmFpc3N2LG5hLnJtPVQpKSU+JSBtdXRhdGUoU29lc3M9cm91bmQoU29lc3NhKjEwMC9uYWlzc3ZhKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PVNvZXNzKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKFNvZXNzLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg0MCwxMDApKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjkwIiksYygiMTAwIiksYygiODkuOSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7DQoNCg0KJm5ic3A7DQombmJzcDsNCg0KDQotCSoqTnVtYmVyIG9mIHBvc3RwYXJ0dW0vbmV3Ym9ybiB2aXNpdHMgd2l0aGluIHRocmVlIGRheXMgb2YgYmlydGggaW4gVVNHLXN1cHBvcnRlZCBwcm9ncmFtcyBbMi4xLjZdKioNCg0KYGBge3J9DQphPC1kYXRhZw0KYSRDUE9OXzE8LWFbLDI4XQ0KYTwtYWdncmVnYXRlKGFbLGMoMjgsNTApXSxsaXN0KGEkcGVyaW9kbmFtZSksc3VtKQ0KYSRjaWJsZTwtcm91bmQoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoY2libGVzJENQb04xWzNdKSkvMTIpDQp0b3QyKGEpDQp0b3RhbFssMl08LU5VTEwNCiN0b3RhbCRwZXJjZW50PC1yb3VuZCh0b3RhbCRDUE9OXzEqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCg0KYjwtZGF0YWINCm5hbWVzKGRhdGFnKVszN108LSJDcG9uMSINCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKENwb24xPXN1bShDcG9uMSkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9Q3BvbjEsZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1DcG9uMSksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbMzhdPC0iQ3BvbjEiDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoQ3BvbjE9c3VtKENwb24xLG5hLnJtPVQpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9Q3BvbjEpKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ3BvbjEsMCkpLHNpemU9Myx2anVzdD0tLjUpK2xhYnMoeD0iIiwgeT0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg4MDAwLDEzMDAwKSkNCg0KYGBgDQoNCiZuYnNwOw0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMjgwMjgiKSxjKCIyMzU1OSIpLGMoIjExOSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSglKSIpKQ0KDQpgYGANCg0KJm5ic3A7DQogICANCiZuYnNwOw0KDQotCSoqRHJvcC1vdXQgcmF0ZSBpbiBEVFAtSGVwQi1IaWIzIGFtb25nIGNoaWxkcmVuIGxlc3MgdGhhbiAxMiBtb250aHMgb2YgYWdlIFsyLjEuOV0qKg0KDQombmJzcDsNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMi4zIiksYygiNCIpLGMoIjE0Mi44IikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlKCUpIikpDQoNCmI8LWRhdGFiDQojYiRWYXI8LXJvd1N1bXMoYlssNDI6NDRdLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbNzU6NzddPC1wYXN0ZTAoIlBlbnRhXzEiLDE6MykNCm5hbWVzKGRhdGFnKVsyNjoyOF08LXBhc3RlMCgiUGVudGFfMyIsMTozKQ0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoUGVudGExPXN1bShQZW50YV8xMStQZW50YV8xMitQZW50YV8xMyxuYS5ybT1UKSxQZW50YTM9c3VtKFBlbnRhXzMxK1BlbnRhXzMyK1BlbnRhXzMzLG5hLnJtPVQpKSU+JSBtdXRhdGUoRHJvcD1yb3VuZCgoUGVudGExLVBlbnRhMykvUGVudGExLDIpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PURyb3AsZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1Ecm9wKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpuYW1lcyhiKVs3Njo3OF08LXBhc3RlMCgiUGVudGFfMSIsMTozKQ0KbmFtZXMoYilbMjc6MjldPC1wYXN0ZTAoIlBlbnRhXzMiLDE6MykNCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShQZW50YTE9c3VtKFBlbnRhXzExK1BlbnRhXzEyK1BlbnRhXzEzLG5hLnJtPVQpLFBlbnRhMz1zdW0oUGVudGFfMzErUGVudGFfMzIrUGVudGFfMzMsbmEucm09VCkpJT4lIG11dGF0ZShEcm9wPXJvdW5kKChQZW50YTEtUGVudGEzKS9QZW50YTEsMikpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1Ecm9wKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKERyb3AsMikpLHNpemU9Myx2anVzdD0tLjUpK2xhYnMoeD0iIix5PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDAsMS41KSkNCg0KYGBgDQoNCiZuYnNwOyAgDQoNCg0KJm5ic3A7DQombmJzcDsNCiZuYnNwOw0KDQojIyBOVVRSSVRJT04NCg0KLQlOdW1iZXIgb2YgaW5kaXZpZHVhbHMgcmVjZWl2aW5nIG51dHJpdGlvbi1yZWxhdGVkIHByb2Zlc3Npb25hbCB0cmFpbmluZyB0aHJvdWdoIFVTRyBzdXBwb3J0ZWQgbnV0cmlvbiBwcm9ncmFtcyBbMi4xLjEwXQ0KDQotCU51bWJlciBvZiBjaGlsZHJlbiB1bmRlci1maXZlICgwLTU5IG1vbnRocykgcmVhY2hlZCBieSBVU0ctc3VwcG9ydGVkIG51dHJpdGlvbiBwcm9ncmFtcyBbMi4xLjExXQ0KDQombmJzcDsNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjM1MzA5MSIpLGMoIjE1ODQ1NiIpLGMoIjQ0LjkiKSkNCg0KI2tuaXRyOjprYWJsZShhLCJwYW5kb2MiLGFsaWduPSdsY2NjcicsY29sLm5hbWVzPWMoIlJlZ2lvbiIsIlByb3ZpbmNlIiwiQWNoaWV2ZW1lbnQiLCJUYXJnZXQiLCJBY2hpZXZtZW50IFJhdGUoJSkiKSkNCg0KYjwtZGF0YWINCm5hbWVzKGRhdGFnKVs0MF08LSJDUFMiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShDUFM9c3VtKENQUykpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9Q1BTLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9Q1BTKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpuYW1lcyhiKVs0MV08LSJDUFMiDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoQ1BTPXN1bShDUFMsbmEucm09VCkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1DUFMpKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ1BTLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIsIHk9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNTAwMDAsNzAwMDApKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiZuYnNwOw0KJm5ic3A7DQombmJzcDsNCg0KIyMgUkVQUk9EVUNUSVZFIEhFQUxUSC9GQU1JTFkgUExBTk5JTkcNCiZuYnNwOw0KLQkqKk51bWJlciBvZiBuZXcgYWNjZXB0b3JzIHVzaW5nIG1vZGVybiBjb250cmFjZXB0aXZlIG1ldGhvZHMgaW4gVVNHLXN1cHBvcnRlZCBmYWNpbGl0aWVzIFszIGZlZSBwcm94eV0qKg0KDQpgYGB7cn0NCmE8LWRhdGFnDQphJEFjY2VwdDwtKGFbLDEwXSkNCmE8LWFnZ3JlZ2F0ZShhWyxjKDEwLDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyROb3V2ZWxsZS5hY2NlcHRhbnRlWzNdLzEyKQ0KdG90MihhKQ0KdG90YWxbLDJdPC1OVUxMDQojdG90YWwkcGVyY2VudDwtcm91bmQodG90YWwkQWNjZXB0KjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpuYW1lcyhkYXRhZylbMTJdPC0iQWNjZXB0Ig0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoQWNjZXB0PXN1bShBY2NlcHQpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PUFjY2VwdCxmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPUFjY2VwdCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbMTNdPC0iQWNjZXB0Ig0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKEFjY2VwdD1zdW0oQWNjZXB0LG5hLnJtPVQpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9QWNjZXB0KSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKEFjY2VwdCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLCB5PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDEwMDAwLDIzMDAwKSkNCg0KYGBgDQoNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjMzMzcyIiksYygiMjA0MDUiKSxjKCIxNjMuNSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSglKSIpKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiZuYnNwOw0KDQotCSoqTnVtYmVyIG9mIGNvdW5zZWxpbmcgdmlzaXRzIGZvciBGUC8gUkggYXMgcmVzdWx0IG9mIFVTRyBzdXBwb3J0IFsyLjNdKioNCg0KDQoNCg0KIyMgVFVCRVJDVUxPU0lTDQoNCi0JVEIgbm90aWZpY2F0aW9uIHJhdGUgdGhyb3VnaCBVU0ctIHN1cHBvcnRlZCBwcm9ncmFtcyBbMi4xLjE3XQ0KDQotCU51bWJlciBvZiBtdWx0aS1kcnVnIHJlc2lzdGFudCBUQiAoTURSLVRCKSBjYXNlcyBkZXRlY3RlZCBbMi4xLjIwXQ0KDQojIyBXQVRFUiwgU0FOSVRBVElPTiwgQU5EIEhZR0lFTkUNCg0KLQlOdW1iZXIgb2YgcGVvcGxlIGdhaW5pbmcgYWNjZXNzIHRvIGJhc2ljIGRyaW5raW5nIHdhdGVyIHNlcnZpY2VzIGFzIGEgcmVzdWx0IG9mIFVTRyBhc3Npc3RhbmNlIFsyLjYuMl0NCg0KLQlOdW1iZXIgb2YgcGVvcGxlIGdhaW5pbmcgYWNjZXNzIHRvIGEgYmFzaWMgc2FuaXRhdGlvbiBzZXJ2aWNlIGFzIGEgcmVzdWx0IG9mIFVTRyBhc3Npc3RhbmNlIFsyLjYuM10NCg0KIyA0LlJFUE9SVElORyBCWSBQUk9HUkFNIEFDVElWSVRJRVMNCg0KIyMgY2ZyIHJhcHBvcnQgcHJvZ3JhbW1hdGlxdWUNCg0K