Clearing environment
rm(list = ls())
Loading necessary package
require(deSolve)
System of DEs
SARSCOV2Model <- function (t, y, params) {
S.h<-y[1] #create local variable S, first element of y
E.h<-y[2]
I.h<-y[3]
S.l<-y[4]
E.l<-y[5]
I.l<-y[6]
Q<-y[7]
R<-y[8]
V<-y[9]
with(
as.list(params, y),
{
dS.h<--q*beta*(I.h+I.l)*S.h/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)-c*(1-exp((-1/K)*V))*S.h
dE.h<-q*beta*(I.h+I.l)*S.h/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)+c*(1-exp((-1/K)*V))*S.h-lambda*E.h
dI.h<-lambda*E.h-b*g*I.h-aH*h*(1-g)*I.h-gammah*(1-h)*(1-g)*I.h
dS.l<--(1-p)*q*beta*(I.h+I.l)*S.l/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)-(1-p)*c*(1-exp((-1/K)*V))*S.l
dE.l<-(1-p)*q*beta*(I.h+I.l)/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)+(1-p)*c*(1-exp((-1/K)*V))*S.l-lambda*E.l
dI.l<-lambda*E.l-b*I.l
dQ<-b*I.l+g*b*I.h-aQ*h*Q-gammaQ*(1-h)*Q
dR<-gammah*(1-h)*(1-g)*I.h+gammaQ*(1-h)*Q
dV<-omega*I.h+(1-p)*omega*I.l-delta*V
dy<-c(dS.h,dE.h,dI.h,dS.l,dE.l,dI.l,dQ,dR,dV) #combine results into one vector dy
list(dy)
}
)
}
Initial Values
times<-seq(0,180,by=1)
covid.params<-c(q=0.2,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=10000)
ystart<-c(S.h=(.2)*100000,E.h=0,I.h=1,S.l=(1-0.2)*100000,E.l=0,I.l=0,Q=0,R=0,V=0)
covid.out <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params))
Changing q to 0, 0.2, 0.4, 0.6, 0.8, & 1
times.q<-seq(0,270,by=1)
covid.params.q1 <- c(q=0,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=1000000)
covid.params.q2 <- c(q=0.2,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=1000000)
covid.params.q3 <- c(q=0.4,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=1000000)
covid.params.q4 <- c(q=0.6,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=1000000)
covid.params.q5 <- c(q=0.8,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=1000000)
covid.params.q6 <- c(q=1,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=1000000)
Creating data frame for each value of q
covid.out.q1 <- as.data.frame(lsoda(ystart,times.q,SARSCOV2Model,covid.params.q1))
covid.out.q2 <- as.data.frame(lsoda(ystart,times.q,SARSCOV2Model,covid.params.q2))
covid.out.q3 <- as.data.frame(lsoda(ystart,times.q,SARSCOV2Model,covid.params.q3))
covid.out.q4 <- as.data.frame(lsoda(ystart,times.q,SARSCOV2Model,covid.params.q4))
covid.out.q5 <- as.data.frame(lsoda(ystart,times.q,SARSCOV2Model,covid.params.q5))
covid.out.q6 <- as.data.frame(lsoda(ystart,times.q,SARSCOV2Model,covid.params.q6))
Plotting all classes
## SUSCEPTIBLES ##
op1 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))
plot(covid.out.q1$S.h~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Susceptible (High)", ylim=c(0,20000))
lines(covid.out.q2$S.h~covid.out.q2$time, col="red")
lines(covid.out.q3$S.h~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$S.h~covid.out.q4$time, col="orange")
lines(covid.out.q5$S.h~covid.out.q5$time, col="purple")
lines(covid.out.q6$S.h~covid.out.q6$time, col="green")
legend(180, 18000,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.q1$S.l~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Susceptible (Low)",ylim=c(0,80000))
lines(covid.out.q2$S.l~covid.out.q2$time, col="red")
lines(covid.out.q3$S.l~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$S.l~covid.out.q4$time, col="orange")
lines(covid.out.q5$S.l~covid.out.q5$time, col="purple")
lines(covid.out.q6$S.l~covid.out.q6$time, col="green")
legend(180, 72000,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(op1)
## EXPOSED ##
op2 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))

plot(covid.out.q1$E.h~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Exposed (High)", ylim=c(0,10500))
lines(covid.out.q2$E.h~covid.out.q2$time, col="red")
lines(covid.out.q3$E.h~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$E.h~covid.out.q4$time, col="orange")
lines(covid.out.q5$E.h~covid.out.q5$time, col="purple")
lines(covid.out.q6$E.h~covid.out.q6$time, col="green")
legend(150, 8000,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.q1$E.l~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Exposed (Low)", ylim=c(0,8))
lines(covid.out.q2$E.l~covid.out.q2$time, col="red")
lines(covid.out.q3$E.l~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$E.l~covid.out.q4$time, col="orange")
lines(covid.out.q5$E.l~covid.out.q5$time, col="purple")
lines(covid.out.q6$E.l~covid.out.q6$time, col="green")
legend(150, 6,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(op2)
## INFECTED ##
op3 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))

plot(covid.out.q1$I.h~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Infected (High)", ylim=c(0,5000))
lines(covid.out.q2$I.h~covid.out.q2$time, col="red")
lines(covid.out.q3$I.h~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$I.h~covid.out.q4$time, col="orange")
lines(covid.out.q5$I.h~covid.out.q5$time, col="purple")
lines(covid.out.q6$I.h~covid.out.q6$time, col="green")
legend(150, 4000,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.q1$I.l~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Infected (Low)", ylim=c(0,1.4))
lines(covid.out.q2$I.l~covid.out.q2$time, col="red")
lines(covid.out.q3$I.l~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$I.l~covid.out.q4$time, col="orange")
lines(covid.out.q5$I.l~covid.out.q5$time, col="purple")
lines(covid.out.q6$I.l~covid.out.q6$time, col="green")
legend(150, 1.1,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(op3)
## SELF-ISOLATING ##
op4 <- par(mar=c(6,6,2,2))

plot(covid.out.q1$Q~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Self-Isolating", ylim=c(0,10))
lines(covid.out.q2$Q~covid.out.q2$time, col="red")
lines(covid.out.q3$Q~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$Q~covid.out.q4$time, col="orange")
lines(covid.out.q5$Q~covid.out.q5$time, col="purple")
lines(covid.out.q6$Q~covid.out.q6$time, col="green")
legend(200, 8,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(op4)
## RECOVERED ##
op5 <- par(mar=c(6,6,2,2))

plot(covid.out.q1$R~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Recovered", ylim=c(0,20000))
lines(covid.out.q2$R~covid.out.q2$time, col="red")
lines(covid.out.q3$R~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$R~covid.out.q4$time, col="orange")
lines(covid.out.q5$R~covid.out.q5$time, col="purple")
lines(covid.out.q6$R~covid.out.q6$time, col="green")
legend(210, 13000,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(op5)
## VIRUS IN ENVIRONMENT ##
op6 <- par(mar=c(6,6,2,2))

plot(covid.out.q1$V~covid.out.q1$time,type="l", col="blue", xlab="Days", ylab = "Virus in Environment")
lines(covid.out.q2$V~covid.out.q2$time, col="red")
lines(covid.out.q3$V~covid.out.q3$time, col="darkturquoise")
lines(covid.out.q4$V~covid.out.q4$time, col="orange")
lines(covid.out.q5$V~covid.out.q5$time, col="purple")
lines(covid.out.q6$V~covid.out.q6$time, col="green")
legend(180, 72000,legend = c("q=0","q=0.2","q=0.4","q=0.6","q=0.8","q=1"), col = c("blue", "red", "darkturquoise", "orange", "purple", "green"), lty=1, cex=0.8)
par(op6)

Results of plots
# first dataframe lists highest values
# second dataframe lists lowest values
# third dataframe lists ending values
results.q1 <- data.frame(
S.h = c(max(covid.out.q1[ ,2]), max(covid.out.q2[ ,2]), max(covid.out.q3[ ,2]), max(covid.out.q4[ ,2]), max(covid.out.q5[ ,2]), max(covid.out.q6[ ,2])),
E.h = c(max(covid.out.q1[ ,3]), max(covid.out.q2[ ,3]), max(covid.out.q3[ ,3]), max(covid.out.q4[ ,3]), max(covid.out.q5[ ,3]), max(covid.out.q6[ ,3])),
I.h = c(max(covid.out.q1[ ,4]), max(covid.out.q2[ ,4]), max(covid.out.q3[ ,4]), max(covid.out.q4[ ,4]), max(covid.out.q5[ ,4]), max(covid.out.q6[ ,4])),
S.l = c(max(covid.out.q1[ ,5]), max(covid.out.q2[ ,5]), max(covid.out.q3[ ,5]), max(covid.out.q4[ ,5]), max(covid.out.q5[ ,5]), max(covid.out.q6[ ,5])),
E.l = c(max(covid.out.q1[ ,6]), max(covid.out.q2[ ,6]), max(covid.out.q3[ ,6]), max(covid.out.q4[ ,6]), max(covid.out.q5[ ,6]), max(covid.out.q6[ ,6])),
I.l = c(max(covid.out.q1[ ,7]), max(covid.out.q2[ ,7]), max(covid.out.q3[ ,7]), max(covid.out.q4[ ,7]), max(covid.out.q5[ ,7]), max(covid.out.q6[ ,7])),
Q = c(max(covid.out.q1[ ,8]), max(covid.out.q2[ ,8]), max(covid.out.q3[ ,8]), max(covid.out.q4[ ,8]), max(covid.out.q5[ ,8]), max(covid.out.q6[ ,8])),
R = c(max(covid.out.q1[ ,9]), max(covid.out.q2[ ,9]), max(covid.out.q3[ ,9]), max(covid.out.q4[ ,9]), max(covid.out.q5[ ,9]), max(covid.out.q6[ ,9])),
V = c(max(covid.out.q1[ ,10]), max(covid.out.q2[ ,10]), max(covid.out.q3[ ,10]), max(covid.out.q4[ ,10]), max(covid.out.q5[ ,10]), max(covid.out.q6[ ,10]))
)
results.q2 <- data.frame(
S.h = c(min(covid.out.q1[ ,2]), min(covid.out.q2[ ,2]), min(covid.out.q3[ ,2]), min(covid.out.q4[ ,2]), min(covid.out.q5[ ,2]), min(covid.out.q6[ ,2])),
E.h = c(min(covid.out.q1[ ,3]), min(covid.out.q2[ ,3]), min(covid.out.q3[ ,3]), min(covid.out.q4[ ,3]), min(covid.out.q5[ ,3]), min(covid.out.q6[ ,3])),
I.h = c(min(covid.out.q1[ ,4]), min(covid.out.q2[ ,4]), min(covid.out.q3[ ,4]), min(covid.out.q4[ ,4]), min(covid.out.q5[ ,4]), min(covid.out.q6[ ,4])),
S.l = c(min(covid.out.q1[ ,5]), min(covid.out.q2[ ,5]), min(covid.out.q3[ ,5]), min(covid.out.q4[ ,5]), min(covid.out.q5[ ,5]), min(covid.out.q6[ ,5])),
E.l = c(min(covid.out.q1[ ,6]), min(covid.out.q2[ ,6]), min(covid.out.q3[ ,6]), min(covid.out.q4[ ,6]), min(covid.out.q5[ ,6]), min(covid.out.q6[ ,6])),
I.l = c(min(covid.out.q1[ ,7]), min(covid.out.q2[ ,7]), min(covid.out.q3[ ,7]), min(covid.out.q4[ ,7]), min(covid.out.q5[ ,7]), min(covid.out.q6[ ,7])),
Q = c(min(covid.out.q1[ ,8]), min(covid.out.q2[ ,8]), min(covid.out.q3[ ,8]), min(covid.out.q4[ ,8]), min(covid.out.q5[ ,8]), min(covid.out.q6[ ,8])),
R = c(min(covid.out.q1[ ,9]), min(covid.out.q2[ ,9]), min(covid.out.q3[ ,9]), min(covid.out.q4[ ,9]), min(covid.out.q5[ ,9]), min(covid.out.q6[ ,9])),
V = c(min(covid.out.q1[ ,10]), min(covid.out.q2[ ,10]), min(covid.out.q3[ ,10]), min(covid.out.q4[ ,10]), min(covid.out.q5[ ,10]), min(covid.out.q6[ ,10]))
)
results.q3 <- data.frame(
S.h = c(tail(covid.out.q1[ ,2],n=1), tail(covid.out.q2[ ,2],n=1), tail(covid.out.q3[ ,2],n=1), tail(covid.out.q4[ ,2],n=1), tail(covid.out.q5[ ,2],n=1), tail(covid.out.q6[ ,2],n=1)),
E.h = c(tail(covid.out.q1[ ,3],n=1), tail(covid.out.q2[ ,3],n=1), tail(covid.out.q3[ ,3],n=1), tail(covid.out.q4[ ,3],n=1), tail(covid.out.q5[ ,3],n=1), tail(covid.out.q6[ ,3],n=1)),
I.h = c(tail(covid.out.q1[ ,4],n=1), tail(covid.out.q2[ ,4],n=1), tail(covid.out.q3[ ,4],n=1), tail(covid.out.q4[ ,4],n=1), tail(covid.out.q5[ ,4],n=1), tail(covid.out.q6[ ,4],n=1)),
S.l = c(tail(covid.out.q1[ ,5],n=1), tail(covid.out.q2[ ,5],n=1), tail(covid.out.q3[ ,5],n=1), tail(covid.out.q4[ ,5],n=1), tail(covid.out.q5[ ,5],n=1), tail(covid.out.q6[ ,5],n=1)),
E.l = c(tail(covid.out.q1[ ,6],n=1), tail(covid.out.q2[ ,6],n=1), tail(covid.out.q3[ ,6],n=1), tail(covid.out.q4[ ,6],n=1), tail(covid.out.q5[ ,6],n=1), tail(covid.out.q6[ ,6],n=1)),
I.l = c(tail(covid.out.q1[ ,7],n=1), tail(covid.out.q2[ ,7],n=1), tail(covid.out.q3[ ,7],n=1), tail(covid.out.q4[ ,7],n=1), tail(covid.out.q5[ ,7],n=1), tail(covid.out.q6[ ,7],n=1)),
Q = c(tail(covid.out.q1[ ,8],n=1), tail(covid.out.q2[ ,8],n=1), tail(covid.out.q3[ ,8],n=1), tail(covid.out.q4[ ,8],n=1), tail(covid.out.q5[ ,8],n=1), tail(covid.out.q6[ ,8],n=1)),
R = c(tail(covid.out.q1[ ,9],n=1), tail(covid.out.q2[ ,9],n=1), tail(covid.out.q3[ ,9],n=1), tail(covid.out.q4[ ,9],n=1), tail(covid.out.q5[ ,9],n=1), tail(covid.out.q6[ ,9],n=1)),
V = c(tail(covid.out.q1[ ,10],n=1), tail(covid.out.q2[ ,10],n=1), tail(covid.out.q3[ ,10],n=1), tail(covid.out.q4[ ,10],n=1), tail(covid.out.q5[ ,10],n=1), tail(covid.out.q6[ ,10],n=1))
)
`.rowNamesDF<-`(results.q1,make.names=FALSE,c('q = 0','q = 0.2','q = 0.4','q = 0.6','q = 0.8','q = 1'))
`.rowNamesDF<-`(results.q2,make.names=FALSE,c('q = 0','q = 0.2','q = 0.4','q = 0.6','q = 0.8','q = 1'))
`.rowNamesDF<-`(results.q3,make.names=FALSE,c('q = 0','q = 0.2','q = 0.4','q = 0.6','q = 0.8','q = 1'))
Plotting highest, lowest, and ending values of classes
## HIGHEST ##
op7 <- par(mar=c(6,6,2,2))
plot(results.q1$S.h,type="b", col="blue", xlab="q values", ylab = "Individuals", main="Highest", ylim=c(0,80000))
lines(results.q1$E.h, type = "b", col="red")
lines(results.q1$I.h, type = "b", col="green")
lines(results.q1$S.l, type = "b", col="purple")
lines(results.q1$E.l, type = "b", col="orange")
lines(results.q1$I.l, type = "b", col="forestgreen")
lines(results.q1$Q, type = "b", col="darkturquoise")
lines(results.q1$R, type = "b", col="pink2")
lines(results.q1$V, type = "b", col="yellow")
legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)
par(op7)
## LOWEST
op8 <- par(mar=c(6,6,2,2))

plot(results.q2$S.h,type="b", col="blue", main="Lowest", xlab="q values", ylab = "Individuals", ylim=c(0,80000))
lines(results.q2$E.h, type = "b", col="red")
lines(results.q2$I.h, type = "b", col="green")
lines(results.q2$S.l, type = "b", col="purple")
lines(results.q2$E.l, type = "b", col="orange")
lines(results.q2$I.l, type = "b", col="forestgreen")
lines(results.q2$Q, type = "b", col="darkturquoise")
lines(results.q2$R, type = "b", col="pink2")
lines(results.q2$V, type = "b", col="yellow")
legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)
par(op8)
## ENDING ##
op9 <- par(mar=c(6,6,2,2))

plot(results.q3$S.h, type="b", col="blue", main="Ending", xlab="q values", ylab = "Individuals", ylim=c(0,80000))
lines(results.q3$E.h, type = "b", col="red")
lines(results.q3$I.h, type = "b", col="green")
lines(results.q3$S.l, type = "b", col="purple")
lines(results.q3$E.l, type = "b", col="orange")
lines(results.q3$I.l, type = "b", col="forestgreen")
lines(results.q3$Q, type = "b", col="darkturquoise")
lines(results.q3$R, type = "b", col="pink2")
lines(results.q3$V, type = "b", col="yellow")
legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)
par(op9)

LS0tDQp0aXRsZTogIlNBUlMtQ29WLTIgTW9kZWwgKHEpIg0KYXV0aG9yOiBTaGVyaWRhbiBQYXluZQ0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCkNsZWFyaW5nIGVudmlyb25tZW50DQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCkxvYWRpbmcgbmVjZXNzYXJ5IHBhY2thZ2UNCmBgYHtyfQ0KcmVxdWlyZShkZVNvbHZlKQ0KYGBgDQoNClN5c3RlbSBvZiBERXMNCmBgYHtyfQ0KU0FSU0NPVjJNb2RlbCA8LSBmdW5jdGlvbiAodCwgeSwgcGFyYW1zKSB7DQogIA0KUy5oPC15WzFdICNjcmVhdGUgbG9jYWwgdmFyaWFibGUgUywgZmlyc3QgZWxlbWVudCBvZiB5DQpFLmg8LXlbMl0gDQpJLmg8LXlbM10NClMubDwteVs0XQ0KRS5sPC15WzVdDQpJLmw8LXlbNl0NClE8LXlbN10NClI8LXlbOF0NClY8LXlbOV0NCg0Kd2l0aCgNCiAgYXMubGlzdChwYXJhbXMsIHkpLA0KICB7DQpkUy5oPC0tcSpiZXRhKihJLmgrSS5sKSpTLmgvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUiktYyooMS1leHAoKC0xL0spKlYpKSpTLmgNCmRFLmg8LXEqYmV0YSooSS5oK0kubCkqUy5oLyhTLmgrRS5oK0kuaCtTLmwrRS5sK0kubCtRK1IpK2MqKDEtZXhwKCgtMS9LKSpWKSkqUy5oLWxhbWJkYSpFLmgNCmRJLmg8LWxhbWJkYSpFLmgtYipnKkkuaC1hSCpoKigxLWcpKkkuaC1nYW1tYWgqKDEtaCkqKDEtZykqSS5oDQpkUy5sPC0tKDEtcCkqcSpiZXRhKihJLmgrSS5sKSpTLmwvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUiktKDEtcCkqYyooMS1leHAoKC0xL0spKlYpKSpTLmwNCmRFLmw8LSgxLXApKnEqYmV0YSooSS5oK0kubCkvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUikrKDEtcCkqYyooMS1leHAoKC0xL0spKlYpKSpTLmwtbGFtYmRhKkUubA0KZEkubDwtbGFtYmRhKkUubC1iKkkubA0KZFE8LWIqSS5sK2cqYipJLmgtYVEqaCpRLWdhbW1hUSooMS1oKSpRDQpkUjwtZ2FtbWFoKigxLWgpKigxLWcpKkkuaCtnYW1tYVEqKDEtaCkqUQ0KZFY8LW9tZWdhKkkuaCsoMS1wKSpvbWVnYSpJLmwtZGVsdGEqVg0KICBkeTwtYyhkUy5oLGRFLmgsZEkuaCxkUy5sLGRFLmwsZEkubCxkUSxkUixkVikgI2NvbWJpbmUgcmVzdWx0cyBpbnRvIG9uZSB2ZWN0b3IgZHkNCmxpc3QoZHkpDQogIH0NCikNCn0NCmBgYA0KDQpJbml0aWFsIFZhbHVlcw0KYGBge3J9DQp0aW1lczwtc2VxKDAsMTgwLGJ5PTEpIA0KY292aWQucGFyYW1zPC1jKHE9MC4yLGJldGE9MTMscD0uMixjPTAsbGFtYmRhPTEvNC40MyxiPTEvMC43NyxnPTAsZ2FtbWFRPTAuMSxnYW1tYWg9MS8yLjcsYVE9MS8xLjkzLGFIPTEvMi43LGg9MC4wMDA4MixvbWVnYT0wLGRlbHRhPTEsSz0xMDAwMCkNCnlzdGFydDwtYyhTLmg9KC4yKSoxMDAwMDAsRS5oPTAsSS5oPTEsUy5sPSgxLTAuMikqMTAwMDAwLEUubD0wLEkubD0wLFE9MCxSPTAsVj0wKQ0KY292aWQub3V0IDwtIGFzLmRhdGEuZnJhbWUobHNvZGEoeXN0YXJ0LHRpbWVzLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zKSkNCmBgYA0KDQpDaGFuZ2luZyBxIHRvIDAsIDAuMiwgMC40LCAwLjYsIDAuOCwgJiAxDQpgYGB7cn0NCnRpbWVzLnE8LXNlcSgwLDI3MCxieT0xKSANCg0KY292aWQucGFyYW1zLnExIDwtIGMocT0wLGJldGE9MTMscD0uMixjPTAsbGFtYmRhPTEvNC40MyxiPTEvMC43NyxnPTAsZ2FtbWFRPTAuMSxnYW1tYWg9MS8yLjcsYVE9MS8xLjkzLGFIPTEvMi43LGg9MC4wMDA4MixvbWVnYT0wLGRlbHRhPTEsSz0xMDAwMDAwKQ0KY292aWQucGFyYW1zLnEyIDwtIGMocT0wLjIsYmV0YT0xMyxwPS4yLGM9MCxsYW1iZGE9MS80LjQzLGI9MS8wLjc3LGc9MCxnYW1tYVE9MC4xLGdhbW1haD0xLzIuNyxhUT0xLzEuOTMsYUg9MS8yLjcsaD0wLjAwMDgyLG9tZWdhPTAsZGVsdGE9MSxLPTEwMDAwMDApDQpjb3ZpZC5wYXJhbXMucTMgPC0gYyhxPTAuNCxiZXRhPTEzLHA9LjIsYz0wLGxhbWJkYT0xLzQuNDMsYj0xLzAuNzcsZz0wLGdhbW1hUT0wLjEsZ2FtbWFoPTEvMi43LGFRPTEvMS45MyxhSD0xLzIuNyxoPTAuMDAwODIsb21lZ2E9MCxkZWx0YT0xLEs9MTAwMDAwMCkNCmNvdmlkLnBhcmFtcy5xNCA8LSBjKHE9MC42LGJldGE9MTMscD0uMixjPTAsbGFtYmRhPTEvNC40MyxiPTEvMC43NyxnPTAsZ2FtbWFRPTAuMSxnYW1tYWg9MS8yLjcsYVE9MS8xLjkzLGFIPTEvMi43LGg9MC4wMDA4MixvbWVnYT0wLGRlbHRhPTEsSz0xMDAwMDAwKQ0KY292aWQucGFyYW1zLnE1IDwtIGMocT0wLjgsYmV0YT0xMyxwPS4yLGM9MCxsYW1iZGE9MS80LjQzLGI9MS8wLjc3LGc9MCxnYW1tYVE9MC4xLGdhbW1haD0xLzIuNyxhUT0xLzEuOTMsYUg9MS8yLjcsaD0wLjAwMDgyLG9tZWdhPTAsZGVsdGE9MSxLPTEwMDAwMDApDQpjb3ZpZC5wYXJhbXMucTYgPC0gYyhxPTEsYmV0YT0xMyxwPS4yLGM9MCxsYW1iZGE9MS80LjQzLGI9MS8wLjc3LGc9MCxnYW1tYVE9MC4xLGdhbW1haD0xLzIuNyxhUT0xLzEuOTMsYUg9MS8yLjcsaD0wLjAwMDgyLG9tZWdhPTAsZGVsdGE9MSxLPTEwMDAwMDApDQpgYGANCg0KQ3JlYXRpbmcgZGF0YSBmcmFtZSBmb3IgZWFjaCB2YWx1ZSBvZiBxDQpgYGB7cn0NCmNvdmlkLm91dC5xMSA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcy5xLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnExKSkNCmNvdmlkLm91dC5xMiA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcy5xLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnEyKSkNCmNvdmlkLm91dC5xMyA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcy5xLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnEzKSkNCmNvdmlkLm91dC5xNCA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcy5xLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnE0KSkNCmNvdmlkLm91dC5xNSA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcy5xLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnE1KSkNCmNvdmlkLm91dC5xNiA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcy5xLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnE2KSkNCmBgYA0KDQpQbG90dGluZyBhbGwgY2xhc3Nlcw0KYGBge3J9DQojIyBTVVNDRVBUSUJMRVMgIyMNCm9wMSA8LSBwYXIoZmlnPWMoMCwwLjUsMCwxKSwgbWFyPWMoNCw0LDEsMSkpDQpwbG90KGNvdmlkLm91dC5xMSRTLmh+Y292aWQub3V0LnExJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIlN1c2NlcHRpYmxlIChIaWdoKSIsIHlsaW09YygwLDIwMDAwKSkNCmxpbmVzKGNvdmlkLm91dC5xMiRTLmh+Y292aWQub3V0LnEyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5xMyRTLmh+Y292aWQub3V0LnEzJHRpbWUsIGNvbD0iZGFya3R1cnF1b2lzZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTQkUy5ofmNvdmlkLm91dC5xNCR0aW1lLCBjb2w9Im9yYW5nZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTUkUy5ofmNvdmlkLm91dC5xNSR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTYkUy5ofmNvdmlkLm91dC5xNiR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxODAsIDE4MDAwLGxlZ2VuZCA9IGMoInE9MCIsInE9MC4yIiwicT0wLjQiLCJxPTAuNiIsInE9MC44IiwicT0xIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImRhcmt0dXJxdW9pc2UiLCAib3JhbmdlIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCg0KcGFyKGZpZz1jKDAuNSwxLDAsMSksIG1hcj1jKDQsNCwxLDEpLCBuZXc9VCkNCnBsb3QoY292aWQub3V0LnExJFMubH5jb3ZpZC5vdXQucTEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiU3VzY2VwdGlibGUgKExvdykiLHlsaW09YygwLDgwMDAwKSkNCmxpbmVzKGNvdmlkLm91dC5xMiRTLmx+Y292aWQub3V0LnEyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5xMyRTLmx+Y292aWQub3V0LnEzJHRpbWUsIGNvbD0iZGFya3R1cnF1b2lzZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTQkUy5sfmNvdmlkLm91dC5xNCR0aW1lLCBjb2w9Im9yYW5nZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTUkUy5sfmNvdmlkLm91dC5xNSR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTYkUy5sfmNvdmlkLm91dC5xNiR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxODAsIDcyMDAwLGxlZ2VuZCA9IGMoInE9MCIsInE9MC4yIiwicT0wLjQiLCJxPTAuNiIsInE9MC44IiwicT0xIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImRhcmt0dXJxdW9pc2UiLCAib3JhbmdlIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCnBhcihvcDEpDQoNCiMjIEVYUE9TRUQgIyMNCm9wMiA8LSBwYXIoZmlnPWMoMCwwLjUsMCwxKSwgbWFyPWMoNCw0LDEsMSkpDQpwbG90KGNvdmlkLm91dC5xMSRFLmh+Y292aWQub3V0LnExJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIkV4cG9zZWQgKEhpZ2gpIiwgeWxpbT1jKDAsMTA1MDApKQ0KbGluZXMoY292aWQub3V0LnEyJEUuaH5jb3ZpZC5vdXQucTIkdGltZSwgY29sPSJyZWQiKQ0KbGluZXMoY292aWQub3V0LnEzJEUuaH5jb3ZpZC5vdXQucTMkdGltZSwgY29sPSJkYXJrdHVycXVvaXNlIikNCmxpbmVzKGNvdmlkLm91dC5xNCRFLmh+Y292aWQub3V0LnE0JHRpbWUsIGNvbD0ib3JhbmdlIikNCmxpbmVzKGNvdmlkLm91dC5xNSRFLmh+Y292aWQub3V0LnE1JHRpbWUsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5xNiRFLmh+Y292aWQub3V0LnE2JHRpbWUsIGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKDE1MCwgODAwMCxsZWdlbmQgPSBjKCJxPTAiLCJxPTAuMiIsInE9MC40IiwicT0wLjYiLCJxPTAuOCIsInE9MSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJkYXJrdHVycXVvaXNlIiwgIm9yYW5nZSIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQoNCnBhcihmaWc9YygwLjUsMSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSwgbmV3PVQpDQpwbG90KGNvdmlkLm91dC5xMSRFLmx+Y292aWQub3V0LnExJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIkV4cG9zZWQgKExvdykiLCB5bGltPWMoMCw4KSkNCmxpbmVzKGNvdmlkLm91dC5xMiRFLmx+Y292aWQub3V0LnEyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5xMyRFLmx+Y292aWQub3V0LnEzJHRpbWUsIGNvbD0iZGFya3R1cnF1b2lzZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTQkRS5sfmNvdmlkLm91dC5xNCR0aW1lLCBjb2w9Im9yYW5nZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTUkRS5sfmNvdmlkLm91dC5xNSR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTYkRS5sfmNvdmlkLm91dC5xNiR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxNTAsIDYsbGVnZW5kID0gYygicT0wIiwicT0wLjIiLCJxPTAuNCIsInE9MC42IiwicT0wLjgiLCJxPTEiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZGFya3R1cnF1b2lzZSIsICJvcmFuZ2UiLCAicHVycGxlIiwgImdyZWVuIiksIGx0eT0xLCBjZXg9MC44KQ0KcGFyKG9wMikNCg0KIyMgSU5GRUNURUQgIyMNCm9wMyA8LSBwYXIoZmlnPWMoMCwwLjUsMCwxKSwgbWFyPWMoNCw0LDEsMSkpDQpwbG90KGNvdmlkLm91dC5xMSRJLmh+Y292aWQub3V0LnExJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIkluZmVjdGVkIChIaWdoKSIsIHlsaW09YygwLDUwMDApKQ0KbGluZXMoY292aWQub3V0LnEyJEkuaH5jb3ZpZC5vdXQucTIkdGltZSwgY29sPSJyZWQiKQ0KbGluZXMoY292aWQub3V0LnEzJEkuaH5jb3ZpZC5vdXQucTMkdGltZSwgY29sPSJkYXJrdHVycXVvaXNlIikNCmxpbmVzKGNvdmlkLm91dC5xNCRJLmh+Y292aWQub3V0LnE0JHRpbWUsIGNvbD0ib3JhbmdlIikNCmxpbmVzKGNvdmlkLm91dC5xNSRJLmh+Y292aWQub3V0LnE1JHRpbWUsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5xNiRJLmh+Y292aWQub3V0LnE2JHRpbWUsIGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKDE1MCwgNDAwMCxsZWdlbmQgPSBjKCJxPTAiLCJxPTAuMiIsInE9MC40IiwicT0wLjYiLCJxPTAuOCIsInE9MSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJkYXJrdHVycXVvaXNlIiwgIm9yYW5nZSIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQoNCnBhcihmaWc9YygwLjUsMSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSwgbmV3PVQpDQpwbG90KGNvdmlkLm91dC5xMSRJLmx+Y292aWQub3V0LnExJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIkluZmVjdGVkIChMb3cpIiwgeWxpbT1jKDAsMS40KSkNCmxpbmVzKGNvdmlkLm91dC5xMiRJLmx+Y292aWQub3V0LnEyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5xMyRJLmx+Y292aWQub3V0LnEzJHRpbWUsIGNvbD0iZGFya3R1cnF1b2lzZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTQkSS5sfmNvdmlkLm91dC5xNCR0aW1lLCBjb2w9Im9yYW5nZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTUkSS5sfmNvdmlkLm91dC5xNSR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTYkSS5sfmNvdmlkLm91dC5xNiR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxNTAsIDEuMSxsZWdlbmQgPSBjKCJxPTAiLCJxPTAuMiIsInE9MC40IiwicT0wLjYiLCJxPTAuOCIsInE9MSIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJkYXJrdHVycXVvaXNlIiwgIm9yYW5nZSIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQpwYXIob3AzKQ0KDQojIyBTRUxGLUlTT0xBVElORyAjIw0Kb3A0IDwtIHBhcihtYXI9Yyg2LDYsMiwyKSkNCnBsb3QoY292aWQub3V0LnExJFF+Y292aWQub3V0LnExJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIlNlbGYtSXNvbGF0aW5nIiwgeWxpbT1jKDAsMTApKQ0KbGluZXMoY292aWQub3V0LnEyJFF+Y292aWQub3V0LnEyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5xMyRRfmNvdmlkLm91dC5xMyR0aW1lLCBjb2w9ImRhcmt0dXJxdW9pc2UiKQ0KbGluZXMoY292aWQub3V0LnE0JFF+Y292aWQub3V0LnE0JHRpbWUsIGNvbD0ib3JhbmdlIikNCmxpbmVzKGNvdmlkLm91dC5xNSRRfmNvdmlkLm91dC5xNSR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTYkUX5jb3ZpZC5vdXQucTYkdGltZSwgY29sPSJncmVlbiIpDQpsZWdlbmQoMjAwLCA4LGxlZ2VuZCA9IGMoInE9MCIsInE9MC4yIiwicT0wLjQiLCJxPTAuNiIsInE9MC44IiwicT0xIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImRhcmt0dXJxdW9pc2UiLCAib3JhbmdlIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCnBhcihvcDQpDQoNCiMjIFJFQ09WRVJFRCAjIw0Kb3A1IDwtIHBhcihtYXI9Yyg2LDYsMiwyKSkNCnBsb3QoY292aWQub3V0LnExJFJ+Y292aWQub3V0LnExJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIlJlY292ZXJlZCIsIHlsaW09YygwLDIwMDAwKSkNCmxpbmVzKGNvdmlkLm91dC5xMiRSfmNvdmlkLm91dC5xMiR0aW1lLCBjb2w9InJlZCIpDQpsaW5lcyhjb3ZpZC5vdXQucTMkUn5jb3ZpZC5vdXQucTMkdGltZSwgY29sPSJkYXJrdHVycXVvaXNlIikNCmxpbmVzKGNvdmlkLm91dC5xNCRSfmNvdmlkLm91dC5xNCR0aW1lLCBjb2w9Im9yYW5nZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTUkUn5jb3ZpZC5vdXQucTUkdGltZSwgY29sPSJwdXJwbGUiKQ0KbGluZXMoY292aWQub3V0LnE2JFJ+Y292aWQub3V0LnE2JHRpbWUsIGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKDIxMCwgMTMwMDAsbGVnZW5kID0gYygicT0wIiwicT0wLjIiLCJxPTAuNCIsInE9MC42IiwicT0wLjgiLCJxPTEiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZGFya3R1cnF1b2lzZSIsICJvcmFuZ2UiLCAicHVycGxlIiwgImdyZWVuIiksIGx0eT0xLCBjZXg9MC44KQ0KcGFyKG9wNSkNCg0KIyMgVklSVVMgSU4gRU5WSVJPTk1FTlQgIyMNCm9wNiA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KGNvdmlkLm91dC5xMSRWfmNvdmlkLm91dC5xMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJWaXJ1cyBpbiBFbnZpcm9ubWVudCIpDQpsaW5lcyhjb3ZpZC5vdXQucTIkVn5jb3ZpZC5vdXQucTIkdGltZSwgY29sPSJyZWQiKQ0KbGluZXMoY292aWQub3V0LnEzJFZ+Y292aWQub3V0LnEzJHRpbWUsIGNvbD0iZGFya3R1cnF1b2lzZSIpDQpsaW5lcyhjb3ZpZC5vdXQucTQkVn5jb3ZpZC5vdXQucTQkdGltZSwgY29sPSJvcmFuZ2UiKQ0KbGluZXMoY292aWQub3V0LnE1JFZ+Y292aWQub3V0LnE1JHRpbWUsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5xNiRWfmNvdmlkLm91dC5xNiR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxODAsIDcyMDAwLGxlZ2VuZCA9IGMoInE9MCIsInE9MC4yIiwicT0wLjQiLCJxPTAuNiIsInE9MC44IiwicT0xIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImRhcmt0dXJxdW9pc2UiLCAib3JhbmdlIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCnBhcihvcDYpDQpgYGANCg0KUmVzdWx0cyBvZiBwbG90cw0KYGBge3J9DQojIGZpcnN0IGRhdGFmcmFtZSBsaXN0cyBoaWdoZXN0IHZhbHVlcw0KIyBzZWNvbmQgZGF0YWZyYW1lIGxpc3RzIGxvd2VzdCB2YWx1ZXMNCiMgdGhpcmQgZGF0YWZyYW1lIGxpc3RzIGVuZGluZyB2YWx1ZXMNCg0KcmVzdWx0cy5xMSA8LSBkYXRhLmZyYW1lKA0KICBTLmggPSBjKG1heChjb3ZpZC5vdXQucTFbICwyXSksIG1heChjb3ZpZC5vdXQucTJbICwyXSksIG1heChjb3ZpZC5vdXQucTNbICwyXSksIG1heChjb3ZpZC5vdXQucTRbICwyXSksIG1heChjb3ZpZC5vdXQucTVbICwyXSksIG1heChjb3ZpZC5vdXQucTZbICwyXSkpLA0KICBFLmggPSBjKG1heChjb3ZpZC5vdXQucTFbICwzXSksIG1heChjb3ZpZC5vdXQucTJbICwzXSksIG1heChjb3ZpZC5vdXQucTNbICwzXSksIG1heChjb3ZpZC5vdXQucTRbICwzXSksIG1heChjb3ZpZC5vdXQucTVbICwzXSksIG1heChjb3ZpZC5vdXQucTZbICwzXSkpLA0KICBJLmggPSBjKG1heChjb3ZpZC5vdXQucTFbICw0XSksIG1heChjb3ZpZC5vdXQucTJbICw0XSksIG1heChjb3ZpZC5vdXQucTNbICw0XSksIG1heChjb3ZpZC5vdXQucTRbICw0XSksIG1heChjb3ZpZC5vdXQucTVbICw0XSksIG1heChjb3ZpZC5vdXQucTZbICw0XSkpLA0KICBTLmwgPSBjKG1heChjb3ZpZC5vdXQucTFbICw1XSksIG1heChjb3ZpZC5vdXQucTJbICw1XSksIG1heChjb3ZpZC5vdXQucTNbICw1XSksIG1heChjb3ZpZC5vdXQucTRbICw1XSksIG1heChjb3ZpZC5vdXQucTVbICw1XSksIG1heChjb3ZpZC5vdXQucTZbICw1XSkpLA0KICBFLmwgPSBjKG1heChjb3ZpZC5vdXQucTFbICw2XSksIG1heChjb3ZpZC5vdXQucTJbICw2XSksIG1heChjb3ZpZC5vdXQucTNbICw2XSksIG1heChjb3ZpZC5vdXQucTRbICw2XSksIG1heChjb3ZpZC5vdXQucTVbICw2XSksIG1heChjb3ZpZC5vdXQucTZbICw2XSkpLA0KICBJLmwgPSBjKG1heChjb3ZpZC5vdXQucTFbICw3XSksIG1heChjb3ZpZC5vdXQucTJbICw3XSksIG1heChjb3ZpZC5vdXQucTNbICw3XSksIG1heChjb3ZpZC5vdXQucTRbICw3XSksIG1heChjb3ZpZC5vdXQucTVbICw3XSksIG1heChjb3ZpZC5vdXQucTZbICw3XSkpLA0KICBRID0gYyhtYXgoY292aWQub3V0LnExWyAsOF0pLCBtYXgoY292aWQub3V0LnEyWyAsOF0pLCBtYXgoY292aWQub3V0LnEzWyAsOF0pLCBtYXgoY292aWQub3V0LnE0WyAsOF0pLCBtYXgoY292aWQub3V0LnE1WyAsOF0pLCBtYXgoY292aWQub3V0LnE2WyAsOF0pKSwNCiAgUiA9IGMobWF4KGNvdmlkLm91dC5xMVsgLDldKSwgbWF4KGNvdmlkLm91dC5xMlsgLDldKSwgbWF4KGNvdmlkLm91dC5xM1sgLDldKSwgbWF4KGNvdmlkLm91dC5xNFsgLDldKSwgbWF4KGNvdmlkLm91dC5xNVsgLDldKSwgbWF4KGNvdmlkLm91dC5xNlsgLDldKSksDQogIFYgPSBjKG1heChjb3ZpZC5vdXQucTFbICwxMF0pLCBtYXgoY292aWQub3V0LnEyWyAsMTBdKSwgbWF4KGNvdmlkLm91dC5xM1sgLDEwXSksIG1heChjb3ZpZC5vdXQucTRbICwxMF0pLCBtYXgoY292aWQub3V0LnE1WyAsMTBdKSwgbWF4KGNvdmlkLm91dC5xNlsgLDEwXSkpDQopDQoNCnJlc3VsdHMucTIgPC0gZGF0YS5mcmFtZSgNCiAgUy5oID0gYyhtaW4oY292aWQub3V0LnExWyAsMl0pLCBtaW4oY292aWQub3V0LnEyWyAsMl0pLCBtaW4oY292aWQub3V0LnEzWyAsMl0pLCBtaW4oY292aWQub3V0LnE0WyAsMl0pLCBtaW4oY292aWQub3V0LnE1WyAsMl0pLCBtaW4oY292aWQub3V0LnE2WyAsMl0pKSwNCiAgRS5oID0gYyhtaW4oY292aWQub3V0LnExWyAsM10pLCBtaW4oY292aWQub3V0LnEyWyAsM10pLCBtaW4oY292aWQub3V0LnEzWyAsM10pLCBtaW4oY292aWQub3V0LnE0WyAsM10pLCBtaW4oY292aWQub3V0LnE1WyAsM10pLCBtaW4oY292aWQub3V0LnE2WyAsM10pKSwNCiAgSS5oID0gYyhtaW4oY292aWQub3V0LnExWyAsNF0pLCBtaW4oY292aWQub3V0LnEyWyAsNF0pLCBtaW4oY292aWQub3V0LnEzWyAsNF0pLCBtaW4oY292aWQub3V0LnE0WyAsNF0pLCBtaW4oY292aWQub3V0LnE1WyAsNF0pLCBtaW4oY292aWQub3V0LnE2WyAsNF0pKSwNCiAgUy5sID0gYyhtaW4oY292aWQub3V0LnExWyAsNV0pLCBtaW4oY292aWQub3V0LnEyWyAsNV0pLCBtaW4oY292aWQub3V0LnEzWyAsNV0pLCBtaW4oY292aWQub3V0LnE0WyAsNV0pLCBtaW4oY292aWQub3V0LnE1WyAsNV0pLCBtaW4oY292aWQub3V0LnE2WyAsNV0pKSwNCiAgRS5sID0gYyhtaW4oY292aWQub3V0LnExWyAsNl0pLCBtaW4oY292aWQub3V0LnEyWyAsNl0pLCBtaW4oY292aWQub3V0LnEzWyAsNl0pLCBtaW4oY292aWQub3V0LnE0WyAsNl0pLCBtaW4oY292aWQub3V0LnE1WyAsNl0pLCBtaW4oY292aWQub3V0LnE2WyAsNl0pKSwNCiAgSS5sID0gYyhtaW4oY292aWQub3V0LnExWyAsN10pLCBtaW4oY292aWQub3V0LnEyWyAsN10pLCBtaW4oY292aWQub3V0LnEzWyAsN10pLCBtaW4oY292aWQub3V0LnE0WyAsN10pLCBtaW4oY292aWQub3V0LnE1WyAsN10pLCBtaW4oY292aWQub3V0LnE2WyAsN10pKSwNCiAgUSA9IGMobWluKGNvdmlkLm91dC5xMVsgLDhdKSwgbWluKGNvdmlkLm91dC5xMlsgLDhdKSwgbWluKGNvdmlkLm91dC5xM1sgLDhdKSwgbWluKGNvdmlkLm91dC5xNFsgLDhdKSwgbWluKGNvdmlkLm91dC5xNVsgLDhdKSwgbWluKGNvdmlkLm91dC5xNlsgLDhdKSksDQogIFIgPSBjKG1pbihjb3ZpZC5vdXQucTFbICw5XSksIG1pbihjb3ZpZC5vdXQucTJbICw5XSksIG1pbihjb3ZpZC5vdXQucTNbICw5XSksIG1pbihjb3ZpZC5vdXQucTRbICw5XSksIG1pbihjb3ZpZC5vdXQucTVbICw5XSksIG1pbihjb3ZpZC5vdXQucTZbICw5XSkpLA0KICBWID0gYyhtaW4oY292aWQub3V0LnExWyAsMTBdKSwgbWluKGNvdmlkLm91dC5xMlsgLDEwXSksIG1pbihjb3ZpZC5vdXQucTNbICwxMF0pLCBtaW4oY292aWQub3V0LnE0WyAsMTBdKSwgbWluKGNvdmlkLm91dC5xNVsgLDEwXSksIG1pbihjb3ZpZC5vdXQucTZbICwxMF0pKQ0KKQ0KDQpyZXN1bHRzLnEzIDwtIGRhdGEuZnJhbWUoDQogIFMuaCA9IGModGFpbChjb3ZpZC5vdXQucTFbICwyXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xMlsgLDJdLG49MSksIHRhaWwoY292aWQub3V0LnEzWyAsMl0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTRbICwyXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNVsgLDJdLG49MSksIHRhaWwoY292aWQub3V0LnE2WyAsMl0sbj0xKSksIA0KICBFLmggPSBjKHRhaWwoY292aWQub3V0LnExWyAsM10sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTJbICwzXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xM1sgLDNdLG49MSksIHRhaWwoY292aWQub3V0LnE0WyAsM10sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTVbICwzXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNlsgLDNdLG49MSkpLA0KICBJLmggPSBjKHRhaWwoY292aWQub3V0LnExWyAsNF0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTJbICw0XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xM1sgLDRdLG49MSksIHRhaWwoY292aWQub3V0LnE0WyAsNF0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTVbICw0XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNlsgLDRdLG49MSkpLA0KICBTLmwgPSBjKHRhaWwoY292aWQub3V0LnExWyAsNV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTJbICw1XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xM1sgLDVdLG49MSksIHRhaWwoY292aWQub3V0LnE0WyAsNV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTVbICw1XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNlsgLDVdLG49MSkpLA0KICBFLmwgPSBjKHRhaWwoY292aWQub3V0LnExWyAsNl0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTJbICw2XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xM1sgLDZdLG49MSksIHRhaWwoY292aWQub3V0LnE0WyAsNl0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTVbICw2XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNlsgLDZdLG49MSkpLCANCiAgSS5sID0gYyh0YWlsKGNvdmlkLm91dC5xMVsgLDddLG49MSksIHRhaWwoY292aWQub3V0LnEyWyAsN10sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTNbICw3XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNFsgLDddLG49MSksIHRhaWwoY292aWQub3V0LnE1WyAsN10sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTZbICw3XSxuPTEpKSwNCiAgUSA9IGModGFpbChjb3ZpZC5vdXQucTFbICw4XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xMlsgLDhdLG49MSksIHRhaWwoY292aWQub3V0LnEzWyAsOF0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTRbICw4XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNVsgLDhdLG49MSksIHRhaWwoY292aWQub3V0LnE2WyAsOF0sbj0xKSksDQogIFIgPSBjKHRhaWwoY292aWQub3V0LnExWyAsOV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTJbICw5XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xM1sgLDldLG49MSksIHRhaWwoY292aWQub3V0LnE0WyAsOV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucTVbICw5XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNlsgLDldLG49MSkpLA0KICBWID0gYyh0YWlsKGNvdmlkLm91dC5xMVsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xMlsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xM1sgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNFsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNVsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5xNlsgLDEwXSxuPTEpKQ0KKQ0KDQpgLnJvd05hbWVzREY8LWAocmVzdWx0cy5xMSxtYWtlLm5hbWVzPUZBTFNFLGMoJ3EgPSAwJywncSA9IDAuMicsJ3EgPSAwLjQnLCdxID0gMC42JywncSA9IDAuOCcsJ3EgPSAxJykpDQpgLnJvd05hbWVzREY8LWAocmVzdWx0cy5xMixtYWtlLm5hbWVzPUZBTFNFLGMoJ3EgPSAwJywncSA9IDAuMicsJ3EgPSAwLjQnLCdxID0gMC42JywncSA9IDAuOCcsJ3EgPSAxJykpDQpgLnJvd05hbWVzREY8LWAocmVzdWx0cy5xMyxtYWtlLm5hbWVzPUZBTFNFLGMoJ3EgPSAwJywncSA9IDAuMicsJ3EgPSAwLjQnLCdxID0gMC42JywncSA9IDAuOCcsJ3EgPSAxJykpDQpgYGANCg0KUGxvdHRpbmcgaGlnaGVzdCwgbG93ZXN0LCBhbmQgZW5kaW5nIHZhbHVlcyBvZiBjbGFzc2VzDQpgYGB7cn0NCiMjIEhJR0hFU1QgIyMNCm9wNyA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KHJlc3VsdHMucTEkUy5oLHR5cGU9ImIiLCBjb2w9ImJsdWUiLCB4bGFiPSJxIHZhbHVlcyIsIHlsYWIgPSAiSW5kaXZpZHVhbHMiLCBtYWluPSJIaWdoZXN0IiwgeWxpbT1jKDAsODAwMDApKQ0KbGluZXMocmVzdWx0cy5xMSRFLmgsIHR5cGUgPSAiYiIsIGNvbD0icmVkIikNCmxpbmVzKHJlc3VsdHMucTEkSS5oLCB0eXBlID0gImIiLCBjb2w9ImdyZWVuIikNCmxpbmVzKHJlc3VsdHMucTEkUy5sLCB0eXBlID0gImIiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhyZXN1bHRzLnExJEUubCwgdHlwZSA9ICJiIiwgY29sPSJvcmFuZ2UiKQ0KbGluZXMocmVzdWx0cy5xMSRJLmwsIHR5cGUgPSAiYiIsIGNvbD0iZm9yZXN0Z3JlZW4iKQ0KbGluZXMocmVzdWx0cy5xMSRRLCB0eXBlID0gImIiLCBjb2w9ImRhcmt0dXJxdW9pc2UiKQ0KbGluZXMocmVzdWx0cy5xMSRSLCB0eXBlID0gImIiLCBjb2w9InBpbmsyIikNCmxpbmVzKHJlc3VsdHMucTEkViwgdHlwZSA9ICJiIiwgY29sPSJ5ZWxsb3ciKQ0KDQpsZWdlbmQoMywgNzAwMDAsbGVnZW5kID0gYygiU3VzY2VwdGlibGVzIChIaWdoKSIsIkV4cG9zZWQgKEhpZ2gpIiwiSW5mZWN0ZWQgKEhpZ2gpIiwiU3VzY2VwdGlibGVzIChMb3cpIiwiRXhwb3NlZCAoTG93KSIsIkluZmVjdGVkIChMb3cpIiwgIlNlbGYtSXNvbGF0aW5nIiwiUmVjb3ZlcmVkIiwiVmlydXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCJwdXJwbGUiLCJvcmFuZ2UiLCJmb3Jlc3RncmVlbiIsImRhcmt0dXJxdW9pc2UiLCJwaW5rMiIsInllbGxvdyIpLCBsdHk9MSwgY2V4PTAuNikNCg0KcGFyKG9wNykNCg0KIyMgTE9XRVNUDQpvcDggPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChyZXN1bHRzLnEyJFMuaCx0eXBlPSJiIiwgY29sPSJibHVlIiwgbWFpbj0iTG93ZXN0IiwgeGxhYj0icSB2YWx1ZXMiLCB5bGFiID0gIkluZGl2aWR1YWxzIiwgeWxpbT1jKDAsODAwMDApKQ0KbGluZXMocmVzdWx0cy5xMiRFLmgsIHR5cGUgPSAiYiIsIGNvbD0icmVkIikNCmxpbmVzKHJlc3VsdHMucTIkSS5oLCB0eXBlID0gImIiLCBjb2w9ImdyZWVuIikNCmxpbmVzKHJlc3VsdHMucTIkUy5sLCB0eXBlID0gImIiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhyZXN1bHRzLnEyJEUubCwgdHlwZSA9ICJiIiwgY29sPSJvcmFuZ2UiKQ0KbGluZXMocmVzdWx0cy5xMiRJLmwsIHR5cGUgPSAiYiIsIGNvbD0iZm9yZXN0Z3JlZW4iKQ0KbGluZXMocmVzdWx0cy5xMiRRLCB0eXBlID0gImIiLCBjb2w9ImRhcmt0dXJxdW9pc2UiKQ0KbGluZXMocmVzdWx0cy5xMiRSLCB0eXBlID0gImIiLCBjb2w9InBpbmsyIikNCmxpbmVzKHJlc3VsdHMucTIkViwgdHlwZSA9ICJiIiwgY29sPSJ5ZWxsb3ciKQ0KDQpsZWdlbmQoMywgNzAwMDAsbGVnZW5kID0gYygiU3VzY2VwdGlibGVzIChIaWdoKSIsIkV4cG9zZWQgKEhpZ2gpIiwiSW5mZWN0ZWQgKEhpZ2gpIiwiU3VzY2VwdGlibGVzIChMb3cpIiwiRXhwb3NlZCAoTG93KSIsIkluZmVjdGVkIChMb3cpIiwgIlNlbGYtSXNvbGF0aW5nIiwiUmVjb3ZlcmVkIiwiVmlydXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCJwdXJwbGUiLCJvcmFuZ2UiLCJmb3Jlc3RncmVlbiIsImRhcmt0dXJxdW9pc2UiLCJwaW5rMiIsInllbGxvdyIpLCBsdHk9MSwgY2V4PTAuNikNCg0KcGFyKG9wOCkNCg0KIyMgRU5ESU5HICMjDQpvcDkgPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChyZXN1bHRzLnEzJFMuaCwgdHlwZT0iYiIsIGNvbD0iYmx1ZSIsIG1haW49IkVuZGluZyIsIHhsYWI9InEgdmFsdWVzIiwgeWxhYiA9ICJJbmRpdmlkdWFscyIsIHlsaW09YygwLDgwMDAwKSkNCmxpbmVzKHJlc3VsdHMucTMkRS5oLCB0eXBlID0gImIiLCBjb2w9InJlZCIpDQpsaW5lcyhyZXN1bHRzLnEzJEkuaCwgdHlwZSA9ICJiIiwgY29sPSJncmVlbiIpDQpsaW5lcyhyZXN1bHRzLnEzJFMubCwgdHlwZSA9ICJiIiwgY29sPSJwdXJwbGUiKQ0KbGluZXMocmVzdWx0cy5xMyRFLmwsIHR5cGUgPSAiYiIsIGNvbD0ib3JhbmdlIikNCmxpbmVzKHJlc3VsdHMucTMkSS5sLCB0eXBlID0gImIiLCBjb2w9ImZvcmVzdGdyZWVuIikNCmxpbmVzKHJlc3VsdHMucTMkUSwgdHlwZSA9ICJiIiwgY29sPSJkYXJrdHVycXVvaXNlIikNCmxpbmVzKHJlc3VsdHMucTMkUiwgdHlwZSA9ICJiIiwgY29sPSJwaW5rMiIpDQpsaW5lcyhyZXN1bHRzLnEzJFYsIHR5cGUgPSAiYiIsIGNvbD0ieWVsbG93IikNCg0KbGVnZW5kKDMsIDcwMDAwLGxlZ2VuZCA9IGMoIlN1c2NlcHRpYmxlcyAoSGlnaCkiLCJFeHBvc2VkIChIaWdoKSIsIkluZmVjdGVkIChIaWdoKSIsIlN1c2NlcHRpYmxlcyAoTG93KSIsIkV4cG9zZWQgKExvdykiLCJJbmZlY3RlZCAoTG93KSIsICJTZWxmLUlzb2xhdGluZyIsIlJlY292ZXJlZCIsIlZpcnVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwicHVycGxlIiwib3JhbmdlIiwiZm9yZXN0Z3JlZW4iLCJkYXJrdHVycXVvaXNlIiwicGluazIiLCJ5ZWxsb3ciKSwgbHR5PTEsIGNleD0wLjYpDQoNCnBhcihvcDkpDQpgYGANCg0K