Group/Individual Details
- Parikshit Sreedhar (s3643796)
- Arjun Balaji (s3629999)
- Ravi Madhurchand Pandey (s3638787)
Executive Statement
Given a choice of the retailer and budget constraint on the customer’s pocket, which retailer would customers prefer to fill their basket with ?
- In working through the context; data on products, brands, unit of measurement and price had been collected from the retailers: Coles and Woolworths
- Products from both retailers were matched with same unit of measurement
- The original prices of the products were sampled
- A test was carried out to determine any statistically significant difference in their product prices
- There seems to be a marginal difference in product prices which does not influence the choice of the retailer
Data collection
How the data was collected ?
Stratified Sampling
Load Packages and Data
library(dplyr)
library(Rcmdr)
setwd("C:\\Users\\Parikshit\\Desktop\\Stats_Assignment_3\\Coles_Woolworths_Prices")
price_war<-read.csv("assign3_final_data_updt.csv")
price_war<-price_war%>%select(2:7)
price_war<-price_war[complete.cases(price_war),]
##Price data for COLES
coles<-price_war%>%select(1:3,5,6)
coles<-mutate(coles,Store="Coles")
names(coles)[3]<-"Price"
##Price data for woolworths
woolworths<-price_war%>%select(1:2,4:6)
woolworths<-mutate(woolworths,Store="Woolworths")
names(woolworths)[3]<-"Price"
##Combining both the data sets
price_war<-rbind(coles,woolworths)
price_war$Price<-round(price_war$Price,2)
price_war$Store<-as.factor(price_war$Store) #coercing the Store column to a factor
Summary Statistics
##Calculating price bucket
attach(price_war)
for(i in 1:dim(price_war)[1])if(Price[i]>=0 & Price[i]<=5){
price_war$price_bucket[i]<-"0-5"}else if(Price[i]>5 & Price[i]<=10){
price_war$price_bucket[i]<-"5-10"}else if(Price[i] >10 & Price[i]<=15){
price_war$price_bucket[i]<-"10-15"
}else if(Price[i] >15 & Price[i] <=20){
price_war$price_bucket[i]<-"15-20"
}else if(Price[i] >20 & Price[i] <=25){
price_war$price_bucket[i]<-"20-25"
}else if(Price[i] >25& Price[i] <=30){
price_war$price_bucket[i]<-"25-30"
}else{price_bucket[i]<-"30+"}
price_war$price_bucket<-factor(price_war$price_bucket,levels=c("0-5","5-10","10-15","15-20","20-25","25-30","30+"),ordered=TRUE)
detach(price_war)
No.of products available at Coles and Woolworths based on Price Bucket
#An additional feature called "price_bucket" was derived from the price variable.
table(price_war$Store,price_war$price_bucket)
0-5 5-10 10-15 15-20 20-25 25-30 30+
Coles 76 23 2 1 1 1 0
Woolworths 74 24 3 1 1 1 0
price_war%>%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)))
##Boxplot of the PRICE variable
boxplot(price_war$Price~price_war$Store,ylab="Product Prices"
,xlab="Retailer"
,main="PRICE WAR\nComparison of product prices between COLES and WOOLWORTHS"
,col="Green")

The above box plot confirms a near to same distribution of product prices in both the stores
##Eventhough we have a large sample, we may want to check if our data comes from a normal distribution
##We shall examine this using a Q-Q plot
coles<-price_war%>%filter(Store=="Coles")
woolworths<-price_war%>%filter(Store=="Woolworths")
coles$Price%>%qqPlot(dist="norm",main="COLES",xlab="Standard Normal Quantiles",ylab="Product Prices")

woolworths$Price%>%qqPlot(dist="norm",main="WOOLWORTHS",xlab="Standard Normal Quantiles",ylab="Product Prices") ##There is a mild departure from normality

Hypothesis Test
- Assumtion: The sample of product prices of COLES and WOOLWORTHS are independent of each other
- The NULL hypothesis is that the mean difference in prices of COLES and WOOLWORTHS is zero
- The alternate hypothesis is that the mean difference in prices of COLES and WOOLWORTHS is NOT zero
- A two sample t-test will be carried out with a confidence level of 95% and significance level of 5%
- We use the p-value approach to interpret the t-test statistic
- Since, there are more than 30 data points in both the samples, we need not assume the population distribution of product prices of COLES and WOOLWORTHS to be normally distributed
Product prices of both COLES and WOOLWORTHS have the same variance. This is also verified using the Levenes test conducted below:-
##Homogeneity of Variance test
leveneTest(Price~Store,data=price_war)
##Performing two sample t-test
t.test(price_war$Price~price_war$Store
,paired=FALSE
,data = price_war
,var.equal=TRUE
,alternative="two.sided")
Interpretation
- The test is not statistically significant
- The p-value is greater than 0.05.
- The probability of observing a difference in product prices as high as the t-test statistic value is greater than the 5% significance level
- The confidence interval houses the null hypothesised value of zero
- There is now insufficient evidence to reject the NULL HYPOTHESIS
Hence the customers need not be weary of their choice of the retailer based on price point of the respective products
Both COLES’ and WOOLWORTHS’ product prices come from the same distribution of prices
Discussion
Findings and Conclusion:
- Both COLES and WOOLWORTHS seems to have similar pricing strategy
- In order to conduct an efficient analysis of this kind, the quantitative variables from both the samples(COLES and WOOLWORTHS in our case) should have the same unit of measurement for the respective products
- The whole analysis hinges on product matching and standardisation of product prices and unit of measurement
- Based on the study conducted, product prices at COLES and WOOLWORTHS have a negligible difference
Limitation - Price Point: Price point is not the only factor having a bearing on the customer’s choice of retailer. There are other factors such as brand spread offered at either of the stores, discounts, loyalty programs, location, etc.. that could influence the buying decision/customer footfalls.
Strengths: The size and equivalence of our respective data points is the core strength for this analysis.
Analysis tweaking: Another way to investigate the problem is to collect in-house products of COLES and WOOLWORTHS respectively and carry out the same analysis.
LS0tDQp0aXRsZTogIk1BVEgxMzI0IEFzc2lnbm1lbnQgMyINCnN1YnRpdGxlOiAiU3VwZXJtYXJrZXQgUHJpY2UgV2FyczogQ29sZXMgdnMgV29vbHdvcnRocyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIEdyb3VwL0luZGl2aWR1YWwgRGV0YWlscw0KDQoqIFBhcmlrc2hpdCBTcmVlZGhhciAoczM2NDM3OTYpDQoqIEFyanVuIEJhbGFqaSAoczM2Mjk5OTkpDQoqIFJhdmkgTWFkaHVyY2hhbmQgUGFuZGV5IChzMzYzODc4NykNCg0KIyMgRXhlY3V0aXZlIFN0YXRlbWVudA0KDQoqKkdpdmVuIGEgY2hvaWNlIG9mIHRoZSByZXRhaWxlciBhbmQgYnVkZ2V0IGNvbnN0cmFpbnQgb24gdGhlIGN1c3RvbWVyJ3MgcG9ja2V0LCB3aGljaCByZXRhaWxlciB3b3VsZCBjdXN0b21lcnMgcHJlZmVyIHRvIGZpbGwgdGhlaXIgYmFza2V0IHdpdGggPyoqDQoNCiogSW4gd29ya2luZyB0aHJvdWdoIHRoZSBjb250ZXh0OyBkYXRhIG9uIHByb2R1Y3RzLCBicmFuZHMsIHVuaXQgb2YgbWVhc3VyZW1lbnQgYW5kIHByaWNlIGhhZCBiZWVuIGNvbGxlY3RlZCBmcm9tIHRoZSByZXRhaWxlcnM6IF9Db2xlc18gYW5kIF9Xb29sd29ydGhzXw0KKiBQcm9kdWN0cyBmcm9tIGJvdGggcmV0YWlsZXJzIHdlcmUgbWF0Y2hlZCB3aXRoIHNhbWUgdW5pdCBvZiBtZWFzdXJlbWVudA0KKiBUaGUgb3JpZ2luYWwgcHJpY2VzIG9mIHRoZSBwcm9kdWN0cyB3ZXJlIHNhbXBsZWQNCiogQSB0ZXN0IHdhcyBjYXJyaWVkIG91dCB0byBkZXRlcm1pbmUgYW55IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGVpciBwcm9kdWN0IHByaWNlcw0KKiBUaGVyZSBzZWVtcyB0byBiZSBhIG1hcmdpbmFsIGRpZmZlcmVuY2UgaW4gcHJvZHVjdCBwcmljZXMgd2hpY2ggZG9lcyBub3QgaW5mbHVlbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIHJldGFpbGVyDQoNCiMjRGF0YSBjb2xsZWN0aW9uDQoqKkhvdyB0aGUgZGF0YSB3YXMgY29sbGVjdGVkID8qKg0KDQpfKipTdHJhdGlmaWVkIFNhbXBsaW5nKipfDQoNCiogV2UgYSB0ZWFtIG9mIDMgcGVvcGxlLCBzdHJvbGxlZCBhY3Jvc3MgdGhlIGFpc2xlcyBhdCAqQ09MRVMqIGFuZCAqV09PTFdPUlRIUyogc3VwZXJtYXJrZXQ7IHJhbmRvbWx5IHNhbXBsZWQgcHJvZHVjdHMgYW5kIG5vdGVkIGRvd24gdGhlaXIgcHJpY2VzLg0KDQoqIFRoZSB2YXJpYWJsZXMgdGhhdCB3ZXJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhcmUgYXMgZm9sbG93czoNCiAgICArICpQcm9kdWN0IE5hbWUqIA0KICAgICsgKkJyYW5kKiANCiAgICArICpDT0xFUyBQcmljZSogDQogICAgKyAqV09PTFdPUlRIUyBQcmljZSogDQogICAgKyAqVU5JVCBPRiBNRUFTVVJFTUVOVCoNCiAgICArICpBaXNsZSoNCiAgICArICpQcmljZV9idWNrZXQqIC0gQWRkaXRpb25hbCB2YXJpYWJsZQ0KDQojIyBMb2FkIFBhY2thZ2VzIGFuZCBEYXRhDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KFJjbWRyKQ0KDQpzZXR3ZCgiQzpcXFVzZXJzXFxQYXJpa3NoaXRcXERlc2t0b3BcXFN0YXRzX0Fzc2lnbm1lbnRfM1xcQ29sZXNfV29vbHdvcnRoc19QcmljZXMiKQ0KcHJpY2Vfd2FyPC1yZWFkLmNzdigiYXNzaWduM19maW5hbF9kYXRhX3VwZHQuY3N2IikNCg0KcHJpY2Vfd2FyPC1wcmljZV93YXIlPiVzZWxlY3QoMjo3KQ0KcHJpY2Vfd2FyPC1wcmljZV93YXJbY29tcGxldGUuY2FzZXMocHJpY2Vfd2FyKSxdDQoNCiMjUHJpY2UgZGF0YSBmb3IgQ09MRVMNCmNvbGVzPC1wcmljZV93YXIlPiVzZWxlY3QoMTozLDUsNikNCmNvbGVzPC1tdXRhdGUoY29sZXMsU3RvcmU9IkNvbGVzIikNCm5hbWVzKGNvbGVzKVszXTwtIlByaWNlIg0KDQojI1ByaWNlIGRhdGEgZm9yIHdvb2x3b3J0aHMNCndvb2x3b3J0aHM8LXByaWNlX3dhciU+JXNlbGVjdCgxOjIsNDo2KQ0Kd29vbHdvcnRoczwtbXV0YXRlKHdvb2x3b3J0aHMsU3RvcmU9Ildvb2x3b3J0aHMiKQ0KbmFtZXMod29vbHdvcnRocylbM108LSJQcmljZSINCg0KIyNDb21iaW5pbmcgYm90aCB0aGUgZGF0YSBzZXRzDQpwcmljZV93YXI8LXJiaW5kKGNvbGVzLHdvb2x3b3J0aHMpDQpwcmljZV93YXIkUHJpY2U8LXJvdW5kKHByaWNlX3dhciRQcmljZSwyKQ0KcHJpY2Vfd2FyJFN0b3JlPC1hcy5mYWN0b3IocHJpY2Vfd2FyJFN0b3JlKSAgICAgICAjY29lcmNpbmcgdGhlIFN0b3JlIGNvbHVtbiB0byBhIGZhY3Rvcg0KYGBgDQojIyBTdW1tYXJ5IFN0YXRpc3RpY3MNCmBgYHtyfQ0KIyNDYWxjdWxhdGluZyB0aGUgcHJpY2UgYnVja2V0DQphdHRhY2gocHJpY2Vfd2FyKQ0KZm9yKGkgaW4gMTpkaW0ocHJpY2Vfd2FyKVsxXSlpZihQcmljZVtpXT49MCAmIFByaWNlW2ldPD01KXsNCiAgcHJpY2Vfd2FyJHByaWNlX2J1Y2tldFtpXTwtIjAtNSJ9ZWxzZSBpZihQcmljZVtpXT41ICYgUHJpY2VbaV08PTEwKXsNCiAgICBwcmljZV93YXIkcHJpY2VfYnVja2V0W2ldPC0iNS0xMCJ9ZWxzZSBpZihQcmljZVtpXSA+MTAgJiBQcmljZVtpXTw9MTUpew0KICAgICAgcHJpY2Vfd2FyJHByaWNlX2J1Y2tldFtpXTwtIjEwLTE1Ig0KfWVsc2UgaWYoUHJpY2VbaV0gPjE1ICYgUHJpY2VbaV0gPD0yMCl7DQogIHByaWNlX3dhciRwcmljZV9idWNrZXRbaV08LSIxNS0yMCINCn1lbHNlIGlmKFByaWNlW2ldID4yMCAmIFByaWNlW2ldIDw9MjUpew0KICBwcmljZV93YXIkcHJpY2VfYnVja2V0W2ldPC0iMjAtMjUiDQp9ZWxzZSBpZihQcmljZVtpXSA+MjUmIFByaWNlW2ldIDw9MzApew0KICBwcmljZV93YXIkcHJpY2VfYnVja2V0W2ldPC0iMjUtMzAiDQp9ZWxzZXtwcmljZV9idWNrZXRbaV08LSIzMCsifQ0KDQpwcmljZV93YXIkcHJpY2VfYnVja2V0PC1mYWN0b3IocHJpY2Vfd2FyJHByaWNlX2J1Y2tldCxsZXZlbHM9YygiMC01IiwiNS0xMCIsIjEwLTE1IiwiMTUtMjAiLCIyMC0yNSIsIjI1LTMwIiwiMzArIiksb3JkZXJlZD1UUlVFKQ0KDQpkZXRhY2gocHJpY2Vfd2FyKQ0KYGBgDQojIyBOby5vZiBwcm9kdWN0cyBhdmFpbGFibGUgYXQgX0NvbGVzXyBhbmQgX1dvb2x3b3J0aHNfIGJhc2VkIG9uIFByaWNlIEJ1Y2tldA0KYGBge3J9DQojQW4gQWRkaXRpb25hbCBmZWF0dXJlIGNhbGxlZCAicHJpY2VfYnVja2V0IiB3YXMgZGVyaXZlZCBmcm9tIHRoZSBwcmljZSB2YXJpYWJsZS4NCnRhYmxlKHByaWNlX3dhciRTdG9yZSxwcmljZV93YXIkcHJpY2VfYnVja2V0KQ0KYGBgDQoNCmBgYHtyfQ0KI1N0b3JlIGxldmVsIHN1bW1hcnkgc3RhdGlzdGljcw0KcHJpY2Vfd2FyJT4lZ3JvdXBfYnkoU3RvcmUpJT4lc3VtbWFyaXNlKE1pbiA9IG1pbihQcmljZSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUTEgPSBxdWFudGlsZShQcmljZSxwcm9icyA9IC4yNSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFuID0gbWVkaWFuKFByaWNlLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUTMgPSBxdWFudGlsZShQcmljZSxwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWF4ID0gbWF4KFByaWNlLG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbihQcmljZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFNEID0gc2QoUHJpY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZyA9IHN1bShpcy5uYShQcmljZSkpKQ0KYGBgDQpgYGB7cn0NCiMjQm94cGxvdCBvZiB0aGUgUFJJQ0UgdmFyaWFibGUNCmJveHBsb3QocHJpY2Vfd2FyJFByaWNlfnByaWNlX3dhciRTdG9yZSx5bGFiPSJQcm9kdWN0IFByaWNlcyINCiAgICAgICAgLHhsYWI9IlJldGFpbGVyIg0KICAgICAgICAsbWFpbj0iUFJJQ0UgV0FSXG5Db21wYXJpc29uIG9mIHByb2R1Y3QgcHJpY2VzIGJldHdlZW4gQ09MRVMgYW5kIFdPT0xXT1JUSFMiDQogICAgICAgICxjb2w9IkdyZWVuIikNCmBgYA0KX1RoZSBhYm92ZSBib3ggcGxvdCBjb25maXJtcyBhIG5lYXIgdG8gc2FtZSBkaXN0cmlidXRpb24gb2YgcHJvZHVjdCBwcmljZXMgaW4gYm90aCB0aGUgc3RvcmVzXw0KYGBge3J9DQojI0V2ZW50aG91Z2ggd2UgaGF2ZSBhIGxhcmdlIHNhbXBsZSwgd2UgbWF5IHdhbnQgdG8gY2hlY2sgaWYgb3VyIGRhdGEgY29tZXMgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24NCiMjV2Ugc2hhbGwgZXhhbWluZSB0aGlzIHVzaW5nIGEgUS1RIHBsb3QNCmNvbGVzPC1wcmljZV93YXIlPiVmaWx0ZXIoU3RvcmU9PSJDb2xlcyIpDQp3b29sd29ydGhzPC1wcmljZV93YXIlPiVmaWx0ZXIoU3RvcmU9PSJXb29sd29ydGhzIikNCmNvbGVzJFByaWNlJT4lcXFQbG90KGRpc3Q9Im5vcm0iLG1haW49IkNPTEVTIix4bGFiPSJTdGFuZGFyZCBOb3JtYWwgUXVhbnRpbGVzIix5bGFiPSJQcm9kdWN0IFByaWNlcyIpDQp3b29sd29ydGhzJFByaWNlJT4lcXFQbG90KGRpc3Q9Im5vcm0iLG1haW49IldPT0xXT1JUSFMiLHhsYWI9IlN0YW5kYXJkIE5vcm1hbCBRdWFudGlsZXMiLHlsYWI9IlByb2R1Y3QgUHJpY2VzIikgIyNUaGVyZSBpcyBhIG1pbGQgZGVwYXJ0dXJlIGZyb20gbm9ybWFsaXR5DQoNCmBgYA0KIyMgSHlwb3RoZXNpcyBUZXN0DQoqICoqQXNzdW10aW9uOioqIFRoZSBzYW1wbGUgb2YgcHJvZHVjdCBwcmljZXMgb2YgX0NPTEVTXyBhbmQgX1dPT0xXT1JUSFNfIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyDQoqIFRoZSBOVUxMIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgbWVhbiBkaWZmZXJlbmNlIGluIHByaWNlcyBvZiBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gaXMgemVybw0KKiBUaGUgYWx0ZXJuYXRlIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgbWVhbiBkaWZmZXJlbmNlIGluIHByaWNlcyBvZiBfQ09MRVNfIGFuZCBXT09MV09SVEhTIGlzIE5PVCB6ZXJvDQoqIEEgdHdvIHNhbXBsZSB0LXRlc3Qgd2lsbCBiZSBjYXJyaWVkIG91dCB3aXRoIGEgY29uZmlkZW5jZSBsZXZlbCBvZiA5NSUgYW5kIHNpZ25pZmljYW5jZSBsZXZlbCBvZiA1JQ0KKiBXZSB1c2UgdGhlIHAtdmFsdWUgYXBwcm9hY2ggdG8gaW50ZXJwcmV0IHRoZSBfdC10ZXN0IHN0YXRpc3RpY18NCiogU2luY2UsIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzAgZGF0YSBwb2ludHMgaW4gYm90aCB0aGUgc2FtcGxlcywgd2UgbmVlZCBub3QgYXNzdW1lIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBwcm9kdWN0IHByaWNlcyBvZiBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gdG8gYmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQNCg0KUHJvZHVjdCBwcmljZXMgb2YgYm90aCBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gaGF2ZSB0aGUgc2FtZSB2YXJpYW5jZS4gVGhpcyBpcyBhbHNvIHZlcmlmaWVkIHVzaW5nIHRoZSBMZXZlbmVzIHRlc3QgY29uZHVjdGVkIGJlbG93Oi0NCmBgYHtyfQ0KIyNIb21vZ2VuZWl0eSBvZiBWYXJpYW5jZSB0ZXN0DQpsZXZlbmVUZXN0KFByaWNlflN0b3JlLGRhdGE9cHJpY2Vfd2FyKQ0KYGBgDQpgYGB7cn0NCiMjUGVyZm9ybWluZyB0d28gc2FtcGxlIHQtdGVzdA0KdC50ZXN0KHByaWNlX3dhciRQcmljZX5wcmljZV93YXIkU3RvcmUNCiAgICAgICAscGFpcmVkPUZBTFNFDQogICAgICAgLGRhdGEgPSBwcmljZV93YXINCiAgICAgICAsdmFyLmVxdWFsPVRSVUUNCiAgICAgICAsYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpDQpgYGANCiMjIEludGVycHJldGF0aW9uDQoqIFRoZSB0ZXN0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50DQogICsgVGhlIHAtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAuMDUuIA0KICArIFRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgYSBkaWZmZXJlbmNlIGluIHByb2R1Y3QgcHJpY2VzIGFzIGhpZ2ggYXMgdGhlIHQtdGVzdCBzdGF0aXN0aWMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSA1JSBzaWduaWZpY2FuY2UgbGV2ZWwNCiAgKyBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbCBob3VzZXMgdGhlIG51bGwgaHlwb3RoZXNpc2VkIHZhbHVlIG9mIHplcm8gDQoqIFRoZXJlIGlzIG5vdyBpbnN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBfTlVMTCBIWVBPVEhFU0lTXyANCg0KXypIZW5jZSB0aGUgY3VzdG9tZXJzIG5lZWQgbm90IGJlIHdlYXJ5IG9mIHRoZWlyIGNob2ljZSBvZiB0aGUgcmV0YWlsZXIgYmFzZWQgb24gcHJpY2UgcG9pbnQgb2YgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdHMqXw0KDQpfKkJvdGggQ09MRVMnIGFuZCBXT09MV09SVEhTJyBwcm9kdWN0IHByaWNlcyBjb21lIGZyb20gdGhlIHNhbWUgZGlzdHJpYnV0aW9uIG9mIHByaWNlcypfDQoNCiMjIERpc2N1c3Npb24NCioqRmluZGluZ3MgYW5kIENvbmNsdXNpb246KioNCg0KKiBCb3RoIF9DT0xFU18gYW5kIF9XT09MV09SVEhTXyBzZWVtcyB0byBoYXZlIHNpbWlsYXIgcHJpY2luZyBzdHJhdGVneQ0KKiBJbiBvcmRlciB0byBjb25kdWN0IGFuIGVmZmljaWVudCBhbmFseXNpcyBvZiB0aGlzIGtpbmQsIHRoZSBxdWFudGl0YXRpdmUgdmFyaWFibGVzIGZyb20gYm90aCB0aGUgc2FtcGxlcyhDT0xFUyBhbmQgV09PTFdPUlRIUyBpbiBvdXIgY2FzZSkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdW5pdCBvZiBtZWFzdXJlbWVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdHMNCiogVGhlIHdob2xlIGFuYWx5c2lzIGhpbmdlcyBvbiBwcm9kdWN0IG1hdGNoaW5nIGFuZCBzdGFuZGFyZGlzYXRpb24gb2YgcHJvZHVjdCBwcmljZXMgYW5kIHVuaXQgb2YgbWVhc3VyZW1lbnQNCiogQmFzZWQgb24gdGhlIHN0dWR5IGNvbmR1Y3RlZCwgcHJvZHVjdCBwcmljZXMgYXQgX0NPTEVTXyBhbmQgX1dPT0xXT1JUSFNfIGhhdmUgYSBuZWdsaWdpYmxlDQpkaWZmZXJlbmNlDQoNCipMaW1pdGF0aW9uIC0gUHJpY2UgUG9pbnQ6KiBQcmljZSBwb2ludCBpcyBub3QgdGhlIG9ubHkgZmFjdG9yIGhhdmluZyBhIGJlYXJpbmcgb24gdGhlIGN1c3RvbWVyJ3MgY2hvaWNlIG9mIHJldGFpbGVyLiBUaGVyZSBhcmUgb3RoZXIgZmFjdG9ycyBzdWNoIGFzIGJyYW5kIHNwcmVhZCBvZmZlcmVkIGF0IGVpdGhlciBvZiB0aGUgc3RvcmVzLCBkaXNjb3VudHMsIGxveWFsdHkgcHJvZ3JhbXMsIGxvY2F0aW9uLCBldGMuLiB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGUgYnV5aW5nIGRlY2lzaW9uL2N1c3RvbWVyIGZvb3RmYWxscy4NCg0KKlN0cmVuZ3RoczoqIFRoZSBzaXplIGFuZCBlcXVpdmFsZW5jZSBvZiBvdXIgcmVzcGVjdGl2ZSBkYXRhIHBvaW50cyBpcyB0aGUgY29yZSBzdHJlbmd0aCBmb3IgdGhpcyBhbmFseXNpcy4NCg0KKkFuYWx5c2lzIHR3ZWFraW5nOiogQW5vdGhlciB3YXkgdG8gaW52ZXN0aWdhdGUgdGhlIHByb2JsZW0gaXMgdG8gY29sbGVjdCBpbi1ob3VzZSBwcm9kdWN0cyBvZiBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gcmVzcGVjdGl2ZWx5IGFuZCBjYXJyeSBvdXQgdGhlIHNhbWUgYW5hbHlzaXMu