Basic calculations

#Addition
#This is a simple calculation subtracting 3 from 2
2-3
[1] -1
#Division
#This is a simple calculation dividing 2 by 3
2/3
[1] 0.6666667
#Exponentiation 
#This is a simple calculation of 2 to the power of 3
#This will be the same a 2x2x2
2^3
[1] 8
#Square root
#This is a simple calculation of the square root of 2
sqrt(2)
[1] 1.414214
#Square root
#This is a sample showing the square root of 4
sqrt(4)
[1] 2
#Logarithms
#This is a simple calculation of the log of 2
log(2)
[1] 0.6931472
#Question_1: Compute the log base 5 of 10 and the log of 10
#In this case we are calculating the log of 10 with a base equal to 5
log(10,base = 5)
[1] 1.430677
#Log of 10
#In this case we are calculating the log of 10
log(10)
[1] 2.302585
#Batting Average=(No. of Hits)/(No. of At Bats)
#What is the batting average of a player that bats 29 hits in 112 at bats?
#In This case we are dividing the amount of hits the player achieved by the amounts of at bats the player incurred to achieve the 29 hits.
#Then we store the results in BA and print BA
BA=(29)/(112)
BA
[1] 0.2589286
# This code rounds a batting average (BA) to three decimal places and stores the result in a variable called Batting_Average. 
# Then, it prints or displays the rounded batting average.

Batting_Average=round(BA,digits = 3)
Batting_Average
[1] 0.259
#Question_2: What is the batting average of a player that bats 42 hits in 212 at bats?
# #In This case we are dividing the amount of hits the player achieved (42), by the amounts of at bats (212), the player incurred to achieve the 42 hits.
# Then we store the results in BA and print BA
BA=(42)/(212)
BA
[1] 0.1981132
#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

#This code calculates the On-Base Percentage (OBP) for a baseball player based on their statistics:
#In baseball, OBP is calculated as the sum of hits, walks (BB), and times hit by pitch (HBP), divided by the sum of at bats (AB), hits, walks, times hit by pitch, and sacrifice flies (SF).

#We then store the results in the OBP variable and print the contents of OBP

OBP=(172+84+5)/(515+172+84+5+6)
OBP
[1] 0.3337596
#In this code we are rounding the contents of the OBP variable to 3 decimal places.
#The result is then stored in the variable On_Base_Percentage
#Lastly we print the contents of the variable On_Base_Percentage

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

#This code calculates the On-Base Percentage (OBP) for a baseball player based on their statistics:
#In baseball, OBP is calculated as the sum of hits, walks (BB), and times hit by pitch (HBP), divided by the sum of at bats (AB), hits, walks, times hit by pitch, and sacrifice flies (SF).

#We then store the results in the OBP variable and print the contents of OBP
OBP=(156+65+3)/(565+156+65+3+7)
OBP
[1] 0.281407
#This code ask the basic question if 3 is equal to 8 using the == operator.
#In this case since 8 is not equal to 3 the answer will be false
3 == 8# Does 3 equals 8?
[1] FALSE
#This code ask the basic question if 3 is not equal to 8 using the != operator.
#In this case since 8 is not equal to 3 the answer will be true
3 != 8# Is 3 different from 8?
[1] TRUE
#This code ask the basic question if 3 is less or equal to 8 using the <= operator.
#In this case since 3 is less than 8 one of the requirements of the operator is made and the answer will be true

3 <= 8# Is 3 less than or equal to 8?
[1] TRUE
#Logical Conjunction (and)
#TRUE and FALSE are reserved keywords that represent the logical boolean values.
#TRUE represents the logical value for true.
#FALSE represents the logical value for false.

#In this case since true and false are not equal to each other the answer will be false

TRUE & FALSE #True AND False
[1] FALSE
#Negation
#In this case we are using the ! operator that means not, followed by the reserve word false
! FALSE # This means not false and the answer will be true
[1] TRUE
#Combination of statements
#This code is a logical operation involving comparison and logical OR (|) operator.
#If this case since 2 is less than 3, the answer will be true
2 < 3 | 1 == 5 # 2<3 is True, 1==5 is False, True OR False is True
[1] TRUE
#Assigning Values to Variables
#In the first line of this code we assign the result of 6+5 to the variable Total_Bases. In this case 11
#In the second line of code we multiply the contents of the variable Total_Bases. In this case (11)
#So the result will be 33
Total_Bases <- 6 + 5
Total_Bases * 3
[1] 33
#ls() is a function that lists the names of objects (variables, functions, etc.) that are currently defined in the workspace
ls()
 [1] "BA"                 "bar"                "barsample"          "Batting_Average"    "contract_length"    "contract_years"     "contracts_mean"    
 [8] "contracts_median"   "contracts_n"        "contracts_sd"       "contracts_w1sd"     "contracts_w2sd"     "contracts_w3sd"     "favorite_days"     
[15] "getMode"            "hits_by_innings"    "HR_before"          "n"                  "n_1"                "n_2"                "n_seasons"         
[22] "OBP"                "On_Base_Percentage" "pitches_by_innings" "Player"             "player_positions"   "Robert_HRs"         "salary_ave"        
[29] "sals"               "samplerows"         "strikes_by_innings" "survey_summary"     "Total_Bases"        "triple_hits"        "triple_mean"       
[36] "triple_median"      "triple_n"           "triple_sd"          "triple_w1sd"        "triple_w3sd"        "triples_data"       "triples_hit"       
[43] "Walks_before"       "wanted_HR"          "wanted_Walks"       "x"                  "x_4"                "x_6"                "y_1"               
[50] "y_2"               

Vectors

#In this code we are creating a vector variable named pitches_by_innings and assigning 12, 15, 10, 20, 10 to the vector
#Then we print the contents of the vector pitches_by_innings

pitches_by_innings <- c(12, 15, 10, 20, 10) 
pitches_by_innings
[1] 12 15 10 20 10
#In this code we are creating a vector variable named strikes_by_innings and assigning 9, 12, 6, 14, 9 to the vector
#Then we print the contents of the vector strikes_by_innings
strikes_by_innings <- c(9, 12, 6, 14, 9)
strikes_by_innings
[1]  9 12  6 14  9
#Question_4: Define two vectors,runs_per_innings and hits_per_innings, each with five elements. 
#In this code we are creating a vector variable named pitches_by_innings and assigning 3, 2, 4, 1, 2 to the vector
#Then we print the contents of the vector pitches_by_innings
pitches_by_innings <- c(3, 2, 4, 1, 2)
pitches_by_innings
[1] 3 2 4 1 2
#In this code we are creating a vector variable named strikes_by_innings and assigning 7, 5, 8, 4, 6 to the vector
#Then we print the contents of the vector strikes_by_innings
strikes_by_innings <- c(7, 5, 8, 4, 6)
strikes_by_innings
[1] 7 5 8 4 6
#replicate function
#This code uses the replication function rep() to replicate a value times the amount of the second value following the comma
#In this case re are replication 2 five times and the result will be 2 2 2 2 2
rep(2, 5)
[1] 2 2 2 2 2
# consecutive numbers
#In this code we are using the Range Operator (:) to create sequences of numbers. When used between two numbers 1 and 5, it generates a sequence starting from 1 to 5, inclusive.
1:5
[1] 1 2 3 4 5
#sequence from 1 to 10 with a step of 2
# In this code we are using the sequence function seq() to generate a range from 1 to 10. 
#In this case we are using by (step size) to add by 2 to each step after 1
seq(1, 10, by=2)
[1] 1 3 5 7 9
#add vectors
#This is a simple code adding the vector variable pitches_by_innings to the vector variable strikes_by_innings
#Adding same place elements from pitches_by_innings to the same place elements of strikes_by_innings
pitches_by_innings+strikes_by_innings
[1] 10  7 12  5  8
#compare vectors
#This is a simple code comparing same place elements of the vector variable pitches_by_innings to the vector variable strikes_by_innings
pitches_by_innings == strikes_by_innings
[1] FALSE FALSE FALSE FALSE FALSE
#find length of vector
#this is a simple code using the length() function to find and print how many elements are in the vector
length(pitches_by_innings)
[1] 5
#find minimum value in vector
#this is a simple code using the min() function to find the lowest element in pitches_by_innings
min(pitches_by_innings)
[1] 1
#find average value in vector
#this is a simple code using the mean() function to find mean of the elements in pitches_by_innings
mean(pitches_by_innings)
[1] 2.4
#This code prints the values inside pitches_by_innings
pitches_by_innings
[1] 3 2 4 1 2
#If you want to get the first element:
#This code uses [] to find the value in the fist position of pitches_by_innings
pitches_by_innings[1]
[1] 3
# Question_5: Get the first element of hits_per_innings.
#In this code we are declaring the variable hits_by_innings
#Then convert it to a vector variable and adding 1, 3, 5, 2, 7. 
#Lastly we print the contents of the vector variable hits_by_innings
hits_by_innings <- c(1, 3, 5, 2, 7)
hits_by_innings
[1] 1 3 5 2 7
#This code uses [] to find the value in the fist position of hits_by_innings
hits_by_innings[1]
[1] 1
#This code is an expression that retrieves the last element from the vector pitches_by_innings.
pitches_by_innings[length(pitches_by_innings)]
[1] 2
#Question_6: Get the last element of hits_per_innings.
hits_by_innings[5]
[1] 7
#This code is used to subset or extract specific elements from the vector pitches_by_innings 
#In this case the values located in places 2,3, and 4
pitches_by_innings[c(2, 3, 4)]
[1] 2 4 1
#In this code we are declaring the variable player_positions
#Then we convert it to a vector variable by adding elements
#In this case the variable contains text items
player_positions <- c("catcher", "pitcher", "infielders", "outfielders")
#Data Frames
#In this code we are using the function data.frame() to create a data frame
#In this case with 3 columns with labels (bonus, active roster, and salary).
#Then we declare 3 variables with the above names and convert them to vector variables by adding values
data.frame(bonus = c(2, 3, 1),#in millions 
           active_roster = c("yes", "no", "yes"), 
           salary = c(1.5, 2.5, 1))#in millions 
#How to Make a Random Sample
#In this case we are using the sample() function is used to generate random samples or permutations of a specified size starting at 1 and ending at 10
#Then we are using size to define how many elements we want. In this case 5
#Note: Every time we run this code the result will randomly change 
sample(1:10, size=5)
[1] 9 4 3 1 6
#This code creates a data frame named bar with two columns: var1 and var2.
#Then we use the constant LETTER to assign letter values range to Var1 starting at 1 and ending at 10. In this case A - J
#Then we assign the a number range to Var2 starting at 1 and ending at 10
bar <- data.frame(var1 = LETTERS[1:10], var2 = 1:10)
#Check data frame
bar
#in this code we declare the variable n and assign 5 to it
n <- 5

#Then we declare a new variable samplerows and assign values to it
#In this case we use the sample() function adding a range starting at 1 and ending at the variable n. In this  case 5
# we are also using size=n to size the contents to 5
samplerows <- sample(1:nrow(bar), size=n) 
#print sample rows
samplerows
[1]  4  7  8  9 10
#extract rows
#In this code, barsample is created by sub-setting the data frame bar using the indices stored in samplerows.
barsample <- bar[samplerows, ]
#print sample
print(barsample)
#In this code, bar[sample(1:nrow(bar), n), ] is a concise way to randomly sample n rows from the data frame bar
bar[sample(1:nrow(bar), n), ]
# Using Tables
#In this code we declare the variable x and convert it to a vector and add the values "Yes","No","No","Yes","Yes"
#Then we use the function table() to group the contents of the vector x 
x <- c("Yes","No","No","Yes","Yes") 
table(x)
x
 No Yes 
  2   3 
#Numerical measures of center and spread
#Adding values to the variable sals
#In this case we are declaring the variable sals and convert it to a vector, then add 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
#In this code we use the function mean() to calculate the average of the vector variable sals
mean(sals) 
[1] 8.565
#the variance
#In this case we are using the function var() to calculate the variance of the variable sals elements
var(sals)
[1] 225.5145
#the standard deviation
#In this case we are using the function sd() to calculate the standard deviation of the variable sals elements
sd(sals)
[1] 15.01714
#the median
#In this case we are using the function median() to calculate the median of the variable sals elements
median(sals)
[1] 3.5
#Tukey's five number summary, usefull for boxplots
#five numbers: min, lower hinge, median, upper hinge, max

#In this code fivenum() is a function that computes Tukey's five-number summary for a numeric vector. Tukey's five-number summary consists of:

#Minimum
#Lower hinge (25th percentile, Q1)
#Median (50th percentile, Q2)
#Upper hinge (75th percentile, Q3)
#Maximum

fivenum(sals)
[1]  0.25  1.00  3.50  8.00 50.00
#summary statistics
#In this code we use the summary() function to provides a concise summary of the statistical properties of a numeric vector, such as sals.

#summary() calculates and displays the following statistics:
#Minimum (Min): The smallest value in the vector.
#1st Quartile (1st Qu): The value below which 25% of the data falls (also known as Q1 or the lower quartile).
#Median (Median or 50th percentile): The middle value in the sorted vector (Q2).
#Mean (Mean): The average value of the vector.
#3rd Quartile (3rd Qu): The value below which 75% of the data falls (Q3 or the upper quartile).
#Maximum (Max): The largest value in the vector.
#Number of non-missing values (NA's): The count of missing or NA values in the vector.

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?

#to find the mode, i.e. most frequent value
#In this code we use The getMode function to find the mode (most frequent value) in vector x. 
getMode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
#Most frequent value in baz
#In this code we use The getMode function to find the mode (most frequent value) in vector pitches_by_innings. 
getMode(pitches_by_innings)
[1] 2
#Question_7: Find the most frequent value of hits_per_innings.
#In this code we use The getMode function to find the mode (most frequent value) in vector hits_by_innings. 
getMode(hits_by_innings)
[1] 1
#Question_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

#Define the survey responses as a vector
favorite_days <- c("Saturday", "Saturday", "Sunday", "Monday", "Saturday", 
                   "Tuesday", "Sunday", "Friday", "Friday", "Monday")
#Create a table of frequencies
#This code uses the function table() to group the contents of the vector favorite_days and assign them to the function survey_summary
survey_summary <- table(favorite_days)
#Display the survey summary
survey_summary
favorite_days
  Friday   Monday Saturday   Sunday  Tuesday 
       2        2        3        2        1 
#Question_9: What is the most frequent answer recorded in the survey? Use the getMode function to compute results. 
#In this code we use The getMode function to find the mode (most frequent value) in variable survey_summary. 
getMode(survey_summary)
[1] 2
LS0tDQp0aXRsZTogIkluIENsYXNzIEFjdGl2aXR5IDQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KKipCYXNpYyBjYWxjdWxhdGlvbnMqKg0KDQoNCmBgYHtyfQ0KI0FkZGl0aW9uDQojVGhpcyBpcyBhIHNpbXBsZSBjYWxjdWxhdGlvbiBzdWJ0cmFjdGluZyAzIGZyb20gMg0KMi0zDQpgYGANCmBgYHtyfQ0KI0RpdmlzaW9uDQojVGhpcyBpcyBhIHNpbXBsZSBjYWxjdWxhdGlvbiBkaXZpZGluZyAyIGJ5IDMNCjIvMw0KYGBgDQoNCmBgYHtyfQ0KI0V4cG9uZW50aWF0aW9uIA0KI1RoaXMgaXMgYSBzaW1wbGUgY2FsY3VsYXRpb24gb2YgMiB0byB0aGUgcG93ZXIgb2YgMw0KI1RoaXMgd2lsbCBiZSB0aGUgc2FtZSBhIDJ4MngyDQoyXjMNCmBgYA0KYGBge3J9DQojU3F1YXJlIHJvb3QNCiNUaGlzIGlzIGEgc2ltcGxlIGNhbGN1bGF0aW9uIG9mIHRoZSBzcXVhcmUgcm9vdCBvZiAyDQpzcXJ0KDIpDQpgYGANCmBgYHtyfQ0KI1NxdWFyZSByb290DQojVGhpcyBpcyBhIHNhbXBsZSBzaG93aW5nIHRoZSBzcXVhcmUgcm9vdCBvZiA0DQpzcXJ0KDQpDQpgYGANCmBgYHtyfQ0KI0xvZ2FyaXRobXMNCiNUaGlzIGlzIGEgc2ltcGxlIGNhbGN1bGF0aW9uIG9mIHRoZSBsb2cgb2YgMg0KbG9nKDIpDQpgYGANCmBgYHtyfQ0KI1F1ZXN0aW9uXzE6IENvbXB1dGUgdGhlIGxvZyBiYXNlIDUgb2YgMTAgYW5kIHRoZSBsb2cgb2YgMTANCiNJbiB0aGlzIGNhc2Ugd2UgYXJlIGNhbGN1bGF0aW5nIHRoZSBsb2cgb2YgMTAgd2l0aCBhIGJhc2UgZXF1YWwgdG8gNQ0KbG9nKDEwLGJhc2UgPSA1KQ0KYGBgDQpgYGB7cn0NCiNMb2cgb2YgMTANCiNJbiB0aGlzIGNhc2Ugd2UgYXJlIGNhbGN1bGF0aW5nIHRoZSBsb2cgb2YgMTANCmxvZygxMCkNCmBgYA0KYGBge3J9DQojQmF0dGluZyBBdmVyYWdlPShOby4gb2YgSGl0cykvKE5vLiBvZiBBdCBCYXRzKQ0KI1doYXQgaXMgdGhlIGJhdHRpbmcgYXZlcmFnZSBvZiBhIHBsYXllciB0aGF0IGJhdHMgMjkgaGl0cyBpbiAxMTIgYXQgYmF0cz8NCiNJbiBUaGlzIGNhc2Ugd2UgYXJlIGRpdmlkaW5nIHRoZSBhbW91bnQgb2YgaGl0cyB0aGUgcGxheWVyIGFjaGlldmVkIGJ5IHRoZSBhbW91bnRzIG9mIGF0IGJhdHMgdGhlIHBsYXllciBpbmN1cnJlZCB0byBhY2hpZXZlIHRoZSAyOSBoaXRzLg0KI1RoZW4gd2Ugc3RvcmUgdGhlIHJlc3VsdHMgaW4gQkEgYW5kIHByaW50IEJBDQpCQT0oMjkpLygxMTIpDQpCQQ0KYGBgDQpgYGB7cn0NCiMgVGhpcyBjb2RlIHJvdW5kcyBhIGJhdHRpbmcgYXZlcmFnZSAoQkEpIHRvIHRocmVlIGRlY2ltYWwgcGxhY2VzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBhIHZhcmlhYmxlIGNhbGxlZCBCYXR0aW5nX0F2ZXJhZ2UuIA0KIyBUaGVuLCBpdCBwcmludHMgb3IgZGlzcGxheXMgdGhlIHJvdW5kZWQgYmF0dGluZyBhdmVyYWdlLg0KDQpCYXR0aW5nX0F2ZXJhZ2U9cm91bmQoQkEsZGlnaXRzID0gMykNCkJhdHRpbmdfQXZlcmFnZQ0KYGBgDQpgYGB7cn0NCiNRdWVzdGlvbl8yOiBXaGF0IGlzIHRoZSBiYXR0aW5nIGF2ZXJhZ2Ugb2YgYSBwbGF5ZXIgdGhhdCBiYXRzIDQyIGhpdHMgaW4gMjEyIGF0IGJhdHM/DQojICNJbiBUaGlzIGNhc2Ugd2UgYXJlIGRpdmlkaW5nIHRoZSBhbW91bnQgb2YgaGl0cyB0aGUgcGxheWVyIGFjaGlldmVkICg0MiksIGJ5IHRoZSBhbW91bnRzIG9mIGF0IGJhdHMgKDIxMiksIHRoZSBwbGF5ZXIgaW5jdXJyZWQgdG8gYWNoaWV2ZSB0aGUgNDIgaGl0cy4NCiMgVGhlbiB3ZSBzdG9yZSB0aGUgcmVzdWx0cyBpbiBCQSBhbmQgcHJpbnQgQkENCkJBPSg0MikvKDIxMikNCkJBDQpgYGANCmBgYHtyfQ0KI09uIEJhc2UgUGVyY2VudGFnZQ0KI09CUD0oSCtCQitIQlApLyhBdCBCYXRzK0grQkIrSEJQK1NGKQ0KI0xldCB1cyBjb21wdXRlIHRoZSBPQlAgZm9yIGEgcGxheWVyIHdpdGggdGhlIGZvbGxvd2luZyBnZW5lcmFsIHN0YXRzDQojQUI9NTE1LEg9MTcyLEJCPTg0LEhCUD01LFNGPTYNCg0KI1RoaXMgY29kZSBjYWxjdWxhdGVzIHRoZSBPbi1CYXNlIFBlcmNlbnRhZ2UgKE9CUCkgZm9yIGEgYmFzZWJhbGwgcGxheWVyIGJhc2VkIG9uIHRoZWlyIHN0YXRpc3RpY3M6DQojSW4gYmFzZWJhbGwsIE9CUCBpcyBjYWxjdWxhdGVkIGFzIHRoZSBzdW0gb2YgaGl0cywgd2Fsa3MgKEJCKSwgYW5kIHRpbWVzIGhpdCBieSBwaXRjaCAoSEJQKSwgZGl2aWRlZCBieSB0aGUgc3VtIG9mIGF0IGJhdHMgKEFCKSwgaGl0cywgd2Fsa3MsIHRpbWVzIGhpdCBieSBwaXRjaCwgYW5kIHNhY3JpZmljZSBmbGllcyAoU0YpLg0KDQojV2UgdGhlbiBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgT0JQIHZhcmlhYmxlIGFuZCBwcmludCB0aGUgY29udGVudHMgb2YgT0JQDQoNCk9CUD0oMTcyKzg0KzUpLyg1MTUrMTcyKzg0KzUrNikNCk9CUA0KYGBgDQpgYGB7cn0NCiNJbiB0aGlzIGNvZGUgd2UgYXJlIHJvdW5kaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgT0JQIHZhcmlhYmxlIHRvIDMgZGVjaW1hbCBwbGFjZXMuDQojVGhlIHJlc3VsdCBpcyB0aGVuIHN0b3JlZCBpbiB0aGUgdmFyaWFibGUgT25fQmFzZV9QZXJjZW50YWdlDQojTGFzdGx5IHdlIHByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgT25fQmFzZV9QZXJjZW50YWdlDQoNCk9uX0Jhc2VfUGVyY2VudGFnZSA9IHJvdW5kKE9CUCxkaWdpdHMgPSAzKQ0KT25fQmFzZV9QZXJjZW50YWdlDQpgYGANClF1ZXN0aW9uXzM6IENvbXB1dGUgdGhlIE9CUCBmb3IgYSBwbGF5ZXIgd2l0aCB0aGUgZm9sbG93aW5nIGdlbmVyYWwgc3RhdHM6DQpBQj01NjUsSD0xNTYsQkI9NjUsSEJQPTMsU0Y9Nw0KDQpgYGB7cn0NCiNUaGlzIGNvZGUgY2FsY3VsYXRlcyB0aGUgT24tQmFzZSBQZXJjZW50YWdlIChPQlApIGZvciBhIGJhc2ViYWxsIHBsYXllciBiYXNlZCBvbiB0aGVpciBzdGF0aXN0aWNzOg0KI0luIGJhc2ViYWxsLCBPQlAgaXMgY2FsY3VsYXRlZCBhcyB0aGUgc3VtIG9mIGhpdHMsIHdhbGtzIChCQiksIGFuZCB0aW1lcyBoaXQgYnkgcGl0Y2ggKEhCUCksIGRpdmlkZWQgYnkgdGhlIHN1bSBvZiBhdCBiYXRzIChBQiksIGhpdHMsIHdhbGtzLCB0aW1lcyBoaXQgYnkgcGl0Y2gsIGFuZCBzYWNyaWZpY2UgZmxpZXMgKFNGKS4NCg0KI1dlIHRoZW4gc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIE9CUCB2YXJpYWJsZSBhbmQgcHJpbnQgdGhlIGNvbnRlbnRzIG9mIE9CUA0KT0JQPSgxNTYrNjUrMykvKDU2NSsxNTYrNjUrMys3KQ0KT0JQDQpgYGANCmBgYHtyfQ0KI1RoaXMgY29kZSBhc2sgdGhlIGJhc2ljIHF1ZXN0aW9uIGlmIDMgaXMgZXF1YWwgdG8gOCB1c2luZyB0aGUgPT0gb3BlcmF0b3IuDQojSW4gdGhpcyBjYXNlIHNpbmNlIDggaXMgbm90IGVxdWFsIHRvIDMgdGhlIGFuc3dlciB3aWxsIGJlIGZhbHNlDQozID09IDgjIERvZXMgMyBlcXVhbHMgOD8NCmBgYA0KYGBge3J9DQojVGhpcyBjb2RlIGFzayB0aGUgYmFzaWMgcXVlc3Rpb24gaWYgMyBpcyBub3QgZXF1YWwgdG8gOCB1c2luZyB0aGUgIT0gb3BlcmF0b3IuDQojSW4gdGhpcyBjYXNlIHNpbmNlIDggaXMgbm90IGVxdWFsIHRvIDMgdGhlIGFuc3dlciB3aWxsIGJlIHRydWUNCjMgIT0gOCMgSXMgMyBkaWZmZXJlbnQgZnJvbSA4Pw0KYGBgDQpgYGB7cn0NCiNUaGlzIGNvZGUgYXNrIHRoZSBiYXNpYyBxdWVzdGlvbiBpZiAzIGlzIGxlc3Mgb3IgZXF1YWwgdG8gOCB1c2luZyB0aGUgPD0gb3BlcmF0b3IuDQojSW4gdGhpcyBjYXNlIHNpbmNlIDMgaXMgbGVzcyB0aGFuIDggb25lIG9mIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIG9wZXJhdG9yIGlzIG1hZGUgYW5kIHRoZSBhbnN3ZXIgd2lsbCBiZSB0cnVlDQoNCjMgPD0gOCMgSXMgMyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gOD8NCmBgYA0KYGBge3J9DQojTG9naWNhbCBDb25qdW5jdGlvbiAoYW5kKQ0KI1RSVUUgYW5kIEZBTFNFIGFyZSByZXNlcnZlZCBrZXl3b3JkcyB0aGF0IHJlcHJlc2VudCB0aGUgbG9naWNhbCBib29sZWFuIHZhbHVlcy4NCiNUUlVFIHJlcHJlc2VudHMgdGhlIGxvZ2ljYWwgdmFsdWUgZm9yIHRydWUuDQojRkFMU0UgcmVwcmVzZW50cyB0aGUgbG9naWNhbCB2YWx1ZSBmb3IgZmFsc2UuDQoNCiNJbiB0aGlzIGNhc2Ugc2luY2UgdHJ1ZSBhbmQgZmFsc2UgYXJlIG5vdCBlcXVhbCB0byBlYWNoIG90aGVyIHRoZSBhbnN3ZXIgd2lsbCBiZSBmYWxzZQ0KDQpUUlVFICYgRkFMU0UgI1RydWUgQU5EIEZhbHNlDQpgYGANCmBgYHtyfQ0KI05lZ2F0aW9uDQojSW4gdGhpcyBjYXNlIHdlIGFyZSB1c2luZyB0aGUgISBvcGVyYXRvciB0aGF0IG1lYW5zIG5vdCwgZm9sbG93ZWQgYnkgdGhlIHJlc2VydmUgd29yZCBmYWxzZQ0KISBGQUxTRSAjIFRoaXMgbWVhbnMgbm90IGZhbHNlIGFuZCB0aGUgYW5zd2VyIHdpbGwgYmUgdHJ1ZQ0KYGBgDQpgYGB7cn0NCiNDb21iaW5hdGlvbiBvZiBzdGF0ZW1lbnRzDQojVGhpcyBjb2RlIGlzIGEgbG9naWNhbCBvcGVyYXRpb24gaW52b2x2aW5nIGNvbXBhcmlzb24gYW5kIGxvZ2ljYWwgT1IgKHwpIG9wZXJhdG9yLg0KI0lmIHRoaXMgY2FzZSBzaW5jZSAyIGlzIGxlc3MgdGhhbiAzLCB0aGUgYW5zd2VyIHdpbGwgYmUgdHJ1ZQ0KMiA8IDMgfCAxID09IDUgIyAyPDMgaXMgVHJ1ZSwgMT09NSBpcyBGYWxzZSwgVHJ1ZSBPUiBGYWxzZSBpcyBUcnVlDQpgYGANCmBgYHtyfQ0KI0Fzc2lnbmluZyBWYWx1ZXMgdG8gVmFyaWFibGVzDQojSW4gdGhlIGZpcnN0IGxpbmUgb2YgdGhpcyBjb2RlIHdlIGFzc2lnbiB0aGUgcmVzdWx0IG9mIDYrNSB0byB0aGUgdmFyaWFibGUgVG90YWxfQmFzZXMuIEluIHRoaXMgY2FzZSAxMQ0KI0luIHRoZSBzZWNvbmQgbGluZSBvZiBjb2RlIHdlIG11bHRpcGx5IHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgVG90YWxfQmFzZXMuIEluIHRoaXMgY2FzZSAoMTEpDQojU28gdGhlIHJlc3VsdCB3aWxsIGJlIDMzDQpUb3RhbF9CYXNlcyA8LSA2ICsgNQ0KVG90YWxfQmFzZXMgKiAzDQpgYGANCmBgYHtyfQ0KI2xzKCkgaXMgYSBmdW5jdGlvbiB0aGF0IGxpc3RzIHRoZSBuYW1lcyBvZiBvYmplY3RzICh2YXJpYWJsZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHdvcmtzcGFjZQ0KbHMoKQ0KYGBgDQoNCioqVmVjdG9ycyoqDQoNCmBgYHtyfQ0KI0luIHRoaXMgY29kZSB3ZSBhcmUgY3JlYXRpbmcgYSB2ZWN0b3IgdmFyaWFibGUgbmFtZWQgcGl0Y2hlc19ieV9pbm5pbmdzIGFuZCBhc3NpZ25pbmcgMTIsIDE1LCAxMCwgMjAsIDEwIHRvIHRoZSB2ZWN0b3INCiNUaGVuIHdlIHByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgdmVjdG9yIHBpdGNoZXNfYnlfaW5uaW5ncw0KDQpwaXRjaGVzX2J5X2lubmluZ3MgPC0gYygxMiwgMTUsIDEwLCAyMCwgMTApIA0KcGl0Y2hlc19ieV9pbm5pbmdzDQpgYGANCmBgYHtyfQ0KI0luIHRoaXMgY29kZSB3ZSBhcmUgY3JlYXRpbmcgYSB2ZWN0b3IgdmFyaWFibGUgbmFtZWQgc3RyaWtlc19ieV9pbm5pbmdzIGFuZCBhc3NpZ25pbmcgOSwgMTIsIDYsIDE0LCA5IHRvIHRoZSB2ZWN0b3INCiNUaGVuIHdlIHByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgdmVjdG9yIHN0cmlrZXNfYnlfaW5uaW5ncw0Kc3RyaWtlc19ieV9pbm5pbmdzIDwtIGMoOSwgMTIsIDYsIDE0LCA5KQ0Kc3RyaWtlc19ieV9pbm5pbmdzDQpgYGANCmBgYHtyfQ0KI1F1ZXN0aW9uXzQ6IERlZmluZSB0d28gdmVjdG9ycyxydW5zX3Blcl9pbm5pbmdzIGFuZCBoaXRzX3Blcl9pbm5pbmdzLCBlYWNoIHdpdGggZml2ZSBlbGVtZW50cy4gDQojSW4gdGhpcyBjb2RlIHdlIGFyZSBjcmVhdGluZyBhIHZlY3RvciB2YXJpYWJsZSBuYW1lZCBwaXRjaGVzX2J5X2lubmluZ3MgYW5kIGFzc2lnbmluZyAzLCAyLCA0LCAxLCAyIHRvIHRoZSB2ZWN0b3INCiNUaGVuIHdlIHByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgdmVjdG9yIHBpdGNoZXNfYnlfaW5uaW5ncw0KcGl0Y2hlc19ieV9pbm5pbmdzIDwtIGMoMywgMiwgNCwgMSwgMikNCnBpdGNoZXNfYnlfaW5uaW5ncw0KYGBgDQpgYGB7cn0NCiNJbiB0aGlzIGNvZGUgd2UgYXJlIGNyZWF0aW5nIGEgdmVjdG9yIHZhcmlhYmxlIG5hbWVkIHN0cmlrZXNfYnlfaW5uaW5ncyBhbmQgYXNzaWduaW5nIDcsIDUsIDgsIDQsIDYgdG8gdGhlIHZlY3Rvcg0KI1RoZW4gd2UgcHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZWN0b3Igc3RyaWtlc19ieV9pbm5pbmdzDQpzdHJpa2VzX2J5X2lubmluZ3MgPC0gYyg3LCA1LCA4LCA0LCA2KQ0Kc3RyaWtlc19ieV9pbm5pbmdzDQpgYGANCmBgYHtyfQ0KI3JlcGxpY2F0ZSBmdW5jdGlvbg0KI1RoaXMgY29kZSB1c2VzIHRoZSByZXBsaWNhdGlvbiBmdW5jdGlvbiByZXAoKSB0byByZXBsaWNhdGUgYSB2YWx1ZSB0aW1lcyB0aGUgYW1vdW50IG9mIHRoZSBzZWNvbmQgdmFsdWUgZm9sbG93aW5nIHRoZSBjb21tYQ0KI0luIHRoaXMgY2FzZSByZSBhcmUgcmVwbGljYXRpb24gMiBmaXZlIHRpbWVzIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgMiAyIDIgMiAyDQpyZXAoMiwgNSkNCmBgYA0KYGBge3J9DQojIGNvbnNlY3V0aXZlIG51bWJlcnMNCiNJbiB0aGlzIGNvZGUgd2UgYXJlIHVzaW5nIHRoZSBSYW5nZSBPcGVyYXRvciAoOikgdG8gY3JlYXRlIHNlcXVlbmNlcyBvZiBudW1iZXJzLiBXaGVuIHVzZWQgYmV0d2VlbiB0d28gbnVtYmVycyAxIGFuZCA1LCBpdCBnZW5lcmF0ZXMgYSBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIDEgdG8gNSwgaW5jbHVzaXZlLg0KMTo1DQpgYGANCmBgYHtyfQ0KI3NlcXVlbmNlIGZyb20gMSB0byAxMCB3aXRoIGEgc3RlcCBvZiAyDQojIEluIHRoaXMgY29kZSB3ZSBhcmUgdXNpbmcgdGhlIHNlcXVlbmNlIGZ1bmN0aW9uIHNlcSgpIHRvIGdlbmVyYXRlIGEgcmFuZ2UgZnJvbSAxIHRvIDEwLiANCiNJbiB0aGlzIGNhc2Ugd2UgYXJlIHVzaW5nIGJ5IChzdGVwIHNpemUpIHRvIGFkZCBieSAyIHRvIGVhY2ggc3RlcCBhZnRlciAxDQpzZXEoMSwgMTAsIGJ5PTIpDQpgYGANCmBgYHtyfQ0KI2FkZCB2ZWN0b3JzDQojVGhpcyBpcyBhIHNpbXBsZSBjb2RlIGFkZGluZyB0aGUgdmVjdG9yIHZhcmlhYmxlIHBpdGNoZXNfYnlfaW5uaW5ncyB0byB0aGUgdmVjdG9yIHZhcmlhYmxlIHN0cmlrZXNfYnlfaW5uaW5ncw0KI0FkZGluZyBzYW1lIHBsYWNlIGVsZW1lbnRzIGZyb20gcGl0Y2hlc19ieV9pbm5pbmdzIHRvIHRoZSBzYW1lIHBsYWNlIGVsZW1lbnRzIG9mIHN0cmlrZXNfYnlfaW5uaW5ncw0KcGl0Y2hlc19ieV9pbm5pbmdzK3N0cmlrZXNfYnlfaW5uaW5ncw0KYGBgDQpgYGB7cn0NCiNjb21wYXJlIHZlY3RvcnMNCiNUaGlzIGlzIGEgc2ltcGxlIGNvZGUgY29tcGFyaW5nIHNhbWUgcGxhY2UgZWxlbWVudHMgb2YgdGhlIHZlY3RvciB2YXJpYWJsZSBwaXRjaGVzX2J5X2lubmluZ3MgdG8gdGhlIHZlY3RvciB2YXJpYWJsZSBzdHJpa2VzX2J5X2lubmluZ3MNCnBpdGNoZXNfYnlfaW5uaW5ncyA9PSBzdHJpa2VzX2J5X2lubmluZ3MNCmBgYA0KYGBge3J9DQojZmluZCBsZW5ndGggb2YgdmVjdG9yDQojdGhpcyBpcyBhIHNpbXBsZSBjb2RlIHVzaW5nIHRoZSBsZW5ndGgoKSBmdW5jdGlvbiB0byBmaW5kIGFuZCBwcmludCBob3cgbWFueSBlbGVtZW50cyBhcmUgaW4gdGhlIHZlY3Rvcg0KbGVuZ3RoKHBpdGNoZXNfYnlfaW5uaW5ncykNCmBgYA0KYGBge3J9DQojZmluZCBtaW5pbXVtIHZhbHVlIGluIHZlY3Rvcg0KI3RoaXMgaXMgYSBzaW1wbGUgY29kZSB1c2luZyB0aGUgbWluKCkgZnVuY3Rpb24gdG8gZmluZCB0aGUgbG93ZXN0IGVsZW1lbnQgaW4gcGl0Y2hlc19ieV9pbm5pbmdzDQptaW4ocGl0Y2hlc19ieV9pbm5pbmdzKQ0KYGBgDQpgYGB7cn0NCiNmaW5kIGF2ZXJhZ2UgdmFsdWUgaW4gdmVjdG9yDQojdGhpcyBpcyBhIHNpbXBsZSBjb2RlIHVzaW5nIHRoZSBtZWFuKCkgZnVuY3Rpb24gdG8gZmluZCBtZWFuIG9mIHRoZSBlbGVtZW50cyBpbiBwaXRjaGVzX2J5X2lubmluZ3MNCm1lYW4ocGl0Y2hlc19ieV9pbm5pbmdzKQ0KYGBgDQpgYGB7cn0NCiNUaGlzIGNvZGUgcHJpbnRzIHRoZSB2YWx1ZXMgaW5zaWRlIHBpdGNoZXNfYnlfaW5uaW5ncw0KcGl0Y2hlc19ieV9pbm5pbmdzDQpgYGANCmBgYHtyfQ0KI0lmIHlvdSB3YW50IHRvIGdldCB0aGUgZmlyc3QgZWxlbWVudDoNCiNUaGlzIGNvZGUgdXNlcyBbXSB0byBmaW5kIHRoZSB2YWx1ZSBpbiB0aGUgZmlzdCBwb3NpdGlvbiBvZiBwaXRjaGVzX2J5X2lubmluZ3MNCnBpdGNoZXNfYnlfaW5uaW5nc1sxXQ0KYGBgDQpgYGB7cn0NCiMgUXVlc3Rpb25fNTogR2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGhpdHNfcGVyX2lubmluZ3MuDQojSW4gdGhpcyBjb2RlIHdlIGFyZSBkZWNsYXJpbmcgdGhlIHZhcmlhYmxlIGhpdHNfYnlfaW5uaW5ncw0KI1RoZW4gY29udmVydCBpdCB0byBhIHZlY3RvciB2YXJpYWJsZSBhbmQgYWRkaW5nIDEsIDMsIDUsIDIsIDcuIA0KI0xhc3RseSB3ZSBwcmludCB0aGUgY29udGVudHMgb2YgdGhlIHZlY3RvciB2YXJpYWJsZSBoaXRzX2J5X2lubmluZ3MNCmhpdHNfYnlfaW5uaW5ncyA8LSBjKDEsIDMsIDUsIDIsIDcpDQpoaXRzX2J5X2lubmluZ3MNCmBgYA0KYGBge3J9DQojVGhpcyBjb2RlIHVzZXMgW10gdG8gZmluZCB0aGUgdmFsdWUgaW4gdGhlIGZpc3QgcG9zaXRpb24gb2YgaGl0c19ieV9pbm5pbmdzDQpoaXRzX2J5X2lubmluZ3NbMV0NCmBgYA0KYGBge3J9DQojVGhpcyBjb2RlIGlzIGFuIGV4cHJlc3Npb24gdGhhdCByZXRyaWV2ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSB2ZWN0b3IgcGl0Y2hlc19ieV9pbm5pbmdzLg0KcGl0Y2hlc19ieV9pbm5pbmdzW2xlbmd0aChwaXRjaGVzX2J5X2lubmluZ3MpXQ0KYGBgDQpgYGB7cn0NCiNRdWVzdGlvbl82OiBHZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBoaXRzX3Blcl9pbm5pbmdzLg0KaGl0c19ieV9pbm5pbmdzWzVdDQpgYGANCmBgYHtyfQ0KI1RoaXMgY29kZSBpcyB1c2VkIHRvIHN1YnNldCBvciBleHRyYWN0IHNwZWNpZmljIGVsZW1lbnRzIGZyb20gdGhlIHZlY3RvciBwaXRjaGVzX2J5X2lubmluZ3MgDQojSW4gdGhpcyBjYXNlIHRoZSB2YWx1ZXMgbG9jYXRlZCBpbiBwbGFjZXMgMiwzLCBhbmQgNA0KcGl0Y2hlc19ieV9pbm5pbmdzW2MoMiwgMywgNCldDQpgYGANCmBgYHtyfQ0KI0luIHRoaXMgY29kZSB3ZSBhcmUgZGVjbGFyaW5nIHRoZSB2YXJpYWJsZSBwbGF5ZXJfcG9zaXRpb25zDQojVGhlbiB3ZSBjb252ZXJ0IGl0IHRvIGEgdmVjdG9yIHZhcmlhYmxlIGJ5IGFkZGluZyBlbGVtZW50cw0KI0luIHRoaXMgY2FzZSB0aGUgdmFyaWFibGUgY29udGFpbnMgdGV4dCBpdGVtcw0KcGxheWVyX3Bvc2l0aW9ucyA8LSBjKCJjYXRjaGVyIiwgInBpdGNoZXIiLCAiaW5maWVsZGVycyIsICJvdXRmaWVsZGVycyIpDQpgYGANCg0KYGBge3J9DQojRGF0YSBGcmFtZXMNCiNJbiB0aGlzIGNvZGUgd2UgYXJlIHVzaW5nIHRoZSBmdW5jdGlvbiBkYXRhLmZyYW1lKCkgdG8gY3JlYXRlIGEgZGF0YSBmcmFtZQ0KI0luIHRoaXMgY2FzZSB3aXRoIDMgY29sdW1ucyB3aXRoIGxhYmVscyAoYm9udXMsIGFjdGl2ZSByb3N0ZXIsIGFuZCBzYWxhcnkpLg0KI1RoZW4gd2UgZGVjbGFyZSAzIHZhcmlhYmxlcyB3aXRoIHRoZSBhYm92ZSBuYW1lcyBhbmQgY29udmVydCB0aGVtIHRvIHZlY3RvciB2YXJpYWJsZXMgYnkgYWRkaW5nIHZhbHVlcw0KZGF0YS5mcmFtZShib251cyA9IGMoMiwgMywgMSksI2luIG1pbGxpb25zIA0KICAgICAgICAgICBhY3RpdmVfcm9zdGVyID0gYygieWVzIiwgIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgc2FsYXJ5ID0gYygxLjUsIDIuNSwgMSkpI2luIG1pbGxpb25zIA0KYGBgDQpgYGB7cn0NCiNIb3cgdG8gTWFrZSBhIFJhbmRvbSBTYW1wbGUNCiNJbiB0aGlzIGNhc2Ugd2UgYXJlIHVzaW5nIHRoZSBzYW1wbGUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhbmRvbSBzYW1wbGVzIG9yIHBlcm11dGF0aW9ucyBvZiBhIHNwZWNpZmllZCBzaXplIHN0YXJ0aW5nIGF0IDEgYW5kIGVuZGluZyBhdCAxMA0KI1RoZW4gd2UgYXJlIHVzaW5nIHNpemUgdG8gZGVmaW5lIGhvdyBtYW55IGVsZW1lbnRzIHdlIHdhbnQuIEluIHRoaXMgY2FzZSA1DQojTm90ZTogRXZlcnkgdGltZSB3ZSBydW4gdGhpcyBjb2RlIHRoZSByZXN1bHQgd2lsbCByYW5kb21seSBjaGFuZ2UgDQpzYW1wbGUoMToxMCwgc2l6ZT01KQ0KDQpgYGANCg0KYGBge3J9DQojVGhpcyBjb2RlIGNyZWF0ZXMgYSBkYXRhIGZyYW1lIG5hbWVkIGJhciB3aXRoIHR3byBjb2x1bW5zOiB2YXIxIGFuZCB2YXIyLg0KI1RoZW4gd2UgdXNlIHRoZSBjb25zdGFudCBMRVRURVIgdG8gYXNzaWduIGxldHRlciB2YWx1ZXMgcmFuZ2UgdG8gVmFyMSBzdGFydGluZyBhdCAxIGFuZCBlbmRpbmcgYXQgMTAuIEluIHRoaXMgY2FzZSBBIC0gSg0KI1RoZW4gd2UgYXNzaWduIHRoZSBhIG51bWJlciByYW5nZSB0byBWYXIyIHN0YXJ0aW5nIGF0IDEgYW5kIGVuZGluZyBhdCAxMA0KYmFyIDwtIGRhdGEuZnJhbWUodmFyMSA9IExFVFRFUlNbMToxMF0sIHZhcjIgPSAxOjEwKQ0KI0NoZWNrIGRhdGEgZnJhbWUNCmJhcg0KYGBgDQpgYGB7cn0NCiNpbiB0aGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgbiBhbmQgYXNzaWduIDUgdG8gaXQNCm4gPC0gNQ0KDQojVGhlbiB3ZSBkZWNsYXJlIGEgbmV3IHZhcmlhYmxlIHNhbXBsZXJvd3MgYW5kIGFzc2lnbiB2YWx1ZXMgdG8gaXQNCiNJbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBzYW1wbGUoKSBmdW5jdGlvbiBhZGRpbmcgYSByYW5nZSBzdGFydGluZyBhdCAxIGFuZCBlbmRpbmcgYXQgdGhlIHZhcmlhYmxlIG4uIEluIHRoaXMgIGNhc2UgNQ0KIyB3ZSBhcmUgYWxzbyB1c2luZyBzaXplPW4gdG8gc2l6ZSB0aGUgY29udGVudHMgdG8gNQ0Kc2FtcGxlcm93cyA8LSBzYW1wbGUoMTpucm93KGJhciksIHNpemU9bikgDQojcHJpbnQgc2FtcGxlIHJvd3MNCnNhbXBsZXJvd3MNCmBgYA0KYGBge3J9DQojZXh0cmFjdCByb3dzDQojSW4gdGhpcyBjb2RlLCBiYXJzYW1wbGUgaXMgY3JlYXRlZCBieSBzdWItc2V0dGluZyB0aGUgZGF0YSBmcmFtZSBiYXIgdXNpbmcgdGhlIGluZGljZXMgc3RvcmVkIGluIHNhbXBsZXJvd3MuDQpiYXJzYW1wbGUgPC0gYmFyW3NhbXBsZXJvd3MsIF0NCiNwcmludCBzYW1wbGUNCnByaW50KGJhcnNhbXBsZSkNCmBgYA0KYGBge3J9DQojSW4gdGhpcyBjb2RlLCBiYXJbc2FtcGxlKDE6bnJvdyhiYXIpLCBuKSwgXSBpcyBhIGNvbmNpc2Ugd2F5IHRvIHJhbmRvbWx5IHNhbXBsZSBuIHJvd3MgZnJvbSB0aGUgZGF0YSBmcmFtZSBiYXINCmJhcltzYW1wbGUoMTpucm93KGJhciksIG4pLCBdDQpgYGANCmBgYHtyfQ0KIyBVc2luZyBUYWJsZXMNCiNJbiB0aGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgeCBhbmQgY29udmVydCBpdCB0byBhIHZlY3RvciBhbmQgYWRkIHRoZSB2YWx1ZXMgIlllcyIsIk5vIiwiTm8iLCJZZXMiLCJZZXMiDQojVGhlbiB3ZSB1c2UgdGhlIGZ1bmN0aW9uIHRhYmxlKCkgdG8gZ3JvdXAgdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZWN0b3IgeCANCnggPC0gYygiWWVzIiwiTm8iLCJObyIsIlllcyIsIlllcyIpIA0KdGFibGUoeCkNCg0KYGBgDQpgYGB7cn0NCiNOdW1lcmljYWwgbWVhc3VyZXMgb2YgY2VudGVyIGFuZCBzcHJlYWQNCiNBZGRpbmcgdmFsdWVzIHRvIHRoZSB2YXJpYWJsZSBzYWxzDQojSW4gdGhpcyBjYXNlIHdlIGFyZSBkZWNsYXJpbmcgdGhlIHZhcmlhYmxlIHNhbHMgYW5kIGNvbnZlcnQgaXQgdG8gYSB2ZWN0b3IsIHRoZW4gYWRkIDEyLCAuNCwgNSwgMiwgNTAsIDgsIDMsIDEsIDQsIDAuMjUNCnNhbHMgPC0gYygxMiwgLjQsIDUsIDIsIDUwLCA4LCAzLCAxLCA0LCAwLjI1KQ0KI3RoZSBhdmVyYWdlDQojSW4gdGhpcyBjb2RlIHdlIHVzZSB0aGUgZnVuY3Rpb24gbWVhbigpIHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiB0aGUgdmVjdG9yIHZhcmlhYmxlIHNhbHMNCm1lYW4oc2FscykgDQpgYGANCmBgYHtyfQ0KI3RoZSB2YXJpYW5jZQ0KI0luIHRoaXMgY2FzZSB3ZSBhcmUgdXNpbmcgdGhlIGZ1bmN0aW9uIHZhcigpIHRvIGNhbGN1bGF0ZSB0aGUgdmFyaWFuY2Ugb2YgdGhlIHZhcmlhYmxlIHNhbHMgZWxlbWVudHMNCnZhcihzYWxzKQ0KYGBgDQpgYGB7cn0NCiN0aGUgc3RhbmRhcmQgZGV2aWF0aW9uDQojSW4gdGhpcyBjYXNlIHdlIGFyZSB1c2luZyB0aGUgZnVuY3Rpb24gc2QoKSB0byBjYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgdmFyaWFibGUgc2FscyBlbGVtZW50cw0Kc2Qoc2FscykNCmBgYA0KYGBge3J9DQojdGhlIG1lZGlhbg0KI0luIHRoaXMgY2FzZSB3ZSBhcmUgdXNpbmcgdGhlIGZ1bmN0aW9uIG1lZGlhbigpIHRvIGNhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIHRoZSB2YXJpYWJsZSBzYWxzIGVsZW1lbnRzDQptZWRpYW4oc2FscykNCmBgYA0KYGBge3J9DQojVHVrZXkncyBmaXZlIG51bWJlciBzdW1tYXJ5LCB1c2VmdWxsIGZvciBib3hwbG90cw0KI2ZpdmUgbnVtYmVyczogbWluLCBsb3dlciBoaW5nZSwgbWVkaWFuLCB1cHBlciBoaW5nZSwgbWF4DQoNCiNJbiB0aGlzIGNvZGUgZml2ZW51bSgpIGlzIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBUdWtleSdzIGZpdmUtbnVtYmVyIHN1bW1hcnkgZm9yIGEgbnVtZXJpYyB2ZWN0b3IuIFR1a2V5J3MgZml2ZS1udW1iZXIgc3VtbWFyeSBjb25zaXN0cyBvZjoNCg0KI01pbmltdW0NCiNMb3dlciBoaW5nZSAoMjV0aCBwZXJjZW50aWxlLCBRMSkNCiNNZWRpYW4gKDUwdGggcGVyY2VudGlsZSwgUTIpDQojVXBwZXIgaGluZ2UgKDc1dGggcGVyY2VudGlsZSwgUTMpDQojTWF4aW11bQ0KDQpmaXZlbnVtKHNhbHMpDQpgYGANCmBgYHtyfQ0KI3N1bW1hcnkgc3RhdGlzdGljcw0KI0luIHRoaXMgY29kZSB3ZSB1c2UgdGhlIHN1bW1hcnkoKSBmdW5jdGlvbiB0byBwcm92aWRlcyBhIGNvbmNpc2Ugc3VtbWFyeSBvZiB0aGUgc3RhdGlzdGljYWwgcHJvcGVydGllcyBvZiBhIG51bWVyaWMgdmVjdG9yLCBzdWNoIGFzIHNhbHMuDQoNCiNzdW1tYXJ5KCkgY2FsY3VsYXRlcyBhbmQgZGlzcGxheXMgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzOg0KI01pbmltdW0gKE1pbik6IFRoZSBzbWFsbGVzdCB2YWx1ZSBpbiB0aGUgdmVjdG9yLg0KIzFzdCBRdWFydGlsZSAoMXN0IFF1KTogVGhlIHZhbHVlIGJlbG93IHdoaWNoIDI1JSBvZiB0aGUgZGF0YSBmYWxscyAoYWxzbyBrbm93biBhcyBRMSBvciB0aGUgbG93ZXIgcXVhcnRpbGUpLg0KI01lZGlhbiAoTWVkaWFuIG9yIDUwdGggcGVyY2VudGlsZSk6IFRoZSBtaWRkbGUgdmFsdWUgaW4gdGhlIHNvcnRlZCB2ZWN0b3IgKFEyKS4NCiNNZWFuIChNZWFuKTogVGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIHZlY3Rvci4NCiMzcmQgUXVhcnRpbGUgKDNyZCBRdSk6IFRoZSB2YWx1ZSBiZWxvdyB3aGljaCA3NSUgb2YgdGhlIGRhdGEgZmFsbHMgKFEzIG9yIHRoZSB1cHBlciBxdWFydGlsZSkuDQojTWF4aW11bSAoTWF4KTogVGhlIGxhcmdlc3QgdmFsdWUgaW4gdGhlIHZlY3Rvci4NCiNOdW1iZXIgb2Ygbm9uLW1pc3NpbmcgdmFsdWVzIChOQSdzKTogVGhlIGNvdW50IG9mIG1pc3Npbmcgb3IgTkEgdmFsdWVzIGluIHRoZSB2ZWN0b3IuDQoNCnN1bW1hcnkoc2FscykNCg0KYGBgDQoqKipIb3cgYWJvdXQgdGhlIG1vZGU/KioqDQoNCmBgYHtyfQ0KI3RvIGZpbmQgdGhlIG1vZGUsIGkuZS4gbW9zdCBmcmVxdWVudCB2YWx1ZQ0KI0luIHRoaXMgY29kZSB3ZSB1c2UgVGhlIGdldE1vZGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgbW9kZSAobW9zdCBmcmVxdWVudCB2YWx1ZSkgaW4gdmVjdG9yIHguIA0KZ2V0TW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCmBgYA0KDQpgYGB7cn0NCiNNb3N0IGZyZXF1ZW50IHZhbHVlIGluIGJheg0KI0luIHRoaXMgY29kZSB3ZSB1c2UgVGhlIGdldE1vZGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgbW9kZSAobW9zdCBmcmVxdWVudCB2YWx1ZSkgaW4gdmVjdG9yIHBpdGNoZXNfYnlfaW5uaW5ncy4gDQpnZXRNb2RlKHBpdGNoZXNfYnlfaW5uaW5ncykNCmBgYA0KYGBge3J9DQojUXVlc3Rpb25fNzogRmluZCB0aGUgbW9zdCBmcmVxdWVudCB2YWx1ZSBvZiBoaXRzX3Blcl9pbm5pbmdzLg0KI0luIHRoaXMgY29kZSB3ZSB1c2UgVGhlIGdldE1vZGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgbW9kZSAobW9zdCBmcmVxdWVudCB2YWx1ZSkgaW4gdmVjdG9yIGhpdHNfYnlfaW5uaW5ncy4gDQpnZXRNb2RlKGhpdHNfYnlfaW5uaW5ncykNCmBgYA0KDQoNCmBgYHtyfQ0KI1F1ZXN0aW9uXzg6IFN1bW1hcml6ZSB0aGUgZm9sbG93aW5nIHN1cnZleSB3aXRoIHRoZSBgdGFibGUoKWAgY29tbWFuZDoNCiNXaGF0IGlzIHlvdXIgZmF2b3JpdGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHdhdGNoIGJhc2ViYWxsPyBBIHRvdGFsIG9mIDEwIGZhbnMgc3VibWl0dGVkIHRoaXMgc3VydmV5Lg0KI1NhdHVyZGF5LCBTYXR1cmRheSwgU3VuZGF5LCBNb25kYXksIFNhdHVyZGF5LFR1ZXNkYXksIFN1bmRheSwgRnJpZGF5LCBGcmlkYXksIE1vbmRheQ0KDQojRGVmaW5lIHRoZSBzdXJ2ZXkgcmVzcG9uc2VzIGFzIGEgdmVjdG9yDQpmYXZvcml0ZV9kYXlzIDwtIGMoIlNhdHVyZGF5IiwgIlNhdHVyZGF5IiwgIlN1bmRheSIsICJNb25kYXkiLCAiU2F0dXJkYXkiLCANCiAgICAgICAgICAgICAgICAgICAiVHVlc2RheSIsICJTdW5kYXkiLCAiRnJpZGF5IiwgIkZyaWRheSIsICJNb25kYXkiKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiNDcmVhdGUgYSB0YWJsZSBvZiBmcmVxdWVuY2llcw0KI1RoaXMgY29kZSB1c2VzIHRoZSBmdW5jdGlvbiB0YWJsZSgpIHRvIGdyb3VwIHRoZSBjb250ZW50cyBvZiB0aGUgdmVjdG9yIGZhdm9yaXRlX2RheXMgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSBmdW5jdGlvbiBzdXJ2ZXlfc3VtbWFyeQ0Kc3VydmV5X3N1bW1hcnkgPC0gdGFibGUoZmF2b3JpdGVfZGF5cykNCmBgYA0KDQpgYGB7cn0NCiNEaXNwbGF5IHRoZSBzdXJ2ZXkgc3VtbWFyeQ0Kc3VydmV5X3N1bW1hcnkNCmBgYA0KYGBge3J9DQojUXVlc3Rpb25fOTogV2hhdCBpcyB0aGUgbW9zdCBmcmVxdWVudCBhbnN3ZXIgcmVjb3JkZWQgaW4gdGhlIHN1cnZleT8gVXNlIHRoZSBnZXRNb2RlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgcmVzdWx0cy4gDQojSW4gdGhpcyBjb2RlIHdlIHVzZSBUaGUgZ2V0TW9kZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBtb2RlIChtb3N0IGZyZXF1ZW50IHZhbHVlKSBpbiB2YXJpYWJsZSBzdXJ2ZXlfc3VtbWFyeS4gDQpnZXRNb2RlKHN1cnZleV9zdW1tYXJ5KQ0KYGBgDQoNCg==