About

Qualitative 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.

Quantitative 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 both analytics using the data set provided.

Setup

Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.

Note

For your assignment you may be using different data sets than what is included here. Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.

Execute all code chunks, preview, publish, and submit link on Sakai.


Task 1: Quantitative Analysis

Begin by reading in the data from the ‘marketing.csv’ file, and viewing it to make sure it is read in correctly.

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

Now let’s 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’.

sales = mydata$sales
#Max Sales
max = max(sales)
max
[1] 20450
#Min Sales
min = min(sales)
min
[1] 11125
#Range
max-min
[1] 9325
#Mean
mean(sales)
[1] 16717.2
#Standard Deviation
sd(sales)
[1] 2617.052
#Variance
var(sales)
[1] 6848961

##### 1A) Repeat the above statistics for the variable radio

radio = mydata$radio

max = max(radio)

max 
[1] 89
min = min(radio)

min
[1] 65
max-min
[1] 24
mean(radio)
[1] 76.1
sd(radio)
[1] 7.354912
var(radio)
[1] 54.09474

An easy way to calculate many of these statistics is with the summary() function. Below is an example.

summary(sales)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  11125   15175   16658   16717   18874   20450 

##### 1B) Repeat the above summary calculation for the variable paper. Some statistics are not calculated with the summary() function. Specify which

paper = mydata$paper

summary(paper)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  35.00   53.75   62.50   62.30   75.50   89.00 

In comparison to the statistics we called for above for sales, the summary function does not calculate the range, standard deviation, and variance for the called variable.

Task 2: Qualitative Analysis

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


plot(sales)

We can customize the plot by connecting the dots and adding labels to the x- and y- axis.

#xlab labels the x axis, ylab labels the y axis
plot(sales, type="b", xlab = "Case Number", ylab = "Sales 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:4,2,2))

#Example of how to plot the sales variable
plot(sales, type="b", xlab = "Case Number", ylab = "Sales in $1,000") 

# Add three other plots here
plot(radio, type="b", xlab = "Case Number", ylab = "Adv. $ Spent on Radio")

plot(paper, type="b", xlab = "Case Number", ylab = "Adv. $ Spent on Paper")

plot(mydata$tv, type="b", xlab = "Case Number", ylab = "Adv. $ on TV")

##### 2A) Insert in the above code chunk the three other plots for Radio, Paper, and TV. Label the axes properly.

When looking at these plots it is hard to see a particular trend. One way to observe any possible trend in the sales data would be to re-order the data from low to high. The 20 months case studies are in no particular chronological time sequence. The 20 case numbers are independent sequentially generated numbers used as tags. Since each case is independent, we can reorder them. Note that as each case is re-ordered corresponding column values are also re-organised to maintain the relationship integrity.

#Re-order sales from low to high, and save re-ordered data in a new set. As sales data is re-reorded associated other column fields follow.
newdata = mydata[order(sales),]
head(newdata)
# Redefine the new variables 
newsales = newdata$sales
newradio = newdata$radio
newtv = newdata$tv
newpaper = newdata$paper

##### 2B) Repeat the previous 4 graphs layout exercise using instead the above defined four new variables for sales, radio, tv, and paper.

layout(matrix(1:4,2,2))

plot(newsales, type="b", xlab = "Cases", ylab = "Sales in $1,000") 

plot(newradio, type="b", xlab = "Cases", ylab = "Adv. $ Spent on Radio")

plot(newpaper, type="b", xlab = "Cases", ylab = "Adv. $ Spent on Paper")

plot(newtv, type="b", xlab = "Cases", ylab = "Adv. $ Spent on Tv")

Note: Advertising dollars spent on each mode of advertisement are in thousands.

##### 2C) Explain what the new plots are revealing in terms of trending relationships.

After filtering the data in ascending order for Sales, trends are revealed that were not previously seen before in the raw data. As sales increases, it can be seen that the the amount of money spent on advertising through radio and tv also increases. This can be true because in today’s society advertising through technology, such as tv and radio, is a lot more crucial than ever before, and is a necessary cost that companies need to succed. This can also highlight that these means of advertising makes the money for this marketing company. This can also be shown through the plot of advertising spent on paper. There is no solid trend line for advertising money spent for paper when sales is in ascending order. This can mean that even though the marketing company spends a lot of money for paper advertising, it does not produce sales like advertising through radio and tv.


Task 3: Standarized Z-Value

You are given a sales value of $25000. We want to calculate the corresponding z-value or z-score for sales using the mean and standard deviation calculations as shown in task 1. Remember that z-score = (x - mean)/sd.

##### 3A) Calculate the z-value. Based on your result, would you rate a $25000 in sales as poor, average, good, or very good performance? Explain your logic.

z_score = (25000 - mean(sales)) / sd(sales)

z_score
[1] 3.164935

Based on this z-score from the value of 25,000 in sales, this amount is a very good performance. First, a z-score calculates the amount of standard deviations a value is from the mean. We already know from the last lab as well that the upper and lower limits are calculated as: Mean +/- (3*sd). Since the z-score calculated is 3.164935, we already know, by its definition, that it is past the upper limit; meaning that this value is an outlier. Explained using the dollar amounts, the mean sales amount is 16,712.2, and the standard deviation is 2,617.05. Given these values, we can determine that the sales amount is a very good performance.

LS0tCnRpdGxlOiAiQlNBRDM0MyBGYWxsIDIwMTggTGFiIFdvcmtzaGVldCAwNCIKYXV0aG9yOiAiRXJpYyBFcmF6byIKZGF0ZTogIk9jdG9iZXIgNCwgMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CnN1YnRpdGxlOiBRdWFsaXRhdGl2ZSAmIFF1YW50aXRhdGl2ZSBBbmFseXRpY3MgKGJzYWQtbGFiMDQpCi0tLQoKIyMjIEFib3V0CgpRdWFsaXRhdGl2ZSBEZXNjcmlwdGl2ZSBBbmFseXRpY3MgYWltcyB0byBnYXRoZXIgYW4gaW4tZGVwdGggdW5kZXJzdGFuZGluZyBvZiB0aGUgdW5kZXJseWluZyByZWFzb25zIGFuZCBtb3RpdmF0aW9ucyBmb3IgYW4gZXZlbnQgb3Igb2JzZXJ2YXRpb24uIEl0IGlzIHR5cGljYWxseSByZXByZXNlbnRlZCB3aXRoIHZpc3VhbHMgb3IgY2hhcnRzLiAKClF1YW50aXRhdGl2ZSBEZXNjcmlwdGl2ZSBBbmFseXRpY3MgZm9jdXNlcyBvbiBpbnZlc3RpZ2F0aW5nIGEgcGhlbm9tZW5vbiB2aWEgc3RhdGlzdGljYWwsIG1hdGhlbWF0aWNhbCwgYW5kIGNvbXB1dGF0aW9uYWx5IHRlY2huaXF1ZXMuIEl0IGFpbXMgdG8gcXVhbnRpZnkgYW4gZXZlbnQgd2l0aCBtZXRyaWNzIGFuZCBudW1iZXJzLiAKCkluIHRoaXMgbGFiLCB3ZSB3aWxsIGV4cGxvcmUgYm90aCBhbmFseXRpY3MgdXNpbmcgdGhlIGRhdGEgc2V0IHByb3ZpZGVkLiAKCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkZvciB5b3VyIGFzc2lnbm1lbnQgeW91IG1heSBiZSB1c2luZyBkaWZmZXJlbnQgZGF0YSBzZXRzIHRoYW4gd2hhdCBpcyBpbmNsdWRlZCBoZXJlLiBBbHdheXMgcmVhZCBjYXJlZnVsbHkgdGhlIGluc3RydWN0aW9ucyBvbiBTYWthaS4gIEZvciBjbGFyaXR5LCB0YXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgY29sb3IgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4KCkV4ZWN1dGUgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkuCgotLS0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMTogUXVhbnRpdGF0aXZlIEFuYWx5c2lzCgpCZWdpbiBieSByZWFkaW5nIGluIHRoZSBkYXRhIGZyb20gdGhlICdtYXJrZXRpbmcuY3N2JyBmaWxlLCBhbmQgdmlld2luZyBpdCB0byBtYWtlIHN1cmUgaXQgaXMgcmVhZCBpbiBjb3JyZWN0bHkuIAoKYGBge3J9Cm15ZGF0YSA9IHJlYWQuY3N2KGZpbGU9ImRhdGEvbWFya2V0aW5nLmNzdiIpCmhlYWQobXlkYXRhKQpgYGAKCk5vdyBsZXQncyBjYWxjdWxhdGUgdGhlIFJhbmdlLCBNaW4sIE1heCwgTWVhbiwgU1RERVYsIGFuZCBWYXJpYW5jZSBmb3IgZWFjaCB2YXJpYWJsZS4gQmVsb3cgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gY29tcHV0ZSB0aGUgaXRlbXMgZm9yIHRoZSB2YXJpYWJsZSAnc2FsZXMnLiAKCmBgYHtyfQpzYWxlcyA9IG15ZGF0YSRzYWxlcwojTWF4IFNhbGVzCm1heCA9IG1heChzYWxlcykKbWF4CgojTWluIFNhbGVzCm1pbiA9IG1pbihzYWxlcykKbWluCgojUmFuZ2UKbWF4LW1pbgoKI01lYW4KbWVhbihzYWxlcykKCiNTdGFuZGFyZCBEZXZpYXRpb24Kc2Qoc2FsZXMpCgojVmFyaWFuY2UKdmFyKHNhbGVzKQpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQSkgUmVwZWF0IHRoZSBhYm92ZSBzdGF0aXN0aWNzIGZvciB0aGUgdmFyaWFibGUgcmFkaW8KPC9zcGFuPgoKYGBge3J9CnJhZGlvID0gbXlkYXRhJHJhZGlvCgptYXggPSBtYXgocmFkaW8pCgptYXggCgptaW4gPSBtaW4ocmFkaW8pCgptaW4KCm1heC1taW4KCm1lYW4ocmFkaW8pCgpzZChyYWRpbykKCnZhcihyYWRpbykKYGBgCgpBbiBlYXN5IHdheSB0byBjYWxjdWxhdGUgbWFueSBvZiB0aGVzZSBzdGF0aXN0aWNzIGlzIHdpdGggdGhlIHN1bW1hcnkoKSBmdW5jdGlvbi4gQmVsb3cgaXMgYW4gZXhhbXBsZS4KCmBgYHtyfQpzdW1tYXJ5KHNhbGVzKQpgYGAKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFCKSBSZXBlYXQgdGhlIGFib3ZlIHN1bW1hcnkgY2FsY3VsYXRpb24gZm9yIHRoZSB2YXJpYWJsZSBwYXBlci4gU29tZSBzdGF0aXN0aWNzIGFyZSBub3QgY2FsY3VsYXRlZCB3aXRoIHRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24uIFNwZWNpZnkgd2hpY2gKPC9zcGFuPgoKYGBge3J9CnBhcGVyID0gbXlkYXRhJHBhcGVyCgpzdW1tYXJ5KHBhcGVyKQpgYGAKSW4gY29tcGFyaXNvbiB0byB0aGUgc3RhdGlzdGljcyB3ZSBjYWxsZWQgZm9yIGFib3ZlIGZvciBzYWxlcywgdGhlIHN1bW1hcnkgZnVuY3Rpb24gZG9lcyBub3QgY2FsY3VsYXRlIHRoZSByYW5nZSwgc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgdmFyaWFuY2UgZm9yIHRoZSBjYWxsZWQgdmFyaWFibGUuICAKLS0tLS0tLS0tLQoKIyMjIFRhc2sgMjogUXVhbGl0YXRpdmUgQW5hbHlzaXMKCk5vdywgd2Ugd2lsbCBwcm9kdWNlIGEgYmFzaWMgcGxvdCBvZiB0aGUgJ3NhbGVzJyB2YXJpYWJsZSAuIEhlcmUgd2UgY2FsbCB0aGUgcGxvdCBmdW5jdGlvbiBhbmQgd2l0aGluIHRoZSBwbG90IGZ1bmN0aW9uIHdlIHJlZmVyIHRoZSB2YXJpYWJsZSB3ZSB3YW50IHRvIHBsb3QuIAoKYGBge3J9CgpwbG90KHNhbGVzKQpgYGAKCldlIGNhbiBjdXN0b21pemUgdGhlIHBsb3QgYnkgY29ubmVjdGluZyB0aGUgZG90cyBhbmQgYWRkaW5nIGxhYmVscyB0byB0aGUgeC0gYW5kIHktIGF4aXMuCgpgYGB7cn0KI3hsYWIgbGFiZWxzIHRoZSB4IGF4aXMsIHlsYWIgbGFiZWxzIHRoZSB5IGF4aXMKcGxvdChzYWxlcywgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIlNhbGVzIGluICQxLDAwMCIpIApgYGAKClRoZXJlIGFyZSBmdXJ0aGVyIHdheXMgdG8gY3VzdG9taXplIHBsb3RzLCBzdWNoIGFzIGNoYW5naW5nIHRoZSBjb2xvcnMgb2YgdGhlIGxpbmVzLCBhZGRpbmcgYSBoZWFkaW5nLCBvciBldmVuIG1ha2luZyB0aGVtIGludGVyYWN0aXZlLiAKCk5vdywgbGV0cyBwbG90IHRoZSBzYWxlcyBncmFwaCwgYWxvbmdzaWRlIHJhZGlvLCBwYXBlciwgYW5kIHR2IHdoaWNoIHlvdSB3aWxsIGNvZGUuIE1ha2Ugc3VyZSB0byBydW4gdGhlIGNvZGUgaW4gdGhlIHNhbWUgY2h1bmsgc28gdGhleSBhcmUgb24gdGhlIHNhbWUgbGF5b3V0LgoKYGBge3J9CiNMYXlvdXQgYWxsb3dzIHVzIHRvIHNlZSBhbGwgNCBncmFwaHMgb24gb25lIHNjcmVlbgpsYXlvdXQobWF0cml4KDE6NCwyLDIpKQoKI0V4YW1wbGUgb2YgaG93IHRvIHBsb3QgdGhlIHNhbGVzIHZhcmlhYmxlCnBsb3Qoc2FsZXMsIHR5cGU9ImIiLCB4bGFiID0gIkNhc2UgTnVtYmVyIiwgeWxhYiA9ICJTYWxlcyBpbiAkMSwwMDAiKSAKCiMgQWRkIHRocmVlIG90aGVyIHBsb3RzIGhlcmUKcGxvdChyYWRpbywgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIkFkdi4gJCBTcGVudCBvbiBSYWRpbyIpCgpwbG90KHBhcGVyLCB0eXBlPSJiIiwgeGxhYiA9ICJDYXNlIE51bWJlciIsIHlsYWIgPSAiQWR2LiAkIFNwZW50IG9uIFBhcGVyIikKCnBsb3QobXlkYXRhJHR2LCB0eXBlPSJiIiwgeGxhYiA9ICJDYXNlIE51bWJlciIsIHlsYWIgPSAiQWR2LiAkIG9uIFRWIikKYGBgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkEpIEluc2VydCBpbiB0aGUgYWJvdmUgY29kZSBjaHVuayB0aGUgdGhyZWUgb3RoZXIgcGxvdHMgZm9yIFJhZGlvLCBQYXBlciwgYW5kIFRWLiAgTGFiZWwgdGhlIGF4ZXMgcHJvcGVybHkuCjwvc3Bhbj4KCgpXaGVuIGxvb2tpbmcgYXQgdGhlc2UgcGxvdHMgaXQgaXMgaGFyZCB0byBzZWUgYSBwYXJ0aWN1bGFyIHRyZW5kLiBPbmUgd2F5IHRvIG9ic2VydmUgYW55IHBvc3NpYmxlIHRyZW5kIGluIHRoZSBzYWxlcyBkYXRhIHdvdWxkIGJlIHRvIHJlLW9yZGVyIHRoZSBkYXRhIGZyb20gbG93IHRvIGhpZ2guIFRoZSAyMCBtb250aHMgIGNhc2Ugc3R1ZGllcyBhcmUgaW4gbm8gcGFydGljdWxhciBjaHJvbm9sb2dpY2FsIHRpbWUgc2VxdWVuY2UuIFRoZSAyMCBjYXNlIG51bWJlcnMgYXJlIGluZGVwZW5kZW50IHNlcXVlbnRpYWxseSBnZW5lcmF0ZWQgbnVtYmVycyB1c2VkIGFzIHRhZ3MuIFNpbmNlIGVhY2ggY2FzZSBpcyBpbmRlcGVuZGVudCwgd2UgY2FuIHJlb3JkZXIgdGhlbS4gTm90ZSB0aGF0IGFzIGVhY2ggY2FzZSBpcyByZS1vcmRlcmVkIGNvcnJlc3BvbmRpbmcgY29sdW1uIHZhbHVlcyBhcmUgYWxzbyByZS1vcmdhbmlzZWQgdG8gbWFpbnRhaW4gdGhlIHJlbGF0aW9uc2hpcCBpbnRlZ3JpdHkuCgpgYGB7cn0KI1JlLW9yZGVyIHNhbGVzIGZyb20gbG93IHRvIGhpZ2gsIGFuZCBzYXZlIHJlLW9yZGVyZWQgZGF0YSBpbiBhIG5ldyBzZXQuIEFzIHNhbGVzIGRhdGEgaXMgcmUtcmVvcmRlZCBhc3NvY2lhdGVkIG90aGVyIGNvbHVtbiBmaWVsZHMgZm9sbG93LgpuZXdkYXRhID0gbXlkYXRhW29yZGVyKHNhbGVzKSxdCmhlYWQobmV3ZGF0YSkKIyBSZWRlZmluZSB0aGUgbmV3IHZhcmlhYmxlcyAKbmV3c2FsZXMgPSBuZXdkYXRhJHNhbGVzCm5ld3JhZGlvID0gbmV3ZGF0YSRyYWRpbwpuZXd0diA9IG5ld2RhdGEkdHYKbmV3cGFwZXIgPSBuZXdkYXRhJHBhcGVyCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJCKSBSZXBlYXQgdGhlIHByZXZpb3VzIDQgZ3JhcGhzIGxheW91dCBleGVyY2lzZSB1c2luZyBpbnN0ZWFkIHRoZSBhYm92ZSBkZWZpbmVkIGZvdXIgbmV3IHZhcmlhYmxlcyBmb3Igc2FsZXMsIHJhZGlvLCB0diwgYW5kIHBhcGVyLiAKYGBge3J9CmxheW91dChtYXRyaXgoMTo0LDIsMikpCgpwbG90KG5ld3NhbGVzLCB0eXBlPSJiIiwgeGxhYiA9ICJDYXNlcyIsIHlsYWIgPSAiU2FsZXMgaW4gJDEsMDAwIikgCgpwbG90KG5ld3JhZGlvLCB0eXBlPSJiIiwgeGxhYiA9ICJDYXNlcyIsIHlsYWIgPSAiQWR2LiAkIFNwZW50IG9uIFJhZGlvIikKCnBsb3QobmV3cGFwZXIsIHR5cGU9ImIiLCB4bGFiID0gIkNhc2VzIiwgeWxhYiA9ICJBZHYuICQgU3BlbnQgb24gUGFwZXIiKQoKcGxvdChuZXd0diwgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZXMiLCB5bGFiID0gIkFkdi4gJCBTcGVudCBvbiBUdiIpCmBgYApOb3RlOiBBZHZlcnRpc2luZyBkb2xsYXJzIHNwZW50IG9uIGVhY2ggbW9kZSBvZiBhZHZlcnRpc2VtZW50IGFyZSBpbiB0aG91c2FuZHMuCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkMpIEV4cGxhaW4gd2hhdCB0aGUgbmV3IHBsb3RzIGFyZSByZXZlYWxpbmcgaW4gdGVybXMgb2YgdHJlbmRpbmcgcmVsYXRpb25zaGlwcy4gCjwvc3Bhbj4KCkFmdGVyIGZpbHRlcmluZyB0aGUgZGF0YSBpbiBhc2NlbmRpbmcgb3JkZXIgZm9yIFNhbGVzLCB0cmVuZHMgYXJlIHJldmVhbGVkIHRoYXQgd2VyZSBub3QgcHJldmlvdXNseSBzZWVuIGJlZm9yZSBpbiB0aGUgcmF3IGRhdGEuICBBcyBzYWxlcyBpbmNyZWFzZXMsIGl0IGNhbiBiZSBzZWVuIHRoYXQgdGhlIHRoZSBhbW91bnQgb2YgbW9uZXkgc3BlbnQgb24gYWR2ZXJ0aXNpbmcgdGhyb3VnaCByYWRpbyBhbmQgdHYgYWxzbyBpbmNyZWFzZXMuICBUaGlzIGNhbiBiZSB0cnVlIGJlY2F1c2UgaW4gdG9kYXkncyBzb2NpZXR5IGFkdmVydGlzaW5nIHRocm91Z2ggdGVjaG5vbG9neSwgc3VjaCBhcyB0diBhbmQgcmFkaW8sIGlzIGEgbG90IG1vcmUgY3J1Y2lhbCB0aGFuIGV2ZXIgYmVmb3JlLCBhbmQgaXMgYSBuZWNlc3NhcnkgY29zdCB0aGF0IGNvbXBhbmllcyBuZWVkIHRvIHN1Y2NlZC4gIFRoaXMgY2FuIGFsc28gaGlnaGxpZ2h0IHRoYXQgdGhlc2UgbWVhbnMgb2YgYWR2ZXJ0aXNpbmcgbWFrZXMgdGhlIG1vbmV5IGZvciB0aGlzIG1hcmtldGluZyBjb21wYW55LiAgVGhpcyBjYW4gYWxzbyBiZSBzaG93biB0aHJvdWdoIHRoZSBwbG90IG9mIGFkdmVydGlzaW5nIHNwZW50IG9uIHBhcGVyLiAgVGhlcmUgaXMgbm8gc29saWQgdHJlbmQgbGluZSBmb3IgYWR2ZXJ0aXNpbmcgbW9uZXkgc3BlbnQgZm9yIHBhcGVyIHdoZW4gc2FsZXMgaXMgaW4gYXNjZW5kaW5nIG9yZGVyLiAgVGhpcyBjYW4gbWVhbiB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBtYXJrZXRpbmcgY29tcGFueSBzcGVuZHMgYSBsb3Qgb2YgbW9uZXkgZm9yIHBhcGVyIGFkdmVydGlzaW5nLCBpdCBkb2VzIG5vdCBwcm9kdWNlIHNhbGVzIGxpa2UgYWR2ZXJ0aXNpbmcgdGhyb3VnaCByYWRpbyBhbmQgdHYuICAKCi0tLS0tLS0tLS0KCiMjIyBUYXNrIDM6IFN0YW5kYXJpemVkIFotVmFsdWUKCllvdSBhcmUgZ2l2ZW4gYSBzYWxlcyB2YWx1ZSBvZiAkMjUwMDAuIFdlIHdhbnQgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZXNwb25kaW5nIHotdmFsdWUgb3Igei1zY29yZSBmb3Igc2FsZXMgdXNpbmcgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBjYWxjdWxhdGlvbnMgYXMgc2hvd24gaW4gdGFzayAxLiBSZW1lbWJlciB0aGF0IGB6LXNjb3JlID0gKHggLSBtZWFuKS9zZGAuIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDNBKSBDYWxjdWxhdGUgdGhlIHotdmFsdWUuIEJhc2VkIG9uIHlvdXIgcmVzdWx0LCAgd291bGQgeW91IHJhdGUgYSBgJDI1MDAwYCBpbiBzYWxlcyBhcyBwb29yLCBhdmVyYWdlLCBnb29kLCBvciB2ZXJ5IGdvb2QgcGVyZm9ybWFuY2U/IEV4cGxhaW4geW91ciBsb2dpYy4KYGBge3J9Cnpfc2NvcmUgPSAoMjUwMDAgLSBtZWFuKHNhbGVzKSkgLyBzZChzYWxlcykKCnpfc2NvcmUKYGBgCgpCYXNlZCBvbiB0aGlzIHotc2NvcmUgZnJvbSB0aGUgdmFsdWUgb2YgMjUsMDAwIGluIHNhbGVzLCB0aGlzIGFtb3VudCBpcyBhIHZlcnkgZ29vZCBwZXJmb3JtYW5jZS4gIEZpcnN0LCBhIHotc2NvcmUgY2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgYSB2YWx1ZSBpcyBmcm9tIHRoZSBtZWFuLiAgV2UgYWxyZWFkeSBrbm93IGZyb20gdGhlIGxhc3QgbGFiIGFzIHdlbGwgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cyBhcmUgY2FsY3VsYXRlZCBhczogTWVhbiArLy0gKDMqc2QpLiBTaW5jZSB0aGUgei1zY29yZSBjYWxjdWxhdGVkIGlzIDMuMTY0OTM1LCB3ZSBhbHJlYWR5IGtub3csIGJ5IGl0cyBkZWZpbml0aW9uLCB0aGF0IGl0IGlzIHBhc3QgdGhlIHVwcGVyIGxpbWl0OyBtZWFuaW5nIHRoYXQgdGhpcyB2YWx1ZSBpcyBhbiBvdXRsaWVyLiAgRXhwbGFpbmVkIHVzaW5nIHRoZSBkb2xsYXIgYW1vdW50cywgdGhlIG1lYW4gc2FsZXMgYW1vdW50IGlzIDE2LDcxMi4yLCBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAyLDYxNy4wNS4gICBHaXZlbiB0aGVzZSB2YWx1ZXMsIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgc2FsZXMgYW1vdW50IGlzIGEgdmVyeSBnb29kIHBlcmZvcm1hbmNlLiAgCgo8L3NwYW4+Cgo=