http://cran.nexr.com/web/packages/BAYSTAR/index.html
Model
In this exercise, we will illustrate the implementation of both Gibbs
and Random Walk Metropolis steps an MCMC algorithm to draw from the
posterior distribution of the parameters of a Threshold Autoregressive
model of orderm one, or simply an TAR(1) model: \[
y_t = \phi_1 y_{t-1}1_{\{y_{t-1}\leq\alpha\}}+\phi_2
y_{t-1}1_{\{y_{t-1}>\alpha\}}+\varepsilon_t,
\] where \(\{\varepsilon_t\}\)s
follow a Gaussian white noite with variance \(\sigma^2\). We will keep \(\sigma^2=1\) for simplicity and focus on
the full conditional distributions of \(\phi=(\phi_1,\phi_2)' \in \Re^2\) and
\(\alpha \in \Re\).
set.seed(1245)
n = 500
alpha = 2.0
phi1 = 0.0
phi2 = 0.95
sig = 1.0
error = rnorm(n,0,sig)
y = rep(10,n)
for (t in 2:n){
if (y[t-1]<=alpha){
y[t] = phi1*y[t-1]+error[t]
}else{
y[t] = phi2*y[t-1]+error[t]
}
}
par(mfrow=c(1,2))
ts.plot(y)
plot(y[1:(n-1)],y[2:n],xlab=expression(y[t-1]),ylab=expression(y[t]))
abline(v=alpha,col=2)
alpha.true = alpha
phi1.true = phi1
phi2.true = phi2
Posterior
inference
\(\phi|\mbox{data},\alpha\)
If we rename the lagged components, the above linear regression would
become: \[
y_t = \phi_1 x_{t1} +\phi_2 x_{t2} +\varepsilon_t,
\] where \(x_{t1}=y_{t-1}1_{\{y_{t-1}\leq\alpha\}}\)
and \(x_{t2}=y_{t-1}1_{\{y_{t-1}>\alpha\}}\).
Notice that \(\alpha\) is hidden inside
both \(x_1\) and \(x_2\), so conditionally on \(\alpha\) the vector \(\phi\) can be updated according to a
Gaussian linear regression.
For simplicity, let us assume a noninformative prior for \(\phi\), ie \(p(\phi) \propto 1\). Then, it is easy to
show that \[
p(\phi|\mbox{data},\alpha) \propto \exp\left\{-\frac12
(Y-X\phi)'(Y-X\phi)\right\}
\propto \exp\left\{-\frac12
\left[\phi'X'X\phi-2\phi'X'Y\right] \right\},
\] for \(Y=(y_2,\ldots,y_n)'\) and \(X=(x_2,\ldots,x_n)'\) and \(x_t=(x_{t1},x_{t2})\). The kernel of the
above posterior is Gaussian with mean vector vector and covariance
matrix given by \[
{\hat \phi}(\alpha) = (X'X)^{-1}X'Y \ \ \ \mbox{and} \ \ \
\Sigma(\alpha)=(X'X)^{-1},
\] respectively. In summary, conditionally on \(\alpha\) the full posterior distribution of
\(\phi\) is \[
\phi|\mbox{data},\alpha \sim N({\hat \phi}(\alpha),\Sigma(\alpha)).
\]
\(\alpha|\mbox{data},\phi\)
The full posterior distribution of \(\phi\) does not belong to any nice and easy
family of distributions: \[
p(\alpha|\mbox{data},\phi) \propto \exp\left\{-\frac12
(Y-X(\alpha)\phi)'(Y-X(\alpha)\phi)\right\},
\] where \(\phi\) is fixed here,
so all changes due to \(\alpha\) come
from \(X(\alpha)\).
The oldest, simples and, consequently, most popular MCMC algorithm is
the random-walk Metropolis algorithm. First we sample a candidate \(\alpha^*\) from \(N(\alpha^{\mbox{old},\tau^2)\). Here \(\alpha^{\mbox{old}}\) is the current
position of the Markov chain and \(\tau\) is a tuning parameters to control
the rate of acceptance of those random-walk draws. The candidate draw,
\(\alpha^*\), is accepted with
probability \[
\min\left\{1,\frac{p(\alpha^*|\mbox{data},\phi)
}{p(\alpha^{\mbox{old}}|\mbox{data},\phi) }\right\}.
\]
MCMC scheme
Start at \((\phi^{(0)},\alpha^{(0)})\)
Set i=1
1.1 Draw \(\phi^{(i)}\) from \(N({\hat
\phi}(\alpha^{(i-1)}),\Sigma(\alpha^{(i-1)}))\)
1.2 Draw \(\alpha^*\) from \(N(\alpha^{(j-1)},\tau^2)\)
1.3 Make \(\alpha^{(i)}=\alpha^*\)
with probability \[
\min\left\{1,\frac{p(\alpha^*|\mbox{data},\phi)
}{p(\alpha^{(i-1)}|\mbox{data},\phi) }\right\}.
\]
Set \(i=i+1\) and go back to 1
until \(i=N+1\)
Se sequence of draws \(\{(\phi^{(i)},\alpha^{(i)})\}_{i=1}^N\)
converges to draws from the posterior distribution \(p(\phi,\alpha| \mbox{data})\).
Running the MCMC
scheme
logpostalpha = function(alpha,phi){
X = cbind(y[1:(n-1)]*ifelse(y[1:(n-1)]<=alpha,1,0),y[1:(n-1)]*ifelse(y[1:(n-1)]>alpha,1,0))
sum(dnorm(Y-X%*%phi,log=TRUE))
}
Y = y[2:n]
alpha = 0
tau = 0.2
ndraws = 20000
burnin = 100000
niter = ndraws+burnin
phis = matrix(0,niter,2)
alphas = rep(0,niter)
for (iter in 1:niter){
X = cbind(y[1:(n-1)]*ifelse(y[1:(n-1)]<=alpha,1,0),y[1:(n-1)]*ifelse(y[1:(n-1)]>alpha,1,0))
v.phi = solve(t(X)%*%X)
phi.hat = v.phi%*%t(X)%*%Y
phi = phi.hat + t(chol(v.phi))%*%rnorm(2)
alphastar = rnorm(1,alpha,tau)
logaccept = min(0,logpostalpha(alphastar,phi)-logpostalpha(alpha,phi))
if (log(runif(1))<logaccept){
alpha = alphastar
}
phis[iter,] = phi
alphas[iter] = alpha
}
Monitoring the Markov
chains
par(mfrow=c(3,3))
ind = seq(1,niter,by=100)
plot(ind,phis[ind,1],xlab="Iterations",ylab="",main=expression(phi[1]),type="l")
abline(h=phi1.true,col=2,lwd=2)
abline(v=burnin,col=3,lwd=2)
plot(ind,phis[ind,2],xlab="Iterations",ylab="",main=expression(phi[2]),type="l")
abline(h=phi2.true,col=2,lwd=2)
abline(v=burnin,col=3,lwd=2)
plot(ind,alphas[ind],xlab="Iterations",ylab="",main=expression(alpha),type="l")
abline(h=alpha.true,col=2,lwd=2)
abline(v=burnin,col=3,lwd=2)
phis = phis[(burnin+1):niter,]
alphas = alphas[(burnin+1):niter]
ts.plot(phis[,1],xlab="Iterations",ylab="",main=expression(phi[1]))
abline(h=phi1.true,col=2,lwd=2)
ts.plot(phis[,2],xlab="Iterations",ylab="",main=expression(phi[2]))
abline(h=phi2.true,col=2,lwd=2)
ts.plot(alphas,xlab="Iterations",ylab="",main=expression(alpha))
abline(h=alpha.true,col=2,lwd=2)
acf(phis[,1],main="")
acf(phis[,2],main="")
acf(alphas,main="")
Marginal
posteriors
par(mfrow=c(1,3))
hist(phis[,1],prob=TRUE,main=expression(phi[1]),xlab="")
abline(v=phi1.true,col=2,lwd=2)
hist(phis[,2],prob=TRUE,main=expression(phi[2]),xlab="")
abline(v=phi2.true,col=2,lwd=2)
hist(alphas,prob=TRUE,main=expression(alpha),xlab="")
abline(v=alpha.true,col=2,lwd=2)
LS0tCnRpdGxlOiAiVGhyZXNob2xkIEFSIG1vZGVsIgpzdWJ0aXRsZTogIkdpYmJzIGFuZCBSYW5kb20tV2Fsay1NZXRyb3BvbGlzIHN0ZXBzIgphdXRob3I6ICJIZWRpYmVydCBGcmVpdGFzIExvcGVzIgpkYXRlOiAiMi8xMy8yMDIzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKCmh0dHA6Ly9jcmFuLm5leHIuY29tL3dlYi9wYWNrYWdlcy9CQVlTVEFSL2luZGV4Lmh0bWwKCiMgTW9kZWwKSW4gdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCBpbGx1c3RyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIEdpYmJzIGFuZCBSYW5kb20gV2FsayBNZXRyb3BvbGlzIHN0ZXBzIGFuIE1DTUMgYWxnb3JpdGhtIHRvIGRyYXcgZnJvbSB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcGFyYW1ldGVycyBvZiBhIFRocmVzaG9sZCBBdXRvcmVncmVzc2l2ZSBtb2RlbCBvZiBvcmRlcm0gb25lLCBvciBzaW1wbHkgYW4gVEFSKDEpIG1vZGVsOgokJAp5X3QgPSBccGhpXzEgeV97dC0xfTFfe1x7eV97dC0xfVxsZXFcYWxwaGFcfX0rXHBoaV8yIHlfe3QtMX0xX3tce3lfe3QtMX0+XGFscGhhXH19K1x2YXJlcHNpbG9uX3QsCiQkCndoZXJlICRce1x2YXJlcHNpbG9uX3RcfSRzIGZvbGxvdyBhIEdhdXNzaWFuIHdoaXRlIG5vaXRlIHdpdGggdmFyaWFuY2UgJFxzaWdtYV4yJC4gIFdlIHdpbGwga2VlcCAkXHNpZ21hXjI9MSQgZm9yIHNpbXBsaWNpdHkgYW5kIGZvY3VzIG9uIHRoZSBmdWxsIGNvbmRpdGlvbmFsIGRpc3RyaWJ1dGlvbnMgb2YgJFxwaGk9KFxwaGlfMSxccGhpXzIpJyBcaW4gXFJlXjIkIGFuZCAkXGFscGhhIFxpbiBcUmUkLiAgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0Kc2V0LnNlZWQoMTI0NSkKbiAgICAgPSA1MDAKYWxwaGEgPSAyLjAKcGhpMSAgPSAwLjAKcGhpMiAgPSAwLjk1CnNpZyAgID0gMS4wCmVycm9yID0gcm5vcm0obiwwLHNpZykKCnkgPSByZXAoMTAsbikKZm9yICh0IGluIDI6bil7CiAgaWYgKHlbdC0xXTw9YWxwaGEpewogICAgeVt0XSA9IHBoaTEqeVt0LTFdK2Vycm9yW3RdICAKICB9ZWxzZXsKICAgIHlbdF0gPSBwaGkyKnlbdC0xXStlcnJvclt0XSAgCiAgfQp9CgpwYXIobWZyb3c9YygxLDIpKQp0cy5wbG90KHkpCnBsb3QoeVsxOihuLTEpXSx5WzI6bl0seGxhYj1leHByZXNzaW9uKHlbdC0xXSkseWxhYj1leHByZXNzaW9uKHlbdF0pKQphYmxpbmUodj1hbHBoYSxjb2w9MikKCmFscGhhLnRydWUgPSBhbHBoYQpwaGkxLnRydWUgPSBwaGkxCnBoaTIudHJ1ZSA9IHBoaTIKYGBgCgojIFBvc3RlcmlvciBpbmZlcmVuY2UKCiMjICRccGhpfFxtYm94e2RhdGF9LFxhbHBoYSQKSWYgd2UgcmVuYW1lIHRoZSBsYWdnZWQgY29tcG9uZW50cywgdGhlIGFib3ZlIGxpbmVhciByZWdyZXNzaW9uIHdvdWxkIGJlY29tZToKJCQKeV90ID0gXHBoaV8xIHhfe3QxfSArXHBoaV8yIHhfe3QyfSArXHZhcmVwc2lsb25fdCwKJCQKd2hlcmUgJHhfe3QxfT15X3t0LTF9MV97XHt5X3t0LTF9XGxlcVxhbHBoYVx9fSQgYW5kICR4X3t0Mn09eV97dC0xfTFfe1x7eV97dC0xfT5cYWxwaGFcfX0kLiAgTm90aWNlIHRoYXQgJFxhbHBoYSQgaXMgaGlkZGVuIGluc2lkZSBib3RoICR4XzEkIGFuZCAkeF8yJCwgc28gY29uZGl0aW9uYWxseSBvbiAkXGFscGhhJCB0aGUgdmVjdG9yICRccGhpJCBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmcgdG8gYSBHYXVzc2lhbiBsaW5lYXIgcmVncmVzc2lvbi4gIAoKRm9yIHNpbXBsaWNpdHksIGxldCB1cyBhc3N1bWUgYSBub25pbmZvcm1hdGl2ZSBwcmlvciBmb3IgJFxwaGkkLCBpZSAkcChccGhpKSBccHJvcHRvIDEkLiAgVGhlbiwgaXQgaXMgZWFzeSB0byBzaG93IHRoYXQgCiQkCnAoXHBoaXxcbWJveHtkYXRhfSxcYWxwaGEpIFxwcm9wdG8gXGV4cFxsZWZ0XHstXGZyYWMxMiAoWS1YXHBoaSknKFktWFxwaGkpXHJpZ2h0XH0KXHByb3B0byBcZXhwXGxlZnRcey1cZnJhYzEyIFxsZWZ0W1xwaGknWCdYXHBoaS0yXHBoaSdYJ1lccmlnaHRdIFxyaWdodFx9LAokJApmb3IgJFk9KHlfMixcbGRvdHMseV9uKSckIGFuZCAkWD0oeF8yLFxsZG90cyx4X24pJyQgYW5kICR4X3Q9KHhfe3QxfSx4X3t0Mn0pJC4gIFRoZSBrZXJuZWwgb2YgdGhlIGFib3ZlIHBvc3RlcmlvciBpcyBHYXVzc2lhbiB3aXRoIG1lYW4gdmVjdG9yIHZlY3RvciBhbmQgY292YXJpYW5jZSBtYXRyaXggZ2l2ZW4gYnkKJCQKe1xoYXQgXHBoaX0oXGFscGhhKSA9IChYJ1gpXnstMX1YJ1kgXCBcIFwgXG1ib3h7YW5kfSBcIFwgXCBcU2lnbWEoXGFscGhhKT0oWCdYKV57LTF9LAokJApyZXNwZWN0aXZlbHkuIEluIHN1bW1hcnksIGNvbmRpdGlvbmFsbHkgb24gJFxhbHBoYSQgdGhlIGZ1bGwgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiBvZiAkXHBoaSQgaXMKJCQKXHBoaXxcbWJveHtkYXRhfSxcYWxwaGEgXHNpbSBOKHtcaGF0IFxwaGl9KFxhbHBoYSksXFNpZ21hKFxhbHBoYSkpLgokJAoKIyAkXGFscGhhfFxtYm94e2RhdGF9LFxwaGkkClRoZSBmdWxsIHBvc3RlcmlvciBkaXN0cmlidXRpb24gb2YgJFxwaGkkIGRvZXMgbm90IGJlbG9uZyB0byBhbnkgbmljZSBhbmQgZWFzeSBmYW1pbHkgb2YgZGlzdHJpYnV0aW9uczoKJCQKcChcYWxwaGF8XG1ib3h7ZGF0YX0sXHBoaSkgXHByb3B0byBcZXhwXGxlZnRcey1cZnJhYzEyIChZLVgoXGFscGhhKVxwaGkpJyhZLVgoXGFscGhhKVxwaGkpXHJpZ2h0XH0sCiQkCndoZXJlICRccGhpJCBpcyBmaXhlZCBoZXJlLCBzbyBhbGwgY2hhbmdlcyBkdWUgdG8gJFxhbHBoYSQgY29tZSBmcm9tICRYKFxhbHBoYSkkLgoKVGhlIG9sZGVzdCwgc2ltcGxlcyBhbmQsIGNvbnNlcXVlbnRseSwgbW9zdCBwb3B1bGFyIE1DTUMgYWxnb3JpdGhtIGlzIHRoZSByYW5kb20td2FsayBNZXRyb3BvbGlzIGFsZ29yaXRobS4gRmlyc3Qgd2Ugc2FtcGxlIGEgY2FuZGlkYXRlICRcYWxwaGFeKiQgZnJvbSAkTihcYWxwaGFee1xtYm94e29sZH0sXHRhdV4yKSQuICBIZXJlICRcYWxwaGFee1xtYm94e29sZH19JCBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgTWFya292IGNoYWluIGFuZCAkXHRhdSQgaXMgYSB0dW5pbmcgcGFyYW1ldGVycyB0byBjb250cm9sIHRoZSByYXRlIG9mIGFjY2VwdGFuY2Ugb2YgdGhvc2UgcmFuZG9tLXdhbGsgZHJhd3MuICBUaGUgY2FuZGlkYXRlIGRyYXcsICRcYWxwaGFeKiQsIGlzIGFjY2VwdGVkIHdpdGggcHJvYmFiaWxpdHkKJCQKXG1pblxsZWZ0XHsxLFxmcmFje3AoXGFscGhhXip8XG1ib3h7ZGF0YX0sXHBoaSkgfXtwKFxhbHBoYV57XG1ib3h7b2xkfX18XG1ib3h7ZGF0YX0sXHBoaSkgfVxyaWdodFx9LgokJAoKIyMgTUNNQyBzY2hlbWUKCjAuIFN0YXJ0IGF0ICQoXHBoaV57KDApfSxcYWxwaGFeeygwKX0pJAoKMS4gU2V0IGk9MQoKICAgMS4xIERyYXcgJFxwaGleeyhpKX0kIGZyb20gJE4oe1xoYXQgXHBoaX0oXGFscGhhXnsoaS0xKX0pLFxTaWdtYShcYWxwaGFeeyhpLTEpfSkpJAoKICAgMS4yIERyYXcgJFxhbHBoYV4qJCBmcm9tICROKFxhbHBoYV57KGotMSl9LFx0YXVeMikkCgogICAxLjMgTWFrZSAkXGFscGhhXnsoaSl9PVxhbHBoYV4qJCB3aXRoIHByb2JhYmlsaXR5IAogICAkJAogICBcbWluXGxlZnRcezEsXGZyYWN7cChcYWxwaGFeKnxcbWJveHtkYXRhfSxccGhpKSB9e3AoXGFscGhhXnsoaS0xKX18XG1ib3h7ZGF0YX0sXHBoaSkgfVxyaWdodFx9LgogICAkJAoyLiBTZXQgJGk9aSsxJCBhbmQgZ28gYmFjayB0byAxIHVudGlsICRpPU4rMSQKClNlIHNlcXVlbmNlIG9mIGRyYXdzICRceyhccGhpXnsoaSl9LFxhbHBoYV57KGkpfSlcfV97aT0xfV5OJCBjb252ZXJnZXMgdG8gZHJhd3MgZnJvbSB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiAkcChccGhpLFxhbHBoYXwgXG1ib3h7ZGF0YX0pJC4KCiMgUnVubmluZyB0aGUgTUNNQyBzY2hlbWUKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpsb2dwb3N0YWxwaGEgPSBmdW5jdGlvbihhbHBoYSxwaGkpewogIFggPSBjYmluZCh5WzE6KG4tMSldKmlmZWxzZSh5WzE6KG4tMSldPD1hbHBoYSwxLDApLHlbMToobi0xKV0qaWZlbHNlKHlbMToobi0xKV0+YWxwaGEsMSwwKSkKICBzdW0oZG5vcm0oWS1YJSolcGhpLGxvZz1UUlVFKSkKfQoKWSA9IHlbMjpuXQoKYWxwaGEgPSAwCgp0YXUgICA9IDAuMgoKbmRyYXdzID0gMjAwMDAKYnVybmluID0gMTAwMDAwCm5pdGVyID0gbmRyYXdzK2J1cm5pbgoKcGhpcyA9IG1hdHJpeCgwLG5pdGVyLDIpCmFscGhhcyA9IHJlcCgwLG5pdGVyKQpmb3IgKGl0ZXIgaW4gMTpuaXRlcil7CiAgWCA9IGNiaW5kKHlbMToobi0xKV0qaWZlbHNlKHlbMToobi0xKV08PWFscGhhLDEsMCkseVsxOihuLTEpXSppZmVsc2UoeVsxOihuLTEpXT5hbHBoYSwxLDApKQogIHYucGhpID0gc29sdmUodChYKSUqJVgpCiAgcGhpLmhhdCA9IHYucGhpJSoldChYKSUqJVkKICBwaGkgPSAgcGhpLmhhdCArIHQoY2hvbCh2LnBoaSkpJSolcm5vcm0oMikKICAKICBhbHBoYXN0YXIgPSBybm9ybSgxLGFscGhhLHRhdSkKICBsb2dhY2NlcHQgPSBtaW4oMCxsb2dwb3N0YWxwaGEoYWxwaGFzdGFyLHBoaSktbG9ncG9zdGFscGhhKGFscGhhLHBoaSkpCiAgaWYgKGxvZyhydW5pZigxKSk8bG9nYWNjZXB0KXsKICAgIGFscGhhID0gYWxwaGFzdGFyCiAgfQogIHBoaXNbaXRlcixdID0gcGhpCiAgYWxwaGFzW2l0ZXJdID0gYWxwaGEKfQpgYGAKCgojIyBNb25pdG9yaW5nIHRoZSBNYXJrb3YgY2hhaW5zCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KcGFyKG1mcm93PWMoMywzKSkKaW5kID0gc2VxKDEsbml0ZXIsYnk9MTAwKQpwbG90KGluZCxwaGlzW2luZCwxXSx4bGFiPSJJdGVyYXRpb25zIix5bGFiPSIiLG1haW49ZXhwcmVzc2lvbihwaGlbMV0pLHR5cGU9ImwiKQphYmxpbmUoaD1waGkxLnRydWUsY29sPTIsbHdkPTIpCmFibGluZSh2PWJ1cm5pbixjb2w9Myxsd2Q9MikKcGxvdChpbmQscGhpc1tpbmQsMl0seGxhYj0iSXRlcmF0aW9ucyIseWxhYj0iIixtYWluPWV4cHJlc3Npb24ocGhpWzJdKSx0eXBlPSJsIikKYWJsaW5lKGg9cGhpMi50cnVlLGNvbD0yLGx3ZD0yKQphYmxpbmUodj1idXJuaW4sY29sPTMsbHdkPTIpCnBsb3QoaW5kLGFscGhhc1tpbmRdLHhsYWI9Ikl0ZXJhdGlvbnMiLHlsYWI9IiIsbWFpbj1leHByZXNzaW9uKGFscGhhKSx0eXBlPSJsIikKYWJsaW5lKGg9YWxwaGEudHJ1ZSxjb2w9Mixsd2Q9MikKYWJsaW5lKHY9YnVybmluLGNvbD0zLGx3ZD0yKQoKcGhpcyA9IHBoaXNbKGJ1cm5pbisxKTpuaXRlcixdCmFscGhhcyA9IGFscGhhc1soYnVybmluKzEpOm5pdGVyXQoKdHMucGxvdChwaGlzWywxXSx4bGFiPSJJdGVyYXRpb25zIix5bGFiPSIiLG1haW49ZXhwcmVzc2lvbihwaGlbMV0pKQphYmxpbmUoaD1waGkxLnRydWUsY29sPTIsbHdkPTIpCnRzLnBsb3QocGhpc1ssMl0seGxhYj0iSXRlcmF0aW9ucyIseWxhYj0iIixtYWluPWV4cHJlc3Npb24ocGhpWzJdKSkKYWJsaW5lKGg9cGhpMi50cnVlLGNvbD0yLGx3ZD0yKQp0cy5wbG90KGFscGhhcyx4bGFiPSJJdGVyYXRpb25zIix5bGFiPSIiLG1haW49ZXhwcmVzc2lvbihhbHBoYSkpCmFibGluZShoPWFscGhhLnRydWUsY29sPTIsbHdkPTIpCgphY2YocGhpc1ssMV0sbWFpbj0iIikKYWNmKHBoaXNbLDJdLG1haW49IiIpCmFjZihhbHBoYXMsbWFpbj0iIikKYGBgCgojIyBNYXJnaW5hbCBwb3N0ZXJpb3JzCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KcGFyKG1mcm93PWMoMSwzKSkKaGlzdChwaGlzWywxXSxwcm9iPVRSVUUsbWFpbj1leHByZXNzaW9uKHBoaVsxXSkseGxhYj0iIikKYWJsaW5lKHY9cGhpMS50cnVlLGNvbD0yLGx3ZD0yKQpoaXN0KHBoaXNbLDJdLHByb2I9VFJVRSxtYWluPWV4cHJlc3Npb24ocGhpWzJdKSx4bGFiPSIiKQphYmxpbmUodj1waGkyLnRydWUsY29sPTIsbHdkPTIpCmhpc3QoYWxwaGFzLHByb2I9VFJVRSxtYWluPWV4cHJlc3Npb24oYWxwaGEpLHhsYWI9IiIpCmFibGluZSh2PWFscGhhLnRydWUsY29sPTIsbHdkPTIpCmBgYAoKCgo=