Do sada smo parametar \(\theta\) posmatrali kao fiksiran broj čija je vrijednost nepoznata i koristili podatke da ocijenimo njegovu vrijednost. Tačnije, tretirali smo uzorak kao realizaciju nekih slučajnih veličina, a parametar kao konstantu. Bajesovski pristup u ocjenjivanju parametara opisuje neodređenost parametra \(\theta\) raspodjelom vjerovatnoća na nekom prostoru dopustivih parametara \(\Theta\). Ovaj pristup se sastoji u tome da se za \(\theta\) pretpostavi neka raspodjela koju nazivamo apriornom raspodjelom, a \(p(x|\theta)\) bi bila raspodjela uzorka pri datom \(\theta\) (ta raspodjela može biti diskretna ili apsolutno neprekidna, pa u zavisnosti od toga \(p(x|\theta)\) je funkcija gustine ili vjerovatnoća iz zakona raspodjele).
Neka su \(X=(X_1,X_2,\dots,X_n)\) slučajne veličine sa zajedničkom raspodjelom \(p(x|\theta)\), gdje je \(\theta\) realan parametar iz skupa \(\Theta\). \(q(\theta)\) je apriorna raspodjela za \(\theta\). Tada se aposteriorna raspodjela, \(q(\theta|x)\), računa po formuli: \[ q(\theta|x)=\frac{p(x|\theta)q(\theta)}{\int\limits_{\Theta}p(x|\theta)q(\theta)d\theta} \] Uporedite ovu formulu sa Bajesovom formulom koju znate od ranije.


Zadaci


  1. Neka je \(X\) iz familije Bernulijevih raspodjela sa parametrom \(\theta\) i neka je apriorna raspodjela za \(\theta\) \(\beta(2,3)\). Naći aposteriornu ocjenu za \(\theta\).
    Rešenje: \[ \theta | x \sim \beta(\small\sum\limits_{k=1}^n x_k+2,\small\sum\limits_{k=1}^n x_k+3)\]
gf <- function(theta, a, b, n) {
x1 <- sample(c(0, 1),
n,
replace = T,
prob = c(1 - theta, theta))
# apriorna gustina (plavo)
curve (
dbeta (x , a , b) ,
0,
1,
lwd = 2,
col = "deepskyblue",
ylab = "",
xlab = ""
)
par( new=T)
# aposteriorna gustina (crveno)
curve (
dbeta (x, sum(x1) + a , n - sum(x1) + b) ,
0,
1,
col = "firebrick1",
ylab = "",
lwd = 2,
xlab = "",
axes = FALSE 
)
}
gf(0.5,2,3,100) # primjer za theta=0.5

gf(0.1,2,3,100) # primjer za theta=0.1

Uticaj različitog izbora apriorne raspodjele

Često se dešava da ako imamo veliki broj podataka, izbor apriorne ocjene ne utiče mnogo da zaključak o raspodjeli parametra.
Za prethodni primjer, uzećemo tri apriorne raspodjele:
1. \(\beta(3,4)\)
2. \(\beta(2.5,3.5)\)
3. \(\beta(103,104)\)

# Neka je theta=0.4, n=10000
gf(0.4, 3, 4, 1000)
par(new=T)
gf(0.4, 2.5, 3.5, 1000)
par(new=T)
gf(0.4,103,104,1000)

  1. Neka \(X\) ima familiju binomnih \(B(3,p)\) raspodjela. Apriorna raspodjela za \(p\) je: \[ X: \left( \begin{array}{cc} 0.4 & 0.5 \\ 0.7 & 0.3 \end{array} \right) \]

Naći aposteriornu raspodjelu za \(p\) ako je uzorak(obima 1) \(x=2\).

x<-2
q<-0.7*choose(3,2)*0.4^2*(1-0.4)/(0.7*choose(3,2)*0.4^2*(1-0.4)+0.3*choose(3,2)*0.5^2*(1-0.5))
q
[1] 0.6418338
1-q
[1] 0.3581662

Dakle, \[ p|x: \left( \begin{array}{cc} 0.4 & 0.5 \\ 0.642 & 0.358 \end{array} \right) \]

  1. Neka \(X\) ima familiju \(\mathcal{N}(\theta,\sigma^2)\), a apriorna raspodjela za je normalna \(\mathcal{N}(\mu,\tau^2)\). Naći aposteriornu raspodjelu za \(\theta\) ako je obim uzorka \(n=1\). Rešenje: \[ \theta|x \sim \mathcal{N}(\frac{1}{\rho}(\frac{x}{\sigma^2}+\frac{\mu}{\tau^2}),\frac{1}{\rho}), \quad \text{ gdje je } \rho=\frac{1}{\sigma^2}+\frac{1}{\tau^2} \] Opštije, za uzorak obima \(n\): \[ \theta|x \sim \mathcal{N}(\frac{1}{\rho}(\frac{n\overline{x}}{\sigma^2}+\frac{\mu}{\tau^2}),\frac{1}{\rho}), \quad \text{ gdje je } \rho=\frac{n}{\sigma^2}+\frac{1}{\tau^2} \] Primjer:
# uzorak je iz N(1,2), a apriorna je N(0,1) 
n<-50
mu<-0
sigma2<-2
tau2<-1
rho<-n/sigma2+1/tau2
x1<-rnorm(n,1,2)
curve (
dnorm (x) ,
-5,
5,
lwd = 2,
col = "deepskyblue",
ylab = "",
xlab = ""
)
par( new=T)
# aposteriorna gustina (crveno)
curve (
dnorm (x,1/rho*(n*mean(x1)/sigma2+mu/tau2), 1/rho) ,
-5,
5,
col = "firebrick1",
ylab = "",
lwd = 2,
xlab = "",
axes = FALSE 
)


Bajesova tačkasta ocjena


Ako znamo da je aposteriorna raspodjela za parametar \(\theta\) \(q(\theta|x)\), tačkasta ocjena za \(\theta\) je ona vrijednost \(\widehat{{\theta}}\) za koju je očekivanje (u odnosu na aposteriornu raspodjelu) funkcije gubitaka \(L(\theta,\widehat{\theta})\) minimalno. Funkcija gubitaka koju ćemo mi razmatrati je \[ L(\theta,\widehat{\theta})=(\theta-\widehat{\theta})^2 \] 4. Pokazati da je tačkasta ocjena pri ovoj funkciji gubitaka \(\widehat{\theta}=E\theta\).
5. Iz serije sa nepoznatim udjelom defektnih proizvoda \(p\) izvučen je uzorak obima \(n\). Nema nikakvih prethodnih informacija o tom udjelu (pa se za apriornu ocjenu uzima \(\mathcal{U}[0,1]\)). Naći Bajesovu ocjenu udjela \(p\).
Rešenje: \[ p|x \sim \beta(\small\sum\limits_{k=1}^{n}x_k+1,n-\small\sum\limits_{k=1}^{n}x_k+1) \\ \widehat{p}=E(p|x)=\frac{\small\sum\limits_{k=1}^{n}x_k+1}{n+2} \]

# Uzmimo p=1/2
n<-50
x1 <- sample(c(0, 1),
n,
replace = T)
# apriorna gustina (plavo)
curve (
dunif (x) ,
0,
1,
lwd = 2,
col = "deepskyblue",
ylab = "",
xlab = ""
)
par( new=T)
# aposteriorna gustina (crveno)
curve (
dbeta (x, sum(x1) + 1 , n - sum(x1) + 1) ,
0,
1,
col = "firebrick1",
ylab = "",
lwd = 2,
xlab = "",
axes = FALSE 
)
p.hat<-(sum(x1)+1)/(n+2)
p.hat
[1] 0.4807692
abline(v=p.hat, col="pink")

  1. Neka su \(X_1,X_2,\dots,X_n\) iid iz geometrijske \(\mathcal{G}(\theta)\) raspodjele. Naći aposteriornu ocjenu za \(\theta\) ako je apriorna \(\beta(a,b)\).
    Rešenje: \[ \theta | x \sim \beta(n+a,\small\sum\limits_{k=1}^n x_k -n+b)\]
n<-50
a<-2
b<-3
x1<-rgeom(n,0.8)+1
curve (
dbeta (x , a , b) ,
0,
1,
lwd = 2,
col = "deepskyblue",
ylab = "",
xlab = ""
)
par( new=T)
# aposteriorna gustina (crveno)
curve (
dbeta (x,n + a ,sum(x1) -n + b) ,
0,
1,
col = "firebrick1",
ylab = "",
lwd = 2,
xlab = "",
axes = FALSE 
)
theta.hat<-(n+a)/(sum(x1)+a+b)
abline(v=theta.hat,col="pink")

  1. [Domaći] Nađite tačkaste ocjene nepoznatih parametara u prva 3 primjera.

  2. Neka \(X\) ima familiju pomjerenih eksponencijalnih raspodjela \(\mathcal{E}(1,\theta)\). Apriorna gustina za \(\theta\) je \(q(\theta)=\frac{1}{2}e^{-|\theta|}\). Naći Bajesovu ocjenu parametra \(\theta\).

LS0tDQp0aXRsZTogIkJhamVzb3Zza2kgcHJpc3R1cCB1IG9jamVuaml2YW5qdSBwYXJhbWV0YXJhIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KKioqDQpEbyBzYWRhIHNtbyBwYXJhbWV0YXIgJFx0aGV0YSQgcG9zbWF0cmFsaSBrYW8gZmlrc2lyYW4gYnJvaiDEjWlqYSBqZSB2cmlqZWRub3N0IG5lcG96bmF0YSBpIGtvcmlzdGlsaSBwb2RhdGtlIGRhIG9jaWplbmltbyBuamVnb3Z1IHZyaWplZG5vc3QuIFRhxI1uaWplLCB0cmV0aXJhbGkgc21vIHV6b3JhayBrYW8gcmVhbGl6YWNpanUgbmVraWggc2x1xI1ham5paCB2ZWxpxI1pbmEsIGEgcGFyYW1ldGFyIGthbyBrb25zdGFudHUuIEJhamVzb3Zza2kgcHJpc3R1cCB1IG9jamVuaml2YW5qdSBwYXJhbWV0YXJhIG9waXN1amUgbmVvZHJlxJFlbm9zdCBwYXJhbWV0cmEgJFx0aGV0YSQgcmFzcG9kamVsb20gdmplcm92YXRub8SHYSBuYSBuZWtvbSBwcm9zdG9ydSBkb3B1c3RpdmloIHBhcmFtZXRhcmEgJFxUaGV0YSQuIE92YWogcHJpc3R1cCBzZSBzYXN0b2ppIHUgdG9tZSBkYSBzZSB6YSAkXHRoZXRhJCBwcmV0cG9zdGF2aSBuZWthIHJhc3BvZGplbGEga29qdSBuYXppdmFtbyBhcHJpb3Jub20gcmFzcG9kamVsb20sIGEgJHAoeHxcdGhldGEpJCBiaSBiaWxhIHJhc3BvZGplbGEgdXpvcmthIHByaSBkYXRvbSAkXHRoZXRhJCAodGEgcmFzcG9kamVsYSBtb8W+ZSBiaXRpIGRpc2tyZXRuYSBpbGkgYXBzb2x1dG5vIG5lcHJla2lkbmEsIHBhIHUgemF2aXNub3N0aSBvZCB0b2dhICRwKHh8XHRoZXRhKSQgamUgZnVua2NpamEgZ3VzdGluZSBpbGkgdmplcm92YXRub8SHYSBpeiB6YWtvbmEgcmFzcG9kamVsZSkuICANCk5la2Egc3UgJFg9KFhfMSxYXzIsXGRvdHMsWF9uKSQgc2x1xI1ham5lIHZlbGnEjWluZSBzYSB6YWplZG5pxI1rb20gcmFzcG9kamVsb20gJHAoeHxcdGhldGEpJCwgZ2RqZSBqZSAkXHRoZXRhJCByZWFsYW4gcGFyYW1ldGFyIGl6IHNrdXBhICRcVGhldGEkLiAkcShcdGhldGEpJCBqZSBhcHJpb3JuYSByYXNwb2RqZWxhIHphICRcdGhldGEkLiBUYWRhIHNlIGFwb3N0ZXJpb3JuYSByYXNwb2RqZWxhLCAkcShcdGhldGF8eCkkLCByYcSNdW5hIHBvIGZvcm11bGk6DQpcWw0KcShcdGhldGF8eCk9XGZyYWN7cCh4fFx0aGV0YSlxKFx0aGV0YSl9e1xpbnRcbGltaXRzX3tcVGhldGF9cCh4fFx0aGV0YSlxKFx0aGV0YSlkXHRoZXRhfQ0KXF0NClVwb3JlZGl0ZSBvdnUgZm9ybXVsdSBzYSBCYWplc292b20gZm9ybXVsb20ga29qdSB6bmF0ZSBvZCByYW5pamUuICANCg0KKioqKg0KIyMjIyBaYWRhY2kNCioqKiogIA0KMS4gTmVrYSBqZSAkWCQgaXogZmFtaWxpamUgQmVybnVsaWpldmloIHJhc3BvZGplbGEgc2EgcGFyYW1ldHJvbSAkXHRoZXRhJCBpIG5la2EgamUgYXByaW9ybmEgcmFzcG9kamVsYSB6YSAkXHRoZXRhJCAkXGJldGEoMiwzKSQuIE5hxIdpIGFwb3N0ZXJpb3JudSBvY2plbnUgemEgJFx0aGV0YSQuICANClJlxaFlbmplOiANCiQkIFx0aGV0YSB8IHggXHNpbSBcYmV0YShcc21hbGxcc3VtXGxpbWl0c197az0xfV5uIHhfaysyLFxzbWFsbFxzdW1cbGltaXRzX3trPTF9Xm4geF9rKzMpJCQNCg0KYGBge3J9DQoNCg0KZ2YgPC0gZnVuY3Rpb24odGhldGEsIGEsIGIsIG4pIHsNCngxIDwtIHNhbXBsZShjKDAsIDEpLA0KbiwNCnJlcGxhY2UgPSBULA0KcHJvYiA9IGMoMSAtIHRoZXRhLCB0aGV0YSkpDQojIGFwcmlvcm5hIGd1c3RpbmEgKHBsYXZvKQ0KY3VydmUgKA0KZGJldGEgKHggLCBhICwgYikgLA0KMCwNCjEsDQpsd2QgPSAyLA0KY29sID0gImRlZXBza3libHVlIiwNCnlsYWIgPSAiIiwNCnhsYWIgPSAiIg0KKQ0KcGFyKCBuZXc9VCkNCiMgYXBvc3Rlcmlvcm5hIGd1c3RpbmEgKGNydmVubykNCmN1cnZlICgNCmRiZXRhICh4LCBzdW0oeDEpICsgYSAsIG4gLSBzdW0oeDEpICsgYikgLA0KMCwNCjEsDQpjb2wgPSAiZmlyZWJyaWNrMSIsDQp5bGFiID0gIiIsDQpsd2QgPSAyLA0KeGxhYiA9ICIiLA0KYXhlcyA9IEZBTFNFIA0KKQ0KDQp9DQoNCmdmKDAuNSwyLDMsMTAwKSAjIHByaW1qZXIgemEgdGhldGE9MC41DQpnZigwLjEsMiwzLDEwMCkgIyBwcmltamVyIHphIHRoZXRhPTAuMQ0KYGBgDQoNCiMjIyMgVXRpY2FqIHJhemxpxI1pdG9nIGl6Ym9yYSBhcHJpb3JuZSByYXNwb2RqZWxlIA0KDQrEjGVzdG8gc2UgZGXFoWF2YSBkYSBha28gaW1hbW8gdmVsaWtpIGJyb2ogcG9kYXRha2EsIGl6Ym9yIGFwcmlvcm5lIG9jamVuZSBuZSB1dGnEjWUgbW5vZ28gZGEgemFrbGp1xI1hayBvIHJhc3BvZGplbGkgcGFyYW1ldHJhLiAgDQpaYSBwcmV0aG9kbmkgcHJpbWplciwgdXplxIdlbW8gdHJpIGFwcmlvcm5lIHJhc3BvZGplbGU6ICANCjEuICRcYmV0YSgzLDQpJCAgDQoyLiAkXGJldGEoMi41LDMuNSkkICANCjMuICRcYmV0YSgxMDMsMTA0KSQNCg0KYGBge3J9DQojIE5la2EgamUgdGhldGE9MC40LCBuPTEwMDAwDQoNCmdmKDAuNCwgMywgNCwgMTAwMCkNCnBhcihuZXc9VCkNCmdmKDAuNCwgMi41LCAzLjUsIDEwMDApDQpwYXIobmV3PVQpDQpnZigwLjQsMTAzLDEwNCwxMDAwKQ0KDQoNCmBgYA0KMi4gTmVrYSAkWCQgaW1hIGZhbWlsaWp1IGJpbm9tbmloICRCKDMscCkkICByYXNwb2RqZWxhLiBBcHJpb3JuYSByYXNwb2RqZWxhIHphICRwJCBqZToNCiAgXFsgWDogXGxlZnQoIFxiZWdpbnthcnJheX17Y2N9IDAuNCAmIDAuNSAgXFwNCjAuNyAmIDAuMyAgIFxlbmR7YXJyYXl9IFxyaWdodCkNCiAgICBcXQ0KDQpOYcSHaSBhcG9zdGVyaW9ybnUgcmFzcG9kamVsdSB6YSAkcCQgYWtvIGplIHV6b3JhayhvYmltYSAxKSAkeD0yJC4NCg0KYGBge3J9DQp4PC0yDQpxPC0wLjcqY2hvb3NlKDMsMikqMC40XjIqKDEtMC40KS8oMC43KmNob29zZSgzLDIpKjAuNF4yKigxLTAuNCkrMC4zKmNob29zZSgzLDIpKjAuNV4yKigxLTAuNSkpDQpxDQoxLXENCmBgYA0KRGFrbGUsIA0KXFsgcHx4OiBcbGVmdCggXGJlZ2lue2FycmF5fXtjY30gMC40ICYgMC41ICBcXA0KMC42NDIgJiAwLjM1OCAgIFxlbmR7YXJyYXl9IFxyaWdodCkNCiAgICBcXQ0KDQozLiBOZWthICRYJCBpbWEgZmFtaWxpanUgJFxtYXRoY2Fse059KFx0aGV0YSxcc2lnbWFeMikkLCBhIGFwcmlvcm5hIHJhc3BvZGplbGEgemEgXHRoZXRhIGplIG5vcm1hbG5hICRcbWF0aGNhbHtOfShcbXUsXHRhdV4yKSQuIE5hxIdpIGFwb3N0ZXJpb3JudSByYXNwb2RqZWx1IHphICRcdGhldGEkIGFrbyBqZSBvYmltIHV6b3JrYSAkbj0xJC4NClJlxaFlbmplOg0KXFsNClx0aGV0YXx4IFxzaW0gXG1hdGhjYWx7Tn0oXGZyYWN7MX17XHJob30oXGZyYWN7eH17XHNpZ21hXjJ9K1xmcmFje1xtdX17XHRhdV4yfSksXGZyYWN7MX17XHJob30pLCBccXVhZCBcdGV4dHsgZ2RqZSBqZSB9IFxyaG89XGZyYWN7MX17XHNpZ21hXjJ9K1xmcmFjezF9e1x0YXVeMn0NClxdDQpPcMWhdGlqZSwgemEgdXpvcmFrIG9iaW1hICRuJDoNClxbDQpcdGhldGF8eCBcc2ltIFxtYXRoY2Fse059KFxmcmFjezF9e1xyaG99KFxmcmFje25cb3ZlcmxpbmV7eH19e1xzaWdtYV4yfStcZnJhY3tcbXV9e1x0YXVeMn0pLFxmcmFjezF9e1xyaG99KSwgXHF1YWQgXHRleHR7IGdkamUgamUgfSBccmhvPVxmcmFje259e1xzaWdtYV4yfStcZnJhY3sxfXtcdGF1XjJ9DQpcXQ0KUHJpbWplcjogDQpgYGB7cn0NCiMgdXpvcmFrIGplIGl6IE4oMSwyKSwgYSBhcHJpb3JuYSBqZSBOKDAsMSkgDQoNCm48LTUwDQptdTwtMA0Kc2lnbWEyPC0yDQp0YXUyPC0xDQpyaG88LW4vc2lnbWEyKzEvdGF1Mg0KDQp4MTwtcm5vcm0obiwxLDIpDQoNCmN1cnZlICgNCmRub3JtICh4KSAsDQotNSwNCjUsDQpsd2QgPSAyLA0KY29sID0gImRlZXBza3libHVlIiwNCnlsYWIgPSAiIiwNCnhsYWIgPSAiIg0KKQ0KcGFyKCBuZXc9VCkNCiMgYXBvc3Rlcmlvcm5hIGd1c3RpbmEgKGNydmVubykNCmN1cnZlICgNCmRub3JtICh4LDEvcmhvKihuKm1lYW4oeDEpL3NpZ21hMittdS90YXUyKSwgMS9yaG8pICwNCi01LA0KNSwNCmNvbCA9ICJmaXJlYnJpY2sxIiwNCnlsYWIgPSAiIiwNCmx3ZCA9IDIsDQp4bGFiID0gIiIsDQpheGVzID0gRkFMU0UgDQopDQoNCg0KYGBgDQoNCioqKioNCiMjIyBCYWplc292YSB0YcSNa2FzdGEgb2NqZW5hDQoqKioqDQoNCkFrbyB6bmFtbyBkYSBqZSBhcG9zdGVyaW9ybmEgcmFzcG9kamVsYSB6YSBwYXJhbWV0YXIgJFx0aGV0YSQgJHEoXHRoZXRhfHgpJCwgdGHEjWthc3RhIG9jamVuYSB6YSAkXHRoZXRhJCBqZSBvbmEgdnJpamVkbm9zdCAkXHdpZGVoYXR7e1x0aGV0YX19JCB6YSBrb2p1IGplIG/EjWVraXZhbmplICh1IG9kbm9zdSBuYSBhcG9zdGVyaW9ybnUgcmFzcG9kamVsdSkgZnVua2NpamUgZ3ViaXRha2EgJEwoXHRoZXRhLFx3aWRlaGF0e1x0aGV0YX0pJCBtaW5pbWFsbm8uIEZ1bmtjaWphIGd1Yml0YWthIGtvanUgxIdlbW8gbWkgcmF6bWF0cmF0aSBqZSBcWw0KTChcdGhldGEsXHdpZGVoYXR7XHRoZXRhfSk9KFx0aGV0YS1cd2lkZWhhdHtcdGhldGF9KV4yDQpcXQ0KNC4gUG9rYXphdGkgZGEgamUgdGHEjWthc3RhIG9jamVuYSBwcmkgb3ZvaiBmdW5rY2lqaSBndWJpdGFrYSAkXHdpZGVoYXR7XHRoZXRhfT1FXHRoZXRhJC4gICANCjUuIEl6IHNlcmlqZSBzYSBuZXBvem5hdGltIHVkamVsb20gZGVmZWt0bmloIHByb2l6dm9kYSAkcCQgaXp2dcSNZW4gamUgdXpvcmFrIG9iaW1hICRuJC4gTmVtYSBuaWtha3ZpaCBwcmV0aG9kbmloIGluZm9ybWFjaWphIG8gdG9tIHVkamVsdSAocGEgc2UgemEgYXByaW9ybnUgb2NqZW51IHV6aW1hICRcbWF0aGNhbHtVfVswLDFdJCkuIE5hxIdpIEJhamVzb3Z1IG9jamVudSB1ZGplbGEgJHAkLiAgDQpSZcWhZW5qZTogDQpcWw0KcHx4IFxzaW0gXGJldGEoXHNtYWxsXHN1bVxsaW1pdHNfe2s9MX1ee259eF9rKzEsbi1cc21hbGxcc3VtXGxpbWl0c197az0xfV57bn14X2srMSkgXFwNClx3aWRlaGF0e3B9PUUocHx4KT1cZnJhY3tcc21hbGxcc3VtXGxpbWl0c197az0xfV57bn14X2srMX17bisyfQ0KXF0NCg0KYGBge3J9DQoNCiMgVXptaW1vIHA9MS8yDQoNCm48LTUwDQp4MSA8LSBzYW1wbGUoYygwLCAxKSwNCm4sDQpyZXBsYWNlID0gVCkNCiMgYXByaW9ybmEgZ3VzdGluYSAocGxhdm8pDQpjdXJ2ZSAoDQpkdW5pZiAoeCkgLA0KMCwNCjEsDQpsd2QgPSAyLA0KY29sID0gImRlZXBza3libHVlIiwNCnlsYWIgPSAiIiwNCnhsYWIgPSAiIg0KKQ0KcGFyKCBuZXc9VCkNCiMgYXBvc3Rlcmlvcm5hIGd1c3RpbmEgKGNydmVubykNCmN1cnZlICgNCmRiZXRhICh4LCBzdW0oeDEpICsgMSAsIG4gLSBzdW0oeDEpICsgMSkgLA0KMCwNCjEsDQpjb2wgPSAiZmlyZWJyaWNrMSIsDQp5bGFiID0gIiIsDQpsd2QgPSAyLA0KeGxhYiA9ICIiLA0KYXhlcyA9IEZBTFNFIA0KKQ0KcC5oYXQ8LShzdW0oeDEpKzEpLyhuKzIpDQpwLmhhdA0KYWJsaW5lKHY9cC5oYXQsIGNvbD0icGluayIpDQpgYGANCjYuIE5la2Egc3UgJFhfMSxYXzIsXGRvdHMsWF9uJCBpaWQgaXogZ2VvbWV0cmlqc2tlICRcbWF0aGNhbHtHfShcdGhldGEpJCByYXNwb2RqZWxlLiBOYcSHaSBhcG9zdGVyaW9ybnUgb2NqZW51IHphICRcdGhldGEkIGFrbyBqZSBhcHJpb3JuYSAkXGJldGEoYSxiKSQuICANClJlxaFlbmplOg0KJCQgXHRoZXRhIHwgeCBcc2ltIFxiZXRhKG4rYSxcc21hbGxcc3VtXGxpbWl0c197az0xfV5uIHhfayAtbitiKSQkDQpgYGB7cn0NCg0KbjwtNTANCmE8LTINCmI8LTMNCngxPC1yZ2VvbShuLDAuOCkrMQ0KY3VydmUgKA0KZGJldGEgKHggLCBhICwgYikgLA0KMCwNCjEsDQpsd2QgPSAyLA0KY29sID0gImRlZXBza3libHVlIiwNCnlsYWIgPSAiIiwNCnhsYWIgPSAiIg0KKQ0KcGFyKCBuZXc9VCkNCiMgYXBvc3Rlcmlvcm5hIGd1c3RpbmEgKGNydmVubykNCmN1cnZlICgNCmRiZXRhICh4LG4gKyBhICxzdW0oeDEpIC1uICsgYikgLA0KMCwNCjEsDQpjb2wgPSAiZmlyZWJyaWNrMSIsDQp5bGFiID0gIiIsDQpsd2QgPSAyLA0KeGxhYiA9ICIiLA0KYXhlcyA9IEZBTFNFIA0KKQ0KDQp0aGV0YS5oYXQ8LShuK2EpLyhzdW0oeDEpK2ErYikNCmFibGluZSh2PXRoZXRhLmhhdCxjb2w9InBpbmsiKQ0KDQpgYGANCg0KNy4gW0RvbWHEh2ldIE5hxJFpdGUgdGHEjWthc3RlIG9jamVuZSBuZXBvem5hdGloIHBhcmFtZXRhcmEgdSBwcnZhIDMgcHJpbWplcmEuDQoNCg0KOC4gTmVrYSAkWCQgaW1hIGZhbWlsaWp1IHBvbWplcmVuaWggZWtzcG9uZW5jaWphbG5paCByYXNwb2RqZWxhICRcbWF0aGNhbHtFfSgxLFx0aGV0YSkkLiBBcHJpb3JuYSBndXN0aW5hIHphICRcdGhldGEkIGplICRxKFx0aGV0YSk9XGZyYWN7MX17Mn1lXnstfFx0aGV0YXx9JC4gTmHEh2kgQmFqZXNvdnUgb2NqZW51IHBhcmFtZXRyYSAkXHRoZXRhJC4NCg0KDQoNCg0KDQoNCg==