About

Quantitative Descriptive Analytics aims to gather an in-depth understanding of the underlying reasons and motivations for an event or observation. It is typically represented with visuals or charts.

Qualitative Descriptive Analytics focuses on investigating a phenomenon via statistical, mathematical, and computationaly techniques. It aims to quantify an event with metrics and numbers.

In this lab, we will explore the marketing data set and understand it better through simple statistics.

Setup

Make sure to download the folder titled ‘bsad_lab03’ zip folder and extract the folder to unzip it. Next, we must set this folder as the working directory. The way to do this is to open R Studio, go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Now, follow the directions to complete the lab.


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)
title = mydata$title
title = sub("Â","",title)
head(title)
[1] "Avatar "                                                
[2] "Pirates of the Caribbean: At World's End "              
[3] "Spectre "                                               
[4] "The Dark Knight Rises "                                 
[5] "Star Wars: Episode VII - The Force Awakens             "
[6] "John Carter "                                           

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 ‘sales’. Follow the example and do the same for radio, paper, tv, and pos.

UsersVotes = mydata$users_votes
head(UsersVotes)
[1]  886204  471220  275868 1144337       8  212204
#Max
maxUsersVotes = max(UsersVotes)
maxUsersVotes
[1] 1689764
#Min
minUsersVotes = min(UsersVotes)
minUsersVotes
[1] 5
#Mean
averageUsersVotes = mean(UsersVotes)
averageUsersVotes
[1] 83668.16
#Range
rangeUsersVotes = maxUsersVotes - minUsersVotes
rangeUsersVotes
[1] 1689759
#Standard Deviation
sdUsersVotes = sd(UsersVotes)
sdUsersVotes
[1] 138485.3
#Variance
varUsersVotes = var(UsersVotes)
varUsersVotes
[1] 19178166353

Director Facebook Likes

TotalCastLikes = mydata$total_cast_likes
head(TotalCastLikes)
[1]   4834  48350  11700 106759    143   1873
#Max
maxTotalCastLikes = max(TotalCastLikes)
maxTotalCastLikes
[1] 656730
#Min
minTotalCastLikes = min(TotalCastLikes)
minTotalCastLikes
[1] 0
#Mean
averageTotalCastLikes = mean(TotalCastLikes)
averageTotalCastLikes
[1] 9699.064
#Range
rangeTotalCastLikes = maxTotalCastLikes - minTotalCastLikes
rangeTotalCastLikes
[1] 656730
#Standard Deviation 
sdTotalCastLikes = sd(TotalCastLikes)
sdTotalCastLikes
[1] 18163.8
#Variance
varTotalCastLikes = var(TotalCastLikes)
varTotalCastLikes
[1] 329923599
DirectorFacebookLikes = mydata$director_fb_likes
DirectorFacebookLikes = DirectorFacebookLikes[!is.na(DirectorFacebookLikes)]
head(DirectorFacebookLikes)
[1]     0   563     0 22000   131   475
#Max
maxDirectorFacebookLikes = max(DirectorFacebookLikes)
maxDirectorFacebookLikes
[1] 23000
#Min
minDirectorFacebookLikes = min(DirectorFacebookLikes)
minDirectorFacebookLikes
[1] 0
#Mean
averageDirectorFacebookLikes = mean(DirectorFacebookLikes)
averageDirectorFacebookLikes
[1] 686.5092
summary(mydata)
                        title                       genres                 director   
 Ben-Hur                  :   3   Drama               : 236                   : 104  
 Halloween                :   3   Comedy              : 209   Steven Spielberg:  26  
 Home                     :   3   Comedy|Drama        : 191   Woody Allen     :  22  
 King Kong                :   3   Comedy|Drama|Romance: 187   Clint Eastwood  :  20  
 Pan                      :   3   Comedy|Romance      : 158   Martin Scorsese :  20  
 The Fast and the Furious :   3   Drama|Romance       : 152   Ridley Scott    :  17  
 (Other)                   :5025   (Other)             :3910   (Other)         :4834  
               actor1                 actor2                actor3         length     
 Robert De Niro   :  49   Morgan Freeman :  20                 :  23   Min.   :  7.0  
 Johnny Depp      :  41   Charlize Theron:  15   Ben Mendelsohn:   8   1st Qu.: 93.0  
 Nicolas Cage     :  33   Brad Pitt      :  14   John Heard    :   8   Median :103.0  
 J.K. Simmons     :  31                  :  13   Steve Coogan  :   8   Mean   :107.2  
 Bruce Willis     :  30   James Franco   :  11   Anne Hathaway :   7   3rd Qu.:118.0  
 Denzel Washington:  30   Meryl Streep   :  11   Jon Gries     :   7   Max.   :511.0  
 (Other)          :4829   (Other)        :4959   (Other)       :4982   NA's   :15     
     budget          director_fb_likes actor1_fb_likes  actor2_fb_likes  actor3_fb_likes  
 Min.   :2.180e+02   Min.   :    0.0   Min.   :     0   Min.   :     0   Min.   :    0.0  
 1st Qu.:6.000e+06   1st Qu.:    7.0   1st Qu.:   614   1st Qu.:   281   1st Qu.:  133.0  
 Median :2.000e+07   Median :   49.0   Median :   988   Median :   595   Median :  371.5  
 Mean   :3.975e+07   Mean   :  686.5   Mean   :  6560   Mean   :  1652   Mean   :  645.0  
 3rd Qu.:4.500e+07   3rd Qu.:  194.5   3rd Qu.: 11000   3rd Qu.:   918   3rd Qu.:  636.0  
 Max.   :1.222e+10   Max.   :23000.0   Max.   :640000   Max.   :137000   Max.   :23000.0  
 NA's   :492         NA's   :104       NA's   :7        NA's   :13       NA's   :23       
 total_cast_likes    fb_likes      critic_reviews  users_reviews     users_votes     
 Min.   :     0   Min.   :     0   Min.   :  1.0   Min.   :   1.0   Min.   :      5  
 1st Qu.:  1411   1st Qu.:     0   1st Qu.: 50.0   1st Qu.:  65.0   1st Qu.:   8594  
 Median :  3090   Median :   166   Median :110.0   Median : 156.0   Median :  34359  
 Mean   :  9699   Mean   :  7526   Mean   :140.2   Mean   : 272.8   Mean   :  83668  
 3rd Qu.: 13756   3rd Qu.:  3000   3rd Qu.:195.0   3rd Qu.: 326.0   3rd Qu.:  96309  
 Max.   :656730   Max.   :349000   Max.   :813.0   Max.   :5060.0   Max.   :1689764  
                                   NA's   :50      NA's   :21                        
     score        aspect_ratio       gross                year     
 Min.   :1.600   Min.   : 1.18   Min.   :      162   Min.   :1916  
 1st Qu.:5.800   1st Qu.: 1.85   1st Qu.:  5340988   1st Qu.:1999  
 Median :6.600   Median : 2.35   Median : 25517500   Median :2005  
 Mean   :6.442   Mean   : 2.22   Mean   : 48468408   Mean   :2002  
 3rd Qu.:7.200   3rd Qu.: 2.35   3rd Qu.: 62309438   3rd Qu.:2011  
 Max.   :9.500   Max.   :16.00   Max.   :760505847   Max.   :2016  
                 NA's   :329     NA's   :884         NA's   :108   
#Range
rangeDirectorFacebookLikes = maxDirectorFacebookLikes - minDirectorFacebookLikes
rangeDirectorFacebookLikes
[1] 23000
#Standard Deviation
sdDirectorFacebookLikes = sd(DirectorFacebookLikes)
sdDirectorFacebookLikes
#Variance
varDirectorFacebookLikes = var(DirectorFacebookLikes)
varDirectorFacebookLikes
gross = mydata$gross
gross = gross[!is.na(gross)]
head(gross)
#Max
maxGross = max(gross)
maxGross
#Min
minGross = min(gross)
minGross
#Mean
averageGross = mean(gross)
averageGross
#Range
rangeGross = maxGross - minGross
rangeGross
#Standard Deviation
sdGross = sd(gross)
sdGross
#Variance
varGross = var(gross)
varGross
budget = mydata$budget
budget = budget[!is.na(budget)]
head(budget)
[1] 237000000 300000000 245000000 250000000 263700000 258000000
#Maximum
maxbudget = max(budget)
maxbudget
[1] 12215500000
#MIN
minbudget = min(budget)
minbudget
[1] 218
#Mean
averagebudget = mean(budget)
averagebudget
[1] 39752620
#Range
rangebudget = maxbudget - minbudget
rangebudget
[1] 12215499782
#Standard Deviation
sdbudget = sd(budget)
sdbudget
[1] 206114898
#Variance
varbudget = var(budget)
varbudget
[1] 4.248335e+16

Follow the example and do the same for radio, paper, tv, and pos. Use the worksheet given to try the different commands to find the max, min, and range.


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

plot(budget)

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.

## function (x, y, ...) 
## UseMethod("plot")
## <bytecode: 0x7f9d91fdd150>
## <environment: namespace:graphics>
#Budget is reorder from least to most expensive budget
leastexpensiveBudget = sort(budget)
#xlab labels the x axis, ylab labels the y axis
plot(leastexpensiveBudget, type="b", xlab = "Movie", ylab = "Movie Budget", col.main = "Red")

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(matrix(1:4,2,2))
#Director Facebook Likes
ascendingDirectorFacebookLikes = sort(DirectorFacebookLikes)
plot(ascendingDirectorFacebookLikes, type="b", xlab = "Movie", ylab = "Director Facebook Likes")
title ("Director Facebook Likes by Movie")
#Total Cast Likes
ascendingTotalCastLikes = sort(TotalCastLikes)
plot(ascendingTotalCastLikes, type="b", xlab = "Movie", ylab = "Total Cast Likes")
title ("Total Cast Likes by Movie")
#Gross
ascendingUsersVotes = sort(UsersVotes)
plot(ascendingUsersVotes, type="b", xlab = "Movie", ylab = "UsersVotes")
title ("Users Votes by Movie")
#Budget
ascendingBudget = sort(budget)
plot(ascendingBudget, type="b", xlab = "Movie", ylab = "Budget")
title ("Budget")





Task 3

Given a sales value of 25000, 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=25000, mean=16717.2, and stdev = 2617.0521 which we found above.

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

#Budget 
budgetZscore = (10234001 - averagebudget) / sdbudget
budgetZscore
[1] -0.1432144
#Total Cast Likes
TotalCastLikesZscore = (10234001 - averageTotalCastLikes) / sdTotalCastLikes
TotalCastLikesZscore
[1] 562.8945
#Director Facebook Likes 
  DirectorFacebookLikesZscore = (10234001 - averageDirectorFacebookLikes) / sdDirectorFacebookLikes
Error: object 'sdDirectorFacebookLikes' not found
#Total Cast Likes 
totalcastlikesZscore = (10234001 - averageTotalCastLikes) / sdTotalCastLikes
totalcastlikesZscore
[1] 562.8945
# Budget
zscoreBudget = (budget - averagebudget) / sdbudget
# Total Cast Likes
zscoreTotalCastLikes = (TotalCastLikes - averageTotalCastLikes) / sdTotalCastLikes
# Director Facebook Likes
zscoreDirectorFacebookLikes = (DirectorFacebookLikes - averageDirectorFacebookLikes) / sdDirectorFacebookLikes
Error: object 'sdDirectorFacebookLikes' not found
#Histogram Graphs of Zscores 
layout(matrix(1:4, 2,2))
hist(zscoreBudget)

hist(zscoreGross)
Error in hist(zscoreGross) : object 'zscoreGross' not found
LS0tCnRpdGxlOiAiQnVzaW5lc3MgQW5hbHl0aWNzIExhYiBXb3Jrc2hlZXQgMDMiCmF1dGhvcjogIkVsaW8gVmVudG8iCmRhdGU6ICJTdW1tZXIgMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CnN1YnRpdGxlOiBDTUUgR3JvdXAgRm91bmRhdGlvbiBCdXNpbmVzcyBBbmFseXRpY3MgTGFiCi0tLQoKIyMjIEFib3V0CgpRdWFudGl0YXRpdmUgRGVzY3JpcHRpdmUgQW5hbHl0aWNzIGFpbXMgdG8gZ2F0aGVyIGFuIGluLWRlcHRoIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHVuZGVybHlpbmcgcmVhc29ucyBhbmQgbW90aXZhdGlvbnMgZm9yIGFuIGV2ZW50IG9yIG9ic2VydmF0aW9uLiBJdCBpcyB0eXBpY2FsbHkgcmVwcmVzZW50ZWQgd2l0aCB2aXN1YWxzIG9yIGNoYXJ0cy4gCgpRdWFsaXRhdGl2ZSBEZXNjcmlwdGl2ZSBBbmFseXRpY3MgZm9jdXNlcyBvbiBpbnZlc3RpZ2F0aW5nIGEgcGhlbm9tZW5vbiB2aWEgc3RhdGlzdGljYWwsIG1hdGhlbWF0aWNhbCwgYW5kIGNvbXB1dGF0aW9uYWx5IHRlY2huaXF1ZXMuIEl0IGFpbXMgdG8gcXVhbnRpZnkgYW4gZXZlbnQgd2l0aCBtZXRyaWNzIGFuZCBudW1iZXJzLiAKCkluIHRoaXMgbGFiLCB3ZSB3aWxsIGV4cGxvcmUgdGhlIG1hcmtldGluZyBkYXRhIHNldCBhbmQgdW5kZXJzdGFuZCBpdCBiZXR0ZXIgdGhyb3VnaCBzaW1wbGUgc3RhdGlzdGljcy4gCgojIyMgU2V0dXAKCk1ha2Ugc3VyZSB0byBkb3dubG9hZCB0aGUgZm9sZGVyIHRpdGxlZCAnYnNhZF9sYWIwMycgemlwIGZvbGRlciBhbmQgZXh0cmFjdCB0aGUKZm9sZGVyIHRvIHVuemlwIGl0LiBOZXh0LCB3ZSBtdXN0IHNldCB0aGlzIGZvbGRlciBhcyB0aGUgd29ya2luZyBkaXJlY3RvcnkuIFRoZQp3YXkgdG8gZG8gdGhpcyBpcyB0byBvcGVuIFIgU3R1ZGlvLCBnbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZwpEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gTm93LCBmb2xsb3cgdGhlCmRpcmVjdGlvbnMgdG8gY29tcGxldGUgdGhlIGxhYi4KCi0tLS0tLS0tLS0KCiMjIyBUYXNrIDEKCkZpcnN0IGJlZ2luIGJ5IHJlYWRpbmcgaW4gdGhlIGRhdGEgZnJvbSB0aGUgJ21hcmtldGluZy5jc3YnIGZpbGUsIGFuZCB2aWV3aW5nIGl0IHRvIG1ha2Ugc3VyZSB3ZSBzZWUgaXQgYmVpbmcgcmVhZCBpbiBjb3JyZWN0bHkuIAoKYGBge3J9Cm15ZGF0YSA9IHJlYWQuY3N2KGZpbGU9ImRhdGEvcm90dGVudG9tYXRvZXMuY3N2IikKaGVhZChteWRhdGEpCmBgYAoKCmBgYHtyfQp0aXRsZSA9IG15ZGF0YSR0aXRsZQp0aXRsZSA9IHN1Yigiw4IiLCIiLHRpdGxlKQpoZWFkKHRpdGxlKQpgYGAKCiAKTm93IGNhbGN1bGF0ZSB0aGUgUmFuZ2UsIE1pbiwgTWF4LCBNZWFuLCBTVERFViwgYW5kIFZhcmlhbmNlIGZvciBlYWNoIHZhcmlhYmxlLiBCZWxvdyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBjb21wdXRlIHRoZSBpdGVtcyBmb3IgdGhlIHZhcmlhYmxlICdzYWxlcycuIEZvbGxvdyB0aGUgZXhhbXBsZSBhbmQgZG8gdGhlIHNhbWUgZm9yIHJhZGlvLCBwYXBlciwgdHYsIGFuZCBwb3MuIAoKYGBge3J9ClVzZXJzVm90ZXMgPSBteWRhdGEkdXNlcnNfdm90ZXMKaGVhZChVc2Vyc1ZvdGVzKQpgYGAKCmBgYHtyfQojTWF4Cm1heFVzZXJzVm90ZXMgPSBtYXgoVXNlcnNWb3RlcykKbWF4VXNlcnNWb3RlcwpgYGAKCmBgYHtyfQojTWluCm1pblVzZXJzVm90ZXMgPSBtaW4oVXNlcnNWb3RlcykKbWluVXNlcnNWb3RlcwpgYGAKCmBgYHtyfQojTWVhbgphdmVyYWdlVXNlcnNWb3RlcyA9IG1lYW4oVXNlcnNWb3RlcykKYXZlcmFnZVVzZXJzVm90ZXMKYGBgCgoKYGBge3J9CiNSYW5nZQpyYW5nZVVzZXJzVm90ZXMgPSBtYXhVc2Vyc1ZvdGVzIC0gbWluVXNlcnNWb3RlcwpyYW5nZVVzZXJzVm90ZXMKYGBgCgoKYGBge3J9CiNTdGFuZGFyZCBEZXZpYXRpb24Kc2RVc2Vyc1ZvdGVzID0gc2QoVXNlcnNWb3RlcykKc2RVc2Vyc1ZvdGVzCmBgYAoKYGBge3J9CiNWYXJpYW5jZQp2YXJVc2Vyc1ZvdGVzID0gdmFyKFVzZXJzVm90ZXMpCnZhclVzZXJzVm90ZXMKYGBgCgpEaXJlY3RvciBGYWNlYm9vayBMaWtlcwoKYGBge3J9ClRvdGFsQ2FzdExpa2VzID0gbXlkYXRhJHRvdGFsX2Nhc3RfbGlrZXMKaGVhZChUb3RhbENhc3RMaWtlcykKYGBgCgoKYGBge3J9CiNNYXgKbWF4VG90YWxDYXN0TGlrZXMgPSBtYXgoVG90YWxDYXN0TGlrZXMpCm1heFRvdGFsQ2FzdExpa2VzCmBgYAoKYGBge3J9CiNNaW4KbWluVG90YWxDYXN0TGlrZXMgPSBtaW4oVG90YWxDYXN0TGlrZXMpCm1pblRvdGFsQ2FzdExpa2VzCmBgYAoKCmBgYHtyfQojTWVhbgphdmVyYWdlVG90YWxDYXN0TGlrZXMgPSBtZWFuKFRvdGFsQ2FzdExpa2VzKQphdmVyYWdlVG90YWxDYXN0TGlrZXMKYGBgCgoKYGBge3J9CiNSYW5nZQpyYW5nZVRvdGFsQ2FzdExpa2VzID0gbWF4VG90YWxDYXN0TGlrZXMgLSBtaW5Ub3RhbENhc3RMaWtlcwpyYW5nZVRvdGFsQ2FzdExpa2VzCmBgYAoKYGBge3J9CiNTdGFuZGFyZCBEZXZpYXRpb24gCnNkVG90YWxDYXN0TGlrZXMgPSBzZChUb3RhbENhc3RMaWtlcykKc2RUb3RhbENhc3RMaWtlcwpgYGAKCmBgYHtyfQojVmFyaWFuY2UKdmFyVG90YWxDYXN0TGlrZXMgPSB2YXIoVG90YWxDYXN0TGlrZXMpCnZhclRvdGFsQ2FzdExpa2VzCmBgYAoKCmBgYHtyfQpEaXJlY3RvckZhY2Vib29rTGlrZXMgPSBteWRhdGEkZGlyZWN0b3JfZmJfbGlrZXMKRGlyZWN0b3JGYWNlYm9va0xpa2VzID0gRGlyZWN0b3JGYWNlYm9va0xpa2VzWyFpcy5uYShEaXJlY3RvckZhY2Vib29rTGlrZXMpXQpoZWFkKERpcmVjdG9yRmFjZWJvb2tMaWtlcykKYGBgCgoKYGBge3J9CiNNYXgKbWF4RGlyZWN0b3JGYWNlYm9va0xpa2VzID0gbWF4KERpcmVjdG9yRmFjZWJvb2tMaWtlcykKbWF4RGlyZWN0b3JGYWNlYm9va0xpa2VzCmBgYAoKCmBgYHtyfQojTWluCm1pbkRpcmVjdG9yRmFjZWJvb2tMaWtlcyA9IG1pbihEaXJlY3RvckZhY2Vib29rTGlrZXMpCm1pbkRpcmVjdG9yRmFjZWJvb2tMaWtlcwpgYGAKCmBgYHtyfQojTWVhbgphdmVyYWdlRGlyZWN0b3JGYWNlYm9va0xpa2VzID0gbWVhbihEaXJlY3RvckZhY2Vib29rTGlrZXMpCmF2ZXJhZ2VEaXJlY3RvckZhY2Vib29rTGlrZXMKYGBgCgpgYGB7cn0Kc3VtbWFyeShteWRhdGEpCmBgYAoKYGBge3J9CiNSYW5nZQpyYW5nZURpcmVjdG9yRmFjZWJvb2tMaWtlcyA9IG1heERpcmVjdG9yRmFjZWJvb2tMaWtlcyAtIG1pbkRpcmVjdG9yRmFjZWJvb2tMaWtlcwpyYW5nZURpcmVjdG9yRmFjZWJvb2tMaWtlcwpgYGAKCmBgYHtyfQojU3RhbmRhcmQgRGV2aWF0aW9uCnNkRGlyZWN0b3JGYWNlYm9va0xpa2VzID0gc2QoRGlyZWN0b3JGYWNlYm9va0xpa2VzKQpzZERpcmVjdG9yRmFjZWJvb2tMaWtlcwpgYGAKCmBgYHtyfQojVmFyaWFuY2UKdmFyRGlyZWN0b3JGYWNlYm9va0xpa2VzID0gdmFyKERpcmVjdG9yRmFjZWJvb2tMaWtlcykKdmFyRGlyZWN0b3JGYWNlYm9va0xpa2VzCmBgYAoKCmBgYHtyfQpncm9zcyA9IG15ZGF0YSRncm9zcwpncm9zcyA9IGdyb3NzWyFpcy5uYShncm9zcyldCmhlYWQoZ3Jvc3MpCmBgYAoKYGBge3J9CiNNYXgKbWF4R3Jvc3MgPSBtYXgoZ3Jvc3MpCm1heEdyb3NzCmBgYAoKYGBge3J9CiNNaW4KbWluR3Jvc3MgPSBtaW4oZ3Jvc3MpCm1pbkdyb3NzCmBgYAoKYGBge3J9CiNNZWFuCmF2ZXJhZ2VHcm9zcyA9IG1lYW4oZ3Jvc3MpCmF2ZXJhZ2VHcm9zcwpgYGAKCmBgYHtyfQojUmFuZ2UKcmFuZ2VHcm9zcyA9IG1heEdyb3NzIC0gbWluR3Jvc3MKcmFuZ2VHcm9zcwpgYGAKCmBgYHtyfQojU3RhbmRhcmQgRGV2aWF0aW9uCnNkR3Jvc3MgPSBzZChncm9zcykKc2RHcm9zcwpgYGAKCmBgYHtyfQojVmFyaWFuY2UKdmFyR3Jvc3MgPSB2YXIoZ3Jvc3MpCnZhckdyb3NzCmBgYAoKYGBge3J9CmJ1ZGdldCA9IG15ZGF0YSRidWRnZXQKYnVkZ2V0ID0gYnVkZ2V0WyFpcy5uYShidWRnZXQpXQpoZWFkKGJ1ZGdldCkKYGBgCgpgYGB7cn0KI01heGltdW0KbWF4YnVkZ2V0ID0gbWF4KGJ1ZGdldCkKbWF4YnVkZ2V0CmBgYAoKYGBge3J9CiNNSU4KbWluYnVkZ2V0ID0gbWluKGJ1ZGdldCkKbWluYnVkZ2V0CmBgYAoKYGBge3J9CiNNZWFuCmF2ZXJhZ2VidWRnZXQgPSBtZWFuKGJ1ZGdldCkKYXZlcmFnZWJ1ZGdldApgYGAKCmBgYHtyfQojUmFuZ2UKcmFuZ2VidWRnZXQgPSBtYXhidWRnZXQgLSBtaW5idWRnZXQKcmFuZ2VidWRnZXQKYGBgCgpgYGB7cn0KI1N0YW5kYXJkIERldmlhdGlvbgpzZGJ1ZGdldCA9IHNkKGJ1ZGdldCkKc2RidWRnZXQKYGBgCgpgYGB7cn0KI1ZhcmlhbmNlCnZhcmJ1ZGdldCA9IHZhcihidWRnZXQpCnZhcmJ1ZGdldApgYGAKCgoKCgpGb2xsb3cgdGhlIGV4YW1wbGUgYW5kIGRvIHRoZSBzYW1lIGZvciByYWRpbywgcGFwZXIsIHR2LCBhbmQgcG9zLiBVc2UgdGhlIHdvcmtzaGVldCBnaXZlbiB0byB0cnkgdGhlIGRpZmZlcmVudCBjb21tYW5kcyB0byBmaW5kIHRoZSBtYXgsIG1pbiwgYW5kIHJhbmdlLiAKCi0tLS0tLS0tLS0KCiMjIyBUYXNrIDIKCkFuIGVhc3kgd2F5IHRvIGNhbGN1bGF0ZSBhbGwgb2YgdGhlc2Ugc3RhdGlzdGljcyBvZiBhbGwgb2YgdGhlc2UgdmFyaWFibGVzIGlzIHdpdGggdGhlIHN1bW1hcnkgZnVuY3Rpb24uIEJlbG93IGlzIGFuIGV4YW1wbGUuCgpgYGB7cn0Kc3VtbWFyeShteWRhdGEpCmBgYAoKVGhlcmUgYXJlIHNvbWUgc3RhdGlzdGljcyBub3QgY2FwdHVyZWQgaGVyZSBsaWtlIHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgdmFyaWFuY2UsIGJ1dCB0aGVyZSBpcyBhbiBlYXN5IGFuZCBxdWljayB3YXkgdG8gZmluZCBtb3N0IG9mIHlvdXIgYmFzaWMgc3RhdGlzdGljcy4gCgpOb3csIHdlIHdpbGwgcHJvZHVjZSBhIGJhc2ljIGJsb3Qgb2YgdGhlICdzYWxlcycgdmFyaWFibGUgLiBIZXJlIHdlIHV0aWxpemUgdGhlIHBsb3QgZnVuY3Rpb24gYW5kIHdpdGhpbiB0aGUgcGxvdCBmdW5jdGlvbiB3ZSBjYWxsIHRoZSB2YXJpYWJsZSB3ZSB3YW50IHRvIHBsb3QuIAoKYGBge3J9CnBsb3QoYnVkZ2V0KQpgYGAKCldoZW4gbG9va2luZyBhdCB0aGlzIGdyYXBoIHdlIGNhbm5vdCB0cnVseSBjYXB0dXJlIHRoZSBkYXRhIG9yIHNlZSBhIGNsZWFyIHBhdHRlcm4uIEEgYmV0dGVyIHdheSB0byB2aXN1YWxpemUgdGhpcyBwbG90IHdvdWxkIGJlIHRvIHJlLW9yZGVyIHRoZSBkYXRhIGJhc2VkIG9uIGluY3JlYXNpbmcgc2FsZXMuIAoKYGBge3J9CiMjIGZ1bmN0aW9uICh4LCB5LCAuLi4pIAojIyBVc2VNZXRob2QoInBsb3QiKQojIyA8Ynl0ZWNvZGU6IDB4N2Y5ZDkxZmRkMTUwPgojIyA8ZW52aXJvbm1lbnQ6IG5hbWVzcGFjZTpncmFwaGljcz4KYGBgCgoKYGBge3J9CiNCdWRnZXQgaXMgcmVvcmRlciBmcm9tIGxlYXN0IHRvIG1vc3QgZXhwZW5zaXZlIGJ1ZGdldApsZWFzdGV4cGVuc2l2ZUJ1ZGdldCA9IHNvcnQoYnVkZ2V0KQojeGxhYiBsYWJlbHMgdGhlIHggYXhpcywgeWxhYiBsYWJlbHMgdGhlIHkgYXhpcwpwbG90KGxlYXN0ZXhwZW5zaXZlQnVkZ2V0LCB0eXBlPSJiIiwgeGxhYiA9ICJNb3ZpZSIsIHlsYWIgPSAiTW92aWUgQnVkZ2V0IiwgY29sLm1haW4gPSAiUmVkIikKYGBgCgpUaGVyZSBhcmUgZnVydGhlciB3YXlzIHRvIGN1c3RvbWl6ZSBwbG90cywgc3VjaCBhcyBjaGFuZ2luZyB0aGUgY29sb3JzIG9mIHRoZSBsaW5lcywgYWRkaW5nIGEgaGVhZGluZywgb3IgZXZlbiBtYWtpbmcgdGhlbSBpbnRlcmFjdGl2ZS4gCgpOb3csIGxldHMgcGxvdCB0aGUgc2FsZXMgZ3JhcGgsIGFsb25nc2lkZSByYWRpbywgcGFwZXIsIGFuZCB0diB3aGljaCB5b3Ugd2lsbCBjb2RlLiBNYWtlIHN1cmUgdG8gcnVuIHRoZSBjb2RlIGluIHRoZSBzYW1lIGNodW5rIHNvIHRoZXkgYXJlIG9uIHRoZSBzYW1lIGxheW91dC4KCmBgYHtyfQoKbGF5b3V0KG1hdHJpeCgxOjQsMiwyKSkKI0RpcmVjdG9yIEZhY2Vib29rIExpa2VzCmFzY2VuZGluZ0RpcmVjdG9yRmFjZWJvb2tMaWtlcyA9IHNvcnQoRGlyZWN0b3JGYWNlYm9va0xpa2VzKQpwbG90KGFzY2VuZGluZ0RpcmVjdG9yRmFjZWJvb2tMaWtlcywgdHlwZT0iYiIsIHhsYWIgPSAiTW92aWUiLCB5bGFiID0gIkRpcmVjdG9yIEZhY2Vib29rIExpa2VzIikKdGl0bGUgKCJEaXJlY3RvciBGYWNlYm9vayBMaWtlcyBieSBNb3ZpZSIpCgojVG90YWwgQ2FzdCBMaWtlcwphc2NlbmRpbmdUb3RhbENhc3RMaWtlcyA9IHNvcnQoVG90YWxDYXN0TGlrZXMpCnBsb3QoYXNjZW5kaW5nVG90YWxDYXN0TGlrZXMsIHR5cGU9ImIiLCB4bGFiID0gIk1vdmllIiwgeWxhYiA9ICJUb3RhbCBDYXN0IExpa2VzIikKdGl0bGUgKCJUb3RhbCBDYXN0IExpa2VzIGJ5IE1vdmllIikKCiNHcm9zcwphc2NlbmRpbmdVc2Vyc1ZvdGVzID0gc29ydChVc2Vyc1ZvdGVzKQpwbG90KGFzY2VuZGluZ1VzZXJzVm90ZXMsIHR5cGU9ImIiLCB4bGFiID0gIk1vdmllIiwgeWxhYiA9ICJVc2Vyc1ZvdGVzIikKdGl0bGUgKCJVc2VycyBWb3RlcyBieSBNb3ZpZSIpCgoKI0J1ZGdldAphc2NlbmRpbmdCdWRnZXQgPSBzb3J0KGJ1ZGdldCkKcGxvdChhc2NlbmRpbmdCdWRnZXQsIHR5cGU9ImIiLCB4bGFiID0gIk1vdmllIiwgeWxhYiA9ICJCdWRnZXQiKQp0aXRsZSAoIkJ1ZGdldCIpCmBgYAoKCmBgYAoKCgoKYGBgCgotLS0tLS0tLS0tCgojIyMgVGFzayAzCgpHaXZlbiBhIHNhbGVzIHZhbHVlIG9mIDI1MDAwLCBjYWxjdWxhdGUgdGhlIGNvcnJlc3BvbmRpbmcgei12YWx1ZSBvciB6LXNjb3JlIHVzaW5nIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gY2FsY3VsYXRpb25zIGNvbmR1Y3RlZCBpbiB0YXNrIDEuIAoKV2Uga25vdyB0aGF0IHRoZSBgei1zY29yZSA9ICh4IC0gbWVhbikvc2RgLiBTbywgaW5wdXQgdGhpcyBpbnRvIHRoZSBSIGNvZGUgd2hlcmUgYHg9MjUwMDBgLCBgbWVhbj0xNjcxNy4yYCwgYW5kIGBzdGRldiA9IDI2MTcuMDUyMWAgd2hpY2ggd2UgZm91bmQgYWJvdmUuCgpCYXNlZCBvbiB0aGUgei12YWx1ZXMsIGhvdyB3b3VsZCB5b3UgcmF0ZSBhIGAkMjUwMDBgIHNhbGVzIHZhbHVlOiBwb29yLCBhdmVyYWdlLCBnb29kLCBvciB2ZXJ5IGdvb2QgcGVyZm9ybWFuY2U/IEV4cGxhaW4geW91ciBsb2dpYy4gCgpgYGB7cn0KI0J1ZGdldCAKYnVkZ2V0WnNjb3JlID0gKDEwMjM0MDAxIC0gYXZlcmFnZWJ1ZGdldCkgLyBzZGJ1ZGdldApidWRnZXRac2NvcmUKCmBgYAoKYGBge3J9CiNUb3RhbCBDYXN0IExpa2VzClRvdGFsQ2FzdExpa2VzWnNjb3JlID0gKDEwMjM0MDAxIC0gYXZlcmFnZVRvdGFsQ2FzdExpa2VzKSAvIHNkVG90YWxDYXN0TGlrZXMKVG90YWxDYXN0TGlrZXNac2NvcmUKYGBgCgpgYGB7cn0KI0RpcmVjdG9yIEZhY2Vib29rIExpa2VzIAogIERpcmVjdG9yRmFjZWJvb2tMaWtlc1pzY29yZSA9ICgxMDIzNDAwMSAtIGF2ZXJhZ2VEaXJlY3RvckZhY2Vib29rTGlrZXMpIC8gc2REaXJlY3RvckZhY2Vib29rTGlrZXMKZGlyZWN0b3JmYWNlYm9va2xpa2VzWnNjb3JlCmBgYAoKYGBge3J9CiNUb3RhbCBDYXN0IExpa2VzIAp0b3RhbGNhc3RsaWtlc1pzY29yZSA9ICgxMDIzNDAwMSAtIGF2ZXJhZ2VUb3RhbENhc3RMaWtlcykgLyBzZFRvdGFsQ2FzdExpa2VzCnRvdGFsY2FzdGxpa2VzWnNjb3JlCmBgYAoKYGBge3J9CiMgQnVkZ2V0CnpzY29yZUJ1ZGdldCA9IChidWRnZXQgLSBhdmVyYWdlYnVkZ2V0KSAvIHNkYnVkZ2V0CiMgVG90YWwgQ2FzdCBMaWtlcwp6c2NvcmVUb3RhbENhc3RMaWtlcyA9IChUb3RhbENhc3RMaWtlcyAtIGF2ZXJhZ2VUb3RhbENhc3RMaWtlcykgLyBzZFRvdGFsQ2FzdExpa2VzCiMgRGlyZWN0b3IgRmFjZWJvb2sgTGlrZXMKenNjb3JlRGlyZWN0b3JGYWNlYm9va0xpa2VzID0gKERpcmVjdG9yRmFjZWJvb2tMaWtlcyAtIGF2ZXJhZ2VEaXJlY3RvckZhY2Vib29rTGlrZXMpIC8gc2REaXJlY3RvckZhY2Vib29rTGlrZXMKIyBHcm9zcwp6c2NvcmVHcm9zcyA9IChncm9zcy0gYXZlcmFnZUdyb3NzKSAvIHNkR3Jvc3MKYGBgCgpgYGB7cn0KI0hpc3RvZ3JhbSBHcmFwaHMgb2YgWnNjb3JlcyAKbGF5b3V0KG1hdHJpeCgxOjQsIDIsMikpCmhpc3QoenNjb3JlQnVkZ2V0KQpoaXN0KHpzY29yZUdyb3NzKQpoaXN0KHpzY29yZVRvdGFsQ2FzdExpa2VzKQpoaXN0KHpzY29yZURpcmVjdG9yRmFjZWJvb2tMaWtlcykKYGBgCgo=