1 The dataset

This is Example 5.6 (pages 159-60) of Gamerman and Lopes (2006), on Bayesian inference on hierarchical Gaussian linear regression. Souza (1997) entertain several hierarchical and dynamic models to describe the nutritional pattern of pregnant women. The data records the weight gains of \(I = 68\) pregnant women at 5 to 7 visits to the Instituto de Puericultura e Pediatria Martagão Gesteira from the Universidade Federal do Rio de Janeiro (UFRJ).

y <- matrix(c( 3.3,  6.1,  8.5,  7.9, 11.8, 14.8,  NA,
            2.0,  4.3,  8.0, 11.0, 12.2, 15.6,  NA,
            4.5,  6.8,  8.1, 13.5, 15.0,  NA,   NA,
            5.5,  5.5,  8.0, 13.2, 13.9, 15.1,  NA,
            2.0,  9.5, 12.2, 18.2, 19.3, 22.0,  NA,
            1.8,  2.0,  4.5,  7.1,  9.5, 12.6, 13.5,
            0.2,  1.4,  3.6,  5.8,  8.3,  9.0,  NA,
            3.8,  3.4,  5.4,  8.8, 10.4, 12.3, 15.3,
            1.9,  5.9,  6.0, 10.6, 14.0, 21.1,  NA,
            0.0,  1.3,  3.0,  6.4,  8.3, 10.8, 11.2,
            1.6,  1.9,  3.4,  7.5,  8.6, 10.0, 11.3,
            1.2,  3.0,  4.0,  8.0,  9.0, 12.0, 14.5,
            5.4,  6.3, 10.8, 11.2, 13.3, 15.0,  NA,
            9.5, 10.3, 14.1, 15.4, 17.3, 17.6,  NA,
           -1.7,  1.7,  5.4,  7.2,  8.9,  NA,   NA,
            2.0,  2.4,  4.0,  4.8,  9.8, 12.1,  NA,
           -2.8, -2.0,  1.5,  4.2,  5.7,  6.7,  NA,
           -3.0, -0.5,  1.7,  6.0,  8.5, 11.0, 11.0,
            0.9,  1.2,  2.3,  5.0,  8.0,  9.3, 10.9,
            2.0,  3.2,  4.4,  6.5,  7.5, 11.5, 14.6,
            3.6,  5.8,  7.3,  9.0, 12.5, 13.4,  NA, 
            1.1,  1.1,  6.7,  9.6, 13.1, 17.9, 18.2,
            9.0, 11.3, 12.9, 16.2, 17.5, 19.0, 21.3,
            0.6,  0.8,  3.0,  3.5,  4.5,  6.5,  8.0,
            3.2,  5.6,  8.1, 11.5, 14.4, 17.0, 20.0,
            3.0,  3.1,  3.5,  6.0,  7.2, 10.0, 16.5,
           -0.2, -0.6,  0.0,  2.0,  8.7, 11.0, 13.5,
            0.5, -1.2,  1.6,  3.2,  3.8,  6.0,  8.4,
            0.9,  3.5,  7.2,  9.5, 11.6, 14.4,  NA,
            3.2,  4.0,  5.5,  8.0,  9.8, 10.7, 14.5,
            1.6,  4.0,  6.5,  7.7, 10.5, 12.0,  NA,
            5.2,  7.0,  9.7, 13.8, 15.4,  NA,   NA,
            2.8,  6.6, 11.0, 11.5, 18.0, 20.5, 26.3,
            3.7,  3.9,  6.8, 12.3, 15.0,  NA,   NA,
           -2.6, -3.5, -1.5,  1.2,  4.0,  6.0,  NA,
            7.0,  8.1, 10.5, 14.5, 17.4,  NA,   NA,
           -1.5,  0.3,  4.0,  8.4, 10.3, 14.5,  NA,
           -0.2,  0.0,  4.2,  5.8,  7.5,  9.2,  NA,
            2.8,  2.5,  5.2,  8.5, 10.5, 13.2,  NA,
           -1.4, -0.2,  0.5,  2.5,  4.5,  6.7, 11.0,
            1.0,  1.0,  0.0,  4.9,  9.2, 11.5,  NA,
            0.7,  0.1,  4.5,  5.7,  8.0, 12.5,  NA,
            4.0,  3.9,  6.0,  8.7, 10.0, 13.0,  NA,
            4.0,  4.5,  6.8, 12.0, 14.0, 15.9,  NA,
            2.5,  5.4, 10.3, 13.2, 17.4, 19.2, 24.0,
            1.7,  2.0,  1.5,  3.0,  4.7,  6.0, 11.4,
            1.6,  2.0,  4.0,  6.5,  6.5,  8.5,  9.5,
            0.3,  6.0, 10.0, 13.0, 18.7, 20.9,  NA,
            1.9, -0.5,  1.5,  3.8,  3.8,  7.5,  NA,
            3.5,  2.5,  3.5,  5.0,  8.1, 12.0, 15.0,
            4.6,  5.1,  6.4,  9.5, 10.6, 14.5,  NA,
           -4.6, -4.7, -0.9,  3.7,  3.0, 10.0, 10.5,
            2.0,  2.2,  3.7,  6.5,  9.0,  8.5,  NA,
           -1.5, -1.4, -1.5,  2.8,  5.7,  6.2,  NA,
            0.2,  1.2,  3.0,  4.5,  7.0,  5.7,  NA,
           -1.0, -0.7,  0.0,  4.0,  7.5,  8.0, 10.5,
            2.0,  5.4, 11.5, 14.2, 20.5,   NA,  NA,
            3.0,  3.8,  6.5,  8.8, 11.0,   NA,  NA,
            7.0, 10.4, 13.0, 15.0, 16.0, 18.0,  NA,
            3.1,  4.5,  7.5,  8.2,  9.5, 11.7,  NA,
           -1.0,  0.6,  2.8,  5.5,  7.9,  9.2,  NA,
           -2.0, -0.7,  2.4,  5.7,  9.8, 11.1, 11.5,
            0.5,  0.5, -2.9, -1.0,  1.5,  3.4,  4.8,
            3.5,  6.9,  9.0, 16.0, 15.7,   NA,  NA,
            0.3,  1.7,  3.4,  3.1,  4.3,  3.4,  NA,
           -5.5, -5.0, -4.8, -1.0,  2.5,  5.0, 14.5,
           -3.0,  2.0,  2.5,  8.0,  9.8, 12.2,  NA,
           -2.6, -3.2, -2.0,  1.0,  3.0,  4.4,  NA),7,68)

  x <- matrix(c(8.571, 13.000, 17.571, 20.857, 24.571, 35.429, 40.143,
       14.429, 18.714, 23.000, 27.000, 31.000, 37.429, 37.857,
       13.429, 18.857, 23.143, 34.143, 37.000, 38.000, 39.286,
       12.571, 17.000, 21.429, 32.429, 34.286, 38.571, 40.571,
       13.714, 23.571, 27.714, 32.429, 35.286, 39.571, 41.857,
       11.286, 14.857, 21.286, 25.000, 30.000, 34.429, 39.000,
       13.143, 17.143, 23.000, 28.000, 31.429, 36.000, 38.000,
       10.429, 14.429, 17.857, 21.857, 25.714, 30.429, 36.000,
        8.857, 14.429, 17.714, 23.429, 28.000, 37.714, 38.429,
       12.000, 15.000, 19.857, 24.286, 26.714, 31.000, 37.286,
       11.429, 15.143, 19.429, 23.571, 27.857, 32.143, 34.571,
        9.143, 14.857, 19.143, 26.000, 28.571, 34.000, 39.000,
       10.143, 15.571, 26.286, 29.286, 33.286, 37.286, 37.571,
        9.143, 15.000, 21.000, 23.857, 28.000, 31.000, 35.857,
       12.000, 22.429, 26.429, 32.286, 35.571, 38.000, 41.429,
        6.857, 11.000, 15.571, 19.857, 24.000, 28.714, 36.000,
       11.429, 15.857, 20.857, 25.857, 30.429, 34.571, 39.286,
        8.571, 14.143, 18.571, 23.286, 29.143, 33.286, 37.286,
       11.857, 16.857, 20.714, 24.857, 28.857, 33.286, 37.000,
       13.143, 17.429, 21.857, 26.286, 30.286, 35.429, 39.143,
       14.000, 18.286, 22.857, 27.000, 31.286, 36.714, 41.200,
       13.286, 17.143, 21.571, 26.143, 30.429, 35.714, 39.857,
       11.857, 16.000, 23.000, 27.000, 29.000, 33.000, 40.000,
       13.429, 18.571, 22.286, 26.143, 33.286, 35.143, 39.714,
       15.143, 20.143, 25.286, 29.429, 33.857, 37.286, 39.286,
        8.571, 13.286, 16.429, 20.286, 24.286, 29.286, 42.429,
        9.571, 14.000, 18.429, 22.429, 34.571, 37.000, 39.000,
       11.571, 16.857, 20.143, 24.143, 28.857, 33.714, 38.000,
       14.714, 19.000, 23.286, 29.000, 33.286, 39.286, 39.571,
       14.714, 19.000, 23.714, 28.571, 31.143, 35.143, 37.571,
       10.143, 17.286, 20.000, 24.500, 30.714, 35.000, 39.857,
       11.857, 19.714, 23.714, 28.000, 33.000, 35.000, 40.286,
       10.857, 15.286, 21.857, 24.857, 31.143, 34.000, 40.000,
       11.429, 15.429, 20.429, 31.000, 36.429, 38.000, 40.000,
       11.429, 16.000, 19.286, 24.857, 29.429, 34.000, 40.571,
       14.857, 19.571, 24.286, 31.571, 42.143, 43.000, 44.000,
       14.429, 20.286, 25.000, 30.143, 33.143, 37.286, 40.000,
        8.000, 15.000, 22.714, 24.571, 30.429, 34.857, 39.000,
       13.000, 17.286, 21.857, 25.571, 32.571, 35.714, 39.000,
        8.429, 13.429, 17.286, 23.429, 27.429, 31.429, 39.429,
        6.714, 12.571, 16.571, 21.286, 26.571, 34.571, 38.571,
       11.286, 16.143, 22.429, 27.286, 30.714, 37.571, 39.571,
       11.714, 15.857, 20.286, 25.143, 28.857, 37.714, 39.143,
        8.857, 11.571, 16.000, 23.857, 28.286, 35.714, 39.714,
       13.500, 19.857, 25.000, 29.143, 33.857, 36.143, 42.000,
        8.429, 11.571, 16.571, 20.857, 25.429, 29.714, 39.714,
        8.286, 13.143, 18.286, 22.571, 27.143, 31.571, 41.429,
       15.000, 20.714, 25.000, 29.143, 36.857, 41.000, 42.000,
        9.429, 15.857, 20.429, 25.286, 29.857, 35.714, 41.286,
        7.429, 11.429, 16.571, 20.471, 27.429, 35.857, 39.571,
       12.286, 16.857, 22.000, 27.571, 32.000, 37.286, 41.429, 
       12.286, 16.571, 21.286, 25.571, 30.429, 34.571, 36.143,
       11.429, 17.571, 22.143, 27.143, 32.429, 37.143, 41.571,
       12.143, 16.429, 20.857, 25.143, 29.286, 33.429, 39.143,  
       14.714, 19.143, 23.571, 27.714, 32.143, 38.143, 40.714,
        8.143, 12.857, 16.286, 21.857, 25.143, 30.857, 40.714,
        8.286, 15.714, 26.286, 30.571, 37.714, 39.000, 40.143,
       13.571, 18.571, 23.143, 31.429, 34.429, 37.000, 39.143,
       14.857, 18.857, 23.571, 30.571, 32.286, 37.714, 38.286,
       12.857, 17.143, 21.857, 26.571, 31.000, 35.571, 38.714,
        6.857, 13.714, 19.714, 23.857, 30.000, 34.286, 41.286,
       10.143, 15.143, 19.429, 24.143, 29.571, 33.000, 39.143,
        8.571, 13.000, 18.143, 23.000, 28.143, 35.286, 40.857,
       12.286, 16.571, 21.571, 30.857, 33.429, 35.000, 37.714,
        7.000,  9.000, 13.857, 16.857, 25.857, 30.000, 37.000,
        8.857, 11.000, 15.857, 20.000, 26.857, 32.571, 41.286,
       10.000, 12.000, 14.714, 21.714, 26.571, 29.714, 40.714,
        9.429, 13.714, 17.714, 22.000, 26.286, 30.571, 36.714),7,68)
I = 68

2 Evolution of weight gains

par(mfrow=c(1,1))
plot(x[,1],y[,1],type="l",xlab="week",ylab="weight gain (kg)",xlim=c(6,44),ylim=c(-8,28),axes=F)
axis(1)
axis(2)
for(i in 2:I){
  lines(x[,i],y[,i])
}

3 Individual regressions

Below we run \(I\) individual regression: \[ y_{ij} \sim N(\alpha_i+\beta_i x_{ij},\sigma^2_j), \] for \(i=1,\ldots,I\) and \(j=1,\ldots,n_i\).

alphas = NULL
betas  = NULL
sigma2s  = NULL
for (i in 1:I){
  fit     = lm(y[,i]~x[,i])
  coef    = fit$coef
  alphas  = c(alphas,coef[1])
  betas   = c(betas,coef[2])
  sigma2s = c(sigma2s,summary(fit)$sigma^2)
}


xx = seq(min(x),max(x),length(1000))
par(mfrow=c(2,2))
plot(x[,1],y[,1],xlab="week",ylab="weight gain (kg)",xlim=c(6,44),ylim=c(-8,28),axes=F)
axis(1);axis(2)
lines(xx,alphas[1]+betas[1]*xx)
for(i in 2:68){
  points(x[,i],y[,i])
  lines(xx,alphas[i]+betas[i]*xx)
}
hist(alphas,main=expression(alpha[i]),xlab="",prob=TRUE)
hist(betas,main=expression(beta[i]),xlab="",prob=TRUE)
hist(sqrt(sigma2s),main=expression(sigma[i]),xlab="",prob=TRUE)

4 Pooling regression

Respectively, 8, 33 and 27 women are observed over 5, 6 and 7 visits, for a total of \(n=427\) pairs \((x,y)\).

# Basic settings
nobs = rep(0,I)
for (i in 1:I)
  nobs[i] = sum(!is.na(y[,i]))
n = sum(nobs)

n
## [1] 427
table(nobs)
## nobs
##  5  6  7 
##  8 33 27
# Pooled regression
yy = NULL
xx = NULL
for (i in 1:I){
 y1 = y[1:nobs[i],i]
 X = cbind(1,x[1:nobs[i],i])
 yy = c(yy,y1)
 xx = rbind(xx,X)
}
fit = lm(yy~xx-1)
summary(fit)
## 
## Call:
## lm(formula = yy ~ xx - 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.1352  -2.4042   0.0026   2.1768  11.7730 
## 
## Coefficients:
##     Estimate Std. Error t value Pr(>|t|)    
## xx1 -4.52639    0.48680  -9.298   <2e-16 ***
## xx2  0.47633    0.01897  25.113   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.612 on 425 degrees of freedom
## Multiple R-squared:  0.837,  Adjusted R-squared:  0.8362 
## F-statistic:  1091 on 2 and 425 DF,  p-value: < 2.2e-16
alpha.ols = fit$coef[1]
beta.ols = fit$coef[2]
sigma.ols = summary(fit)$sigma
c(alpha.ols,beta.ols,sigma.ols)
##       xx1       xx2           
## -4.526386  0.476334  3.611520
par(mfrow=c(1,3))
hist(alphas,main=expression(alpha[i]),xlab="",prob=TRUE)
abline(v=alpha.ols,col=2,lwd=3)
hist(betas,main=expression(beta[i]),xlab="",prob=TRUE)
abline(v=beta.ols,col=2,lwd=3)
hist(sqrt(sigma2s),main=expression(sigma[i]),xlab="",prob=TRUE,xlim=c(0,4))
abline(v=sigma.ols,col=2,lwd=3)

5 Hierarchical modeling

Let \(y_{ij}\) be the weight gain for woman \(i\) at time \(x_{ij}\), then the hierarchical model we consider is the following:

for \(i = 1,\ldots,I=68\), \(n = n_1 +\cdots+ n_i = 427\), and hyperparameters \(P_\alpha=P_\beta=1=a=b=1\).

5.1 Joint posterior and full conditional distributions

The unknowns of the hierarchical model is \(\theta=(\sigma^2,\alpha,\beta,\tau_\alpha,\tau_\beta,\alpha_1,\ldots,\alpha_I,\beta_1,\ldots,\beta_I)\), ie a \(p\)-dimensional vector where \(p=5+2I=141\). The joint posterior is \[ p(\theta|\mbox{data}) \propto \left\{\prod_{i=1}^I \left[\prod_{j=1}^{n_i} p_N(y_{ij};\alpha_i+\beta_i x_{ij},\sigma^2)\right] p_N(\alpha_i;\alpha,1/\tau_\alpha)p_N(\beta_i;\beta,1/\tau_\alpha) \right\}p(\alpha)p(\beta)p(\tau_\alpha)p(\tau_\beta)p(\sigma^2). \] Exact posterior inference is unavailable. Here we show that all full conditional distributions are readily available, where the Gibbs Sampler becomes standard solution for approximate Bayesian inference.

5.1.1 Full conditional of \((\alpha_i,\beta_i)\)

It is worth removing all conditioning quantities from the above posterior to highlight what components are important to obtain the full conditional of \((\alpha_i,\beta_i)\): \[ p(\alpha_i,\beta_i|\mbox{others, data}) \propto \left[\prod_{j=1}^{n_i} p_N(y_{ij};\alpha_i+\beta_i x_{ij},\sigma^2)\right]p_N(\alpha_i;\alpha,1/\tau_\alpha)p_N(\beta_i;\beta,1/\tau_\alpha), \] where others are all other parameters of the model.
It is straightforward to see that, for \(i=1,\ldots,N\), \[ (\alpha_i,\beta_i)|\mbox{others,data} \sim N(m_i,V_i), \] where \(V_i=(A^{-1} + X_i'X_i/\sigma^2)\) and \(m_i=V_i(A^{-1}(\alpha,\beta)'+X_i'y_i)\), for \(A^{-1}= \mbox{diag}(\tau_\alpha,\tau_\beta)\) the prior precision matrix for \((\alpha_i,\beta_i)\).

5.1.2 Full conditional of \(\alpha\) (and \(\beta\))

Similarly, \[ p(\alpha|\mbox{others,data}) \propto p(\alpha;0,1/P_\alpha)\prod_{i=1}^N p_N(\alpha_i;\alpha,1/\tau_\alpha), \] which is Gaussian with variance \(V_\alpha^{-1}=\tau_\alpha I + P_\alpha\) and \(m_\alpha=V_\alpha(\tau_\alpha\sum_{i=1}^N \alpha_i)\). Similarly for \(\beta\), whose full conditional is Gaussian with variance \(V_\beta^{-1}=\tau_\beta I + P_\beta\) and \(m_\beta=V_\beta(\tau_\beta\sum_{i=1}^N \beta_i)\).

5.1.3 Full conditional of \(\tau_\alpha\) (and \(\tau_\beta\))

It is easy to see that \[\begin{eqnarray*} \tau_\alpha|\mbox{others,data} &\sim& G\left(a+I/2;b+\sum_{i=1}^I (\alpha_i-\alpha)^2)/2\right)\\ \tau_\beta|\mbox{others,data} &\sim& G\left(a+I/2;b+\sum_{i=1}^I (\beta_i-\beta)^2)/2\right)\\ \end{eqnarray*}\]

5.1.4 Full conditional of \(\sigma^2\)

Finally, the full conditional of \(\sigma^2\) is also inverse gamma with parameters \[ a+n/2 \ \ \ \mbox{and} \ \ \ b + \sum_{i=1}^I \sum_{j=1}^{n_i} (y_{ij}-\alpha_i-\beta_ix_{ij})^2/2. \]

5.2 Gibbs sampler

run.gibbs = function(alpha,beta,sigma2,tau.alpha,tau.beta,M){
  XtX = array(0,c(I,2,2))
  Xty = matrix(0,2,I)
  for (i in 1:I){
    y1 = y[1:nobs[i],i]
    X = cbind(1,x[1:nobs[i],i])
    XtX[i,,] = t(X)%*%X
    Xty[,i]  = t(X)%*%y1
  }
  alphas = rep(0,I)
  betas = rep(0,I)
  chain = matrix(0,M,5+2*I)
  for (iter in 1:M){
    iA = diag(c(tau.alpha,tau.beta))
    # Sampling alphas and betas jointly
    for (i in 1:I){
      S         = solve(iA + XtX[i,,]/sigma2)
      draw      = S%*%(iA%*%c(alpha,beta)+Xty[,i]/sigma2) + t(chol(S))%*%rnorm(2)
      alphas[i] = draw[1]
      betas[i]  = draw[2]
    }
    # Sampling alpha
    var   = 1/(tau.alpha*I+Pa)
    mean  = var*(tau.alpha*sum(alphas))
    alpha = rnorm(1,mean,sqrt(var))
    # Sampling beta
    var   = 1/(tau.beta*I+Pb)
    mean  = var*(tau.beta*sum(betas))
    beta  = rnorm(1,mean,sqrt(var))
    # Sampling tau.alpha
    tau.alpha = rgamma(1,a+I/2,b+sum((alphas-alpha)^2)/2)
    # Sampling tau.beta
    tau.beta = rgamma(1,a+I/2,b+sum((betas-beta)^2)/2)
    # Sampling sigma2
    RSS = 0.0
    for (i in 1:I)
      RSS = RSS + sum((y[1:nobs[i],i]-alphas[i]-betas[i]*x[1:nobs[i],i])^2)
    sigma2 = 1/rgamma(1,a+n/2,b+RSS/2)
    sigma  = sqrt(sigma2)
    chain[iter,] = c(alpha,beta,sigma,tau.alpha,tau.beta,alphas,betas)
  }
  return(chain)
}

5.3 Prior hyperparameters

# alpha ~ N(0,1/Pa)
# beta  ~ N(0,1/Pb)
# 1/sigma2,tau.alpha and tau.beta ~ G(a,b)
Pa = 1            
Pb = 1            
a  = 1
b  = 1            

5.4 Running the Gibbs sampler

M0 = 1000       # Burn-in
M  = M0+5000    # Total draws 

# Initial values
alpha     = mean(alphas)
beta      = mean(betas)
sigma2    = sigma.ols
tau.alpha = 1/var(alphas)
tau.beta  = 1/var(betas)

draws     = run.gibbs(alpha,beta,sigma2,tau.alpha,tau.beta,M)
draws     = draws[(M0+1):M,]
qalpha    = quantile(draws[,1],c(0.05,0.5,0.95))
qbeta     = quantile(draws[,2],c(0.05,0.5,0.95))

5.5 Posterior summaries

names       = c("alpha","sqrt(1/tau.alpha)","beta","sqrt(1/tau.beta)","sigma")
draws[,4:5] = sqrt(1/draws[,4:5])
draws[,1:5] = draws[,c(1,4,2,5,3)]

par(mfrow=c(3,5))
for (i in 1:5) ts.plot(draws[,i],xlab="iteration",ylab="",main=names[i])
for (i in 1:5) acf(draws[,i],main="")
for (i in 1:5) hist(draws[,i],prob=TRUE,main="",xlab="")

5.6 Borrowing strenth and shrinkage

alphas.p = draws[,6:(5+I)]
betas.p  = draws[,(6+I):ncol(draws)]
malpha   = apply(alphas.p,2,median)
mbeta    = apply(betas.p,2,median)


par(mfrow=c(2,2))
boxplot(alphas.p,xlab="Women",outline=FALSE,axes=FALSE,main="Intercepts",ylab="Posterior densities")
axis(2);box()
plot(alphas,malpha,xlim=range(alphas,malpha),ylim=range(alphas,malpha),
     xlab="Intercepts (ols)",ylab="Intercepts (HBM)")
abline(0,1,lty=2)
abline(h=qalpha[2],col=4,lwd=2)
abline(h=alpha.ols,col=6,lwd=2)
legend("topleft",legend=c("OLS","Posterior mean"),lty=1,col=c(4,6),bty="n",lwd=3)

boxplot(betas.p,xlab="Women",outline=FALSE,axes=FALSE,main="Slopes",ylab="Posterior densities")
axis(2);box()
plot(betas,mbeta,xlim=range(betas,mbeta),ylim=range(betas,mbeta),
     xlab="Slopes (ols)",ylab="Slopes (HBM)")
abline(0,1,lty=2)
abline(h=qbeta[2],col=4,lwd=2)
abline(h=beta.ols,col=6,lwd=2)

LS0tCnRpdGxlOiAiQmF5ZXNpYW4gSGllcmFyY2hpY2FsIE1vZGVsaW5nIgpzdWJ0aXRsZTogIkdpYmJzIHNhbXBsZXIiCmF1dGhvcjogIkhlZGliZXJ0IEZyZWl0YXMgTG9wZXMiCmRhdGU6ICIwMi8xMS8yMDI1IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfY29sbGFwc2VkOiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogJzMnCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgoKIyBUaGUgZGF0YXNldCAKVGhpcyBpcyBFeGFtcGxlIDUuNiAocGFnZXMgMTU5LTYwKSBvZiBHYW1lcm1hbiBhbmQgTG9wZXMgKDIwMDYpLCBvbiBCYXllc2lhbiBpbmZlcmVuY2UgCm9uIGhpZXJhcmNoaWNhbCBHYXVzc2lhbiBsaW5lYXIgcmVncmVzc2lvbi4gU291emEgKDE5OTcpIGVudGVydGFpbiBzZXZlcmFsIGhpZXJhcmNoaWNhbCAKYW5kIGR5bmFtaWMgbW9kZWxzIHRvIGRlc2NyaWJlIHRoZSBudXRyaXRpb25hbCBwYXR0ZXJuIG9mIHByZWduYW50IHdvbWVuLiAgVGhlIGRhdGEgcmVjb3JkcyAKdGhlIHdlaWdodCBnYWlucyBvZiAkSSA9IDY4JCBwcmVnbmFudCB3b21lbiBhdCA1IHRvIDcgdmlzaXRzIHRvIHRoZSBJbnN0aXR1dG8gZGUgUHVlcmljdWx0dXJhIAplIFBlZGlhdHJpYSBNYXJ0YWfDo28gR2VzdGVpcmEgZnJvbSB0aGUgVW5pdmVyc2lkYWRlIEZlZGVyYWwgZG8gUmlvIGRlIEphbmVpcm8gKFVGUkopLgoKYGBge3J9CnkgPC0gbWF0cml4KGMoIDMuMywgIDYuMSwgIDguNSwgIDcuOSwgMTEuOCwgMTQuOCwgIE5BLAogICAgICAgICAgICAyLjAsICA0LjMsICA4LjAsIDExLjAsIDEyLjIsIDE1LjYsICBOQSwKICAgICAgICAgICAgNC41LCAgNi44LCAgOC4xLCAxMy41LCAxNS4wLCAgTkEsICAgTkEsCiAgICAgICAgICAgIDUuNSwgIDUuNSwgIDguMCwgMTMuMiwgMTMuOSwgMTUuMSwgIE5BLAogICAgICAgICAgICAyLjAsICA5LjUsIDEyLjIsIDE4LjIsIDE5LjMsIDIyLjAsICBOQSwKICAgICAgICAgICAgMS44LCAgMi4wLCAgNC41LCAgNy4xLCAgOS41LCAxMi42LCAxMy41LAogICAgICAgICAgICAwLjIsICAxLjQsICAzLjYsICA1LjgsICA4LjMsICA5LjAsICBOQSwKICAgICAgICAgICAgMy44LCAgMy40LCAgNS40LCAgOC44LCAxMC40LCAxMi4zLCAxNS4zLAogICAgICAgICAgICAxLjksICA1LjksICA2LjAsIDEwLjYsIDE0LjAsIDIxLjEsICBOQSwKICAgICAgICAgICAgMC4wLCAgMS4zLCAgMy4wLCAgNi40LCAgOC4zLCAxMC44LCAxMS4yLAogICAgICAgICAgICAxLjYsICAxLjksICAzLjQsICA3LjUsICA4LjYsIDEwLjAsIDExLjMsCiAgICAgICAgICAgIDEuMiwgIDMuMCwgIDQuMCwgIDguMCwgIDkuMCwgMTIuMCwgMTQuNSwKICAgICAgICAgICAgNS40LCAgNi4zLCAxMC44LCAxMS4yLCAxMy4zLCAxNS4wLCAgTkEsCiAgICAgICAgICAgIDkuNSwgMTAuMywgMTQuMSwgMTUuNCwgMTcuMywgMTcuNiwgIE5BLAogICAgICAgICAgIC0xLjcsICAxLjcsICA1LjQsICA3LjIsICA4LjksICBOQSwgICBOQSwKICAgICAgICAgICAgMi4wLCAgMi40LCAgNC4wLCAgNC44LCAgOS44LCAxMi4xLCAgTkEsCiAgICAgICAgICAgLTIuOCwgLTIuMCwgIDEuNSwgIDQuMiwgIDUuNywgIDYuNywgIE5BLAogICAgICAgICAgIC0zLjAsIC0wLjUsICAxLjcsICA2LjAsICA4LjUsIDExLjAsIDExLjAsCiAgICAgICAgICAgIDAuOSwgIDEuMiwgIDIuMywgIDUuMCwgIDguMCwgIDkuMywgMTAuOSwKICAgICAgICAgICAgMi4wLCAgMy4yLCAgNC40LCAgNi41LCAgNy41LCAxMS41LCAxNC42LAogICAgICAgICAgICAzLjYsICA1LjgsICA3LjMsICA5LjAsIDEyLjUsIDEzLjQsICBOQSwgCiAgICAgICAgICAgIDEuMSwgIDEuMSwgIDYuNywgIDkuNiwgMTMuMSwgMTcuOSwgMTguMiwKICAgICAgICAgICAgOS4wLCAxMS4zLCAxMi45LCAxNi4yLCAxNy41LCAxOS4wLCAyMS4zLAogICAgICAgICAgICAwLjYsICAwLjgsICAzLjAsICAzLjUsICA0LjUsICA2LjUsICA4LjAsCiAgICAgICAgICAgIDMuMiwgIDUuNiwgIDguMSwgMTEuNSwgMTQuNCwgMTcuMCwgMjAuMCwKICAgICAgICAgICAgMy4wLCAgMy4xLCAgMy41LCAgNi4wLCAgNy4yLCAxMC4wLCAxNi41LAogICAgICAgICAgIC0wLjIsIC0wLjYsICAwLjAsICAyLjAsICA4LjcsIDExLjAsIDEzLjUsCiAgICAgICAgICAgIDAuNSwgLTEuMiwgIDEuNiwgIDMuMiwgIDMuOCwgIDYuMCwgIDguNCwKICAgICAgICAgICAgMC45LCAgMy41LCAgNy4yLCAgOS41LCAxMS42LCAxNC40LCAgTkEsCiAgICAgICAgICAgIDMuMiwgIDQuMCwgIDUuNSwgIDguMCwgIDkuOCwgMTAuNywgMTQuNSwKICAgICAgICAgICAgMS42LCAgNC4wLCAgNi41LCAgNy43LCAxMC41LCAxMi4wLCAgTkEsCiAgICAgICAgICAgIDUuMiwgIDcuMCwgIDkuNywgMTMuOCwgMTUuNCwgIE5BLCAgIE5BLAogICAgICAgICAgICAyLjgsICA2LjYsIDExLjAsIDExLjUsIDE4LjAsIDIwLjUsIDI2LjMsCiAgICAgICAgICAgIDMuNywgIDMuOSwgIDYuOCwgMTIuMywgMTUuMCwgIE5BLCAgIE5BLAogICAgICAgICAgIC0yLjYsIC0zLjUsIC0xLjUsICAxLjIsICA0LjAsICA2LjAsICBOQSwKICAgICAgICAgICAgNy4wLCAgOC4xLCAxMC41LCAxNC41LCAxNy40LCAgTkEsICAgTkEsCiAgICAgICAgICAgLTEuNSwgIDAuMywgIDQuMCwgIDguNCwgMTAuMywgMTQuNSwgIE5BLAogICAgICAgICAgIC0wLjIsICAwLjAsICA0LjIsICA1LjgsICA3LjUsICA5LjIsICBOQSwKICAgICAgICAgICAgMi44LCAgMi41LCAgNS4yLCAgOC41LCAxMC41LCAxMy4yLCAgTkEsCiAgICAgICAgICAgLTEuNCwgLTAuMiwgIDAuNSwgIDIuNSwgIDQuNSwgIDYuNywgMTEuMCwKICAgICAgICAgICAgMS4wLCAgMS4wLCAgMC4wLCAgNC45LCAgOS4yLCAxMS41LCAgTkEsCiAgICAgICAgICAgIDAuNywgIDAuMSwgIDQuNSwgIDUuNywgIDguMCwgMTIuNSwgIE5BLAogICAgICAgICAgICA0LjAsICAzLjksICA2LjAsICA4LjcsIDEwLjAsIDEzLjAsICBOQSwKICAgICAgICAgICAgNC4wLCAgNC41LCAgNi44LCAxMi4wLCAxNC4wLCAxNS45LCAgTkEsCiAgICAgICAgICAgIDIuNSwgIDUuNCwgMTAuMywgMTMuMiwgMTcuNCwgMTkuMiwgMjQuMCwKICAgICAgICAgICAgMS43LCAgMi4wLCAgMS41LCAgMy4wLCAgNC43LCAgNi4wLCAxMS40LAogICAgICAgICAgICAxLjYsICAyLjAsICA0LjAsICA2LjUsICA2LjUsICA4LjUsICA5LjUsCiAgICAgICAgICAgIDAuMywgIDYuMCwgMTAuMCwgMTMuMCwgMTguNywgMjAuOSwgIE5BLAogICAgICAgICAgICAxLjksIC0wLjUsICAxLjUsICAzLjgsICAzLjgsICA3LjUsICBOQSwKICAgICAgICAgICAgMy41LCAgMi41LCAgMy41LCAgNS4wLCAgOC4xLCAxMi4wLCAxNS4wLAogICAgICAgICAgICA0LjYsICA1LjEsICA2LjQsICA5LjUsIDEwLjYsIDE0LjUsICBOQSwKICAgICAgICAgICAtNC42LCAtNC43LCAtMC45LCAgMy43LCAgMy4wLCAxMC4wLCAxMC41LAogICAgICAgICAgICAyLjAsICAyLjIsICAzLjcsICA2LjUsICA5LjAsICA4LjUsICBOQSwKICAgICAgICAgICAtMS41LCAtMS40LCAtMS41LCAgMi44LCAgNS43LCAgNi4yLCAgTkEsCiAgICAgICAgICAgIDAuMiwgIDEuMiwgIDMuMCwgIDQuNSwgIDcuMCwgIDUuNywgIE5BLAogICAgICAgICAgIC0xLjAsIC0wLjcsICAwLjAsICA0LjAsICA3LjUsICA4LjAsIDEwLjUsCiAgICAgICAgICAgIDIuMCwgIDUuNCwgMTEuNSwgMTQuMiwgMjAuNSwgICBOQSwgIE5BLAogICAgICAgICAgICAzLjAsICAzLjgsICA2LjUsICA4LjgsIDExLjAsICAgTkEsICBOQSwKICAgICAgICAgICAgNy4wLCAxMC40LCAxMy4wLCAxNS4wLCAxNi4wLCAxOC4wLCAgTkEsCiAgICAgICAgICAgIDMuMSwgIDQuNSwgIDcuNSwgIDguMiwgIDkuNSwgMTEuNywgIE5BLAogICAgICAgICAgIC0xLjAsICAwLjYsICAyLjgsICA1LjUsICA3LjksICA5LjIsICBOQSwKICAgICAgICAgICAtMi4wLCAtMC43LCAgMi40LCAgNS43LCAgOS44LCAxMS4xLCAxMS41LAogICAgICAgICAgICAwLjUsICAwLjUsIC0yLjksIC0xLjAsICAxLjUsICAzLjQsICA0LjgsCiAgICAgICAgICAgIDMuNSwgIDYuOSwgIDkuMCwgMTYuMCwgMTUuNywgICBOQSwgIE5BLAogICAgICAgICAgICAwLjMsICAxLjcsICAzLjQsICAzLjEsICA0LjMsICAzLjQsICBOQSwKICAgICAgICAgICAtNS41LCAtNS4wLCAtNC44LCAtMS4wLCAgMi41LCAgNS4wLCAxNC41LAogICAgICAgICAgIC0zLjAsICAyLjAsICAyLjUsICA4LjAsICA5LjgsIDEyLjIsICBOQSwKICAgICAgICAgICAtMi42LCAtMy4yLCAtMi4wLCAgMS4wLCAgMy4wLCAgNC40LCAgTkEpLDcsNjgpCgogIHggPC0gbWF0cml4KGMoOC41NzEsIDEzLjAwMCwgMTcuNTcxLCAyMC44NTcsIDI0LjU3MSwgMzUuNDI5LCA0MC4xNDMsCiAgICAgICAxNC40MjksIDE4LjcxNCwgMjMuMDAwLCAyNy4wMDAsIDMxLjAwMCwgMzcuNDI5LCAzNy44NTcsCiAgICAgICAxMy40MjksIDE4Ljg1NywgMjMuMTQzLCAzNC4xNDMsIDM3LjAwMCwgMzguMDAwLCAzOS4yODYsCiAgICAgICAxMi41NzEsIDE3LjAwMCwgMjEuNDI5LCAzMi40MjksIDM0LjI4NiwgMzguNTcxLCA0MC41NzEsCiAgICAgICAxMy43MTQsIDIzLjU3MSwgMjcuNzE0LCAzMi40MjksIDM1LjI4NiwgMzkuNTcxLCA0MS44NTcsCiAgICAgICAxMS4yODYsIDE0Ljg1NywgMjEuMjg2LCAyNS4wMDAsIDMwLjAwMCwgMzQuNDI5LCAzOS4wMDAsCiAgICAgICAxMy4xNDMsIDE3LjE0MywgMjMuMDAwLCAyOC4wMDAsIDMxLjQyOSwgMzYuMDAwLCAzOC4wMDAsCiAgICAgICAxMC40MjksIDE0LjQyOSwgMTcuODU3LCAyMS44NTcsIDI1LjcxNCwgMzAuNDI5LCAzNi4wMDAsCiAgICAgICAgOC44NTcsIDE0LjQyOSwgMTcuNzE0LCAyMy40MjksIDI4LjAwMCwgMzcuNzE0LCAzOC40MjksCiAgICAgICAxMi4wMDAsIDE1LjAwMCwgMTkuODU3LCAyNC4yODYsIDI2LjcxNCwgMzEuMDAwLCAzNy4yODYsCiAgICAgICAxMS40MjksIDE1LjE0MywgMTkuNDI5LCAyMy41NzEsIDI3Ljg1NywgMzIuMTQzLCAzNC41NzEsCiAgICAgICAgOS4xNDMsIDE0Ljg1NywgMTkuMTQzLCAyNi4wMDAsIDI4LjU3MSwgMzQuMDAwLCAzOS4wMDAsCiAgICAgICAxMC4xNDMsIDE1LjU3MSwgMjYuMjg2LCAyOS4yODYsIDMzLjI4NiwgMzcuMjg2LCAzNy41NzEsCiAgICAgICAgOS4xNDMsIDE1LjAwMCwgMjEuMDAwLCAyMy44NTcsIDI4LjAwMCwgMzEuMDAwLCAzNS44NTcsCiAgICAgICAxMi4wMDAsIDIyLjQyOSwgMjYuNDI5LCAzMi4yODYsIDM1LjU3MSwgMzguMDAwLCA0MS40MjksCiAgICAgICAgNi44NTcsIDExLjAwMCwgMTUuNTcxLCAxOS44NTcsIDI0LjAwMCwgMjguNzE0LCAzNi4wMDAsCiAgICAgICAxMS40MjksIDE1Ljg1NywgMjAuODU3LCAyNS44NTcsIDMwLjQyOSwgMzQuNTcxLCAzOS4yODYsCiAgICAgICAgOC41NzEsIDE0LjE0MywgMTguNTcxLCAyMy4yODYsIDI5LjE0MywgMzMuMjg2LCAzNy4yODYsCiAgICAgICAxMS44NTcsIDE2Ljg1NywgMjAuNzE0LCAyNC44NTcsIDI4Ljg1NywgMzMuMjg2LCAzNy4wMDAsCiAgICAgICAxMy4xNDMsIDE3LjQyOSwgMjEuODU3LCAyNi4yODYsIDMwLjI4NiwgMzUuNDI5LCAzOS4xNDMsCiAgICAgICAxNC4wMDAsIDE4LjI4NiwgMjIuODU3LCAyNy4wMDAsIDMxLjI4NiwgMzYuNzE0LCA0MS4yMDAsCiAgICAgICAxMy4yODYsIDE3LjE0MywgMjEuNTcxLCAyNi4xNDMsIDMwLjQyOSwgMzUuNzE0LCAzOS44NTcsCiAgICAgICAxMS44NTcsIDE2LjAwMCwgMjMuMDAwLCAyNy4wMDAsIDI5LjAwMCwgMzMuMDAwLCA0MC4wMDAsCiAgICAgICAxMy40MjksIDE4LjU3MSwgMjIuMjg2LCAyNi4xNDMsIDMzLjI4NiwgMzUuMTQzLCAzOS43MTQsCiAgICAgICAxNS4xNDMsIDIwLjE0MywgMjUuMjg2LCAyOS40MjksIDMzLjg1NywgMzcuMjg2LCAzOS4yODYsCiAgICAgICAgOC41NzEsIDEzLjI4NiwgMTYuNDI5LCAyMC4yODYsIDI0LjI4NiwgMjkuMjg2LCA0Mi40MjksCiAgICAgICAgOS41NzEsIDE0LjAwMCwgMTguNDI5LCAyMi40MjksIDM0LjU3MSwgMzcuMDAwLCAzOS4wMDAsCiAgICAgICAxMS41NzEsIDE2Ljg1NywgMjAuMTQzLCAyNC4xNDMsIDI4Ljg1NywgMzMuNzE0LCAzOC4wMDAsCiAgICAgICAxNC43MTQsIDE5LjAwMCwgMjMuMjg2LCAyOS4wMDAsIDMzLjI4NiwgMzkuMjg2LCAzOS41NzEsCiAgICAgICAxNC43MTQsIDE5LjAwMCwgMjMuNzE0LCAyOC41NzEsIDMxLjE0MywgMzUuMTQzLCAzNy41NzEsCiAgICAgICAxMC4xNDMsIDE3LjI4NiwgMjAuMDAwLCAyNC41MDAsIDMwLjcxNCwgMzUuMDAwLCAzOS44NTcsCiAgICAgICAxMS44NTcsIDE5LjcxNCwgMjMuNzE0LCAyOC4wMDAsIDMzLjAwMCwgMzUuMDAwLCA0MC4yODYsCiAgICAgICAxMC44NTcsIDE1LjI4NiwgMjEuODU3LCAyNC44NTcsIDMxLjE0MywgMzQuMDAwLCA0MC4wMDAsCiAgICAgICAxMS40MjksIDE1LjQyOSwgMjAuNDI5LCAzMS4wMDAsIDM2LjQyOSwgMzguMDAwLCA0MC4wMDAsCiAgICAgICAxMS40MjksIDE2LjAwMCwgMTkuMjg2LCAyNC44NTcsIDI5LjQyOSwgMzQuMDAwLCA0MC41NzEsCiAgICAgICAxNC44NTcsIDE5LjU3MSwgMjQuMjg2LCAzMS41NzEsIDQyLjE0MywgNDMuMDAwLCA0NC4wMDAsCiAgICAgICAxNC40MjksIDIwLjI4NiwgMjUuMDAwLCAzMC4xNDMsIDMzLjE0MywgMzcuMjg2LCA0MC4wMDAsCiAgICAgICAgOC4wMDAsIDE1LjAwMCwgMjIuNzE0LCAyNC41NzEsIDMwLjQyOSwgMzQuODU3LCAzOS4wMDAsCiAgICAgICAxMy4wMDAsIDE3LjI4NiwgMjEuODU3LCAyNS41NzEsIDMyLjU3MSwgMzUuNzE0LCAzOS4wMDAsCiAgICAgICAgOC40MjksIDEzLjQyOSwgMTcuMjg2LCAyMy40MjksIDI3LjQyOSwgMzEuNDI5LCAzOS40MjksCiAgICAgICAgNi43MTQsIDEyLjU3MSwgMTYuNTcxLCAyMS4yODYsIDI2LjU3MSwgMzQuNTcxLCAzOC41NzEsCiAgICAgICAxMS4yODYsIDE2LjE0MywgMjIuNDI5LCAyNy4yODYsIDMwLjcxNCwgMzcuNTcxLCAzOS41NzEsCiAgICAgICAxMS43MTQsIDE1Ljg1NywgMjAuMjg2LCAyNS4xNDMsIDI4Ljg1NywgMzcuNzE0LCAzOS4xNDMsCiAgICAgICAgOC44NTcsIDExLjU3MSwgMTYuMDAwLCAyMy44NTcsIDI4LjI4NiwgMzUuNzE0LCAzOS43MTQsCiAgICAgICAxMy41MDAsIDE5Ljg1NywgMjUuMDAwLCAyOS4xNDMsIDMzLjg1NywgMzYuMTQzLCA0Mi4wMDAsCiAgICAgICAgOC40MjksIDExLjU3MSwgMTYuNTcxLCAyMC44NTcsIDI1LjQyOSwgMjkuNzE0LCAzOS43MTQsCiAgICAgICAgOC4yODYsIDEzLjE0MywgMTguMjg2LCAyMi41NzEsIDI3LjE0MywgMzEuNTcxLCA0MS40MjksCiAgICAgICAxNS4wMDAsIDIwLjcxNCwgMjUuMDAwLCAyOS4xNDMsIDM2Ljg1NywgNDEuMDAwLCA0Mi4wMDAsCiAgICAgICAgOS40MjksIDE1Ljg1NywgMjAuNDI5LCAyNS4yODYsIDI5Ljg1NywgMzUuNzE0LCA0MS4yODYsCiAgICAgICAgNy40MjksIDExLjQyOSwgMTYuNTcxLCAyMC40NzEsIDI3LjQyOSwgMzUuODU3LCAzOS41NzEsCiAgICAgICAxMi4yODYsIDE2Ljg1NywgMjIuMDAwLCAyNy41NzEsIDMyLjAwMCwgMzcuMjg2LCA0MS40MjksIAogICAgICAgMTIuMjg2LCAxNi41NzEsIDIxLjI4NiwgMjUuNTcxLCAzMC40MjksIDM0LjU3MSwgMzYuMTQzLAogICAgICAgMTEuNDI5LCAxNy41NzEsIDIyLjE0MywgMjcuMTQzLCAzMi40MjksIDM3LjE0MywgNDEuNTcxLAogICAgICAgMTIuMTQzLCAxNi40MjksIDIwLjg1NywgMjUuMTQzLCAyOS4yODYsIDMzLjQyOSwgMzkuMTQzLCAgCiAgICAgICAxNC43MTQsIDE5LjE0MywgMjMuNTcxLCAyNy43MTQsIDMyLjE0MywgMzguMTQzLCA0MC43MTQsCiAgICAgICAgOC4xNDMsIDEyLjg1NywgMTYuMjg2LCAyMS44NTcsIDI1LjE0MywgMzAuODU3LCA0MC43MTQsCiAgICAgICAgOC4yODYsIDE1LjcxNCwgMjYuMjg2LCAzMC41NzEsIDM3LjcxNCwgMzkuMDAwLCA0MC4xNDMsCiAgICAgICAxMy41NzEsIDE4LjU3MSwgMjMuMTQzLCAzMS40MjksIDM0LjQyOSwgMzcuMDAwLCAzOS4xNDMsCiAgICAgICAxNC44NTcsIDE4Ljg1NywgMjMuNTcxLCAzMC41NzEsIDMyLjI4NiwgMzcuNzE0LCAzOC4yODYsCiAgICAgICAxMi44NTcsIDE3LjE0MywgMjEuODU3LCAyNi41NzEsIDMxLjAwMCwgMzUuNTcxLCAzOC43MTQsCiAgICAgICAgNi44NTcsIDEzLjcxNCwgMTkuNzE0LCAyMy44NTcsIDMwLjAwMCwgMzQuMjg2LCA0MS4yODYsCiAgICAgICAxMC4xNDMsIDE1LjE0MywgMTkuNDI5LCAyNC4xNDMsIDI5LjU3MSwgMzMuMDAwLCAzOS4xNDMsCiAgICAgICAgOC41NzEsIDEzLjAwMCwgMTguMTQzLCAyMy4wMDAsIDI4LjE0MywgMzUuMjg2LCA0MC44NTcsCiAgICAgICAxMi4yODYsIDE2LjU3MSwgMjEuNTcxLCAzMC44NTcsIDMzLjQyOSwgMzUuMDAwLCAzNy43MTQsCiAgICAgICAgNy4wMDAsICA5LjAwMCwgMTMuODU3LCAxNi44NTcsIDI1Ljg1NywgMzAuMDAwLCAzNy4wMDAsCiAgICAgICAgOC44NTcsIDExLjAwMCwgMTUuODU3LCAyMC4wMDAsIDI2Ljg1NywgMzIuNTcxLCA0MS4yODYsCiAgICAgICAxMC4wMDAsIDEyLjAwMCwgMTQuNzE0LCAyMS43MTQsIDI2LjU3MSwgMjkuNzE0LCA0MC43MTQsCiAgICAgICAgOS40MjksIDEzLjcxNCwgMTcuNzE0LCAyMi4wMDAsIDI2LjI4NiwgMzAuNTcxLCAzNi43MTQpLDcsNjgpCkkgPSA2OApgYGAKCiMgRXZvbHV0aW9uIG9mIHdlaWdodCBnYWlucwoKYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQpwYXIobWZyb3c9YygxLDEpKQpwbG90KHhbLDFdLHlbLDFdLHR5cGU9ImwiLHhsYWI9IndlZWsiLHlsYWI9IndlaWdodCBnYWluIChrZykiLHhsaW09Yyg2LDQ0KSx5bGltPWMoLTgsMjgpLGF4ZXM9RikKYXhpcygxKQpheGlzKDIpCmZvcihpIGluIDI6SSl7CiAgbGluZXMoeFssaV0seVssaV0pCn0KYGBgCgojIEluZGl2aWR1YWwgcmVncmVzc2lvbnMKCkJlbG93IHdlIHJ1biAkSSQgaW5kaXZpZHVhbCByZWdyZXNzaW9uOgokJAp5X3tpan0gXHNpbSBOKFxhbHBoYV9pK1xiZXRhX2kgeF97aWp9LFxzaWdtYV4yX2opLAokJApmb3IgJGk9MSxcbGRvdHMsSSQgYW5kICRqPTEsXGxkb3RzLG5faSQuCgoKYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9OH0KYWxwaGFzID0gTlVMTApiZXRhcyAgPSBOVUxMCnNpZ21hMnMgID0gTlVMTApmb3IgKGkgaW4gMTpJKXsKICBmaXQgICAgID0gbG0oeVssaV1+eFssaV0pCiAgY29lZiAgICA9IGZpdCRjb2VmCiAgYWxwaGFzICA9IGMoYWxwaGFzLGNvZWZbMV0pCiAgYmV0YXMgICA9IGMoYmV0YXMsY29lZlsyXSkKICBzaWdtYTJzID0gYyhzaWdtYTJzLHN1bW1hcnkoZml0KSRzaWdtYV4yKQp9CgoKeHggPSBzZXEobWluKHgpLG1heCh4KSxsZW5ndGgoMTAwMCkpCnBhcihtZnJvdz1jKDIsMikpCnBsb3QoeFssMV0seVssMV0seGxhYj0id2VlayIseWxhYj0id2VpZ2h0IGdhaW4gKGtnKSIseGxpbT1jKDYsNDQpLHlsaW09YygtOCwyOCksYXhlcz1GKQpheGlzKDEpO2F4aXMoMikKbGluZXMoeHgsYWxwaGFzWzFdK2JldGFzWzFdKnh4KQpmb3IoaSBpbiAyOjY4KXsKICBwb2ludHMoeFssaV0seVssaV0pCiAgbGluZXMoeHgsYWxwaGFzW2ldK2JldGFzW2ldKnh4KQp9Cmhpc3QoYWxwaGFzLG1haW49ZXhwcmVzc2lvbihhbHBoYVtpXSkseGxhYj0iIixwcm9iPVRSVUUpCmhpc3QoYmV0YXMsbWFpbj1leHByZXNzaW9uKGJldGFbaV0pLHhsYWI9IiIscHJvYj1UUlVFKQpoaXN0KHNxcnQoc2lnbWEycyksbWFpbj1leHByZXNzaW9uKHNpZ21hW2ldKSx4bGFiPSIiLHByb2I9VFJVRSkKYGBgCgojIFBvb2xpbmcgcmVncmVzc2lvbgpSZXNwZWN0aXZlbHksIDgsIDMzIGFuZCAyNyB3b21lbiBhcmUgb2JzZXJ2ZWQgb3ZlciA1LCA2IGFuZCA3IHZpc2l0cywgZm9yIGEgdG90YWwgb2YgJG49NDI3JCBwYWlycyAkKHgseSkkLgoKYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD00fQojIEJhc2ljIHNldHRpbmdzCm5vYnMgPSByZXAoMCxJKQpmb3IgKGkgaW4gMTpJKQogIG5vYnNbaV0gPSBzdW0oIWlzLm5hKHlbLGldKSkKbiA9IHN1bShub2JzKQoKbgoKdGFibGUobm9icykKCiMgUG9vbGVkIHJlZ3Jlc3Npb24KeXkgPSBOVUxMCnh4ID0gTlVMTApmb3IgKGkgaW4gMTpJKXsKIHkxID0geVsxOm5vYnNbaV0saV0KIFggPSBjYmluZCgxLHhbMTpub2JzW2ldLGldKQogeXkgPSBjKHl5LHkxKQogeHggPSByYmluZCh4eCxYKQp9CmZpdCA9IGxtKHl5fnh4LTEpCnN1bW1hcnkoZml0KQoKYWxwaGEub2xzID0gZml0JGNvZWZbMV0KYmV0YS5vbHMgPSBmaXQkY29lZlsyXQpzaWdtYS5vbHMgPSBzdW1tYXJ5KGZpdCkkc2lnbWEKYyhhbHBoYS5vbHMsYmV0YS5vbHMsc2lnbWEub2xzKQoKcGFyKG1mcm93PWMoMSwzKSkKaGlzdChhbHBoYXMsbWFpbj1leHByZXNzaW9uKGFscGhhW2ldKSx4bGFiPSIiLHByb2I9VFJVRSkKYWJsaW5lKHY9YWxwaGEub2xzLGNvbD0yLGx3ZD0zKQpoaXN0KGJldGFzLG1haW49ZXhwcmVzc2lvbihiZXRhW2ldKSx4bGFiPSIiLHByb2I9VFJVRSkKYWJsaW5lKHY9YmV0YS5vbHMsY29sPTIsbHdkPTMpCmhpc3Qoc3FydChzaWdtYTJzKSxtYWluPWV4cHJlc3Npb24oc2lnbWFbaV0pLHhsYWI9IiIscHJvYj1UUlVFLHhsaW09YygwLDQpKQphYmxpbmUodj1zaWdtYS5vbHMsY29sPTIsbHdkPTMpCmBgYAoKIyBIaWVyYXJjaGljYWwgbW9kZWxpbmcgCkxldCAkeV97aWp9JCBiZSB0aGUgd2VpZ2h0IGdhaW4gZm9yIHdvbWFuICRpJCBhdCB0aW1lICR4X3tpan0kLCB0aGVuIHRoZSBoaWVyYXJjaGljYWwgCm1vZGVsIHdlIGNvbnNpZGVyIGlzIHRoZSBmb2xsb3dpbmc6CgoqICoqT2JzZXJ2YXRpb24gbGV2ZWw6KiogJHlfe2lqfSBcc2ltIE4oXGFscGhhX2krXGJldGFfaSB4X3tpan0sXHNpZ21hXjIpJCwKCiogKipSYW5kb20gZWZmZWN0cyBsZXZlbDoqKiAkKFxhbHBoYV9pLFxiZXRhX2kpIFxzaW0gTihcYWxwaGEsMS9cdGF1X1xhbHBoYSlOKFxiZXRhLDEvXHRhdV9cYmV0YSkkLAoKKiAqKlBhcmFtZXRlcnMgbGV2ZWw6KiogJChcYWxwaGEsXHRhdV9cYWxwaGEpIFxzaW0gTigwLFBfXGFscGhhKUcoYSxiKSwgXCBcICAKKFxiZXRhLFx0YXVfXGJldGEpIFxzaW0gTigwLFBfXGJldGEpRyhhLGIpIFwgXCBcbWJveHthbmR9IFwgXCBcc2lnbWFeMiBcc2ltIElHKGEsYikkLAoKZm9yICRpID0gMSxcbGRvdHMsST02OCQsICRuID0gbl8xICtcY2RvdHMrIG5faSA9IDQyNyQsIGFuZCBoeXBlcnBhcmFtZXRlcnMgCiRQX1xhbHBoYT1QX1xiZXRhPTE9YT1iPTEkLgoKIyMgSm9pbnQgcG9zdGVyaW9yIGFuZCBmdWxsIGNvbmRpdGlvbmFsIGRpc3RyaWJ1dGlvbnMKVGhlIHVua25vd25zIG9mIHRoZSBoaWVyYXJjaGljYWwgbW9kZWwgaXMgJFx0aGV0YT0oXHNpZ21hXjIsXGFscGhhLFxiZXRhLFx0YXVfXGFscGhhLFx0YXVfXGJldGEsXGFscGhhXzEsXGxkb3RzLFxhbHBoYV9JLFxiZXRhXzEsXGxkb3RzLFxiZXRhX0kpJCwgaWUgYSAkcCQtZGltZW5zaW9uYWwgdmVjdG9yIHdoZXJlICRwPTUrMkk9MTQxJC4gIFRoZSBqb2ludCBwb3N0ZXJpb3IgaXMKJCQKcChcdGhldGF8XG1ib3h7ZGF0YX0pIFxwcm9wdG8gXGxlZnRce1xwcm9kX3tpPTF9XkkgXGxlZnRbXHByb2Rfe2o9MX1ee25faX0gcF9OKHlfe2lqfTtcYWxwaGFfaStcYmV0YV9pIHhfe2lqfSxcc2lnbWFeMilccmlnaHRdCnBfTihcYWxwaGFfaTtcYWxwaGEsMS9cdGF1X1xhbHBoYSlwX04oXGJldGFfaTtcYmV0YSwxL1x0YXVfXGFscGhhKQpccmlnaHRcfXAoXGFscGhhKXAoXGJldGEpcChcdGF1X1xhbHBoYSlwKFx0YXVfXGJldGEpcChcc2lnbWFeMikuCiQkCkV4YWN0IHBvc3RlcmlvciBpbmZlcmVuY2UgaXMgdW5hdmFpbGFibGUuICBIZXJlIHdlIHNob3cgdGhhdCBhbGwgZnVsbCBjb25kaXRpb25hbCBkaXN0cmlidXRpb25zIGFyZSByZWFkaWx5IGF2YWlsYWJsZSwgd2hlcmUgdGhlIEdpYmJzIFNhbXBsZXIgYmVjb21lcyBzdGFuZGFyZCBzb2x1dGlvbiBmb3IgYXBwcm94aW1hdGUgQmF5ZXNpYW4gaW5mZXJlbmNlLgoKIyMjIEZ1bGwgY29uZGl0aW9uYWwgb2YgJChcYWxwaGFfaSxcYmV0YV9pKSQKSXQgaXMgd29ydGggcmVtb3ZpbmcgYWxsIGNvbmRpdGlvbmluZyBxdWFudGl0aWVzIGZyb20gdGhlIGFib3ZlIHBvc3RlcmlvciB0byBoaWdobGlnaHQgd2hhdCBjb21wb25lbnRzIGFyZSBpbXBvcnRhbnQgdG8gb2J0YWluIHRoZSBmdWxsIGNvbmRpdGlvbmFsIG9mICQoXGFscGhhX2ksXGJldGFfaSkkOgokJApwKFxhbHBoYV9pLFxiZXRhX2l8XG1ib3h7b3RoZXJzLCBkYXRhfSkgXHByb3B0byBcbGVmdFtccHJvZF97aj0xfV57bl9pfSBwX04oeV97aWp9O1xhbHBoYV9pK1xiZXRhX2kgeF97aWp9LFxzaWdtYV4yKVxyaWdodF1wX04oXGFscGhhX2k7XGFscGhhLDEvXHRhdV9cYWxwaGEpcF9OKFxiZXRhX2k7XGJldGEsMS9cdGF1X1xhbHBoYSksCiQkCndoZXJlICpvdGhlcnMqIGFyZSBhbGwgb3RoZXIgcGFyYW1ldGVycyBvZiB0aGUgbW9kZWwuICAKSXQgaXMgc3RyYWlnaHRmb3J3YXJkIHRvIHNlZSB0aGF0LCBmb3IgJGk9MSxcbGRvdHMsTiQsCiQkCihcYWxwaGFfaSxcYmV0YV9pKXxcbWJveHtvdGhlcnMsZGF0YX0gXHNpbSBOKG1faSxWX2kpLAokJAp3aGVyZSAkVl9pPShBXnstMX0gKyBYX2knWF9pL1xzaWdtYV4yKSQgYW5kICRtX2k9Vl9pKEFeey0xfShcYWxwaGEsXGJldGEpJytYX2kneV9pKSQsIGZvciAKJEFeey0xfT0gXG1ib3h7ZGlhZ30oXHRhdV9cYWxwaGEsXHRhdV9cYmV0YSkkIHRoZSBwcmlvciBwcmVjaXNpb24gbWF0cml4IGZvciAkKFxhbHBoYV9pLFxiZXRhX2kpJC4KCgojIyMgRnVsbCBjb25kaXRpb25hbCBvZiAkXGFscGhhJCAoYW5kICRcYmV0YSQpClNpbWlsYXJseSwgCiQkCnAoXGFscGhhfFxtYm94e290aGVycyxkYXRhfSkgXHByb3B0byBwKFxhbHBoYTswLDEvUF9cYWxwaGEpXHByb2Rfe2k9MX1eTiBwX04oXGFscGhhX2k7XGFscGhhLDEvXHRhdV9cYWxwaGEpLAokJAp3aGljaCBpcyBHYXVzc2lhbiB3aXRoIHZhcmlhbmNlICRWX1xhbHBoYV57LTF9PVx0YXVfXGFscGhhIEkgKyBQX1xhbHBoYSQgYW5kIAokbV9cYWxwaGE9Vl9cYWxwaGEoXHRhdV9cYWxwaGFcc3VtX3tpPTF9Xk4gXGFscGhhX2kpJC4gIFNpbWlsYXJseSBmb3IgJFxiZXRhJCwgd2hvc2UgZnVsbCBjb25kaXRpb25hbCBpcyBHYXVzc2lhbiB3aXRoIHZhcmlhbmNlICRWX1xiZXRhXnstMX09XHRhdV9cYmV0YSBJICsgUF9cYmV0YSQgYW5kIAokbV9cYmV0YT1WX1xiZXRhKFx0YXVfXGJldGFcc3VtX3tpPTF9Xk4gXGJldGFfaSkkLgoKCiMjIyBGdWxsIGNvbmRpdGlvbmFsIG9mICRcdGF1X1xhbHBoYSQgKGFuZCAkXHRhdV9cYmV0YSQpCkl0IGlzIGVhc3kgdG8gc2VlIHRoYXQgClxiZWdpbntlcW5hcnJheSp9Clx0YXVfXGFscGhhfFxtYm94e290aGVycyxkYXRhfSAmXHNpbSYgR1xsZWZ0KGErSS8yO2IrXHN1bV97aT0xfV5JIChcYWxwaGFfaS1cYWxwaGEpXjIpLzJccmlnaHQpXFwKXHRhdV9cYmV0YXxcbWJveHtvdGhlcnMsZGF0YX0gJlxzaW0mIEdcbGVmdChhK0kvMjtiK1xzdW1fe2k9MX1eSSAoXGJldGFfaS1cYmV0YSleMikvMlxyaWdodClcXApcZW5ke2VxbmFycmF5Kn0KCiMjIyBGdWxsIGNvbmRpdGlvbmFsIG9mICRcc2lnbWFeMiQKRmluYWxseSwgdGhlIGZ1bGwgY29uZGl0aW9uYWwgb2YgJFxzaWdtYV4yJCBpcyBhbHNvIGludmVyc2UgZ2FtbWEgd2l0aCBwYXJhbWV0ZXJzCiQkCmErbi8yIFwgXCBcIFxtYm94e2FuZH0gXCBcIFwgYiArIFxzdW1fe2k9MX1eSSBcc3VtX3tqPTF9XntuX2l9ICh5X3tpan0tXGFscGhhX2ktXGJldGFfaXhfe2lqfSleMi8yLgokJAoKIyMgR2liYnMgc2FtcGxlcgoKYGBge3J9CnJ1bi5naWJicyA9IGZ1bmN0aW9uKGFscGhhLGJldGEsc2lnbWEyLHRhdS5hbHBoYSx0YXUuYmV0YSxNKXsKICBYdFggPSBhcnJheSgwLGMoSSwyLDIpKQogIFh0eSA9IG1hdHJpeCgwLDIsSSkKICBmb3IgKGkgaW4gMTpJKXsKICAgIHkxID0geVsxOm5vYnNbaV0saV0KICAgIFggPSBjYmluZCgxLHhbMTpub2JzW2ldLGldKQogICAgWHRYW2ksLF0gPSB0KFgpJSolWAogICAgWHR5WyxpXSAgPSB0KFgpJSoleTEKICB9CiAgYWxwaGFzID0gcmVwKDAsSSkKICBiZXRhcyA9IHJlcCgwLEkpCiAgY2hhaW4gPSBtYXRyaXgoMCxNLDUrMipJKQogIGZvciAoaXRlciBpbiAxOk0pewogICAgaUEgPSBkaWFnKGModGF1LmFscGhhLHRhdS5iZXRhKSkKICAgICMgU2FtcGxpbmcgYWxwaGFzIGFuZCBiZXRhcyBqb2ludGx5CiAgICBmb3IgKGkgaW4gMTpJKXsKICAgICAgUyAgICAgICAgID0gc29sdmUoaUEgKyBYdFhbaSwsXS9zaWdtYTIpCiAgICAgIGRyYXcgICAgICA9IFMlKiUoaUElKiVjKGFscGhhLGJldGEpK1h0eVssaV0vc2lnbWEyKSArIHQoY2hvbChTKSklKiVybm9ybSgyKQogICAgICBhbHBoYXNbaV0gPSBkcmF3WzFdCiAgICAgIGJldGFzW2ldICA9IGRyYXdbMl0KICAgIH0KICAgICMgU2FtcGxpbmcgYWxwaGEKICAgIHZhciAgID0gMS8odGF1LmFscGhhKkkrUGEpCiAgICBtZWFuICA9IHZhcioodGF1LmFscGhhKnN1bShhbHBoYXMpKQogICAgYWxwaGEgPSBybm9ybSgxLG1lYW4sc3FydCh2YXIpKQogICAgIyBTYW1wbGluZyBiZXRhCiAgICB2YXIgICA9IDEvKHRhdS5iZXRhKkkrUGIpCiAgICBtZWFuICA9IHZhcioodGF1LmJldGEqc3VtKGJldGFzKSkKICAgIGJldGEgID0gcm5vcm0oMSxtZWFuLHNxcnQodmFyKSkKICAgICMgU2FtcGxpbmcgdGF1LmFscGhhCiAgICB0YXUuYWxwaGEgPSByZ2FtbWEoMSxhK0kvMixiK3N1bSgoYWxwaGFzLWFscGhhKV4yKS8yKQogICAgIyBTYW1wbGluZyB0YXUuYmV0YQogICAgdGF1LmJldGEgPSByZ2FtbWEoMSxhK0kvMixiK3N1bSgoYmV0YXMtYmV0YSleMikvMikKICAgICMgU2FtcGxpbmcgc2lnbWEyCiAgICBSU1MgPSAwLjAKICAgIGZvciAoaSBpbiAxOkkpCiAgICAgIFJTUyA9IFJTUyArIHN1bSgoeVsxOm5vYnNbaV0saV0tYWxwaGFzW2ldLWJldGFzW2ldKnhbMTpub2JzW2ldLGldKV4yKQogICAgc2lnbWEyID0gMS9yZ2FtbWEoMSxhK24vMixiK1JTUy8yKQogICAgc2lnbWEgID0gc3FydChzaWdtYTIpCiAgICBjaGFpbltpdGVyLF0gPSBjKGFscGhhLGJldGEsc2lnbWEsdGF1LmFscGhhLHRhdS5iZXRhLGFscGhhcyxiZXRhcykKICB9CiAgcmV0dXJuKGNoYWluKQp9CmBgYAoKIyMgUHJpb3IgaHlwZXJwYXJhbWV0ZXJzCmBgYHtyfQojIGFscGhhIH4gTigwLDEvUGEpCiMgYmV0YSAgfiBOKDAsMS9QYikKIyAxL3NpZ21hMix0YXUuYWxwaGEgYW5kIHRhdS5iZXRhIH4gRyhhLGIpClBhID0gMSAgICAgICAgICAgIApQYiA9IDEgICAgICAgICAgICAKYSAgPSAxCmIgID0gMSAgICAgICAgICAgIApgYGAKCiMjIFJ1bm5pbmcgdGhlIEdpYmJzIHNhbXBsZXIKCmBgYHtyfQpNMCA9IDEwMDAgICAgICAgIyBCdXJuLWluCk0gID0gTTArNTAwMCAgICAjIFRvdGFsIGRyYXdzIAoKIyBJbml0aWFsIHZhbHVlcwphbHBoYSAgICAgPSBtZWFuKGFscGhhcykKYmV0YSAgICAgID0gbWVhbihiZXRhcykKc2lnbWEyICAgID0gc2lnbWEub2xzCnRhdS5hbHBoYSA9IDEvdmFyKGFscGhhcykKdGF1LmJldGEgID0gMS92YXIoYmV0YXMpCgpkcmF3cyAgICAgPSBydW4uZ2liYnMoYWxwaGEsYmV0YSxzaWdtYTIsdGF1LmFscGhhLHRhdS5iZXRhLE0pCmRyYXdzICAgICA9IGRyYXdzWyhNMCsxKTpNLF0KcWFscGhhICAgID0gcXVhbnRpbGUoZHJhd3NbLDFdLGMoMC4wNSwwLjUsMC45NSkpCnFiZXRhICAgICA9IHF1YW50aWxlKGRyYXdzWywyXSxjKDAuMDUsMC41LDAuOTUpKQpgYGAKCiMjIFBvc3RlcmlvciBzdW1tYXJpZXMKCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTEwfQpuYW1lcyAgICAgICA9IGMoImFscGhhIiwic3FydCgxL3RhdS5hbHBoYSkiLCJiZXRhIiwic3FydCgxL3RhdS5iZXRhKSIsInNpZ21hIikKZHJhd3NbLDQ6NV0gPSBzcXJ0KDEvZHJhd3NbLDQ6NV0pCmRyYXdzWywxOjVdID0gZHJhd3NbLGMoMSw0LDIsNSwzKV0KCnBhcihtZnJvdz1jKDMsNSkpCmZvciAoaSBpbiAxOjUpIHRzLnBsb3QoZHJhd3NbLGldLHhsYWI9Iml0ZXJhdGlvbiIseWxhYj0iIixtYWluPW5hbWVzW2ldKQpmb3IgKGkgaW4gMTo1KSBhY2YoZHJhd3NbLGldLG1haW49IiIpCmZvciAoaSBpbiAxOjUpIGhpc3QoZHJhd3NbLGldLHByb2I9VFJVRSxtYWluPSIiLHhsYWI9IiIpCmBgYAoKIyMgQm9ycm93aW5nIHN0cmVudGggYW5kIHNocmlua2FnZQoKYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KYWxwaGFzLnAgPSBkcmF3c1ssNjooNStJKV0KYmV0YXMucCAgPSBkcmF3c1ssKDYrSSk6bmNvbChkcmF3cyldCm1hbHBoYSAgID0gYXBwbHkoYWxwaGFzLnAsMixtZWRpYW4pCm1iZXRhICAgID0gYXBwbHkoYmV0YXMucCwyLG1lZGlhbikKCgpwYXIobWZyb3c9YygyLDIpKQpib3hwbG90KGFscGhhcy5wLHhsYWI9IldvbWVuIixvdXRsaW5lPUZBTFNFLGF4ZXM9RkFMU0UsbWFpbj0iSW50ZXJjZXB0cyIseWxhYj0iUG9zdGVyaW9yIGRlbnNpdGllcyIpCmF4aXMoMik7Ym94KCkKcGxvdChhbHBoYXMsbWFscGhhLHhsaW09cmFuZ2UoYWxwaGFzLG1hbHBoYSkseWxpbT1yYW5nZShhbHBoYXMsbWFscGhhKSwKICAgICB4bGFiPSJJbnRlcmNlcHRzIChvbHMpIix5bGFiPSJJbnRlcmNlcHRzIChIQk0pIikKYWJsaW5lKDAsMSxsdHk9MikKYWJsaW5lKGg9cWFscGhhWzJdLGNvbD00LGx3ZD0yKQphYmxpbmUoaD1hbHBoYS5vbHMsY29sPTYsbHdkPTIpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPWMoIk9MUyIsIlBvc3RlcmlvciBtZWFuIiksbHR5PTEsY29sPWMoNCw2KSxidHk9Im4iLGx3ZD0zKQoKYm94cGxvdChiZXRhcy5wLHhsYWI9IldvbWVuIixvdXRsaW5lPUZBTFNFLGF4ZXM9RkFMU0UsbWFpbj0iU2xvcGVzIix5bGFiPSJQb3N0ZXJpb3IgZGVuc2l0aWVzIikKYXhpcygyKTtib3goKQpwbG90KGJldGFzLG1iZXRhLHhsaW09cmFuZ2UoYmV0YXMsbWJldGEpLHlsaW09cmFuZ2UoYmV0YXMsbWJldGEpLAogICAgIHhsYWI9IlNsb3BlcyAob2xzKSIseWxhYj0iU2xvcGVzIChIQk0pIikKYWJsaW5lKDAsMSxsdHk9MikKYWJsaW5lKGg9cWJldGFbMl0sY29sPTQsbHdkPTIpCmFibGluZShoPWJldGEub2xzLGNvbD02LGx3ZD0yKQpgYGAKCgoKCgoK