Learning Objectives


Upon completing today’s lab activity, students should be able to do the following using R and RStudio:

  1. Computing probabilities using the student’s t distribution.

  2. Computing probabilities using the chi-squared distribution.

  3. Visualizing the probability distributions.


library(tidyverse)
library(ggplot2)
library(gghighlight)
library(openintro)


Student’s t Distribution


The t distribution with df = n degrees of freedom has density \[P(x;k) = \frac{\Gamma{\left(\frac{(k+1)}{2}\right)}}{\sqrt{(k \pi)} \Gamma\left(\frac{k}{2}\right)} \left(1 + \frac{x^2}{k}\right)^{-\frac{k+1}{2}}\]

for real \(x\) and \(k\) is the degrees of freedom. It has mean 0 (\(k > 1\)) and variance \(\frac{k}{k-2}\) (for \(k > 2\)).

Applications: The most used applications are power calculations for t-tests: Let \(t = \frac{\bar{x} - \mu}{s/\sqrt{n}}\) where \(\bar{x}\) is the mean and \(s\) the sample standard deviation (sd) of \(X_1\), \(X_2\), \(\cdots\), \(X_n\) which are independent and identically distributed \(N(\mu, \sigma^2)\).

When to use the t distribution: When working with problems when the population standard deviation (\(\sigma\)) is unknown and the sample size is small (\(n<30\)), you must utilize the t distribution. General Correct Rule: If \(\sigma\) is unknown, the t distribution is appropriate. If \(\sigma\) is known, then the normal distribution is appropriate.

R has four built-in functions for generating Student’s t distributions. They are detailed further down including the descriptions of the settings.

dt(x, df, ncp) # PDF
pt(q, df, ncp) # CDF
qt(p, df, ncp) # percentiles
rt(n, df, ncp) # simulations
  • x, q is a vector of quantiles.

  • p is a vector of probabilities.

  • n is the number of observations. If length(n) > 1, the length is taken to be the number required.

  • df is the degrees of freedom (\(> 0\), maybe non-integer). df = Inf is allowed.

  • sd is the standard deviation. It’s default value is 1.

  • ncp is the non-centrality parameter delta; currently except for rt(), only for abs(ncp) <= 37.62. If omitted, use the central t distribution.

t Distribution - dt

# Creating the vector with the x-values for dt function
x_dt <- seq(- 5, 5, by = 0.01)

# Applying the dt() function
y_dt <- dt(x_dt, df = 3)

# Plotting 
plot(x_dt,y_dt, type = "l", main = "t-distribution density function", las=1)

t Distribution - pt

# Creating the vector with the x-values for pt function
x_pt <- seq(- 5, 5, by = 0.01)

# Applying the pt() function
y_pt <- pt(x_pt, df = 3)

# Plotting 
plot(x_pt,y_pt, type = "l", main = "t-distribution cumulative function", las=1)

t Distribution - qt

# find t for 95% confidence interval
# value of t with 2.5% in each tail

qt(p=0.025, df = 15, lower.tail = T)
## [1] -2.13145


Chi-Squared Distribution


The chi-squared distribution with \(df = n \ge 0\) degrees of freedom has density

\[P(x;k) = \frac{1}{2^{\frac{k}{2}} \Gamma{\left(\frac{k}{2}\right)}} x^{k/2 -1} e^{-x/2}\] for \(x > 0\) and \(k\) degrees of freedom. This distribution has expected value \(k\) and variance \(2k\). We can compute the Chi-Squared statistic as \[\chi^2_{k} = \sum \frac{(O_i - E_i)^2}{E_i}\] where \(k\) is the degrees of freedom, \(O\) is the observed values, and \(E\) is the expected values (or the means).

Applications: The chi-square test statistic can be used to determine whether or not there is a relationship between the rows and columns of a contingency table. More precisely, this statistic may be used to evaluate if there is a difference in the proportions of the risk factor of interest between the research groups.

When to use the Chi-Squared distribution: It is applied to statistical tests in which the test statistic has a Chi-squared distribution. The Chi-square goodness of fit test and the Chi-square test of independence are two typical tests that rely on the Chi-square distribution.

R has four built-in functions for generating Chi-Squared distributions. They are detailed further down including the descriptions of the settings.

dchisq(x, df) # PDF
pchisq(q, df) # CDF
qchisq(p, df) # percentiles
rchisq(n, df) # simulations
  • x, q is a vector of quantiles.

  • p is a vector of probabilities.

  • n is the number of observations. If length(n) > 1, the length is taken to be the number required.

  • df is the degrees of freedom (\(> 0\), maybe non-integer). df = Inf is allowed.

Chi-Square Distribution - dchisq

# Creating the vector with the x-values for dchisq function
x_dchisq <- seq(0, 10, by = 0.01)

# Applying the dchisq() function
y_dchisq <- dchisq(x_dchisq, df = 3)

# Plotting 
plot(x_dchisq,y_dchisq, type = "l", main = "Chi-Squared distribution density function with df = 3", las=1)

Chi-Square Distribution - pchisq

# Creating the vector with the x-values for pchisq function
x_pchisq <- seq(0, 10, by = 0.01)

# Applying the pchisq() function
y_pchisq <- pchisq(x_pchisq, df = 3)

# Plotting 
plot(x_pchisq,y_pchisq, type = "l", main = "Chi-Square cumulative function with df = 3", las=1)


Mini Activities


Student’s t distributions

Use the functions dt for the density function and pt for the cumulative function to plot - on the same graph - the distributions with degrees of freedom 4, 6, 8, 10, 12, and 14. Make sure to label the curves properly with legends. You can use you learned skill using data frames and ggplot here. What do you observe in the curves as you increase the degrees of freedom?

Chi-Square distributions

Use the functions dchisq for the density function and pchisq for the cumulative function to plot - on the same graph - the distributions with degrees of freedom 5, 15, and 30. Make sure to label the curves properly with legends. Make sure to label the curves properly with legends. You can use you learned skill using data frames and ggplot here. What do you observe in the curves as you increase the degrees of freedom?


LS0tCnRpdGxlOiAiNSAtIFN0YXRpc3RpY2FsIE1vZGVscyBQYXJ0IElJIgphdXRob3I6ICJBbGV4IEpvaG4gUXVpamFubyIKZGF0ZTogIjExLzAyLzIwMjEiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKIyMgKipMZWFybmluZyBPYmplY3RpdmVzKioKCjxicj4KClVwb24gY29tcGxldGluZyB0b2RheSdzIGxhYiBhY3Rpdml0eSwgc3R1ZGVudHMgc2hvdWxkIGJlIGFibGUgdG8gZG8gdGhlIGZvbGxvd2luZyB1c2luZyBSIGFuZCBSU3R1ZGlvOgogIAogIDEuIENvbXB1dGluZyBwcm9iYWJpbGl0aWVzIHVzaW5nIHRoZSBzdHVkZW50J3MgdCBkaXN0cmlidXRpb24uCiAgCiAgMi4gQ29tcHV0aW5nIHByb2JhYmlsaXRpZXMgdXNpbmcgdGhlIGNoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbi4KICAKICAzLiBWaXN1YWxpemluZyB0aGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9ucy4KCjxicj4KCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ2hpZ2hsaWdodCkKbGlicmFyeShvcGVuaW50cm8pCmBgYAoKPGJyPgoKIyMgKipTdHVkZW50J3MgdCBEaXN0cmlidXRpb24qKgoKPGJyPgoKVGhlIHQgZGlzdHJpYnV0aW9uIHdpdGggZGYgPSBuIGRlZ3JlZXMgb2YgZnJlZWRvbSBoYXMgZGVuc2l0eQokJFAoeDtrKSA9IFxmcmFje1xHYW1tYXtcbGVmdChcZnJhY3soaysxKX17Mn1ccmlnaHQpfX17XHNxcnR7KGsgXHBpKX0gXEdhbW1hXGxlZnQoXGZyYWN7a317Mn1ccmlnaHQpfSBcbGVmdCgxICsgXGZyYWN7eF4yfXtrfVxyaWdodCleey1cZnJhY3trKzF9ezJ9fSQkCgpmb3IgcmVhbCAkeCQgYW5kICRrJCBpcyB0aGUgZGVncmVlcyBvZiBmcmVlZG9tLiBJdCBoYXMgbWVhbiAwICgkayA+IDEkKSBhbmQgdmFyaWFuY2UgJFxmcmFje2t9e2stMn0kIChmb3IgJGsgPiAyJCkuCgoqKkFwcGxpY2F0aW9uczoqKiBUaGUgbW9zdCB1c2VkIGFwcGxpY2F0aW9ucyBhcmUgcG93ZXIgY2FsY3VsYXRpb25zIGZvciB0LXRlc3RzOiBMZXQgJHQgPSBcZnJhY3tcYmFye3h9IC0gXG11fXtzL1xzcXJ0e259fSQgd2hlcmUgJFxiYXJ7eH0kIGlzIHRoZSBtZWFuIGFuZCAkcyQgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gKHNkKSBvZiAkWF8xJCwgJFhfMiQsICRcY2RvdHMkLCAkWF9uJCB3aGljaCBhcmUgaW5kZXBlbmRlbnQgYW5kIGlkZW50aWNhbGx5IGRpc3RyaWJ1dGVkICROKFxtdSwgXHNpZ21hXjIpJC4KCioqV2hlbiB0byB1c2UgdGhlIHQgZGlzdHJpYnV0aW9uOioqIFdoZW4gd29ya2luZyB3aXRoIHByb2JsZW1zIHdoZW4gdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICgkXHNpZ21hJCkgaXMgdW5rbm93biBhbmQgdGhlIHNhbXBsZSBzaXplIGlzIHNtYWxsICgkbjwzMCQpLCB5b3UgbXVzdCB1dGlsaXplIHRoZSB0IGRpc3RyaWJ1dGlvbi4gR2VuZXJhbCBDb3JyZWN0IFJ1bGU6IElmICRcc2lnbWEkIGlzIHVua25vd24sIHRoZSB0IGRpc3RyaWJ1dGlvbiBpcyBhcHByb3ByaWF0ZS4gSWYgJFxzaWdtYSQgaXMga25vd24sIHRoZW4gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gaXMgYXBwcm9wcmlhdGUuCgpSIGhhcyBmb3VyIGJ1aWx0LWluIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyBTdHVkZW50J3MgdCBkaXN0cmlidXRpb25zLiBUaGV5IGFyZSBkZXRhaWxlZCBmdXJ0aGVyIGRvd24gaW5jbHVkaW5nIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHNldHRpbmdzLgoKYGBgCmR0KHgsIGRmLCBuY3ApICMgUERGCnB0KHEsIGRmLCBuY3ApICMgQ0RGCnF0KHAsIGRmLCBuY3ApICMgcGVyY2VudGlsZXMKcnQobiwgZGYsIG5jcCkgIyBzaW11bGF0aW9ucwpgYGAKCiAgKiBgeGAsIGBxYCBpcyBhIHZlY3RvciBvZiBxdWFudGlsZXMuCgogICogYHBgIGlzIGEgdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMuCgogICogYG5gIGlzIHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zLiBJZiBgbGVuZ3RoKG4pID4gMWAsIHRoZSBsZW5ndGggaXMgdGFrZW4gdG8gYmUgdGhlIG51bWJlciByZXF1aXJlZC4KCiAgKiBgZGZgIGlzIHRoZSBkZWdyZWVzIG9mIGZyZWVkb20gKCQ+IDAkLCBtYXliZSBub24taW50ZWdlcikuIGBkZiA9IEluZmAgaXMgYWxsb3dlZC4KCiAgKiBgc2RgIGlzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24uIEl0J3MgZGVmYXVsdCB2YWx1ZSBpcyAxLgogIAogICogYG5jcGAgaXMgdGhlIG5vbi1jZW50cmFsaXR5IHBhcmFtZXRlciBkZWx0YTsgY3VycmVudGx5IGV4Y2VwdCBmb3IgYHJ0KClgLCBvbmx5IGZvciBgYWJzKG5jcCkgPD0gMzcuNjJgLiBJZiBvbWl0dGVkLCB1c2UgdGhlIGNlbnRyYWwgdCBkaXN0cmlidXRpb24uCgojIyMgdCBEaXN0cmlidXRpb24gLSBgZHRgCgpgYGB7cn0KIyBDcmVhdGluZyB0aGUgdmVjdG9yIHdpdGggdGhlIHgtdmFsdWVzIGZvciBkdCBmdW5jdGlvbgp4X2R0IDwtIHNlcSgtIDUsIDUsIGJ5ID0gMC4wMSkKCiMgQXBwbHlpbmcgdGhlIGR0KCkgZnVuY3Rpb24KeV9kdCA8LSBkdCh4X2R0LCBkZiA9IDMpCgojIFBsb3R0aW5nIApwbG90KHhfZHQseV9kdCwgdHlwZSA9ICJsIiwgbWFpbiA9ICJ0LWRpc3RyaWJ1dGlvbiBkZW5zaXR5IGZ1bmN0aW9uIiwgbGFzPTEpCmBgYAoKIyMjIHQgRGlzdHJpYnV0aW9uIC0gYHB0YAoKYGBge3J9CiMgQ3JlYXRpbmcgdGhlIHZlY3RvciB3aXRoIHRoZSB4LXZhbHVlcyBmb3IgcHQgZnVuY3Rpb24KeF9wdCA8LSBzZXEoLSA1LCA1LCBieSA9IDAuMDEpCgojIEFwcGx5aW5nIHRoZSBwdCgpIGZ1bmN0aW9uCnlfcHQgPC0gcHQoeF9wdCwgZGYgPSAzKQoKIyBQbG90dGluZyAKcGxvdCh4X3B0LHlfcHQsIHR5cGUgPSAibCIsIG1haW4gPSAidC1kaXN0cmlidXRpb24gY3VtdWxhdGl2ZSBmdW5jdGlvbiIsIGxhcz0xKQpgYGAKCiMjIyB0IERpc3RyaWJ1dGlvbiAtIGBxdGAKCmBgYHtyfQojIGZpbmQgdCBmb3IgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwKIyB2YWx1ZSBvZiB0IHdpdGggMi41JSBpbiBlYWNoIHRhaWwKCnF0KHA9MC4wMjUsIGRmID0gMTUsIGxvd2VyLnRhaWwgPSBUKQpgYGAKCjxicj4KCiMjICoqQ2hpLVNxdWFyZWQgRGlzdHJpYnV0aW9uKioKCjxicj4KClRoZSBjaGktc3F1YXJlZCBkaXN0cmlidXRpb24gd2l0aCAkZGYgPSBuIFxnZSAwJCBkZWdyZWVzIG9mIGZyZWVkb20gaGFzIGRlbnNpdHkKCiQkUCh4O2spID0gXGZyYWN7MX17Ml57XGZyYWN7a317Mn19IFxHYW1tYXtcbGVmdChcZnJhY3trfXsyfVxyaWdodCl9fSB4XntrLzIgLTF9IGVeey14LzJ9JCQKZm9yICR4ID4gMCQgYW5kICRrJCBkZWdyZWVzIG9mIGZyZWVkb20uIFRoaXMgZGlzdHJpYnV0aW9uIGhhcyBleHBlY3RlZCB2YWx1ZSAkayQgYW5kIHZhcmlhbmNlICQyayQuIFdlIGNhbiBjb21wdXRlIHRoZSBDaGktU3F1YXJlZCBzdGF0aXN0aWMgYXMgCiQkXGNoaV4yX3trfSA9IFxzdW0gXGZyYWN7KE9faSAtIEVfaSleMn17RV9pfSQkCndoZXJlICRrJCBpcyB0aGUgZGVncmVlcyBvZiBmcmVlZG9tLCAkTyQgaXMgdGhlIG9ic2VydmVkIHZhbHVlcywgYW5kICRFJCBpcyB0aGUgZXhwZWN0ZWQgdmFsdWVzIChvciB0aGUgbWVhbnMpLgoKKipBcHBsaWNhdGlvbnM6KiogVGhlIGNoaS1zcXVhcmUgdGVzdCBzdGF0aXN0aWMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJvd3MgYW5kIGNvbHVtbnMgb2YgYSBjb250aW5nZW5jeSB0YWJsZS4gTW9yZSBwcmVjaXNlbHksIHRoaXMgc3RhdGlzdGljIG1heSBiZSB1c2VkIHRvIGV2YWx1YXRlIGlmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiB0aGUgcHJvcG9ydGlvbnMgb2YgdGhlIHJpc2sgZmFjdG9yIG9mIGludGVyZXN0IGJldHdlZW4gdGhlIHJlc2VhcmNoIGdyb3Vwcy4KCioqV2hlbiB0byB1c2UgdGhlIENoaS1TcXVhcmVkIGRpc3RyaWJ1dGlvbjoqKiAgSXQgaXMgYXBwbGllZCB0byBzdGF0aXN0aWNhbCB0ZXN0cyBpbiB3aGljaCB0aGUgdGVzdCBzdGF0aXN0aWMgaGFzIGEgQ2hpLXNxdWFyZWQgZGlzdHJpYnV0aW9uLiBUaGUgQ2hpLXNxdWFyZSBnb29kbmVzcyBvZiBmaXQgdGVzdCBhbmQgdGhlIENoaS1zcXVhcmUgdGVzdCBvZiBpbmRlcGVuZGVuY2UgYXJlIHR3byB0eXBpY2FsIHRlc3RzIHRoYXQgcmVseSBvbiB0aGUgQ2hpLXNxdWFyZSBkaXN0cmlidXRpb24uCgpSIGhhcyBmb3VyIGJ1aWx0LWluIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyBDaGktU3F1YXJlZCBkaXN0cmlidXRpb25zLiBUaGV5IGFyZSBkZXRhaWxlZCBmdXJ0aGVyIGRvd24gaW5jbHVkaW5nIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHNldHRpbmdzLgoKYGBgCmRjaGlzcSh4LCBkZikgIyBQREYKcGNoaXNxKHEsIGRmKSAjIENERgpxY2hpc3EocCwgZGYpICMgcGVyY2VudGlsZXMKcmNoaXNxKG4sIGRmKSAjIHNpbXVsYXRpb25zCmBgYAoKICAqIGB4YCwgYHFgIGlzIGEgdmVjdG9yIG9mIHF1YW50aWxlcy4KCiAgKiBgcGAgaXMgYSB2ZWN0b3Igb2YgcHJvYmFiaWxpdGllcy4KCiAgKiBgbmAgaXMgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMuIElmIGBsZW5ndGgobikgPiAxYCwgdGhlIGxlbmd0aCBpcyB0YWtlbiB0byBiZSB0aGUgbnVtYmVyIHJlcXVpcmVkLgoKICAqIGBkZmAgaXMgdGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSAoJD4gMCQsIG1heWJlIG5vbi1pbnRlZ2VyKS4gYGRmID0gSW5mYCBpcyBhbGxvd2VkLgoKIyMjIENoaS1TcXVhcmUgRGlzdHJpYnV0aW9uIC0gYGRjaGlzcWAKCmBgYHtyfQojIENyZWF0aW5nIHRoZSB2ZWN0b3Igd2l0aCB0aGUgeC12YWx1ZXMgZm9yIGRjaGlzcSBmdW5jdGlvbgp4X2RjaGlzcSA8LSBzZXEoMCwgMTAsIGJ5ID0gMC4wMSkKCiMgQXBwbHlpbmcgdGhlIGRjaGlzcSgpIGZ1bmN0aW9uCnlfZGNoaXNxIDwtIGRjaGlzcSh4X2RjaGlzcSwgZGYgPSAzKQoKIyBQbG90dGluZyAKcGxvdCh4X2RjaGlzcSx5X2RjaGlzcSwgdHlwZSA9ICJsIiwgbWFpbiA9ICJDaGktU3F1YXJlZCBkaXN0cmlidXRpb24gZGVuc2l0eSBmdW5jdGlvbiB3aXRoIGRmID0gMyIsIGxhcz0xKQpgYGAKCiMjIyBDaGktU3F1YXJlIERpc3RyaWJ1dGlvbiAtIGBwY2hpc3FgCgpgYGB7cn0KIyBDcmVhdGluZyB0aGUgdmVjdG9yIHdpdGggdGhlIHgtdmFsdWVzIGZvciBwY2hpc3EgZnVuY3Rpb24KeF9wY2hpc3EgPC0gc2VxKDAsIDEwLCBieSA9IDAuMDEpCgojIEFwcGx5aW5nIHRoZSBwY2hpc3EoKSBmdW5jdGlvbgp5X3BjaGlzcSA8LSBwY2hpc3EoeF9wY2hpc3EsIGRmID0gMykKCiMgUGxvdHRpbmcgCnBsb3QoeF9wY2hpc3EseV9wY2hpc3EsIHR5cGUgPSAibCIsIG1haW4gPSAiQ2hpLVNxdWFyZSBjdW11bGF0aXZlIGZ1bmN0aW9uIHdpdGggZGYgPSAzIiwgbGFzPTEpCmBgYAo8YnI+CgojIyAqKk1pbmkgQWN0aXZpdGllcyoqCgo8YnI+CgojIyMgU3R1ZGVudCdzIHQgZGlzdHJpYnV0aW9ucwoKVXNlIHRoZSBmdW5jdGlvbnMgYGR0YCBmb3IgdGhlIGRlbnNpdHkgZnVuY3Rpb24gYW5kIGBwdGAgZm9yIHRoZSBjdW11bGF0aXZlIGZ1bmN0aW9uIHRvIHBsb3QgLSBvbiB0aGUgc2FtZSBncmFwaCAtIHRoZSBkaXN0cmlidXRpb25zIHdpdGggZGVncmVlcyBvZiBmcmVlZG9tIDQsIDYsIDgsIDEwLCAxMiwgYW5kIDE0LiBNYWtlIHN1cmUgdG8gbGFiZWwgdGhlIGN1cnZlcyBwcm9wZXJseSB3aXRoIGxlZ2VuZHMuIFlvdSBjYW4gdXNlIHlvdSBsZWFybmVkIHNraWxsIHVzaW5nIGRhdGEgZnJhbWVzIGFuZCBnZ3Bsb3QgaGVyZS4gV2hhdCBkbyB5b3Ugb2JzZXJ2ZSBpbiB0aGUgY3VydmVzIGFzIHlvdSBpbmNyZWFzZSB0aGUgZGVncmVlcyBvZiBmcmVlZG9tPwoKIyMjIENoaS1TcXVhcmUgZGlzdHJpYnV0aW9ucwoKVXNlIHRoZSBmdW5jdGlvbnMgYGRjaGlzcWAgZm9yIHRoZSBkZW5zaXR5IGZ1bmN0aW9uIGFuZCBgcGNoaXNxYCBmb3IgdGhlIGN1bXVsYXRpdmUgZnVuY3Rpb24gdG8gcGxvdCAtIG9uIHRoZSBzYW1lIGdyYXBoIC0gdGhlIGRpc3RyaWJ1dGlvbnMgd2l0aCBkZWdyZWVzIG9mIGZyZWVkb20gNSwgMTUsIGFuZCAzMC4gTWFrZSBzdXJlIHRvIGxhYmVsIHRoZSBjdXJ2ZXMgcHJvcGVybHkgd2l0aCBsZWdlbmRzLiBNYWtlIHN1cmUgdG8gbGFiZWwgdGhlIGN1cnZlcyBwcm9wZXJseSB3aXRoIGxlZ2VuZHMuIFlvdSBjYW4gdXNlIHlvdSBsZWFybmVkIHNraWxsIHVzaW5nIGRhdGEgZnJhbWVzIGFuZCBnZ3Bsb3QgaGVyZS4gV2hhdCBkbyB5b3Ugb2JzZXJ2ZSBpbiB0aGUgY3VydmVzIGFzIHlvdSBpbmNyZWFzZSB0aGUgZGVncmVlcyBvZiBmcmVlZG9tPwoKPGJyPgo=