Individual Details
- Student Name: Cenlue Chen (s3625245)
Executive Statement
The objective of this investigation is to compare the product prices of two supermarket brands, Coles or Woolworths, and to determine which supermarket has lower prices. This report bases the analysis on a dataset which contains 240 samples. There are 120 product prices from Coles, and 120 prices for the exactly same products from Woolworths. The 240 samples (120 pairs of matched product prices) were randomly collected from a grocery shopping website and were classified into 3 categories: Clothing, Household & Pet, Health & Beauty, and fridge. By using RStudio to analyse the data and to visualise it in plots, it is found that the product price distributions of the two supermarkets are similar. Besides, based on the results of hypothesis testing, the conclusion is that product price differences are not statistically significant between Coles and Woolworths.
Load Packages and Data
library(dplyr)
library(lattice)
library(ggplot2)
library(lattice)
library(Rcmdr)
comparison <- read.csv("C:\\Users\\Lyuelnino\\Desktop\\comparison.csv")
print(comparison)
Summary Statistics
Firstly, the price statistics of two supermarkets are summarised in the table below. It is shown that the mean price of the 120 products in Coles is 7.10, and the figure is 6.65 in Woolworths.
comparison %>% group_by(Store) %>% summarise(Min = min(Price,na.rm = TRUE),
Q1 = quantile(Price,probs = .25,na.rm = TRUE),
Median = median(Price, na.rm = TRUE),
Q3 = quantile(Price,probs = .75,na.rm = TRUE),
Max = max(Price,na.rm = TRUE),
Mean = mean(Price, na.rm = TRUE),
SD = sd(Price, na.rm = TRUE),
n = n(),
Missing = sum(is.na(Price)))
Secondly, a histogram is plotted below to compare the product price distributions. The distributions look largely the same, and both appear to be right skewed. The prices in both supermarkets mostly distribute between 2 and 8 dollars, and the right tail is from 8 to more than 30 dollars. However, we cannot tell how product categorisation affects the price distributions. Thus, it is necessary to plot the price distributions grouped by category.
comparison %>% histogram(~Price | Store, data = .,layout=c(1,2),col="skyblue", xlim=c(0,40), xlab="Product Price",main="Histogram of Product Prices", breaks=15)

The graphs below show that the price distributions of “Clothing, Household & Pet” category and of “Health & Beauty” category may account for the right skewness of the two supermarkets’ overall price distributions.
comparison %>% histogram(~Price | Store + Category, data = .,layout=c(1,2))



Thirdly, to compare the prices of each product category for the two supermarkets in a single plot, a box plot is produced below. The box plot shows that the interquartile range of “Clothing, Household & Pet” and “Health & Beauty” of Coles is a little larger than that of Woolworths. Meanwhile, the price differences for each category does not seem very significant.
It is also notable that there are a few outliers in the box plot. However, there is no evidence suggesting that they are not the actual prices due to errors such as typos or website database malfunctioning; besides, since the aim of this report is to find out which supermarket is cheaper, we should regard the sampled prices as reflecting their real pricing strategies. Hence, the outliers will not be removed.
comparison %>% boxplot(Price ~ Store+Category,data = ., main="Box Plot of Product Price by Category and Store", ylab="Product Price", col = "skyblue",names=c("ClsCloth","WwtCloth","ClsFridge","WwtFridge","Cls H&B","WwtH&B"))

Hypothesis Test
Due to the fact that product prices are determined by individual supermarkets, the product prices of Coles and of Woolworths are independent of each other. Besides, the data for both samples are more than 30 which means the data are approximately normal. In addition, assuming confidence level is 95% which α=0.05 and a Levene’s test is needed for this two-sample t-test with assumption: Do Coles and Woolworths have different average product price? Here are the descriptive statistics and a boxplot of product price distribution of two supermarkets:
comparison %>% group_by(Store) %>% summarise(Min = min(Price,na.rm = TRUE),
Q1 = quantile(Price,probs = .25,na.rm = TRUE),
Median = median(Price, na.rm = TRUE),
Q3 = quantile(Price,probs = .75,na.rm = TRUE),
Max = max(Price,na.rm = TRUE),
Mean = mean(Price, na.rm = TRUE),
SD = sd(Price, na.rm = TRUE),
n = n(),
Missing = sum(is.na(Price)))
comparison %>% boxplot(Price ~ Store, data = ., main="Box Plot of Product Price by Store", ylab="Product Price", col = "skyblue",names=c("Coles","Woolworths"))

It is very close, and it looks like Coles tends to have higher product prices. To find out whether the price difference is significant enough to judge which supermarkrt is cheaper, the two-sample t-test will be used to determine whether this difference is statistically significant.
Assumption of equal variance is tested using the Levene’s test. The Levene’s test has the following statistical hypotheses:
\[H0:σ_1^2=σ_2^2\] \[HA:σ_1^2≠σ2^2\] where \[σ_1^2\] and \[σ_2^2\] refer to the population variances of Coles and Woolworths respectively.
leveneTest(Price ~ Store, data = comparison)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 1 0.5733 0.4497
238
The p-value for the Levene’s test of equal variance for product price of Coles and Woolworths was 0.45 which is greater than 0.05. Therefore, we fail to reject H0. In other words, we are safe to assume equal variance.
Now we can use R to perform a two-sample t-test assuming equal variance and a two-sided hypothesis test.
t.test(
Price ~ Store,
data = comparison,
var.equal = TRUE,
alternative = "two.sided"
)
Two Sample t-test
data: Price by Store
t = 0.62513, df = 238, p-value = 0.5325
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.9827968 1.8964634
sample estimates:
mean in group Coles mean in group Woolworths
7.102333 6.645500
The two-sample t-test has the following statistical hypotheses: H0:μ1???μ2=0 HA:μ1???μ2≠0 where μ1 and μ2 refer to the price means of Coles and Woolworths respectively. The null hypothesis is that the difference between the two independent price means is 0. In other words, we assume there is no price difference between Coles and Woolworths.
Interpretation
After we use R to perform a two-sample t-test, the p-value of the two-sample t-test tells us the probability of observing a product price difference between the means 0.456 and a figure bigger, assuming the difference is 0 in the sample (i.e. H0 is true). The two-tailed p-value was reported to be 0.53. According to the p-value method, as p=0.532 > α=0.05, we fail to reject H0. There is no statistically significant difference between the means.
The 95% CI of the difference between the means (0.456) was reported as 95% CI [-0.98 1.90]. As this interval captures H0, we fail to reject it. Once again, there is no significant difference between the means.
Therefore, there is no statistical significance of product price between Coles and Woolworths. We can not determine which supermarket is cheaper.
Discussion
A two-sample t-test was used to determine if there is a significant difference between the mean product price of Coles and Woolworths. The 0.05 level of significance was used. The sample’s mean product price of Coles is 7.10, and that of Woolworths is 6.65. The Levene’s test of homogeneity of variance indicated that equal variance could be assumed. The results of the two-sample t-test assuming equal variance found no statistically significant difference between the average product price of Coles and Woolworths, p=0.53, 95% CI for the difference in means [-0.98 1.90]. The results of the investigation suggest that Woolworths does not have significantly lower mean product price than Coles.
The samples of this investigation meet the requirement of using two-sample t-test, and the aim of this investigation was successfully determined by Hypothesis Testing.
In adition, the limitation of this investigation is the samples only contain 3 categories of products. This may affect the distribution of product price. Next time I will complete a assignment in a group.
LS0tDQp0aXRsZTogIk1BVEgxMzI0IEFzc2lnbm1lbnQgMyINCnN1YnRpdGxlOiAiU3VwZXJtYXJrZXQgUHJpY2UgV2FycyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIEluZGl2aWR1YWwgRGV0YWlscw0KDQoqIFN0dWRlbnQgTmFtZTogQ2VubHVlIENoZW4gKHMzNjI1MjQ1KQ0KDQojIyBFeGVjdXRpdmUgU3RhdGVtZW50DQoNClRoZSBvYmplY3RpdmUgb2YgdGhpcyBpbnZlc3RpZ2F0aW9uIGlzIHRvIGNvbXBhcmUgdGhlIHByb2R1Y3QgcHJpY2VzIG9mIHR3byBzdXBlcm1hcmtldCBicmFuZHMsIENvbGVzIG9yIFdvb2x3b3J0aHMsIGFuZCB0byBkZXRlcm1pbmUgd2hpY2ggc3VwZXJtYXJrZXQgaGFzIGxvd2VyIHByaWNlcy4gVGhpcyByZXBvcnQgYmFzZXMgdGhlIGFuYWx5c2lzIG9uIGEgZGF0YXNldCB3aGljaCBjb250YWlucyAyNDAgc2FtcGxlcy4gVGhlcmUgYXJlIDEyMCBwcm9kdWN0IHByaWNlcyBmcm9tIENvbGVzLCBhbmQgMTIwIHByaWNlcyBmb3IgdGhlIGV4YWN0bHkgc2FtZSBwcm9kdWN0cyBmcm9tIFdvb2x3b3J0aHMuIFRoZSAyNDAgc2FtcGxlcyAoMTIwIHBhaXJzIG9mIG1hdGNoZWQgcHJvZHVjdCBwcmljZXMpIHdlcmUgcmFuZG9tbHkgY29sbGVjdGVkIGZyb20gYSBbZ3JvY2VyeSBzaG9wcGluZyB3ZWJzaXRlXShodHRwOi8vd3d3Lmdyb2Nlcnljb3AuY29tLmF1LykgYW5kIHdlcmUgY2xhc3NpZmllZCBpbnRvIDMgY2F0ZWdvcmllczogQ2xvdGhpbmcsIEhvdXNlaG9sZCAmIFBldCwgSGVhbHRoICYgQmVhdXR5LCBhbmQgZnJpZGdlLiBCeSB1c2luZyBSU3R1ZGlvIHRvIGFuYWx5c2UgdGhlIGRhdGEgYW5kIHRvIHZpc3VhbGlzZSBpdCBpbiBwbG90cywgaXQgaXMgZm91bmQgdGhhdCB0aGUgcHJvZHVjdCBwcmljZSBkaXN0cmlidXRpb25zIG9mIHRoZSB0d28gc3VwZXJtYXJrZXRzIGFyZSBzaW1pbGFyLiBCZXNpZGVzLCBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiBoeXBvdGhlc2lzIHRlc3RpbmcsIHRoZSBjb25jbHVzaW9uIGlzIHRoYXQgcHJvZHVjdCBwcmljZSBkaWZmZXJlbmNlcyBhcmUgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocy4NCg0KIyMgTG9hZCBQYWNrYWdlcyBhbmQgRGF0YQ0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGxhdHRpY2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGxhdHRpY2UpDQpsaWJyYXJ5KFJjbWRyKQ0KDQpjb21wYXJpc29uIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXEx5dWVsbmlub1xcRGVza3RvcFxcY29tcGFyaXNvbi5jc3YiKQ0KcHJpbnQoY29tcGFyaXNvbikNCg0KYGBgDQojIyBTdW1tYXJ5IFN0YXRpc3RpY3MNCg0KRmlyc3RseSwgdGhlIHByaWNlIHN0YXRpc3RpY3Mgb2YgdHdvIHN1cGVybWFya2V0cyBhcmUgc3VtbWFyaXNlZCBpbiB0aGUgdGFibGUgYmVsb3cuIEl0IGlzIHNob3duIHRoYXQgdGhlIG1lYW4gcHJpY2Ugb2YgdGhlIDEyMCBwcm9kdWN0cyBpbiBDb2xlcyBpcyA3LjEwLCBhbmQgdGhlIGZpZ3VyZSBpcyA2LjY1IGluIFdvb2x3b3J0aHMuDQpgYGB7cn0NCmNvbXBhcmlzb24gJT4lIGdyb3VwX2J5KFN0b3JlKSAlPiUgc3VtbWFyaXNlKE1pbiA9IG1pbihQcmljZSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMSA9IHF1YW50aWxlKFByaWNlLHByb2JzID0gLjI1LG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhbiA9IG1lZGlhbihQcmljZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUTMgPSBxdWFudGlsZShQcmljZSxwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggPSBtYXgoUHJpY2UsbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhbiA9IG1lYW4oUHJpY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEID0gc2QoUHJpY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc3NpbmcgPSBzdW0oaXMubmEoUHJpY2UpKSkNCmBgYA0KDQpTZWNvbmRseSwgYSBoaXN0b2dyYW0gaXMgcGxvdHRlZCBiZWxvdyB0byBjb21wYXJlIHRoZSBwcm9kdWN0IHByaWNlIGRpc3RyaWJ1dGlvbnMuIFRoZSBkaXN0cmlidXRpb25zIGxvb2sgbGFyZ2VseSB0aGUgc2FtZSwgYW5kIGJvdGggYXBwZWFyIHRvIGJlIHJpZ2h0IHNrZXdlZC4gVGhlIHByaWNlcyBpbiBib3RoIHN1cGVybWFya2V0cyBtb3N0bHkgZGlzdHJpYnV0ZSBiZXR3ZWVuIDIgYW5kIDggZG9sbGFycywgYW5kIHRoZSByaWdodCB0YWlsIGlzIGZyb20gOCB0byBtb3JlIHRoYW4gMzAgZG9sbGFycy4gSG93ZXZlciwgd2UgY2Fubm90IHRlbGwgaG93IHByb2R1Y3QgY2F0ZWdvcmlzYXRpb24gYWZmZWN0cyB0aGUgcHJpY2UgZGlzdHJpYnV0aW9ucy4gVGh1cywgaXQgaXMgbmVjZXNzYXJ5IHRvIHBsb3QgdGhlIHByaWNlIGRpc3RyaWJ1dGlvbnMgZ3JvdXBlZCBieSBjYXRlZ29yeS4NCmBgYHtyfQ0KY29tcGFyaXNvbiAlPiUgaGlzdG9ncmFtKH5QcmljZSB8IFN0b3JlLCBkYXRhID0gLixsYXlvdXQ9YygxLDIpLGNvbD0ic2t5Ymx1ZSIsIHhsaW09YygwLDQwKSwgeGxhYj0iUHJvZHVjdCBQcmljZSIsbWFpbj0iSGlzdG9ncmFtIG9mIFByb2R1Y3QgUHJpY2VzIiwgYnJlYWtzPTE1KQ0KYGBgDQoNClRoZSBncmFwaHMgYmVsb3cgc2hvdyB0aGF0IHRoZSBwcmljZSBkaXN0cmlidXRpb25zIG9mICJDbG90aGluZywgSG91c2Vob2xkICYgUGV0IiBjYXRlZ29yeSBhbmQgb2YgIkhlYWx0aCAmIEJlYXV0eSIgY2F0ZWdvcnkgbWF5IGFjY291bnQgZm9yIHRoZSByaWdodCBza2V3bmVzcyBvZiB0aGUgdHdvIHN1cGVybWFya2V0cycgb3ZlcmFsbCBwcmljZSBkaXN0cmlidXRpb25zLiANCmBgYHtyfQ0KY29tcGFyaXNvbiAlPiUgaGlzdG9ncmFtKH5QcmljZSB8IFN0b3JlICsgQ2F0ZWdvcnksIGRhdGEgPSAuLGxheW91dD1jKDEsMikpDQpgYGANCg0KVGhpcmRseSwgdG8gY29tcGFyZSB0aGUgcHJpY2VzIG9mIGVhY2ggcHJvZHVjdCBjYXRlZ29yeSBmb3IgdGhlIHR3byBzdXBlcm1hcmtldHMgaW4gYSBzaW5nbGUgcGxvdCwgYSBib3ggcGxvdCBpcyBwcm9kdWNlZCBiZWxvdy4gVGhlIGJveCBwbG90IHNob3dzIHRoYXQgdGhlIGludGVycXVhcnRpbGUgcmFuZ2Ugb2YgIkNsb3RoaW5nLCBIb3VzZWhvbGQgJiBQZXQiIGFuZCAiSGVhbHRoICYgQmVhdXR5IiBvZiBDb2xlcyBpcyBhIGxpdHRsZSBsYXJnZXIgdGhhbiB0aGF0IG9mIFdvb2x3b3J0aHMuIE1lYW53aGlsZSwgdGhlIHByaWNlIGRpZmZlcmVuY2VzIGZvciBlYWNoIGNhdGVnb3J5IGRvZXMgbm90IHNlZW0gdmVyeSBzaWduaWZpY2FudC4gICANCg0KSXQgaXMgYWxzbyBub3RhYmxlIHRoYXQgdGhlcmUgYXJlIGEgZmV3IG91dGxpZXJzIGluIHRoZSBib3ggcGxvdC4gSG93ZXZlciwgdGhlcmUgaXMgbm8gZXZpZGVuY2Ugc3VnZ2VzdGluZyB0aGF0IHRoZXkgYXJlIG5vdCB0aGUgYWN0dWFsIHByaWNlcyBkdWUgdG8gZXJyb3JzIHN1Y2ggYXMgdHlwb3Mgb3Igd2Vic2l0ZSBkYXRhYmFzZSBtYWxmdW5jdGlvbmluZzsgYmVzaWRlcywgc2luY2UgdGhlIGFpbSBvZiB0aGlzIHJlcG9ydCBpcyB0byBmaW5kIG91dCB3aGljaCBzdXBlcm1hcmtldCBpcyBjaGVhcGVyLCB3ZSBzaG91bGQgcmVnYXJkIHRoZSBzYW1wbGVkIHByaWNlcyBhcyByZWZsZWN0aW5nIHRoZWlyIHJlYWwgcHJpY2luZyBzdHJhdGVnaWVzLiBIZW5jZSwgdGhlIG91dGxpZXJzIHdpbGwgbm90IGJlIHJlbW92ZWQuDQpgYGB7cn0NCmNvbXBhcmlzb24gJT4lIGJveHBsb3QoUHJpY2UgfiBTdG9yZStDYXRlZ29yeSxkYXRhID0gLiwgbWFpbj0iQm94IFBsb3Qgb2YgUHJvZHVjdCBQcmljZSBieSBDYXRlZ29yeSBhbmQgU3RvcmUiLCB5bGFiPSJQcm9kdWN0IFByaWNlIiwgY29sID0gInNreWJsdWUiLG5hbWVzPWMoIkNsc0Nsb3RoIiwiV3d0Q2xvdGgiLCJDbHNGcmlkZ2UiLCJXd3RGcmlkZ2UiLCJDbHMgSCZCIiwiV3d0SCZCIikpDQpgYGANCg0KIyMgSHlwb3RoZXNpcyBUZXN0DQpEdWUgdG8gdGhlIGZhY3QgdGhhdCBwcm9kdWN0IHByaWNlcyBhcmUgZGV0ZXJtaW5lZCBieSBpbmRpdmlkdWFsIHN1cGVybWFya2V0cywgdGhlIHByb2R1Y3QgcHJpY2VzIG9mIENvbGVzIGFuZCBvZiBXb29sd29ydGhzIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLiBCZXNpZGVzLCB0aGUgZGF0YSBmb3IgYm90aCBzYW1wbGVzIGFyZSBtb3JlIHRoYW4gMzAgd2hpY2ggbWVhbnMgdGhlIGRhdGEgYXJlIGFwcHJveGltYXRlbHkgbm9ybWFsLiBJbiBhZGRpdGlvbiwgYXNzdW1pbmcgY29uZmlkZW5jZSBsZXZlbCBpcyA5NSUgd2hpY2ggpsE9MC4wNSBhbmQgYSBMZXZlbmUncyB0ZXN0IGlzIG5lZWRlZCBmb3IgdGhpcyB0d28tc2FtcGxlIHQtdGVzdCB3aXRoIGFzc3VtcHRpb246IERvIENvbGVzIGFuZCBXb29sd29ydGhzIGhhdmUgZGlmZmVyZW50IGF2ZXJhZ2UgcHJvZHVjdCBwcmljZT8NCkhlcmUgYXJlIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGFuZCBhIGJveHBsb3Qgb2YgcHJvZHVjdCBwcmljZSBkaXN0cmlidXRpb24gb2YgdHdvIHN1cGVybWFya2V0czoNCmBgYHtyfQ0KY29tcGFyaXNvbiAlPiUgZ3JvdXBfYnkoU3RvcmUpICU+JSBzdW1tYXJpc2UoTWluID0gbWluKFByaWNlLG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExID0gcXVhbnRpbGUoUHJpY2UscHJvYnMgPSAuMjUsbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFuID0gbWVkaWFuKFByaWNlLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMyA9IHF1YW50aWxlKFByaWNlLHByb2JzID0gLjc1LG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCA9IG1heChQcmljZSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbihQcmljZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0QgPSBzZChQcmljZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZyA9IHN1bShpcy5uYShQcmljZSkpKQ0KYGBgDQpgYGB7cn0NCmNvbXBhcmlzb24gJT4lIGJveHBsb3QoUHJpY2UgfiBTdG9yZSwgZGF0YSA9IC4sIG1haW49IkJveCBQbG90IG9mIFByb2R1Y3QgUHJpY2UgYnkgU3RvcmUiLCB5bGFiPSJQcm9kdWN0IFByaWNlIiwgY29sID0gInNreWJsdWUiLG5hbWVzPWMoIkNvbGVzIiwiV29vbHdvcnRocyIpKQ0KYGBgDQpJdCBpcyB2ZXJ5IGNsb3NlLCBhbmQgaXQgbG9va3MgbGlrZSBDb2xlcyB0ZW5kcyB0byBoYXZlIGhpZ2hlciBwcm9kdWN0IHByaWNlcy4gVG8gZmluZCBvdXQgd2hldGhlciB0aGUgcHJpY2UgZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudCBlbm91Z2ggdG8ganVkZ2Ugd2hpY2ggc3VwZXJtYXJrcnQgaXMgY2hlYXBlciwgdGhlIHR3by1zYW1wbGUgdC10ZXN0IHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGRpZmZlcmVuY2UgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gDQoNCkFzc3VtcHRpb24gb2YgZXF1YWwgdmFyaWFuY2UgaXMgdGVzdGVkIHVzaW5nIHRoZSBMZXZlbmWhr3MgdGVzdC4gVGhlIExldmVuZaGvcyB0ZXN0IGhhcyB0aGUgZm9sbG93aW5nIHN0YXRpc3RpY2FsIGh5cG90aGVzZXM6DQoNCiQkSDA6ptJfMV4yPabSXzJeMiQkDQokJEhBOqbSXzFeMqHZptIyXjIkJA0Kd2hlcmUgJCSm0l8xXjIkJCBhbmQgJCSm0l8yXjIkJCByZWZlciB0byB0aGUgcG9wdWxhdGlvbiB2YXJpYW5jZXMgb2YgQ29sZXMgYW5kIFdvb2x3b3J0aHMgcmVzcGVjdGl2ZWx5Lg0KYGBge3J9DQpsZXZlbmVUZXN0KFByaWNlIH4gU3RvcmUsIGRhdGEgPSBjb21wYXJpc29uKQ0KYGBgDQpUaGUgcC12YWx1ZSBmb3IgdGhlIExldmVuZSdzIHRlc3Qgb2YgZXF1YWwgdmFyaWFuY2UgZm9yIHByb2R1Y3QgcHJpY2Ugb2YgQ29sZXMgYW5kIFdvb2x3b3J0aHMgd2FzIDAuNDUgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIDAuMDUuIFRoZXJlZm9yZSwgd2UgZmFpbCB0byByZWplY3QgSDAuIEluIG90aGVyIHdvcmRzLCB3ZSBhcmUgc2FmZSB0byBhc3N1bWUgZXF1YWwgdmFyaWFuY2UuDQoNCk5vdyB3ZSBjYW4gdXNlIFIgdG8gcGVyZm9ybSBhIHR3by1zYW1wbGUgdC10ZXN0IGFzc3VtaW5nIGVxdWFsIHZhcmlhbmNlIGFuZCBhIHR3by1zaWRlZCBoeXBvdGhlc2lzIHRlc3QuDQpgYGB7cn0NCnQudGVzdCgNCiAgUHJpY2UgfiBTdG9yZSwNCiAgZGF0YSA9IGNvbXBhcmlzb24sDQogIHZhci5lcXVhbCA9IFRSVUUsDQogIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCINCiAgKQ0KYGBgDQoNClRoZSB0d28tc2FtcGxlIHQtdGVzdCBoYXMgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNhbCBoeXBvdGhlc2VzOg0KSDA6pswxPz8/pswyPTANCkhBOqbMMT8/P6bMMqHZMA0Kd2hlcmUgpswxIGFuZCCmzDIgcmVmZXIgdG8gdGhlIHByaWNlIG1lYW5zIG9mIENvbGVzIGFuZCBXb29sd29ydGhzIHJlc3BlY3RpdmVseS4gVGhlIG51bGwgaHlwb3RoZXNpcyBpcyB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBpbmRlcGVuZGVudCBwcmljZSBtZWFucyBpcyAwLiBJbiBvdGhlciB3b3Jkcywgd2UgYXNzdW1lIHRoZXJlIGlzIG5vIHByaWNlIGRpZmZlcmVuY2UgYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocy4NCg0KIyMgSW50ZXJwcmV0YXRpb24NCg0KQWZ0ZXIgd2UgdXNlIFIgdG8gcGVyZm9ybSBhIHR3by1zYW1wbGUgdC10ZXN0LCB0aGUgcC12YWx1ZSBvZiB0aGUgdHdvLXNhbXBsZSB0LXRlc3QgdGVsbHMgdXMgdGhlIHByb2JhYmlsaXR5IG9mIG9ic2VydmluZyBhIHByb2R1Y3QgcHJpY2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFucyAwLjQ1NiBhbmQgYSBmaWd1cmUgYmlnZ2VyLCBhc3N1bWluZyB0aGUgZGlmZmVyZW5jZSBpcyAwIGluIHRoZSBzYW1wbGUgKGkuZS4gSDAgaXMgdHJ1ZSkuIFRoZSB0d28tdGFpbGVkIHAtdmFsdWUgd2FzIHJlcG9ydGVkIHRvIGJlIDAuNTMuIEFjY29yZGluZyB0byB0aGUgcC12YWx1ZSBtZXRob2QsIGFzIHA9MC41MzIgPiCmwT0wLjA1LCB3ZSBmYWlsIHRvIHJlamVjdCBIMC4gVGhlcmUgaXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lYW5zLg0KDQpUaGUgOTUlIENJIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lYW5zICgwLjQ1Nikgd2FzIHJlcG9ydGVkIGFzIDk1JSBDSSBbLTAuOTggMS45MF0uIEFzIHRoaXMgaW50ZXJ2YWwgY2FwdHVyZXMgSDAsIHdlIGZhaWwgdG8gcmVqZWN0IGl0LiBPbmNlIGFnYWluLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lYW5zLg0KDQpUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiBwcm9kdWN0IHByaWNlIGJldHdlZW4gQ29sZXMgYW5kIFdvb2x3b3J0aHMuIFdlIGNhbiBub3QgZGV0ZXJtaW5lIHdoaWNoIHN1cGVybWFya2V0IGlzIGNoZWFwZXIuDQoNCiMjIERpc2N1c3Npb24gDQoNCkEgdHdvLXNhbXBsZSB0LXRlc3Qgd2FzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFuIHByb2R1Y3QgcHJpY2Ugb2YgQ29sZXMgYW5kIFdvb2x3b3J0aHMuIFRoZSAwLjA1IGxldmVsIG9mIHNpZ25pZmljYW5jZSB3YXMgdXNlZC4gVGhlIHNhbXBsZSdzIG1lYW4gcHJvZHVjdCBwcmljZSBvZiBDb2xlcyBpcyA3LjEwLCBhbmQgdGhhdCBvZiBXb29sd29ydGhzIGlzIDYuNjUuIFRoZSBMZXZlbmUncyB0ZXN0IG9mIGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlIGluZGljYXRlZCB0aGF0IGVxdWFsIHZhcmlhbmNlIGNvdWxkIGJlIGFzc3VtZWQuIFRoZSByZXN1bHRzIG9mIHRoZSB0d28tc2FtcGxlIHQtdGVzdCBhc3N1bWluZyBlcXVhbCB2YXJpYW5jZSBmb3VuZCBubyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYXZlcmFnZSBwcm9kdWN0IHByaWNlIG9mIENvbGVzIGFuZCBXb29sd29ydGhzLCBwPTAuNTMsIDk1JSBDSSBmb3IgdGhlIGRpZmZlcmVuY2UgaW4gbWVhbnMgWy0wLjk4IDEuOTBdLiBUaGUgcmVzdWx0cyBvZiB0aGUgaW52ZXN0aWdhdGlvbiBzdWdnZXN0IHRoYXQgV29vbHdvcnRocyBkb2VzIG5vdCBoYXZlIHNpZ25pZmljYW50bHkgbG93ZXIgbWVhbiBwcm9kdWN0IHByaWNlIHRoYW4gQ29sZXMuDQoNClRoZSBzYW1wbGVzIG9mIHRoaXMgaW52ZXN0aWdhdGlvbiBtZWV0IHRoZSByZXF1aXJlbWVudCBvZiB1c2luZyB0d28tc2FtcGxlIHQtdGVzdCwgYW5kIHRoZSBhaW0gb2YgdGhpcyBpbnZlc3RpZ2F0aW9uIHdhcyBzdWNjZXNzZnVsbHkgZGV0ZXJtaW5lZCBieSBIeXBvdGhlc2lzIFRlc3RpbmcuDQoNCkluIGFkaXRpb24sIHRoZSBsaW1pdGF0aW9uIG9mIHRoaXMgaW52ZXN0aWdhdGlvbiBpcyB0aGUgc2FtcGxlcyBvbmx5IGNvbnRhaW4gMyBjYXRlZ29yaWVzIG9mIHByb2R1Y3RzLiBUaGlzIG1heSBhZmZlY3QgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwcm9kdWN0IHByaWNlLiBOZXh0IHRpbWUgSSB3aWxsIGNvbXBsZXRlIGEgYXNzaWdubWVudCBpbiBhIGdyb3VwLg0K