This is an R Markdown
Notebook. When you execute code within the notebook, the results appear
beneath the code.
Try executing this chunk by clicking the Run button within
the chunk or by placing your cursor inside it and pressing
Ctrl+Shift+Enter.
plot(cars)

Add a new chunk by clicking the Insert Chunk button on the
toolbar or by pressing Ctrl+Alt+I.
mean(cars$speed)
[1] 15.4
mean(cars$dist)
[1] 42.98
max(cars$speed)
[1] 25
max(cars$dist)
[1] 120
When you save the notebook, an HTML file containing the code and
output will be saved alongside it (click the Preview button or
press Ctrl+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the
editor. Consequently, unlike Knit, Preview does not
run any R code chunks. Instead, the output of the chunk when it was last
run in the editor is displayed.
2^5
[1] 32
LOGARITMIC FUNCTION: AS X GETS LARGER THE FUNCTION FLATS OUT. IT DOES
NOT INCREASE AT THE SAME RATE. SO FOR PROBLEM WHERE WE HAVE ATTRIBUTES
HAVE DIFFERENT SCALE, THE LOG FUNCTION IS MORE SUITABLE. WE USE IT TO
LINEARIZE PROBLEMS.
FOR EXAMPLE, A SCIENTIST IN HEALTH CARE INDUSTRY WANTS TO DETERMINE
THE AGE OF A PARTICULAR SPECIES. THE FUNCTION IS EXPONENTIAL, BUT YOU
APPLIED LOG PROPERTIES (LN).
log(2)
[1] 0.6931472
log10(100)
[1] 2
log10(0.5)
[1] -0.30103
log10(10)
[1] 1
log(10,base=5)
[1] 1.430677
COMPUTING OFFENSIVE METRICS IN BASEBALL
BA=(29)/(112)
BA
[1] 0.2589286
Batting_average = round(BA, digits=3)
Batting_average
[1] 0.259
#ON BASE PERCENTAGE
#OBP=(H+BB+HBP)/(At Bats+H+BB+HBP+SF)
#LET US COMPUTE THE OBP FOR A PLAYER WITH THE FOLLOWING GENERAL STATS
#AB=515+,H=172,BB=84,HBP=5,SF=6
OBP=(172+84+5)/(515+172+84+5+6)
OBP
[1] 0.3337596
On_Base_Percentage=round(OBP,digits=3)
On_Base_Percentage
[1] 0.334
#Question_3:Compute the OBP for a player with the following general stats:
#AB=565,H=156,BB=65,HBP=3,SF=7
3==8
[1] FALSE
3!=8
[1] TRUE
3<=8
[1] TRUE
3>4
[1] FALSE
LOGICAL OPERATOR
#LOGICAL DISJUCTION (OR)
FALSE|FALSE #FALSE OR FALSE
[1] FALSE
#LOGICAL CONJUCTION (AND)
TRUE&FALSE #TRUE AND FALSE
[1] FALSE
# NEGATION
!FALSE #NOT FALSE
[1] TRUE
#COMBINATION OF STATEMENTS
2<3 | 1==5 # 2<3 IS TRUE, 1==5 IS FALSE, TRUE OR FALSE IS TRUE
[1] TRUE
Total_Bases <- 6+5
Total_Bases*3
[1] 33
ls()
[1] "BA" "Batting_average"
[3] "OBP" "On_Base_Percentage"
[5] "Total_Bases"
#DELETE A VARIABLE USE RM = REMOVE
rm(Total_Bases)
VECTORS
pitches_by_innings <- c(12,15,10,20,10)
pitches_by_innings
[1] 12 15 10 20 10
strikes_by_innings <- c(9,12,6,14,9)
strikes_by_innings
[1] 9 12 6 14 9
runs_per_9innings <- c(21,3,17,6,9)
hits_per_9innings <- c(15,4,26,10,7)
CREATE VECTORS WITH REGULAR PATTERNS
#REPLICATE FUNCTION
rep(2,5)
[1] 2 2 2 2 2
rep(1,4)
[1] 1 1 1 1
#CONSECUTIVE NUMBERS
1:5
[1] 1 2 3 4 5
2:10
[1] 2 3 4 5 6 7 8 9 10
#SEQUENCE FROM 1 TO 10 WITH A STEP OF 2
seq(1,10,by=2)
[1] 1 3 5 7 9
seq(2,13,by=3)
[1] 2 5 8 11
#ADD VECTORS
pitches_by_innings+strikes_by_innings
[1] 21 27 16 34 19
#COMPARE VECTORS
pitches_by_innings == strikes_by_innings
[1] FALSE FALSE FALSE FALSE FALSE
#FIND LENGTH OF VECTOR
length(pitches_by_innings)
[1] 5
#FIND MINIMUM VALUE IN VECTOR
min(pitches_by_innings)
[1] 10
#FIND AVERAGE VALUE IN VECTOR
mean(pitches_by_innings)
[1] 13.4
YOU CAN ACCESS PARTS OF A VECTOR BY USING []. RECALL WHAT THE
VALUE IS OF THE VECTOR
pitches_by_innings
[1] 12 15 10 20 10
#GET THE FIRST ELEMENT
pitches_by_innings[1]
[1] 12
#FIRST ELEMENT OF HITS_PER_9INNINGS
hits_per_9innings[1]
[1] 15
IF YOU WANT THE LAST ELEMENT OF A LIST FIRST FIND THE LENGTH
THEN CALCULATE THE NUMBER ON THE VECTOR
pitches_by_innings[length(pitches_by_innings)]
[1] 10
#GET THE LAST ELEMENT OF THE hits_per_9innings
hits_per_9innings[length(hits_per_9innings)]
[1] 7
YOU CAN ALSO EXTRACT MULTIPLE VALUES FROM A VECTOR. FOR
INSTANCE TO GET THE 2NDD THROUGH 4TH VALUES ARE:
pitches_by_innings[c(2,3,4)]
[1] 15 10 20
VECTORS CAN ALSO BE STRINGS OR LOGICAL VALUES
player_positions <- c("catcher","pitcher","infielders","outfielders")
DATA FRAMES In statistical applications, data is
often stored as a data frame, which is like a spreadsheet, with rows as
observations and columns as variables.
To manually create a data frame, use the data.frame()
function.
Most often you will be using data frames loaded from a file. For
example, load the results of a fan’s survey. The function load or
read.table can be used for this. HOW TO MAKE A RANDOM
SAMPLE To randomly select a sample use the function
sample(). The following code selects 5 numbers between 1 and 10 at
random (without duplication)
sample(1:10,size=5)
[1] 5 4 9 2 7
bar <- data.frame(var1=LETTERS[1:10],var2=1:10)
# CHECK DATA FRAME
bar
n<-5
samplerows <- sample(1:nrow(bar),size=n)
#print sample rows
samplerows
[1] 9 1 6 5 4
#THE VARIABLE SAMPLEROWS CONTAINS THE ROWS OF BAR WHICH MAKE A RANDOM SAMPLE FROM ALL THE ROWS IN BAR. EXTRACT THOSE ROWS FROM BAR WITH:
#extract rows
barsample <- bar[samplerows, ]
#print sample
print(barsample)
THE CODE ABOVE CREATES A NEW DATAFRAME CALLED barsample with
a random sample of rows from bar
#IN A SINGLE LINE OF CODE:
bar[sample(1:nrow(bar),n), ]
USING TABLES The table() command allows us to
look at tables. Its simplest usage looks like table(x) where x is a
categorical variable.
For example, a survey asks people if they support the home team
or not. The data is
Yes, No, No, Yes, Yes
We can enter this into R with the c() command, and summarize with
the table() command as follows
x<-c("Yes","No","No","Yes","Yes")
table(x)
x
No Yes
2 3
NUMERICAL MEASURES OF CENTER AND SPREAD Suppose,
MLB Teams’ CEOs yearly compensations are sampled and the following are
found (in millions)
12 .4 5 2 50 8 3 1 4 0.25
sals <- c(12,.4,5,2,50,8,3,1,4,0.25)
# the average
mean(sals)
[1] 8.565
#THE VARIENCE
var(sals)
[1] 225.5145
#THE STANDARD DEVIATION
sd(sals)
[1] 15.01714
#THE MEDIAN
median(sals)
[1] 3.5
#TUKEYS FIVE NUMBER SUMMARY, USEFULL FOR BOXPLOTS
#FIVE NUMBER: MIN,LOWER HINGE, MEDIAN, UPPER HINGE, MAX
fivenum(sals)
[1] 0.25 1.00 3.50 8.00 50.00
#SUMMARY STATISTICS
summary(sals)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.250 1.250 3.500 8.565 7.250 50.000
HOW ABOUT THE MODE
#FUNCTION TO FIND THE MODE, i.e. MOST FREQUENT VALUE
getmode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x,ux)))]
}
As an example, we can use the function defined above to find the
most frequent value of the number of pitches_by_innings
#MOST FREQUENT VALUE IN pitches_by_innings
getmode(pitches_by_innings)
[1] 10
# 7 FIND THE MOST FREQUENT VALUE OF hits_per_9innings
getmode(hits_per_9innings)
[1] 15
# 8 SUMMARIZE THE FOLLOWING SURVEY WITH THE 'table()' command:
# What is your favorite day of the week to watch baseball? a total of 10 fans submitted this survey.
#Saturday, Saturday, Sunday, Monday, Saturday,Tuesday, Sunday, Friday, Friday, Monday
game_day<-c("Saturday", "Saturday", "Sunday", "Monday", "Saturday","Tuesday", "Sunday", "Friday", "Friday", "Monday")
# 9 WHAT IS THE MOST FREQUENT ANSWER RECORDED IN THE SURVEY? USE THE GETMODE FUNCTION TO COMPUTE RESULTS
getmode(game_day)
[1] "Saturday"
LS0tCnRpdGxlOiAiSW4gQ2xhc3MgQWN0aXZpdHkgMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKYGBge3J9CnBsb3QoY2FycykKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouCmBgYHtyfQptZWFuKGNhcnMkc3BlZWQpCm1lYW4oY2FycyRkaXN0KQpgYGAKCgoKYGBge3J9Cm1heChjYXJzJHNwZWVkKQptYXgoY2FycyRkaXN0KQpgYGAKCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ3RybCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLgoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoKYGBge3J9CjJeNQpgYGAKCkxPR0FSSVRNSUMgRlVOQ1RJT046IEFTIFggR0VUUyBMQVJHRVIgVEhFIEZVTkNUSU9OIEZMQVRTIE9VVC4gSVQgRE9FUyBOT1QgSU5DUkVBU0UgQVQgVEhFIFNBTUUgUkFURS4gU08gRk9SIFBST0JMRU0gV0hFUkUgV0UgSEFWRSBBVFRSSUJVVEVTIEhBVkUgRElGRkVSRU5UIFNDQUxFLCBUSEUgTE9HIEZVTkNUSU9OIElTIE1PUkUgU1VJVEFCTEUuIFdFIFVTRSBJVCBUTyBMSU5FQVJJWkUgUFJPQkxFTVMuCgpGT1IgRVhBTVBMRSwgQSBTQ0lFTlRJU1QgSU4gSEVBTFRIIENBUkUgSU5EVVNUUlkgV0FOVFMgVE8gREVURVJNSU5FIFRIRSBBR0UgT0YgQSBQQVJUSUNVTEFSIFNQRUNJRVMuIFRIRSBGVU5DVElPTiBJUyBFWFBPTkVOVElBTCwgQlVUIFlPVSBBUFBMSUVEIExPRyBQUk9QRVJUSUVTIChMTikuCgpgYGB7cn0KbG9nKDIpICNOQVRVUkFMIExPRyBPRyAyCmBgYApgYGB7cn0KbG9nMTAoMTAwKQpsb2cxMCgwLjUpCmxvZzEwKDEwKQpgYGAKYGBge3J9CiNIRVJFIFdFIENPTVBVVEUgTE9HIEJBU0UgNQpsb2coMTAsYmFzZT01KQpgYGAKCioqQ09NUFVUSU5HIE9GRkVOU0lWRSBNRVRSSUNTIElOIEJBU0VCQUxMKioKYGBge3J9CkJBPSgyOSkvKDExMikKQkEKYGBgCgpgYGB7cn0KQmF0dGluZ19hdmVyYWdlID0gcm91bmQoQkEsIGRpZ2l0cz0zKQpCYXR0aW5nX2F2ZXJhZ2UKYGBgCmBgYHtyfQojT04gQkFTRSBQRVJDRU5UQUdFCiNPQlA9KEgrQkIrSEJQKS8oQXQgQmF0cytIK0JCK0hCUCtTRikKI0xFVCBVUyBDT01QVVRFIFRIRSBPQlAgRk9SIEEgUExBWUVSIFdJVEggVEhFIEZPTExPV0lORyBHRU5FUkFMIFNUQVRTCiNBQj01MTUrLEg9MTcyLEJCPTg0LEhCUD01LFNGPTYKT0JQPSgxNzIrODQrNSkvKDUxNSsxNzIrODQrNSs2KQpPQlAKYGBgCmBgYHtyfQpPbl9CYXNlX1BlcmNlbnRhZ2U9cm91bmQoT0JQLGRpZ2l0cz0zKQpPbl9CYXNlX1BlcmNlbnRhZ2UKYGBgCmBgYHtyfQojUXVlc3Rpb25fMzpDb21wdXRlIHRoZSBPQlAgZm9yIGEgcGxheWVyIHdpdGggdGhlIGZvbGxvd2luZyBnZW5lcmFsIHN0YXRzOgojQUI9NTY1LEg9MTU2LEJCPTY1LEhCUD0zLFNGPTcKYGBgCgpgYGB7cn0KMz09OApgYGAKYGBge3J9CjMhPTgKYGBgCmBgYHtyfQozPD04CmBgYApgYGB7cn0KMz40CmBgYAoqKkxPR0lDQUwgT1BFUkFUT1IqKgpgYGB7cn0KI0xPR0lDQUwgRElTSlVDVElPTiAoT1IpCkZBTFNFfEZBTFNFICNGQUxTRSBPUiBGQUxTRQpgYGAKYGBge3J9CiNMT0dJQ0FMIENPTkpVQ1RJT04gKEFORCkKVFJVRSZGQUxTRSAjVFJVRSBBTkQgRkFMU0UKYGBgCmBgYHtyfQojIE5FR0FUSU9OCiFGQUxTRSAjTk9UIEZBTFNFCmBgYApgYGB7cn0KI0NPTUJJTkFUSU9OIE9GIFNUQVRFTUVOVFMKMjwzIHwgMT09NSAjIDI8MyBJUyBUUlVFLCAxPT01IElTIEZBTFNFLCBUUlVFIE9SIEZBTFNFIElTIFRSVUUKYGBgCmBgYHtyfQpUb3RhbF9CYXNlcyA8LSA2KzUKVG90YWxfQmFzZXMqMwpgYGAKYGBge3J9CiNMUyA9IExJU1QKbHMoKQpgYGAKYGBge3J9CiNERUxFVEUgQSBWQVJJQUJMRSBVU0UgUk0gPSBSRU1PVkUKcm0oVG90YWxfQmFzZXMpCmBgYAoqKlZFQ1RPUlMqKgpgYGB7cn0KcGl0Y2hlc19ieV9pbm5pbmdzIDwtIGMoMTIsMTUsMTAsMjAsMTApCnBpdGNoZXNfYnlfaW5uaW5ncwpgYGAKYGBge3J9CnN0cmlrZXNfYnlfaW5uaW5ncyA8LSBjKDksMTIsNiwxNCw5KQpzdHJpa2VzX2J5X2lubmluZ3MKYGBgCmBgYHtyfQpydW5zX3Blcl85aW5uaW5ncyA8LSBjKDIxLDMsMTcsNiw5KQpoaXRzX3Blcl85aW5uaW5ncyA8LSBjKDE1LDQsMjYsMTAsNykKYGBgCioqQ1JFQVRFIFZFQ1RPUlMgV0lUSCBSRUdVTEFSIFBBVFRFUk5TKioKYGBge3J9CiNSRVBMSUNBVEUgRlVOQ1RJT04KcmVwKDIsNSkKYGBgCmBgYHtyfQpyZXAoMSw0KQpgYGAKYGBge3J9CiNDT05TRUNVVElWRSBOVU1CRVJTCjE6NQpgYGAKYGBge3J9CjI6MTAKYGBgCmBgYHtyfQojU0VRVUVOQ0UgRlJPTSAxIFRPIDEwIFdJVEggQSBTVEVQIE9GIDIKc2VxKDEsMTAsYnk9MikKYGBgCmBgYHtyfQpzZXEoMiwxMyxieT0zKQpgYGAKYGBge3J9CiNBREQgVkVDVE9SUwpwaXRjaGVzX2J5X2lubmluZ3Mrc3RyaWtlc19ieV9pbm5pbmdzCmBgYApgYGB7cn0KI0NPTVBBUkUgVkVDVE9SUwpwaXRjaGVzX2J5X2lubmluZ3MgPT0gc3RyaWtlc19ieV9pbm5pbmdzCmBgYApgYGB7cn0KI0ZJTkQgTEVOR1RIIE9GIFZFQ1RPUgpsZW5ndGgocGl0Y2hlc19ieV9pbm5pbmdzKQpgYGAKYGBge3J9CiNGSU5EIE1JTklNVU0gVkFMVUUgSU4gVkVDVE9SCm1pbihwaXRjaGVzX2J5X2lubmluZ3MpCmBgYApgYGB7cn0KI0ZJTkQgQVZFUkFHRSBWQUxVRSBJTiBWRUNUT1IKbWVhbihwaXRjaGVzX2J5X2lubmluZ3MpCmBgYAoqKllPVSBDQU4gQUNDRVNTIFBBUlRTIE9GIEEgVkVDVE9SIEJZIFVTSU5HIFtdLiBSRUNBTEwgV0hBVCBUSEUgVkFMVUUgSVMgT0YgVEhFIFZFQ1RPUioqCmBgYHtyfQpwaXRjaGVzX2J5X2lubmluZ3MKYGBgCmBgYHtyfQojR0VUIFRIRSBGSVJTVCBFTEVNRU5UCnBpdGNoZXNfYnlfaW5uaW5nc1sxXQpgYGAKYGBge3J9CiNGSVJTVCBFTEVNRU5UIE9GIEhJVFNfUEVSXzlJTk5JTkdTCmhpdHNfcGVyXzlpbm5pbmdzWzFdCmBgYAoqKklGIFlPVSBXQU5UIFRIRSBMQVNUIEVMRU1FTlQgT0YgQSBMSVNUIEZJUlNUIEZJTkQgVEhFIExFTkdUSCBUSEVOIENBTENVTEFURSBUSEUgTlVNQkVSIE9OIFRIRSBWRUNUT1IqKgpgYGB7cn0KcGl0Y2hlc19ieV9pbm5pbmdzW2xlbmd0aChwaXRjaGVzX2J5X2lubmluZ3MpXQpgYGAKYGBge3J9CiNHRVQgVEhFIExBU1QgRUxFTUVOVCBPRiBUSEUgaGl0c19wZXJfOWlubmluZ3MKaGl0c19wZXJfOWlubmluZ3NbbGVuZ3RoKGhpdHNfcGVyXzlpbm5pbmdzKV0KYGBgCioqWU9VIENBTiBBTFNPIEVYVFJBQ1QgTVVMVElQTEUgVkFMVUVTIEZST00gQSBWRUNUT1IuIEZPUiBJTlNUQU5DRSBUTyBHRVQgVEhFIDJOREQgVEhST1VHSCA0VEggVkFMVUVTIEFSRToqKgpgYGB7cn0KcGl0Y2hlc19ieV9pbm5pbmdzW2MoMiwzLDQpXQpgYGAKKipWRUNUT1JTIENBTiBBTFNPIEJFIFNUUklOR1MgT1IgTE9HSUNBTCBWQUxVRVMqKgpgYGB7cn0KcGxheWVyX3Bvc2l0aW9ucyA8LSBjKCJjYXRjaGVyIiwicGl0Y2hlciIsImluZmllbGRlcnMiLCJvdXRmaWVsZGVycyIpCmBgYAoqKkRBVEEgRlJBTUVTKioKKkluIHN0YXRpc3RpY2FsIGFwcGxpY2F0aW9ucywgZGF0YSBpcyBvZnRlbiBzdG9yZWQgYXMgYSBkYXRhIGZyYW1lLCB3aGljaCBpcyBsaWtlIGEgc3ByZWFkc2hlZXQsIHdpdGggcm93cyBhcyBvYnNlcnZhdGlvbnMgYW5kIGNvbHVtbnMgYXMgdmFyaWFibGVzLioKCipUbyBtYW51YWxseSBjcmVhdGUgYSBkYXRhIGZyYW1lLCB1c2UgdGhlIGRhdGEuZnJhbWUoKSBmdW5jdGlvbi4qCgoqTW9zdCBvZnRlbiB5b3Ugd2lsbCBiZSB1c2luZyBkYXRhIGZyYW1lcyBsb2FkZWQgZnJvbSBhIGZpbGUuIEZvciBleGFtcGxlLCBsb2FkIHRoZSByZXN1bHRzIG9mIGEgZmFu4oCZcyBzdXJ2ZXkuIFRoZSBmdW5jdGlvbiBsb2FkIG9yIHJlYWQudGFibGUgY2FuIGJlIHVzZWQgZm9yIHRoaXMuKgoqKkhPVyBUTyBNQUtFIEEgUkFORE9NIFNBTVBMRSoqCipUbyByYW5kb21seSBzZWxlY3QgYSBzYW1wbGUgdXNlIHRoZSBmdW5jdGlvbiBzYW1wbGUoKS4gVGhlIGZvbGxvd2luZyBjb2RlIHNlbGVjdHMgNSBudW1iZXJzIGJldHdlZW4gMSBhbmQgMTAgYXQgcmFuZG9tICh3aXRob3V0IGR1cGxpY2F0aW9uKSoKYGBge3J9CnNhbXBsZSgxOjEwLHNpemU9NSkKYGBgCmBgYHtyfQpiYXIgPC0gZGF0YS5mcmFtZSh2YXIxPUxFVFRFUlNbMToxMF0sdmFyMj0xOjEwKQojIENIRUNLIERBVEEgRlJBTUUKYmFyCmBgYAoKYGBge3J9Cm48LTUKYGBgCgpgYGB7cn0Kc2FtcGxlcm93cyA8LSBzYW1wbGUoMTpucm93KGJhciksc2l6ZT1uKQojcHJpbnQgc2FtcGxlIHJvd3MKc2FtcGxlcm93cwpgYGAKYGBge3J9CiNUSEUgVkFSSUFCTEUgU0FNUExFUk9XUyBDT05UQUlOUyBUSEUgUk9XUyBPRiBCQVIgV0hJQ0ggTUFLRSBBIFJBTkRPTSBTQU1QTEUgRlJPTSBBTEwgVEhFIFJPV1MgSU4gQkFSLiBFWFRSQUNUIFRIT1NFIFJPV1MgRlJPTSBCQVIgV0lUSDoKI2V4dHJhY3Qgcm93cwpiYXJzYW1wbGUgPC0gYmFyW3NhbXBsZXJvd3MsIF0KI3ByaW50IHNhbXBsZQpwcmludChiYXJzYW1wbGUpCmBgYAoqKlRIRSBDT0RFIEFCT1ZFIENSRUFURVMgQSBORVcgREFUQUZSQU1FIENBTExFRCBiYXJzYW1wbGUgd2l0aCBhIHJhbmRvbSBzYW1wbGUgb2Ygcm93cyBmcm9tIGJhcioqCmBgYHtyfQojSU4gQSBTSU5HTEUgTElORSBPRiBDT0RFOgpiYXJbc2FtcGxlKDE6bnJvdyhiYXIpLG4pLCBdCmBgYAoqKlVTSU5HIFRBQkxFUyoqCipUaGUgdGFibGUoKSBjb21tYW5kIGFsbG93cyB1cyB0byBsb29rIGF0IHRhYmxlcy4gSXRzIHNpbXBsZXN0IHVzYWdlIGxvb2tzIGxpa2UgdGFibGUoeCkgd2hlcmUgeCBpcyBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlLioKCipGb3IgZXhhbXBsZSwgYSBzdXJ2ZXkgYXNrcyBwZW9wbGUgaWYgdGhleSBzdXBwb3J0IHRoZSBob21lIHRlYW0gb3Igbm90LiBUaGUgZGF0YSBpcyoKCipZZXMsIE5vLCBObywgWWVzLCBZZXMqCgoqV2UgY2FuIGVudGVyIHRoaXMgaW50byBSIHdpdGggdGhlIGMoKSBjb21tYW5kLCBhbmQgc3VtbWFyaXplIHdpdGggdGhlIHRhYmxlKCkgY29tbWFuZCBhcyBmb2xsb3dzKgpgYGB7cn0KeDwtYygiWWVzIiwiTm8iLCJObyIsIlllcyIsIlllcyIpCnRhYmxlKHgpCmBgYAoqKk5VTUVSSUNBTCBNRUFTVVJFUyBPRiBDRU5URVIgQU5EIFNQUkVBRCoqCipTdXBwb3NlLCBNTEIgVGVhbXPigJkgQ0VPcyB5ZWFybHkgY29tcGVuc2F0aW9ucyBhcmUgc2FtcGxlZCBhbmQgdGhlIGZvbGxvd2luZyBhcmUgZm91bmQgKGluIG1pbGxpb25zKSoKCioxMiAuNCA1IDIgNTAgOCAzIDEgNCAwLjI1KgoKYGBge3J9CnNhbHMgPC0gYygxMiwuNCw1LDIsNTAsOCwzLDEsNCwwLjI1KQojIHRoZSBhdmVyYWdlCm1lYW4oc2FscykKYGBgCmBgYHtyfQojVEhFIFZBUklFTkNFCnZhcihzYWxzKQpgYGAKYGBge3J9CiNUSEUgU1RBTkRBUkQgREVWSUFUSU9OCnNkKHNhbHMpCmBgYApgYGB7cn0KI1RIRSBNRURJQU4KbWVkaWFuKHNhbHMpCmBgYApgYGB7cn0KI1RVS0VZUyBGSVZFIE5VTUJFUiBTVU1NQVJZLCBVU0VGVUxMIEZPUiBCT1hQTE9UUwojRklWRSBOVU1CRVI6IE1JTixMT1dFUiBISU5HRSwgTUVESUFOLCBVUFBFUiBISU5HRSwgTUFYCmZpdmVudW0oc2FscykKYGBgCmBgYHtyfQojU1VNTUFSWSBTVEFUSVNUSUNTCnN1bW1hcnkoc2FscykKYGBgCioqSE9XIEFCT1VUIFRIRSBNT0RFKioKYGBge3J9CiNGVU5DVElPTiBUTyBGSU5EIFRIRSBNT0RFLCBpLmUuIE1PU1QgRlJFUVVFTlQgVkFMVUUKZ2V0bW9kZSA8LSBmdW5jdGlvbih4KSB7CiAgdXggPC0gdW5pcXVlKHgpCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsdXgpKSldCn0KYGBgCipBcyBhbiBleGFtcGxlLCB3ZSBjYW4gdXNlIHRoZSBmdW5jdGlvbiBkZWZpbmVkIGFib3ZlIHRvIGZpbmQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUgb2YgdGhlIG51bWJlciBvZiBwaXRjaGVzX2J5X2lubmluZ3MqCmBgYHtyfQojTU9TVCBGUkVRVUVOVCBWQUxVRSBJTiBwaXRjaGVzX2J5X2lubmluZ3MKZ2V0bW9kZShwaXRjaGVzX2J5X2lubmluZ3MpCmBgYApgYGB7cn0KIyA3IEZJTkQgVEhFIE1PU1QgRlJFUVVFTlQgVkFMVUUgT0YgaGl0c19wZXJfOWlubmluZ3MKZ2V0bW9kZShoaXRzX3Blcl85aW5uaW5ncykKYGBgCmBgYHtyfQojIDggU1VNTUFSSVpFIFRIRSBGT0xMT1dJTkcgU1VSVkVZIFdJVEggVEhFICd0YWJsZSgpJyBjb21tYW5kOgojIFdoYXQgaXMgeW91ciBmYXZvcml0ZSBkYXkgb2YgdGhlIHdlZWsgdG8gd2F0Y2ggYmFzZWJhbGw/IGEgdG90YWwgb2YgMTAgZmFucyBzdWJtaXR0ZWQgdGhpcyBzdXJ2ZXkuCiNTYXR1cmRheSwgU2F0dXJkYXksIFN1bmRheSwgTW9uZGF5LCBTYXR1cmRheSxUdWVzZGF5LCBTdW5kYXksIEZyaWRheSwgRnJpZGF5LCBNb25kYXkKZ2FtZV9kYXk8LWMoIlNhdHVyZGF5IiwgIlNhdHVyZGF5IiwgIlN1bmRheSIsICJNb25kYXkiLCAiU2F0dXJkYXkiLCJUdWVzZGF5IiwgIlN1bmRheSIsICJGcmlkYXkiLCAiRnJpZGF5IiwgIk1vbmRheSIpCmBgYAoKYGBge3J9CiMgOSBXSEFUIElTIFRIRSBNT1NUIEZSRVFVRU5UIEFOU1dFUiBSRUNPUkRFRCBJTiBUSEUgU1VSVkVZPyBVU0UgVEhFIEdFVE1PREUgRlVOQ1RJT04gVE8gQ09NUFVURSBSRVNVTFRTCmdldG1vZGUoZ2FtZV9kYXkpCmBgYAoKCgoKCgoKCgoKCgoKCgoK