Introduction

In this exercise, \(\theta\) follows a standard Student’s \(t\) distribution with \(\nu\) degrees of freedom, i.e. \(\theta \sim t_\nu(0,1)\), and the goal is two-fold: sampling this distribution and approximating \(E(g(\theta))\) for some function \(g(\theta)\), \[ E[g(\theta)] = \int_{-\infty}^\infty g(\theta)p(\theta) d\theta. \] For instance, we will consider \(g_1(\theta)=\theta\), \(g_2(\theta)=(\theta-E(\theta))^2\) and \(g_3(\theta)=\delta(\theta>2.5)\), where \(\delta\) is the dirac function, ie. \(\delta(x)=1\) if \(x\) is true and zero otherwise. The integral \(E[g(\theta)]\) are the mean, variance and a tail probability. Let us consider \(\nu=4\), so quantities are known \[\begin{eqnarray*} E(\theta) &=& 0\\ V(\theta) &=& \frac{\nu}{\nu-2}=2\\ Pr(\theta>2.5) &=& 0.03338327. \end{eqnarray*}\]

Monte Carlo via importance sampling (MCIS)

We will assume that we can only sample from a proposal distribution, \(q(\theta)\), which in this case will be the Student’s \(t\) with one degree of freedom, \(t_1\), also commonly and widely known as the Cauchy distribution: \[ E[g(\theta)] = \int \frac{g(\theta)p(\theta)}{q(\theta)} q(\theta)d\theta. \] With draws \(\theta^{(i)}, \ i=1,\ldots,M\) from \(q(\theta)\), we can approximate the above integral by Monte Carlo integration, \[ E_1 = \frac{1}{M} \sum_{i=1}^M \frac{g(\theta^{(i)})p(\theta^{(i)})}{q(\theta^{(i)})}, \] or, based on SIR draws \({\tilde \theta}^{(i)}, \ i=1,\ldots,M\), \[ E_2 = \frac{1}{N} \sum_{i=1}^M {\tilde \theta}^{(i)}. \] We will see, in the exercise that follows, that \(V(E_1) \leq V(E_2)\).

Scale mixture of normals (SMN)

We will compare the above MC method with the following probability result: \[ \mbox{When} \ \ \theta|\nu,\sigma^2 \sim N(0,\sigma^2) \ \ \mbox{and} \ \ \sigma^2 \sim IG(\nu/2,\nu/2), \ \ \mbox{then} \ \ \theta|\nu \sim t_\nu(0,1), \] and we will assume we are able to sample from the normal and from the inverse-gamma distributions, as well. Therefore, \[ E[g(\theta)] = E[E(g(\theta)|\sigma^2)]. \]

When \(\sigma^{2(i)}, \ i=1,\ldots,M\) are drawn from \(IG(\nu/2,\nu/2)\) and \(\theta^{(i)} \sim N(0,\sigma^{2(i)})\), it follows that \(\theta^{(i)}, \ i=1,\ldots,M\) are exact draws from \(t_\nu\). We can approximate the above integral as \[ E_3 = \frac{1}{M} \sum_{i=1}^M E[g(\theta|\sigma^{2(i)})], \] or \[ E_4 =\frac{1}{M} \sum_{i=1}^n \theta^{(i)}. \]

nu  = 4

par(mfrow=c(1,1))
thetas = seq(-10,10,length=1000)
plot(thetas,dt(thetas,df=nu),xlab=expression(theta),ylab="Density",type="l",lwd=2)
lines(thetas,dcauchy(thetas),col=2,lwd=2)
legend("topleft",legend=c(paste("Target: Student's t(",nu,")",sep=""),
                          "Proposal: Cauchy"),col=1:2,lwd=2)

Comparison based on SIR and SMN draws

set.seed(54321)
M       = 10000
N       = M
th.prop = rcauchy(M)
w       = dt(th.prop,df=nu)/dcauchy(th.prop)
th.sir  = sample(th.prop,size=N,replace=TRUE,prob=w)
sig2    = 1/rgamma(N,nu/2,nu/2)
th.smn  = rnorm(N,0,sqrt(sig2))

breaks = seq(min(th.sir,th.smn),max(th.sir,th.smn),length=100)
par(mfrow=c(1,2))
hist(th.sir,breaks=breaks,xlim=c(-10,10),prob=TRUE,
     xlab=expression(theta),ylab="Density",main="")
lines(thetas,dt(thetas,df=nu),col=2,lwd=2)
title("MC via SIR")
hist(th.smn,breaks=breaks,xlim=c(-10,10),prob=TRUE,
     xlab=expression(theta),ylab="Density",main="")
lines(thetas,dt(thetas,df=nu),col=2,lwd=2)
title("MC via SMN")

True values versus MC-based approximations

true = c(0,nu/(nu-2),1-pt(2.5,df=nu))
MC.sir = c(mean(th.sir),var(th.sir),mean(th.sir>2.5))
MC.smn = c(mean(th.smn),var(th.smn),mean(th.smn>2.5))

cbind(true,MC.sir,MC.smn)
##            true     MC.sir      MC.smn
## [1,] 0.00000000 -0.0116427 0.002313822
## [2,] 2.00000000  1.9694401 2.010572448
## [3,] 0.03338327  0.0346000 0.035700000

Size of the MC error

set.seed(154321)
M      = 10000
N      = M
R      = 100
MC.sir = matrix(0,R,3)
MC.smn = matrix(0,R,3)
names  = c("Mean","Var","Pr(>2)")

par(mfrow=c(3,3))
for (nu in c(4,10,100)){
  true = c(0,nu/(nu-2),1-pt(2.5,df=nu))
  for (r in 1:R){
    # SIR
    th.prop    = rcauchy(M)
    w          = dt(th.prop,df=nu)/dcauchy(th.prop)
    th.sir     = sample(th.prop,size=N,replace=TRUE,prob=w)
    MC.sir[r,] = c(mean(th.sir),var(th.sir),mean(th.sir>2.5))
    # SMN
    sig2       = 1/rgamma(N,nu/2,nu/2)
    th.smn     = rnorm(N,0,sqrt(sig2))
    MC.smn[r,] = c(mean(th.smn),var(th.smn),mean(th.smn>2.5))
  }
  for (i in 1:3){
    boxplot(MC.sir[,i],MC.smn[,i],main="",ylab="MC approximation",names=c("SIR","SMN"))
    abline(h=true[i],col=2,lwd=2)
    title(paste(names[i]," - nu=",nu,"\n Relative RMSE = ",
          round(sqrt(var(MC.sir[,i]-true[i]))/
          sqrt(var(MC.smn[,i]-true[i])),2),sep=""))
  }
}

Raoblackwellization

We now compare the four approximations of \(E(g_3(\theta))=Pr(\theta>2.5|\nu=4)\). For MC approximations based on \(M=5000\) draws, we run \(R=100\) replications.

set.seed(154321)
nu   = 4
M    = 5000
N    = M
R    = 100
MC   = matrix(0,R,4)
true = 1-pt(2.5,df=nu)
for (r in 1:R){
  # SIR
  th.prop    = rcauchy(M)
  w          = dt(th.prop,df=nu)/dcauchy(th.prop)
  th.sir     = sample(th.prop,size=N,replace=TRUE,prob=w)
  cond       = ifelse(th.prop>2.5,1,0)
  MC[r,1:2]  = c(mean(cond*w),mean(th.sir>2.5))

  # SMN
  sig2      = 1/rgamma(N,nu/2,nu/2)
  th.smn    = rnorm(N,0,sqrt(sig2))
  MC[r,3:4] = c(mean(1-pnorm(2.5,0,sqrt(sig2))),mean(th.smn>2.5))
}
methods = c("SIR-RB","SIR","SMN-RB","SMN")
boxplot(MC,main="",ylab=paste("MC approximation - ",R," Replications",sep=""),names=methods)
abline(h=true,col=2,lwd=2)
title(paste("Pr(X>2.5|nu=",nu,")=",round(1-pt(2.5,df=nu),5),sep=""))

Relative root mean squared errors

RMSE = sqrt(apply((MC-true)^2,2,mean))
tab = cbind(round(RMSE,5),round(RMSE/RMSE[3],2))
colnames(tab) = c("RMSE","Relative RMSE")
rownames(tab) = methods
tab[c(2,4,1,3),]
##           RMSE Relative RMSE
## SIR    0.00330          4.97
## SMN    0.00284          4.28
## SIR-RB 0.00177          2.67
## SMN-RB 0.00066          1.00
LS0tCnRpdGxlOiAiTW9udGUgQ2FybG8gaW50ZWdyYXRpb24gYW5kIHNpbXVsYXRpb24iCnN1YnRpdGxlOiAiU0lSLCBzY2FsZSBtaXh0dXJlIG9mIG5vcm1hbHMgYW5kIHJhb2JsYWNrd2VsbGl6YXRpb24iCmF1dGhvcjogIkhlZGliZXJ0IEZyZWl0YXMgTG9wZXMiCmRhdGU6ICIyLzI1LzIwMjIiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDIKICAgIGNvZGVfZG93bmxvYWQ6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyBJbnRyb2R1Y3Rpb24KSW4gdGhpcyBleGVyY2lzZSwgJFx0aGV0YSQgZm9sbG93cyBhIHN0YW5kYXJkIFN0dWRlbnQncyAkdCQgZGlzdHJpYnV0aW9uIHdpdGggJFxudSQgZGVncmVlcyBvZiBmcmVlZG9tLCBpLmUuICRcdGhldGEgXHNpbSB0X1xudSgwLDEpJCwgYW5kIHRoZSBnb2FsIGlzIHR3by1mb2xkOiBzYW1wbGluZyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgYXBwcm94aW1hdGluZyAkRShnKFx0aGV0YSkpJCBmb3Igc29tZSBmdW5jdGlvbiAkZyhcdGhldGEpJCwKJCQKRVtnKFx0aGV0YSldID0gXGludF97LVxpbmZ0eX1eXGluZnR5IGcoXHRoZXRhKXAoXHRoZXRhKSBkXHRoZXRhLgokJApGb3IgaW5zdGFuY2UsIHdlIHdpbGwgY29uc2lkZXIgJGdfMShcdGhldGEpPVx0aGV0YSQsICRnXzIoXHRoZXRhKT0oXHRoZXRhLUUoXHRoZXRhKSleMiQgYW5kICRnXzMoXHRoZXRhKT1cZGVsdGEoXHRoZXRhPjIuNSkkLCB3aGVyZSAkXGRlbHRhJCBpcyB0aGUgZGlyYWMgZnVuY3Rpb24sIGllLiAkXGRlbHRhKHgpPTEkIGlmICR4JCBpcyB0cnVlIGFuZCB6ZXJvIG90aGVyd2lzZS4gIFRoZSBpbnRlZ3JhbCAkRVtnKFx0aGV0YSldJCBhcmUgdGhlIG1lYW4sIHZhcmlhbmNlIGFuZCBhIHRhaWwgcHJvYmFiaWxpdHkuICBMZXQgdXMgY29uc2lkZXIgJFxudT00JCwgc28gcXVhbnRpdGllcyBhcmUga25vd24KXGJlZ2lue2VxbmFycmF5Kn0KRShcdGhldGEpICY9JiAwXFwKVihcdGhldGEpICY9JiBcZnJhY3tcbnV9e1xudS0yfT0yXFwKUHIoXHRoZXRhPjIuNSkgJj0mIDAuMDMzMzgzMjcuClxlbmR7ZXFuYXJyYXkqfQoKIyBNb250ZSBDYXJsbyB2aWEgaW1wb3J0YW5jZSBzYW1wbGluZyAoTUNJUykKV2Ugd2lsbCBhc3N1bWUgdGhhdCB3ZSBjYW4gb25seSBzYW1wbGUgZnJvbSBhIHByb3Bvc2FsIGRpc3RyaWJ1dGlvbiwgJHEoXHRoZXRhKSQsIHdoaWNoIGluIHRoaXMgY2FzZSB3aWxsIGJlIHRoZSBTdHVkZW50J3MgJHQkIHdpdGggb25lIGRlZ3JlZSBvZiBmcmVlZG9tLCAkdF8xJCwgYWxzbyBjb21tb25seSBhbmQgd2lkZWx5IGtub3duIGFzIHRoZSBDYXVjaHkgZGlzdHJpYnV0aW9uOgokJApFW2coXHRoZXRhKV0gPSBcaW50IFxmcmFje2coXHRoZXRhKXAoXHRoZXRhKX17cShcdGhldGEpfSBxKFx0aGV0YSlkXHRoZXRhLgokJApXaXRoIGRyYXdzICRcdGhldGFeeyhpKX0sIFwgaT0xLFxsZG90cyxNJCBmcm9tICRxKFx0aGV0YSkkLCB3ZSBjYW4gYXBwcm94aW1hdGUgdGhlIGFib3ZlIGludGVncmFsIGJ5IE1vbnRlIENhcmxvIGludGVncmF0aW9uLAokJApFXzEgPSBcZnJhY3sxfXtNfSBcc3VtX3tpPTF9Xk0gXGZyYWN7ZyhcdGhldGFeeyhpKX0pcChcdGhldGFeeyhpKX0pfXtxKFx0aGV0YV57KGkpfSl9LAokJApvciwgYmFzZWQgb24gU0lSIGRyYXdzICR7XHRpbGRlIFx0aGV0YX1eeyhpKX0sIFwgaT0xLFxsZG90cyxNJCwKJCQKRV8yID0gXGZyYWN7MX17Tn0gXHN1bV97aT0xfV5NIHtcdGlsZGUgXHRoZXRhfV57KGkpfS4KJCQKV2Ugd2lsbCBzZWUsIGluIHRoZSBleGVyY2lzZSB0aGF0IGZvbGxvd3MsIHRoYXQgJFYoRV8xKSBcbGVxIFYoRV8yKSQuIAoKIyBTY2FsZSBtaXh0dXJlIG9mIG5vcm1hbHMgKFNNTikKV2Ugd2lsbCBjb21wYXJlIHRoZSBhYm92ZSBNQyBtZXRob2Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb2JhYmlsaXR5IHJlc3VsdDoKJCQKXG1ib3h7V2hlbn0gXCBcIFx0aGV0YXxcbnUsXHNpZ21hXjIgXHNpbSBOKDAsXHNpZ21hXjIpIFwgXCBcbWJveHthbmR9IFwgXCAKXHNpZ21hXjIgXHNpbSBJRyhcbnUvMixcbnUvMiksIFwgXCBcbWJveHt0aGVufSBcIFwgXHRoZXRhfFxudSBcc2ltIHRfXG51KDAsMSksCiQkCmFuZCB3ZSB3aWxsIGFzc3VtZSB3ZSBhcmUgYWJsZSB0byBzYW1wbGUgZnJvbSB0aGUgbm9ybWFsIGFuZCBmcm9tIHRoZSBpbnZlcnNlLWdhbW1hIGRpc3RyaWJ1dGlvbnMsIGFzIHdlbGwuICBUaGVyZWZvcmUsCiQkCkVbZyhcdGhldGEpXSA9IEVbRShnKFx0aGV0YSl8XHNpZ21hXjIpXS4KJCQKCldoZW4gJFxzaWdtYV57MihpKX0sIFwgaT0xLFxsZG90cyxNJCBhcmUgZHJhd24gZnJvbSAkSUcoXG51LzIsXG51LzIpJCBhbmQgCiRcdGhldGFeeyhpKX0gXHNpbSBOKDAsXHNpZ21hXnsyKGkpfSkkLCBpdCBmb2xsb3dzIHRoYXQgJFx0aGV0YV57KGkpfSwgXCBpPTEsXGxkb3RzLE0kIGFyZSBleGFjdCBkcmF3cyBmcm9tICR0X1xudSQuIFdlIGNhbiBhcHByb3hpbWF0ZSB0aGUgYWJvdmUgaW50ZWdyYWwgYXMKJCQKRV8zID0gXGZyYWN7MX17TX0gXHN1bV97aT0xfV5NIEVbZyhcdGhldGF8XHNpZ21hXnsyKGkpfSldLAokJApvciAKJCQKRV80ID1cZnJhY3sxfXtNfSBcc3VtX3tpPTF9Xm4gXHRoZXRhXnsoaSl9LgokJAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KbnUgID0gNAoKcGFyKG1mcm93PWMoMSwxKSkKdGhldGFzID0gc2VxKC0xMCwxMCxsZW5ndGg9MTAwMCkKcGxvdCh0aGV0YXMsZHQodGhldGFzLGRmPW51KSx4bGFiPWV4cHJlc3Npb24odGhldGEpLHlsYWI9IkRlbnNpdHkiLHR5cGU9ImwiLGx3ZD0yKQpsaW5lcyh0aGV0YXMsZGNhdWNoeSh0aGV0YXMpLGNvbD0yLGx3ZD0yKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKHBhc3RlKCJUYXJnZXQ6IFN0dWRlbnQncyB0KCIsbnUsIikiLHNlcD0iIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3Bvc2FsOiBDYXVjaHkiKSxjb2w9MToyLGx3ZD0yKQpgYGAKCgojIENvbXBhcmlzb24gYmFzZWQgb24gU0lSIGFuZCBTTU4gZHJhd3MKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CnNldC5zZWVkKDU0MzIxKQpNICAgICAgID0gMTAwMDAKTiAgICAgICA9IE0KdGgucHJvcCA9IHJjYXVjaHkoTSkKdyAgICAgICA9IGR0KHRoLnByb3AsZGY9bnUpL2RjYXVjaHkodGgucHJvcCkKdGguc2lyICA9IHNhbXBsZSh0aC5wcm9wLHNpemU9TixyZXBsYWNlPVRSVUUscHJvYj13KQpzaWcyICAgID0gMS9yZ2FtbWEoTixudS8yLG51LzIpCnRoLnNtbiAgPSBybm9ybShOLDAsc3FydChzaWcyKSkKCmJyZWFrcyA9IHNlcShtaW4odGguc2lyLHRoLnNtbiksbWF4KHRoLnNpcix0aC5zbW4pLGxlbmd0aD0xMDApCnBhcihtZnJvdz1jKDEsMikpCmhpc3QodGguc2lyLGJyZWFrcz1icmVha3MseGxpbT1jKC0xMCwxMCkscHJvYj1UUlVFLAogICAgIHhsYWI9ZXhwcmVzc2lvbih0aGV0YSkseWxhYj0iRGVuc2l0eSIsbWFpbj0iIikKbGluZXModGhldGFzLGR0KHRoZXRhcyxkZj1udSksY29sPTIsbHdkPTIpCnRpdGxlKCJNQyB2aWEgU0lSIikKaGlzdCh0aC5zbW4sYnJlYWtzPWJyZWFrcyx4bGltPWMoLTEwLDEwKSxwcm9iPVRSVUUsCiAgICAgeGxhYj1leHByZXNzaW9uKHRoZXRhKSx5bGFiPSJEZW5zaXR5IixtYWluPSIiKQpsaW5lcyh0aGV0YXMsZHQodGhldGFzLGRmPW51KSxjb2w9Mixsd2Q9MikKdGl0bGUoIk1DIHZpYSBTTU4iKQpgYGAKCiMjIFRydWUgdmFsdWVzIHZlcnN1cyBNQy1iYXNlZCBhcHByb3hpbWF0aW9ucwpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQoKdHJ1ZSA9IGMoMCxudS8obnUtMiksMS1wdCgyLjUsZGY9bnUpKQpNQy5zaXIgPSBjKG1lYW4odGguc2lyKSx2YXIodGguc2lyKSxtZWFuKHRoLnNpcj4yLjUpKQpNQy5zbW4gPSBjKG1lYW4odGguc21uKSx2YXIodGguc21uKSxtZWFuKHRoLnNtbj4yLjUpKQoKY2JpbmQodHJ1ZSxNQy5zaXIsTUMuc21uKQpgYGAKCiMjIFNpemUgb2YgdGhlIE1DIGVycm9yCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0Kc2V0LnNlZWQoMTU0MzIxKQpNICAgICAgPSAxMDAwMApOICAgICAgPSBNClIgICAgICA9IDEwMApNQy5zaXIgPSBtYXRyaXgoMCxSLDMpCk1DLnNtbiA9IG1hdHJpeCgwLFIsMykKbmFtZXMgID0gYygiTWVhbiIsIlZhciIsIlByKD4yKSIpCgpwYXIobWZyb3c9YygzLDMpKQpmb3IgKG51IGluIGMoNCwxMCwxMDApKXsKICB0cnVlID0gYygwLG51LyhudS0yKSwxLXB0KDIuNSxkZj1udSkpCiAgZm9yIChyIGluIDE6Uil7CiAgICAjIFNJUgogICAgdGgucHJvcCAgICA9IHJjYXVjaHkoTSkKICAgIHcgICAgICAgICAgPSBkdCh0aC5wcm9wLGRmPW51KS9kY2F1Y2h5KHRoLnByb3ApCiAgICB0aC5zaXIgICAgID0gc2FtcGxlKHRoLnByb3Asc2l6ZT1OLHJlcGxhY2U9VFJVRSxwcm9iPXcpCiAgICBNQy5zaXJbcixdID0gYyhtZWFuKHRoLnNpciksdmFyKHRoLnNpciksbWVhbih0aC5zaXI+Mi41KSkKICAgICMgU01OCiAgICBzaWcyICAgICAgID0gMS9yZ2FtbWEoTixudS8yLG51LzIpCiAgICB0aC5zbW4gICAgID0gcm5vcm0oTiwwLHNxcnQoc2lnMikpCiAgICBNQy5zbW5bcixdID0gYyhtZWFuKHRoLnNtbiksdmFyKHRoLnNtbiksbWVhbih0aC5zbW4+Mi41KSkKICB9CiAgZm9yIChpIGluIDE6Myl7CiAgICBib3hwbG90KE1DLnNpclssaV0sTUMuc21uWyxpXSxtYWluPSIiLHlsYWI9Ik1DIGFwcHJveGltYXRpb24iLG5hbWVzPWMoIlNJUiIsIlNNTiIpKQogICAgYWJsaW5lKGg9dHJ1ZVtpXSxjb2w9Mixsd2Q9MikKICAgIHRpdGxlKHBhc3RlKG5hbWVzW2ldLCIgLSBudT0iLG51LCJcbiBSZWxhdGl2ZSBSTVNFID0gIiwKICAgICAgICAgIHJvdW5kKHNxcnQodmFyKE1DLnNpclssaV0tdHJ1ZVtpXSkpLwogICAgICAgICAgc3FydCh2YXIoTUMuc21uWyxpXS10cnVlW2ldKSksMiksc2VwPSIiKSkKICB9Cn0KYGBgCgojIFJhb2JsYWNrd2VsbGl6YXRpb24KV2Ugbm93IGNvbXBhcmUgdGhlIGZvdXIgYXBwcm94aW1hdGlvbnMgb2YgJEUoZ18zKFx0aGV0YSkpPVByKFx0aGV0YT4yLjV8XG51PTQpJC4gRm9yIE1DIGFwcHJveGltYXRpb25zIGJhc2VkIG9uICRNPTUwMDAkIGRyYXdzLCB3ZSBydW4gJFI9MTAwJCByZXBsaWNhdGlvbnMuCmBgYHtyfQpzZXQuc2VlZCgxNTQzMjEpCm51ICAgPSA0Ck0gICAgPSA1MDAwCk4gICAgPSBNClIgICAgPSAxMDAKTUMgICA9IG1hdHJpeCgwLFIsNCkKdHJ1ZSA9IDEtcHQoMi41LGRmPW51KQpmb3IgKHIgaW4gMTpSKXsKICAjIFNJUgogIHRoLnByb3AgICAgPSByY2F1Y2h5KE0pCiAgdyAgICAgICAgICA9IGR0KHRoLnByb3AsZGY9bnUpL2RjYXVjaHkodGgucHJvcCkKICB0aC5zaXIgICAgID0gc2FtcGxlKHRoLnByb3Asc2l6ZT1OLHJlcGxhY2U9VFJVRSxwcm9iPXcpCiAgY29uZCAgICAgICA9IGlmZWxzZSh0aC5wcm9wPjIuNSwxLDApCiAgTUNbciwxOjJdICA9IGMobWVhbihjb25kKncpLG1lYW4odGguc2lyPjIuNSkpCgogICMgU01OCiAgc2lnMiAgICAgID0gMS9yZ2FtbWEoTixudS8yLG51LzIpCiAgdGguc21uICAgID0gcm5vcm0oTiwwLHNxcnQoc2lnMikpCiAgTUNbciwzOjRdID0gYyhtZWFuKDEtcG5vcm0oMi41LDAsc3FydChzaWcyKSkpLG1lYW4odGguc21uPjIuNSkpCn0KYGBgCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQptZXRob2RzID0gYygiU0lSLVJCIiwiU0lSIiwiU01OLVJCIiwiU01OIikKYm94cGxvdChNQyxtYWluPSIiLHlsYWI9cGFzdGUoIk1DIGFwcHJveGltYXRpb24gLSAiLFIsIiBSZXBsaWNhdGlvbnMiLHNlcD0iIiksbmFtZXM9bWV0aG9kcykKYWJsaW5lKGg9dHJ1ZSxjb2w9Mixsd2Q9MikKdGl0bGUocGFzdGUoIlByKFg+Mi41fG51PSIsbnUsIik9Iixyb3VuZCgxLXB0KDIuNSxkZj1udSksNSksc2VwPSIiKSkKYGBgCgojIyBSZWxhdGl2ZSByb290IG1lYW4gc3F1YXJlZCBlcnJvcnMKYGBge3J9ClJNU0UgPSBzcXJ0KGFwcGx5KChNQy10cnVlKV4yLDIsbWVhbikpCnRhYiA9IGNiaW5kKHJvdW5kKFJNU0UsNSkscm91bmQoUk1TRS9STVNFWzNdLDIpKQpjb2xuYW1lcyh0YWIpID0gYygiUk1TRSIsIlJlbGF0aXZlIFJNU0UiKQpyb3duYW1lcyh0YWIpID0gbWV0aG9kcwp0YWJbYygyLDQsMSwzKSxdCmBgYAoKCgo=