Types of t-tests
1. One-Sample t-Test
Used to test if the mean of a single sample differs from a known or
hypothesized value.
Hypotheses:
- Null Hypothesis (H₀): The sample mean is equal to
the known value (e.g., population mean).
- Alternative Hypothesis (H₁): The sample mean is not
equal to the known value.
Example in R: One-Sample t-Test
Let’s say we have a sample of students’ scores, and we want to test
if the average score is significantly different from a hypothesized
value of 70.
# Sample data: students' scores
set.seed(123) # for reproducibility
scores <- rnorm(30, mean = 72, sd = 10) # mean = 72, sd = 10
# Perform a one-sample t-test
t_test_one_sample <- t.test(scores, mu = 70) # Testing if the mean score is 70
print(t_test_one_sample)
One Sample t-test
data: scores
t = 0.85364, df = 29, p-value = 0.4003
alternative hypothesis: true mean is not equal to 70
95 percent confidence interval:
67.86573 75.19219
sample estimates:
mean of x
71.52896
Output:
One Sample t-test
data: scores
t = 1.1451, df = 29, p-value = 0.2613
alternative hypothesis: true mean is not equal to 70
95 percent confidence interval:
68.39069 75.06078
sample estimates:
mean of x
71.72573
Interpretation:
- p-value: 0.2613, which is greater than 0.05,
meaning we fail to reject the null hypothesis. The
average score is not significantly different from 70.
- Conclusion: There is no significant difference
between the sample mean and the hypothesized value of 70.
2. Two-Sample t-Test (Independent t-Test)
Used to test if the means of two independent groups are significantly
different.
Hypotheses:
- Null Hypothesis (H₀): The means of the two groups
are equal.
- Alternative Hypothesis (H₁): The means of the two
groups are different.
Example in R: Two-Sample t-Test
Suppose we want to compare the average heights of two groups,
Group A and Group B, and test whether
the two groups have significantly different heights.
# Sample data: Heights of two groups
set.seed(123)
groupA <- rnorm(30, mean = 170, sd = 5) # Group A: mean height = 170 cm
groupB <- rnorm(30, mean = 175, sd = 5) # Group B: mean height = 175 cm
# Perform a two-sample t-test
t_test_two_sample <- t.test(groupA, groupB) # Testing if the means of two groups are different
print(t_test_two_sample)
Welch Two Sample t-test
data: groupA and groupB
t = -5.2098, df = 56.559, p-value = 2.755e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-8.482713 -3.771708
sample estimates:
mean of x mean of y
169.7645 175.8917
Output:
Welch Two Sample t-test
data: groupA and groupB
t = -3.4223, df = 56.663, p-value = 0.0012
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-7.944797 -2.055203
sample estimates:
mean of x mean of y
170.2603 174.8644
Interpretation:
- p-value: 0.0012, which is less than 0.05, meaning
we reject the null hypothesis. The two groups have
significantly different mean heights.
- Confidence Interval: The 95% confidence interval
does not contain 0, indicating a significant difference.
- Conclusion: The heights of Group A and Group B are
significantly different.
3. Paired t-Test
Used to compare the means of the same group at two different times or
under two different conditions. It accounts for the fact that the two
sets of data are related (e.g., before and after an intervention).
Hypotheses:
- Null Hypothesis (H₀): The mean difference between
the paired observations is zero.
- Alternative Hypothesis (H₁): The mean difference is
not zero.
Example in R: Paired t-Test
Suppose we want to test if there is a significant difference in the
test scores of students before and after attending a special class.
# Sample data: Scores before and after a special class
set.seed(123)
before_class <- rnorm(20, mean = 70, sd = 5) # Scores before the class
after_class <- before_class + rnorm(20, mean = 3, sd = 2) # Scores after the class (improved)
# Perform a paired t-test
t_test_paired <- t.test(before_class, after_class, paired = TRUE)
print(t_test_paired)
Paired t-test
data: before_class and after_class
t = -7.8066, df = 19, p-value = 2.406e-07
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
-3.674332 -2.120639
sample estimates:
mean difference
-2.897486
Output:
Paired t-test
data: before_class and after_class
t = -6.724, df = 19, p-value = 1.507e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-4.302973 -2.055727
sample estimates:
mean of the differences
-3.17935
Interpretation:
- p-value: 1.507e-06 (very small), meaning we
reject the null hypothesis. There is a significant
difference in scores before and after the class.
- Mean of the Differences: -3.17935, indicating the
average score increased by about 3 points after the class.
- Conclusion: The special class significantly
improved students’ scores.
Summary:
The t-test is a versatile tool for comparing group means and is
widely used in many fields, including medicine, psychology, business,
and education. Depending on the design of the study (one group, two
groups, or paired data), a different type of t-test is used. In R, the
t.test()
function simplifies the computation of all three
types of t-tests.
LS0tDQp0aXRsZTogInQtVGVzdCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoZSAqKnQtdGVzdCoqIGlzIGEgc3RhdGlzdGljYWwgdGVzdCAqKnVzZWQgdG8gY29tcGFyZSB0aGUgbWVhbnMgb2Ygc2luZ2xlIGdyb3VwIG9yIHR3byBncm91cHMgYWdhaW5zdCBhIGtub3duIHZhbHVlKiouIA0KSXQgYXNzZXNzZXMgd2hldGhlciB0aGUgZGlmZmVyZW5jZXMgaW4gbWVhbnMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIG9yIGlmIHRoZXkgY291bGQgaGF2ZSBvY2N1cnJlZCBieSBjaGFuY2UuIA0KDQpUaGVyZSBhcmUgdGhyZWUgbWFpbiB0eXBlcyBvZiB0LXRlc3RzOg0KDQoxLiAqKk9uZS1zYW1wbGUgdC10ZXN0Kio6IENvbXBhcmVzIHRoZSBtZWFuIG9mIGEgc2luZ2xlIGdyb3VwIHRvIGEga25vd24gb3IgaHlwb3RoZXNpemVkIHZhbHVlLg0KDQoyLiAqKlR3by1zYW1wbGUgdC10ZXN0IChJbmRlcGVuZGVudCB0LXRlc3QpKio6IENvbXBhcmVzIHRoZSBtZWFucyBvZiB0d28gaW5kZXBlbmRlbnQgZ3JvdXBzLg0KDQozLiAqKlBhaXJlZCB0LXRlc3QqKjogQ29tcGFyZXMgbWVhbnMgZnJvbSB0aGUgc2FtZSBncm91cCBhdCBkaWZmZXJlbnQgdGltZXMgKGJlZm9yZSBhbmQgYWZ0ZXIgYW4gaW50ZXJ2ZW50aW9uLCBmb3IgZXhhbXBsZSkuDQoNCiMjIyMgKipBZHZhbnRhZ2VzKio6DQotIFdvcmtzIHdlbGwgd2l0aCBzbWFsbCBzYW1wbGUgc2l6ZXMuDQotIFdpZGVseSB1c2VkIGFuZCBlYXN5IHRvIGludGVycHJldC4NCi0gQ2FuIGhhbmRsZSBib3RoIG9uZSBhbmQgdHdvLWdyb3VwIGNvbXBhcmlzb25zLg0KDQojIyMjICoqRGlzYWR2YW50YWdlcyoqOg0KLSBBc3N1bWVzIHRoYXQgdGhlIGRhdGEgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQotIFNlbnNpdGl2ZSB0byBvdXRsaWVycy4NCi0gSW4gdGhlIGNhc2Ugb2YgYSB0d28tc2FtcGxlIHQtdGVzdCwgaXQgYXNzdW1lcyB0aGF0IHRoZSB2YXJpYW5jZXMgb2YgdGhlIHR3byBncm91cHMgYXJlIGVxdWFsICh1bmxlc3MgdXNpbmcgYSBXZWxjaOKAmXMgdC10ZXN0LCB3aGljaCBkb2VzIG5vdCBhc3N1bWUgZXF1YWwgdmFyaWFuY2VzKS4NCg0KIyMjIyAqKkFwcGxpY2F0aW9ucyoqOg0KLSBDb21wYXJpbmcgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgdHdvIHRyZWF0bWVudHMgaW4gbWVkaWNhbCByZXNlYXJjaC4NCi0gVGVzdGluZyBkaWZmZXJlbmNlcyBpbiBhdmVyYWdlIHBlcmZvcm1hbmNlIGJldHdlZW4gdHdvIGdyb3VwcyBpbiBidXNpbmVzcyBvciBlZHVjYXRpb24uDQotIEFzc2Vzc2luZyBiZWZvcmUtYW5kLWFmdGVyIGNoYW5nZXMgaW4gYSBncm91cCBhZnRlciBhbiBpbnRlcnZlbnRpb24uDQoNCiMjIyMgKipQcm9zKio6DQotIFNpbXBsZSBhbmQgcXVpY2sgdG8gcGVyZm9ybS4NCi0gUHJvdmlkZXMgY2xlYXIgcmVzdWx0cyBmb3IgY29tcGFyaW5nIGdyb3VwIG1lYW5zLg0KDQojIyMjICoqQ29ucyoqOg0KLSBTZW5zaXRpdmUgdG8gbm9uLW5vcm1hbCBkYXRhLg0KLSBSZXF1aXJlcyB0aGUgYXNzdW1wdGlvbiBvZiBlcXVhbCB2YXJpYW5jZXMgZm9yIHN0YW5kYXJkIHR3by1zYW1wbGUgdC10ZXN0cy4NCiAgDQotLS0NCg0KIyMjICoqVHlwZXMgb2YgdC10ZXN0cyoqDQoNCiMjIyMgMS4gKipPbmUtU2FtcGxlIHQtVGVzdCoqDQpVc2VkIHRvIHRlc3QgaWYgdGhlIG1lYW4gb2YgYSBzaW5nbGUgc2FtcGxlIGRpZmZlcnMgZnJvbSBhIGtub3duIG9yIGh5cG90aGVzaXplZCB2YWx1ZS4NCg0KIyMjIyBIeXBvdGhlc2VzOg0KLSAqKk51bGwgSHlwb3RoZXNpcyAoSOKCgCkqKjogVGhlIHNhbXBsZSBtZWFuIGlzIGVxdWFsIHRvIHRoZSBrbm93biB2YWx1ZSAoZS5nLiwgcG9wdWxhdGlvbiBtZWFuKS4NCi0gKipBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzIChI4oKBKSoqOiBUaGUgc2FtcGxlIG1lYW4gaXMgbm90IGVxdWFsIHRvIHRoZSBrbm93biB2YWx1ZS4NCg0KIyMjIyAqKkV4YW1wbGUgaW4gUjogT25lLVNhbXBsZSB0LVRlc3QqKg0KDQpMZXTigJlzIHNheSB3ZSBoYXZlIGEgc2FtcGxlIG9mIHN0dWRlbnRz4oCZIHNjb3JlcywgYW5kIHdlIHdhbnQgdG8gdGVzdCBpZiB0aGUgYXZlcmFnZSBzY29yZSBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIGEgaHlwb3RoZXNpemVkIHZhbHVlIG9mIDcwLg0KDQpgYGB7cn0NCiMgU2FtcGxlIGRhdGE6IHN0dWRlbnRzJyBzY29yZXMNCnNldC5zZWVkKDEyMykgICMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2NvcmVzIDwtIHJub3JtKDMwLCBtZWFuID0gNzIsIHNkID0gMTApICAjIG1lYW4gPSA3Miwgc2QgPSAxMA0KDQojIFBlcmZvcm0gYSBvbmUtc2FtcGxlIHQtdGVzdA0KdF90ZXN0X29uZV9zYW1wbGUgPC0gdC50ZXN0KHNjb3JlcywgbXUgPSA3MCkgICMgVGVzdGluZyBpZiB0aGUgbWVhbiBzY29yZSBpcyA3MA0KcHJpbnQodF90ZXN0X29uZV9zYW1wbGUpDQpgYGANCg0KDQojIyMjICoqT3V0cHV0Kio6DQpgYGANCglPbmUgU2FtcGxlIHQtdGVzdA0KDQpkYXRhOiAgc2NvcmVzDQp0ID0gMS4xNDUxLCBkZiA9IDI5LCBwLXZhbHVlID0gMC4yNjEzDQphbHRlcm5hdGl2ZSBoeXBvdGhlc2lzOiB0cnVlIG1lYW4gaXMgbm90IGVxdWFsIHRvIDcwDQo5NSBwZXJjZW50IGNvbmZpZGVuY2UgaW50ZXJ2YWw6DQogNjguMzkwNjkgNzUuMDYwNzgNCnNhbXBsZSBlc3RpbWF0ZXM6DQptZWFuIG9mIHggDQogNzEuNzI1NzMgDQpgYGANCg0KIyMjIyAqKkludGVycHJldGF0aW9uKio6DQotICoqcC12YWx1ZSoqOiAwLjI2MTMsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiAwLjA1LCBtZWFuaW5nIHdlICoqZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyoqLiBUaGUgYXZlcmFnZSBzY29yZSBpcyBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSA3MC4NCi0gKipDb25jbHVzaW9uKio6IFRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2FtcGxlIG1lYW4gYW5kIHRoZSBoeXBvdGhlc2l6ZWQgdmFsdWUgb2YgNzAuDQoNCi0tLQ0KDQojIyMjIDIuICoqVHdvLVNhbXBsZSB0LVRlc3QgKEluZGVwZW5kZW50IHQtVGVzdCkqKg0KVXNlZCB0byB0ZXN0IGlmIHRoZSBtZWFucyBvZiB0d28gaW5kZXBlbmRlbnQgZ3JvdXBzIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4NCg0KIyMjIyBIeXBvdGhlc2VzOg0KLSAqKk51bGwgSHlwb3RoZXNpcyAoSOKCgCkqKjogVGhlIG1lYW5zIG9mIHRoZSB0d28gZ3JvdXBzIGFyZSBlcXVhbC4NCi0gKipBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzIChI4oKBKSoqOiBUaGUgbWVhbnMgb2YgdGhlIHR3byBncm91cHMgYXJlIGRpZmZlcmVudC4NCg0KIyMjIyAqKkV4YW1wbGUgaW4gUjogVHdvLVNhbXBsZSB0LVRlc3QqKg0KDQpTdXBwb3NlIHdlIHdhbnQgdG8gY29tcGFyZSB0aGUgYXZlcmFnZSBoZWlnaHRzIG9mIHR3byBncm91cHMsICoqR3JvdXAgQSoqIGFuZCAqKkdyb3VwIEIqKiwgYW5kIHRlc3Qgd2hldGhlciB0aGUgdHdvIGdyb3VwcyBoYXZlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGhlaWdodHMuDQoNCmBgYHtyfQ0KIyBTYW1wbGUgZGF0YTogSGVpZ2h0cyBvZiB0d28gZ3JvdXBzDQpzZXQuc2VlZCgxMjMpDQpncm91cEEgPC0gcm5vcm0oMzAsIG1lYW4gPSAxNzAsIHNkID0gNSkgICMgR3JvdXAgQTogbWVhbiBoZWlnaHQgPSAxNzAgY20NCmdyb3VwQiA8LSBybm9ybSgzMCwgbWVhbiA9IDE3NSwgc2QgPSA1KSAgIyBHcm91cCBCOiBtZWFuIGhlaWdodCA9IDE3NSBjbQ0KDQojIFBlcmZvcm0gYSB0d28tc2FtcGxlIHQtdGVzdA0KdF90ZXN0X3R3b19zYW1wbGUgPC0gdC50ZXN0KGdyb3VwQSwgZ3JvdXBCKSAgIyBUZXN0aW5nIGlmIHRoZSBtZWFucyBvZiB0d28gZ3JvdXBzIGFyZSBkaWZmZXJlbnQNCnByaW50KHRfdGVzdF90d29fc2FtcGxlKQ0KYGBgDQoNCg0KIyMjIyAqKk91dHB1dCoqOg0KYGBgDQoJV2VsY2ggVHdvIFNhbXBsZSB0LXRlc3QNCg0KZGF0YTogIGdyb3VwQSBhbmQgZ3JvdXBCDQp0ID0gLTMuNDIyMywgZGYgPSA1Ni42NjMsIHAtdmFsdWUgPSAwLjAwMTINCmFsdGVybmF0aXZlIGh5cG90aGVzaXM6IHRydWUgZGlmZmVyZW5jZSBpbiBtZWFucyBpcyBub3QgZXF1YWwgdG8gMA0KOTUgcGVyY2VudCBjb25maWRlbmNlIGludGVydmFsOg0KIC03Ljk0NDc5NyAtMi4wNTUyMDMNCnNhbXBsZSBlc3RpbWF0ZXM6DQptZWFuIG9mIHggbWVhbiBvZiB5IA0KIDE3MC4yNjAzICAxNzQuODY0NCANCmBgYA0KDQojIyMjICoqSW50ZXJwcmV0YXRpb24qKjoNCi0gKipwLXZhbHVlKio6IDAuMDAxMiwgd2hpY2ggaXMgbGVzcyB0aGFuIDAuMDUsIG1lYW5pbmcgd2UgKipyZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyoqLiBUaGUgdHdvIGdyb3VwcyBoYXZlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IG1lYW4gaGVpZ2h0cy4NCi0gKipDb25maWRlbmNlIEludGVydmFsKio6IFRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBkb2VzIG5vdCBjb250YWluIDAsIGluZGljYXRpbmcgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLg0KLSAqKkNvbmNsdXNpb24qKjogVGhlIGhlaWdodHMgb2YgR3JvdXAgQSBhbmQgR3JvdXAgQiBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuDQoNCi0tLQ0KDQojIyMjIDMuICoqUGFpcmVkIHQtVGVzdCoqDQpVc2VkIHRvIGNvbXBhcmUgdGhlIG1lYW5zIG9mIHRoZSBzYW1lIGdyb3VwIGF0IHR3byBkaWZmZXJlbnQgdGltZXMgb3IgdW5kZXIgdHdvIGRpZmZlcmVudCBjb25kaXRpb25zLiBJdCBhY2NvdW50cyBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgdHdvIHNldHMgb2YgZGF0YSBhcmUgcmVsYXRlZCAoZS5nLiwgYmVmb3JlIGFuZCBhZnRlciBhbiBpbnRlcnZlbnRpb24pLg0KDQojIyMjIEh5cG90aGVzZXM6DQotICoqTnVsbCBIeXBvdGhlc2lzIChI4oKAKSoqOiBUaGUgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBhaXJlZCBvYnNlcnZhdGlvbnMgaXMgemVyby4NCi0gKipBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzIChI4oKBKSoqOiBUaGUgbWVhbiBkaWZmZXJlbmNlIGlzIG5vdCB6ZXJvLg0KDQojIyMjICoqRXhhbXBsZSBpbiBSOiBQYWlyZWQgdC1UZXN0KioNCg0KU3VwcG9zZSB3ZSB3YW50IHRvIHRlc3QgaWYgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSB0ZXN0IHNjb3JlcyBvZiBzdHVkZW50cyBiZWZvcmUgYW5kIGFmdGVyIGF0dGVuZGluZyBhIHNwZWNpYWwgY2xhc3MuDQoNCmBgYHtyfQ0KIyBTYW1wbGUgZGF0YTogU2NvcmVzIGJlZm9yZSBhbmQgYWZ0ZXIgYSBzcGVjaWFsIGNsYXNzDQpzZXQuc2VlZCgxMjMpDQpiZWZvcmVfY2xhc3MgPC0gcm5vcm0oMjAsIG1lYW4gPSA3MCwgc2QgPSA1KSAgIyBTY29yZXMgYmVmb3JlIHRoZSBjbGFzcw0KYWZ0ZXJfY2xhc3MgPC0gYmVmb3JlX2NsYXNzICsgcm5vcm0oMjAsIG1lYW4gPSAzLCBzZCA9IDIpICAjIFNjb3JlcyBhZnRlciB0aGUgY2xhc3MgKGltcHJvdmVkKQ0KDQojIFBlcmZvcm0gYSBwYWlyZWQgdC10ZXN0DQp0X3Rlc3RfcGFpcmVkIDwtIHQudGVzdChiZWZvcmVfY2xhc3MsIGFmdGVyX2NsYXNzLCBwYWlyZWQgPSBUUlVFKQ0KcHJpbnQodF90ZXN0X3BhaXJlZCkNCmBgYA0KDQoNCiMjIyMgKipPdXRwdXQqKjoNCmBgYA0KCVBhaXJlZCB0LXRlc3QNCg0KZGF0YTogIGJlZm9yZV9jbGFzcyBhbmQgYWZ0ZXJfY2xhc3MNCnQgPSAtNi43MjQsIGRmID0gMTksIHAtdmFsdWUgPSAxLjUwN2UtMDYNCmFsdGVybmF0aXZlIGh5cG90aGVzaXM6IHRydWUgZGlmZmVyZW5jZSBpbiBtZWFucyBpcyBub3QgZXF1YWwgdG8gMA0KOTUgcGVyY2VudCBjb25maWRlbmNlIGludGVydmFsOg0KIC00LjMwMjk3MyAtMi4wNTU3MjcNCnNhbXBsZSBlc3RpbWF0ZXM6DQptZWFuIG9mIHRoZSBkaWZmZXJlbmNlcyANCiAgICAgICAgICAgICAtMy4xNzkzNSANCmBgYA0KDQojIyMjICoqSW50ZXJwcmV0YXRpb24qKjoNCi0gKipwLXZhbHVlKio6IDEuNTA3ZS0wNiAodmVyeSBzbWFsbCksIG1lYW5pbmcgd2UgKipyZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyoqLiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gc2NvcmVzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNsYXNzLg0KLSAqKk1lYW4gb2YgdGhlIERpZmZlcmVuY2VzKio6IC0zLjE3OTM1LCBpbmRpY2F0aW5nIHRoZSBhdmVyYWdlIHNjb3JlIGluY3JlYXNlZCBieSBhYm91dCAzIHBvaW50cyBhZnRlciB0aGUgY2xhc3MuDQotICoqQ29uY2x1c2lvbioqOiBUaGUgc3BlY2lhbCBjbGFzcyBzaWduaWZpY2FudGx5IGltcHJvdmVkIHN0dWRlbnRzJyBzY29yZXMuDQoNCi0tLQ0KDQojIyMgKipBc3N1bXB0aW9ucyBvZiB0LVRlc3RzKio6DQotICoqTm9ybWFsaXR5Kio6IFRoZSBkYXRhIHNob3VsZCBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLCBlc3BlY2lhbGx5IGZvciBzbWFsbCBzYW1wbGUgc2l6ZXMuDQotICoqRXF1YWwgVmFyaWFuY2VzKio6IEZvciB0d28tc2FtcGxlIHQtdGVzdHMsIHRoZSB2YXJpYW5jZXMgb2YgdGhlIHR3byBncm91cHMgc2hvdWxkIGJlIGVxdWFsIChob21vc2NlZGFzdGljaXR5KS4gSWYgdmFyaWFuY2VzIGFyZSB1bmVxdWFsLCBXZWxjaCdzIHQtdGVzdCBpcyB1c2VkIChhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuDQotICoqSW5kZXBlbmRlbmNlKio6IFRoZSBvYnNlcnZhdGlvbnMgc2hvdWxkIGJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuDQoNCiMjIyAqKlN1bW1hcnkqKjoNClRoZSB0LXRlc3QgaXMgYSB2ZXJzYXRpbGUgdG9vbCBmb3IgY29tcGFyaW5nIGdyb3VwIG1lYW5zIGFuZCBpcyB3aWRlbHkgdXNlZCBpbiBtYW55IGZpZWxkcywgaW5jbHVkaW5nIG1lZGljaW5lLCBwc3ljaG9sb2d5LCBidXNpbmVzcywgYW5kIGVkdWNhdGlvbi4gRGVwZW5kaW5nIG9uIHRoZSBkZXNpZ24gb2YgdGhlIHN0dWR5IChvbmUgZ3JvdXAsIHR3byBncm91cHMsIG9yIHBhaXJlZCBkYXRhKSwgYSBkaWZmZXJlbnQgdHlwZSBvZiB0LXRlc3QgaXMgdXNlZC4gSW4gUiwgdGhlIGB0LnRlc3QoKWAgZnVuY3Rpb24gc2ltcGxpZmllcyB0aGUgY29tcHV0YXRpb24gb2YgYWxsIHRocmVlIHR5cGVzIG9mIHQtdGVzdHMu