1. Data

import data from web source

# import data from web source
cons.df<- read.table("http://web.uvic.ca/~dgiles/blog/consump.dat",header=T)

data, demeaned, scaled

consump<- (cons.df$CONS-mean(cons.df$CONS))/1000
income<- (cons.df$Y-mean(cons.df$Y)) /1000
year<- cons.df$YEAR

2. MLE estimator

ols and mle, non constant

# ols and mle, non constant
mle<- lm(consump~income -1)
summary(mle)

Call:
lm(formula = consump ~ income - 1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.043304 -0.002994  0.001686  0.008586  0.047164 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)    
income  0.89848    0.00581   154.7   <2e-16 ***
---
Signif. codes:  0 ?**?0.001 ?*?0.01 ??0.05 ??0.1 ??1

Residual standard error: 0.01869 on 35 degrees of freedom
Multiple R-squared:  0.9985,    Adjusted R-squared:  0.9985 
F-statistic: 2.392e+04 on 1 and 35 DF,  p-value: < 2.2e-16

prepare data for later computation

c2<-consump^2
y2<-income^2
cy<-consump*income

3. Prior

Prior for \(\pi\) marginal propencity of consumption: mean and variance

\[\mu_{\pi} = 0.8\]

\[ \sigma^2_{\pi} = 0.001\]

pm<- 0.8
pv<- 0.001
n<- length(consump)

deduce prior parameters for \(\beta\)

Joint prior distribution

\[ p(\pi) \sim \mathrm{Beta}(\pi| \alpha, \beta) \]

\[ p(\sigma) \propto 1/\sigma \]

We know that

\[\bar{\pi}=\alpha/(\alpha + \beta)=0.8 \]

and

\[ \sigma^2_{\pi} = \frac{\alpha\beta}{(\alpha + \beta)^{2}(\alpha + \beta + 1)} = 0.0001 \]

See page 2

 
alpha<- (1/pv)*pm*(pm*(1-pm)-pv)
gamma<- (1/pv)*(1-pm)*(pm*(1-pm)-pv)

Prior pdf for Marginal propencity of consumption

curve(dbeta( x, shape1 =  alpha, shape2 = gamma), 
      from = 0.64, to = 0.92 ,col="red",xlab= "Pi",
     ylab="Density", main="Prior pdf for MPC" ,lwd=3)

      
#       
#  curve(dgamma(x,shape=s+a,rate=n+b),col=”red”,xlab=”LAMBDA”,
# +   ylab=”DENSITY”,lwd=3,from=3,to=25)
# > curve(dgamma(x,shape=a,rate=b),col=”blue”,lwd=3,add=TRUE)
# > curve(dgamma(x,shape=s+1,rate=n),col=”green”,lwd=3,add=TRUE)
# > legend(“topright”,c(“PRIOR”,”LIKELIHOOD”,”POSTERIOR”),
# +  col=c(“blue”,”green”,”red”),lty=1,lwd=3)      
    

4. Joint Posterior

On page 4 we get joint posterior, then what we can do is to get marginal Posteriors for \(b\) and \(\sigma\)

\[p(\pi, \sigma | c)\]

And then we can get the Bayes’ point estimators by using some loss functions

\(c, c^2, y^2 \ \text and \ cy\) are data

4.1 First integrate through sigma to get a marginal posterior for \(\pi\)

\(\sigma\) can take value from 0 to \(\infty\)

Then we get

\[p(\pi |c)\]

make a function which can be fed in R using native integrate function from page 5/6

integrand<- function(b){(b^(alpha-1))*((1-b)^(gamma-1))/(sum(c2)+b^2*sum(y2)-
                                                       2*b*sum(cy))^(n/2)}

to get normalizing constant \(k\) page 6

(norm<- 1/integrate(integrand, lower = 0, upper = 1)$value)
[1] 5089.043

4.2 Posterior mean for MPC

under quadratic loss, function for mean of the posterior

posterior mean, integrate through beta from 0 to 1, page 7

page 7

\[\int_{0}^{1} \pi p(\pi |c) d \pi \]

See there is one more b in the front of integrand

integrand<- function(b) {b*(b^(alpha-1))*((1-b)^(gamma-1))/(sum(c2)+b^2*sum(y2)-
                                                              2*b*sum(cy))^(n/2)}
(post_mean<- norm*integrate(integrand, lower = 0, upper = 1)$value)
[1] 0.8931085

The “posterior uncertainty” about MPC \(\pi\) can be measured, for instance, by computing

Notice (b-post_mean)^2 in the integrand, same pdf and same normalized constant.

#  posterior variance,  page 7
integrand<- function(b) {(b-post_mean)^2*(b^(alpha-1))*
    ((1-b)^(gamma-1))/(sum(c2)+b^2*sum(y2)-2*b*sum(cy))^(n/2)}
(post_var<- norm*integrate(integrand, lower = 0, upper = 1)$value)
[1] 1.115461e-05

4.4 Prior

# generate prior densicy
b<- seq(0.68 , 0.93, 0.00001)
prior<- dbeta(b,alpha, gamma)

4.5 Likelihood

\[ p(c | \pi, \sigma) \propto \left((n-1)\sigma^2 + (\pi - \pi_{mle})^2 \sum y^2 \right)^{\frac{n-1}{2}} \]

#  mle estimators for slope/mpc: beta and standard diviation: sigma 
sig<- summary(mle)$sigma
bmle<- summary(mle)$coef[1]
# function for integration of likelihood
integrand<- function(b) {((n-1)*sig^2+(b-bmle)^2*sum(y2))^(-(n-1)/2)} 
(norml<-1/integrate(integrand, lower = 0, upper = 1)$value)
[1] 2.272411e-32
# likelihood/ density function 
mlf<- norml*((n-1)*sig^2+(b-bmle)^2*sum(y2))^(-(n-1)/2)

4.6 marginalize the Joint Posterior for \(\sigma\) by integrating out \(\pi\).

to get

\[ p(\sigma | c)\]

See page 8 and 9, but we do not do it in this lab

4.7 Plot Prior, Likelihood, and Posterior

posterior of MPC , see page 6

# posterior of MPC , see page 6
posterior<- norm*((b)^(alpha-1))*((1-b)^(gamma-1))/(sum(c2)+b^2*sum(y2)
-2*b*sum(cy))^(n/2)

Mode of posterior of MPC

which( posterior ==   max(posterior)) 
[1] 21354
posterior[which( posterior ==   max(posterior)) ]
[1] 69.435
# calculate posterior mode
o<- order(posterior)
temp<- b[o]
(post_mode<- temp[25001])
[1] 0.89353

Comparision

plot(b, posterior, type="l", lwd=2, col="blue",xlab="Beta", ylab="Densities")
lines(b, prior, lwd=2,col="red")
lines(b, mlf, lwd=2, col="black")
#abline(v = post_mean, col = "blue", lwd =2 )
title(main="Consumption Function Example")
mtext("(Prior Mean = 0.8 ; Prior Variance = 0.001)")
legend(0.7,50,lty=c(1,1,1), lwd=c(2,2,2), col=c("red","black", "blue"), c("Prior","Likelihood","Posterior"))

Different point estimators

bmle # MLE of Beta
[1] 0.8984838
post_mean # Posterior Mean for Beta
[1] 0.8931085
post_var # Posterior Variance for Beta
[1] 1.115461e-05
post_mode # Posterior Mode for Beta
[1] 0.89353
LS0tDQp0aXRsZTogIkVDT041NDYgbGFiOCBCYXllc2lhbiBFc3RpbWF0aW9uIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQojIDEuIERhdGENCg0KIyMgaW1wb3J0IGRhdGEgZnJvbSB3ZWIgc291cmNlDQoNCmBgYHtyfQ0KDQojIGltcG9ydCBkYXRhIGZyb20gd2ViIHNvdXJjZQ0KY29ucy5kZjwtIHJlYWQudGFibGUoImh0dHA6Ly93ZWIudXZpYy5jYS9+ZGdpbGVzL2Jsb2cvY29uc3VtcC5kYXQiLGhlYWRlcj1UKQ0KDQoNCg0KYGBgDQoNCg0KDQoNCiMjIGRhdGEsIGRlbWVhbmVkLCBzY2FsZWQNCg0KYGBge3J9DQoNCmNvbnN1bXA8LSAoY29ucy5kZiRDT05TLW1lYW4oY29ucy5kZiRDT05TKSkvMTAwMA0KaW5jb21lPC0gKGNvbnMuZGYkWS1tZWFuKGNvbnMuZGYkWSkpIC8xMDAwDQp5ZWFyPC0gY29ucy5kZiRZRUFSDQpgYGANCg0KDQojIDIuIE1MRSBlc3RpbWF0b3INCg0KIyMgb2xzIGFuZCBtbGUsIG5vbiBjb25zdGFudA0KDQpgYGB7cn0NCiMgb2xzIGFuZCBtbGUsIG5vbiBjb25zdGFudA0KbWxlPC0gbG0oY29uc3VtcH5pbmNvbWUgLTEpDQpzdW1tYXJ5KG1sZSkNCmBgYA0KDQoNCiMjIHByZXBhcmUgZGF0YSBmb3IgbGF0ZXIgY29tcHV0YXRpb24NCg0KYGBge3J9DQoNCmMyPC1jb25zdW1wXjINCnkyPC1pbmNvbWVeMg0KY3k8LWNvbnN1bXAqaW5jb21lDQpgYGANCg0KDQoNCiMgMy4gUHJpb3INCg0KIyMgUHJpb3IgZm9yICRccGkkIG1hcmdpbmFsIHByb3BlbmNpdHkgb2YgY29uc3VtcHRpb246IG1lYW4gYW5kIHZhcmlhbmNlIA0KJCRcbXVfe1xwaX0gPSAwLjgkJA0KDQokJCBcc2lnbWFeMl97XHBpfSA9IDAuMDAxJCQNCg0KDQoNCg0KDQpgYGB7cn0NCg0KcG08LSAwLjgNCnB2PC0gMC4wMDENCm48LSBsZW5ndGgoY29uc3VtcCkNCmBgYA0KDQojIyBkZWR1Y2UgcHJpb3IgcGFyYW1ldGVycyBmb3IgJFxiZXRhJA0KDQoNCkpvaW50IHByaW9yIGRpc3RyaWJ1dGlvbg0KDQokJCBwKFxwaSkgIFxzaW0gXG1hdGhybXtCZXRhfShccGl8IFxhbHBoYSwgXGJldGEpICQkDQoNCg0KJCQgcChcc2lnbWEpIFxwcm9wdG8gMS9cc2lnbWEgICQkDQoNCldlIGtub3cgdGhhdA0KDQokJFxiYXJ7XHBpfT1cYWxwaGEvKFxhbHBoYSArIFxiZXRhKT0wLjgNCiQkDQoNCmFuZCANCg0KJCQgIFxzaWdtYV4yX3tccGl9ID0gXGZyYWN7XGFscGhhXGJldGF9eyhcYWxwaGEgKyBcYmV0YSleezJ9KFxhbHBoYSArIFxiZXRhICsgMSl9ID0gMC4wMDAxDQokJA0KDQpTZWUgcGFnZSAyDQoNCmBgYHtyfQ0KIA0KYWxwaGE8LSAoMS9wdikqcG0qKHBtKigxLXBtKS1wdikNCmdhbW1hPC0gKDEvcHYpKigxLXBtKSoocG0qKDEtcG0pLXB2KQ0KYGBgDQoNCg0KIyMgUHJpb3IgcGRmIGZvciBNYXJnaW5hbCBwcm9wZW5jaXR5IG9mIGNvbnN1bXB0aW9uDQoNCg0KYGBge3J9DQpjdXJ2ZShkYmV0YSggeCwgc2hhcGUxID0gIGFscGhhLCBzaGFwZTIgPSBnYW1tYSksIA0KICAgICAgZnJvbSA9IDAuNjQsIHRvID0gMC45MiAsY29sPSJyZWQiLHhsYWI9ICJQaSIsDQogICAgIHlsYWI9IkRlbnNpdHkiLCBtYWluPSJQcmlvciBwZGYgZm9yIE1QQyIgLGx3ZD0zKQ0KICAgICAgDQojICAgICAgIA0KIyAgY3VydmUoZGdhbW1hKHgsc2hhcGU9cythLHJhdGU9bitiKSxjb2w94oCdcmVk4oCdLHhsYWI94oCdTEFNQkRB4oCdLA0KIyArICAgeWxhYj3igJ1ERU5TSVRZ4oCdLGx3ZD0zLGZyb209Myx0bz0yNSkNCiMgPiBjdXJ2ZShkZ2FtbWEoeCxzaGFwZT1hLHJhdGU9YiksY29sPeKAnWJsdWXigJ0sbHdkPTMsYWRkPVRSVUUpDQojID4gY3VydmUoZGdhbW1hKHgsc2hhcGU9cysxLHJhdGU9biksY29sPeKAnWdyZWVu4oCdLGx3ZD0zLGFkZD1UUlVFKQ0KIyA+IGxlZ2VuZCjigJx0b3ByaWdodOKAnSxjKOKAnFBSSU9S4oCdLOKAnUxJS0VMSUhPT0TigJ0s4oCdUE9TVEVSSU9S4oCdKSwNCiMgKyAgY29sPWMo4oCcYmx1ZeKAnSzigJ1ncmVlbuKAnSzigJ1yZWTigJ0pLGx0eT0xLGx3ZD0zKSAgICAgIA0KICAgIA0KYGBgDQoNCg0KDQojIDQuIEpvaW50IFBvc3Rlcmlvcg0KDQojIyBPbiBwYWdlIDQgd2UgZ2V0IGpvaW50IHBvc3RlcmlvciwgdGhlbiB3aGF0IHdlIGNhbiBkbyBpcyB0byBnZXQgbWFyZ2luYWwgUG9zdGVyaW9ycyBmb3IgJGIkIGFuZCAkXHNpZ21hJA0KDQoNCiQkcChccGksIFxzaWdtYSB8IGMpJCQNCg0KQW5kIHRoZW4gd2UgY2FuIGdldCB0aGUgQmF5ZXMnIHBvaW50IGVzdGltYXRvcnMgYnkgdXNpbmcgc29tZSBsb3NzIGZ1bmN0aW9ucw0KDQoNCg0KDQoNCg0KJGMsIGNeMiwgeV4yIFwgXHRleHQgYW5kIFwgY3kkIGFyZSBkYXRhDQoNCiMjIDQuMSBGaXJzdCBpbnRlZ3JhdGUgdGhyb3VnaCBzaWdtYSB0byBnZXQgYSBtYXJnaW5hbCBwb3N0ZXJpb3IgZm9yICRccGkkDQoNCiRcc2lnbWEkIGNhbiB0YWtlIHZhbHVlIGZyb20gMCB0byAkXGluZnR5JA0KDQpUaGVuIHdlIGdldA0KDQokJHAoXHBpIHxjKSQkDQoNCg0KDQoNCiMjIG1ha2UgYSBmdW5jdGlvbiB3aGljaCBjYW4gYmUgZmVkIGluIFIgdXNpbmcgbmF0aXZlIGludGVncmF0ZSBmdW5jdGlvbiBmcm9tIHBhZ2UgNS82DQoNCg0KYGBge3J9DQoNCmludGVncmFuZDwtIGZ1bmN0aW9uKGIpeyhiXihhbHBoYS0xKSkqKCgxLWIpXihnYW1tYS0xKSkvKHN1bShjMikrYl4yKnN1bSh5MiktDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMipiKnN1bShjeSkpXihuLzIpfQ0KYGBgDQoNCiMjICB0byBnZXQgbm9ybWFsaXppbmcgY29uc3RhbnQgJGskIHBhZ2UgNg0KDQoNCg0KDQpgYGB7cn0NCihub3JtPC0gMS9pbnRlZ3JhdGUoaW50ZWdyYW5kLCBsb3dlciA9IDAsIHVwcGVyID0gMSkkdmFsdWUpDQpgYGANCg0KIyMgNC4yIFBvc3RlcmlvciBtZWFuIGZvciBNUEMNCg0KIyMgdW5kZXIgcXVhZHJhdGljIGxvc3MsIGZ1bmN0aW9uIGZvciBtZWFuIG9mIHRoZSBwb3N0ZXJpb3INCiMjIHBvc3RlcmlvciBtZWFuLCBpbnRlZ3JhdGUgdGhyb3VnaCBiZXRhIGZyb20gMCB0byAxLCBwYWdlIDcNCg0KcGFnZSA3DQoNCiQkXGludF97MH1eezF9IFxwaSBwKFxwaSB8YykgZCBccGkgJCQNCg0KDQpTZWUgdGhlcmUgaXMgb25lIG1vcmUgYGJgIGluIHRoZSBmcm9udCBvZiBpbnRlZ3JhbmQNCg0KDQpgYGB7cn0NCg0KaW50ZWdyYW5kPC0gZnVuY3Rpb24oYikge2IqKGJeKGFscGhhLTEpKSooKDEtYileKGdhbW1hLTEpKS8oc3VtKGMyKStiXjIqc3VtKHkyKS0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMipiKnN1bShjeSkpXihuLzIpfQ0KDQoocG9zdF9tZWFuPC0gbm9ybSppbnRlZ3JhdGUoaW50ZWdyYW5kLCBsb3dlciA9IDAsIHVwcGVyID0gMSkkdmFsdWUpDQpgYGANCg0KDQojIyBUaGUgInBvc3RlcmlvciB1bmNlcnRhaW50eSIgYWJvdXQgTVBDICAkXHBpJO6fmiBjYW4gYmUgbWVhc3VyZWQsIGZvciBpbnN0YW5jZSwgYnkgY29tcHV0aW5nDQoNCk5vdGljZSAgYChiLXBvc3RfbWVhbileMmAgaW4gdGhlIGludGVncmFuZCwgc2FtZSBwZGYgYW5kIHNhbWUgbm9ybWFsaXplZCBjb25zdGFudC4NCg0KYGBge3J9DQojICBwb3N0ZXJpb3IgdmFyaWFuY2UsICBwYWdlIDcNCmludGVncmFuZDwtIGZ1bmN0aW9uKGIpIHsoYi1wb3N0X21lYW4pXjIqKGJeKGFscGhhLTEpKSoNCiAgICAoKDEtYileKGdhbW1hLTEpKS8oc3VtKGMyKStiXjIqc3VtKHkyKS0yKmIqc3VtKGN5KSleKG4vMil9DQoocG9zdF92YXI8LSBub3JtKmludGVncmF0ZShpbnRlZ3JhbmQsIGxvd2VyID0gMCwgdXBwZXIgPSAxKSR2YWx1ZSkNCmBgYA0KDQojIDQuNCBQcmlvcg0KDQpgYGB7cn0NCiMgZ2VuZXJhdGUgcHJpb3IgZGVuc2ljeQ0KYjwtIHNlcSgwLjY4ICwgMC45MywgMC4wMDAwMSkNCnByaW9yPC0gZGJldGEoYixhbHBoYSwgZ2FtbWEpDQpgYGANCg0KDQojIDQuNSBMaWtlbGlob29kDQoNCg0KJCQgcChjIHwgXHBpLCBcc2lnbWEpIFxwcm9wdG8gICBcbGVmdCgobi0xKVxzaWdtYV4yICsgKFxwaSAtIFxwaV97bWxlfSleMiBcc3VtIHleMiBccmlnaHQpXntcZnJhY3tuLTF9ezJ9fSAgJCQNCg0KYGBge3J9DQojICBtbGUgZXN0aW1hdG9ycyBmb3Igc2xvcGUvbXBjOiBiZXRhIGFuZCBzdGFuZGFyZCBkaXZpYXRpb246IHNpZ21hIA0Kc2lnPC0gc3VtbWFyeShtbGUpJHNpZ21hDQpibWxlPC0gc3VtbWFyeShtbGUpJGNvZWZbMV0NCg0KDQojIGZ1bmN0aW9uIGZvciBpbnRlZ3JhdGlvbiBvZiBsaWtlbGlob29kDQppbnRlZ3JhbmQ8LSBmdW5jdGlvbihiKSB7KChuLTEpKnNpZ14yKyhiLWJtbGUpXjIqc3VtKHkyKSleKC0obi0xKS8yKX0gDQoNCihub3JtbDwtMS9pbnRlZ3JhdGUoaW50ZWdyYW5kLCBsb3dlciA9IDAsIHVwcGVyID0gMSkkdmFsdWUpDQoNCiMgbGlrZWxpaG9vZC8gZGVuc2l0eSBmdW5jdGlvbiANCm1sZjwtIG5vcm1sKigobi0xKSpzaWdeMisoYi1ibWxlKV4yKnN1bSh5MikpXigtKG4tMSkvMikNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQojIyA0LjYgIG1hcmdpbmFsaXplIHRoZSBKb2ludCBQb3N0ZXJpb3IgZm9yICRcc2lnbWEkIGJ5IGludGVncmF0aW5nIG91dCAkXHBpJO6fmi4gDQoNCnRvIGdldCANCg0KJCQgcChcc2lnbWEgfCBjKSQkDQoNClNlZSBwYWdlIDggYW5kIDksIGJ1dCB3ZSBkbyBub3QgZG8gaXQgaW4gdGhpcyBsYWINCg0KDQoNCiMjIDQuNyBQbG90IFByaW9yLCBMaWtlbGlob29kLCBhbmQgUG9zdGVyaW9yDQoNCg0KDQojIyBwb3N0ZXJpb3Igb2YgTVBDICwgc2VlIHBhZ2UgNg0KYGBge3J9DQoNCiMgcG9zdGVyaW9yIG9mIE1QQyAsIHNlZSBwYWdlIDYNCnBvc3RlcmlvcjwtIG5vcm0qKChiKV4oYWxwaGEtMSkpKigoMS1iKV4oZ2FtbWEtMSkpLyhzdW0oYzIpK2JeMipzdW0oeTIpDQotMipiKnN1bShjeSkpXihuLzIpDQpgYGANCg0KDQojIyBNb2RlIG9mIHBvc3RlcmlvciBvZiBNUEMgDQoNCmBgYHtyfQ0Kd2hpY2goIHBvc3RlcmlvciA9PSAgIG1heChwb3N0ZXJpb3IpKSANCnBvc3Rlcmlvclt3aGljaCggcG9zdGVyaW9yID09ICAgbWF4KHBvc3RlcmlvcikpIF0NCg0KIyBjYWxjdWxhdGUgcG9zdGVyaW9yIG1vZGUNCm88LSBvcmRlcihwb3N0ZXJpb3IpDQp0ZW1wPC0gYltvXQ0KKHBvc3RfbW9kZTwtIHRlbXBbMjUwMDFdKQ0KYGBgDQoNCg0KDQoNCiMjIENvbXBhcmlzaW9uDQoNCmBgYHtyfQ0KDQpwbG90KGIsIHBvc3RlcmlvciwgdHlwZT0ibCIsIGx3ZD0yLCBjb2w9ImJsdWUiLHhsYWI9IkJldGEiLCB5bGFiPSJEZW5zaXRpZXMiKQ0KbGluZXMoYiwgcHJpb3IsIGx3ZD0yLGNvbD0icmVkIikNCmxpbmVzKGIsIG1sZiwgbHdkPTIsIGNvbD0iYmxhY2siKQ0KI2FibGluZSh2ID0gcG9zdF9tZWFuLCBjb2wgPSAiYmx1ZSIsIGx3ZCA9MiApDQp0aXRsZShtYWluPSJDb25zdW1wdGlvbiBGdW5jdGlvbiBFeGFtcGxlIikNCm10ZXh0KCIoUHJpb3IgTWVhbiA9IDAuOCA7IFByaW9yIFZhcmlhbmNlID0gMC4wMDEpIikNCmxlZ2VuZCgwLjcsNTAsbHR5PWMoMSwxLDEpLCBsd2Q9YygyLDIsMiksIGNvbD1jKCJyZWQiLCJibGFjayIsICJibHVlIiksIGMoIlByaW9yIiwiTGlrZWxpaG9vZCIsIlBvc3RlcmlvciIpKQ0KDQpgYGANCg0KDQojIyBEaWZmZXJlbnQgcG9pbnQgZXN0aW1hdG9ycw0KDQpgYGB7cn0NCmJtbGUgIyBNTEUgb2YgQmV0YQ0KcG9zdF9tZWFuICMgUG9zdGVyaW9yIE1lYW4gZm9yIEJldGENCnBvc3RfdmFyICMgUG9zdGVyaW9yIFZhcmlhbmNlIGZvciBCZXRhDQpwb3N0X21vZGUgIyBQb3N0ZXJpb3IgTW9kZSBmb3IgQmV0YQ0KYGBgDQoNCg==