Import data

library(ggplot2)
library(ggimage)
library(png)
library(grid)
library(viridis)
#background image
img <- 'bckgd.png'
#importing raw data
data.all <- read.csv("Delhey_JAV02222_data.csv")
#importing backtransformed contrast values for patch name model
regions.all <- read.csv("TableS1.csv")
#importing backtransformed contrast values for patch name model
patches.all <- read.csv("TableS2.csv") 

Male V-type contrast

#subset to correct models and data
patches <- subset(patches.all, model=="contrast males V-type ~ plumage patch")
regions <- subset(regions.all, model=="contrast males V-type ~ plumage region")
data.all$variable <- data.all$mean.cont.v.male 
regions$letters <- toupper(regions$letters)
p=(ggplot(data=patches, aes(x=coord.x+0.25, y=coord.y+0.3, colour=post.mean, label=as.character(patch.name)))
   +geom_point(size=12)
   +geom_text(colour='red')
   +scale_colour_viridis(limits=c(2.35, 2.81))
   +theme_void()
   +theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank())
   +theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
   +theme(axis.line=element_blank())
   +labs(colour="contrast (jnd)")
   +scale_x_continuous(limits=c(2,7))
   +scale_y_continuous(limits=c(2,6))
   +ggtitle("Conspicuousness males")
)
fig1a <- ggbackground(p, img)
fig1b <- (ggplot(data=patches, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T),
                          y=post.mean, label=letters ))
+geom_jitter(data=data.all, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T), y=10^variable), inherit.aes=F, colour='dark grey', alpha=0.3)
+geom_point(size=4)
+geom_errorbar( aes(ymin=ci.lb, ymax=ci.ub), width=0)
+geom_text(aes(y=ci.lb-0.2, x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T)), angle=45)
+geom_errorbar(data=regions, aes(x=c(8.5,15.5,2.5), ymin=ci.lb, ymax=ci.ub), width=0, size=1, inherit.aes=F, colour='red')
+geom_point(data=regions, aes(x=c(8.5,15.5,2.5), y=post.mean), alpha=1, size=5, shape=18, inherit.aes=F, colour='red')
+geom_vline(xintercept=4.5)
+geom_vline(xintercept=12.5)
+geom_text(aes(label=c("head"), x=c(2.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[3], x=c(2.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("dorsal"), x=c(8.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[1], x=c(8.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("ventral"), x=c(15.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[2], x=c(15.5), y=c(0.5)), inherit.aes=F, colour='red')
+scale_y_log10(name='contrast against background (jnd)', breaks=c(1,2,3,4,5,10,20,30))
+scale_x_discrete(name='patch name')
+theme_bw()
+theme(legend.position = "none")
)
fig1a

fig1b

saving images

ggsave(plot=fig1a, filename='fig1a.png', device = 'png', width = 20, height=10, units = 'cm', dpi=600) 
ggsave(plot=fig1b, filename='fig1b.png', device = 'png', width = 13, height=7, units = 'cm', dpi=600)

Contrast females V-type

#subset to correct models and data
patches <- subset(patches.all, model=="contrast females V-type ~ plumage patch")
regions <- subset(regions.all, model=="contrast females V-type ~ plumage region")
data.all$variable <- data.all$mean.cont.v.female 
regions$letters <- toupper(regions$letters)
p=(ggplot(data=patches, aes(x=coord.x+0.25, y=coord.y+0.3, colour=post.mean, label=as.character(patch.name)))
   +geom_point(size=12)
   +geom_text(colour='red')
   +scale_colour_viridis(limits=c(2.35, 2.81))
   +theme_void()
   +theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank())
   +theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
   +theme(axis.line=element_blank())
   +labs(colour="contrast (jnd)")
   +scale_x_continuous(limits=c(2,7))
   +scale_y_continuous(limits=c(2,6))
   +ggtitle("Conspicuousness females")
)
fig1c <- ggbackground(p, img)
fig1d <- (ggplot(data=patches, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T),
                          y=post.mean, label=letters ))
+geom_jitter(data=data.all, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T), y=10^variable), inherit.aes=F, colour='dark grey', alpha=0.3)
+geom_point(size=4)
+geom_errorbar( aes(ymin=ci.lb, ymax=ci.ub), width=0)
+geom_text(aes(y=ci.lb-0.2, x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T)), angle=45)
+geom_errorbar(data=regions, aes(x=c(8.5,15.5,2.5), ymin=ci.lb, ymax=ci.ub), width=0, size=1, inherit.aes=F, colour='red')
+geom_point(data=regions, aes(x=c(8.5,15.5,2.5), y=post.mean), alpha=1, size=5, shape=18, inherit.aes=F, colour='red')
+geom_vline(xintercept=4.5)
+geom_vline(xintercept=12.5)
+geom_text(aes(label=c("head"), x=c(2.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[3], x=c(2.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("dorsal"), x=c(8.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[1], x=c(8.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("ventral"), x=c(15.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[2], x=c(15.5), y=c(0.5)), inherit.aes=F, colour='red')
+scale_y_log10(name='contrast against background (jnd)', breaks=c(1,2,3,4,5,10,20,30))
+scale_x_discrete(name='patch name')
+theme_bw()
+theme(legend.position = "none")
)
fig1c

fig1d

ggsave(plot=fig1c, filename='fig1c.png', device = 'png', width = 20, height=10, units = 'cm', dpi=600) 
ggsave(plot=fig1d, filename='fig1d.png', device = 'png', width = 13, height=7, units = 'cm', dpi=600)

Sexual dichromatism V-type

#subset to correct models and data
patches <- subset(patches.all, model=="sexual dichromatism V-type ~ plumage patch")
regions <- subset(regions.all, model=="sexual dichromatism V-type ~ plumage region")
data.all$variable <- data.all$sex.dich.v 
regions$letters <- toupper(regions$letters)
p=(ggplot(data=patches, aes(x=coord.x+0.25, y=coord.y+0.3, colour=post.mean, label=as.character(patch.name)))
   +geom_point(size=12)
   +geom_text(colour='red')
   +scale_colour_viridis()
   +theme_void()
   +theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank())
   +theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
   +theme(axis.line=element_blank())
   +labs(colour="contrast (jnd)")
   +scale_x_continuous(limits=c(2,7))
   +scale_y_continuous(limits=c(2,6))
   +ggtitle("Sexual dichromatism")
)
fig1e <- ggbackground(p, img)
fig1f <- (ggplot(data=patches, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T),
                          y=post.mean, label=letters ))
+geom_jitter(data=data.all, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T), y=variable), inherit.aes=F, colour='dark grey', alpha=0.3)
+geom_point(size=4)
+geom_errorbar( aes(ymin=ci.lb, ymax=ci.ub), width=0)
+geom_text(aes(y=0.2, x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T)), angle=45)
+geom_errorbar(data=regions, aes(x=c(8.5,15.5,2.5), ymin=ci.lb, ymax=ci.ub), width=0, size=1, inherit.aes=F, colour='red')
+geom_point(data=regions, aes(x=c(8.5,15.5,2.5), y=post.mean), alpha=1, size=5, shape=18, inherit.aes=F, colour='red')
+geom_vline(xintercept=4.5)
+geom_vline(xintercept=12.5)
+geom_text(aes(label=c("head"), x=c(2.5), y=c(0.02)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[3], x=c(2.5), y=c(0.01)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("dorsal"), x=c(8.5), y=c(0.02)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[1], x=c(8.5), y=c(0.01)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("ventral"), x=c(15.5), y=c(0.02)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[2], x=c(15.5), y=c(0.01)), inherit.aes=F, colour='red')
+scale_y_log10(name='contrast females/males (jnd)', breaks=c(1,2,5,10,20,30))
+scale_x_discrete(name='patch name')
+theme_bw()
+theme(legend.position = "none")
)
fig1e

fig1f

ggsave(plot=fig1e, filename='fig1e.png', device = 'png', width = 20, height=10, units = 'cm', dpi=600) 
ggsave(plot=fig1f, filename='fig1f.png', device = 'png', width = 13, height=7, units = 'cm', dpi=600)

U-type visual sensitivities

Male contrast

#subset to correct models and data
patches <- subset(patches.all, model=="contrast males U-type ~ plumage patch")
regions <- subset(regions.all, model=="contrast males U-type ~ plumage region")
data.all$variable <- data.all$mean.cont.u.male 
regions$letters <- toupper(regions$letters)
p=(ggplot(data=patches, aes(x=coord.x+0.25, y=coord.y+0.3, colour=post.mean, label=as.character(patch.name)))
   +geom_point(size=12)
   +geom_text(colour='red')
   +scale_colour_viridis(limits=c(3.1, 3.71))
   +theme_void()
   +theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank())
   +theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
   +theme(axis.line=element_blank())
   +labs(colour="contrast (jnd)")
   +scale_x_continuous(limits=c(2,7))
   +scale_y_continuous(limits=c(2,6))
   +ggtitle("Conspicuousness males")
)
fig1a.u <- ggbackground(p, img)
fig1b.u <- (ggplot(data=patches, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T),
                          y=post.mean, label=letters ))
+geom_jitter(data=data.all, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T), y=10^variable), inherit.aes=F, colour='dark grey', alpha=0.3)
+geom_point(size=4)
+geom_errorbar( aes(ymin=ci.lb, ymax=ci.ub), width=0)
+geom_text(aes(y=ci.lb-0.2, x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T)), angle=45)
+geom_errorbar(data=regions, aes(x=c(8.5,15.5,2.5), ymin=ci.lb, ymax=ci.ub), width=0, size=1, inherit.aes=F, colour='red')
+geom_point(data=regions, aes(x=c(8.5,15.5,2.5), y=post.mean), alpha=1, size=5, shape=18, inherit.aes=F, colour='red')
+geom_vline(xintercept=4.5)
+geom_vline(xintercept=12.5)
+geom_text(aes(label=c("head"), x=c(2.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[3], x=c(2.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("dorsal"), x=c(8.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[1], x=c(8.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("ventral"), x=c(15.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[2], x=c(15.5), y=c(0.5)), inherit.aes=F, colour='red')
+scale_y_log10(name='contrast against background (jnd)', breaks=c(1,2,3,4,5,10,20,30))
+scale_x_discrete(name='patch name')
+theme_bw()
+theme(legend.position = "none")
)
fig1a.u

fig1b.u

ggsave(plot=fig1a.u, filename='fig1a.u.png', device = 'png', width = 20, height=10, units = 'cm', dpi=600) 
ggsave(plot=fig1b.u, filename='fig1b.u.png', device = 'png', width = 13, height=7, units = 'cm', dpi=600)

Contrast females U-type

#subset to correct models and data
patches <- subset(patches.all, model=="contrast females U-type ~ plumage patch")
regions <- subset(regions.all, model=="contrast females U-type ~ plumage region")
data.all$variable <- data.all$mean.cont.u.female 
regions$letters <- toupper(regions$letters)
p=(ggplot(data=patches, aes(x=coord.x+0.25, y=coord.y+0.3, colour=post.mean, label=as.character(patch.name)))
   +geom_point(size=12)
   +geom_text(colour='red')
   +scale_colour_viridis(limits=c(3.1, 3.71))
   +theme_void()
   +theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank())
   +theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
   +theme(axis.line=element_blank())
   +labs(colour="contrast (jnd)")
   +scale_x_continuous(limits=c(2,7))
   +scale_y_continuous(limits=c(2,6))
   +ggtitle("Conspicuousness females")
)
fig1c.u <- ggbackground(p, img)
fig1d.u <- (ggplot(data=patches, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T),
                          y=post.mean, label=letters ))
+geom_jitter(data=data.all, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T), y=10^variable), inherit.aes=F, colour='dark grey', alpha=0.3)
+geom_point(size=4)
+geom_errorbar( aes(ymin=ci.lb, ymax=ci.ub), width=0)
+geom_text(aes(y=ci.lb-0.2, x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T)), angle=45)
+geom_errorbar(data=regions, aes(x=c(8.5,15.5,2.5), ymin=ci.lb, ymax=ci.ub), width=0, size=1, inherit.aes=F, colour='red')
+geom_point(data=regions, aes(x=c(8.5,15.5,2.5), y=post.mean), alpha=1, size=5, shape=18, inherit.aes=F, colour='red')
+geom_vline(xintercept=4.5)
+geom_vline(xintercept=12.5)
+geom_text(aes(label=c("head"), x=c(2.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[3], x=c(2.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("dorsal"), x=c(8.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[1], x=c(8.5), y=c(0.5)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("ventral"), x=c(15.5), y=c(0.65)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[2], x=c(15.5), y=c(0.5)), inherit.aes=F, colour='red')
+scale_y_log10(name='contrast against background (jnd)', breaks=c(1,2,3,4,5,10,20,30))
+scale_x_discrete(name='patch name')
+theme_bw()
+theme(legend.position = "none")
)
fig1c.u

fig1d.u

ggsave(plot=fig1c.u, filename='fig1c.u.png', device = 'png', width = 20, height=10, units = 'cm', dpi=600) 
ggsave(plot=fig1d.u, filename='fig1d.u.png', device = 'png', width = 13, height=7, units = 'cm', dpi=600)

sexual dichromatism

#subset to correct models and data
patches <- subset(patches.all, model=="sexual dichromatism U-type ~ plumage patch")
regions <- subset(regions.all, model=="sexual dichromatism U-type ~ plumage region")
data.all$variable <- data.all$sex.dich.u 
regions$letters <- toupper(regions$letters)
p=(ggplot(data=patches, aes(x=coord.x+0.25, y=coord.y+0.3, colour=post.mean, label=as.character(patch.name)))
   +geom_point(size=12)
   +scale_colour_viridis()
   +geom_text(colour='red')
   +theme_void()
   +theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank())
   +theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
   +theme(axis.line=element_blank())
   +labs(colour="contrast (jnd)")
   +scale_x_continuous(limits=c(2,7))
   +scale_y_continuous(limits=c(2,6))
   +ggtitle("Sexual dichromatism")
)
fig1e.u <- ggbackground(p, img)
fig1f.u <- (ggplot(data=patches, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T),
                          y=post.mean, label=letters ))
+geom_jitter(data=data.all, aes(x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T), y=variable), inherit.aes=F, colour='dark grey', alpha=0.3)
+geom_point(size=4)
+geom_errorbar( aes(ymin=ci.lb, ymax=ci.ub), width=0)
+geom_text(aes(y=0.2, x=factor(patch.name, levels=c('fr','cr','ch',"th",'dn',"ubk","lbk","ru","dtp","dtd","ws","wp","vn","ubr","lbr","be","ve"), ordered=T)), angle=45)
+geom_errorbar(data=regions, aes(x=c(8.5,15.5,2.5), ymin=ci.lb, ymax=ci.ub), width=0, size=1, inherit.aes=F, colour='red')
+geom_point(data=regions, aes(x=c(8.5,15.5,2.5), y=post.mean), alpha=1, size=5, shape=18, inherit.aes=F, colour='red')
+geom_vline(xintercept=4.5)
+geom_vline(xintercept=12.5)
+geom_text(aes(label=c("head"), x=c(2.5), y=c(0.02)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[3], x=c(2.5), y=c(0.01)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("dorsal"), x=c(8.5), y=c(0.02)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[1], x=c(8.5), y=c(0.01)), inherit.aes=F, colour='red')
+geom_text(aes(label=c("ventral"), x=c(15.5), y=c(0.02)), inherit.aes=F, colour='red')
+geom_text(aes(label=regions$letters[2], x=c(15.5), y=c(0.01)), inherit.aes=F, colour='red')
+scale_y_log10(name='contrast females/males (jnd)', breaks=c(1,2,5,10,20,30))
+scale_x_discrete(name='patch name')
+theme_bw()
+theme(legend.position = "none")
)
fig1e.u

fig1f.u

ggsave(plot=fig1e.u, filename='fig1e.u.png', device = 'png', width = 20, height=10, units = 'cm', dpi=600) 
ggsave(plot=fig1f.u, filename='fig1f.u.png', device = 'png', width = 13, height=7, units = 'cm', dpi=600)
LS0tDQp0aXRsZTogIlBsb3RzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiNJbXBvcnQgZGF0YQ0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdnaW1hZ2UpDQpsaWJyYXJ5KHBuZykNCmxpYnJhcnkoZ3JpZCkNCmxpYnJhcnkodmlyaWRpcykNCg0KI2JhY2tncm91bmQgaW1hZ2UNCmltZyA8LSAnYmNrZ2QucG5nJw0KDQojaW1wb3J0aW5nIHJhdyBkYXRhDQpkYXRhLmFsbCA8LSByZWFkLmNzdigiRGVsaGV5X0pBVjAyMjIyX2RhdGEuY3N2IikNCg0KI2ltcG9ydGluZyBiYWNrdHJhbnNmb3JtZWQgY29udHJhc3QgdmFsdWVzIGZvciBwYXRjaCBuYW1lIG1vZGVsDQpyZWdpb25zLmFsbCA8LSByZWFkLmNzdigiVGFibGVTMS5jc3YiKQ0KDQojaW1wb3J0aW5nIGJhY2t0cmFuc2Zvcm1lZCBjb250cmFzdCB2YWx1ZXMgZm9yIHBhdGNoIG5hbWUgbW9kZWwNCnBhdGNoZXMuYWxsIDwtIHJlYWQuY3N2KCJUYWJsZVMyLmNzdiIpIA0KYGBgDQoNCg0KDQojTWFsZSBWLXR5cGUgY29udHJhc3QNCg0KDQpgYGB7cn0NCg0KI3N1YnNldCB0byBjb3JyZWN0IG1vZGVscyBhbmQgZGF0YQ0KcGF0Y2hlcyA8LSBzdWJzZXQocGF0Y2hlcy5hbGwsIG1vZGVsPT0iY29udHJhc3QgbWFsZXMgVi10eXBlIH4gcGx1bWFnZSBwYXRjaCIpDQpyZWdpb25zIDwtIHN1YnNldChyZWdpb25zLmFsbCwgbW9kZWw9PSJjb250cmFzdCBtYWxlcyBWLXR5cGUgfiBwbHVtYWdlIHJlZ2lvbiIpDQoNCmRhdGEuYWxsJHZhcmlhYmxlIDwtIGRhdGEuYWxsJG1lYW4uY29udC52Lm1hbGUgDQoNCnJlZ2lvbnMkbGV0dGVycyA8LSB0b3VwcGVyKHJlZ2lvbnMkbGV0dGVycykNCg0KcD0oZ2dwbG90KGRhdGE9cGF0Y2hlcywgYWVzKHg9Y29vcmQueCswLjI1LCB5PWNvb3JkLnkrMC4zLCBjb2xvdXI9cG9zdC5tZWFuLCBsYWJlbD1hcy5jaGFyYWN0ZXIocGF0Y2gubmFtZSkpKQ0KICAgK2dlb21fcG9pbnQoc2l6ZT0xMikNCiAgICtnZW9tX3RleHQoY29sb3VyPSdyZWQnKQ0KICAgK3NjYWxlX2NvbG91cl92aXJpZGlzKGxpbWl0cz1jKDIuMzUsIDIuODEpKQ0KICAgK3RoZW1lX3ZvaWQoKQ0KICAgK3RoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpDQogICArdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgICt0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQ0KICAgK2xhYnMoY29sb3VyPSJjb250cmFzdCAoam5kKSIpDQogICArc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDIsNykpDQogICArc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDIsNikpDQogICArZ2d0aXRsZSgiQ29uc3BpY3VvdXNuZXNzIG1hbGVzIikNCikNCg0KZmlnMWEgPC0gZ2diYWNrZ3JvdW5kKHAsIGltZykNCg0KDQpmaWcxYiA8LSAoZ2dwbG90KGRhdGE9cGF0Y2hlcywgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHk9cG9zdC5tZWFuLCBsYWJlbD1sZXR0ZXJzICkpDQorZ2VvbV9qaXR0ZXIoZGF0YT1kYXRhLmFsbCwgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksIHk9MTBedmFyaWFibGUpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J2RhcmsgZ3JleScsIGFscGhhPTAuMykNCitnZW9tX3BvaW50KHNpemU9NCkNCitnZW9tX2Vycm9yYmFyKCBhZXMoeW1pbj1jaS5sYiwgeW1heD1jaS51YiksIHdpZHRoPTApDQorZ2VvbV90ZXh0KGFlcyh5PWNpLmxiLTAuMiwgeD1mYWN0b3IocGF0Y2gubmFtZSwgbGV2ZWxzPWMoJ2ZyJywnY3InLCdjaCcsInRoIiwnZG4nLCJ1YmsiLCJsYmsiLCJydSIsImR0cCIsImR0ZCIsIndzIiwid3AiLCJ2biIsInViciIsImxiciIsImJlIiwidmUiKSwgb3JkZXJlZD1UKSksIGFuZ2xlPTQ1KQ0KK2dlb21fZXJyb3JiYXIoZGF0YT1yZWdpb25zLCBhZXMoeD1jKDguNSwxNS41LDIuNSksIHltaW49Y2kubGIsIHltYXg9Y2kudWIpLCB3aWR0aD0wLCBzaXplPTEsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3BvaW50KGRhdGE9cmVnaW9ucywgYWVzKHg9Yyg4LjUsMTUuNSwyLjUpLCB5PXBvc3QubWVhbiksIGFscGhhPTEsIHNpemU9NSwgc2hhcGU9MTgsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NC41KQ0KK2dlb21fdmxpbmUoeGludGVyY2VwdD0xMi41KQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygiaGVhZCIpLCB4PWMoMi41KSwgeT1jKDAuNjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzNdLCB4PWMoMi41KSwgeT1jKDAuNSkpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1jKCJkb3JzYWwiKSwgeD1jKDguNSksIHk9YygwLjY1KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1sxXSwgeD1jKDguNSksIHk9YygwLjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygidmVudHJhbCIpLCB4PWMoMTUuNSksIHk9YygwLjY1KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1syXSwgeD1jKDE1LjUpLCB5PWMoMC41KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitzY2FsZV95X2xvZzEwKG5hbWU9J2NvbnRyYXN0IGFnYWluc3QgYmFja2dyb3VuZCAoam5kKScsIGJyZWFrcz1jKDEsMiwzLDQsNSwxMCwyMCwzMCkpDQorc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSdwYXRjaCBuYW1lJykNCit0aGVtZV9idygpDQordGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmZpZzFhDQpgYGANCg0KYGBge3J9DQpmaWcxYg0KYGBgDQoNCg0KI3NhdmluZyBpbWFnZXMNCmBgYHtyfQ0KZ2dzYXZlKHBsb3Q9ZmlnMWEsIGZpbGVuYW1lPSdmaWcxYS5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAyMCwgaGVpZ2h0PTEwLCB1bml0cyA9ICdjbScsIGRwaT02MDApIA0KZ2dzYXZlKHBsb3Q9ZmlnMWIsIGZpbGVuYW1lPSdmaWcxYi5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAxMywgaGVpZ2h0PTcsIHVuaXRzID0gJ2NtJywgZHBpPTYwMCkNCmBgYA0KDQoNCg0KI0NvbnRyYXN0IGZlbWFsZXMgVi10eXBlDQpgYGB7cn0NCg0KI3N1YnNldCB0byBjb3JyZWN0IG1vZGVscyBhbmQgZGF0YQ0KcGF0Y2hlcyA8LSBzdWJzZXQocGF0Y2hlcy5hbGwsIG1vZGVsPT0iY29udHJhc3QgZmVtYWxlcyBWLXR5cGUgfiBwbHVtYWdlIHBhdGNoIikNCnJlZ2lvbnMgPC0gc3Vic2V0KHJlZ2lvbnMuYWxsLCBtb2RlbD09ImNvbnRyYXN0IGZlbWFsZXMgVi10eXBlIH4gcGx1bWFnZSByZWdpb24iKQ0KDQpkYXRhLmFsbCR2YXJpYWJsZSA8LSBkYXRhLmFsbCRtZWFuLmNvbnQudi5mZW1hbGUgDQoNCnJlZ2lvbnMkbGV0dGVycyA8LSB0b3VwcGVyKHJlZ2lvbnMkbGV0dGVycykNCg0KcD0oZ2dwbG90KGRhdGE9cGF0Y2hlcywgYWVzKHg9Y29vcmQueCswLjI1LCB5PWNvb3JkLnkrMC4zLCBjb2xvdXI9cG9zdC5tZWFuLCBsYWJlbD1hcy5jaGFyYWN0ZXIocGF0Y2gubmFtZSkpKQ0KICAgK2dlb21fcG9pbnQoc2l6ZT0xMikNCiAgICtnZW9tX3RleHQoY29sb3VyPSdyZWQnKQ0KICAgK3NjYWxlX2NvbG91cl92aXJpZGlzKGxpbWl0cz1jKDIuMzUsIDIuODEpKQ0KICAgK3RoZW1lX3ZvaWQoKQ0KICAgK3RoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpDQogICArdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgICt0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQ0KICAgK2xhYnMoY29sb3VyPSJjb250cmFzdCAoam5kKSIpDQogICArc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDIsNykpDQogICArc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDIsNikpDQogICArZ2d0aXRsZSgiQ29uc3BpY3VvdXNuZXNzIGZlbWFsZXMiKQ0KKQ0KDQpmaWcxYyA8LSBnZ2JhY2tncm91bmQocCwgaW1nKQ0KDQoNCmZpZzFkIDwtIChnZ3Bsb3QoZGF0YT1wYXRjaGVzLCBhZXMoeD1mYWN0b3IocGF0Y2gubmFtZSwgbGV2ZWxzPWMoJ2ZyJywnY3InLCdjaCcsInRoIiwnZG4nLCJ1YmsiLCJsYmsiLCJydSIsImR0cCIsImR0ZCIsIndzIiwid3AiLCJ2biIsInViciIsImxiciIsImJlIiwidmUiKSwgb3JkZXJlZD1UKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgeT1wb3N0Lm1lYW4sIGxhYmVsPWxldHRlcnMgKSkNCitnZW9tX2ppdHRlcihkYXRhPWRhdGEuYWxsLCBhZXMoeD1mYWN0b3IocGF0Y2gubmFtZSwgbGV2ZWxzPWMoJ2ZyJywnY3InLCdjaCcsInRoIiwnZG4nLCJ1YmsiLCJsYmsiLCJydSIsImR0cCIsImR0ZCIsIndzIiwid3AiLCJ2biIsInViciIsImxiciIsImJlIiwidmUiKSwgb3JkZXJlZD1UKSwgeT0xMF52YXJpYWJsZSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0nZGFyayBncmV5JywgYWxwaGE9MC4zKQ0KK2dlb21fcG9pbnQoc2l6ZT00KQ0KK2dlb21fZXJyb3JiYXIoIGFlcyh5bWluPWNpLmxiLCB5bWF4PWNpLnViKSwgd2lkdGg9MCkNCitnZW9tX3RleHQoYWVzKHk9Y2kubGItMC4yLCB4PWZhY3RvcihwYXRjaC5uYW1lLCBsZXZlbHM9YygnZnInLCdjcicsJ2NoJywidGgiLCdkbicsInViayIsImxiayIsInJ1IiwiZHRwIiwiZHRkIiwid3MiLCJ3cCIsInZuIiwidWJyIiwibGJyIiwiYmUiLCJ2ZSIpLCBvcmRlcmVkPVQpKSwgYW5nbGU9NDUpDQorZ2VvbV9lcnJvcmJhcihkYXRhPXJlZ2lvbnMsIGFlcyh4PWMoOC41LDE1LjUsMi41KSwgeW1pbj1jaS5sYiwgeW1heD1jaS51YiksIHdpZHRoPTAsIHNpemU9MSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fcG9pbnQoZGF0YT1yZWdpb25zLCBhZXMoeD1jKDguNSwxNS41LDIuNSksIHk9cG9zdC5tZWFuKSwgYWxwaGE9MSwgc2l6ZT01LCBzaGFwZT0xOCwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdmxpbmUoeGludGVyY2VwdD00LjUpDQorZ2VvbV92bGluZSh4aW50ZXJjZXB0PTEyLjUpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1jKCJoZWFkIiksIHg9YygyLjUpLCB5PWMoMC42NSkpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1yZWdpb25zJGxldHRlcnNbM10sIHg9YygyLjUpLCB5PWMoMC41KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPWMoImRvcnNhbCIpLCB4PWMoOC41KSwgeT1jKDAuNjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzFdLCB4PWMoOC41KSwgeT1jKDAuNSkpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1jKCJ2ZW50cmFsIiksIHg9YygxNS41KSwgeT1jKDAuNjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzJdLCB4PWMoMTUuNSksIHk9YygwLjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK3NjYWxlX3lfbG9nMTAobmFtZT0nY29udHJhc3QgYWdhaW5zdCBiYWNrZ3JvdW5kIChqbmQpJywgYnJlYWtzPWMoMSwyLDMsNCw1LDEwLDIwLDMwKSkNCitzY2FsZV94X2Rpc2NyZXRlKG5hbWU9J3BhdGNoIG5hbWUnKQ0KK3RoZW1lX2J3KCkNCit0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCikNCg0KDQpgYGANCg0KYGBge3J9DQpmaWcxYw0KYGBgDQoNCmBgYHtyfQ0KZmlnMWQNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dzYXZlKHBsb3Q9ZmlnMWMsIGZpbGVuYW1lPSdmaWcxYy5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAyMCwgaGVpZ2h0PTEwLCB1bml0cyA9ICdjbScsIGRwaT02MDApIA0KZ2dzYXZlKHBsb3Q9ZmlnMWQsIGZpbGVuYW1lPSdmaWcxZC5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAxMywgaGVpZ2h0PTcsIHVuaXRzID0gJ2NtJywgZHBpPTYwMCkNCmBgYA0KDQoNCiNTZXh1YWwgZGljaHJvbWF0aXNtIFYtdHlwZQ0KYGBge3J9DQoNCiNzdWJzZXQgdG8gY29ycmVjdCBtb2RlbHMgYW5kIGRhdGENCnBhdGNoZXMgPC0gc3Vic2V0KHBhdGNoZXMuYWxsLCBtb2RlbD09InNleHVhbCBkaWNocm9tYXRpc20gVi10eXBlIH4gcGx1bWFnZSBwYXRjaCIpDQpyZWdpb25zIDwtIHN1YnNldChyZWdpb25zLmFsbCwgbW9kZWw9PSJzZXh1YWwgZGljaHJvbWF0aXNtIFYtdHlwZSB+IHBsdW1hZ2UgcmVnaW9uIikNCg0KZGF0YS5hbGwkdmFyaWFibGUgPC0gZGF0YS5hbGwkc2V4LmRpY2gudiANCg0KcmVnaW9ucyRsZXR0ZXJzIDwtIHRvdXBwZXIocmVnaW9ucyRsZXR0ZXJzKQ0KDQpwPShnZ3Bsb3QoZGF0YT1wYXRjaGVzLCBhZXMoeD1jb29yZC54KzAuMjUsIHk9Y29vcmQueSswLjMsIGNvbG91cj1wb3N0Lm1lYW4sIGxhYmVsPWFzLmNoYXJhY3RlcihwYXRjaC5uYW1lKSkpDQogICArZ2VvbV9wb2ludChzaXplPTEyKQ0KICAgK2dlb21fdGV4dChjb2xvdXI9J3JlZCcpDQogICArc2NhbGVfY29sb3VyX3ZpcmlkaXMoKQ0KICAgK3RoZW1lX3ZvaWQoKQ0KICAgK3RoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpDQogICArdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgICt0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQ0KICAgK2xhYnMoY29sb3VyPSJjb250cmFzdCAoam5kKSIpDQogICArc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDIsNykpDQogICArc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDIsNikpDQogICArZ2d0aXRsZSgiU2V4dWFsIGRpY2hyb21hdGlzbSIpDQopDQoNCmZpZzFlIDwtIGdnYmFja2dyb3VuZChwLCBpbWcpDQoNCg0KZmlnMWYgPC0gKGdncGxvdChkYXRhPXBhdGNoZXMsIGFlcyh4PWZhY3RvcihwYXRjaC5uYW1lLCBsZXZlbHM9YygnZnInLCdjcicsJ2NoJywidGgiLCdkbicsInViayIsImxiayIsInJ1IiwiZHRwIiwiZHRkIiwid3MiLCJ3cCIsInZuIiwidWJyIiwibGJyIiwiYmUiLCJ2ZSIpLCBvcmRlcmVkPVQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5PXBvc3QubWVhbiwgbGFiZWw9bGV0dGVycyApKQ0KK2dlb21faml0dGVyKGRhdGE9ZGF0YS5hbGwsIGFlcyh4PWZhY3RvcihwYXRjaC5uYW1lLCBsZXZlbHM9YygnZnInLCdjcicsJ2NoJywidGgiLCdkbicsInViayIsImxiayIsInJ1IiwiZHRwIiwiZHRkIiwid3MiLCJ3cCIsInZuIiwidWJyIiwibGJyIiwiYmUiLCJ2ZSIpLCBvcmRlcmVkPVQpLCB5PXZhcmlhYmxlKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdkYXJrIGdyZXknLCBhbHBoYT0wLjMpDQorZ2VvbV9wb2ludChzaXplPTQpDQorZ2VvbV9lcnJvcmJhciggYWVzKHltaW49Y2kubGIsIHltYXg9Y2kudWIpLCB3aWR0aD0wKQ0KK2dlb21fdGV4dChhZXMoeT0wLjIsIHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCkpLCBhbmdsZT00NSkNCitnZW9tX2Vycm9yYmFyKGRhdGE9cmVnaW9ucywgYWVzKHg9Yyg4LjUsMTUuNSwyLjUpLCB5bWluPWNpLmxiLCB5bWF4PWNpLnViKSwgd2lkdGg9MCwgc2l6ZT0xLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV9wb2ludChkYXRhPXJlZ2lvbnMsIGFlcyh4PWMoOC41LDE1LjUsMi41KSwgeT1wb3N0Lm1lYW4pLCBhbHBoYT0xLCBzaXplPTUsIHNoYXBlPTE4LCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQuNSkNCitnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTIuNSkNCitnZW9tX3RleHQoYWVzKGxhYmVsPWMoImhlYWQiKSwgeD1jKDIuNSksIHk9YygwLjAyKSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1szXSwgeD1jKDIuNSksIHk9YygwLjAxKSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPWMoImRvcnNhbCIpLCB4PWMoOC41KSwgeT1jKDAuMDIpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzFdLCB4PWMoOC41KSwgeT1jKDAuMDEpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygidmVudHJhbCIpLCB4PWMoMTUuNSksIHk9YygwLjAyKSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1syXSwgeD1jKDE1LjUpLCB5PWMoMC4wMSkpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorc2NhbGVfeV9sb2cxMChuYW1lPSdjb250cmFzdCBmZW1hbGVzL21hbGVzIChqbmQpJywgYnJlYWtzPWMoMSwyLDUsMTAsMjAsMzApKQ0KK3NjYWxlX3hfZGlzY3JldGUobmFtZT0ncGF0Y2ggbmFtZScpDQordGhlbWVfYncoKQ0KK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCikNCg0KDQpgYGANCg0KYGBge3J9DQpmaWcxZQ0KYGBgDQoNCmBgYHtyfQ0KZmlnMWYNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dzYXZlKHBsb3Q9ZmlnMWUsIGZpbGVuYW1lPSdmaWcxZS5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAyMCwgaGVpZ2h0PTEwLCB1bml0cyA9ICdjbScsIGRwaT02MDApIA0KZ2dzYXZlKHBsb3Q9ZmlnMWYsIGZpbGVuYW1lPSdmaWcxZi5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAxMywgaGVpZ2h0PTcsIHVuaXRzID0gJ2NtJywgZHBpPTYwMCkNCmBgYA0KDQoNCg0KDQoNCiMjVS10eXBlIHZpc3VhbCBzZW5zaXRpdml0aWVzDQoNCg0KI01hbGUgIGNvbnRyYXN0DQoNCg0KYGBge3J9DQoNCiNzdWJzZXQgdG8gY29ycmVjdCBtb2RlbHMgYW5kIGRhdGENCnBhdGNoZXMgPC0gc3Vic2V0KHBhdGNoZXMuYWxsLCBtb2RlbD09ImNvbnRyYXN0IG1hbGVzIFUtdHlwZSB+IHBsdW1hZ2UgcGF0Y2giKQ0KcmVnaW9ucyA8LSBzdWJzZXQocmVnaW9ucy5hbGwsIG1vZGVsPT0iY29udHJhc3QgbWFsZXMgVS10eXBlIH4gcGx1bWFnZSByZWdpb24iKQ0KDQpkYXRhLmFsbCR2YXJpYWJsZSA8LSBkYXRhLmFsbCRtZWFuLmNvbnQudS5tYWxlIA0KDQpyZWdpb25zJGxldHRlcnMgPC0gdG91cHBlcihyZWdpb25zJGxldHRlcnMpDQoNCnA9KGdncGxvdChkYXRhPXBhdGNoZXMsIGFlcyh4PWNvb3JkLngrMC4yNSwgeT1jb29yZC55KzAuMywgY29sb3VyPXBvc3QubWVhbiwgbGFiZWw9YXMuY2hhcmFjdGVyKHBhdGNoLm5hbWUpKSkNCiAgICtnZW9tX3BvaW50KHNpemU9MTIpDQogICArZ2VvbV90ZXh0KGNvbG91cj0ncmVkJykNCiAgICtzY2FsZV9jb2xvdXJfdmlyaWRpcyhsaW1pdHM9YygzLjEsIDMuNzEpKQ0KICAgK3RoZW1lX3ZvaWQoKQ0KICAgK3RoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpDQogICArdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgICt0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQ0KICAgK2xhYnMoY29sb3VyPSJjb250cmFzdCAoam5kKSIpDQogICArc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDIsNykpDQogICArc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDIsNikpDQogICArZ2d0aXRsZSgiQ29uc3BpY3VvdXNuZXNzIG1hbGVzIikNCikNCg0KDQoNCg0KDQpmaWcxYS51IDwtIGdnYmFja2dyb3VuZChwLCBpbWcpDQoNCg0KZmlnMWIudSA8LSAoZ2dwbG90KGRhdGE9cGF0Y2hlcywgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHk9cG9zdC5tZWFuLCBsYWJlbD1sZXR0ZXJzICkpDQorZ2VvbV9qaXR0ZXIoZGF0YT1kYXRhLmFsbCwgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksIHk9MTBedmFyaWFibGUpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J2RhcmsgZ3JleScsIGFscGhhPTAuMykNCitnZW9tX3BvaW50KHNpemU9NCkNCitnZW9tX2Vycm9yYmFyKCBhZXMoeW1pbj1jaS5sYiwgeW1heD1jaS51YiksIHdpZHRoPTApDQorZ2VvbV90ZXh0KGFlcyh5PWNpLmxiLTAuMiwgeD1mYWN0b3IocGF0Y2gubmFtZSwgbGV2ZWxzPWMoJ2ZyJywnY3InLCdjaCcsInRoIiwnZG4nLCJ1YmsiLCJsYmsiLCJydSIsImR0cCIsImR0ZCIsIndzIiwid3AiLCJ2biIsInViciIsImxiciIsImJlIiwidmUiKSwgb3JkZXJlZD1UKSksIGFuZ2xlPTQ1KQ0KK2dlb21fZXJyb3JiYXIoZGF0YT1yZWdpb25zLCBhZXMoeD1jKDguNSwxNS41LDIuNSksIHltaW49Y2kubGIsIHltYXg9Y2kudWIpLCB3aWR0aD0wLCBzaXplPTEsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3BvaW50KGRhdGE9cmVnaW9ucywgYWVzKHg9Yyg4LjUsMTUuNSwyLjUpLCB5PXBvc3QubWVhbiksIGFscGhhPTEsIHNpemU9NSwgc2hhcGU9MTgsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NC41KQ0KK2dlb21fdmxpbmUoeGludGVyY2VwdD0xMi41KQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygiaGVhZCIpLCB4PWMoMi41KSwgeT1jKDAuNjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzNdLCB4PWMoMi41KSwgeT1jKDAuNSkpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1jKCJkb3JzYWwiKSwgeD1jKDguNSksIHk9YygwLjY1KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1sxXSwgeD1jKDguNSksIHk9YygwLjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygidmVudHJhbCIpLCB4PWMoMTUuNSksIHk9YygwLjY1KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1syXSwgeD1jKDE1LjUpLCB5PWMoMC41KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitzY2FsZV95X2xvZzEwKG5hbWU9J2NvbnRyYXN0IGFnYWluc3QgYmFja2dyb3VuZCAoam5kKScsIGJyZWFrcz1jKDEsMiwzLDQsNSwxMCwyMCwzMCkpDQorc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSdwYXRjaCBuYW1lJykNCit0aGVtZV9idygpDQordGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KKQ0KYGBgDQoNCg0KYGBge3J9DQpmaWcxYS51DQpgYGANCg0KYGBge3J9DQpmaWcxYi51DQpgYGANCg0KDQoNCmBgYHtyfQ0KZ2dzYXZlKHBsb3Q9ZmlnMWEudSwgZmlsZW5hbWU9J2ZpZzFhLnUucG5nJywgZGV2aWNlID0gJ3BuZycsIHdpZHRoID0gMjAsIGhlaWdodD0xMCwgdW5pdHMgPSAnY20nLCBkcGk9NjAwKSANCmdnc2F2ZShwbG90PWZpZzFiLnUsIGZpbGVuYW1lPSdmaWcxYi51LnBuZycsIGRldmljZSA9ICdwbmcnLCB3aWR0aCA9IDEzLCBoZWlnaHQ9NywgdW5pdHMgPSAnY20nLCBkcGk9NjAwKQ0KYGBgDQoNCg0KDQojQ29udHJhc3QgZmVtYWxlcyBVLXR5cGUNCg0KYGBge3J9DQoNCiNzdWJzZXQgdG8gY29ycmVjdCBtb2RlbHMgYW5kIGRhdGENCnBhdGNoZXMgPC0gc3Vic2V0KHBhdGNoZXMuYWxsLCBtb2RlbD09ImNvbnRyYXN0IGZlbWFsZXMgVS10eXBlIH4gcGx1bWFnZSBwYXRjaCIpDQpyZWdpb25zIDwtIHN1YnNldChyZWdpb25zLmFsbCwgbW9kZWw9PSJjb250cmFzdCBmZW1hbGVzIFUtdHlwZSB+IHBsdW1hZ2UgcmVnaW9uIikNCg0KZGF0YS5hbGwkdmFyaWFibGUgPC0gZGF0YS5hbGwkbWVhbi5jb250LnUuZmVtYWxlIA0KDQpyZWdpb25zJGxldHRlcnMgPC0gdG91cHBlcihyZWdpb25zJGxldHRlcnMpDQoNCnA9KGdncGxvdChkYXRhPXBhdGNoZXMsIGFlcyh4PWNvb3JkLngrMC4yNSwgeT1jb29yZC55KzAuMywgY29sb3VyPXBvc3QubWVhbiwgbGFiZWw9YXMuY2hhcmFjdGVyKHBhdGNoLm5hbWUpKSkNCiAgICtnZW9tX3BvaW50KHNpemU9MTIpDQogICArZ2VvbV90ZXh0KGNvbG91cj0ncmVkJykNCiAgICtzY2FsZV9jb2xvdXJfdmlyaWRpcyhsaW1pdHM9YygzLjEsIDMuNzEpKQ0KICAgK3RoZW1lX3ZvaWQoKQ0KICAgK3RoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpDQogICArdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgICt0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQ0KICAgK2xhYnMoY29sb3VyPSJjb250cmFzdCAoam5kKSIpDQogICArc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDIsNykpDQogICArc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDIsNikpDQogICArZ2d0aXRsZSgiQ29uc3BpY3VvdXNuZXNzIGZlbWFsZXMiKQ0KKQ0KDQoNCg0KDQpmaWcxYy51IDwtIGdnYmFja2dyb3VuZChwLCBpbWcpDQoNCg0KZmlnMWQudSA8LSAoZ2dwbG90KGRhdGE9cGF0Y2hlcywgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHk9cG9zdC5tZWFuLCBsYWJlbD1sZXR0ZXJzICkpDQorZ2VvbV9qaXR0ZXIoZGF0YT1kYXRhLmFsbCwgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksIHk9MTBedmFyaWFibGUpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J2RhcmsgZ3JleScsIGFscGhhPTAuMykNCitnZW9tX3BvaW50KHNpemU9NCkNCitnZW9tX2Vycm9yYmFyKCBhZXMoeW1pbj1jaS5sYiwgeW1heD1jaS51YiksIHdpZHRoPTApDQorZ2VvbV90ZXh0KGFlcyh5PWNpLmxiLTAuMiwgeD1mYWN0b3IocGF0Y2gubmFtZSwgbGV2ZWxzPWMoJ2ZyJywnY3InLCdjaCcsInRoIiwnZG4nLCJ1YmsiLCJsYmsiLCJydSIsImR0cCIsImR0ZCIsIndzIiwid3AiLCJ2biIsInViciIsImxiciIsImJlIiwidmUiKSwgb3JkZXJlZD1UKSksIGFuZ2xlPTQ1KQ0KK2dlb21fZXJyb3JiYXIoZGF0YT1yZWdpb25zLCBhZXMoeD1jKDguNSwxNS41LDIuNSksIHltaW49Y2kubGIsIHltYXg9Y2kudWIpLCB3aWR0aD0wLCBzaXplPTEsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3BvaW50KGRhdGE9cmVnaW9ucywgYWVzKHg9Yyg4LjUsMTUuNSwyLjUpLCB5PXBvc3QubWVhbiksIGFscGhhPTEsIHNpemU9NSwgc2hhcGU9MTgsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NC41KQ0KK2dlb21fdmxpbmUoeGludGVyY2VwdD0xMi41KQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygiaGVhZCIpLCB4PWMoMi41KSwgeT1jKDAuNjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzNdLCB4PWMoMi41KSwgeT1jKDAuNSkpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1jKCJkb3JzYWwiKSwgeD1jKDguNSksIHk9YygwLjY1KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1sxXSwgeD1jKDguNSksIHk9YygwLjUpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygidmVudHJhbCIpLCB4PWMoMTUuNSksIHk9YygwLjY1KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3RleHQoYWVzKGxhYmVsPXJlZ2lvbnMkbGV0dGVyc1syXSwgeD1jKDE1LjUpLCB5PWMoMC41KSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitzY2FsZV95X2xvZzEwKG5hbWU9J2NvbnRyYXN0IGFnYWluc3QgYmFja2dyb3VuZCAoam5kKScsIGJyZWFrcz1jKDEsMiwzLDQsNSwxMCwyMCwzMCkpDQorc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSdwYXRjaCBuYW1lJykNCit0aGVtZV9idygpDQordGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQopDQoNCg0KYGBgDQoNCmBgYHtyfQ0KZmlnMWMudQ0KYGBgDQpgYGB7cn0NCmZpZzFkLnUNCmBgYA0KDQpgYGB7cn0NCmdnc2F2ZShwbG90PWZpZzFjLnUsIGZpbGVuYW1lPSdmaWcxYy51LnBuZycsIGRldmljZSA9ICdwbmcnLCB3aWR0aCA9IDIwLCBoZWlnaHQ9MTAsIHVuaXRzID0gJ2NtJywgZHBpPTYwMCkgDQpnZ3NhdmUocGxvdD1maWcxZC51LCBmaWxlbmFtZT0nZmlnMWQudS5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAxMywgaGVpZ2h0PTcsIHVuaXRzID0gJ2NtJywgZHBpPTYwMCkNCg0KYGBgDQoNCiNzZXh1YWwgZGljaHJvbWF0aXNtDQpgYGB7cn0NCg0KI3N1YnNldCB0byBjb3JyZWN0IG1vZGVscyBhbmQgZGF0YQ0KcGF0Y2hlcyA8LSBzdWJzZXQocGF0Y2hlcy5hbGwsIG1vZGVsPT0ic2V4dWFsIGRpY2hyb21hdGlzbSBVLXR5cGUgfiBwbHVtYWdlIHBhdGNoIikNCnJlZ2lvbnMgPC0gc3Vic2V0KHJlZ2lvbnMuYWxsLCBtb2RlbD09InNleHVhbCBkaWNocm9tYXRpc20gVS10eXBlIH4gcGx1bWFnZSByZWdpb24iKQ0KDQpkYXRhLmFsbCR2YXJpYWJsZSA8LSBkYXRhLmFsbCRzZXguZGljaC51IA0KDQpyZWdpb25zJGxldHRlcnMgPC0gdG91cHBlcihyZWdpb25zJGxldHRlcnMpDQoNCnA9KGdncGxvdChkYXRhPXBhdGNoZXMsIGFlcyh4PWNvb3JkLngrMC4yNSwgeT1jb29yZC55KzAuMywgY29sb3VyPXBvc3QubWVhbiwgbGFiZWw9YXMuY2hhcmFjdGVyKHBhdGNoLm5hbWUpKSkNCiAgICtnZW9tX3BvaW50KHNpemU9MTIpDQogICArc2NhbGVfY29sb3VyX3ZpcmlkaXMoKQ0KICAgK2dlb21fdGV4dChjb2xvdXI9J3JlZCcpDQogICArdGhlbWVfdm9pZCgpDQogICArdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgICt0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkscGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpKQ0KICAgK3RoZW1lKGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCkpDQogICArbGFicyhjb2xvdXI9ImNvbnRyYXN0IChqbmQpIikNCiAgICtzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMiw3KSkNCiAgICtzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMiw2KSkNCiAgICtnZ3RpdGxlKCJTZXh1YWwgZGljaHJvbWF0aXNtIikNCikNCg0KDQpmaWcxZS51IDwtIGdnYmFja2dyb3VuZChwLCBpbWcpDQoNCg0KZmlnMWYudSA8LSAoZ2dwbG90KGRhdGE9cGF0Y2hlcywgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHk9cG9zdC5tZWFuLCBsYWJlbD1sZXR0ZXJzICkpDQorZ2VvbV9qaXR0ZXIoZGF0YT1kYXRhLmFsbCwgYWVzKHg9ZmFjdG9yKHBhdGNoLm5hbWUsIGxldmVscz1jKCdmcicsJ2NyJywnY2gnLCJ0aCIsJ2RuJywidWJrIiwibGJrIiwicnUiLCJkdHAiLCJkdGQiLCJ3cyIsIndwIiwidm4iLCJ1YnIiLCJsYnIiLCJiZSIsInZlIiksIG9yZGVyZWQ9VCksIHk9dmFyaWFibGUpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J2RhcmsgZ3JleScsIGFscGhhPTAuMykNCitnZW9tX3BvaW50KHNpemU9NCkNCitnZW9tX2Vycm9yYmFyKCBhZXMoeW1pbj1jaS5sYiwgeW1heD1jaS51YiksIHdpZHRoPTApDQorZ2VvbV90ZXh0KGFlcyh5PTAuMiwgeD1mYWN0b3IocGF0Y2gubmFtZSwgbGV2ZWxzPWMoJ2ZyJywnY3InLCdjaCcsInRoIiwnZG4nLCJ1YmsiLCJsYmsiLCJydSIsImR0cCIsImR0ZCIsIndzIiwid3AiLCJ2biIsInViciIsImxiciIsImJlIiwidmUiKSwgb3JkZXJlZD1UKSksIGFuZ2xlPTQ1KQ0KK2dlb21fZXJyb3JiYXIoZGF0YT1yZWdpb25zLCBhZXMoeD1jKDguNSwxNS41LDIuNSksIHltaW49Y2kubGIsIHltYXg9Y2kudWIpLCB3aWR0aD0wLCBzaXplPTEsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3BvaW50KGRhdGE9cmVnaW9ucywgYWVzKHg9Yyg4LjUsMTUuNSwyLjUpLCB5PXBvc3QubWVhbiksIGFscGhhPTEsIHNpemU9NSwgc2hhcGU9MTgsIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NC41KQ0KK2dlb21fdmxpbmUoeGludGVyY2VwdD0xMi41KQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygiaGVhZCIpLCB4PWMoMi41KSwgeT1jKDAuMDIpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzNdLCB4PWMoMi41KSwgeT1jKDAuMDEpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9YygiZG9yc2FsIiksIHg9Yyg4LjUpLCB5PWMoMC4wMikpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1yZWdpb25zJGxldHRlcnNbMV0sIHg9Yyg4LjUpLCB5PWMoMC4wMSkpLCBpbmhlcml0LmFlcz1GLCBjb2xvdXI9J3JlZCcpDQorZ2VvbV90ZXh0KGFlcyhsYWJlbD1jKCJ2ZW50cmFsIiksIHg9YygxNS41KSwgeT1jKDAuMDIpKSwgaW5oZXJpdC5hZXM9RiwgY29sb3VyPSdyZWQnKQ0KK2dlb21fdGV4dChhZXMobGFiZWw9cmVnaW9ucyRsZXR0ZXJzWzJdLCB4PWMoMTUuNSksIHk9YygwLjAxKSksIGluaGVyaXQuYWVzPUYsIGNvbG91cj0ncmVkJykNCitzY2FsZV95X2xvZzEwKG5hbWU9J2NvbnRyYXN0IGZlbWFsZXMvbWFsZXMgKGpuZCknLCBicmVha3M9YygxLDIsNSwxMCwyMCwzMCkpDQorc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSdwYXRjaCBuYW1lJykNCit0aGVtZV9idygpDQordGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQopDQoNCg0KYGBgDQoNCmBgYHtyfQ0KZmlnMWUudQ0KYGBgDQoNCmBgYHtyfQ0KZmlnMWYudQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmdnc2F2ZShwbG90PWZpZzFlLnUsIGZpbGVuYW1lPSdmaWcxZS51LnBuZycsIGRldmljZSA9ICdwbmcnLCB3aWR0aCA9IDIwLCBoZWlnaHQ9MTAsIHVuaXRzID0gJ2NtJywgZHBpPTYwMCkgDQpnZ3NhdmUocGxvdD1maWcxZi51LCBmaWxlbmFtZT0nZmlnMWYudS5wbmcnLCBkZXZpY2UgPSAncG5nJywgd2lkdGggPSAxMywgaGVpZ2h0PTcsIHVuaXRzID0gJ2NtJywgZHBpPTYwMCkNCg0KDQpgYGANCg0KDQoNCg0K