Task 1

First begin by reading in the data from the ‘marketing.csv’ file, and viewing it to make sure we see it being read in correctly.

mydata = read.csv(file="data/rottentomatoes.csv")
head(mydata)

Now calculate the Range, Min, Max, Mean, STDEV, and Variance for each variable. Below is an example of how to compute the items for the variable ‘gross’.

gross

gross = mydata$gross
#Max Gross
max_gross = max(gross, na.rm = TRUE)
max_gross
[1] 760505847
#Min Gross
min_gross = min(gross, na.rm = TRUE)
min_gross
[1] 162
#Range
range_gross = max_gross-min_gross
range_gross
[1] 760505685
#Mean
mean_gross = mean(gross, na.rm = TRUE)
mean_gross
[1] 48468408
#Standard Deviation
sd_gross = sd(gross, na.rm = TRUE)
sd_gross
[1] 68452990
#Variance
var_gross = var(gross, na.rm = TRUE)
var_gross
[1] 4.685812e+15

User Votes, Total Cast Likes, Director Facebook Likes, Critic Reviews

#Calling
userVotes = mydata$users_votes
TCL = mydata$total_cast_likes
DFL = mydata$director_fb_likes
criticReviews = mydata$critic_reviews
#Max
max_userVotes = max(userVotes, na.rm = TRUE)
max_TCL = max(TCL, na.rm = TRUE)
max_DFL = max(DFL, na.rm = TRUE)
max_criticReviews = max(criticReviews, na.rm = TRUE)
max_userVotes
[1] 1689764
max_TCL
[1] 656730
max_DFL
[1] 23000
max_criticReviews
[1] 813
#Min
min_userVotes = min(userVotes, na.rm = TRUE)
min_TCL = min(TCL, na.rm = TRUE)
min_DFL = min(DFL, na.rm = TRUE)
min_criticReviews = min(criticReviews, na.rm = TRUE)
min_userVotes
[1] 5
min_TCL
[1] 0
min_DFL
[1] 0
min_criticReviews
[1] 1
#Range
range_userVotes = max_userVotes - min_userVotes
range_TCL = max_TCL - min_TCL
range_DFL = max_DFL - min_DFL
range_criticReviews = max_criticReviews - min_criticReviews
range_userVotes
[1] 1689759
range_TCL
[1] 656730
range_DFL
[1] 23000
range_criticReviews
[1] 812
#Mean
mean_userVotes = mean(userVotes, na.rm = TRUE)
mean_TCL = mean(TCL, na.rm = TRUE)
mean_DFL = mean(DFL, na.rm = TRUE)
mean_criticReviews = mean(criticReviews, na.rm = TRUE)
mean_userVotes
[1] 83668.16
mean_TCL
[1] 9699.064
mean_DFL
[1] 686.5092
mean_criticReviews
[1] 140.1943
#Standard Deviation
sd_userVotes = sd(userVotes, na.rm = TRUE)
sd_TCL = sd(TCL, na.rm = TRUE)
sd_DFL = sd(DFL, na.rm = TRUE)
sd_criticReviews = sd(criticReviews, na.rm = TRUE)
sd_userVotes
[1] 138485.3
sd_TCL
[1] 18163.8
sd_DFL
[1] 2813.329
sd_criticReviews
[1] 121.6017
#variance
var_userVotes = var(userVotes, na.rm = TRUE)
var_TCL = var(TCL, na.rm = TRUE)
var_DFL = var(DFL, na.rm = TRUE)
var_criticReviews = var(criticReviews, na.rm = TRUE)
var_userVotes
[1] 19178166353
var_TCL
[1] 329923599
var_DFL
[1] 7914818
var_criticReviews
[1] 14786.97

Task 2

An easy way to calculate all of these statistics of all of these variables is with the summary function. Below is an example.

summary(mydata)
                         ï..title                     genres                 director                  actor1                 actor2                actor3         length          budget          director_fb_likes
 Ben-Hur                  :   3   Drama               : 236                   : 104   Robert De Niro   :  49   Morgan Freeman :  20                 :  23   Min.   :  7.0   Min.   :2.180e+02   Min.   :    0.0  
 Halloween                :   3   Comedy              : 209   Steven Spielberg:  26   Johnny Depp      :  41   Charlize Theron:  15   Ben Mendelsohn:   8   1st Qu.: 93.0   1st Qu.:6.000e+06   1st Qu.:    7.0  
 Home                     :   3   Comedy|Drama        : 191   Woody Allen     :  22   Nicolas Cage     :  33   Brad Pitt      :  14   John Heard    :   8   Median :103.0   Median :2.000e+07   Median :   49.0  
 King Kong                :   3   Comedy|Drama|Romance: 187   Clint Eastwood  :  20   J.K. Simmons     :  31                  :  13   Steve Coogan  :   8   Mean   :107.2   Mean   :3.975e+07   Mean   :  686.5  
 Pan                      :   3   Comedy|Romance      : 158   Martin Scorsese :  20   Bruce Willis     :  30   James Franco   :  11   Anne Hathaway :   7   3rd Qu.:118.0   3rd Qu.:4.500e+07   3rd Qu.:  194.5  
 The Fast and the Furious :   3   Drama|Romance       : 152   Ridley Scott    :  17   Denzel Washington:  30   Meryl Streep   :  11   Jon Gries     :   7   Max.   :511.0   Max.   :1.222e+10   Max.   :23000.0  
 (Other)                     :5025   (Other)             :3910   (Other)         :4834   (Other)          :4829   (Other)        :4959   (Other)       :4982   NA's   :15      NA's   :492         NA's   :104      
 actor1_fb_likes  actor2_fb_likes  actor3_fb_likes   total_cast_likes    fb_likes      critic_reviews  users_reviews     users_votes          score        aspect_ratio       gross                year     
 Min.   :     0   Min.   :     0   Min.   :    0.0   Min.   :     0   Min.   :     0   Min.   :  1.0   Min.   :   1.0   Min.   :      5   Min.   :1.600   Min.   : 1.18   Min.   :      162   Min.   :1916  
 1st Qu.:   614   1st Qu.:   281   1st Qu.:  133.0   1st Qu.:  1411   1st Qu.:     0   1st Qu.: 50.0   1st Qu.:  65.0   1st Qu.:   8594   1st Qu.:5.800   1st Qu.: 1.85   1st Qu.:  5340988   1st Qu.:1999  
 Median :   988   Median :   595   Median :  371.5   Median :  3090   Median :   166   Median :110.0   Median : 156.0   Median :  34359   Median :6.600   Median : 2.35   Median : 25517500   Median :2005  
 Mean   :  6560   Mean   :  1652   Mean   :  645.0   Mean   :  9699   Mean   :  7526   Mean   :140.2   Mean   : 272.8   Mean   :  83668   Mean   :6.442   Mean   : 2.22   Mean   : 48468408   Mean   :2002  
 3rd Qu.: 11000   3rd Qu.:   918   3rd Qu.:  636.0   3rd Qu.: 13756   3rd Qu.:  3000   3rd Qu.:195.0   3rd Qu.: 326.0   3rd Qu.:  96309   3rd Qu.:7.200   3rd Qu.: 2.35   3rd Qu.: 62309438   3rd Qu.:2011  
 Max.   :640000   Max.   :137000   Max.   :23000.0   Max.   :656730   Max.   :349000   Max.   :813.0   Max.   :5060.0   Max.   :1689764   Max.   :9.500   Max.   :16.00   Max.   :760505847   Max.   :2016  
 NA's   :7        NA's   :13       NA's   :23                                          NA's   :50      NA's   :21                                         NA's   :329     NA's   :884         NA's   :108   

There are some statistics not captured here like standard deviation and variance, but there is an easy and quick way to find most of your basic statistics.

Now, we will produce a basic blot of the ‘gross’ variable . Here we utilize the plot function and within the plot function we call the variable we want to plot.

plot(gross)

When looking at this graph we cannot truly capture the data or see a clear pattern. A better way to visualize this plot would be to re-order the data based on increasing sales.

#xlab labels the x axis, ylab labels the y axis
plot(gross, type="b", xlab = "Case Number", ylab = "Gross in $1,000") 

There are further ways to customize plots, such as changing the colors of the lines, adding a heading, or even making them interactive.

Now, lets plot the sales graph, alongside radio, paper, and tv which you will code. Make sure to run the code in the same chunk so they are on the same layout.

#Layout allows us to see all 4 graphs on one screen
layout(matrix(1:5,1,2,2))
data length [5] is not a sub-multiple or multiple of the number of columns [2]
#Example of how to plot the sales variable
plot(gross, type="b", xlab = "Case Number", ylab = "Gross in $1,000") 
#Plot of User Votes
plot(userVotes, type="b", xlab = "Case Number", ylab = "User Votes")

#Plot of Total Cast Likes
plot(TCL, type="b", xlab = "Case Number", ylab = "Total Cast Likes")
#Plot of Director Facebook Likes
plot(DFL, type="b", xlab = "Case Number", ylab = "Director Facebook Likes")

#Plot of Critic Reviews
plot(criticReviews, type="b", xlab = "Case Number", ylab = "Critic Reviews")

The 20 months of case_number are in no particular order and not related to a chronological time sequence. They are simply 20 independent use case studies. Since each case is independent, we can reorder them. To reveal a potential trend, consider reordering the gross column from low to high and see how the other four variables behave.

newdata = mydata[order(gross),]
newGross = newdata$gross
newUserVotes = newdata$users_votes
newTCL = newdata$total_cast_likes
newDFL = newdata$director_fb_likes
newCriticReviews = newdata$critic_reviews
#Layout allows us to see all 5 graphs on one screen
layout(matrix(1:5,1,2,2))
data length [5] is not a sub-multiple or multiple of the number of columns [2]
plot(newGross, type="b", xlab = "Case Number", ylab = "Sales in $1,000")
plot(newUserVotes, type="b", xlab = "Case Number", ylab = "User Votes")

plot(newTCL, type="b", xlab = "Case Number", ylab = "Total Cast Likes")
plot(newDFL, type="b", xlab = "Case Number", ylab = "Director Facebook Likes")

plot(newCriticReviews, type="b", xlab = "Case Number", ylab = "Critic Reviews")


Task 3

Given a sales value of 10,214,013, calculate the corresponding z-value or z-score using the mean and standard deviation calculations conducted in task 1.

We know that the z-score = (x - mean)/sd. So, input this into the R code where x=10214013, mean=48468408, and stdev = 68452990 which we found above.

Based on the z-values, how would you rate a $10214013 gross value: poor, average, good, or very good performance? Explain your logic.

gross_zscore = (10214013-48468408)/68452990
gross_zscore
[1] -0.5588418

Answer to Task 3:

The gross’ Z-Score of -0.559 is a poor score. The -0.559 represents a place between 0 (exactly average) and -1 (in the bottom ~16% which is poor) but is closer to -1 so the percentile is probably around the bottom 30th percentile, which is obviously bad.

LS0tDQp0aXRsZTogIkJ1c2luZXNzIEFuYWx5dGljcyBMYWIgV29ya3NoZWV0IDAzIg0KYXV0aG9yOiAiTWFyayBHcnVobGtlIg0KZGF0ZTogIlN1bW1lciAyMDE3Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQpzdWJ0aXRsZTogQ01FIEdyb3VwIEZvdW5kYXRpb24gQnVzaW5lc3MgQW5hbHl0aWNzIExhYg0KLS0tDQoNCiMjIyBUYXNrIDENCg0KRmlyc3QgYmVnaW4gYnkgcmVhZGluZyBpbiB0aGUgZGF0YSBmcm9tIHRoZSAnbWFya2V0aW5nLmNzdicgZmlsZSwgYW5kIHZpZXdpbmcgaXQgdG8gbWFrZSBzdXJlIHdlIHNlZSBpdCBiZWluZyByZWFkIGluIGNvcnJlY3RseS4gDQoNCmBgYHtyfQ0KbXlkYXRhID0gcmVhZC5jc3YoZmlsZT0iZGF0YS9yb3R0ZW50b21hdG9lcy5jc3YiKQ0KaGVhZChteWRhdGEpDQpgYGANCg0KTm93IGNhbGN1bGF0ZSB0aGUgUmFuZ2UsIE1pbiwgTWF4LCBNZWFuLCBTVERFViwgYW5kIFZhcmlhbmNlIGZvciBlYWNoIHZhcmlhYmxlLiBCZWxvdyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBjb21wdXRlIHRoZSBpdGVtcyBmb3IgdGhlIHZhcmlhYmxlICdncm9zcycuDQoNCmdyb3NzDQpgYGB7cn0NCmdyb3NzID0gbXlkYXRhJGdyb3NzDQojTWF4IEdyb3NzDQptYXhfZ3Jvc3MgPSBtYXgoZ3Jvc3MsIG5hLnJtID0gVFJVRSkNCm1heF9ncm9zcw0KDQojTWluIEdyb3NzDQptaW5fZ3Jvc3MgPSBtaW4oZ3Jvc3MsIG5hLnJtID0gVFJVRSkNCm1pbl9ncm9zcw0KDQojUmFuZ2UNCnJhbmdlX2dyb3NzID0gbWF4X2dyb3NzLW1pbl9ncm9zcw0KcmFuZ2VfZ3Jvc3MNCg0KI01lYW4NCm1lYW5fZ3Jvc3MgPSBtZWFuKGdyb3NzLCBuYS5ybSA9IFRSVUUpDQptZWFuX2dyb3NzDQoNCiNTdGFuZGFyZCBEZXZpYXRpb24NCnNkX2dyb3NzID0gc2QoZ3Jvc3MsIG5hLnJtID0gVFJVRSkNCnNkX2dyb3NzDQoNCiNWYXJpYW5jZQ0KdmFyX2dyb3NzID0gdmFyKGdyb3NzLCBuYS5ybSA9IFRSVUUpDQp2YXJfZ3Jvc3MNCg0KYGBgDQpVc2VyIFZvdGVzLCBUb3RhbCBDYXN0IExpa2VzLCBEaXJlY3RvciBGYWNlYm9vayBMaWtlcywgQ3JpdGljIFJldmlld3MNCmBgYHtyfQ0KI0NhbGxpbmcNCnVzZXJWb3RlcyA9IG15ZGF0YSR1c2Vyc192b3Rlcw0KVENMID0gbXlkYXRhJHRvdGFsX2Nhc3RfbGlrZXMNCkRGTCA9IG15ZGF0YSRkaXJlY3Rvcl9mYl9saWtlcw0KY3JpdGljUmV2aWV3cyA9IG15ZGF0YSRjcml0aWNfcmV2aWV3cw0KDQojTWF4DQptYXhfdXNlclZvdGVzID0gbWF4KHVzZXJWb3RlcywgbmEucm0gPSBUUlVFKQ0KbWF4X1RDTCA9IG1heChUQ0wsIG5hLnJtID0gVFJVRSkNCm1heF9ERkwgPSBtYXgoREZMLCBuYS5ybSA9IFRSVUUpDQptYXhfY3JpdGljUmV2aWV3cyA9IG1heChjcml0aWNSZXZpZXdzLCBuYS5ybSA9IFRSVUUpDQoNCm1heF91c2VyVm90ZXMNCm1heF9UQ0wNCm1heF9ERkwNCm1heF9jcml0aWNSZXZpZXdzDQoNCiNNaW4NCm1pbl91c2VyVm90ZXMgPSBtaW4odXNlclZvdGVzLCBuYS5ybSA9IFRSVUUpDQptaW5fVENMID0gbWluKFRDTCwgbmEucm0gPSBUUlVFKQ0KbWluX0RGTCA9IG1pbihERkwsIG5hLnJtID0gVFJVRSkNCm1pbl9jcml0aWNSZXZpZXdzID0gbWluKGNyaXRpY1Jldmlld3MsIG5hLnJtID0gVFJVRSkNCg0KbWluX3VzZXJWb3Rlcw0KbWluX1RDTA0KbWluX0RGTA0KbWluX2NyaXRpY1Jldmlld3MNCg0KI1JhbmdlDQpyYW5nZV91c2VyVm90ZXMgPSBtYXhfdXNlclZvdGVzIC0gbWluX3VzZXJWb3Rlcw0KcmFuZ2VfVENMID0gbWF4X1RDTCAtIG1pbl9UQ0wNCnJhbmdlX0RGTCA9IG1heF9ERkwgLSBtaW5fREZMDQpyYW5nZV9jcml0aWNSZXZpZXdzID0gbWF4X2NyaXRpY1Jldmlld3MgLSBtaW5fY3JpdGljUmV2aWV3cw0KDQpyYW5nZV91c2VyVm90ZXMNCnJhbmdlX1RDTA0KcmFuZ2VfREZMDQpyYW5nZV9jcml0aWNSZXZpZXdzDQoNCiNNZWFuDQptZWFuX3VzZXJWb3RlcyA9IG1lYW4odXNlclZvdGVzLCBuYS5ybSA9IFRSVUUpDQptZWFuX1RDTCA9IG1lYW4oVENMLCBuYS5ybSA9IFRSVUUpDQptZWFuX0RGTCA9IG1lYW4oREZMLCBuYS5ybSA9IFRSVUUpDQptZWFuX2NyaXRpY1Jldmlld3MgPSBtZWFuKGNyaXRpY1Jldmlld3MsIG5hLnJtID0gVFJVRSkNCg0KbWVhbl91c2VyVm90ZXMNCm1lYW5fVENMDQptZWFuX0RGTA0KbWVhbl9jcml0aWNSZXZpZXdzDQoNCiNTdGFuZGFyZCBEZXZpYXRpb24NCnNkX3VzZXJWb3RlcyA9IHNkKHVzZXJWb3RlcywgbmEucm0gPSBUUlVFKQ0Kc2RfVENMID0gc2QoVENMLCBuYS5ybSA9IFRSVUUpDQpzZF9ERkwgPSBzZChERkwsIG5hLnJtID0gVFJVRSkNCnNkX2NyaXRpY1Jldmlld3MgPSBzZChjcml0aWNSZXZpZXdzLCBuYS5ybSA9IFRSVUUpDQoNCnNkX3VzZXJWb3Rlcw0Kc2RfVENMDQpzZF9ERkwNCnNkX2NyaXRpY1Jldmlld3MNCg0KI3ZhcmlhbmNlDQp2YXJfdXNlclZvdGVzID0gdmFyKHVzZXJWb3RlcywgbmEucm0gPSBUUlVFKQ0KdmFyX1RDTCA9IHZhcihUQ0wsIG5hLnJtID0gVFJVRSkNCnZhcl9ERkwgPSB2YXIoREZMLCBuYS5ybSA9IFRSVUUpDQp2YXJfY3JpdGljUmV2aWV3cyA9IHZhcihjcml0aWNSZXZpZXdzLCBuYS5ybSA9IFRSVUUpDQoNCnZhcl91c2VyVm90ZXMNCnZhcl9UQ0wNCnZhcl9ERkwNCnZhcl9jcml0aWNSZXZpZXdzDQpgYGANCg0KLS0tLS0tLS0tLQ0KDQojIyMgVGFzayAyDQoNCkFuIGVhc3kgd2F5IHRvIGNhbGN1bGF0ZSBhbGwgb2YgdGhlc2Ugc3RhdGlzdGljcyBvZiBhbGwgb2YgdGhlc2UgdmFyaWFibGVzIGlzIHdpdGggdGhlIHN1bW1hcnkgZnVuY3Rpb24uIEJlbG93IGlzIGFuIGV4YW1wbGUuDQoNCmBgYHtyfQ0Kc3VtbWFyeShteWRhdGEpDQpgYGANCg0KVGhlcmUgYXJlIHNvbWUgc3RhdGlzdGljcyBub3QgY2FwdHVyZWQgaGVyZSBsaWtlIHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgdmFyaWFuY2UsIGJ1dCB0aGVyZSBpcyBhbiBlYXN5IGFuZCBxdWljayB3YXkgdG8gZmluZCBtb3N0IG9mIHlvdXIgYmFzaWMgc3RhdGlzdGljcy4gDQoNCk5vdywgd2Ugd2lsbCBwcm9kdWNlIGEgYmFzaWMgYmxvdCBvZiB0aGUgJ2dyb3NzJyB2YXJpYWJsZSAuIEhlcmUgd2UgdXRpbGl6ZSB0aGUgcGxvdCBmdW5jdGlvbiBhbmQgd2l0aGluIHRoZSBwbG90IGZ1bmN0aW9uIHdlIGNhbGwgdGhlIHZhcmlhYmxlIHdlIHdhbnQgdG8gcGxvdC4gDQoNCmBgYHtyfQ0KcGxvdChncm9zcykNCmBgYA0KDQpXaGVuIGxvb2tpbmcgYXQgdGhpcyBncmFwaCB3ZSBjYW5ub3QgdHJ1bHkgY2FwdHVyZSB0aGUgZGF0YSBvciBzZWUgYSBjbGVhciBwYXR0ZXJuLiBBIGJldHRlciB3YXkgdG8gdmlzdWFsaXplIHRoaXMgcGxvdCB3b3VsZCBiZSB0byByZS1vcmRlciB0aGUgZGF0YSBiYXNlZCBvbiBpbmNyZWFzaW5nIHNhbGVzLiANCg0KYGBge3J9DQojeGxhYiBsYWJlbHMgdGhlIHggYXhpcywgeWxhYiBsYWJlbHMgdGhlIHkgYXhpcw0KcGxvdChncm9zcywgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIkdyb3NzIGluICQxLDAwMCIpIA0KYGBgDQoNClRoZXJlIGFyZSBmdXJ0aGVyIHdheXMgdG8gY3VzdG9taXplIHBsb3RzLCBzdWNoIGFzIGNoYW5naW5nIHRoZSBjb2xvcnMgb2YgdGhlIGxpbmVzLCBhZGRpbmcgYSBoZWFkaW5nLCBvciBldmVuIG1ha2luZyB0aGVtIGludGVyYWN0aXZlLiANCg0KTm93LCBsZXRzIHBsb3QgdGhlIHNhbGVzIGdyYXBoLCBhbG9uZ3NpZGUgcmFkaW8sIHBhcGVyLCBhbmQgdHYgd2hpY2ggeW91IHdpbGwgY29kZS4gTWFrZSBzdXJlIHRvIHJ1biB0aGUgY29kZSBpbiB0aGUgc2FtZSBjaHVuayBzbyB0aGV5IGFyZSBvbiB0aGUgc2FtZSBsYXlvdXQuDQoNCmBgYHtyfQ0KI0xheW91dCBhbGxvd3MgdXMgdG8gc2VlIGFsbCA0IGdyYXBocyBvbiBvbmUgc2NyZWVuDQpsYXlvdXQobWF0cml4KDE6NSwxLDIsMikpDQoNCiNFeGFtcGxlIG9mIGhvdyB0byBwbG90IHRoZSBzYWxlcyB2YXJpYWJsZQ0KcGxvdChncm9zcywgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIkdyb3NzIGluICQxLDAwMCIpIA0KDQojUGxvdCBvZiBVc2VyIFZvdGVzDQpwbG90KHVzZXJWb3RlcywgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIlVzZXIgVm90ZXMiKQ0KDQojUGxvdCBvZiBUb3RhbCBDYXN0IExpa2VzDQpwbG90KFRDTCwgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIlRvdGFsIENhc3QgTGlrZXMiKQ0KDQojUGxvdCBvZiBEaXJlY3RvciBGYWNlYm9vayBMaWtlcw0KcGxvdChERkwsIHR5cGU9ImIiLCB4bGFiID0gIkNhc2UgTnVtYmVyIiwgeWxhYiA9ICJEaXJlY3RvciBGYWNlYm9vayBMaWtlcyIpDQoNCiNQbG90IG9mIENyaXRpYyBSZXZpZXdzDQpwbG90KGNyaXRpY1Jldmlld3MsIHR5cGU9ImIiLCB4bGFiID0gIkNhc2UgTnVtYmVyIiwgeWxhYiA9ICJDcml0aWMgUmV2aWV3cyIpDQpgYGANCg0KVGhlIDIwIG1vbnRocyBvZiBjYXNlX251bWJlciBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlciBhbmQgbm90IHJlbGF0ZWQgdG8gYSBjaHJvbm9sb2dpY2FsIHRpbWUgc2VxdWVuY2UuIFRoZXkgYXJlIHNpbXBseSAyMCBpbmRlcGVuZGVudCB1c2UgY2FzZSBzdHVkaWVzLiBTaW5jZSBlYWNoIGNhc2UgaXMgaW5kZXBlbmRlbnQsIHdlIGNhbiByZW9yZGVyIHRoZW0uIFRvIHJldmVhbCBhIHBvdGVudGlhbCB0cmVuZCwgY29uc2lkZXIgcmVvcmRlcmluZyB0aGUgZ3Jvc3MgY29sdW1uIGZyb20gbG93IHRvIGhpZ2ggYW5kIHNlZSBob3cgdGhlIG90aGVyIGZvdXIgdmFyaWFibGVzIGJlaGF2ZS4NCg0KYGBge3J9DQpuZXdkYXRhID0gbXlkYXRhW29yZGVyKGdyb3NzKSxdDQpuZXdHcm9zcyA9IG5ld2RhdGEkZ3Jvc3MNCm5ld1VzZXJWb3RlcyA9IG5ld2RhdGEkdXNlcnNfdm90ZXMNCm5ld1RDTCA9IG5ld2RhdGEkdG90YWxfY2FzdF9saWtlcw0KbmV3REZMID0gbmV3ZGF0YSRkaXJlY3Rvcl9mYl9saWtlcw0KbmV3Q3JpdGljUmV2aWV3cyA9IG5ld2RhdGEkY3JpdGljX3Jldmlld3MNCmBgYA0KDQoNCmBgYHtyfQ0KI0xheW91dCBhbGxvd3MgdXMgdG8gc2VlIGFsbCA1IGdyYXBocyBvbiBvbmUgc2NyZWVuDQpsYXlvdXQobWF0cml4KDE6NSwxLDIsMikpDQoNCnBsb3QobmV3R3Jvc3MsIHR5cGU9ImIiLCB4bGFiID0gIkNhc2UgTnVtYmVyIiwgeWxhYiA9ICJTYWxlcyBpbiAkMSwwMDAiKQ0KDQpwbG90KG5ld1VzZXJWb3RlcywgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIlVzZXIgVm90ZXMiKQ0KDQpwbG90KG5ld1RDTCwgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIlRvdGFsIENhc3QgTGlrZXMiKQ0KDQpwbG90KG5ld0RGTCwgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIkRpcmVjdG9yIEZhY2Vib29rIExpa2VzIikNCg0KcGxvdChuZXdDcml0aWNSZXZpZXdzLCB0eXBlPSJiIiwgeGxhYiA9ICJDYXNlIE51bWJlciIsIHlsYWIgPSAiQ3JpdGljIFJldmlld3MiKQ0KYGBgDQoNCi0tLS0tLS0tLS0NCg0KIyMjIFRhc2sgMw0KDQpHaXZlbiBhIHNhbGVzIHZhbHVlIG9mIDEwLDIxNCwwMTMsIGNhbGN1bGF0ZSB0aGUgY29ycmVzcG9uZGluZyB6LXZhbHVlIG9yIHotc2NvcmUgdXNpbmcgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBjYWxjdWxhdGlvbnMgY29uZHVjdGVkIGluIHRhc2sgMS4NCg0KV2Uga25vdyB0aGF0IHRoZSBgei1zY29yZSA9ICh4IC0gbWVhbikvc2RgLiBTbywgaW5wdXQgdGhpcyBpbnRvIHRoZSBSIGNvZGUgd2hlcmUgYHg9MTAyMTQwMTNgLCBgbWVhbj00ODQ2ODQwOGAsIGFuZCBgc3RkZXYgPSA2ODQ1Mjk5MGAgd2hpY2ggd2UgZm91bmQgYWJvdmUuDQoNCkJhc2VkIG9uIHRoZSB6LXZhbHVlcywgaG93IHdvdWxkIHlvdSByYXRlIGEgYCQxMDIxNDAxM2AgZ3Jvc3MgdmFsdWU6IHBvb3IsIGF2ZXJhZ2UsIGdvb2QsIG9yIHZlcnkgZ29vZCBwZXJmb3JtYW5jZT8gRXhwbGFpbiB5b3VyIGxvZ2ljLiANCg0KYGBge3J9DQpncm9zc196c2NvcmUgPSAoMTAyMTQwMTMtNDg0Njg0MDgpLzY4NDUyOTkwDQpncm9zc196c2NvcmUNCmBgYA0KI0Fuc3dlciB0byBUYXNrIDM6DQpUaGUgZ3Jvc3MnIFotU2NvcmUgb2YgLTAuNTU5IGlzIGEgcG9vciBzY29yZS4gVGhlIC0wLjU1OSByZXByZXNlbnRzIGEgcGxhY2UgYmV0d2VlbiAwIChleGFjdGx5IGF2ZXJhZ2UpIGFuZCAtMSAoaW4gdGhlIGJvdHRvbSB+MTYlIHdoaWNoIGlzIHBvb3IpIGJ1dCBpcyBjbG9zZXIgdG8gLTEgc28gdGhlIHBlcmNlbnRpbGUgaXMgcHJvYmFibHkgYXJvdW5kIHRoZSBib3R0b20gMzB0aCBwZXJjZW50aWxlLCB3aGljaCBpcyBvYnZpb3VzbHkgYmFkLg0K