1 Introduction

This research will investigate the differences between a standard and bootstrap simple linear regression approaches. We will aim to determine which method is most ideal for future research.

2 Data Set

The data set of interest contains detailed information on various environmental and soil factors that influence plant growth. It includes measurements of soil contents, environmental factors, and the plant yield. Information is provided for many kinds of fruit, but for this analysis, only strawberry data will be used. Data was recorded throughout the plant growth period and during harvest.

The data set was acquired from Kaggle courtesy of user Masha Sanaei. The link for the dataset is https://www.kaggle.com/datasets/snmahsa/soil-nutrients. The dataset was uploaded to a github repository for access as https://github.com/ncbrechbill/STA321/blob/main/STA321/Soil%20Nutrients.csv.

  • Name; character: The plant name. This dataset was pruned for only Strawberry data
  • Temperature (\(X_1\)); numeric: The average recorded air temperature in celcius
  • Rainfall(\(X_2\)); numeric: The total recorded rainfall in centimeters
  • pH(\(X_3\)); numeric: The average recoded soil pH
  • Nitrogen(\(X_4\)); numeric: Average soil Nitrogen content in parts per million (ppm)
  • Phosphorus(\(X_5\)); numeric: Average soil phosphorus content in ppm
  • Potassium (\(X_6\)); numeric: Average soil Potassium content in ppm
  • Light_Hours (\(X_7\)); numeric: Average hours of sunlight covering the plant each day
  • Yield (\(Y\)); numeric: The mass of harvested strawberries in grams

This data set contains 700 strawberry plant observations, all with complete data and no missing values. This set is sufficiently large to make accurate predictions for any number of these predictors. There are additional categorical variables that group ranges of these variables together. However, these will not be used under this analysis methodology.

3 Exploratory Data Analysis

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

The pairwise scatter plots and correlation coefficients indicate no strong linear relationships between the response variable and the factors. Transforming the relationship would not yield a greater relationship. The analysis variables are all normally distributed, thus a box-cox transformation is not required.

4 Standard Simple Linear Regression

A simple linear regression model was fitted to the factor pH. Determining a relationship between soil pH and strawberry yield will help us answer our research question of what treatments or environments could be worth utilizing to increase strawberry yield.

The simple linear regression equation is given by the following:

\[ y = \beta_0 + \beta_1 x + \epsilon \]

Where \(Y\) is the strawberry yield, \(\beta_0\) is the intercept coefficient, \(\beta_1\) is the coefficient factor for pH (thus \(x\) is defined as the factor pH), and \(\epsilon\) is an error term. This is a parametric model, hence we proceed under the assumption \(\epsilon \sim N(0, \sigma^2)\), and equivalently, \(y \sim N(\beta_0 + \beta_1 x)\).

The t statistic was 1.007 on 1 and 698 degrees of freedom. The P value was 0.3159, indicating no statistical significance.

The residuals appear to be distributed normally and with equal variance. There are no outlier residuals with high leverage, and the leverage trend is reasonably even.

reg.table <- coef(summary(slr))
pander(reg.table, caption = "Standard Linear Regression 95% CI")
Standard Linear Regression 95% CI
  Estimate Std. Error t value Pr(>|t|)
(Intercept) 18.92 1.106 17.1 4.927e-55
pH 0.1731 0.1725 1.004 0.3159

5 Bootstrap Simple Linear Regression

The linear regression method under the bootstrap method remains the same. The first few bootstrap beta coefficients are shown. Below, we can see that the bootstrap coefficient distributions are normal. Since zero is included in the 95% confidence interval, we cannot make any conclusions that the population mean in not equal to zero at that confidence level, a similar conclusion we reached under the standard regression model.

set.seed(123)  # for reproducibility

n <- nrow(strawberry)   # should be 700
B <- 1000               # number of bootstrap replications

# Matrix to store coefficients: Intercept and pH slope
beta_mat <- matrix(NA, nrow = B, ncol = 2)

for (b in 1:B) {
  # Sample row indices with replacement
  idx <- sample(1:n, size = n, replace = TRUE)
  
  # Fit linear model on bootstrap sample
  fit <- lm(Yield ~ pH, data = strawberry[idx, ])
  
  # Store coefficients
  beta_mat[b, ] <- coef(fit)
}

# Convert to data frame for easier handling
beta_df <- as.data.frame(beta_mat)
names(beta_df) <- c("Intercept", "Slope")

# Quick look at results
head(beta_df)
##   Intercept       Slope
## 1  20.85783 -0.12725981
## 2  19.28336  0.11662004
## 3  20.21753 -0.03029722
## 4  19.95392  0.01711187
## 5  19.25598  0.12264456
## 6  21.06940 -0.16711248
boot.beta0.ci <- quantile(beta_df$Intercept, c(0.025, 0.975))
boot.beta1.ci <- quantile(beta_df$Slope, c(0.025, 0.975))
boot.coef <- data.frame(rbind(boot.beta0.ci, boot.beta1.ci)) 
names(boot.coef) <- c("2.5%", "97.5%")
pander(boot.coef, caption="Bootstrap confidence intervals of regression coefficients.")
Bootstrap confidence intervals of regression coefficients.
  2.5% 97.5%
boot.beta0.ci 16.69 21.04
boot.beta1.ci -0.1575 0.5172

6 Method Comparison

The two methods yielded similar results, that is that there is no significant impact on the observed level of soil pH. This indicates that, in general, strawberry plants are robust and would not be affected by any number of factors that impact soil pH (such as sulfur treatment or other natural compounds that raise or lower pH). This data was collected without any experimental design factors being tested, so future research that properly tests a hypothesis at different pH levels may conclude different results.

In the scope of this research, the normal distribution of the data and the number of samples indicate that bootstrapping is not necessary to conclusive analysis. As expected in bootstrap analysis, a sample of this size yields similar results as the standard simple linear regression. For computational ease, the standard approach may be desirable.

LS0tDQp0aXRsZTogIlJlZ3Jlc3Npb24gQW5hbHlzaXMgb2YgU29pbCBDb250ZW50cyINCmF1dGhvcjogIk5vYWggQnJlY2hiaWxsIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBmaWdfaGVpZ2h0OiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyMHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KPC9zdHlsZT4NCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShwYW5kZXIpDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NClRoaXMgcmVzZWFyY2ggd2lsbCBpbnZlc3RpZ2F0ZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIHN0YW5kYXJkIGFuZCBib290c3RyYXAgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIGFwcHJvYWNoZXMuIFdlIHdpbGwgYWltIHRvIGRldGVybWluZSB3aGljaCBtZXRob2QgaXMgbW9zdCBpZGVhbCBmb3IgZnV0dXJlIHJlc2VhcmNoLg0KDQojIERhdGEgU2V0DQoNClRoZSBkYXRhIHNldCBvZiBpbnRlcmVzdCBjb250YWlucyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB2YXJpb3VzIGVudmlyb25tZW50YWwgYW5kIHNvaWwgZmFjdG9ycyB0aGF0IGluZmx1ZW5jZSBwbGFudCBncm93dGguIEl0IGluY2x1ZGVzIG1lYXN1cmVtZW50cyBvZiBzb2lsIGNvbnRlbnRzLCBlbnZpcm9ubWVudGFsIGZhY3RvcnMsIGFuZCB0aGUgcGxhbnQgeWllbGQuIEluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGZvciBtYW55IGtpbmRzIG9mIGZydWl0LCBidXQgZm9yIHRoaXMgYW5hbHlzaXMsIG9ubHkgc3RyYXdiZXJyeSBkYXRhIHdpbGwgYmUgdXNlZC4gRGF0YSB3YXMgcmVjb3JkZWQgdGhyb3VnaG91dCB0aGUgcGxhbnQgZ3Jvd3RoIHBlcmlvZCBhbmQgZHVyaW5nIGhhcnZlc3QuDQoNClRoZSBkYXRhIHNldCB3YXMgYWNxdWlyZWQgZnJvbSBLYWdnbGUgY291cnRlc3kgb2YgdXNlciBNYXNoYSBTYW5hZWkuIFRoZSBsaW5rIGZvciB0aGUgZGF0YXNldCBpcyA8aHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9zbm1haHNhL3NvaWwtbnV0cmllbnRzPi4gVGhlIGRhdGFzZXQgd2FzIHVwbG9hZGVkIHRvIGEgZ2l0aHViIHJlcG9zaXRvcnkgZm9yIGFjY2VzcyBhcyA8aHR0cHM6Ly9naXRodWIuY29tL25jYnJlY2hiaWxsL1NUQTMyMS9ibG9iL21haW4vU1RBMzIxL1NvaWwlMjBOdXRyaWVudHMuY3N2Pi4NCg0KLSAgIE5hbWU7IGNoYXJhY3RlcjogVGhlIHBsYW50IG5hbWUuIFRoaXMgZGF0YXNldCB3YXMgcHJ1bmVkIGZvciBvbmx5IFN0cmF3YmVycnkgZGF0YQ0KLSAgIFRlbXBlcmF0dXJlICgkWF8xJCk7IG51bWVyaWM6IFRoZSBhdmVyYWdlIHJlY29yZGVkIGFpciB0ZW1wZXJhdHVyZSBpbiBjZWxjaXVzDQotICAgUmFpbmZhbGwoJFhfMiQpOyBudW1lcmljOiBUaGUgdG90YWwgcmVjb3JkZWQgcmFpbmZhbGwgaW4gY2VudGltZXRlcnMNCi0gICBwSCgkWF8zJCk7IG51bWVyaWM6IFRoZSBhdmVyYWdlIHJlY29kZWQgc29pbCBwSA0KLSAgIE5pdHJvZ2VuKCRYXzQkKTsgbnVtZXJpYzogQXZlcmFnZSBzb2lsIE5pdHJvZ2VuIGNvbnRlbnQgaW4gcGFydHMgcGVyIG1pbGxpb24gKHBwbSkNCi0gICBQaG9zcGhvcnVzKCRYXzUkKTsgbnVtZXJpYzogQXZlcmFnZSBzb2lsIHBob3NwaG9ydXMgY29udGVudCBpbiBwcG0NCi0gICBQb3Rhc3NpdW0gKCRYXzYkKTsgbnVtZXJpYzogQXZlcmFnZSBzb2lsIFBvdGFzc2l1bSBjb250ZW50IGluIHBwbQ0KLSAgIExpZ2h0X0hvdXJzICgkWF83JCk7IG51bWVyaWM6IEF2ZXJhZ2UgaG91cnMgb2Ygc3VubGlnaHQgY292ZXJpbmcgdGhlIHBsYW50IGVhY2ggZGF5DQotICAgWWllbGQgKCRZJCk7IG51bWVyaWM6IFRoZSBtYXNzIG9mIGhhcnZlc3RlZCBzdHJhd2JlcnJpZXMgaW4gZ3JhbXMNCg0KVGhpcyBkYXRhIHNldCBjb250YWlucyA3MDAgc3RyYXdiZXJyeSBwbGFudCBvYnNlcnZhdGlvbnMsIGFsbCB3aXRoIGNvbXBsZXRlIGRhdGEgYW5kIG5vIG1pc3NpbmcgdmFsdWVzLiBUaGlzIHNldCBpcyBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gbWFrZSBhY2N1cmF0ZSBwcmVkaWN0aW9ucyBmb3IgYW55IG51bWJlciBvZiB0aGVzZSBwcmVkaWN0b3JzLiBUaGVyZSBhcmUgYWRkaXRpb25hbCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgdGhhdCBncm91cCByYW5nZXMgb2YgdGhlc2UgdmFyaWFibGVzIHRvZ2V0aGVyLiBIb3dldmVyLCB0aGVzZSB3aWxsIG5vdCBiZSB1c2VkIHVuZGVyIHRoaXMgYW5hbHlzaXMgbWV0aG9kb2xvZ3kuDQoNCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcw0KDQpgYGB7ciwgZmlnLmFsaWduPSdjZW50ZXInLCBlY2hvPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnNvaWwgPC0gcmVhZC5jc3YoIn4vV0NVL1NjaG9vbHdvcmsvU1RBMzIxL0RhdGEvU29pbCBOdXRyaWVudHMuY3N2IiwgaGVhZGVyID0gVFJVRSkNCnN0cmF3YmVycnkgPC0gc3Vic2V0KHNvaWwsIE5hbWUgPT0gIlN0cmF3YmVycnkiKQ0Kc3RyYXdiZXJyeSA8LSBzZWxlY3Qoc3RyYXdiZXJyeSwgTmFtZSwgVGVtcGVyYXR1cmUsIFJhaW5mYWxsLCBwSCwgTGlnaHRfSG91cnMsIE5pdHJvZ2VuLCBQaG9zcGhvcnVzLCBQb3Rhc3NpdW0sIFlpZWxkKQ0KDQpnZ3BhaXJzKHN0cmF3YmVycnkpDQpgYGANCg0KVGhlIHBhaXJ3aXNlIHNjYXR0ZXIgcGxvdHMgYW5kIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyBpbmRpY2F0ZSBubyBzdHJvbmcgbGluZWFyIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgYW5kIHRoZSBmYWN0b3JzLiBUcmFuc2Zvcm1pbmcgdGhlIHJlbGF0aW9uc2hpcCB3b3VsZCBub3QgeWllbGQgYSBncmVhdGVyIHJlbGF0aW9uc2hpcC4gVGhlIGFuYWx5c2lzIHZhcmlhYmxlcyBhcmUgYWxsIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCB0aHVzIGEgYm94LWNveCB0cmFuc2Zvcm1hdGlvbiBpcyBub3QgcmVxdWlyZWQuDQoNCiMgU3RhbmRhcmQgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uDQoNCkEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdhcyBmaXR0ZWQgdG8gdGhlIGZhY3RvciBwSC4gRGV0ZXJtaW5pbmcgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzb2lsIHBIIGFuZCBzdHJhd2JlcnJ5IHlpZWxkIHdpbGwgaGVscCB1cyBhbnN3ZXIgb3VyIHJlc2VhcmNoIHF1ZXN0aW9uIG9mIHdoYXQgdHJlYXRtZW50cyBvciBlbnZpcm9ubWVudHMgY291bGQgYmUgd29ydGggdXRpbGl6aW5nIHRvIGluY3JlYXNlIHN0cmF3YmVycnkgeWllbGQuDQoNClRoZSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gZXF1YXRpb24gaXMgZ2l2ZW4gYnkgdGhlIGZvbGxvd2luZzoNCg0KJCQNCnkgPSBcYmV0YV8wICsgXGJldGFfMSB4ICsgXGVwc2lsb24NCiQkDQoNCldoZXJlICRZJCBpcyB0aGUgc3RyYXdiZXJyeSB5aWVsZCwgJFxiZXRhXzAkIGlzIHRoZSBpbnRlcmNlcHQgY29lZmZpY2llbnQsICRcYmV0YV8xJCBpcyB0aGUgY29lZmZpY2llbnQgZmFjdG9yIGZvciBwSCAodGh1cyAkeCQgaXMgZGVmaW5lZCBhcyB0aGUgZmFjdG9yIHBIKSwgYW5kICRcZXBzaWxvbiQgaXMgYW4gZXJyb3IgdGVybS4gVGhpcyBpcyBhIHBhcmFtZXRyaWMgbW9kZWwsIGhlbmNlIHdlIHByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gJFxlcHNpbG9uIFxzaW0gTigwLCBcc2lnbWFeMikkLCBhbmQgZXF1aXZhbGVudGx5LCAkeSBcc2ltIE4oXGJldGFfMCArIFxiZXRhXzEgeCkkLg0KDQpUaGUgdCBzdGF0aXN0aWMgd2FzIDEuMDA3IG9uIDEgYW5kIDY5OCBkZWdyZWVzIG9mIGZyZWVkb20uIFRoZSBQIHZhbHVlIHdhcyAwLjMxNTksIGluZGljYXRpbmcgbm8gc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLg0KDQpUaGUgcmVzaWR1YWxzIGFwcGVhciB0byBiZSBkaXN0cmlidXRlZCBub3JtYWxseSBhbmQgd2l0aCBlcXVhbCB2YXJpYW5jZS4gVGhlcmUgYXJlIG5vIG91dGxpZXIgcmVzaWR1YWxzIHdpdGggaGlnaCBsZXZlcmFnZSwgYW5kIHRoZSBsZXZlcmFnZSB0cmVuZCBpcyByZWFzb25hYmx5IGV2ZW4uDQoNCmBgYHtyLCBmaWcuYWxpZ249J2NlbnRlcicsIGVjaG89RkFMU0V9DQpzbHIgPC0gbG0oWWllbGQgfiBwSCwNCiAgICAgICAgICBkYXRhID0gc3RyYXdiZXJyeSkNCnBsb3Qoc2xyKQ0KYGBgDQpgYGB7cn0NCnJlZy50YWJsZSA8LSBjb2VmKHN1bW1hcnkoc2xyKSkNCnBhbmRlcihyZWcudGFibGUsIGNhcHRpb24gPSAiU3RhbmRhcmQgTGluZWFyIFJlZ3Jlc3Npb24gOTUlIENJIikNCmBgYA0KDQojIEJvb3RzdHJhcCBTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24NCg0KVGhlIGxpbmVhciByZWdyZXNzaW9uIG1ldGhvZCB1bmRlciB0aGUgYm9vdHN0cmFwIG1ldGhvZCByZW1haW5zIHRoZSBzYW1lLiBUaGUgZmlyc3QgZmV3IGJvb3RzdHJhcCBiZXRhIGNvZWZmaWNpZW50cyBhcmUgc2hvd24uIEJlbG93LCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGJvb3RzdHJhcCBjb2VmZmljaWVudCBkaXN0cmlidXRpb25zIGFyZSBub3JtYWwuIFNpbmNlIHplcm8gaXMgaW5jbHVkZWQgaW4gdGhlIDk1JSBjb25maWRlbmNlIGludGVydmFsLCB3ZSBjYW5ub3QgbWFrZSBhbnkgY29uY2x1c2lvbnMgdGhhdCB0aGUgcG9wdWxhdGlvbiBtZWFuIGluIG5vdCBlcXVhbCB0byB6ZXJvIGF0IHRoYXQgY29uZmlkZW5jZSBsZXZlbCwgYSBzaW1pbGFyIGNvbmNsdXNpb24gd2UgcmVhY2hlZCB1bmRlciB0aGUgc3RhbmRhcmQgcmVncmVzc2lvbiBtb2RlbC4NCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpICAjIGZvciByZXByb2R1Y2liaWxpdHkNCg0KbiA8LSBucm93KHN0cmF3YmVycnkpICAgIyBzaG91bGQgYmUgNzAwDQpCIDwtIDEwMDAgICAgICAgICAgICAgICAjIG51bWJlciBvZiBib290c3RyYXAgcmVwbGljYXRpb25zDQoNCiMgTWF0cml4IHRvIHN0b3JlIGNvZWZmaWNpZW50czogSW50ZXJjZXB0IGFuZCBwSCBzbG9wZQ0KYmV0YV9tYXQgPC0gbWF0cml4KE5BLCBucm93ID0gQiwgbmNvbCA9IDIpDQoNCmZvciAoYiBpbiAxOkIpIHsNCiAgIyBTYW1wbGUgcm93IGluZGljZXMgd2l0aCByZXBsYWNlbWVudA0KICBpZHggPC0gc2FtcGxlKDE6biwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBUUlVFKQ0KICANCiAgIyBGaXQgbGluZWFyIG1vZGVsIG9uIGJvb3RzdHJhcCBzYW1wbGUNCiAgZml0IDwtIGxtKFlpZWxkIH4gcEgsIGRhdGEgPSBzdHJhd2JlcnJ5W2lkeCwgXSkNCiAgDQogICMgU3RvcmUgY29lZmZpY2llbnRzDQogIGJldGFfbWF0W2IsIF0gPC0gY29lZihmaXQpDQp9DQoNCiMgQ29udmVydCB0byBkYXRhIGZyYW1lIGZvciBlYXNpZXIgaGFuZGxpbmcNCmJldGFfZGYgPC0gYXMuZGF0YS5mcmFtZShiZXRhX21hdCkNCm5hbWVzKGJldGFfZGYpIDwtIGMoIkludGVyY2VwdCIsICJTbG9wZSIpDQoNCiMgUXVpY2sgbG9vayBhdCByZXN1bHRzDQpoZWFkKGJldGFfZGYpDQoNCmJvb3QuYmV0YTAuY2kgPC0gcXVhbnRpbGUoYmV0YV9kZiRJbnRlcmNlcHQsIGMoMC4wMjUsIDAuOTc1KSkNCmJvb3QuYmV0YTEuY2kgPC0gcXVhbnRpbGUoYmV0YV9kZiRTbG9wZSwgYygwLjAyNSwgMC45NzUpKQ0KYm9vdC5jb2VmIDwtIGRhdGEuZnJhbWUocmJpbmQoYm9vdC5iZXRhMC5jaSwgYm9vdC5iZXRhMS5jaSkpIA0KbmFtZXMoYm9vdC5jb2VmKSA8LSBjKCIyLjUlIiwgIjk3LjUlIikNCnBhbmRlcihib290LmNvZWYsIGNhcHRpb249IkJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBvZiByZWdyZXNzaW9uIGNvZWZmaWNpZW50cy4iKQ0KYGBgDQoNCiMgTWV0aG9kIENvbXBhcmlzb24NCg0KVGhlIHR3byBtZXRob2RzIHlpZWxkZWQgc2ltaWxhciByZXN1bHRzLCB0aGF0IGlzIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBvYnNlcnZlZCBsZXZlbCBvZiBzb2lsIHBILiBUaGlzIGluZGljYXRlcyB0aGF0LCBpbiBnZW5lcmFsLCBzdHJhd2JlcnJ5IHBsYW50cyBhcmUgcm9idXN0IGFuZCB3b3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgYW55IG51bWJlciBvZiBmYWN0b3JzIHRoYXQgaW1wYWN0IHNvaWwgcEggKHN1Y2ggYXMgc3VsZnVyIHRyZWF0bWVudCBvciBvdGhlciBuYXR1cmFsIGNvbXBvdW5kcyB0aGF0IHJhaXNlIG9yIGxvd2VyIHBIKS4gVGhpcyBkYXRhIHdhcyBjb2xsZWN0ZWQgd2l0aG91dCBhbnkgZXhwZXJpbWVudGFsIGRlc2lnbiBmYWN0b3JzIGJlaW5nIHRlc3RlZCwgc28gZnV0dXJlIHJlc2VhcmNoIHRoYXQgcHJvcGVybHkgdGVzdHMgYSBoeXBvdGhlc2lzIGF0IGRpZmZlcmVudCBwSCBsZXZlbHMgbWF5IGNvbmNsdWRlIGRpZmZlcmVudCByZXN1bHRzLg0KDQpJbiB0aGUgc2NvcGUgb2YgdGhpcyByZXNlYXJjaCwgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEgYW5kIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbmRpY2F0ZSB0aGF0IGJvb3RzdHJhcHBpbmcgaXMgbm90IG5lY2Vzc2FyeSB0byBjb25jbHVzaXZlIGFuYWx5c2lzLiBBcyBleHBlY3RlZCBpbiBib290c3RyYXAgYW5hbHlzaXMsIGEgc2FtcGxlIG9mIHRoaXMgc2l6ZSB5aWVsZHMgc2ltaWxhciByZXN1bHRzIGFzIHRoZSBzdGFuZGFyZCBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24uIEZvciBjb21wdXRhdGlvbmFsIGVhc2UsIHRoZSBzdGFuZGFyZCBhcHByb2FjaCBtYXkgYmUgZGVzaXJhYmxlLg0K