1 Problem 1

For this problem, we are asked to derive the general log-likeihood function of the gamma distribution to estimate its parameters, \(\alpha\) and \(\beta\). We will also derive the score function as well.

1.1 Part A: Derivation of the Likelihood Function

To start, we need a sample. If \(X_1\), \(X_2\), \(...\), \(X_n\) are independent and identically distributed such that ~ \(\Gamma(\alpha, \beta)\), then we have the joint pdf: \[ f(x_i \mid \alpha, \beta) = \prod_{i=1}^{n} \frac{1}{\Gamma(\alpha)\beta^\alpha} x_i^{\alpha-1} e^{-x/\beta} \ \ \text{for} \ \ x > 0 \]

Simplifying this, we get our likelihood function: \[ L(\alpha, \beta) = [\frac{1}{\Gamma(\alpha)\beta^\alpha}]^n [\prod_{i=1}^{n}x_i]^{\alpha-1}[e^-[(1/\beta){\Sigma_{i=1}^nx_i}]] \]

Now, we take natural log of the likelihood function: \[\ln(L(\alpha, \beta) = n\]

2 Problem 2

For this problem, we are asked to estimate the parameters of a gamma distribution using a sample consisting of the lengths of time in hours spent by women in the delivery suite while giving birth (without a ceasarian section) for each of 7 days at John Radcliffe Hospital in Oxford, England. The data are taken from Davison (Statistical Models. Cambridge University Press, 2003).

birth <- c(2.1, 3.4, 4.25, 5.6, 6.4, 7.3, 8.5, 8.75, 8.9, 9.5, 9.75, 10, 10.4, 10.4, 16, 19, 4, 4.1, 5, 5.5, 5.7, 6.5, 7.25, 7.3, 7.5, 8.2, 8.5, 9.75, 11, 11.2, 15, 16.5, 2.6, 3.6, 3.6, 6.4, 6.8, 7.5, 7.5, 8.25, 8.5, 10.4, 10.75, 14.25, 14.5, 1.5, 4.7, 4.7, 7.2, 7.25, 8.1, 8.5, 9.2, 9.5, 10.7, 11.5, 2.5, 2.5, 3.4, 4.2, 5.9, 6.25, 7.3, 7.5, 7.8, 8.3, 8.3, 10.25, 12.9, 14.3, 4, 4, 5.25, 6.1, 6.5, 6.9, 7, 8.45, 9.25, 10.1, 0.2, 12.75, 14.6, 2, 2.7, 2.75, 3.4, 4.2, 4.3, 4.9, 6.25, 7, 9, 9.25, 10.7)

2.1 Part A: Maximum Likelihood Estimators

For this part, we will estimate the parameters via maximum likelihood method.

# gamma log-likelihood function
gamma.loglik <- function(params, data) {
  shape <- params[1]  # passing the parameters
  scale <- params[2]
  n <- length(birth)   # sample size
  
  # Log-likelihood for gamma distribution
loglik <- -n*log(gamma(shape)) - n*shape*log(scale) + 
  (shape - 1)*sum(log(data)) - sum(data)/scale
  
  return(loglik)
}

# Score (gradient) equation

gamma.score <- function(params, data) {
  shape <- params[1]
  scale <- params[2]
  n <- length(birth)
  
  # Gradient for shape parameter
  grad_shape <- -n*digamma(shape) - n*log(scale) + 
                sum(log(data)) 
  
  # Gradient for scale parameter
  grad_scale <- -(n*shape)/scale + sum(birth)/scale^2 
  
  return(c(grad_shape, grad_scale))
}


# Need to provide initial values for parameters
initial.params <- c(shape = 2.0, scale = 2.0)  # Reasonable starting values


# Using optim with Nelder-Mead method
mle.result <- optim(
  par = initial.params,
  fn = gamma.loglik,
  gr = gamma.score,
  data = birth,
  method = "L-BFGS-B",
  hessian = TRUE,
  control = list(trace = FALSE,
                 fnscale = -1,
                 maxit = 500,
                 abstol = 1e-8)
)
##
mle.result
$par
   shape    scale 
3.584610 2.125167 

$value
[1] -257.588

$counts
function gradient 
      14       14 

$convergence
[1] 0

$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

$hessian
          shape     scale
shape -30.53752 -44.70238
scale -44.70238 -75.40150

According to the output, our maximum likelihood estimators are \(\hat{\alpha} = 3.584613\) and \(\hat{\beta} = 2.125165\).

2.2 Part B: Method of Moments Estimators

This time, we will estimate the parameters via method of moments.

mom1 <- mean(birth)
mom2 <- mean(birth^2)

mm.est.scale <- mom1 / (mom2 - mom1^2)
mm.est.shape <- mom1 * mm.est.scale

mm.est.shape
[1] 4.424066
mm.est.scale
[1] 0.5807466

According to the output, our method of moments estimators are \(\tilde{\alpha} = 4.424066\) and \(\tilde{\beta} = 0.5807466\).

2.3 Part C: Which is Better?

So how do we compare these two methods of estimating parameters? For method of moments, we are following the idea that the expectation of a distribution is a function of the random variable. As for maximum likelihood estimation, we are following the idea that the entire distribution is a function of x. So we can work directly with the data/distribution when using maximum likelihood estimating instead of using means and variances or other moments. According to most sources on the internet, most seem to agree that maximum likelihood is much better and much more useful than method of moments. And based on the work i did for this assignment, i’m inclined to agree.

LS0tDQp0aXRsZTogIlNUQSA1MDYgQXNzaWdubWVudCA1OiBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAoTUxFKSINCmF1dGhvcjogIklhbiBWYW5XcmlnaHQiDQpkYXRlOiAiMDMvMDIvMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQppZiAoIXJlcXVpcmUoImZpdGRpc3RycGx1cyIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImZpdGRpc3RycGx1cyIpDQogIGxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KfQ0KIyMgbGlicmFyeShmaXRkaXN0cnBsdXMpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KDQpcDQoNCiMgUHJvYmxlbSAxDQpGb3IgdGhpcyBwcm9ibGVtLCB3ZSBhcmUgYXNrZWQgdG8gZGVyaXZlIHRoZSBnZW5lcmFsIGxvZy1saWtlaWhvb2QgZnVuY3Rpb24gb2YgdGhlIGdhbW1hIGRpc3RyaWJ1dGlvbiB0byBlc3RpbWF0ZSBpdHMgcGFyYW1ldGVycywgJFxhbHBoYSQgYW5kICRcYmV0YSQuIFdlIHdpbGwgYWxzbyBkZXJpdmUgdGhlIHNjb3JlIGZ1bmN0aW9uIGFzIHdlbGwuDQoNCiMjIFBhcnQgQTogRGVyaXZhdGlvbiBvZiB0aGUgTGlrZWxpaG9vZCBGdW5jdGlvbg0KVG8gc3RhcnQsIHdlIG5lZWQgYSBzYW1wbGUuIElmICRYXzEkLCAkWF8yJCwgJC4uLiQsICRYX24kIGFyZSBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgc3VjaCB0aGF0IH4gJFxHYW1tYShcYWxwaGEsIFxiZXRhKSQsIHRoZW4gd2UgaGF2ZSB0aGUgam9pbnQgcGRmOg0KJCQNCmYoeF9pIFxtaWQgXGFscGhhLCBcYmV0YSkgPSBccHJvZF97aT0xfV57bn0gXGZyYWN7MX17XEdhbW1hKFxhbHBoYSlcYmV0YV5cYWxwaGF9IHhfaV57XGFscGhhLTF9IGVeey14L1xiZXRhfSAgXCBcIFx0ZXh0e2Zvcn0gXCBcICB4ID4gMA0KJCQNCg0KU2ltcGxpZnlpbmcgdGhpcywgd2UgZ2V0IG91ciBsaWtlbGlob29kIGZ1bmN0aW9uOg0KJCQNCkwoXGFscGhhLCBcYmV0YSkgPSBbXGZyYWN7MX17XEdhbW1hKFxhbHBoYSlcYmV0YV5cYWxwaGF9XV5uIFtccHJvZF97aT0xfV57bn14X2ldXntcYWxwaGEtMX1bZV4tWygxL1xiZXRhKXtcU2lnbWFfe2k9MX1ebnhfaX1dXQ0KJCQNCg0KTm93LCB3ZSB0YWtlIG5hdHVyYWwgbG9nIG9mIHRoZSBsaWtlbGlob29kIGZ1bmN0aW9uOg0KJCRcbG4oTChcYWxwaGEsIFxiZXRhKSA9IG4kJA0KDQoNCiMgUHJvYmxlbSAyDQpGb3IgdGhpcyBwcm9ibGVtLCB3ZSBhcmUgYXNrZWQgdG8gZXN0aW1hdGUgdGhlIHBhcmFtZXRlcnMgb2YgYSBnYW1tYSBkaXN0cmlidXRpb24gdXNpbmcgYSBzYW1wbGUgY29uc2lzdGluZyBvZiB0aGUgbGVuZ3RocyBvZiB0aW1lIGluIGhvdXJzIHNwZW50IGJ5IHdvbWVuIGluIHRoZSBkZWxpdmVyeSBzdWl0ZSB3aGlsZSBnaXZpbmcgYmlydGggKHdpdGhvdXQgYSBjZWFzYXJpYW4gc2VjdGlvbikgZm9yIGVhY2ggb2YgNyBkYXlzIGF0IEpvaG4gUmFkY2xpZmZlIEhvc3BpdGFsIGluIE94Zm9yZCwgRW5nbGFuZC4gVGhlIGRhdGEgYXJlIHRha2VuIGZyb20gRGF2aXNvbiAoU3RhdGlzdGljYWwgTW9kZWxzLiBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcywgMjAwMykuDQoNCmBgYHtyfQ0KYmlydGggPC0gYygyLjEsIDMuNCwgNC4yNSwgNS42LCA2LjQsIDcuMywgOC41LCA4Ljc1LCA4LjksIDkuNSwgOS43NSwgMTAsIDEwLjQsIDEwLjQsIDE2LCAxOSwgNCwgNC4xLCA1LCA1LjUsIDUuNywgNi41LCA3LjI1LCA3LjMsIDcuNSwgOC4yLCA4LjUsIDkuNzUsIDExLCAxMS4yLCAxNSwgMTYuNSwgMi42LCAzLjYsIDMuNiwgNi40LCA2LjgsIDcuNSwgNy41LCA4LjI1LCA4LjUsIDEwLjQsIDEwLjc1LCAxNC4yNSwgMTQuNSwgMS41LCA0LjcsIDQuNywgNy4yLCA3LjI1LCA4LjEsIDguNSwgOS4yLCA5LjUsIDEwLjcsIDExLjUsIDIuNSwgMi41LCAzLjQsIDQuMiwgNS45LCA2LjI1LCA3LjMsIDcuNSwgNy44LCA4LjMsIDguMywgMTAuMjUsIDEyLjksIDE0LjMsIDQsIDQsIDUuMjUsIDYuMSwgNi41LCA2LjksIDcsIDguNDUsIDkuMjUsIDEwLjEsIDAuMiwgMTIuNzUsIDE0LjYsIDIsIDIuNywgMi43NSwgMy40LCA0LjIsIDQuMywgNC45LCA2LjI1LCA3LCA5LCA5LjI1LCAxMC43KQ0KYGBgDQoNCiMjIFBhcnQgQTogTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRvcnMNCkZvciB0aGlzIHBhcnQsIHdlIHdpbGwgZXN0aW1hdGUgdGhlIHBhcmFtZXRlcnMgdmlhIG1heGltdW0gbGlrZWxpaG9vZCBtZXRob2QuIA0KYGBge3J9DQojIGdhbW1hIGxvZy1saWtlbGlob29kIGZ1bmN0aW9uDQpnYW1tYS5sb2dsaWsgPC0gZnVuY3Rpb24ocGFyYW1zLCBkYXRhKSB7DQogIHNoYXBlIDwtIHBhcmFtc1sxXSAgIyBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzDQogIHNjYWxlIDwtIHBhcmFtc1syXQ0KICBuIDwtIGxlbmd0aChiaXJ0aCkgICAjIHNhbXBsZSBzaXplDQogIA0KICAjIExvZy1saWtlbGlob29kIGZvciBnYW1tYSBkaXN0cmlidXRpb24NCmxvZ2xpayA8LSAtbipsb2coZ2FtbWEoc2hhcGUpKSAtIG4qc2hhcGUqbG9nKHNjYWxlKSArIA0KICAoc2hhcGUgLSAxKSpzdW0obG9nKGRhdGEpKSAtIHN1bShkYXRhKS9zY2FsZQ0KICANCiAgcmV0dXJuKGxvZ2xpaykNCn0NCg0KIyBTY29yZSAoZ3JhZGllbnQpIGVxdWF0aW9uDQoNCmdhbW1hLnNjb3JlIDwtIGZ1bmN0aW9uKHBhcmFtcywgZGF0YSkgew0KICBzaGFwZSA8LSBwYXJhbXNbMV0NCiAgc2NhbGUgPC0gcGFyYW1zWzJdDQogIG4gPC0gbGVuZ3RoKGJpcnRoKQ0KICANCiAgIyBHcmFkaWVudCBmb3Igc2hhcGUgcGFyYW1ldGVyDQogIGdyYWRfc2hhcGUgPC0gLW4qZGlnYW1tYShzaGFwZSkgLSBuKmxvZyhzY2FsZSkgKyANCiAgICAgICAgICAgICAgICBzdW0obG9nKGRhdGEpKSANCiAgDQogICMgR3JhZGllbnQgZm9yIHNjYWxlIHBhcmFtZXRlcg0KICBncmFkX3NjYWxlIDwtIC0obipzaGFwZSkvc2NhbGUgKyBzdW0oYmlydGgpL3NjYWxlXjIgDQogIA0KICByZXR1cm4oYyhncmFkX3NoYXBlLCBncmFkX3NjYWxlKSkNCn0NCg0KDQojIE5lZWQgdG8gcHJvdmlkZSBpbml0aWFsIHZhbHVlcyBmb3IgcGFyYW1ldGVycw0KaW5pdGlhbC5wYXJhbXMgPC0gYyhzaGFwZSA9IDIuMCwgc2NhbGUgPSAyLjApICAjIFJlYXNvbmFibGUgc3RhcnRpbmcgdmFsdWVzDQoNCg0KIyBVc2luZyBvcHRpbSB3aXRoIE5lbGRlci1NZWFkIG1ldGhvZA0KbWxlLnJlc3VsdCA8LSBvcHRpbSgNCiAgcGFyID0gaW5pdGlhbC5wYXJhbXMsDQogIGZuID0gZ2FtbWEubG9nbGlrLA0KICBnciA9IGdhbW1hLnNjb3JlLA0KICBkYXRhID0gYmlydGgsDQogIG1ldGhvZCA9ICJMLUJGR1MtQiIsDQogIGhlc3NpYW4gPSBUUlVFLA0KICBjb250cm9sID0gbGlzdCh0cmFjZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICBmbnNjYWxlID0gLTEsDQogICAgICAgICAgICAgICAgIG1heGl0ID0gNTAwLA0KICAgICAgICAgICAgICAgICBhYnN0b2wgPSAxZS04KQ0KKQ0KIyMNCm1sZS5yZXN1bHQNCmBgYA0KQWNjb3JkaW5nIHRvIHRoZSBvdXRwdXQsIG91ciBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdG9ycyBhcmUgJFxoYXR7XGFscGhhfSA9IDMuNTg0NjEzJCBhbmQgJFxoYXR7XGJldGF9ID0gMi4xMjUxNjUkLg0KDQojIyBQYXJ0IEI6IE1ldGhvZCBvZiBNb21lbnRzIEVzdGltYXRvcnMNClRoaXMgdGltZSwgd2Ugd2lsbCBlc3RpbWF0ZSB0aGUgcGFyYW1ldGVycyB2aWEgbWV0aG9kIG9mIG1vbWVudHMuDQpgYGB7cn0NCm1vbTEgPC0gbWVhbihiaXJ0aCkNCm1vbTIgPC0gbWVhbihiaXJ0aF4yKQ0KDQptbS5lc3Quc2NhbGUgPC0gbW9tMSAvIChtb20yIC0gbW9tMV4yKQ0KbW0uZXN0LnNoYXBlIDwtIG1vbTEgKiBtbS5lc3Quc2NhbGUNCg0KbW0uZXN0LnNoYXBlDQptbS5lc3Quc2NhbGUNCmBgYA0KQWNjb3JkaW5nIHRvIHRoZSBvdXRwdXQsIG91ciBtZXRob2Qgb2YgbW9tZW50cyBlc3RpbWF0b3JzIGFyZSAkXHRpbGRle1xhbHBoYX0gPSA0LjQyNDA2NiQgYW5kICRcdGlsZGV7XGJldGF9ID0gMC41ODA3NDY2JC4NCg0KIyMgUGFydCBDOiBXaGljaCBpcyBCZXR0ZXI/DQpTbyBob3cgZG8gd2UgY29tcGFyZSB0aGVzZSB0d28gbWV0aG9kcyBvZiBlc3RpbWF0aW5nIHBhcmFtZXRlcnM/IEZvciBtZXRob2Qgb2YgbW9tZW50cywgd2UgYXJlIGZvbGxvd2luZyB0aGUgaWRlYSB0aGF0IHRoZSBleHBlY3RhdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBpcyBhIGZ1bmN0aW9uIG9mIHRoZSByYW5kb20gdmFyaWFibGUuIEFzIGZvciBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGlvbiwgd2UgYXJlIGZvbGxvd2luZyB0aGUgaWRlYSB0aGF0IHRoZSBlbnRpcmUgZGlzdHJpYnV0aW9uIGlzIGEgZnVuY3Rpb24gb2YgeC4gU28gd2UgY2FuIHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgZGF0YS9kaXN0cmlidXRpb24gd2hlbiB1c2luZyBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGluZyBpbnN0ZWFkIG9mIHVzaW5nIG1lYW5zIGFuZCB2YXJpYW5jZXMgb3Igb3RoZXIgbW9tZW50cy4gQWNjb3JkaW5nIHRvIG1vc3Qgc291cmNlcyBvbiB0aGUgaW50ZXJuZXQsIG1vc3Qgc2VlbSB0byBhZ3JlZSB0aGF0IG1heGltdW0gbGlrZWxpaG9vZCBpcyBtdWNoIGJldHRlciBhbmQgbXVjaCBtb3JlIHVzZWZ1bCB0aGFuIG1ldGhvZCBvZiBtb21lbnRzLiBBbmQgYmFzZWQgb24gdGhlIHdvcmsgaSBkaWQgZm9yIHRoaXMgYXNzaWdubWVudCwgaSdtIGluY2xpbmVkIHRvIGFncmVlLg0K