Section 3: Confidence Intervals and p-Values - Confidence Intervals - Video


Key points

  • We can use statistical theory to compute the probability that a given interval contains the true parameter \(p\).
  • 95% confidence intervals are intervals constructed to have a 95% chance of including \(p\). The margin of error is approximately a 95% confidence interval.
  • The start and end of these confidence intervals are random variables.
  • To calculate any size confidence interval, we need to calculate the value \(z\) for which \(\mbox{Pr}(-z \leq Z \leq z)\) equals the desired confidence. For example, a 99% confidence interval requires calculating \(z\) for \(\mbox{Pr}(-z \leq Z \leq z)=0.99\).
  • For a confidence interval of size \(q\), we solve for \(z = 1 - \frac{1-q}{2}\).
  • To determine a 95% confidence interval, use z <- qnorm(0.975). This value is slightly smaller than 2 times the standard error.
# The shaded area around the curve is related to the concept of confidence intervals.
data("nhtemp")
data.frame(year = as.numeric(time(nhtemp)), temperature = as.numeric(nhtemp)) %>%
    ggplot(aes(year, temperature)) +
    geom_point() +
    geom_smooth() +
    ggtitle("Average Yearly Temperatures in New Haven")

# Note that to compute the exact 95% confidence interval, we would use qnorm(.975)*SE_hat instead of 2*SE_hat.
p <- 0.45
N <- 1000
X <- sample(c(0,1), size = N, replace = TRUE, prob = c(1-p, p))    # generate N observations
X_hat <- mean(X)    # calculate X_hat
SE_hat <- sqrt(X_hat*(1-X_hat)/N)    # calculate SE_hat, SE of the mean of N observations
c(X_hat - 2*SE_hat, X_hat + 2*SE_hat)    # build interval of 2*SE above and below mean
[1] 0.4185357 0.4814643
z <- qnorm(0.995)    # calculate z to solve for 99% confidence interval
pnorm(qnorm(0.995))    # demonstrating that qnorm gives the z value for a given probability
[1] 0.995
pnorm(qnorm(1-0.995))    # demonstrating symmetry of 1-qnorm
[1] 0.005
pnorm(z) - pnorm(-z)    # demonstrating that this z value gives correct probability for interval
[1] 0.99

Section 3: Confidence Intervals and p-Values - A Monte Carlo Simulation for Confidence Intervals - Video


Key points

  • We can run a Monte Carlo simulation to confirm that a 95% confidence interval contains the true value of 𝑝 95% of the time.
  • A plot of confidence intervals from this simulation demonstrates that most intervals include 𝑝, but roughly 5% of intervals miss the true value of 𝑝.
# Note that to compute the exact 95% confidence interval, we would use qnorm(.975)*SE_hat instead of 2*SE_hat.
B <- 10000
inside <- replicate(B, {
    X <- sample(c(0,1), size = N, replace = TRUE, prob = c(1-p, p))
    X_hat <- mean(X)
    SE_hat <- sqrt(X_hat*(1-X_hat)/N)
    between(p, X_hat - 2*SE_hat, X_hat + 2*SE_hat)    # TRUE if p in confidence interval
})
mean(inside)
[1] 0.953

Section 3: Confidence Intervals and p-Values - The Correct Language - Video


Key points

  • The 95% confidence intervals are random, but 𝑝 is not random.
  • 95% refers to the probability that the random interval falls on top of 𝑝.
  • It is technically incorrect to state that 𝑝 has a 95% chance of being in between two values because that implies 𝑝 is random.

Section 3: Confidence Intervals and p-Values - Power - Video


Key points

  • If we are trying to predict the result of an election, then a confidence interval that includes a spread of 0 (a tie) is not helpful.
  • A confidence interval that includes a spread of 0 does not imply a close election, it means the sample size is too small.
  • Power is the probability of detecting an effect when there is a true effect to find. Power increases as sample size increases, because larger sample size means smaller standard error.
# Note that to compute the exact 95% confidence interval, we would use c(-qnorm(.975), qnorm(.975)) instead of 1.96.
N <- 25
X_hat <- 0.48
(2*X_hat - 1) + c(-2, 2)*2*sqrt(X_hat*(1-X_hat)/N)
[1] -0.4396799  0.3596799

Section 3: Confidence Intervals and p-Values - p-Values - Video


Key points

  • The null hypothesis is the hypothesis that there is no effect. In this case, the null hypothesis is that the spread is 0, or 𝑝=0.5.
  • The p-value is the probability of detecting an effect of a certain size or larger when the null hypothesis is true.
  • We can convert the probability of seeing an observed value under the null hypothesis into a standard normal random variable. We compute the value of 𝑧 that corresponds to the observed result, and then use that 𝑧 to compute the p-value.
  • If a 95% confidence interval does not include our observed value, then the p-value must be smaller than 0.05.
  • It is preferable to report confidence intervals instead of p-values, as confidence intervals give information about the size of the estimate and p-values do not.
N <- 100    # sample size
z <- sqrt(N) * 0.02/0.5    # spread of 0.02
1 - (pnorm(z) - pnorm(-z))
[1] 0.6891565
LS0tCnRpdGxlOiAiU2VjdGlvbiAzOiBDb25maWRlbmNlIEludGVydmFscyBhbmQgcC1WYWx1ZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIFNlY3Rpb24gMzogQ29uZmlkZW5jZSBJbnRlcnZhbHMgYW5kIHAtVmFsdWVzIC0gQ29uZmlkZW5jZSBJbnRlcnZhbHMgLSBWaWRlbwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMjIEtleSBwb2ludHMKCiogV2UgY2FuIHVzZSBzdGF0aXN0aWNhbCB0aGVvcnkgdG8gY29tcHV0ZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIGdpdmVuIGludGVydmFsIGNvbnRhaW5zIHRoZSB0cnVlIHBhcmFtZXRlciAkcCQuCiogOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBpbnRlcnZhbHMgY29uc3RydWN0ZWQgdG8gaGF2ZSBhIDk1JSBjaGFuY2Ugb2YgaW5jbHVkaW5nICRwJC4gVGhlIG1hcmdpbiBvZiBlcnJvciBpcyBhcHByb3hpbWF0ZWx5IGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuCiogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlc2UgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIHJhbmRvbSB2YXJpYWJsZXMuCiogVG8gY2FsY3VsYXRlIGFueSBzaXplIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSAkeiQgZm9yIHdoaWNoICRcbWJveHtQcn0oLXogXGxlcSBaIFxsZXEgeikkIGVxdWFscyB0aGUgZGVzaXJlZCBjb25maWRlbmNlLiBGb3IgZXhhbXBsZSwgYSA5OSUgY29uZmlkZW5jZSBpbnRlcnZhbCByZXF1aXJlcyBjYWxjdWxhdGluZyAkeiQgZm9yICRcbWJveHtQcn0oLXogXGxlcSBaIFxsZXEgeik9MC45OSQuCiogRm9yIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBvZiBzaXplICRxJCwgd2Ugc29sdmUgZm9yICR6ID0gMSAtIFxmcmFjezEtcX17Mn0kLgoqIFRvIGRldGVybWluZSBhIDk1JSBjb25maWRlbmNlIGludGVydmFsLCB1c2UgeiA8LSBxbm9ybSgwLjk3NSkuIFRoaXMgdmFsdWUgaXMgc2xpZ2h0bHkgc21hbGxlciB0aGFuIDIgdGltZXMgdGhlIHN0YW5kYXJkIGVycm9yLgoKCmBgYHtyIFNlY3Rpb24gMzogQ29uZmlkZW5jZSBJbnRlcnZhbHMgYW5kIHAtVmFsdWVzIC0gQ29uZmlkZW5jZSBJbnRlcnZhbHMgLSBDb2RlOiBnZW9tX3Ntb290aCBjb25maWRlbmNlIGludGVydmFsIGV4YW1wbGV9CiMgVGhlIHNoYWRlZCBhcmVhIGFyb3VuZCB0aGUgY3VydmUgaXMgcmVsYXRlZCB0byB0aGUgY29uY2VwdCBvZiBjb25maWRlbmNlIGludGVydmFscy4KZGF0YSgibmh0ZW1wIikKZGF0YS5mcmFtZSh5ZWFyID0gYXMubnVtZXJpYyh0aW1lKG5odGVtcCkpLCB0ZW1wZXJhdHVyZSA9IGFzLm51bWVyaWMobmh0ZW1wKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHllYXIsIHRlbXBlcmF0dXJlKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fc21vb3RoKCkgKwogICAgZ2d0aXRsZSgiQXZlcmFnZSBZZWFybHkgVGVtcGVyYXR1cmVzIGluIE5ldyBIYXZlbiIpCmBgYAoKYGBge3IgU2VjdGlvbiAzOiBDb25maWRlbmNlIEludGVydmFscyBhbmQgcC1WYWx1ZXMgLSBDb25maWRlbmNlIEludGVydmFscyAtIENvZGU6IE1vbnRlIENhcmxvIHNpbXVsYXRpb24gb2YgY29uZmlkZW5jZSBpbnRlcnZhbHN9CiMgTm90ZSB0aGF0IHRvIGNvbXB1dGUgdGhlIGV4YWN0IDk1JSBjb25maWRlbmNlIGludGVydmFsLCB3ZSB3b3VsZCB1c2UgcW5vcm0oLjk3NSkqU0VfaGF0IGluc3RlYWQgb2YgMipTRV9oYXQuCnAgPC0gMC40NQpOIDwtIDEwMDAKWCA8LSBzYW1wbGUoYygwLDEpLCBzaXplID0gTiwgcmVwbGFjZSA9IFRSVUUsIHByb2IgPSBjKDEtcCwgcCkpICAgICMgZ2VuZXJhdGUgTiBvYnNlcnZhdGlvbnMKWF9oYXQgPC0gbWVhbihYKSAgICAjIGNhbGN1bGF0ZSBYX2hhdApTRV9oYXQgPC0gc3FydChYX2hhdCooMS1YX2hhdCkvTikgICAgIyBjYWxjdWxhdGUgU0VfaGF0LCBTRSBvZiB0aGUgbWVhbiBvZiBOIG9ic2VydmF0aW9ucwpjKFhfaGF0IC0gMipTRV9oYXQsIFhfaGF0ICsgMipTRV9oYXQpICAgICMgYnVpbGQgaW50ZXJ2YWwgb2YgMipTRSBhYm92ZSBhbmQgYmVsb3cgbWVhbgpgYGAKCmBgYHtyIFNlY3Rpb24gMzogQ29uZmlkZW5jZSBJbnRlcnZhbHMgYW5kIHAtVmFsdWVzIC0gQ29uZmlkZW5jZSBJbnRlcnZhbHMgLSBDb2RlOiBTb2x2aW5nIGZvciB6IHdpdGggcW5vcm19CnogPC0gcW5vcm0oMC45OTUpICAgICMgY2FsY3VsYXRlIHogdG8gc29sdmUgZm9yIDk5JSBjb25maWRlbmNlIGludGVydmFsCnBub3JtKHFub3JtKDAuOTk1KSkgICAgIyBkZW1vbnN0cmF0aW5nIHRoYXQgcW5vcm0gZ2l2ZXMgdGhlIHogdmFsdWUgZm9yIGEgZ2l2ZW4gcHJvYmFiaWxpdHkKcG5vcm0ocW5vcm0oMS0wLjk5NSkpICAgICMgZGVtb25zdHJhdGluZyBzeW1tZXRyeSBvZiAxLXFub3JtCnBub3JtKHopIC0gcG5vcm0oLXopICAgICMgZGVtb25zdHJhdGluZyB0aGF0IHRoaXMgeiB2YWx1ZSBnaXZlcyBjb3JyZWN0IHByb2JhYmlsaXR5IGZvciBpbnRlcnZhbApgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIFNlY3Rpb24gMzogQ29uZmlkZW5jZSBJbnRlcnZhbHMgYW5kIHAtVmFsdWVzIC0gQSBNb250ZSBDYXJsbyBTaW11bGF0aW9uIGZvciBDb25maWRlbmNlIEludGVydmFscyAtIFZpZGVvCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMgS2V5IHBvaW50cwoKKiBXZSBjYW4gcnVuIGEgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiB0byBjb25maXJtIHRoYXQgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBjb250YWlucyB0aGUgdHJ1ZSB2YWx1ZSBvZiDwnZGdIDk1JSBvZiB0aGUgdGltZS4KKiBBIHBsb3Qgb2YgY29uZmlkZW5jZSBpbnRlcnZhbHMgZnJvbSB0aGlzIHNpbXVsYXRpb24gZGVtb25zdHJhdGVzIHRoYXQgbW9zdCBpbnRlcnZhbHMgaW5jbHVkZSDwnZGdLCBidXQgcm91Z2hseSA1JSBvZiBpbnRlcnZhbHMgbWlzcyB0aGUgdHJ1ZSB2YWx1ZSBvZiDwnZGdLgoKYGBge3IgU2VjdGlvbiAzOiBDb25maWRlbmNlIEludGVydmFscyBhbmQgcC1WYWx1ZXMgLSBBIE1vbnRlIENhcmxvIFNpbXVsYXRpb24gZm9yIENvbmZpZGVuY2UgSW50ZXJ2YWxzIC0gQ29kZTogTW9udGUgQ2FybG8gc2ltdWxhdGlvbn0KIyBOb3RlIHRoYXQgdG8gY29tcHV0ZSB0aGUgZXhhY3QgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHdlIHdvdWxkIHVzZSBxbm9ybSguOTc1KSpTRV9oYXQgaW5zdGVhZCBvZiAyKlNFX2hhdC4KQiA8LSAxMDAwMAppbnNpZGUgPC0gcmVwbGljYXRlKEIsIHsKICAgIFggPC0gc2FtcGxlKGMoMCwxKSwgc2l6ZSA9IE4sIHJlcGxhY2UgPSBUUlVFLCBwcm9iID0gYygxLXAsIHApKQogICAgWF9oYXQgPC0gbWVhbihYKQogICAgU0VfaGF0IDwtIHNxcnQoWF9oYXQqKDEtWF9oYXQpL04pCiAgICBiZXR3ZWVuKHAsIFhfaGF0IC0gMipTRV9oYXQsIFhfaGF0ICsgMipTRV9oYXQpICAgICMgVFJVRSBpZiBwIGluIGNvbmZpZGVuY2UgaW50ZXJ2YWwKfSkKbWVhbihpbnNpZGUpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMgU2VjdGlvbiAzOiBDb25maWRlbmNlIEludGVydmFscyBhbmQgcC1WYWx1ZXMgLSBUaGUgQ29ycmVjdCBMYW5ndWFnZSAtIFZpZGVvCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMgS2V5IHBvaW50cwoKKiBUaGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSByYW5kb20sIGJ1dCDwnZGdIGlzIG5vdCByYW5kb20uCiogOTUlIHJlZmVycyB0byB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgcmFuZG9tIGludGVydmFsIGZhbGxzIG9uIHRvcCBvZiDwnZGdLgoqIEl0IGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCB0byBzdGF0ZSB0aGF0IPCdkZ0gaGFzIGEgOTUlIGNoYW5jZSBvZiBiZWluZyBpbiBiZXR3ZWVuIHR3byB2YWx1ZXMgYmVjYXVzZSB0aGF0IGltcGxpZXMg8J2RnSBpcyByYW5kb20uCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyBTZWN0aW9uIDM6IENvbmZpZGVuY2UgSW50ZXJ2YWxzIGFuZCBwLVZhbHVlcyAtIFBvd2VyIC0gVmlkZW8KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyBLZXkgcG9pbnRzCgoqIElmIHdlIGFyZSB0cnlpbmcgdG8gcHJlZGljdCB0aGUgcmVzdWx0IG9mIGFuIGVsZWN0aW9uLCB0aGVuIGEgY29uZmlkZW5jZSBpbnRlcnZhbCB0aGF0IGluY2x1ZGVzIGEgc3ByZWFkIG9mIDAgKGEgdGllKSBpcyBub3QgaGVscGZ1bC4KKiBBIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdGhhdCBpbmNsdWRlcyBhIHNwcmVhZCBvZiAwIGRvZXMgbm90IGltcGx5IGEgY2xvc2UgZWxlY3Rpb24sIGl0IG1lYW5zIHRoZSBzYW1wbGUgc2l6ZSBpcyB0b28gc21hbGwuCiogUG93ZXIgaXMgdGhlIHByb2JhYmlsaXR5IG9mIGRldGVjdGluZyBhbiBlZmZlY3Qgd2hlbiB0aGVyZSBpcyBhIHRydWUgZWZmZWN0IHRvIGZpbmQuIFBvd2VyIGluY3JlYXNlcyBhcyBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMsIGJlY2F1c2UgbGFyZ2VyIHNhbXBsZSBzaXplIG1lYW5zIHNtYWxsZXIgc3RhbmRhcmQgZXJyb3IuCgoKYGBge3IgU2VjdGlvbiAzOiBDb25maWRlbmNlIEludGVydmFscyBhbmQgcC1WYWx1ZXMgLSBQb3dlciAtIENvZGU6IENvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBzcHJlYWQgd2l0aCBzYW1wbGUgc2l6ZSBvZiAyNX0KIyBOb3RlIHRoYXQgdG8gY29tcHV0ZSB0aGUgZXhhY3QgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHdlIHdvdWxkIHVzZSBjKC1xbm9ybSguOTc1KSwgcW5vcm0oLjk3NSkpIGluc3RlYWQgb2YgMS45Ni4KTiA8LSAyNQpYX2hhdCA8LSAwLjQ4CigyKlhfaGF0IC0gMSkgKyBjKC0yLCAyKSoyKnNxcnQoWF9oYXQqKDEtWF9oYXQpL04pCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMgU2VjdGlvbiAzOiBDb25maWRlbmNlIEludGVydmFscyBhbmQgcC1WYWx1ZXMgLSBwLVZhbHVlcyAtIFZpZGVvCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMgS2V5IHBvaW50cwoKKiBUaGUgbnVsbCBoeXBvdGhlc2lzIGlzIHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlcmUgaXMgbm8gZWZmZWN0LiBJbiB0aGlzIGNhc2UsIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgc3ByZWFkIGlzIDAsIG9yIPCdkZ09MC41LgoqIFRoZSBwLXZhbHVlIGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBkZXRlY3RpbmcgYW4gZWZmZWN0IG9mIGEgY2VydGFpbiBzaXplIG9yIGxhcmdlciB3aGVuIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgdHJ1ZS4KKiBXZSBjYW4gY29udmVydCB0aGUgcHJvYmFiaWxpdHkgb2Ygc2VlaW5nIGFuIG9ic2VydmVkIHZhbHVlIHVuZGVyIHRoZSBudWxsIGh5cG90aGVzaXMgaW50byBhIHN0YW5kYXJkIG5vcm1hbCByYW5kb20gdmFyaWFibGUuIFdlIGNvbXB1dGUgdGhlIHZhbHVlIG9mIPCdkacgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgb2JzZXJ2ZWQgcmVzdWx0LCBhbmQgdGhlbiB1c2UgdGhhdCDwnZGnIHRvIGNvbXB1dGUgdGhlIHAtdmFsdWUuCiogSWYgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIG91ciBvYnNlcnZlZCB2YWx1ZSwgdGhlbiB0aGUgcC12YWx1ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiAwLjA1LgoqIEl0IGlzIHByZWZlcmFibGUgdG8gcmVwb3J0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGluc3RlYWQgb2YgcC12YWx1ZXMsIGFzIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGdpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpemUgb2YgdGhlIGVzdGltYXRlIGFuZCBwLXZhbHVlcyBkbyBub3QuCgoKYGBge3IgU2VjdGlvbiAzOiBDb25maWRlbmNlIEludGVydmFscyBhbmQgcC1WYWx1ZXMgLSBwLVZhbHVlcyAtIENvZGU6IENvbXB1dGluZyBhIHAtdmFsdWUgZm9yIG9ic2VydmVkIHNwcmVhZCBvZiAwLjAyfQpOIDwtIDEwMCAgICAjIHNhbXBsZSBzaXplCnogPC0gc3FydChOKSAqIDAuMDIvMC41ICAgICMgc3ByZWFkIG9mIDAuMDIKMSAtIChwbm9ybSh6KSAtIHBub3JtKC16KSkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==