Part One:

Seattle Homes

Seattle home Prices. Home prices are often modeled by looking at the square footage of a home, number of bathrooms and other characteristics. One interesting question is if even after taking into account these characteristics is there evidence for differences in the listing prices for different Realtors? Is it realistic to assume that some Realtors tend to under or over valuate their listed properties? This dataset has information on the sales prices of 36 homes listed in the Seattle area. Of these homes, 28 were listed by one Realtor while 8 of the homes were listed by a different Realtor. In this dataset we also have information on the price of the listings in thousands of dollars, the total square feet, the price in dollars per square feet, the Realtor indicator, the number of bedrooms and the number of bathrooms.

Response Variable:

Price ($000): The dollar sales of the convenience store

Explanatory Variables

  • Square Feet: The total number of square feet in the home
  • Price/Sq Ft: The listing price (in dollars) per square foot
  • Realtor: A categorical variable indicating the Realtor
  • Bedrooms: Number of bedrooms
  • Bathrooms: Number of bathrooms

Exploring Seattle Homes Data

library(car)
library(leaps)
library(ggplot2)
# Set working directory
setwd("~/OneDrive - The University of Colorado Denver/BANA 6610/Homework 5")
# Bring numerical data in to R
seahomes <- read.csv("realestatedata-1.csv", header = T, sep = ",")
head(seahomes)
  1. Create a plot that allows us to make all bivariate comparisons for this data.
#Plot pairs
# Use pairs
pairs(seahomes)

  1. Make a plot of price vs square feet. Color the plot by realtor.
qplot(x = seahomes$Square.Feet, y = seahomes$Price, col = seahomes$Realtor)

  1. Create a histogram of the square footage, as well as histogram of price.
#Histogram of square footage
hist(seahomes$Square.Feet)

#Histogram of price
hist(seahomes$Price)

  1. Look at the summary statistics associated with all variables.
summary(seahomes)
     Price        Square.Feet     Price.SqFt     Realtor    Bedrooms       Bathrooms    
 Min.   :165.0   Min.   : 868   Min.   :0.1164   A:28    Min.   :1.000   Min.   :1.000  
 1st Qu.:281.8   1st Qu.:1535   1st Qu.:0.1601   B: 8    1st Qu.:3.000   1st Qu.:2.000  
 Median :386.5   Median :1952   Median :0.2070           Median :3.000   Median :2.000  
 Mean   :407.4   Mean   :1940   Mean   :0.2167           Mean   :3.111   Mean   :2.167  
 3rd Qu.:575.0   3rd Qu.:2345   3rd Qu.:0.2485           3rd Qu.:4.000   3rd Qu.:3.000  
 Max.   :625.0   Max.   :3260   Max.   :0.4437           Max.   :4.000   Max.   :3.000  

Modeling Seattle Homes Data

  1. Create a model using all quantitative variables to predict price.
#Linear regression model 
seamod <- lm(Price ~ Square.Feet+Price.SqFt+Bedrooms+Bathrooms,data = seahomes)
summary(seamod)

Call:
lm(formula = Price ~ Square.Feet + Price.SqFt + Bedrooms + Bathrooms, 
    data = seahomes)

Residuals:
    Min      1Q  Median      3Q     Max 
-82.741 -14.273   5.019  18.186  47.703 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -347.91023   38.80814  -8.965 4.07e-10 ***
Square.Feet    0.18435    0.01159  15.912  < 2e-16 ***
Price.SqFt  1696.37258   85.25337  19.898  < 2e-16 ***
Bedrooms      25.15235   10.72116   2.346   0.0255 *  
Bathrooms    -22.21939   10.35955  -2.145   0.0399 *  
---
NA

Residual standard error: 31.33 on 31 degrees of freedom
Multiple R-squared:  0.9604,    Adjusted R-squared:  0.9553 
F-statistic:   188 on 4 and 31 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(seamod)

  1. Based on the EDA we performed, do you have any concerns regarding the model we built in the previous part? Why or why not?
    The R-squared and adjusted R-squared values look very good. However, I’m concerned about 3 things: a. The Square Ft and Price Per Sq Ft variables may be collinear; b. Price is not normally distributed and outliers may be skewing the results; c. The scatter plot of price vs. Price per Sq Ft doesn’t appear to be a strong linear relationship.

  2. Is your overall model useful? Provide the results of a hypothesis test.
    (assuming 95% confidence interval and \(\alpha\) = 0.05)
    H0: b1 = b2 = … bk = 0; all variables are irrelevant for determining Price.
    H1: any variable != 0 therefore at least one is helpful in determining Price.
    Our model’s F-statistic has a p-value very near zero, far below alpha, therefore we reject the null hypothesis and state that at least one variable is meaningful in predicting Price.
  3. Which individual variables are useful for predicting price based on individual t-tests? Is this what you expected based on the EDA you performed?
    The two variables with individual t-test p-values very near zero are Square Feet & Price per Sq Ft. I definitely expected Square Feet to be a strong predictor based on EDA, but didn’t expect Price per Sq Ft to be quite as strong.
  4. Consider adding the categorical variable (and remove price/sq. foot, as well as any other variables you believe should be removed based on the previous questions). How many coefficients will be added to your model to incorporate Realtor?
    By including the realtor categorical variable we add a single attribute to the data set. The base level is realtor A, so if the observation is realtor A then the realtorA_IND is 1, otherwise it is 0.

# Bring numerical data in to R
seahomes2 <- read.csv("realestatedata-2.csv", header = T, sep = ",")
head(seahomes2)

Next we create a new model with the revised dataset:

#Linear regression model 
seamod2 <- lm(Price ~ .,data = seahomes2)
summary(seamod2)

Call:
lm(formula = Price ~ ., data = seahomes2)

Residuals:
     Min       1Q   Median       3Q      Max 
-168.303  -54.720   -8.842   59.767  158.621 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)   386.76580   65.34965   5.918 1.55e-06 ***
Square.Feet     0.16186    0.03178   5.093 1.65e-05 ***
RealtorA_IND -196.84035   36.98065  -5.323 8.51e-06 ***
Bedrooms      -26.09857   28.09336  -0.929    0.360    
Bathrooms     -27.28321   28.63452  -0.953    0.348    
---
NA

Residual standard error: 84.03 on 31 degrees of freedom
Multiple R-squared:  0.7152,    Adjusted R-squared:  0.6784 
F-statistic: 19.46 on 4 and 31 DF,  p-value: 4.251e-08
par(mfrow=c(2,2))
plot(seamod2)

  1. Interpret the coefficient for realtor for the model you built in part 5.
    If all other items remain constant, when the realtor is realtor A the price of the home will be ~$197k less than if it were sold by realtor B.
  2. Interpret the coefficient for square footage for the model you built in part 5.
    For each thousand dollar increase in price, the square footage will increase by ~0.16.
  3. Interpret the R-squared for this model.
    An R-squared of 0.715 means that 71.5% of the change in price can be explained by the x variables included in the model while the other 28.5% is due to unexplained error.
  4. Predict the price for a home sold by Realtor A, with 3 bedrooms and 2 bathrooms, and 1500 square feet. Do you think the prediction is close to what you would expect in reality? Explain.
    Based on our equation:
    Price($000’s) = 386.77 + (0.16 x [Square Feet]) + (-196.84 x [Realtor A Ind]) + (-26.10 x [Bedrooms]) + (-27.28 x [Bathrooms])
    Price = 386.77 + (0.16 x 1,500) + (-196.84 x 1) + (-26.10 x 3) + (-27.28 x 2)
    Price = 386.77 + 240 - 196.84 - 78.30 - 54.56
    Price = $297k
    Yes, I think this estimate is reasonable based on reality. However, I don’t think a model that sets a high intercept and then reduces the prediction based on the number of bedrooms an bathrooms will work with a different set of data points.
  5. Based on the plots in questions 1 and 2 of the EDA portion, do you think we should consider adding additional terms to this model? What is the benefit of not adding additional terms to your model?
    Yes, I think we should consider adding additional terms to the model. The price per square foot relationship is not entirely linear. Zip code, or population density might provide more information about why prices vary regardless of square feet. However, adding more terms makes the model more difficult to interpret. We want to find the fewest terms possible that still provide an excellent prediction.

Part Two:

Box Office Gross and Pay per View Sales

Consider a problem of predicting subsequent sales for movies based on Box Office gross sales and other features of the movie. The data file Movies.xls contains information for over 200 movies released during 1998 and 2001, regarding the following variables:

  • Title: Movie name
  • Sales: Subsequent Sales (in millions of dollars)
  • BoxOffice: Box office gross sales (in millions of dollars)
  • Rating: Motion Picture Association of America rating of a movie
  • Genre: Genre of the movie

Modeling Box Office Data

  1. (a) Fit a model with only one explanatory variable, Rating. Report the fitted model here.
# Bring numerical data in to R
movies <- read.csv("movies.csv", header = T, sep = ",")
head(movies)
#Linear regression model 
movielm <- lm(Sales ~ Rating,data = movies)
summary(movielm)

Call:
lm(formula = Sales ~ Rating, data = movies)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.3482 -0.8533 -0.2884  0.6342  4.5717 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)   0.6186     0.2406   2.571  0.01080 * 
RatingPG      0.5298     0.2935   1.805  0.07245 . 
RatingR       0.7997     0.2559   3.125  0.00202 **
---
NA

Residual standard error: 1.103 on 221 degrees of freedom
Multiple R-squared:  0.04602,   Adjusted R-squared:  0.03739 
F-statistic:  5.33 on 2 and 221 DF,  p-value: 0.005484
par(mfrow=c(2,2))
plot(movielm)

  1. (b) Write down the fitted model separately for each of the three categories of movie ratings.
    G: [Subsequent Sales] = 0.61 ($MM)
    PG: [Subsequent Sales] = 0.61 ($MM) + 0.53 ($MM)
    R: [Subsequent Sales] = 0.61 ($MM) + 0.80 ($MM)
  2. (c) Using only the estimated parameter values, calculate the overall predicted mean of the subsequent sales for all movies, regardless of their rating.
    \[\frac{(0.61) + (0.61 + 0.53) + (0.61 + 0.80)}{3} = \$1.053MM\]
  3. (d) Interpret the intercept reported by R within the context of the data.
    When a movie is NOT rated R and not rated PG it will generate $0.62MM in subsequent sales.
  4. (e) What is the predicted difference in subsequent pay per view sales for movies rated G and movies rated R?
    R rated movies generate $0.80MM more in subsequent revenue than G rated movies (which is the base value for the categorical variable).
  5. (f) Is this model overall useful?
    No. The R-squared value suggests that 95.5% of the change is Y is NOT explained by rating. However, the f-statistic’s p-value suggests that at least one of the rating dummy variables is useful in predicting subsequent sales. The conclusion is that this model is NOT very useful.
  6. (g) Verify whether the assumptions needed to conduct correct inferences with this model are verified. Print out and turn in any graphs you have used to draw your conclusions.
    Above we have the model summary plots. There we see the Normal Q-Q plot shows there may be an issue with the distribution of the data.
    Linear relationships:
pairs(movies)

We can check for auto-correlation using a Durbin-Watson test. Here it shows a score below two which suggests some positive auto-correlation may exist:

durbinWatsonTest(movielm)
 lag Autocorrelation D-W Statistic p-value
   1    -0.000130451      1.992605   0.924
 Alternative hypothesis: rho != 0
  1. (h) Explain how many dummy variables are needed to add the variable Genre as an explanatory variable, and how to construct them.
    Our dataset contains 9 distinct genre categories:
levels(movies$Genre)
[1] "Action/Adventure" "Animation"        "Comedy"           "Drama"            "Family"           "Horror/Thriller"  "Mystery"          "Romance"         
[9] "Sci-Fi/Fantasy"  

Therefore, we would need to establish a base level, and create 8 dummy variables for each of the non-base levels.
9. (i) How many error degrees of freedom would you have for a model that includes Rating and Genre as explanatory variables?
With 2 dummy variables for Rating, and 8 dummy variables for Genre we have 10 total x variables. For DF of (n -k -1), where n = 224, & k=10, our DF = 213.

LS0tCnRpdGxlOiAiQkFOQSA2NjEwOiBIb21ld29yayA1IgpzdWJ0aXRsZTogIlNldGggTW9uYWhhbiAoSUQ6IDEwODc0MDA5OCkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiNQYXJ0IE9uZToKCiMjU2VhdHRsZSBIb21lcwpTZWF0dGxlIGhvbWUgUHJpY2VzLiBIb21lIHByaWNlcyBhcmUgb2Z0ZW4gbW9kZWxlZCBieSBsb29raW5nIGF0IHRoZSBzcXVhcmUgZm9vdGFnZSBvZiBhIGhvbWUsIG51bWJlcgpvZiBiYXRocm9vbXMgYW5kIG90aGVyIGNoYXJhY3RlcmlzdGljcy4gT25lIGludGVyZXN0aW5nIHF1ZXN0aW9uIGlzIGlmIGV2ZW4gYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCB0aGVzZSBjaGFyYWN0ZXJpc3RpY3MgaXMgdGhlcmUgZXZpZGVuY2UgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBsaXN0aW5nIHByaWNlcyBmb3IgZGlmZmVyZW50IFJlYWx0b3JzPyBJcyBpdCByZWFsaXN0aWMgdG8gYXNzdW1lIHRoYXQgc29tZSBSZWFsdG9ycyB0ZW5kIHRvIHVuZGVyIG9yIG92ZXIgdmFsdWF0ZSB0aGVpciBsaXN0ZWQgcHJvcGVydGllcz8gVGhpcyBkYXRhc2V0IGhhcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2FsZXMgcHJpY2VzIG9mIDM2IGhvbWVzIGxpc3RlZCBpbiB0aGUgU2VhdHRsZSBhcmVhLiBPZiB0aGVzZSBob21lcywgMjggd2VyZSBsaXN0ZWQgYnkgb25lIFJlYWx0b3Igd2hpbGUgOCBvZiB0aGUgaG9tZXMgd2VyZSBsaXN0ZWQgYnkgYSBkaWZmZXJlbnQgUmVhbHRvci4gSW4gdGhpcyBkYXRhc2V0IHdlIGFsc28gaGF2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgcHJpY2Ugb2YgdGhlIGxpc3RpbmdzIGluIHRob3VzYW5kcyBvZiBkb2xsYXJzLCB0aGUgdG90YWwgc3F1YXJlIGZlZXQsIHRoZSBwcmljZSBpbiBkb2xsYXJzIHBlciBzcXVhcmUgZmVldCwgdGhlIFJlYWx0b3IgaW5kaWNhdG9yLCB0aGUgbnVtYmVyIG9mIGJlZHJvb21zIGFuZCB0aGUgbnVtYmVyIG9mIGJhdGhyb29tcy4KCiMjI1Jlc3BvbnNlIFZhcmlhYmxlOgoqKlByaWNlICgkMDAwKToqKiBUaGUgZG9sbGFyIHNhbGVzIG9mIHRoZSBjb252ZW5pZW5jZSBzdG9yZSAKCiMjI0V4cGxhbmF0b3J5IFZhcmlhYmxlcwotICoqU3F1YXJlIEZlZXQ6KiogVGhlIHRvdGFsIG51bWJlciBvZiBzcXVhcmUgZmVldCBpbiB0aGUgaG9tZQotICoqUHJpY2UvU3EgRnQ6KiogVGhlIGxpc3RpbmcgcHJpY2UgKGluIGRvbGxhcnMpIHBlciBzcXVhcmUgZm9vdAotICoqUmVhbHRvcjoqKiBBIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGluZGljYXRpbmcgdGhlIFJlYWx0b3IKLSAqKkJlZHJvb21zOioqIE51bWJlciBvZiBiZWRyb29tcwotICoqQmF0aHJvb21zOioqIE51bWJlciBvZiBiYXRocm9vbXMKIAojI0V4cGxvcmluZyBTZWF0dGxlIEhvbWVzIERhdGEKYGBge3J9CmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGxlYXBzKQpsaWJyYXJ5KGdncGxvdDIpCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5CnNldHdkKCJ+L09uZURyaXZlIC0gVGhlIFVuaXZlcnNpdHkgb2YgQ29sb3JhZG8gRGVudmVyL0JBTkEgNjYxMC9Ib21ld29yayA1IikKCiMgQnJpbmcgbnVtZXJpY2FsIGRhdGEgaW4gdG8gUgpzZWFob21lcyA8LSByZWFkLmNzdigicmVhbGVzdGF0ZWRhdGEtMS5jc3YiLCBoZWFkZXIgPSBULCBzZXAgPSAiLCIpCmhlYWQoc2VhaG9tZXMpCmBgYAoKMS4gKipDcmVhdGUgYSBwbG90IHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYWxsIGJpdmFyaWF0ZSBjb21wYXJpc29ucyBmb3IgdGhpcyBkYXRhLioqCmBgYHtyfQojUGxvdCBwYWlycwojIFVzZSBwYWlycwpwYWlycyhzZWFob21lcykKYGBgCgoyLiAqKk1ha2UgYSBwbG90IG9mIHByaWNlIHZzIHNxdWFyZSBmZWV0LiBDb2xvciB0aGUgcGxvdCBieSByZWFsdG9yLioqCmBgYHtyfQpxcGxvdCh4ID0gc2VhaG9tZXMkU3F1YXJlLkZlZXQsIHkgPSBzZWFob21lcyRQcmljZSwgY29sID0gc2VhaG9tZXMkUmVhbHRvcikKYGBgCgozLiAqKkNyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgc3F1YXJlIGZvb3RhZ2UsIGFzIHdlbGwgYXMgaGlzdG9ncmFtIG9mIHByaWNlLioqCmBgYHtyfQojSGlzdG9ncmFtIG9mIHNxdWFyZSBmb290YWdlCmhpc3Qoc2VhaG9tZXMkU3F1YXJlLkZlZXQpCgojSGlzdG9ncmFtIG9mIHByaWNlCmhpc3Qoc2VhaG9tZXMkUHJpY2UpCmBgYAoKNC4gKipMb29rIGF0IHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYXNzb2NpYXRlZCB3aXRoIGFsbCB2YXJpYWJsZXMuKioKYGBge3J9CnN1bW1hcnkoc2VhaG9tZXMpCmBgYAoKCiMjTW9kZWxpbmcgU2VhdHRsZSBIb21lcyBEYXRhCjEuICoqQ3JlYXRlIGEgbW9kZWwgdXNpbmcgYWxsIHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMgdG8gcHJlZGljdCBwcmljZS4qKgpgYGB7cn0KI0xpbmVhciByZWdyZXNzaW9uIG1vZGVsIApzZWFtb2QgPC0gbG0oUHJpY2UgfiBTcXVhcmUuRmVldCtQcmljZS5TcUZ0K0JlZHJvb21zK0JhdGhyb29tcyxkYXRhID0gc2VhaG9tZXMpCgpzdW1tYXJ5KHNlYW1vZCkKcGFyKG1mcm93PWMoMiwyKSkKcGxvdChzZWFtb2QpCmBgYAoKMi4gKipCYXNlZCBvbiB0aGUgRURBIHdlIHBlcmZvcm1lZCwgZG8geW91IGhhdmUgYW55IGNvbmNlcm5zIHJlZ2FyZGluZyB0aGUgbW9kZWwgd2UgYnVpbHQgaW4gdGhlIHByZXZpb3VzIHBhcnQ/IFdoeSBvciB3aHkgbm90PyoqICAKX1RoZSBSLXNxdWFyZWQgYW5kIGFkanVzdGVkIFItc3F1YXJlZCB2YWx1ZXMgbG9vayB2ZXJ5IGdvb2QuIEhvd2V2ZXIsIEknbSBjb25jZXJuZWQgYWJvdXQgMyB0aGluZ3M6IGEuIFRoZSBTcXVhcmUgRnQgYW5kIFByaWNlIFBlciBTcSBGdCB2YXJpYWJsZXMgbWF5IGJlIGNvbGxpbmVhcjsgYi4gUHJpY2UgaXMgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFuZCBvdXRsaWVycyBtYXkgYmUgc2tld2luZyB0aGUgcmVzdWx0czsgYy4gVGhlIHNjYXR0ZXIgcGxvdCBvZiBwcmljZSB2cy4gUHJpY2UgcGVyIFNxIEZ0IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgc3Ryb25nIGxpbmVhciByZWxhdGlvbnNoaXAuXwoKMy4gKipJcyB5b3VyIG92ZXJhbGwgbW9kZWwgdXNlZnVsPyBQcm92aWRlIHRoZSByZXN1bHRzIG9mIGEgaHlwb3RoZXNpcyB0ZXN0LioqICAKXyhhc3N1bWluZyA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBhbmQgJFxhbHBoYSQgPSAwLjA1KV8gIApfSH4wfjogYn4xfiA9IGJ+Mn4gPSAuLi4gYn5rfiA9IDA7IGFsbCB2YXJpYWJsZXMgYXJlIGlycmVsZXZhbnQgZm9yIGRldGVybWluaW5nIFByaWNlLl8gIApfSH4xfjogYW55IHZhcmlhYmxlICE9IDAgdGhlcmVmb3JlIGF0IGxlYXN0IG9uZSBpcyBoZWxwZnVsIGluIGRldGVybWluaW5nIFByaWNlLl8gIApfT3VyIG1vZGVsJ3MgRi1zdGF0aXN0aWMgaGFzIGEgcC12YWx1ZSB2ZXJ5IG5lYXIgemVybywgZmFyIGJlbG93IGFscGhhLCB0aGVyZWZvcmUgd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgYW5kIHN0YXRlIHRoYXQgYXQgbGVhc3Qgb25lIHZhcmlhYmxlIGlzIG1lYW5pbmdmdWwgaW4gcHJlZGljdGluZyBQcmljZS5fICAKNC4gKipXaGljaCBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhcmUgdXNlZnVsIGZvciBwcmVkaWN0aW5nIHByaWNlIGJhc2VkIG9uIGluZGl2aWR1YWwgdC10ZXN0cz8gSXMgdGhpcyB3aGF0IHlvdSBleHBlY3RlZCBiYXNlZCBvbiB0aGUgRURBIHlvdSBwZXJmb3JtZWQ/KiogIApfVGhlIHR3byB2YXJpYWJsZXMgd2l0aCBpbmRpdmlkdWFsIHQtdGVzdCBwLXZhbHVlcyB2ZXJ5IG5lYXIgemVybyBhcmUgU3F1YXJlIEZlZXQgJiBQcmljZSBwZXIgU3EgRnQuIEkgZGVmaW5pdGVseSBleHBlY3RlZCBTcXVhcmUgRmVldCB0byBiZSBhIHN0cm9uZyBwcmVkaWN0b3IgYmFzZWQgb24gRURBLCBidXQgZGlkbid0IGV4cGVjdCBQcmljZSBwZXIgU3EgRnQgdG8gYmUgcXVpdGUgYXMgc3Ryb25nLl8KNS4gKipDb25zaWRlciBhZGRpbmcgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlIChhbmQgcmVtb3ZlIHByaWNlL3NxLiBmb290LCBhcyB3ZWxsIGFzIGFueSBvdGhlciB2YXJpYWJsZXMgeW91IGJlbGlldmUgc2hvdWxkIGJlIHJlbW92ZWQgYmFzZWQgb24gdGhlIHByZXZpb3VzIHF1ZXN0aW9ucykuIEhvdyBtYW55IGNvZWZmaWNpZW50cyB3aWxsIGJlIGFkZGVkIHRvIHlvdXIgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgUmVhbHRvcj8qKiAgCl9CeSBpbmNsdWRpbmcgdGhlIHJlYWx0b3IgY2F0ZWdvcmljYWwgdmFyaWFibGUgd2UgYWRkIGEgc2luZ2xlIGF0dHJpYnV0ZSB0byB0aGUgZGF0YSBzZXQuIFRoZSBiYXNlIGxldmVsIGlzIHJlYWx0b3IgQSwgc28gaWYgdGhlIG9ic2VydmF0aW9uIGlzIHJlYWx0b3IgQSB0aGVuIHRoZSByZWFsdG9yQV9JTkQgaXMgMSwgb3RoZXJ3aXNlIGl0IGlzIDAuXwpgYGB7cn0KIyBCcmluZyBudW1lcmljYWwgZGF0YSBpbiB0byBSCnNlYWhvbWVzMiA8LSByZWFkLmNzdigicmVhbGVzdGF0ZWRhdGEtMi5jc3YiLCBoZWFkZXIgPSBULCBzZXAgPSAiLCIpCmhlYWQoc2VhaG9tZXMyKQpgYGAKX05leHQgd2UgY3JlYXRlIGEgbmV3IG1vZGVsIHdpdGggdGhlIHJldmlzZWQgZGF0YXNldDpfCmBgYHtyfQojTGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgCnNlYW1vZDIgPC0gbG0oUHJpY2UgfiAuLGRhdGEgPSBzZWFob21lczIpCgpzdW1tYXJ5KHNlYW1vZDIpCnBhcihtZnJvdz1jKDIsMikpCnBsb3Qoc2VhbW9kMikKYGBgCgo2LiAqKkludGVycHJldCB0aGUgY29lZmZpY2llbnQgZm9yIHJlYWx0b3IgZm9yIHRoZSBtb2RlbCB5b3UgYnVpbHQgaW4gcGFydCA1LioqICAKX0lmIGFsbCBvdGhlciBpdGVtcyByZW1haW4gY29uc3RhbnQsIHdoZW4gdGhlIHJlYWx0b3IgaXMgcmVhbHRvciBBIHRoZSBwcmljZSBvZiB0aGUgaG9tZSB3aWxsIGJlIH4kMTk3ayBsZXNzIHRoYW4gaWYgaXQgd2VyZSBzb2xkIGJ5IHJlYWx0b3IgQi5fCjcuICoqSW50ZXJwcmV0IHRoZSBjb2VmZmljaWVudCBmb3Igc3F1YXJlIGZvb3RhZ2UgZm9yIHRoZSBtb2RlbCB5b3UgYnVpbHQgaW4gcGFydCA1LioqICAKX0ZvciBlYWNoIHRob3VzYW5kIGRvbGxhciBpbmNyZWFzZSBpbiBwcmljZSwgdGhlIHNxdWFyZSBmb290YWdlIHdpbGwgaW5jcmVhc2UgYnkgfjAuMTYuXwo4LiAqKkludGVycHJldCB0aGUgUi1zcXVhcmVkIGZvciB0aGlzIG1vZGVsLioqICAKX0FuIFItc3F1YXJlZCBvZiAwLjcxNSBtZWFucyB0aGF0IDcxLjUlIG9mIHRoZSBjaGFuZ2UgaW4gcHJpY2UgY2FuIGJlIGV4cGxhaW5lZCBieSB0aGUgeCB2YXJpYWJsZXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIHdoaWxlIHRoZSBvdGhlciAyOC41JSBpcyBkdWUgdG8gdW5leHBsYWluZWQgZXJyb3IuXwo5LiAqKlByZWRpY3QgdGhlIHByaWNlIGZvciBhIGhvbWUgc29sZCBieSBSZWFsdG9yIEEsIHdpdGggMyBiZWRyb29tcyBhbmQgMiBiYXRocm9vbXMsIGFuZCAxNTAwIHNxdWFyZSBmZWV0LiBEbyB5b3UgdGhpbmsgdGhlIHByZWRpY3Rpb24gaXMgY2xvc2UgdG8gd2hhdCB5b3Ugd291bGQgZXhwZWN0IGluIHJlYWxpdHk/IEV4cGxhaW4uKiogIApfQmFzZWQgb24gb3VyIGVxdWF0aW9uOl8gIApfUHJpY2UoJDAwMCdzKSA9IDM4Ni43NyArICgwLjE2IHggW1NxdWFyZSBGZWV0XSkgKyAoLTE5Ni44NCB4IFtSZWFsdG9yIEEgSW5kXSkgKyAoLTI2LjEwIHggW0JlZHJvb21zXSkgKyAoLTI3LjI4IHggW0JhdGhyb29tc10pXyAgCl9QcmljZSA9IDM4Ni43NyArICgwLjE2IHggMSw1MDApICsgKC0xOTYuODQgeCAxKSArICgtMjYuMTAgeCAzKSArICgtMjcuMjggeCAyKV8gIApfUHJpY2UgPSAzODYuNzcgKyAyNDAgLSAxOTYuODQgLSA3OC4zMCAtIDU0LjU2XyAgCl9QcmljZSA9IFwkMjk3a18gIApfWWVzLCBJIHRoaW5rIHRoaXMgZXN0aW1hdGUgaXMgcmVhc29uYWJsZSBiYXNlZCBvbiByZWFsaXR5LiBIb3dldmVyLCBJIGRvbid0IHRoaW5rIGEgbW9kZWwgdGhhdCBzZXRzIGEgaGlnaCBpbnRlcmNlcHQgYW5kIHRoZW4gcmVkdWNlcyB0aGUgcHJlZGljdGlvbiBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGJlZHJvb21zIGFuIGJhdGhyb29tcyB3aWxsIHdvcmsgd2l0aCBhIGRpZmZlcmVudCBzZXQgb2YgZGF0YSBwb2ludHMuXwoxMC4gKipCYXNlZCBvbiB0aGUgcGxvdHMgaW4gcXVlc3Rpb25zIDEgYW5kIDIgb2YgdGhlIEVEQSBwb3J0aW9uLCBkbyB5b3UgdGhpbmsgd2Ugc2hvdWxkIGNvbnNpZGVyIGFkZGluZyBhZGRpdGlvbmFsIHRlcm1zIHRvIHRoaXMgbW9kZWw/IFdoYXQgaXMgdGhlIGJlbmVmaXQgb2Ygbm90IGFkZGluZyBhZGRpdGlvbmFsIHRlcm1zIHRvIHlvdXIgbW9kZWw/KiogIApfWWVzLCBJIHRoaW5rIHdlIHNob3VsZCBjb25zaWRlciBhZGRpbmcgYWRkaXRpb25hbCB0ZXJtcyB0byB0aGUgbW9kZWwuIFRoZSBwcmljZSBwZXIgc3F1YXJlIGZvb3QgcmVsYXRpb25zaGlwIGlzIG5vdCBlbnRpcmVseSBsaW5lYXIuIFppcCBjb2RlLCBvciBwb3B1bGF0aW9uIGRlbnNpdHkgbWlnaHQgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoeSBwcmljZXMgdmFyeSByZWdhcmRsZXNzIG9mIHNxdWFyZSBmZWV0LiBIb3dldmVyLCBhZGRpbmcgbW9yZSB0ZXJtcyBtYWtlcyB0aGUgbW9kZWwgbW9yZSBkaWZmaWN1bHQgdG8gaW50ZXJwcmV0LiBXZSB3YW50IHRvIGZpbmQgdGhlIGZld2VzdCB0ZXJtcyBwb3NzaWJsZSB0aGF0IHN0aWxsIHByb3ZpZGUgYW4gZXhjZWxsZW50IHByZWRpY3Rpb24uXyAgCgojUGFydCBUd286CgojI0JveCBPZmZpY2UgR3Jvc3MgYW5kIFBheSBwZXIgVmlldyBTYWxlcwpDb25zaWRlciBhIHByb2JsZW0gb2YgcHJlZGljdGluZyBzdWJzZXF1ZW50IHNhbGVzIGZvciBtb3ZpZXMgYmFzZWQgb24gQm94IE9mZmljZSBncm9zcyBzYWxlcyBhbmQgb3RoZXIgZmVhdHVyZXMgb2YgdGhlIG1vdmllLiBUaGUgZGF0YSBmaWxlIE1vdmllcy54bHMgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIG92ZXIgMjAwIG1vdmllcyByZWxlYXNlZCBkdXJpbmcgMTk5OCBhbmQgMjAwMSwgcmVnYXJkaW5nIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgoKLSAqKlRpdGxlOioqIE1vdmllIG5hbWUKLSAqKlNhbGVzOioqIFN1YnNlcXVlbnQgU2FsZXMgKGluIG1pbGxpb25zIG9mIGRvbGxhcnMpCi0gKipCb3hPZmZpY2U6KiogQm94IG9mZmljZSBncm9zcyBzYWxlcyAoaW4gbWlsbGlvbnMgb2YgZG9sbGFycykKLSAqKlJhdGluZzoqKiBNb3Rpb24gUGljdHVyZSBBc3NvY2lhdGlvbiBvZiBBbWVyaWNhIHJhdGluZyBvZiBhIG1vdmllCi0gKipHZW5yZToqKiBHZW5yZSBvZiB0aGUgbW92aWUKCiMjTW9kZWxpbmcgQm94IE9mZmljZSBEYXRhCjEuICoqKGEpIEZpdCBhIG1vZGVsIHdpdGggb25seSBvbmUgZXhwbGFuYXRvcnkgdmFyaWFibGUsIFJhdGluZy4gUmVwb3J0IHRoZSBmaXR0ZWQgbW9kZWwgaGVyZS4qKgpgYGB7cn0KIyBCcmluZyBudW1lcmljYWwgZGF0YSBpbiB0byBSCm1vdmllcyA8LSByZWFkLmNzdigibW92aWVzLmNzdiIsIGhlYWRlciA9IFQsIHNlcCA9ICIsIikKaGVhZChtb3ZpZXMpCmBgYApgYGB7cn0KI0xpbmVhciByZWdyZXNzaW9uIG1vZGVsIAptb3ZpZWxtIDwtIGxtKFNhbGVzIH4gUmF0aW5nLGRhdGEgPSBtb3ZpZXMpCgpzdW1tYXJ5KG1vdmllbG0pCnBhcihtZnJvdz1jKDIsMikpCnBsb3QobW92aWVsbSkKYGBgCgoyLiAqKihiKSBXcml0ZSBkb3duIHRoZSBmaXR0ZWQgbW9kZWwgc2VwYXJhdGVseSBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgY2F0ZWdvcmllcyBvZiBtb3ZpZSByYXRpbmdzLioqICAKX0c6IFtTdWJzZXF1ZW50IFNhbGVzXSA9IDAuNjEgKFwkTU0pXyAgCl9QRzogW1N1YnNlcXVlbnQgU2FsZXNdID0gMC42MSAoXCRNTSkgKyAwLjUzIChcJE1NKV8gIApfUjogW1N1YnNlcXVlbnQgU2FsZXNdID0gMC42MSAoXCRNTSkgKyAwLjgwIChcJE1NKV8gIAozLiAqKihjKSBVc2luZyBvbmx5IHRoZSBlc3RpbWF0ZWQgcGFyYW1ldGVyIHZhbHVlcywgY2FsY3VsYXRlIHRoZSBvdmVyYWxsIHByZWRpY3RlZCBtZWFuIG9mIHRoZSBzdWJzZXF1ZW50IHNhbGVzIGZvciBhbGwgbW92aWVzLCByZWdhcmRsZXNzIG9mIHRoZWlyIHJhdGluZy4qKiAgCiQkXGZyYWN7KDAuNjEpICsgKDAuNjEgKyAwLjUzKSArICgwLjYxICsgMC44MCl9ezN9ID0gXCQxLjA1M01NJCQKNC4gKiooZCkgSW50ZXJwcmV0IHRoZSBpbnRlcmNlcHQgcmVwb3J0ZWQgYnkgUiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRhdGEuKiogIApfV2hlbiBhIG1vdmllIGlzIE5PVCByYXRlZCBSIGFuZCBub3QgcmF0ZWQgUEcgaXQgd2lsbCBnZW5lcmF0ZSBcJDAuNjJNTSBpbiBzdWJzZXF1ZW50IHNhbGVzLl8KNS4gKiooZSkgV2hhdCBpcyB0aGUgcHJlZGljdGVkIGRpZmZlcmVuY2UgaW4gc3Vic2VxdWVudCBwYXkgcGVyIHZpZXcgc2FsZXMgZm9yIG1vdmllcyByYXRlZCBHIGFuZCBtb3ZpZXMgcmF0ZWQgUj8qKiAgCl9SIHJhdGVkIG1vdmllcyBnZW5lcmF0ZSBcJDAuODBNTSBtb3JlIGluIHN1YnNlcXVlbnQgcmV2ZW51ZSB0aGFuIEcgcmF0ZWQgbW92aWVzICh3aGljaCBpcyB0aGUgYmFzZSB2YWx1ZSBmb3IgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlKS5fCjYuICoqKGYpIElzIHRoaXMgbW9kZWwgb3ZlcmFsbCB1c2VmdWw/KiogIApfTm8uIFRoZSBSLXNxdWFyZWQgdmFsdWUgc3VnZ2VzdHMgdGhhdCA5NS41JSBvZiB0aGUgY2hhbmdlIGlzIFkgaXMgTk9UIGV4cGxhaW5lZCBieSByYXRpbmcuIEhvd2V2ZXIsIHRoZSBmLXN0YXRpc3RpYydzIHAtdmFsdWUgc3VnZ2VzdHMgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlIHJhdGluZyBkdW1teSB2YXJpYWJsZXMgaXMgdXNlZnVsIGluIHByZWRpY3Rpbmcgc3Vic2VxdWVudCBzYWxlcy4gVGhlIGNvbmNsdXNpb24gaXMgdGhhdCB0aGlzIG1vZGVsIGlzIE5PVCB2ZXJ5IHVzZWZ1bC5fCjcuICoqKGcpIFZlcmlmeSB3aGV0aGVyIHRoZSBhc3N1bXB0aW9ucyBuZWVkZWQgdG8gY29uZHVjdCBjb3JyZWN0IGluZmVyZW5jZXMgd2l0aCB0aGlzIG1vZGVsIGFyZSB2ZXJpZmllZC4gUHJpbnQgb3V0IGFuZCB0dXJuIGluIGFueSBncmFwaHMgeW91IGhhdmUgdXNlZCB0byBkcmF3IHlvdXIgY29uY2x1c2lvbnMuKiogIApfQWJvdmUgd2UgaGF2ZSB0aGUgbW9kZWwgc3VtbWFyeSBwbG90cy4gVGhlcmUgd2Ugc2VlIHRoZSBOb3JtYWwgUS1RIHBsb3Qgc2hvd3MgdGhlcmUgbWF5IGJlIGFuIGlzc3VlIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YS5fICAKX0xpbmVhciByZWxhdGlvbnNoaXBzOl8gIApgYGB7cn0KcGFpcnMobW92aWVzKQpgYGAKICAKX1dlIGNhbiBjaGVjayBmb3IgYXV0by1jb3JyZWxhdGlvbiB1c2luZyBhIER1cmJpbi1XYXRzb24gdGVzdC4gSGVyZSBpdCBzaG93cyBhIHNjb3JlIGJlbG93IHR3byB3aGljaCBzdWdnZXN0cyBzb21lIHBvc2l0aXZlIGF1dG8tY29ycmVsYXRpb24gbWF5IGV4aXN0Ol8gIApgYGB7cn0KZHVyYmluV2F0c29uVGVzdChtb3ZpZWxtKQpgYGAKCjguICoqKGgpIEV4cGxhaW4gaG93IG1hbnkgZHVtbXkgdmFyaWFibGVzIGFyZSBuZWVkZWQgdG8gYWRkIHRoZSB2YXJpYWJsZSBHZW5yZSBhcyBhbiBleHBsYW5hdG9yeSB2YXJpYWJsZSwgYW5kIGhvdyB0byBjb25zdHJ1Y3QgdGhlbS4qKiAgCl9PdXIgZGF0YXNldCBjb250YWlucyA5IGRpc3RpbmN0IGdlbnJlIGNhdGVnb3JpZXM6XyAgCmBgYHtyfQpsZXZlbHMobW92aWVzJEdlbnJlKQpgYGAKX1RoZXJlZm9yZSwgd2Ugd291bGQgbmVlZCB0byBlc3RhYmxpc2ggYSBiYXNlIGxldmVsLCBhbmQgY3JlYXRlICo4KiBkdW1teSB2YXJpYWJsZXMgZm9yIGVhY2ggb2YgdGhlIG5vbi1iYXNlIGxldmVscy5fICAKOS4gKiooaSkgSG93IG1hbnkgZXJyb3IgZGVncmVlcyBvZiBmcmVlZG9tIHdvdWxkIHlvdSBoYXZlIGZvciBhIG1vZGVsIHRoYXQgaW5jbHVkZXMgUmF0aW5nIGFuZCBHZW5yZSBhcyBleHBsYW5hdG9yeSB2YXJpYWJsZXM/KiogIApfV2l0aCAyIGR1bW15IHZhcmlhYmxlcyBmb3IgUmF0aW5nLCBhbmQgOCBkdW1teSB2YXJpYWJsZXMgZm9yIEdlbnJlIHdlIGhhdmUgMTAgdG90YWwgeCB2YXJpYWJsZXMuIEZvciBERiBvZiAobiAtayAtMSksIHdoZXJlIG4gPSAyMjQsICYgaz0xMCwgb3VyIERGID0gKjIxMyouXyAgCg==