• 把整張期末考卷該計算的部分用 R (或 Python) 寫一遍,老狗學點新把戲,一樂。

1 [Q1]

    1. 請寫出 Binomial Distribution, X的 機率質量函數 (pmf), \(f_X(x)\)。設其參數為 (n=10, p=0.5),計算 \(P(X≤2)\)=?
    1. 請寫出 Poisson Distribution, Y 的 機率質量函數 (pmf) \(f_Y (y)\)。設其參數(平均數)為 (λ=5),計算 Var(Y)=?
    1. 請證明,當 λ=n⋅p, 而 $ n → ∞$ 時,\(f_X (s)→f_Y (s)\)
    1. 令 n=100, p=0.1, λ=10, 取 s=10, 計算 \(f_X(s)\)\(f_Y(s)\),以及其相對誤差 \(|f_X(s)-f_Y(s)|/(f_Y(s))\),以其驗證 (3) 之正確性。
    1. Gamma 函數 \(Γ(s)\)是俗稱的「廣義」階乘函數,其定義為: \(Γ(s)=\int_0^∞ x^{s-1} e^{-x} dx\),請計算 \(Γ(0.5)= ?\) 以及 \(Γ(5.5)= ?\)
    1. 根據「中央極限定理」 (Central Limit Theorem , CLT),取 n 個獨立且分布相同 (iid) 的隨機變數 \(X_1,X_2, …. X_n\) 其共同的平均數及變異數設定為 \(E(X_i )=μ_X , Var(X_i)=σ_X^2\), 把這些iid的隨機變數作如何處理就可以令其機率分布趨近於標準型的常態分佈 \(Norm(μ=0,σ=1)?\)

1.1 使用 R

quit
#Q1.1 

q101= pbinom(2, 10, .5)

#Q1.4

n= 100
p= .1
λ= 10
s= 10
dbin= dbinom(s,n,p)
dpoi= dpois(s,λ)
err=  abs(dbin-dpoi)/dpoi

q104= c(dbin, dpoi, err)

#Q1.5

q105= c(gamma(.5), gamma(5.5))

# ans ---
q101
[1] 0.0546875
q104
[1] 0.13186535 0.12511004 0.05399496
q105
[1]  1.772454 52.342778

1.2 使用 Python

reticulate::repl_python()
import math
import numpy as np
import scipy.stats as st


#Q1.1 

#q101= pbinom(2, 10, .5)
q101= st.binom(10, .5).cdf(2)

#Q1.4

n= 100
p= .1
λ= 10
s= 10

#dbin= dbinom(s,n,p)
#dpoi= dpois(s,λ)

dbin= st.binom(n,p).pmf(s)
dpoi= st.poisson(λ).pmf(s)

err=  abs(dbin-dpoi)/dpoi

q104= (dbin, dpoi, err)

#Q1.5

q105= (math.gamma(.5), math.gamma(5.5))

# ans ---
q101
0.0546875
q104
(0.13186534682448794, 0.12511003572113372, 0.053994957833851165)
q105
(1.7724538509055159, 52.34277778455352)

2 [Q2]

n 個獨立且分布相同的隨機變數 \(X_1,X_2, …, X_n\), 其共同的期望值為 μ, 標準差為 σ, 統計量 \(\bar{X} , S^2\) 分別代表它們的【樣本平均數】以及【樣本變異數】。 數學公式定義如下:

  • \(\bar{X}= {1\over n} \sum_{i=1}^n X_i\) ,
  • \(S^2={1\over {n-1}} \sum_{i=1}^n {(X_i-\bar{X})}^2\)

又令統計量 T 代表 樣本平均 \(\bar{X}\) 與母體平均 μ 之 標準化距離,數學公式定義如下:

  • \(T={\bar{X}-μ\over S/\sqrt{n}}\)

令 n = 100, μ = 50, σ = 10

請回答以下問題:

    1. \(E(\bar{X})= ?\)
    1. \(Var(\bar{X})= ?\)
    1. \(E(S^2)= ?\)
    1. \(\bar{X} 的 機率密度函數 (pdf), f_{\bar{X}}(x)= ?\)
    1. \(T 的 機率密度函數 (pdf), f_T (t)= ?\)
    1. \(P(48 ≤ \bar{X} ≤ 52)= ?\)
    1. \(P(-2 ≤ T≤ 2)=?\)
    1. \(若 P(-∞ < \bar{X} ≤ x)= 95% 那麼 x = ?\)
    1. \(若 P(t≤ T <∞)= 95% 那麼 t = ?\)

2.1 使用 R

quit
n= 100
μ= 50  
σ= 10

# Q2.12
q212= pnorm(52, mean= μ, sd= σ/sqrt(n)) -
  pnorm(48, mean= μ, sd= σ/sqrt(n))

# Q2.13
q213= pt(2, df=n-1) - pt(-2, df=n-1)

# Q2.14
q214= qnorm(.95, mean= μ, sd= σ/sqrt(n))

# Q2.15
q215= qt(.95, df=n-1, lower.tail=FALSE)

q212
[1] 0.9544997
q213
[1] 0.9517603
q214
[1] 51.64485
q215
[1] -1.660391

2.2 使用 Python

reticulate::repl_python()

n= 100
μ= 50  
σ= 10

# 2.12
# q212= pnorm(52, mean= μ, sd= σ/sqrt(n)) -
#  pnorm(48, mean= μ, sd= σ/sqrt(n))

q212= st.norm(μ, σ/n**.5).cdf(52) - st.norm(μ, σ/n**.5).cdf(48)

# Q2.13
# q213= pt(2, df=n-1) - pt(-2, df=n-1)
q213= st.t(df=n-1).cdf(2) - st.t(df=n-1).cdf(-2)

# Q2.14
# q214= qnorm(.95, mean= μ, sd= σ/sqrt(n))
q214= st.norm(μ, σ/n**.5).ppf(.95)

# Q2.15
# q215= qt(.95, df=n-1, lower.tail=FALSE)
q215= st.t(df=n-1).isf(.95)

q212
0.9544997361036416
q213
0.951760306627367
q214
51.64485362695147
q215
-1.6603911559963895

3 [Q3]

本校某社團根據現今社會氛圍,認為大學生「不反對婚前性行為」的比例p很可能超過50%,為了支持這個想法,社長隨機挑選校內n = 100位學生做問卷調查,詢問同學們是否「不反對婚前性行為?」。 回答【是】的學生人數令為隨機變數X。 令p之估測值( estimate)為 \(\hat{p}=X/n\),假設每位學生皆是獨立作答,不互相影響。請回答以下問題:

    1. 試寫出估測值 \(\hat{p}\) 之期望值\(E(\hat{p})\) 以及標準差 \(std(\hat{p})\) 之理論值 = ?
    1. 這次調查得到結果為 55份回答【是】, 45份回答【否】, 請問 \(\hat{p}\) = ?
    1. 根據這份調查結果,請寫出 p 之 95% 之信心區間。
    1. 以這份調查結果,能否以顯著水準(significance level) α = 5% 依假設檢定之原理來做成接受 \(H_1: “p > 50\%”\) 的結論,請寫出檢定過程。並說明所獲結論的理由。
    1. 如果把問卷份數 從 n = 100 增加到 n = 400,重作檢定,在調查結果的比例維持不變的情形之下,結論是否有不同? 請說明你的結論以及推論的過程。

3.1 使用 R

quit
n= 100
X=  55
α= .05

# Q3.17
q317= pH= X/n

# Q3.18

#se= 1.96*(pH*(1-pH)/n)^.5
se=  -qnorm(α/2) * (pH*(1-pH)/n)^.5
q318= pH + c(-se, se)

q317
[1] 0.55
q318
[1] 0.452493 0.647507
#
# 參考的解答
#

# Exact binomial test

q1= binom.test(X, n, p= .5)
q318_1= q1$conf.int
q318_1
[1] 0.4472802 0.6496798
attr(,"conf.level")
[1] 0.95
# proportions test with continuity correction

q2= prop.test(X, n,  p= .5) #, correct=FALSE)
q318_2= q2$conf.int
q318_2
[1] 0.4475426 0.6485719
attr(,"conf.level")
[1] 0.95

4 [Q3.19, .20]

\(H_1: "p > .5"\)

\(H_0: "p \leq .5"\)

Set α = 5%

\(H_0: "p \leq .5"\)

\(T: "{{\hat{p}-p_0} \over \sqrt{p_0(1-p_0)\over n}} > Q^{-1}(α)"\) ?

or

\(T: "pValue \equiv Q({{\hat{p}-p_0} \over \sqrt{p_0(1-p_0)\over n}}) < α"\) ?

where,

\(z_α = Q^{-1}(α)\)

or

\(Q(z_α) = α\)

The decision Rule:

If the test (T) is True, then we can Reject \(H_0\), and Accept \(H_1\)

else,
we can NOT Reject \(H_0\), can NEITHER Accept \(H_1\)


4.1 使用 R

# Q3.19

p0= .5
z_α= qnorm(α, lower.tail = FALSE)

theStats= (pH-p0)/(p0*(1-p0)/n)^.5
theTest= (  theStats> z_α )

theStats
[1] 1
theTest
[1] FALSE
if (theTest==TRUE) { theDecision= "Reject H0"
  } else {theDecision= "Can NOT Reject H0"}

q319= theDecision
q319
[1] "Can NOT Reject H0"
# Q3.20

nLarger= 400
theStats= (pH-p0)/(p0*(1-p0)/nLarger)^.5
theTest= (  theStats> z_α )

theStats
[1] 2
theTest
[1] TRUE
if (theTest==TRUE) { theDecision= "Reject H0"
  } else {theDecision= "Can NOT Reject H0"}


q320= theDecision
q320
[1] "Reject H0"
#
# 參考的解答,來自 R ,仍需進一步解讀
#


q2= prop.test( pH*n, n,       p= .5, alternative = 'greater')
q4= prop.test( pH*nLarger, nLarger, p= .5, alternative = 'greater')


q2

    1-sample proportions test with continuity correction

data:  pH * n out of n, null probability 0.5
X-squared = 0.81, df = 1, p-value = 0.1841
alternative hypothesis: true p is greater than 0.5
95 percent confidence interval:
 0.462983 1.000000
sample estimates:
   p 
0.55 
q4

    1-sample proportions test with continuity correction

data:  pH * nLarger out of nLarger, null probability 0.5
X-squared = 3.8025, df = 1, p-value = 0.02559
alternative hypothesis: true p is greater than 0.5
95 percent confidence interval:
 0.5076335 1.0000000
sample estimates:
   p 
0.55 
# 進一步解讀
# 運用 pValue

theStats= q2$statistic
thePV=    q2$p.value

theTest= (  thePV < α )

if (theTest==TRUE) { theDecision= "Reject H0"
  } else {theDecision= "Can NOT Reject H0"}

q320_1= theDecision

theStats
X-squared 
     0.81 
thePV
[1] 0.1840601
q320_1
[1] "Can NOT Reject H0"
# 進一步解讀
# 運用 pValue

theStats= q4$statistic
thePV=    q4$p.value

theTest= (  thePV < α )

if (theTest==TRUE) { theDecision= "Reject H0"
  } else {theDecision= "Can NOT Reject H0"}

q320_2= theDecision

theStats
X-squared 
   3.8025 
thePV
[1] 0.02558806
q320_2
[1] "Reject H0"

4.2 使用 Python

reticulate::repl_python()
n= 100
X=  55
α= .05

# Q3.17
q317= pH= X/n

# Q3.18

#se= np.array([-1.96, 1.96])*(pH*(1-pH)/n)**.5
ci= pH + st.norm.ppf([α/2, 1-α/2]) * (pH*(1-pH)/n)**.5
q318= ci
 
q317
0.55
q318
array([0.45249302, 0.64750698])
from statsmodels.stats.proportion import proportions_ztest

pH= .55
n=  100

zstat1, pValue1= proportions_ztest(
  count= pH*n, 
  nobs= n, 
  value= 0.5, 
  alternative= 'larger')
  
theTest1= (pValue1 < α)

q319= theDecision1= "Reject H0" if theTest1  else "can NOT Reject H0"
q319
'can NOT Reject H0'
nLarger= 400

zstat2, pValue2= proportions_ztest(
  count= pH*nLarger, 
  nobs= nLarger, 
  value= 0.5, 
  alternative= 'larger')


theTest2= (pValue2 < α)

q320= theDecision2= "Reject H0" if theTest2  else "can NOT Reject H0"

q320
'Reject H0'

5 [Ref]

5.1 手稿1

手稿1

5.2 手稿2

手稿2

5.3 手稿3

手稿3

LS0tDQp0aXRsZTogIuacn+acq+iAgyAyMDIyIg0KYXV0aG9yOiBSZW55dWFuIEAgQ2hhbmcgR3VuZyBVbml2ZXJzaXR5DQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclWS0lbS0lZCcpYCINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdGhlbWU6IHVuaXRlZA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KDQotLS0NCg0KLSDmiormlbTlvLXmnJ/mnKvogIPljbfoqbLoqIjnrpfnmoTpg6jliIbnlKggUiAo5oiWIFB5dGhvbikg5a+r5LiA6YGN77yM6ICB54uX5a246bue5paw5oqK5oiy77yM5LiA5qiC44CCDQoNCiMgW1ExXQ0KDQogIC0gMS4J6KuL5a+r5Ye6IEJpbm9taWFsIERpc3RyaWJ1dGlvbiwgWOeahCDmqZ/njofos6rph4/lh73mlbggKHBtZiksICRmX1goeCkk44CC6Kit5YW25Y+D5pW454K6IChuPTEwLCBwPTAuNSnvvIzoqIjnrpcgICAgJFAoWOKJpDIpJD0/DQogIC0gMi4J6KuL5a+r5Ye6IFBvaXNzb24gRGlzdHJpYnV0aW9uLCBZIOeahCDmqZ/njofos6rph4/lh73mlbggKHBtZikgJGZfWSAoeSkk44CC6Kit5YW25Y+D5pW4KOW5s+Wdh+aVuCnngrogKM67PTUp77yM6KiI566XICAgICBWYXIoWSk9Pw0KICAtIDMuCeiri+itieaYju+8jOeVtiDOuz1u4ouFcO+8jCDogIwgJCBuIOKGkiDiiJ4kIOaZgu+8jCRmX1ggKHMp4oaSZl9ZIChzKSQNCiAgLSA0Lgnku6Qgbj0xMDAsIHA9MC4xLCDOuz0xMO+8jCAg5Y+WIHM9MTAsIA0KICAgIOioiOeulyAkZl9YKHMpJCDoiIcgJGZfWShzKSTvvIzku6Xlj4rlhbbnm7jlsI3oqqTlt64gJHxmX1gocyktZl9ZKHMpfC8oZl9ZKHMpKSTvvIzku6XlhbbpqZforYkgKDMpIOS5i+ato+eiuuaAp+OAgiANCiAgLSA1LglHYW1tYSDlh73mlbggJM6TKHMpJOaYr+S/l+eoseeahOOAjOW7o+e+qeOAjemajuS5mOWHveaVuO+8jOWFtuWumue+qeeCuu+8miAkzpMocyk9XGludF8wXuKIniB4XntzLTF9IGVeey14fSAgICAgZHgk77yM6KuL6KiI566XICTOkygwLjUpPSA/JCAg5Lul5Y+KICAkzpMoNS41KT0gPyQgDQogIC0gNi4J5qC55pOa44CM5Lit5aSu5qW16ZmQ5a6a55CG44CNIChDZW50cmFsIExpbWl0IFRoZW9yZW0gLCBDTFQp77yM5Y+WIG4g5YCL542o56uL5LiU5YiG5biD55u45ZCMIChpaWQpIOeahOmaqOapn+iuiuaVuCAgICAgJFhfMSxYXzIsIOKApi4gWF9uJCDlhbblhbHlkIznmoTlubPlnYfmlbjlj4rorornlbDmlbjoqK3lrprngrogJEUoWF9pICk9zrxfWCAgLCBWYXIoWF9pKT3Pg19YXjIkLCAgICAg5oqK6YCZ5LqbaWlk55qE6Zqo5qmf6K6K5pW45L2c5aaC5L2V6JmV55CG5bCx5Y+v5Lul5Luk5YW25qmf546H5YiG5biD6Lao6L+R5pa85qiZ5rqW5Z6L55qE5bi45oWL5YiG5L2IICROb3JtKM68PTAsz4M9MSnvvJ8kDQogIA0KDQojIyDkvb/nlKggUg0KDQpgYGB7cn0NCiNRMS4xIA0KDQpxMTAxPSBwYmlub20oMiwgMTAsIC41KQ0KDQojUTEuNA0KDQpuPSAxMDANCnA9IC4xDQrOuz0gMTANCnM9IDEwDQpkYmluPSBkYmlub20ocyxuLHApDQpkcG9pPSBkcG9pcyhzLM67KQ0KZXJyPSAgYWJzKGRiaW4tZHBvaSkvZHBvaQ0KDQpxMTA0PSBjKGRiaW4sIGRwb2ksIGVycikNCg0KI1ExLjUNCg0KcTEwNT0gYyhnYW1tYSguNSksIGdhbW1hKDUuNSkpDQoNCiMgYW5zIC0tLQ0KcTEwMQ0KcTEwNA0KcTEwNQ0KYGBgDQojIyDkvb/nlKggUHl0aG9uDQoNCmBgYHtweXRob259DQppbXBvcnQgbWF0aA0KaW1wb3J0IG51bXB5IGFzIG5wDQppbXBvcnQgc2NpcHkuc3RhdHMgYXMgc3QNCg0KDQojUTEuMSANCg0KI3ExMDE9IHBiaW5vbSgyLCAxMCwgLjUpDQpxMTAxPSBzdC5iaW5vbSgxMCwgLjUpLmNkZigyKQ0KDQojUTEuNA0KDQpuPSAxMDANCnA9IC4xDQrOuz0gMTANCnM9IDEwDQoNCiNkYmluPSBkYmlub20ocyxuLHApDQojZHBvaT0gZHBvaXMocyzOuykNCg0KZGJpbj0gc3QuYmlub20obixwKS5wbWYocykNCmRwb2k9IHN0LnBvaXNzb24ozrspLnBtZihzKQ0KDQplcnI9ICBhYnMoZGJpbi1kcG9pKS9kcG9pDQoNCnExMDQ9IChkYmluLCBkcG9pLCBlcnIpDQoNCiNRMS41DQoNCnExMDU9IChtYXRoLmdhbW1hKC41KSwgbWF0aC5nYW1tYSg1LjUpKQ0KDQojIGFucyAtLS0NCnExMDENCnExMDQNCnExMDUNCmBgYA0KDQoNCiMgW1EyXQ0KDQpuIOWAi+eNqOeri+S4lOWIhuW4g+ebuOWQjOeahOmaqOapn+iuiuaVuCAkWF8xLFhfMiwg4oCmLCBYX24k77yMDQrlhbblhbHlkIznmoTmnJ/mnJvlgLzngrogzrwsIOaomea6luW3rueCuiDPgywgDQrntbHoqIjph48gJFxiYXJ7WH0gLCBTXjIkIOWIhuWIpeS7o+ihqOWug+WAkeeahOOAkOaoo+acrOW5s+Wdh+aVuOOAkeS7peWPiuOAkOaoo+acrOiuiueVsOaVuOOAkeOAgg0K5pW45a245YWs5byP5a6a576p5aaC5LiL77yaDQoNCi0gJFxiYXJ7WH09IHsxXG92ZXIgbn0gXHN1bV97aT0xfV5uIFhfaSQgLA0KLSAkU14yPXsxXG92ZXIge24tMX19IFxzdW1fe2k9MX1ebiB7KFhfaS1cYmFye1h9KX1eMiQgDQoNCuWPiOS7pOe1seioiOmHjyBUIOS7o+ihqCDmqKPmnKzlubPlnYcgJFxiYXJ7WH0kIOiIh+avjemrlOW5s+WdhyDOvCDkuYsg5qiZ5rqW5YyW6Led6Zui77yM5pW45a245YWs5byP5a6a576p5aaC5LiL77yaDQoNCi0gJFQ9e1xiYXJ7WH0tzrxcb3ZlciBTL1xzcXJ0e259fSQNCg0K5LukIG4gPSAxMDAsICDOvCA9IDUwLCAgz4MgPSAxMA0KDQroq4vlm57nrZTku6XkuIvllY/poYzvvJoNCg0KICAtICA3LiAkRShcYmFye1h9KT0gPyQNCiAgLSAgOC4gJFZhcihcYmFye1h9KT0gPyQNCiAgLSAgOS4gJEUoU14yKT0gPyQNCiAgLSAxMC4gJFxiYXJ7WH0g55qEIOapn+eOh+WvhuW6puWHveaVuCAocGRmKSwgZl97XGJhcntYfX0oeCk9ID8kDQogIC0gMTEuICRUIOeahCDmqZ/njoflr4bluqblh73mlbggKHBkZiksIGZfVCAodCk9ID8kDQogIC0gMTIuICRQKDQ4IOKJpCBcYmFye1h9IOKJpCA1Mik9ID8kDQogIC0gMTMuICRQKC0yIOKJpCBU4omkIDIpPT8kDQogIC0gMTQuICToi6UgUCgt4oieIDwgXGJhcntYfSDiiaQgeCk9IDk1JSDpgqPpurwgeCA9ID8kDQogIC0gMTUuICToi6UgUCh04omkIFQgPOKInik9IDk1JSAgIOmCo+m6vCB0ID0gPyQNCg0KDQojIyDkvb/nlKggUg0KDQpgYGB7cn0NCm49IDEwMA0Kzrw9IDUwICANCs+DPSAxMA0KDQojIFEyLjEyDQpxMjEyPSBwbm9ybSg1MiwgbWVhbj0gzrwsIHNkPSDPgy9zcXJ0KG4pKSAtDQogIHBub3JtKDQ4LCBtZWFuPSDOvCwgc2Q9IM+DL3NxcnQobikpDQoNCiMgUTIuMTMNCnEyMTM9IHB0KDIsIGRmPW4tMSkgLSBwdCgtMiwgZGY9bi0xKQ0KDQojIFEyLjE0DQpxMjE0PSBxbm9ybSguOTUsIG1lYW49IM68LCBzZD0gz4Mvc3FydChuKSkNCg0KIyBRMi4xNQ0KcTIxNT0gcXQoLjk1LCBkZj1uLTEsIGxvd2VyLnRhaWw9RkFMU0UpDQoNCnEyMTINCnEyMTMNCnEyMTQNCnEyMTUNCmBgYA0KDQojIyDkvb/nlKggUHl0aG9uDQoNCmBgYHtweXRob259DQoNCm49IDEwMA0Kzrw9IDUwICANCs+DPSAxMA0KDQojIDIuMTINCiMgcTIxMj0gcG5vcm0oNTIsIG1lYW49IM68LCBzZD0gz4Mvc3FydChuKSkgLQ0KIyAgcG5vcm0oNDgsIG1lYW49IM68LCBzZD0gz4Mvc3FydChuKSkNCg0KcTIxMj0gc3Qubm9ybSjOvCwgz4MvbioqLjUpLmNkZig1MikgLSBzdC5ub3JtKM68LCDPgy9uKiouNSkuY2RmKDQ4KQ0KDQojIFEyLjEzDQojIHEyMTM9IHB0KDIsIGRmPW4tMSkgLSBwdCgtMiwgZGY9bi0xKQ0KcTIxMz0gc3QudChkZj1uLTEpLmNkZigyKSAtIHN0LnQoZGY9bi0xKS5jZGYoLTIpDQoNCiMgUTIuMTQNCiMgcTIxND0gcW5vcm0oLjk1LCBtZWFuPSDOvCwgc2Q9IM+DL3NxcnQobikpDQpxMjE0PSBzdC5ub3JtKM68LCDPgy9uKiouNSkucHBmKC45NSkNCg0KIyBRMi4xNQ0KIyBxMjE1PSBxdCguOTUsIGRmPW4tMSwgbG93ZXIudGFpbD1GQUxTRSkNCnEyMTU9IHN0LnQoZGY9bi0xKS5pc2YoLjk1KQ0KDQpxMjEyDQpxMjEzDQpxMjE0DQpxMjE1DQoNCmBgYA0KDQoNCiMgW1EzXQ0KDQrmnKzmoKHmn5DnpL7lnJjmoLnmk5rnj77ku4rnpL7mnIPmsJvlnI3vvIzoqo3ngrrlpKflrbjnlJ/jgIzkuI3lj43lsI3lqZrliY3mgKfooYzngrrjgI3nmoTmr5Tkvotw5b6I5Y+v6IO96LaF6YGONTAl77yM54K65LqG5pSv5oyB6YCZ5YCL5oOz5rOV77yM56S+6ZW36Zqo5qmf5oyR6YG45qCh5YWnbiA9IDEwMOS9jeWtuOeUn+WBmuWVj+WNt+iqv+afpe+8jOipouWVj+WQjOWtuOWAkeaYr+WQpuOAjOS4jeWPjeWwjeWpmuWJjeaAp+ihjOeCuu+8n+OAjeOAgiDlm57nrZTjgJDmmK/jgJHnmoTlrbjnlJ/kurrmlbjku6TngrrpmqjmqZ/orormlbhY44CCDQrku6Rw5LmL5Lyw5ris5YC8KCBlc3RpbWF0ZSnngrogJFxoYXR7cH09WC9uJO+8jOWBh+ioreavj+S9jeWtuOeUn+eahuaYr+eNqOeri+S9nOetlO+8jOS4jeS6kuebuOW9semfv+OAguiri+WbnuetlOS7peS4i+WVj+mhjO+8mg0KDQogIC0gMTYuIOippuWvq+WHuuS8sOa4rOWAvCAkXGhhdHtwfSQg5LmL5pyf5pyb5YC8JEUoXGhhdHtwfSkkIOS7peWPiuaomea6luW3riAkc3RkKFxoYXR7cH0pJCDkuYvnkIboq5blgLwgPSA/ICANCiAgLSAxNy4g6YCZ5qyh6Kq/5p+l5b6X5Yiw57WQ5p6c54K6IDU15Lu95Zue562U44CQ5piv44CR77yMIDQ15Lu95Zue562U44CQ5ZCm44CR77yMIOiri+WVjyAkXGhhdHtwfSQgPSA/IA0KICAtIDE4LiDmoLnmk5rpgJnku73oqr/mn6XntZDmnpzvvIzoq4vlr6vlh7ogcCDkuYsgOTUlIOS5i+S/oeW/g+WNgOmWk+OAgg0KICAtIDE5LiDku6XpgJnku73oqr/mn6XntZDmnpzvvIzog73lkKbku6Xpoa/okZfmsLTmupYoc2lnbmlmaWNhbmNlIGxldmVsKSDOsSA9IDUlIOS+neWBh+ioreaqouWumuS5i+WOn+eQhuS+huWBmuaIkOaOpeWPlyAkSF8xOiDigJxwID4gNTBcJeKAnSQg55qE57WQ6KuW77yM6KuL5a+r5Ye65qqi5a6a6YGO56iL44CC5Lim6Kqq5piO5omA542y57WQ6KuW55qE55CG55Sx44CCDQogIC0gMjAuIOWmguaenOaKiuWVj+WNt+S7veaVuCDlvp4gbiA9IDEwMCDlop7liqDliLAgbiA9IDQwMO+8jOmHjeS9nOaqouWumu+8jOWcqOiqv+afpee1kOaenOeahOavlOS+i+e2reaMgeS4jeiuiueahOaDheW9ouS5i+S4i++8jOe1kOirluaYr+WQpuacieS4jeWQjO+8nyDoq4voqqrmmI7kvaDnmoTntZDoq5bku6Xlj4rmjqjoq5bnmoTpgY7nqIvjgIINCg0KDQojIyDkvb/nlKggUg0KDQpgYGB7cn0NCm49IDEwMA0KWD0gIDU1DQrOsT0gLjA1DQoNCiMgUTMuMTcNCnEzMTc9IHBIPSBYL24NCg0KIyBRMy4xOA0KDQojc2U9IDEuOTYqKHBIKigxLXBIKS9uKV4uNQ0Kc2U9ICAtcW5vcm0ozrEvMikgKiAocEgqKDEtcEgpL24pXi41DQpxMzE4PSBwSCArIGMoLXNlLCBzZSkNCg0KcTMxNw0KcTMxOA0KYGBgDQoNCmBgYHtyfQ0KIw0KIyDlj4PogIPnmoTop6PnrZQNCiMNCg0KIyBFeGFjdCBiaW5vbWlhbCB0ZXN0DQoNCnExPSBiaW5vbS50ZXN0KFgsIG4sIHA9IC41KQ0KcTMxOF8xPSBxMSRjb25mLmludA0KcTMxOF8xDQoNCiMgcHJvcG9ydGlvbnMgdGVzdCB3aXRoIGNvbnRpbnVpdHkgY29ycmVjdGlvbg0KDQpxMj0gcHJvcC50ZXN0KFgsIG4sICBwPSAuNSkgIywgY29ycmVjdD1GQUxTRSkNCnEzMThfMj0gcTIkY29uZi5pbnQNCnEzMThfMg0KYGBgDQoNCg0KIyBbUTMuMTksIC4yMF0NCg0KJEhfMTogInAgPiAuNSIkDQoNCiRIXzA6ICJwIFxsZXEgLjUiJA0KDQpTZXQgIM6xID0gNSUNCg0KJEhfMDogInAgXGxlcSAuNSIkDQoNCiRUOiAie3tcaGF0e3B9LXBfMH0gXG92ZXIgXHNxcnR7cF8wKDEtcF8wKVxvdmVyIG59fSA+IFFeey0xfSjOsSkiJCA/DQoNCm9yDQoNCiRUOiAicFZhbHVlIFxlcXVpdiBRKHt7XGhhdHtwfS1wXzB9IFxvdmVyIFxzcXJ0e3BfMCgxLXBfMClcb3ZlciBufX0pIDwgzrEiJCA/DQoNCndoZXJlLA0KDQokel/OsSA9IFFeey0xfSjOsSkkDQoNCm9yDQoNCiRRKHpfzrEpID0gzrEkDQoNCipUaGUgZGVjaXNpb24gUnVsZSo6DQoNCklmIHRoZSB0ZXN0IChUKSBpcyBUcnVlLCANCnRoZW4gd2UgY2FuIFJlamVjdCAkSF8wJCwgDQphbmQgQWNjZXB0ICRIXzEkDQoNCmVsc2UsICANCndlIGNhbiBOT1QgUmVqZWN0ICRIXzAkLA0KY2FuIE5FSVRIRVIgQWNjZXB0ICRIXzEkIA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMg5L2/55SoIFINCg0KYGBge3J9DQojIFEzLjE5DQoNCnAwPSAuNQ0Kel/OsT0gcW5vcm0ozrEsIGxvd2VyLnRhaWwgPSBGQUxTRSkNCg0KdGhlU3RhdHM9IChwSC1wMCkvKHAwKigxLXAwKS9uKV4uNQ0KdGhlVGVzdD0gKCAgdGhlU3RhdHM+IHpfzrEgKQ0KDQp0aGVTdGF0cw0KdGhlVGVzdA0KDQppZiAodGhlVGVzdD09VFJVRSkgeyB0aGVEZWNpc2lvbj0gIlJlamVjdCBIMCINCiAgfSBlbHNlIHt0aGVEZWNpc2lvbj0gIkNhbiBOT1QgUmVqZWN0IEgwIn0NCg0KcTMxOT0gdGhlRGVjaXNpb24NCnEzMTkNCmBgYA0KDQoNCg0KYGBge3J9DQojIFEzLjIwDQoNCm5MYXJnZXI9IDQwMA0KdGhlU3RhdHM9IChwSC1wMCkvKHAwKigxLXAwKS9uTGFyZ2VyKV4uNQ0KdGhlVGVzdD0gKCAgdGhlU3RhdHM+IHpfzrEgKQ0KDQp0aGVTdGF0cw0KdGhlVGVzdA0KDQppZiAodGhlVGVzdD09VFJVRSkgeyB0aGVEZWNpc2lvbj0gIlJlamVjdCBIMCINCiAgfSBlbHNlIHt0aGVEZWNpc2lvbj0gIkNhbiBOT1QgUmVqZWN0IEgwIn0NCg0KDQpxMzIwPSB0aGVEZWNpc2lvbg0KcTMyMA0KYGBgDQoNCg0KDQpgYGB7cn0NCiMNCiMg5Y+D6ICD55qE6Kej562U77yM5L6G6IeqIFIg77yM5LuN6ZyA6YCy5LiA5q2l6Kej6K6ADQojDQoNCg0KcTI9IHByb3AudGVzdCggcEgqbiwgbiwgICAgICAgcD0gLjUsIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKQ0KcTQ9IHByb3AudGVzdCggcEgqbkxhcmdlciwgbkxhcmdlciwgcD0gLjUsIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKQ0KDQoNCnEyDQpxNA0KYGBgDQoNCg0KDQpgYGB7cn0NCiMg6YCy5LiA5q2l6Kej6K6ADQojIOmBi+eUqCBwVmFsdWUNCg0KdGhlU3RhdHM9IHEyJHN0YXRpc3RpYw0KdGhlUFY9ICAgIHEyJHAudmFsdWUNCg0KdGhlVGVzdD0gKCAgdGhlUFYgPCDOsSApDQoNCmlmICh0aGVUZXN0PT1UUlVFKSB7IHRoZURlY2lzaW9uPSAiUmVqZWN0IEgwIg0KICB9IGVsc2Uge3RoZURlY2lzaW9uPSAiQ2FuIE5PVCBSZWplY3QgSDAifQ0KDQpxMzIwXzE9IHRoZURlY2lzaW9uDQoNCnRoZVN0YXRzDQp0aGVQVg0KcTMyMF8xDQoNCmBgYA0KDQoNCmBgYHtyfQ0KIyDpgLLkuIDmraXop6PoroANCiMg6YGL55SoIHBWYWx1ZQ0KDQp0aGVTdGF0cz0gcTQkc3RhdGlzdGljDQp0aGVQVj0gICAgcTQkcC52YWx1ZQ0KDQp0aGVUZXN0PSAoICB0aGVQViA8IM6xICkNCg0KaWYgKHRoZVRlc3Q9PVRSVUUpIHsgdGhlRGVjaXNpb249ICJSZWplY3QgSDAiDQogIH0gZWxzZSB7dGhlRGVjaXNpb249ICJDYW4gTk9UIFJlamVjdCBIMCJ9DQoNCnEzMjBfMj0gdGhlRGVjaXNpb24NCg0KdGhlU3RhdHMNCnRoZVBWDQpxMzIwXzINCmBgYA0KDQojIyDkvb/nlKggUHl0aG9uDQoNCmBgYHtweXRob259DQpuPSAxMDANClg9ICA1NQ0KzrE9IC4wNQ0KDQojIFEzLjE3DQpxMzE3PSBwSD0gWC9uDQoNCiMgUTMuMTgNCg0KI3NlPSBucC5hcnJheShbLTEuOTYsIDEuOTZdKSoocEgqKDEtcEgpL24pKiouNQ0KY2k9IHBIICsgc3Qubm9ybS5wcGYoW86xLzIsIDEtzrEvMl0pICogKHBIKigxLXBIKS9uKSoqLjUNCnEzMTg9IGNpDQogDQpxMzE3DQpxMzE4DQoNCmBgYA0KYGBge3B5dGhvbn0NCmZyb20gc3RhdHNtb2RlbHMuc3RhdHMucHJvcG9ydGlvbiBpbXBvcnQgcHJvcG9ydGlvbnNfenRlc3QNCg0KcEg9IC41NQ0Kbj0gIDEwMA0KDQp6c3RhdDEsIHBWYWx1ZTE9IHByb3BvcnRpb25zX3p0ZXN0KA0KICBjb3VudD0gcEgqbiwgDQogIG5vYnM9IG4sIA0KICB2YWx1ZT0gMC41LCANCiAgYWx0ZXJuYXRpdmU9ICdsYXJnZXInKQ0KICANCnRoZVRlc3QxPSAocFZhbHVlMSA8IM6xKQ0KDQpxMzE5PSB0aGVEZWNpc2lvbjE9ICJSZWplY3QgSDAiIGlmIHRoZVRlc3QxICBlbHNlICJjYW4gTk9UIFJlamVjdCBIMCINCnEzMTkNCmBgYA0KDQoNCmBgYHtweXRob259DQpuTGFyZ2VyPSA0MDANCg0KenN0YXQyLCBwVmFsdWUyPSBwcm9wb3J0aW9uc196dGVzdCgNCiAgY291bnQ9IHBIKm5MYXJnZXIsIA0KICBub2JzPSBuTGFyZ2VyLCANCiAgdmFsdWU9IDAuNSwgDQogIGFsdGVybmF0aXZlPSAnbGFyZ2VyJykNCg0KDQp0aGVUZXN0Mj0gKHBWYWx1ZTIgPCDOsSkNCg0KcTMyMD0gdGhlRGVjaXNpb24yPSAiUmVqZWN0IEgwIiBpZiB0aGVUZXN0MiAgZWxzZSAiY2FuIE5PVCBSZWplY3QgSDAiDQoNCnEzMjANCmBgYA0KIyBbUmVmXSANCg0KIyMg5omL56i/MQ0KDQohW+aJi+eovzFdKGh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS92dWVpWVIyclppT2ZUeVFMbHp0amwtcm45R0hacHM0QWxDN1hxaHhkNnJydWJKTVUwVkpMN3pEM1Vtd3lDYVBrM2g3anBBS3AtMTNyRDl6RGpVX0ZrRVF2c0pvNWg0SWhMeEY0aUpNRnhmUXZkelc3MzBwRlRZUndVc0hORHp2OWUxV1hMdHJ3NEdsS1U2NDRZU3JjelFHa01QMjRaVnhWUWE1WFRtbnhzZGl6SVdkc2NhOUROTUFqcHZUTi1MNG1uVEdodUNKUG9weDhnR29DdWlrRWlTX25OcFBJN3dYUVh6NDJsT0hsU25Va2tNbVZYLXRnMjhTNXV3YUNuQmtmdDJCeXgwUS01LXVhdlVYQW1jX1dodmk0VW1Wa3VqczY1U0N0S2Ywa0hPU0lwVmdoS3FIRktSOFo0RWYtNk1YeFIzRVhHaHVnQm5XemFTQ09OZUViMF9hcHUxdlQwRVo5Zk9kOEJwR3gxbW5jcE9zRGdKaGYzUEQ5bkljS0x5VnA0SmRfbWtsVnhuSUdlWDBXSWhORkxhX0tudzlvRkhNVGs1TkV4NFByUnlJeExxYUEwZW85QVFaakpoVG4xSU5Rek5MLUdWQWdOSl9QVGNoelJKYWgtMTN5RVJrU0JXOVJvOXFNWVFtWUoyeXhkcFJqeC1OOENwa2dPbFF3U0Z5VTdxTERzeDBzbjl4NkdEMlU5V1VVNjNuX1p5THlvX1hPWVBlZVB6SWdYblU0TlpHTk5PckNPdlk3MS1KVklaeTVCLTJpMlRnbllES2tCNG42ZDk0dFZ1YjNqRzhRRmZSNVVaUzY0YTQtR0VWSFpOaFNlX1oyRjhzeVBiQ2VqWDRmZEQtRlJEQ3BlVFV5RTBxelF2MDFRYXI0WDJTUDNkRDNxTF9FbUpoMkNBRnBFejIzSUp6LTdRbDV5dFNmNUd1Wmt4QlhRZTBZaXFteWV1dmVnWGw5Sl8xd3JFS1R6YlcwX1lTOVUtYjZZMTk5c2N6cUh5ZVVOMEtpMDNQWXA3WndJamNDN3d0em1GRGFrRnowNFc2dDJsUE9FOGRoUF9Cc0VpSlJOdz13MTA3Mi1oODA0LW5vP2F1dGh1c2VyPTApDQoNCiMjIOaJi+eovzINCg0KIVvmiYvnqL8yXShodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vclFpYmlvQW9ra1VZejdwUm91QTM3cXY1UW05dFk5bXlKeHRVNktxMjlHTkI1QzQtQnFSenFSYkpDamp5ZGEyaXV3b3l1TEJhRF9kTy1sNG1oNGdZVml0aDRWZDVqVVVLUmwzN2lBcVcyUEE4OTF3YjRlOWRpZHhsdWNFN1FNMm5qWkp6b24tMnBWUmFVb21iVGFJLVdmTmcxNE5XUFRrU1V4Vi1IMzFOa1dGUzZIbkVTTExNX2JFMzRlSjdGSDdwdDZhNXlsS2NuQ1JHSUlUc3p0Q1VNNUdrWnhLLXhjc2V6eWZGaEJxTENCSTlUVnpsdEFWSnVIUzJLQUV0aWVlUUY2N0lkZTR1N3ZfdWg3aktnZVd2QlJQWFNtbG8wNXQ5bFRoeHliR0pxRnczNUN1Wmk4dzc2RXk2Q01aSVFRN3kzVFhsbFktaEdjS0ZOZ3Z4ZWFMQTRuM3RJTmJJZERFODBUTFRPVzlHdm8zaDA5eDJNWjlua0Zadng3U2l2ZWF3Nko4Q21pdE1mZkwzTWJ6b3lnV2RwVWNMZ1g3MVdSSlBkSm5pcVJQVmlNX2FoX2dXd3FOS3pTTF9RUm9pWHA3RVZwQ0NSeU9ieWZ4VG5zWHVPSDdlM2M3dlpfczVkdUVKS0xaSFljTW4tNjRvVG1IbnVaNDgycXZXQmtFaGQtN2xwNE5JVDQ4MGxINDlaaDk1OWJWZHd3MWFZVkd5ZmpDOE5ZWHFEMDI5YTNmeHhXZnpDWXF2OHNiYnQ5eVk2MDlNM2NDYl95QXo5STNkcU9pZUZOanZmWGg2dkxMczhRODBFcmozcDlvdmVqcGRLWE5uc3lsdUJ0ZmN0WmRkUXc1dlpHWkxNUlREUFI3NFpBTlZfYnV6VzFpSGxyUDQ3X0s0aTIzY1Vpc1FGdmg1QVZNNEh5UUFhaUlMYTdhcHAtVnNsbm5UNXJpX2lycHNBbkw5UnMwQjRSWHRUcXU0ME9ZX3doYUtuZ3VwSUxHUVRvMFBlRkxRWmZUbExJaUdmV2l0ZTNKRU9PaHJod1dleUhrdXFhV2ZsQTRKQktVaEJ5Vzg2dTBZZGc9dzEwNzItaDgwNC1ubz9hdXRodXNlcj0wKQ0KDQojIyDmiYvnqL8zDQoNCiFb5omL56i/M10oaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL1ZFb3E1S2dNblFJWE5uLV9pNF80QzF3RkZwdF9iYk1QMFFfcGdMdTFPZ2FqS2VpZzA0eUY0dENQYmtmaGRMZ0VFTVdYS3ZEZmtuQUFMaDNuQmg5Q0VIakplVW1sWlBUM1VKZnRmTVpMbldRWFhOMFl0SnRlRHk3SXY3NTlSdFZzaVJvR2VPMWJ4LXB1MjFJYVRHVkxsTzZMQ0dDM09UQXdxOC1QS3VxTzF0XzJETkdmTFkxZkI3aERmOUJkVEJ1WGRoLTNIUngzME1mZ2dhR01PLURxMGY1SkZhSmhRMFY4WTREMmp3NDdtUGtHQlZGZ2Q4NklQNlhXSWNRYTZXeFIzbWNHR0U4bzlTb1pSMEh4SDk3bjM0Z2F2dzFsLXBTekRiWXZoQnZZQ3VKU3oxb1RwNWVRV0VzMjdGR19hM0NJdDc1a3V0R2tuX3VHXzJtRy1UV1NESldsdUFDQmR0ekNmWVpoZXdhbUVtWFl5OEFjaVZPNEFrUTE2RXBGN01VWTQwa21KeTA3NDY3OUFUVmpfdnBPWnU5R0F6TDN6Z1BfajRkeE5SMWsyUGR1VEl3d2U1THVvTXdGbzBDb2k2bF9yLVFLcUVHeVhWUUZJZWZEX013XzUwamRKTXF6N2Nkc2ZCZ0JGNHNiTzVrN0pDVGVRZ1RQcWVGWDN0a1kzY09uUnI5WHVVTFRVbHJ3OUgyeDdEa3Vfa29aQ0VjOV95cGtueFBaNWdKM29wckNaemVWVEpPc1JIVnNiVzVKRV9NbnJqbUNIeGEtc0wtMjdrLWdpNkpPOXVkX2p5cmNNbmROQW5kRFV0M21QUjNDU1Vob2xvSEdrdDhKVms5dkU4TnBZRXR1SEkzLVJteElNM01NUktyMm5wdXJBZ2ZRMGpXSlpFZFNYUFJsc1M1UnVEbW05ak5IQXRKcTNCQ1d1aFg4R2ZubHhoNzVZekw1U29tNW9TUHgtYzJFM21VQlpiT1FhWjVQN1dLSlZJdElSeC14WFVnN1BHYlBzUDQ3MUFIckpqQXEwdUhFT0EtUmZIdWk0ME5UczZGMzFQbzJqTnZjYVNiLVFRPXcxMDcyLWg4MDQtbm8/YXV0aHVzZXI9MCkNCg0KDQoNCg0KDQo=