1 Original Report Summary

This report examines and expands on Yiping Su’s Project 2, which investigated how customer ratings vary across different product lines. Understanding these differences can help identify areas for improvement and inform strategies in marketing and product development. In my analysis, I aim to replicate and build upon Su’s original research question by incorporating both visualizations and statistical tests to reassess the conclusions.

2 Initial Data Analysis (IDA)

The dataset, sourced from @kaggle_supermarket_sales, includes 1,000 transactions from three supermarket branches over three months (January to March 2019). It contains details on customer demographics, transaction amounts, and customer satisfaction ratings. For this report, I will only keep the Ratings and Product.line columns, as they are directly relevant to the analysis.

2.1 Libraries

#Load all libraries 
library(tidyverse)
library(knitr)
library(ggridges)

2.2 Initalizing Dataset

# Import dataset
sales_data <- read.csv("~/Documents/MATH1115/Project 2/Supermarket Sales Data.csv")

2.2.1 Data Cleaning:

# Keep only the 'Rating' and 'Product.line' columns in sales_data
sales_data_clean <- sales_data[, c("Rating", "Product.line")]

3 Data Exploration:

3.1 Research Question:

How does customer satisfaction differ across product lines?

3.2 Distribution of Ratings:

To understand customer satisfaction across different product lines, I used a ridge plot to visualize the distribution of ratings across each category. This plot provides insight into where customer satisfaction is concentrated as the plot shows the distribution of ratings for each product line. This helps to not only see the average rating but also whether certain product lines tend to receive higher or lower ratings overall.

# Ridge plot of customer ratings by product line
ggplot(sales_data_clean, aes(x = Rating, y = Product.line, fill = Product.line)) +
  geom_density_ridges(scale = 0.9, alpha = 0.6) +
  labs(
    title = "Customer Ratings Distribution by Product Line",
    x = "Rating",
    y = "Product Line"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

3.3 Findings from rating distribution:

Each curve represents a product line and shows where customer ratings are concentrated, providing insights into the shape and spread of ratings across categories.

  • Ratings for Sports and Travel and Food and Beverages are concentrated towards the higher end of the scale, suggesting typically positive customer satisfaction.

  • Home and Lifestyle have a more even spread of ratings, indicating mixed customer experiences.

  • Health and Beauty and Electronic Accessories show a wide spread, with slight peaks at higher ratings.

These trends suggest that certain product lines may have more variation in ratings than others. Next, I will use statistical tests to determine if these visual differences are significant.

3.4 Visualization: Customer Ratings by product line

While the ridge plot highlights the distribution of ratings, examining average satisfaction levels can also provide valuable insight. By plotting the mean ratings with a bar plot, direct comparison of satisfaction levels across product lines is simplified.

# Calculate mean and standard error for each product line
summary_stats <- sales_data_clean %>%
  group_by(Product.line) %>%
  summarize(
    mean_rating = mean(Rating),
    se = sd(Rating) / sqrt(n())
  )
# Create the improved bar plot with enhanced error bars
ggplot(summary_stats, aes(x = Product.line, y = mean_rating, fill = Product.line)) +
  geom_bar(stat = "identity", color = "black") +
  geom_errorbar(aes(ymin = mean_rating - se, ymax = mean_rating + se), 
                width = 0.2, size = 0.8, color = "black") +  # Increase width, size, and set color
  geom_text(aes(label = round(mean_rating, 2)), vjust = -1, size = 3.5, color = "black") +
  scale_fill_brewer(palette = "Set3") +  # Use a color palette
  labs(
    title = "Average Customer Ratings by Product Line",
    x = "Product Line",
    y = "Mean Customer Rating"
  ) +
  ylim(0, 7.5) +  # Adjust y-axis range to focus on relevant data range
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    plot.title = element_text(size = 14, face = "bold"),
    legend.position = "none"  # Remove legend if not needed
  )

This bar plot shows the average customer ratings for each product line, with error bars representing the standard error.

  • “Health and Beauty” and “Food and Beverages” tend to have slightly higher average ratings

  • “Home and Lifestyle” shows a lower average.

However, to confirm if these differences are meaningful, I conducted statistical tests.

3.5 Hypothesis Testing: Differences in customer rating across product line

To assess whether the differences in average ratings across product lines are statistically significant, I conducted an ANOVA test.

anova_result <- aov(Rating ~ Product.line, data = sales_data_clean)
summary(anova_result)
##               Df Sum Sq Mean Sq F value Pr(>F)
## Product.line   5      8   1.598    0.54  0.746
## Residuals    994   2943   2.960

An ANOVA test was conducted to confirm the visual findings. The results, with a p-value of 0.746, indicated no statistically significant differences in customer ratings across product lines.

3.6 Tukey Post-Hoc Test (for pairwise comparisons):

# Tukey post-hoc test
tukey_result <- TukeyHSD(anova_result)
print(tukey_result)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Rating ~ Product.line, data = sales_data_clean)
## 
## $Product.line
##                                                    diff        lwr       upr
## Fashion accessories-Electronic accessories  0.104507601 -0.4223276 0.6313428
## Food and beverages-Electronic accessories   0.188512508 -0.3412726 0.7182976
## Health and beauty-Electronic accessories    0.078583591 -0.4698213 0.6269885
## Home and lifestyle-Electronic accessories  -0.087205882 -0.6283241 0.4539123
## Sports and travel-Electronic accessories   -0.008440822 -0.5444976 0.5276159
## Food and beverages-Fashion accessories      0.084004908 -0.4397237 0.6077336
## Health and beauty-Fashion accessories      -0.025924009 -0.5684803 0.5166323
## Home and lifestyle-Fashion accessories     -0.191713483 -0.7269035 0.3434765
## Sports and travel-Fashion accessories      -0.112948423 -0.6430203 0.4171235
## Health and beauty-Food and beverages       -0.109928917 -0.6553501 0.4354923
## Home and lifestyle-Food and beverages      -0.275718391 -0.8138125 0.2623757
## Sports and travel-Food and beverages       -0.196953331 -0.7299573 0.3360506
## Home and lifestyle-Health and beauty       -0.165789474 -0.7222254 0.3906464
## Sports and travel-Health and beauty        -0.087024413 -0.6385394 0.4644906
## Sports and travel-Home and lifestyle        0.078765060 -0.4655049 0.6230350
##                                                p adj
## Fashion accessories-Electronic accessories 0.9931366
## Food and beverages-Electronic accessories  0.9126782
## Health and beauty-Electronic accessories   0.9985315
## Home and lifestyle-Electronic accessories  0.9974214
## Sports and travel-Electronic accessories   1.0000000
## Food and beverages-Fashion accessories     0.9974789
## Health and beauty-Fashion accessories      0.9999934
## Home and lifestyle-Fashion accessories     0.9103561
## Sports and travel-Fashion accessories      0.9904450
## Health and beauty-Food and beverages       0.9926104
## Home and lifestyle-Food and beverages      0.6879939
## Sports and travel-Food and beverages       0.8988551
## Home and lifestyle-Health and beauty       0.9577532
## Sports and travel-Health and beauty        0.9976685
## Sports and travel-Home and lifestyle       0.9984600

A Tukey’s HSD test was conducted to compare each pair of product lines. None of the comparisons showed significant p-values, confirming there are no significant differences in customer ratings between any pair of product lines.

4 Key Insights:

Based on this analysis, customer ratings do not vary significantly across different product lines.

5 Conclusion

In this analysis, I revisited the research question, “How do customer ratings vary across different product lines?” posed in Yiping Su’s Project 2. In comparison to Su’s approach, which relied on a boxplot for visual analysis, my analysis incorporated statistical tests (ANOVA and Tukey’s HSD) to validate whether observed differences in ratings were statistically significant.

Su concluded that Health and Beauty and Fashion and Accessories had the highest customer ratings, which somewhat aligns with results from my visualizations. However, my analysis reveals that these differences are not statistically significant. The ANOVA test yielded a high p-value (0.746), indicating no meaningful variation in satisfaction across product lines. The Tukey’s HSD test further confirmed this by showing no significant differences in any pairwise comparisons between product lines.

These findings suggest that customer satisfaction is generally consistent across all product lines, contrasting with Su’s initial interpretation. The additional statistical tests in this report provide a more reliable basis for concluding that customer satisfaction does not significantly vary across categories. As a result, a uniform approach to enhancing customer satisfaction may be more appropriate than focusing on specific product categories.

LS0tCnRpdGxlOiAiUHJvamVjdCAyOiBJbnRlcnJvZ2F0aW9uIgphdXRob3I6ICI1MzA1MDYzNjgiCnN1YnRpdGxlOiAiTUFUSDExMTUgUHJvamVjdCAyOiBJbnRlcnJvZ2F0aW9uIgpkYXRlOiAiVW5pdmVyc2l0eSBvZiBTeWRuZXkgfCBNQVRIMTExNSB8IExBQiBGMDcuMDMuMzUzIHwgV2VkIDExOjAwIHwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlWScpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlICAjIGRvbid0IGNoYW5nZSB0aGlzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlICMgZW1iZWQgLlJtZCBmaWxlCiAgICB0b2M6IHRydWUgICMgdGFibGUgb2YgY29udGVudHMKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlICMgdG9jIGlzIGFsd2F5cyB2aXNpYmxlIHdoZW4gc2Nyb2xsZWQKICAgIG51bWJlcl9zZWN0aW9uOiB0cnVlICMgYWRkIHNlY3Rpb24gbnVtYmVycyB0byBoZWFkaW5ncwogICAgdGhlbWU6CiAgICAgIGJvb3Rzd2F0Y2g6ICJzaW1wbGV4IiAjIGNoZWNrIGh0dHBzOi8vYm9vdHN3YXRjaC5jb20vIAogICAgICBiYXNlX2ZvbnQ6CiAgICAgICAgZ29vZ2xlOiBQcm9tcHQgIyBzZWxlY3QgYW55IEdvb2dsZSBGb250CiAgICAgIGhlYWRpbmdfZm9udDoKICAgICAgICBnb29nbGU6IFByb3phIExpYnJlICMgc2VsZWN0IGFueSBHb29nbGUgRm9udAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQppZiAocmVxdWlyZU5hbWVzcGFjZSgidGhlbWF0aWMiKSkgCiAgdGhlbWF0aWM6OnRoZW1hdGljX3JtZChmb250ID0gImF1dG8iKQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5zaG93dGV4dCA9IFRSVUUpCmBgYAoKIyBPcmlnaW5hbCBSZXBvcnQgU3VtbWFyeQoKVGhpcyByZXBvcnQgZXhhbWluZXMgYW5kIGV4cGFuZHMgb24gWWlwaW5nIFN1J3MgUHJvamVjdCAyLCB3aGljaCBpbnZlc3RpZ2F0ZWQgaG93IGN1c3RvbWVyIHJhdGluZ3MgdmFyeSBhY3Jvc3MgZGlmZmVyZW50IHByb2R1Y3QgbGluZXMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgZGlmZmVyZW5jZXMgY2FuIGhlbHAgaWRlbnRpZnkgYXJlYXMgZm9yIGltcHJvdmVtZW50IGFuZCBpbmZvcm0gc3RyYXRlZ2llcyBpbiBtYXJrZXRpbmcgYW5kIHByb2R1Y3QgZGV2ZWxvcG1lbnQuIEluIG15IGFuYWx5c2lzLCBJIGFpbSB0byByZXBsaWNhdGUgYW5kIGJ1aWxkIHVwb24gU3UncyBvcmlnaW5hbCByZXNlYXJjaCBxdWVzdGlvbiBieSBpbmNvcnBvcmF0aW5nIGJvdGggdmlzdWFsaXphdGlvbnMgYW5kIHN0YXRpc3RpY2FsIHRlc3RzIHRvIHJlYXNzZXNzIHRoZSBjb25jbHVzaW9ucy4KCiMgSW5pdGlhbCBEYXRhIEFuYWx5c2lzIChJREEpCgpUaGUgZGF0YXNldCwgc291cmNlZCBmcm9tIEBrYWdnbGVfc3VwZXJtYXJrZXRfc2FsZXMsIGluY2x1ZGVzIDEsMDAwIHRyYW5zYWN0aW9ucyBmcm9tIHRocmVlIHN1cGVybWFya2V0IGJyYW5jaGVzIG92ZXIgdGhyZWUgbW9udGhzIChKYW51YXJ5IHRvIE1hcmNoIDIwMTkpLiBJdCBjb250YWlucyBkZXRhaWxzIG9uICoqY3VzdG9tZXIgZGVtb2dyYXBoaWNzKiosICoqdHJhbnNhY3Rpb24gYW1vdW50cyoqLCBhbmQgKipjdXN0b21lciBzYXRpc2ZhY3Rpb24gcmF0aW5ncyoqLiBGb3IgdGhpcyByZXBvcnQsIEkgd2lsbCBvbmx5IGtlZXAgdGhlICoqUmF0aW5ncyoqIGFuZCAqKlByb2R1Y3QubGluZSoqIGNvbHVtbnMsIGFzIHRoZXkgYXJlIGRpcmVjdGx5IHJlbGV2YW50IHRvIHRoZSBhbmFseXNpcy4KCiMjIExpYnJhcmllcwoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CiNMb2FkIGFsbCBsaWJyYXJpZXMgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncmlkZ2VzKQpgYGAKCiMjIEluaXRhbGl6aW5nIERhdGFzZXQKCmBgYHtyfQojIEltcG9ydCBkYXRhc2V0CnNhbGVzX2RhdGEgPC0gcmVhZC5jc3YoIn4vRG9jdW1lbnRzL01BVEgxMTE1L1Byb2plY3QgMi9TdXBlcm1hcmtldCBTYWxlcyBEYXRhLmNzdiIpCmBgYAoKIyMjIERhdGEgQ2xlYW5pbmc6CgpgYGB7cn0KIyBLZWVwIG9ubHkgdGhlICdSYXRpbmcnIGFuZCAnUHJvZHVjdC5saW5lJyBjb2x1bW5zIGluIHNhbGVzX2RhdGEKc2FsZXNfZGF0YV9jbGVhbiA8LSBzYWxlc19kYXRhWywgYygiUmF0aW5nIiwgIlByb2R1Y3QubGluZSIpXQpgYGAKCiMgRGF0YSBFeHBsb3JhdGlvbjoKCiMjIFJlc2VhcmNoIFF1ZXN0aW9uOgoKKkhvdyBkb2VzIGN1c3RvbWVyIHNhdGlzZmFjdGlvbiBkaWZmZXIgYWNyb3NzIHByb2R1Y3QgbGluZXM/KgoKIyMgRGlzdHJpYnV0aW9uIG9mIFJhdGluZ3M6CgpUbyB1bmRlcnN0YW5kIGN1c3RvbWVyIHNhdGlzZmFjdGlvbiBhY3Jvc3MgZGlmZmVyZW50IHByb2R1Y3QgbGluZXMsIEkgdXNlZCBhIHJpZGdlIHBsb3QgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb24gb2YgcmF0aW5ncyBhY3Jvc3MgZWFjaCBjYXRlZ29yeS4gVGhpcyBwbG90IHByb3ZpZGVzIGluc2lnaHQgaW50byB3aGVyZSBjdXN0b21lciBzYXRpc2ZhY3Rpb24gaXMgY29uY2VudHJhdGVkIGFzIHRoZSBwbG90IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgcmF0aW5ncyBmb3IgZWFjaCBwcm9kdWN0IGxpbmUuIFRoaXMgaGVscHMgdG8gbm90IG9ubHkgc2VlIHRoZSBhdmVyYWdlIHJhdGluZyBidXQgYWxzbyB3aGV0aGVyIGNlcnRhaW4gcHJvZHVjdCBsaW5lcyB0ZW5kIHRvIHJlY2VpdmUgaGlnaGVyIG9yIGxvd2VyIHJhdGluZ3Mgb3ZlcmFsbC4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgUmlkZ2UgcGxvdCBvZiBjdXN0b21lciByYXRpbmdzIGJ5IHByb2R1Y3QgbGluZQpnZ3Bsb3Qoc2FsZXNfZGF0YV9jbGVhbiwgYWVzKHggPSBSYXRpbmcsIHkgPSBQcm9kdWN0LmxpbmUsIGZpbGwgPSBQcm9kdWN0LmxpbmUpKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhzY2FsZSA9IDAuOSwgYWxwaGEgPSAwLjYpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQ3VzdG9tZXIgUmF0aW5ncyBEaXN0cmlidXRpb24gYnkgUHJvZHVjdCBMaW5lIiwKICAgIHggPSAiUmF0aW5nIiwKICAgIHkgPSAiUHJvZHVjdCBMaW5lIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCiMjIEZpbmRpbmdzIGZyb20gcmF0aW5nIGRpc3RyaWJ1dGlvbjoKCkVhY2ggY3VydmUgcmVwcmVzZW50cyBhIHByb2R1Y3QgbGluZSBhbmQgc2hvd3Mgd2hlcmUgY3VzdG9tZXIgcmF0aW5ncyBhcmUgY29uY2VudHJhdGVkLCBwcm92aWRpbmcgaW5zaWdodHMgaW50byB0aGUgc2hhcGUgYW5kIHNwcmVhZCBvZiByYXRpbmdzIGFjcm9zcyBjYXRlZ29yaWVzLgoKLSAgIFJhdGluZ3MgZm9yICoqU3BvcnRzIGFuZCBUcmF2ZWwqKiBhbmQgKipGb29kIGFuZCBCZXZlcmFnZXMqKiBhcmUgY29uY2VudHJhdGVkIHRvd2FyZHMgdGhlIGhpZ2hlciBlbmQgb2YgdGhlIHNjYWxlLCBzdWdnZXN0aW5nIHR5cGljYWxseSBwb3NpdGl2ZSBjdXN0b21lciBzYXRpc2ZhY3Rpb24uCgotICAgKipIb21lIGFuZCBMaWZlc3R5bGUqKiBoYXZlIGEgbW9yZSBldmVuIHNwcmVhZCBvZiByYXRpbmdzLCBpbmRpY2F0aW5nIG1peGVkIGN1c3RvbWVyIGV4cGVyaWVuY2VzLgoKLSAgICoqSGVhbHRoIGFuZCBCZWF1dHkqKiBhbmQgKipFbGVjdHJvbmljIEFjY2Vzc29yaWVzKiogc2hvdyBhIHdpZGUgc3ByZWFkLCB3aXRoIHNsaWdodCBwZWFrcyBhdCBoaWdoZXIgcmF0aW5ncy4KClRoZXNlIHRyZW5kcyBzdWdnZXN0IHRoYXQgY2VydGFpbiBwcm9kdWN0IGxpbmVzIG1heSBoYXZlIG1vcmUgdmFyaWF0aW9uIGluIHJhdGluZ3MgdGhhbiBvdGhlcnMuIE5leHQsIEkgd2lsbCB1c2Ugc3RhdGlzdGljYWwgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXNlIHZpc3VhbCBkaWZmZXJlbmNlcyBhcmUgc2lnbmlmaWNhbnQuCgojIyBWaXN1YWxpemF0aW9uOiBDdXN0b21lciBSYXRpbmdzIGJ5IHByb2R1Y3QgbGluZQoKV2hpbGUgdGhlIHJpZGdlIHBsb3QgaGlnaGxpZ2h0cyB0aGUgZGlzdHJpYnV0aW9uIG9mIHJhdGluZ3MsIGV4YW1pbmluZyBhdmVyYWdlIHNhdGlzZmFjdGlvbiBsZXZlbHMgY2FuIGFsc28gcHJvdmlkZSB2YWx1YWJsZSBpbnNpZ2h0LiBCeSBwbG90dGluZyB0aGUgbWVhbiByYXRpbmdzIHdpdGggYSBiYXIgcGxvdCwgZGlyZWN0IGNvbXBhcmlzb24gb2Ygc2F0aXNmYWN0aW9uIGxldmVscyBhY3Jvc3MgcHJvZHVjdCBsaW5lcyBpcyBzaW1wbGlmaWVkLgoKYGBge3J9CiMgQ2FsY3VsYXRlIG1lYW4gYW5kIHN0YW5kYXJkIGVycm9yIGZvciBlYWNoIHByb2R1Y3QgbGluZQpzdW1tYXJ5X3N0YXRzIDwtIHNhbGVzX2RhdGFfY2xlYW4gJT4lCiAgZ3JvdXBfYnkoUHJvZHVjdC5saW5lKSAlPiUKICBzdW1tYXJpemUoCiAgICBtZWFuX3JhdGluZyA9IG1lYW4oUmF0aW5nKSwKICAgIHNlID0gc2QoUmF0aW5nKSAvIHNxcnQobigpKQogICkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIENyZWF0ZSB0aGUgaW1wcm92ZWQgYmFyIHBsb3Qgd2l0aCBlbmhhbmNlZCBlcnJvciBiYXJzCmdncGxvdChzdW1tYXJ5X3N0YXRzLCBhZXMoeCA9IFByb2R1Y3QubGluZSwgeSA9IG1lYW5fcmF0aW5nLCBmaWxsID0gUHJvZHVjdC5saW5lKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl9yYXRpbmcgLSBzZSwgeW1heCA9IG1lYW5fcmF0aW5nICsgc2UpLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBzaXplID0gMC44LCBjb2xvciA9ICJibGFjayIpICsgICMgSW5jcmVhc2Ugd2lkdGgsIHNpemUsIGFuZCBzZXQgY29sb3IKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobWVhbl9yYXRpbmcsIDIpKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKyAgIyBVc2UgYSBjb2xvciBwYWxldHRlCiAgbGFicygKICAgIHRpdGxlID0gIkF2ZXJhZ2UgQ3VzdG9tZXIgUmF0aW5ncyBieSBQcm9kdWN0IExpbmUiLAogICAgeCA9ICJQcm9kdWN0IExpbmUiLAogICAgeSA9ICJNZWFuIEN1c3RvbWVyIFJhdGluZyIKICApICsKICB5bGltKDAsIDcuNSkgKyAgIyBBZGp1c3QgeS1heGlzIHJhbmdlIHRvIGZvY3VzIG9uIHJlbGV2YW50IGRhdGEgcmFuZ2UKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTApLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiAgIyBSZW1vdmUgbGVnZW5kIGlmIG5vdCBuZWVkZWQKICApCgpgYGAKClRoaXMgYmFyIHBsb3Qgc2hvd3MgdGhlIGF2ZXJhZ2UgY3VzdG9tZXIgcmF0aW5ncyBmb3IgZWFjaCBwcm9kdWN0IGxpbmUsIHdpdGggZXJyb3IgYmFycyByZXByZXNlbnRpbmcgdGhlIHN0YW5kYXJkIGVycm9yLgoKLSAgICJIZWFsdGggYW5kIEJlYXV0eSIgYW5kICJGb29kIGFuZCBCZXZlcmFnZXMiIHRlbmQgdG8gaGF2ZSBzbGlnaHRseSBoaWdoZXIgYXZlcmFnZSByYXRpbmdzCgotICAgIkhvbWUgYW5kIExpZmVzdHlsZSIgc2hvd3MgYSBsb3dlciBhdmVyYWdlLgoKSG93ZXZlciwgdG8gY29uZmlybSBpZiB0aGVzZSBkaWZmZXJlbmNlcyBhcmUgbWVhbmluZ2Z1bCwgSSBjb25kdWN0ZWQgc3RhdGlzdGljYWwgdGVzdHMuCgojIyBIeXBvdGhlc2lzIFRlc3Rpbmc6IERpZmZlcmVuY2VzIGluIGN1c3RvbWVyIHJhdGluZyBhY3Jvc3MgcHJvZHVjdCBsaW5lCgpUbyBhc3Nlc3Mgd2hldGhlciB0aGUgZGlmZmVyZW5jZXMgaW4gYXZlcmFnZSByYXRpbmdzIGFjcm9zcyBwcm9kdWN0IGxpbmVzIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBJIGNvbmR1Y3RlZCBhbiBBTk9WQSB0ZXN0LgoKYGBge3J9CmFub3ZhX3Jlc3VsdCA8LSBhb3YoUmF0aW5nIH4gUHJvZHVjdC5saW5lLCBkYXRhID0gc2FsZXNfZGF0YV9jbGVhbikKc3VtbWFyeShhbm92YV9yZXN1bHQpCmBgYAoKQW4gKipBTk9WQSB0ZXN0Kiogd2FzIGNvbmR1Y3RlZCB0byBjb25maXJtIHRoZSB2aXN1YWwgZmluZGluZ3MuIFRoZSByZXN1bHRzLCB3aXRoIGEgKipwLXZhbHVlIG9mIDAuNzQ2KiosIGluZGljYXRlZCBubyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIGN1c3RvbWVyIHJhdGluZ3MgYWNyb3NzIHByb2R1Y3QgbGluZXMuCgojIyBUdWtleSBQb3N0LUhvYyBUZXN0IChmb3IgcGFpcndpc2UgY29tcGFyaXNvbnMpOgoKYGBge3J9CiMgVHVrZXkgcG9zdC1ob2MgdGVzdAp0dWtleV9yZXN1bHQgPC0gVHVrZXlIU0QoYW5vdmFfcmVzdWx0KQpwcmludCh0dWtleV9yZXN1bHQpCmBgYAoKQSBUdWtleSdzIEhTRCB0ZXN0IHdhcyBjb25kdWN0ZWQgdG8gY29tcGFyZSBlYWNoIHBhaXIgb2YgcHJvZHVjdCBsaW5lcy4gTm9uZSBvZiB0aGUgY29tcGFyaXNvbnMgc2hvd2VkIHNpZ25pZmljYW50IHAtdmFsdWVzLCBjb25maXJtaW5nIHRoZXJlIGFyZSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiBjdXN0b21lciByYXRpbmdzIGJldHdlZW4gYW55IHBhaXIgb2YgcHJvZHVjdCBsaW5lcy4KCiMgS2V5IEluc2lnaHRzOgoKQmFzZWQgb24gdGhpcyBhbmFseXNpcywgY3VzdG9tZXIgcmF0aW5ncyBkbyBub3QgdmFyeSBzaWduaWZpY2FudGx5IGFjcm9zcyBkaWZmZXJlbnQgcHJvZHVjdCBsaW5lcy4KCiMgQ29uY2x1c2lvbgoKSW4gdGhpcyBhbmFseXNpcywgSSByZXZpc2l0ZWQgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uLCAiSG93IGRvIGN1c3RvbWVyIHJhdGluZ3MgdmFyeSBhY3Jvc3MgZGlmZmVyZW50IHByb2R1Y3QgbGluZXM/IiBwb3NlZCBpbiBZaXBpbmcgU3UncyBQcm9qZWN0IDIuIEluIGNvbXBhcmlzb24gdG8gU3UncyBhcHByb2FjaCwgd2hpY2ggcmVsaWVkIG9uIGEgYm94cGxvdCBmb3IgdmlzdWFsIGFuYWx5c2lzLCBteSBhbmFseXNpcyBpbmNvcnBvcmF0ZWQgc3RhdGlzdGljYWwgdGVzdHMgKEFOT1ZBIGFuZCBUdWtleSdzIEhTRCkgdG8gdmFsaWRhdGUgd2hldGhlciBvYnNlcnZlZCBkaWZmZXJlbmNlcyBpbiByYXRpbmdzIHdlcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KClN1IGNvbmNsdWRlZCB0aGF0IEhlYWx0aCBhbmQgQmVhdXR5IGFuZCBGYXNoaW9uIGFuZCBBY2Nlc3NvcmllcyBoYWQgdGhlIGhpZ2hlc3QgY3VzdG9tZXIgcmF0aW5ncywgd2hpY2ggc29tZXdoYXQgYWxpZ25zIHdpdGggcmVzdWx0cyBmcm9tIG15IHZpc3VhbGl6YXRpb25zLiBIb3dldmVyLCBteSBhbmFseXNpcyByZXZlYWxzIHRoYXQgdGhlc2UgZGlmZmVyZW5jZXMgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBUaGUgQU5PVkEgdGVzdCB5aWVsZGVkIGEgaGlnaCBwLXZhbHVlICgwLjc0NiksIGluZGljYXRpbmcgbm8gbWVhbmluZ2Z1bCB2YXJpYXRpb24gaW4gc2F0aXNmYWN0aW9uIGFjcm9zcyBwcm9kdWN0IGxpbmVzLiBUaGUgVHVrZXkncyBIU0QgdGVzdCBmdXJ0aGVyIGNvbmZpcm1lZCB0aGlzIGJ5IHNob3dpbmcgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gYW55IHBhaXJ3aXNlIGNvbXBhcmlzb25zIGJldHdlZW4gcHJvZHVjdCBsaW5lcy4KClRoZXNlIGZpbmRpbmdzIHN1Z2dlc3QgdGhhdCBjdXN0b21lciBzYXRpc2ZhY3Rpb24gaXMgZ2VuZXJhbGx5IGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBwcm9kdWN0IGxpbmVzLCBjb250cmFzdGluZyB3aXRoIFN1J3MgaW5pdGlhbCBpbnRlcnByZXRhdGlvbi4gVGhlIGFkZGl0aW9uYWwgc3RhdGlzdGljYWwgdGVzdHMgaW4gdGhpcyByZXBvcnQgcHJvdmlkZSBhIG1vcmUgcmVsaWFibGUgYmFzaXMgZm9yIGNvbmNsdWRpbmcgdGhhdCBjdXN0b21lciBzYXRpc2ZhY3Rpb24gZG9lcyBub3Qgc2lnbmlmaWNhbnRseSB2YXJ5IGFjcm9zcyBjYXRlZ29yaWVzLiBBcyBhIHJlc3VsdCwgYSB1bmlmb3JtIGFwcHJvYWNoIHRvIGVuaGFuY2luZyBjdXN0b21lciBzYXRpc2ZhY3Rpb24gbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUgdGhhbiBmb2N1c2luZyBvbiBzcGVjaWZpYyBwcm9kdWN0IGNhdGVnb3JpZXMuCg==